diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index f429942bef..b17716562e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -26,7 +26,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v4.0.11 + placeholder: v4.1.0 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index e5102f89cd..b2f8a863b3 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v4.0.11 + placeholder: v4.1.0 validations: required: true - type: dropdown diff --git a/docs/configuration/graphql-api.md b/docs/configuration/graphql-api.md new file mode 100644 index 0000000000..a792da5448 --- /dev/null +++ b/docs/configuration/graphql-api.md @@ -0,0 +1,17 @@ +# GraphQL API Parameters + +## GRAPHQL_ENABLED + +!!! tip "Dynamic Configuration Parameter" + +Default: True + +Setting this to False will disable the GraphQL API. + +--- + +## GRAPHQL_MAX_ALIASES + +Default: 10 + +The maximum number of queries that a GraphQL API request may contain. diff --git a/docs/configuration/index.md b/docs/configuration/index.md index 6a2ecdc7fc..dab7f61353 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -25,7 +25,7 @@ Some configuration parameters are primarily controlled via NetBox's admin interf * [`CUSTOM_VALIDATORS`](./data-validation.md#custom_validators) * [`DEFAULT_USER_PREFERENCES`](./default-values.md#default_user_preferences) * [`ENFORCE_GLOBAL_UNIQUE`](./miscellaneous.md#enforce_global_unique) -* [`GRAPHQL_ENABLED`](./miscellaneous.md#graphql_enabled) +* [`GRAPHQL_ENABLED`](./graphql-api.md#graphql_enabled) * [`JOB_RETENTION`](./miscellaneous.md#job_retention) * [`MAINTENANCE_MODE`](./miscellaneous.md#maintenance_mode) * [`MAPS_URL`](./miscellaneous.md#maps_url) diff --git a/docs/configuration/miscellaneous.md b/docs/configuration/miscellaneous.md index 1f0a2781bc..124de3037f 100644 --- a/docs/configuration/miscellaneous.md +++ b/docs/configuration/miscellaneous.md @@ -122,16 +122,6 @@ The maximum amount (in bytes) of uploaded data that will be held in memory befor --- -## GRAPHQL_ENABLED - -!!! tip "Dynamic Configuration Parameter" - -Default: True - -Setting this to False will disable the GraphQL API. - ---- - ## JOB_RETENTION !!! tip "Dynamic Configuration Parameter" diff --git a/docs/configuration/security.md b/docs/configuration/security.md index 15702f6490..b97f314320 100644 --- a/docs/configuration/security.md +++ b/docs/configuration/security.md @@ -20,19 +20,29 @@ A list of permitted URL schemes referenced when rendering links within NetBox. N ## AUTH_PASSWORD_VALIDATORS -This parameter acts as a pass-through for configuring Django's built-in password validators for local user accounts. If configured, these will be applied whenever a user's password is updated to ensure that it meets minimum criteria such as length or complexity. An example is provided below. For more detail on the available options, please see [the Django documentation](https://docs.djangoproject.com/en/stable/topics/auth/passwords/#password-validation). +This parameter acts as a pass-through for configuring Django's built-in password validators for local user accounts. These rules are applied whenever a user's password is created or updated to ensure that it meets minimum criteria such as length or complexity. The default configuration is shown below. ```python AUTH_PASSWORD_VALIDATORS = [ { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - 'OPTIONS': { - 'min_length': 10, - } + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + "OPTIONS": { + "min_length": 12, + }, + }, + { + "NAME": "utilities.password_validation.AlphanumericPasswordValidator", }, ] ``` +The default configuration enforces the follow criteria: + +* A password must be at least 12 characters in length. +* A password must have at least one uppercase letter, one lowercase letter, and one numeric digit. + +Although it is not recommended, the default validation rules can be disabled by setting `AUTH_PASSWORD_VALIDATORS = []` in the configuration file. For more detail on customizing password validation, please see [the Django documentation](https://docs.djangoproject.com/en/stable/topics/auth/passwords/#password-validation). + --- ## CORS_ORIGIN_ALLOW_ALL diff --git a/docs/configuration/system.md b/docs/configuration/system.md index b3b43c1f61..25c724bc92 100644 --- a/docs/configuration/system.md +++ b/docs/configuration/system.md @@ -87,6 +87,19 @@ addresses (and [`DEBUG`](./development.md#debug) is true). --- +## ISOLATED_DEPLOYMENT + +!!! info "This feature was introduced in NetBox v4.1." + +Default: False + +Set this configuration parameter to True for NetBox deployments which do not have Internet access. This will disable miscellaneous functionality which depends on access to the Internet. + +!!! note + If Internet access is available via a proxy, set [`HTTP_PROXIES`](#http_proxies) instead. + +--- + ## JINJA2_FILTERS Default: `{}` @@ -143,7 +156,7 @@ LOGGING = { ## MEDIA_ROOT -Default: $INSTALL_ROOT/netbox/media/ +Default: `$INSTALL_ROOT/netbox/media/` The file path to the location where media files (such as image attachments) are stored. By default, this is the `netbox/media/` directory within the base NetBox installation path. diff --git a/docs/customization/custom-fields.md b/docs/customization/custom-fields.md index 1f9a4a8bfd..4658cc7e6f 100644 --- a/docs/customization/custom-fields.md +++ b/docs/customization/custom-fields.md @@ -74,6 +74,8 @@ If a default value is specified for a selection field, it must exactly match one An object or multi-object custom field can be used to refer to a particular NetBox object or objects as the "value" for a custom field. These custom fields must define an `object_type`, which determines the type of object to which custom field instances point. +By default, an object choice field will make all objects of that type available for selection in the drop-down. The list choices can be filtered to show only objects with certain values by providing a `query_params` dict in the Related Object Filter field, as a JSON value. More information about `query_params` can be found [here](./custom-scripts.md#objectvar). + ## Custom Fields in Templates Several features within NetBox, such as export templates and webhooks, utilize Jinja2 templating. For convenience, objects which support custom field assignment expose custom field data through the `cf` property. This is a bit cleaner than accessing custom field data through the actual field (`custom_field_data`). diff --git a/docs/customization/custom-validation.md b/docs/customization/custom-validation.md index 909846e204..4a2aab9980 100644 --- a/docs/customization/custom-validation.md +++ b/docs/customization/custom-validation.md @@ -86,8 +86,6 @@ CUSTOM_VALIDATORS = { #### Referencing Related Object Attributes -!!! info "This feature was introduced in NetBox v4.0." - The attributes of a related object can be referenced by specifying a dotted path. For example, to reference the name of a region to which a site is assigned, use `region.name`: ```python @@ -104,8 +102,6 @@ CUSTOM_VALIDATORS = { #### Validating Request Parameters -!!! info "This feature was introduced in NetBox v4.0." - In addition to validating object attributes, custom validators can also match against parameters of the current request (where available). For example, the following rule will permit only the user named "admin" to modify an object: ```json diff --git a/docs/development/adding-models.md b/docs/development/adding-models.md index 823789641a..f3aa9cfcca 100644 --- a/docs/development/adding-models.md +++ b/docs/development/adding-models.md @@ -71,7 +71,6 @@ Add the relevant navigation menu items in `netbox/netbox/navigation/menu.py`. Create the following for each model: * Detailed (full) model serializer in `api/serializers.py` -* Nested serializer in `api/nested_serializers.py` * API view in `api/views.py` * Endpoint route in `api/urls.py` diff --git a/docs/development/extending-models.md b/docs/development/extending-models.md index bf54313378..16d1c34514 100644 --- a/docs/development/extending-models.md +++ b/docs/development/extending-models.md @@ -50,7 +50,7 @@ If you're adding a relational field (e.g. `ForeignKey`) and intend to include th ## 5. Update API serializer -Extend the model's API serializer in `.api.serializers` to include the new field. In most cases, it will not be necessary to also extend the nested serializer, which produces a minimal representation of the model. +Extend the model's API serializer in `.api.serializers` to include the new field. ## 6. Add fields to forms diff --git a/docs/development/models.md b/docs/development/models.md index 19b7be6dee..1b91db515a 100644 --- a/docs/development/models.md +++ b/docs/development/models.md @@ -18,7 +18,7 @@ Depending on its classification, each NetBox model may support various features | [Custom links](../customization/custom-links.md) | `CustomLinksMixin` | `custom_links` | These models support the assignment of custom links | | [Custom validation](../customization/custom-validation.md) | `CustomValidationMixin` | - | Supports the enforcement of custom validation rules | | [Export templates](../customization/export-templates.md) | `ExportTemplatesMixin` | `export_templates` | Users can create custom export templates for these models | -| [Job results](../features/background-jobs.md) | `JobsMixin` | `jobs` | Users can create custom export templates for these models | +| [Job results](../features/background-jobs.md) | `JobsMixin` | `jobs` | Background jobs can be scheduled for these models | | [Journaling](../features/journaling.md) | `JournalingMixin` | `journaling` | These models support persistent historical commentary | | [Synchronized data](../integrations/synchronized-data.md) | `SyncedDataMixin` | `synced_data` | Certain model data can be automatically synchronized from a remote data source | | [Tagging](../models/extras/tag.md) | `TagsMixin` | `tags` | The models can be tagged with user-defined tags | @@ -34,7 +34,9 @@ These are considered the "core" application models which are used to model netwo * [circuits.Provider](../models/circuits/provider.md) * [circuits.ProviderAccount](../models/circuits/provideraccount.md) * [circuits.ProviderNetwork](../models/circuits/providernetwork.md) +* [core.DataFile](../models/core/datafile.md) * [core.DataSource](../models/core/datasource.md) +* [core.Job](../models/core/job.md) * [dcim.Cable](../models/dcim/cable.md) * [dcim.Device](../models/dcim/device.md) * [dcim.DeviceType](../models/dcim/devicetype.md) @@ -44,12 +46,14 @@ These are considered the "core" application models which are used to model netwo * [dcim.PowerPanel](../models/dcim/powerpanel.md) * [dcim.Rack](../models/dcim/rack.md) * [dcim.RackReservation](../models/dcim/rackreservation.md) +* [dcim.RackType](../models/dcim/racktype.md) * [dcim.Site](../models/dcim/site.md) * [dcim.VirtualChassis](../models/dcim/virtualchassis.md) * [dcim.VirtualDeviceContext](../models/dcim/virtualdevicecontext.md) * [ipam.Aggregate](../models/ipam/aggregate.md) * [ipam.ASN](../models/ipam/asn.md) * [ipam.FHRPGroup](../models/ipam/fhrpgroup.md) +* [ipam.FHRPGroupAssignment](../models/ipam/fhrpgroupassignment.md) * [ipam.IPAddress](../models/ipam/ipaddress.md) * [ipam.IPRange](../models/ipam/iprange.md) * [ipam.Prefix](../models/ipam/prefix.md) @@ -76,6 +80,7 @@ These are considered the "core" application models which are used to model netwo Organization models are used to organize and classify primary models. +* [circuits.CircuitGroup](../models/circuits/circuitgroup.md) * [circuits.CircuitType](../models/circuits/circuittype.md) * [dcim.DeviceRole](../models/dcim/devicerole.md) * [dcim.Manufacturer](../models/dcim/manufacturer.md) @@ -88,6 +93,7 @@ Organization models are used to organize and classify primary models. * [tenancy.ContactRole](../models/tenancy/contactrole.md) * [virtualization.ClusterGroup](../models/virtualization/clustergroup.md) * [virtualization.ClusterType](../models/virtualization/clustertype.md) +* [vpn.TunnelGroup](../models/vpn/tunnelgroup.md) ### Nested Group Models @@ -131,3 +137,10 @@ These function as templates to effect the replication of device and virtual mach * [dcim.PowerOutletTemplate](../models/dcim/poweroutlettemplate.md) * [dcim.PowerPortTemplate](../models/dcim/powerporttemplate.md) * [dcim.RearPortTemplate](../models/dcim/rearporttemplate.md) + +### Connection Models + +Connection models are used to model the connections, or connection endpoints between models. + +* [circuits.CircuitTermination](../models/circuits/circuittermination.md) +* [vpn.TunnelTermination](../models/vpn/tunneltermination.md) diff --git a/docs/development/release-checklist.md b/docs/development/release-checklist.md index 37d22e0091..6f11cc37b3 100644 --- a/docs/development/release-checklist.md +++ b/docs/development/release-checklist.md @@ -2,9 +2,9 @@ This documentation describes the process of packaging and publishing a new NetBox release. There are three types of release: -* Major release (e.g. v2.11 to v3.0) -* Minor release (e.g. v3.2 to v3.3) -* Patch release (e.g. v3.3.0 to v3.3.1) +* Major release (e.g. v3.7.8 to v4.0.0) +* Minor release (e.g. v4.0.10 to v4.1.0) +* Patch release (e.g. v4.1.0 to v4.1.1) While major releases generally introduce some very substantial change to the application, they are typically treated the same as minor version increments for the purpose of release packaging. @@ -90,7 +90,7 @@ Updated language translations should be pulled from [Transifex](https://app.tran ### Update Version and Changelog -* Update the `VERSION` constant in `settings.py` to the new release version. +* Update the version and published date in `release.yaml` with the current version & date. Add a designation (e.g.g `beta1`) if applicable. * Update the example version numbers in the feature request and bug report templates under `.github/ISSUE_TEMPLATES/`. * Replace the "FUTURE" placeholder in the release notes with the current date. @@ -117,16 +117,6 @@ Create a [new release](https://github.com/netbox-community/netbox/releases/new) Once created, the release will become available for users to install. -### Update the Development Version - -On the `develop` branch, update `VERSION` in `settings.py` to point to the next release. For example, if you just released v3.3.1, set: - -``` -VERSION = 'v3.3.2-dev' -``` - -Commit this change with the comment "PRVB" (for _post-release version bump_) and push the commit upstream. - ### Update the Public Documentation After a release has been published, the public NetBox documentation needs to be updated. This is accomplished by running two actions on the [netboxlabs-docs](https://github.com/netboxlabs/netboxlabs-docs) repository. diff --git a/docs/features/event-rules.md b/docs/features/event-rules.md index 158dc111a7..14b54f0008 100644 --- a/docs/features/event-rules.md +++ b/docs/features/event-rules.md @@ -1,9 +1,10 @@ # Event Rules -NetBox includes the ability to execute certain functions in response to internal object changes. These include: +NetBox includes the ability to automatically perform certain functions in response to internal events. These include: -* [Scripts](../customization/custom-scripts.md) execution -* [Webhooks](../integrations/webhooks.md) execution +* Executing a [custom script](../customization/custom-scripts.md) +* Sending a [webhook](../integrations/webhooks.md) +* Generating [user notifications](../features/notifications.md) For example, suppose you want to automatically configure a monitoring system to start monitoring a device when its operational status is changed to active, and remove it from monitoring for any other status. You can create a webhook in NetBox for the device model and craft its content and destination URL to effect the desired change on the receiving system. You can then associate an event rule with this webhook and the webhook will be sent automatically by NetBox whenever the configured constraints are met. diff --git a/docs/features/facilities.md b/docs/features/facilities.md index 84c7c57333..4c8dfe265b 100644 --- a/docs/features/facilities.md +++ b/docs/features/facilities.md @@ -56,6 +56,10 @@ A site typically represents a building within a region and/or site group. Each s A location can be any logical subdivision within a building, such as a floor or room. Like regions and site groups, locations can be nested into a self-recursive hierarchy for maximum flexibility. And like sites, each location has an operational status assigned to it. +## Rack Types + +A rack type represents a unique specification of a rack which exists in the real world. Each rack type can be setup with weight, height, and unit ordering. New racks of this type can then be created in NetBox, and any associated specifications will be automatically replicated from the device type. + ## Racks Finally, NetBox models each equipment rack as a discrete object within a site and location. These are physical objects into which devices are installed. Each rack can be assigned an operational status, type, facility ID, and other attributes related to inventory tracking. Each rack also must define a height (in rack units) and width, and may optionally specify its physical dimensions. diff --git a/docs/features/notifications.md b/docs/features/notifications.md new file mode 100644 index 0000000000..a28a17947a --- /dev/null +++ b/docs/features/notifications.md @@ -0,0 +1,10 @@ +# Notifications + +!!! info "This feature was introduced in NetBox v4.1." + +NetBox includes a system for generating user notifications, which can be marked as read or deleted by individual users. There are two built-in mechanisms for generating a notification: + +* A user can subscribe to an object. When that object is modified, a notification is created to inform the user of the change. +* An [event rule](./event-rules.md) can be defined to automatically generate a notification for one or more users in response to specific system events. + +Additionally, NetBox plugins can generate notifications for their own purposes. diff --git a/docs/integrations/graphql-api.md b/docs/integrations/graphql-api.md index 3ccb4d4a19..425c3adda9 100644 --- a/docs/integrations/graphql-api.md +++ b/docs/integrations/graphql-api.md @@ -112,4 +112,4 @@ Authorization: Token $TOKEN ## Disabling the GraphQL API -If not needed, the GraphQL API can be disabled by setting the [`GRAPHQL_ENABLED`](../configuration/miscellaneous.md#graphql_enabled) configuration parameter to False and restarting NetBox. +If not needed, the GraphQL API can be disabled by setting the [`GRAPHQL_ENABLED`](../configuration/graphql-api.md#graphql_enabled) configuration parameter to False and restarting NetBox. diff --git a/docs/integrations/rest-api.md b/docs/integrations/rest-api.md index 1ba00958fd..215b561a74 100644 --- a/docs/integrations/rest-api.md +++ b/docs/integrations/rest-api.md @@ -101,7 +101,7 @@ See the [filtering documentation](../reference/filtering.md) for more details on ## Serialization -The REST API employs two types of serializers to represent model data: base serializers and nested serializers. The base serializer is used to present the complete view of a model. This includes all database table fields which comprise the model, and may include additional metadata. A base serializer includes relationships to parent objects, but **does not** include child objects. For example, the `VLANSerializer` includes a nested representation its parent VLANGroup (if any), but does not include any assigned Prefixes. +The REST API generally represents objects in one of two ways: complete or brief. The base serializer is used to present the complete view of an object. This includes all database table fields which comprise the model, and may include additional metadata. A base serializer includes relationships to parent objects, but **does not** include child objects. For example, the `VLANSerializer` includes a nested representation its parent VLANGroup (if any), but does not include any assigned Prefixes. Serializers employ a minimal "brief" representation of related objects, which includes only the attributes prudent for identifying the object. ```json { @@ -139,7 +139,7 @@ The REST API employs two types of serializers to represent model data: base seri ### Related Objects -Related objects (e.g. `ForeignKey` fields) are represented using nested serializers. A nested serializer provides a minimal representation of an object, including only its direct URL and enough information to display the object to a user. When performing write API actions (`POST`, `PUT`, and `PATCH`), related objects may be specified by either numeric ID (primary key), or by a set of attributes sufficiently unique to return the desired object. +Related objects (e.g. `ForeignKey` fields) are included using nested brief representations. This is a minimal representation of an object, including only its direct URL and enough information to display the object to a user. When performing write API actions (`POST`, `PUT`, and `PATCH`), related objects may be specified by either numeric ID (primary key), or by a set of attributes sufficiently unique to return the desired object. For example, when creating a new device, its rack can be specified by NetBox ID (PK): @@ -151,7 +151,7 @@ For example, when creating a new device, its rack can be specified by NetBox ID } ``` -Or by a set of nested attributes which uniquely identify the rack: +Or by a set of attributes which uniquely identify the rack: ```json { diff --git a/docs/media/screenshots/cable-trace.png b/docs/media/screenshots/cable-trace.png index 63cba056f9..d2b5a6c2d2 100644 Binary files a/docs/media/screenshots/cable-trace.png and b/docs/media/screenshots/cable-trace.png differ diff --git a/docs/media/screenshots/home-dark.png b/docs/media/screenshots/home-dark.png index 95a6468fef..c19685cca5 100644 Binary files a/docs/media/screenshots/home-dark.png and b/docs/media/screenshots/home-dark.png differ diff --git a/docs/media/screenshots/home-light.png b/docs/media/screenshots/home-light.png index ed249cbddb..dff33b36f5 100644 Binary files a/docs/media/screenshots/home-light.png and b/docs/media/screenshots/home-light.png differ diff --git a/docs/media/screenshots/prefixes-list.png b/docs/media/screenshots/prefixes-list.png index a5e5a4b8be..d114a5d50e 100644 Binary files a/docs/media/screenshots/prefixes-list.png and b/docs/media/screenshots/prefixes-list.png differ diff --git a/docs/media/screenshots/rack.png b/docs/media/screenshots/rack.png index a5954d644e..812ce87481 100644 Binary files a/docs/media/screenshots/rack.png and b/docs/media/screenshots/rack.png differ diff --git a/docs/models/circuits/circuitgroup.md b/docs/models/circuits/circuitgroup.md new file mode 100644 index 0000000000..faa9dbc146 --- /dev/null +++ b/docs/models/circuits/circuitgroup.md @@ -0,0 +1,15 @@ +# Circuit Groups + +!!! info "This feature was introduced in NetBox v4.1." + +[Circuits](./circuit.md) can be arranged into administrative groups for organization. The assignment of a circuit to a group is optional. + +## Fields + +### Name + +A unique human-friendly name. + +### Slug + +A unique URL-friendly identifier. (This value can be used for filtering.) diff --git a/docs/models/circuits/circuitgroupassignment.md b/docs/models/circuits/circuitgroupassignment.md new file mode 100644 index 0000000000..2aaa375af0 --- /dev/null +++ b/docs/models/circuits/circuitgroupassignment.md @@ -0,0 +1,25 @@ +# Circuit Group Assignments + +Circuits can be assigned to [circuit groups](./circuitgroup.md) for correlation purposes. For instance, three circuits, each belonging to a different provider, may each be assigned to the same circuit group. Each assignment may optionally include a priority designation. + +## Fields + +### Group + +The [circuit group](./circuitgroup.md) being assigned. + +### Circuit + +The [circuit](./circuit.md) that is being assigned to the group. + +### Priority + +The circuit's operation priority relative to its peers within the group. The assignment of a priority is optional. Choices include: + +* Primary +* Secondary +* Tertiary +* Inactive + +!!! tip + Additional priority choices may be defined by setting `CircuitGroupAssignment.priority` under the [`FIELD_CHOICES`](../../configuration/data-validation.md#field_choices) configuration parameter. diff --git a/docs/models/dcim/modulebay.md b/docs/models/dcim/modulebay.md index c779095114..1bff799c2f 100644 --- a/docs/models/dcim/modulebay.md +++ b/docs/models/dcim/modulebay.md @@ -14,6 +14,12 @@ Module bays represent a space or slot within a device in which a field-replaceab The device to which this module bay belongs. +### Module + +!!! info "This feature was introduced in NetBox v4.1." + +The module to which this bay belongs (optional). + ### Name The module bay's name. Must be unique to the parent device. diff --git a/docs/models/dcim/moduletype.md b/docs/models/dcim/moduletype.md index 3122d2e00c..225873d616 100644 --- a/docs/models/dcim/moduletype.md +++ b/docs/models/dcim/moduletype.md @@ -39,3 +39,9 @@ An alternative part number to uniquely identify the module type. ### Weight The numeric weight of the module, including a unit designation (e.g. 3 kilograms or 1 pound). + +### Airflow + +!!! info "The `airflow` field was introduced in NetBox v4.1." + +The direction in which air circulates through the device chassis for cooling. diff --git a/docs/models/dcim/rack.md b/docs/models/dcim/rack.md index 3989e2b049..d610f63686 100644 --- a/docs/models/dcim/rack.md +++ b/docs/models/dcim/rack.md @@ -20,6 +20,10 @@ The [location](./location.md) within a site where the rack has been installed (o The rack's name or identifier. Must be unique to the rack's location, if assigned. +### Rack Type + +The [physical type](./racktype.md) of this rack. The rack type defines physical attributes such as height and weight. + ### Status Operational status. @@ -43,44 +47,5 @@ The unique physical serial number assigned to this rack. A unique, locally-administered label used to identify hardware resources. -### Type - -A rack can be designated as one of the following types: - -* 2-post frame -* 4-post frame -* 4-post cabinet -* Wall-mounted frame -* Wall-mounted cabinet - -### Width - -The canonical distance between the two vertical rails on a face. (This is typically 19 inches, however other standard widths exist.) - -### Height - -The height of the rack, measured in units. - -### Starting Unit - -The number of the numerically lowest unit in the rack. This value defaults to one, but may be higher in certain situations. For example, you may want to model only a select range of units within a shared physical rack (e.g. U13 through U24). - -### Outer Dimensions - -The external width and depth of the rack can be tracked to aid in floorplan calculations. These measurements must be designated in either millimeters or inches. - -### Mounting Depth - -The maximum depth of a mounted device that the rack can accommodate, in millimeters. For four-post frames or cabinets, this is the horizontal distance between the front and rear vertical rails. (Note that this measurement does _not_ include space between the rails and the cabinet doors.) - -### Weight - -The numeric weight of the rack, including a unit designation (e.g. 10 kilograms or 20 pounds). - -### Maximum Weight - -The maximum total weight capacity for all installed devices, inclusive of the rack itself. - -### Descending Units - -If selected, the rack's elevation will display unit 1 at the top of the rack. (Most racks use ascending numbering, with unit 1 assigned to the bottommost position.) +!!! note + Some additional fields pertaining to physical attributes such as height and weight can also be defined on each rack, but should generally be defined instead on the [rack type](./racktype.md). diff --git a/docs/models/dcim/racktype.md b/docs/models/dcim/racktype.md new file mode 100644 index 0000000000..eeb90bd29d --- /dev/null +++ b/docs/models/dcim/racktype.md @@ -0,0 +1,61 @@ +# Rack Types + +!!! info "This feature was introduced in NetBox v4.1." + +A rack type defines the physical characteristics of a particular model of [rack](./rack.md). + +## Fields + +### Manufacturer + +The [manufacturer](./manufacturer.md) which produces this type of rack. + +### Model + +The model number assigned to this rack type by its manufacturer. Must be unique to the manufacturer. + +### Slug + +A unique URL-friendly representation of the model identifier. (This value can be used for filtering.) + +### Form Factor + +A rack can be designated as one of the following form factors: + +* 2-post frame +* 4-post frame +* 4-post cabinet +* Wall-mounted frame +* Wall-mounted cabinet + +### Width + +The canonical distance between the two vertical rails on a face. (This is typically 19 inches, however other standard widths exist.) + +### Height + +The height of the rack, measured in units. + +### Starting Unit + +The number of the numerically lowest unit in the rack. This value defaults to one, but may be higher in certain situations. For example, you may want to model only a select range of units within a shared physical rack (e.g. U13 through U24). + +### Outer Dimensions + +The external width and depth of the rack can be tracked to aid in floorplan calculations. These measurements must be designated in either millimeters or inches. + +### Mounting Depth + +The maximum depth of a mounted device that the rack can accommodate, in millimeters. For four-post frames or cabinets, this is the horizontal distance between the front and rear vertical rails. (Note that this measurement does _not_ include space between the rails and the cabinet doors.) + +### Weight + +The numeric weight of the rack, including a unit designation (e.g. 10 kilograms or 20 pounds). + +### Maximum Weight + +The maximum total weight capacity for all installed devices, inclusive of the rack itself. + +### Descending Units + +If selected, the rack's elevation will display unit 1 at the top of the rack. (Most racks use ascending numbering, with unit 1 assigned to the bottommost position.) diff --git a/docs/models/extras/customfield.md b/docs/models/extras/customfield.md index 495c4e2e83..9aab66a36c 100644 --- a/docs/models/extras/customfield.md +++ b/docs/models/extras/customfield.md @@ -42,13 +42,26 @@ The type of data this field holds. This must be one of the following: For object and multiple-object fields only. Designates the type of NetBox object being referenced. +### Related Object Filter + +!!! info "This field was introduced in NetBox v4.1." + +For object and multi-object custom fields, a filter may be defined to limit the available objects when populating a field value. This filter maps object attributes to values. For example, `{"status": "active"}` will include only objects with a status of "active." + +!!! warning + This setting is employed for convenience only, and should not be relied upon to enforce data integrity. + ### Weight A numeric weight used to override alphabetic ordering of fields by name. Custom fields with a lower weight will be listed before those with a higher weight. (Note that weight applies within the context of a custom field group, if defined.) ### Required -If checked, this custom field must be populated with a valid value for the object to pass validation. +If enabled, this custom field must be populated with a valid value for the object to pass validation. + +### Unique + +If enabled, each object must have a unique value set for this custom field (per object type). ### Description diff --git a/docs/models/extras/eventrule.md b/docs/models/extras/eventrule.md index c105a2630c..b48e17a1ee 100644 --- a/docs/models/extras/eventrule.md +++ b/docs/models/extras/eventrule.md @@ -18,17 +18,22 @@ The type(s) of object in NetBox that will trigger the rule. If not selected, the event rule will not be processed. -### Events - -The events which will trigger the rule. At least one event type must be selected. - -| Name | Description | -|------------|--------------------------------------| -| Creations | A new object has been created | -| Updates | An existing object has been modified | -| Deletions | An object has been deleted | -| Job starts | A job for an object starts | -| Job ends | A job for an object terminates | +### Events Types + +The event types which will trigger the rule. At least one event type must be selected. + +| Name | Description | +|----------------|---------------------------------------------| +| Object created | A new object has been created | +| Object updated | An existing object has been modified | +| Object deleted | An object has been deleted | +| Job started | A background job is initiated | +| Job completed | A background job completes successfully | +| Job failed | A background job fails | +| Job errored | A background job is aborted due to an error | + +!!! tip "Custom Event Types" + The above list includes only built-in event types. NetBox plugins can also register their own custom event types. ### Conditions diff --git a/docs/models/extras/notification.md b/docs/models/extras/notification.md new file mode 100644 index 0000000000..e72a35bec5 --- /dev/null +++ b/docs/models/extras/notification.md @@ -0,0 +1,17 @@ +# Notification + +A notification alerts a user that a specific action has taken place in NetBox, such as an object being modified or a background job completing. A notification may be generated via a user's [subscription](./subscription.md) to a particular object, or by an event rule targeting a [notification group](./notificationgroup.md) of which the user is a member. + +## Fields + +### User + +The recipient of the notification. + +### Object + +The object to which the notification relates. + +### Event Type + +The type of event indicated by the notification. diff --git a/docs/models/extras/notificationgroup.md b/docs/models/extras/notificationgroup.md new file mode 100644 index 0000000000..6463d137ad --- /dev/null +++ b/docs/models/extras/notificationgroup.md @@ -0,0 +1,17 @@ +# Notification Group + +A set of NetBox users and/or groups of users identified as recipients for certain [notifications](./notification.md). + +## Fields + +### Name + +The name of the notification group. + +### Users + +One or more users directly designated as members of the notification group. + +### Groups + +All users of any selected groups are considered as members of the notification group. diff --git a/docs/models/extras/subscription.md b/docs/models/extras/subscription.md new file mode 100644 index 0000000000..3fc4a1f11b --- /dev/null +++ b/docs/models/extras/subscription.md @@ -0,0 +1,15 @@ +# Subscription + +A record indicating that a user is to be notified of any changes to a particular NetBox object. A notification maps exactly one user to exactly one object. + +When an object to which a user is subscribed changes, a [notification](./notification.md) is generated for the user. + +## Fields + +### User + +The subscribed user. + +### Object + +The object to which the user is subscribed. diff --git a/docs/models/ipam/vlangroup.md b/docs/models/ipam/vlangroup.md index a2920fb70a..20989452f9 100644 --- a/docs/models/ipam/vlangroup.md +++ b/docs/models/ipam/vlangroup.md @@ -14,9 +14,11 @@ A unique human-friendly name. A unique URL-friendly identifier. (This value can be used for filtering.) -### Minimum & Maximum VLAN IDs +### VLAN ID Ranges -A minimum and maximum child VLAN ID must be set for each group. (These default to 1 and 4094 respectively.) VLANs created within a group must have a VID that falls between these values (inclusive). +!!! info "This field replaced the legacy `min_vid` and `max_vid` fields in NetBox v4.1." + +The set of VLAN IDs which are encompassed by the group. By default, this will be the entire range of valid IEEE 802.1Q VLAN IDs (1 to 4094, inclusive). VLANs created within a group must have a VID that falls within one of these ranges. Ranges may not overlap. ### Scope diff --git a/docs/models/virtualization/virtualdisk.md b/docs/models/virtualization/virtualdisk.md index 9d256bb66c..3f170c05a7 100644 --- a/docs/models/virtualization/virtualdisk.md +++ b/docs/models/virtualization/virtualdisk.md @@ -10,4 +10,4 @@ A human-friendly name that is unique to the assigned virtual machine. ### Size -The allocated disk size, in gigabytes. +The allocated disk size, in megabytes. diff --git a/docs/models/virtualization/virtualmachine.md b/docs/models/virtualization/virtualmachine.md index 769d49154e..7ea31111ce 100644 --- a/docs/models/virtualization/virtualmachine.md +++ b/docs/models/virtualization/virtualmachine.md @@ -50,4 +50,13 @@ The amount of running memory provisioned, in megabytes. ### Disk -The amount of disk storage provisioned, in gigabytes. +The amount of disk storage provisioned, in megabytes. + +!!! warning + This field may be directly modified only on virtual machines which do not define discrete [virtual disks](./virtualdisk.md). Otherwise, it will report the sum of all attached disks. + +### Serial Number + +!!! info "This field was introduced in NetBox v4.1." + +Optional serial number assigned to this virtual machine. Unlike devices, uniqueness is not enforced for virtual machine serial numbers. diff --git a/docs/models/wireless/wirelesslink.md b/docs/models/wireless/wirelesslink.md index c9b331570a..7553902b06 100644 --- a/docs/models/wireless/wirelesslink.md +++ b/docs/models/wireless/wirelesslink.md @@ -20,6 +20,12 @@ The operational status of the link. Options include: The service set identifier (SSID) for the wireless link (optional). +### Distance + +!!! info "This field was introduced in NetBox v4.1." + +The distance between the link's two endpoints, including a unit designation (e.g. 100 meters or 25 feet). + ### Authentication Type The type of wireless authentication in use. Options include: diff --git a/docs/netbox_logo.png b/docs/netbox_logo.png deleted file mode 100644 index c6e0a58e62..0000000000 Binary files a/docs/netbox_logo.png and /dev/null differ diff --git a/docs/netbox_logo.svg b/docs/netbox_logo.svg index 5321be100e..93362cbe6f 100644 --- a/docs/netbox_logo.svg +++ b/docs/netbox_logo.svg @@ -1,21 +1,24 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + diff --git a/docs/plugins/development/background-jobs.md b/docs/plugins/development/background-jobs.md new file mode 100644 index 0000000000..873390a588 --- /dev/null +++ b/docs/plugins/development/background-jobs.md @@ -0,0 +1,99 @@ +# Background Jobs + +!!! info "This feature was introduced in NetBox v4.1." + +NetBox plugins can defer certain operations by enqueuing [background jobs](../../features/background-jobs.md), which are executed asynchronously by background workers. This is helpful for decoupling long-running processes from the user-facing request-response cycle. + +For example, your plugin might need to fetch data from a remote system. Depending on the amount of data and the responsiveness of the remote server, this could take a few minutes. Deferring this task to a queued job ensures that it can be completed in the background, without interrupting the user. The data it fetches can be made available once the job has completed. + +## Job Runners + +A background job implements a basic [Job](../../models/core/job.md) executor for all kinds of tasks. It has logic implemented to handle the management of the associated job object, rescheduling of periodic jobs in the given interval and error handling. Adding custom jobs is done by subclassing NetBox's `JobRunner` class. + +::: netbox.jobs.JobRunner + +#### Example + +```python title="jobs.py" +from netbox.jobs import JobRunner + + +class MyTestJob(JobRunner): + class Meta: + name = "My Test Job" + + def run(self, *args, **kwargs): + obj = self.job.object + # your logic goes here +``` + +You can schedule the background job from within your code (e.g. from a model's `save()` method or a view) by calling `MyTestJob.enqueue()`. This method passes through all arguments to `Job.enqueue()`. However, no `name` argument must be passed, as the background job name will be used instead. + +### Attributes + +`JobRunner` attributes are defined under a class named `Meta` within the job. These are optional, but encouraged. + +#### `name` + +This is the human-friendly names of your background job. If omitted, the class name will be used. + +### Scheduled Jobs + +As described above, jobs can be scheduled for immediate execution or at any later time using the `enqueue()` method. However, for management purposes, the `enqueue_once()` method allows a job to be scheduled exactly once avoiding duplicates. If a job is already scheduled for a particular instance, a second one won't be scheduled, respecting thread safety. An example use case would be to schedule a periodic task that is bound to an instance in general, but not to any event of that instance (such as updates). The parameters of the `enqueue_once()` method are identical to those of `enqueue()`. + +!!! tip + It is not forbidden to `enqueue()` additional jobs while an interval schedule is active. An example use of this would be to schedule a periodic daily synchronization, but also trigger additional synchronizations on demand when the user presses a button. + +#### Example + +```python title="jobs.py" +from netbox.jobs import JobRunner + + +class MyHousekeepingJob(JobRunner): + class Meta: + name = "Housekeeping" + + def run(self, *args, **kwargs): + # your logic goes here +``` + +```python title="__init__.py" +from netbox.plugins import PluginConfig + +class MyPluginConfig(PluginConfig): + def ready(self): + from .jobs import MyHousekeepingJob + MyHousekeepingJob.setup(interval=60) +``` + +## Task queues + +Three task queues of differing priority are defined by default: + +* High +* Default +* Low + +Any tasks in the "high" queue are completed before the default queue is checked, and any tasks in the default queue are completed before those in the "low" queue. + +Plugins can also add custom queues for their own needs by setting the `queues` attribute under the PluginConfig class. An example is included below: + +```python +class MyPluginConfig(PluginConfig): + name = 'myplugin' + ... + queues = [ + 'foo', + 'bar', + ] +``` + +The `PluginConfig` above creates two custom queues with the following names `my_plugin.foo` and `my_plugin.bar`. (The plugin's name is prepended to each queue to avoid conflicts between plugins.) + +!!! warning "Configuring the RQ worker process" + By default, NetBox's RQ worker process only services the high, default, and low queues. Plugins which introduce custom queues should advise users to either reconfigure the default worker, or run a dedicated worker specifying the necessary queues. For example: + + ``` + python manage.py rqworker my_plugin.foo my_plugin.bar + ``` diff --git a/docs/plugins/development/background-tasks.md b/docs/plugins/development/background-tasks.md deleted file mode 100644 index 5ed05752af..0000000000 --- a/docs/plugins/development/background-tasks.md +++ /dev/null @@ -1,30 +0,0 @@ -# Background Tasks - -NetBox supports the queuing of tasks that need to be performed in the background, decoupled from the request-response cycle, using the [Python RQ](https://python-rq.org/) library. Three task queues of differing priority are defined by default: - -* High -* Default -* Low - -Any tasks in the "high" queue are completed before the default queue is checked, and any tasks in the default queue are completed before those in the "low" queue. - -Plugins can also add custom queues for their own needs by setting the `queues` attribute under the PluginConfig class. An example is included below: - -```python -class MyPluginConfig(PluginConfig): - name = 'myplugin' - ... - queues = [ - 'foo', - 'bar', - ] -``` - -The PluginConfig above creates two custom queues with the following names `my_plugin.foo` and `my_plugin.bar`. (The plugin's name is prepended to each queue to avoid conflicts between plugins.) - -!!! warning "Configuring the RQ worker process" - By default, NetBox's RQ worker process only services the high, default, and low queues. Plugins which introduce custom queues should advise users to either reconfigure the default worker, or run a dedicated worker specifying the necessary queues. For example: - - ``` - python manage.py rqworker my_plugin.foo my_plugin.bar - ``` diff --git a/docs/plugins/development/event-types.md b/docs/plugins/development/event-types.md new file mode 100644 index 0000000000..4bcdeea31a --- /dev/null +++ b/docs/plugins/development/event-types.md @@ -0,0 +1,18 @@ +# Event Types + +!!! info "This feature was introduced in NetBox v4.1." + +Plugins can register their own custom event types for use with NetBox [event rules](../../models/extras/eventrule.md). This is accomplished by calling the `register()` method on an instance of the `EventType` class. This can be done anywhere within the plugin. An example is provided below. + +```python +from django.utils.translation import gettext_lazy as _ +from netbox.events import EventType, EVENT_TYPE_KIND_SUCCESS + +EventType( + name='ticket_opened', + text=_('Ticket opened'), + kind=EVENT_TYPE_KIND_SUCCESS +).register() +``` + +::: netbox.events.EventType diff --git a/docs/plugins/development/index.md b/docs/plugins/development/index.md index c042be6ec7..f3f9a3e4ff 100644 --- a/docs/plugins/development/index.md +++ b/docs/plugins/development/index.md @@ -47,6 +47,7 @@ project-name/ - __init__.py - filtersets.py - graphql.py + - jobs.py - models.py - middleware.py - navigation.py diff --git a/docs/plugins/development/models.md b/docs/plugins/development/models.md index 902ee9c82d..03cedda169 100644 --- a/docs/plugins/development/models.md +++ b/docs/plugins/development/models.md @@ -130,6 +130,8 @@ For more information about database migrations, see the [Django documentation](h ::: netbox.models.features.ExportTemplatesMixin +::: netbox.models.features.JobsMixin + ::: netbox.models.features.JournalingMixin ::: netbox.models.features.TagsMixin diff --git a/docs/plugins/development/rest-api.md b/docs/plugins/development/rest-api.md index 57ad685294..8cb5b37136 100644 --- a/docs/plugins/development/rest-api.md +++ b/docs/plugins/development/rest-api.md @@ -25,9 +25,11 @@ project-name/ Serializers are responsible for converting Python objects to JSON data suitable for conveying to consumers, and vice versa. NetBox provides the `NetBoxModelSerializer` class for use by plugins to handle the assignment of tags and custom field data. (These features can also be included ad hoc via the `CustomFieldModelSerializer` and `TaggableModelSerializer` classes.) +The default nested representation of an object is defined by the `brief_fields` attributes under the serializer's `Meta` class. (Older versions of NetBox required the definition of a separate nested serializer.) + #### Example -To create a serializer for a plugin model, subclass `NetBoxModelSerializer` in `api/serializers.py`. Specify the model class and the fields to include within the serializer's `Meta` class. It is generally advisable to include a `url` attribute on each serializer. This will render the direct link to access the object being rendered. +To create a serializer for a plugin model, subclass `NetBoxModelSerializer` in `api/serializers.py`. Specify the model class and the fields to include within the serializer's `Meta` class. ```python # api/serializers.py @@ -36,40 +38,12 @@ from netbox.api.serializers import NetBoxModelSerializer from my_plugin.models import MyModel class MyModelSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='plugins-api:myplugin-api:mymodel-detail' - ) + foo = SiteSerializer(nested=True, allow_null=True) class Meta: model = MyModel fields = ('id', 'foo', 'bar', 'baz') -``` - -### Nested Serializers - -There are two cases where it is generally desirable to show only a minimal representation of an object: - -1. When displaying an object related to the one being viewed (for example, the region to which a site is assigned) -2. Listing many objects using "brief" mode - -To accommodate these, it is recommended to create nested serializers accompanying the "full" serializer for each model. NetBox provides the `WritableNestedSerializer` class for just this purpose. This class accepts a primary key value on write, but displays an object representation for read requests. It also includes a read-only `display` attribute which conveys the string representation of the object. - -#### Example - -```python -# api/serializers.py -from rest_framework import serializers -from netbox.api.serializers import WritableNestedSerializer -from my_plugin.models import MyModel - -class NestedMyModelSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='plugins-api:myplugin-api:mymodel-detail' - ) - - class Meta: - model = MyModel - fields = ('id', 'display', 'foo') + brief_fields = ('id', 'url', 'display', 'bar') ``` ## Viewsets diff --git a/docs/plugins/development/views.md b/docs/plugins/development/views.md index 3c13a6fcbf..1f5f164fde 100644 --- a/docs/plugins/development/views.md +++ b/docs/plugins/development/views.md @@ -191,19 +191,25 @@ class MyView(generic.ObjectView): ### Extra Template Content -Plugins can inject custom content into certain areas of core NetBox views. This is accomplished by subclassing `PluginTemplateExtension`, designating a particular NetBox model, and defining the desired method(s) to render custom content. Five methods are available: +Plugins can inject custom content into certain areas of core NetBox views. This is accomplished by subclassing `PluginTemplateExtension`, optionally designating one or more particular NetBox models, and defining the desired method(s) to render custom content. Five methods are available: | Method | View | Description | |---------------------|-------------|-----------------------------------------------------| +| `navbar()` | All | Inject content inside the top navigation bar | +| `list_buttons()` | List view | Add buttons to the top of the page | +| `buttons()` | Object view | Add buttons to the top of the page | +| `alerts()` | Object view | Inject content at the top of the page | | `left_page()` | Object view | Inject content on the left side of the page | | `right_page()` | Object view | Inject content on the right side of the page | | `full_width_page()` | Object view | Inject content across the entire bottom of the page | -| `buttons()` | Object view | Add buttons to the top of the page | -| `list_buttons()` | List view | Add buttons to the top of the page | + +!!! info "The `navbar()` and `alerts()` methods were introduced in NetBox v4.1." Additionally, a `render()` method is available for convenience. This method accepts the name of a template to render, and any additional context data you want to pass. Its use is optional, however. -When a PluginTemplateExtension is instantiated, context data is assigned to `self.context`. Available data include: +To control where the custom content is injected, plugin authors can specify an iterable of models by overriding the `models` attribute on the subclass. Extensions which do not specify a set of models will be invoked on every view, where supported. + +When a PluginTemplateExtension is instantiated, context data is assigned to `self.context`. Available data includes: * `object` - The object being viewed (object views only) * `model` - The model of the list view (list views only) @@ -220,7 +226,7 @@ from netbox.plugins import PluginTemplateExtension from .models import Animal class SiteAnimalCount(PluginTemplateExtension): - model = 'dcim.site' + models = ['dcim.site'] def right_page(self): return self.render('netbox_animal_sounds/inc/animal_count.html', extra_context={ diff --git a/docs/release-notes/version-4.1.md b/docs/release-notes/version-4.1.md new file mode 100644 index 0000000000..0c1bf9dc0e --- /dev/null +++ b/docs/release-notes/version-4.1.md @@ -0,0 +1,126 @@ +# NetBox v4.1 + +## v4.1.0 (2024-09-03) + +### Breaking Changes + +* Several filters deprecated in v4.0 have been removed (see [#15410](https://github.com/netbox-community/netbox/issues/15410)). +* The unit size for `VirtualMachine.disk` and `VirtualDisk.size` has been changed from 1 gigabyte to 1 megabyte. Existing values will be adjusted automatically during the upgrade process. +* The `min_vid` and `max_vid` fields on the VLAN group model have been replaced with `vid_ranges`, an array of starting and ending VLAN ID pairs. +* The five individual event type fields on the EventRule model have been replaced by a single `event_types` array field, which lists applicable event types by name. +* All UI views & API endpoints associated with change records have been moved from `/extras` to `/core`. +* The `validate()` method on CustomValidator subclasses now **must** accept the request argument (deprecated in v4.0 by [#14279](https://github.com/netbox-community/netbox/issues/14279/)). + +### New Features + +#### Circuit Groups ([#7025](https://github.com/netbox-community/netbox/issues/7025)) + +Circuits can now be assigned to groups for administrative purposes. Each circuit may be assigned to multiple groups, and each assignment may optionally indicate a priority (primary, secondary, or tertiary). + +#### VLAN Group ID Ranges ([#9627](https://github.com/netbox-community/netbox/issues/9627)) + +The VLAN group model has been enhanced to support multiple VLAN ID (VID) ranges, whereas previously it could track only a single beginning and ending VID pair. VID ranges are stored as an array of beginning and ending (inclusive) integer pairs, e.g. `1-100,1000-1999`. + +#### Nested Device Modules ([#10500](https://github.com/netbox-community/netbox/issues/10500)) + +Module bays can now be added to modules to effect a hierarchical arrangement of submodules within a device. A module installed within a device's module bay may itself have module bays into which child modules may be installed. + +#### Rack Types ([#12826](https://github.com/netbox-community/netbox/issues/12826)) + +A new rack type model has been introduced, which functions similarly to device types. Users can now define a common make and model of equipment rack, the attributes of which are automatically populated when creating a new rack of that type. Backward compatibility for racks with individually defined characteristics is fully retained. + +#### Plugins Catalog Integration ([#14731](https://github.com/netbox-community/netbox/issues/14731)) + +The NetBox UI now integrates directly with the canonical [plugins catalog](https://netboxlabs.com/netbox-plugins/) hosted by [NetBox Labs](https://netboxlabs.com). Users can now explore available plugins and check for newer releases natively within the NetBox user interface. + +#### User Notifications ([#15621](https://github.com/netbox-community/netbox/issues/15621)) + +NetBox now includes a user notification system. Users can subscribe to individual objects and be alerted to changes within the web interface. Additionally, event rules can be created to trigger notifications for specific users and/or groups. Plugins can also employ this notification system for their own purposes. + +### Enhancements + +* [#7537](https://github.com/netbox-community/netbox/issues/7537) - Add a serial number field for virtual machines +* [#8198](https://github.com/netbox-community/netbox/issues/8198) - Enable uniqueness enforcement for custom field values +* [#8984](https://github.com/netbox-community/netbox/issues/8984) - Enable filtering of custom script output by log level +* [#11969](https://github.com/netbox-community/netbox/issues/11969) - Support for tracking airflow on racks and module types +* [#14656](https://github.com/netbox-community/netbox/issues/14656) - Dynamically render the custom field edit form depending on the selected field type +* [#15106](https://github.com/netbox-community/netbox/issues/15106) - Add `distance` and `distance_unit` fields for wireless links +* [#15156](https://github.com/netbox-community/netbox/issues/15156) - Add `display_url` field to all REST API serializers, which links to the corresponding UI view for an object +* [#16574](https://github.com/netbox-community/netbox/issues/16574) - Add `last_synced` time to REST API serializer for data sources +* [#16580](https://github.com/netbox-community/netbox/issues/16580) - Enable plugin views to enforce `LOGIN_REQUIRED` selectively (remove `AUTH_EXEMPT_PATHS`) +* [#16782](https://github.com/netbox-community/netbox/issues/16782) - Enable filtering of selection choices for object and multi-object custom fields +* [#16907](https://github.com/netbox-community/netbox/issues/16907) - Update user interface styling +* [#17051](https://github.com/netbox-community/netbox/issues/17051) - Introduce `ISOLATED_DEPLOYMENT` config parameter for denoting Internet isolation +* [#17221](https://github.com/netbox-community/netbox/issues/17221) - `ObjectEditView` now supports HTMX-based object editing +* [#17288](https://github.com/netbox-community/netbox/issues/17288) - Introduce a configurable limit on the number of aliases within a GraphQL API request +* [#17289](https://github.com/netbox-community/netbox/issues/17289) - Enforce a standard policy for local passwords by default +* [#17318](https://github.com/netbox-community/netbox/issues/17318) - Include the assigned provider in nested API representation of circuits + +### Bug Fixes (From Beta1) + +* [#17086](https://github.com/netbox-community/netbox/issues/17086) - Fix exception when viewing a job with no related object +* [#17097](https://github.com/netbox-community/netbox/issues/17097) - Record static object representation when calling `NotificationGroup.notify()` +* [#17098](https://github.com/netbox-community/netbox/issues/17098) - Prevent automatic deletion of related notifications when deleting an object +* [#17159](https://github.com/netbox-community/netbox/issues/17159) - Correct file paths in plugin installation instructions +* [#17163](https://github.com/netbox-community/netbox/issues/17163) - Fix filtering of related services under IP address view +* [#17169](https://github.com/netbox-community/netbox/issues/17169) - Avoid duplicating catalog listings for installed plugins +* [#17301](https://github.com/netbox-community/netbox/issues/17301) - Correct styling of the edit & delete buttons for custom script modules +* [#17302](https://github.com/netbox-community/netbox/issues/17302) - Fix log level filtering support for custom script messages +* [#17306](https://github.com/netbox-community/netbox/issues/17306) - Correct rounding of reported VLAN group utilization + +### Plugins + +* [#15692](https://github.com/netbox-community/netbox/issues/15692) - Introduce improved plugin support for background jobs +* [#16359](https://github.com/netbox-community/netbox/issues/16359) - Enable plugins to embed content in the top navigation bar +* [#16726](https://github.com/netbox-community/netbox/issues/16726) - Extend `PluginTemplateExtension` to enable registering multiple models +* [#16776](https://github.com/netbox-community/netbox/issues/16776) - Add an `alerts()` method to `PluginTemplateExtension` for embedding important information on object views +* [#16886](https://github.com/netbox-community/netbox/issues/16886) - Introduce a mechanism for plugins to register custom event types (for use with user notifications) + +### Other Changes + +* [#14692](https://github.com/netbox-community/netbox/issues/14692) - Change the atomic unit for virtual disks from 1GB to 1MB +* [#14861](https://github.com/netbox-community/netbox/issues/14861) - The URL path for UI views concerning virtual disks has been standardized to `/virtualization/virtual-disks/` +* [#15410](https://github.com/netbox-community/netbox/issues/15410) - Remove various deprecated query filters +* [#15908](https://github.com/netbox-community/netbox/issues/15908) - Indicate product edition in release data +* [#16388](https://github.com/netbox-community/netbox/issues/16388) - Move all change logging resources from `extras` to `core` +* [#16884](https://github.com/netbox-community/netbox/issues/16884) - Remove the ID column from the default table configuration for changelog records +* [#16988](https://github.com/netbox-community/netbox/issues/16988) - Relocate rack items in navigation menu +* [#17143](https://github.com/netbox-community/netbox/issues/17143) - The use of legacy "nested" serializer classes has been deprecated + +### REST API Changes + +* The `/api/extras/object-changes/` endpoint has moved to `/api/core/object-changes/`. +* Most object representations now include a read-only `display_url` field, which links to the object's corresponding UI view. +* Added the following endpoints: + * `/api/circuits/circuit-groups/` + * `/api/circuits/circuit-group-assignments/` + * `/api/dcim/rack-types/` + * `/api/extras/notification-groups/` + * `/api/extras/notifications/` + * `/api/extras/subscriptions/` +* circuits.Circuit + * Added the `assignments` field, which lists all group assignments +* core.DataSource + * Added the read-only `last_synced` field +* dcim.ModuleBay + * Added the optional `module` foreign key field +* dcim.ModuleBayTemplate + * Added the optional `module_type` foreign key field +* dcim.ModuleType + * Added the optional `airflow` choice field +* dcim.Rack + * Added the optional `rack_type` foreign key field + * Added the optional `airflow` choice field +* extras.CustomField + * Added the `related_object_filter` JSON field for object and multi-object custom fields + * Added the `validation_unique` boolean field +* extras.EventRule + * Removed the `type_create`, `type_update`, `type_delete`, `type_job_start`, and `type_job_end` boolean fields + * Added the `event_types` array field +* ipam.VLANGroup + * Removed the `min_vid` and `max_vid` fields + * Added the `vid_ranges` field, an array of starting & ending VLAN IDs +* virtualization.VirtualMachine + * Added the optional `serial` field +* wireless.WirelessLink + * Added the optional `distance` and `distance_unit` fields diff --git a/mkdocs.yml b/mkdocs.yml index cf1e66cead..656a2e03f6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -86,6 +86,7 @@ nav: - Change Logging: 'features/change-logging.md' - Journaling: 'features/journaling.md' - Event Rules: 'features/event-rules.md' + - Notifications: 'features/notifications.md' - Background Jobs: 'features/background-jobs.md' - Auth & Permissions: 'features/authentication-permissions.md' - API & Integration: 'features/api-integration.md' @@ -108,6 +109,7 @@ nav: - Required Parameters: 'configuration/required-parameters.md' - System: 'configuration/system.md' - Security: 'configuration/security.md' + - GraphQL API: 'configuration/graphql-api.md' - Remote Authentication: 'configuration/remote-authentication.md' - Data & Validation: 'configuration/data-validation.md' - Default Values: 'configuration/default-values.md' @@ -142,10 +144,11 @@ nav: - Forms: 'plugins/development/forms.md' - Filters & Filter Sets: 'plugins/development/filtersets.md' - Search: 'plugins/development/search.md' + - Event Types: 'plugins/development/event-types.md' - Data Backends: 'plugins/development/data-backends.md' - REST API: 'plugins/development/rest-api.md' - GraphQL API: 'plugins/development/graphql-api.md' - - Background Tasks: 'plugins/development/background-tasks.md' + - Background Jobs: 'plugins/development/background-jobs.md' - Dashboard Widgets: 'plugins/development/dashboard-widgets.md' - Staged Changes: 'plugins/development/staged-changes.md' - Exceptions: 'plugins/development/exceptions.md' @@ -163,6 +166,8 @@ nav: - Data Model: - Circuits: - Circuit: 'models/circuits/circuit.md' + - CircuitGroup: 'models/circuits/circuitgroup.md' + - CircuitGroupAssignment: 'models/circuits/circuitgroupassignment.md' - Circuit Termination: 'models/circuits/circuittermination.md' - Circuit Type: 'models/circuits/circuittype.md' - Provider: 'models/circuits/provider.md' @@ -206,6 +211,7 @@ nav: - Rack: 'models/dcim/rack.md' - RackReservation: 'models/dcim/rackreservation.md' - RackRole: 'models/dcim/rackrole.md' + - RackType: 'models/dcim/racktype.md' - RearPort: 'models/dcim/rearport.md' - RearPortTemplate: 'models/dcim/rearporttemplate.md' - Region: 'models/dcim/region.md' @@ -225,8 +231,11 @@ nav: - ExportTemplate: 'models/extras/exporttemplate.md' - ImageAttachment: 'models/extras/imageattachment.md' - JournalEntry: 'models/extras/journalentry.md' + - Notification: 'models/extras/notification.md' + - NotificationGroup: 'models/extras/notificationgroup.md' - SavedFilter: 'models/extras/savedfilter.md' - StagedChange: 'models/extras/stagedchange.md' + - Subscription: 'models/extras/subscription.md' - Tag: 'models/extras/tag.md' - Webhook: 'models/extras/webhook.md' - IPAM: @@ -296,6 +305,7 @@ nav: - git Cheat Sheet: 'development/git-cheat-sheet.md' - Release Notes: - Summary: 'release-notes/index.md' + - Version 4.1: 'release-notes/version-4.1.md' - Version 4.0: 'release-notes/version-4.0.md' - Version 3.7: 'release-notes/version-3.7.md' - Version 3.6: 'release-notes/version-3.6.md' diff --git a/netbox/account/urls.py b/netbox/account/urls.py index 1276dce40d..d74677599e 100644 --- a/netbox/account/urls.py +++ b/netbox/account/urls.py @@ -9,6 +9,8 @@ # Account views path('profile/', views.ProfileView.as_view(), name='profile'), path('bookmarks/', views.BookmarkListView.as_view(), name='bookmarks'), + path('notifications/', views.NotificationListView.as_view(), name='notifications'), + path('subscriptions/', views.SubscriptionListView.as_view(), name='subscriptions'), path('preferences/', views.UserConfigView.as_view(), name='preferences'), path('password/', views.ChangePasswordView.as_view(), name='change_password'), path('api-tokens/', views.UserTokenListView.as_view(), name='usertoken_list'), diff --git a/netbox/account/views.py b/netbox/account/views.py index 18c2eb412a..05f40df3f0 100644 --- a/netbox/account/views.py +++ b/netbox/account/views.py @@ -19,8 +19,10 @@ from social_core.backends.utils import load_backends from account.models import UserToken -from extras.models import Bookmark, ObjectChange -from extras.tables import BookmarkTable, ObjectChangeTable +from core.models import ObjectChange +from core.tables import ObjectChangeTable +from extras.models import Bookmark +from extras.tables import BookmarkTable, NotificationTable, SubscriptionTable from netbox.authentication import get_auth_backend_display, get_saml_idps from netbox.config import get_config from netbox.views import generic @@ -275,6 +277,36 @@ def get_extra_context(self, request): } +# +# Notifications & subscriptions +# + +class NotificationListView(LoginRequiredMixin, generic.ObjectListView): + table = NotificationTable + template_name = 'account/notifications.html' + + def get_queryset(self, request): + return request.user.notifications.all() + + def get_extra_context(self, request): + return { + 'active_tab': 'notifications', + } + + +class SubscriptionListView(LoginRequiredMixin, generic.ObjectListView): + table = SubscriptionTable + template_name = 'account/subscriptions.html' + + def get_queryset(self, request): + return request.user.subscriptions.all() + + def get_extra_context(self, request): + return { + 'active_tab': 'subscriptions', + } + + # # User views for token management # diff --git a/netbox/circuits/api/nested_serializers.py b/netbox/circuits/api/nested_serializers.py index 36254dc8b5..6de2cbf544 100644 --- a/netbox/circuits/api/nested_serializers.py +++ b/netbox/circuits/api/nested_serializers.py @@ -1,9 +1,11 @@ +import warnings + from drf_spectacular.utils import extend_schema_serializer -from rest_framework import serializers from circuits.models import * from netbox.api.fields import RelatedObjectCountField from netbox.api.serializers import WritableNestedSerializer +from .serializers_.nested import NestedProviderAccountSerializer __all__ = [ 'NestedCircuitSerializer', @@ -14,17 +16,22 @@ 'NestedProviderAccountSerializer', ] +# TODO: Remove in v4.2 +warnings.warn( + f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.", + DeprecationWarning +) + # # Provider networks # class NestedProviderNetworkSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:providernetwork-detail') class Meta: model = ProviderNetwork - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] # @@ -35,24 +42,11 @@ class Meta: exclude_fields=('circuit_count',), ) class NestedProviderSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provider-detail') circuit_count = RelatedObjectCountField('circuits') class Meta: model = Provider - fields = ['id', 'url', 'display', 'name', 'slug', 'circuit_count'] - - -# -# Provider Accounts -# - -class NestedProviderAccountSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provideraccount-detail') - - class Meta: - model = ProviderAccount - fields = ['id', 'url', 'display', 'name', 'account'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'circuit_count'] # @@ -63,26 +57,23 @@ class Meta: exclude_fields=('circuit_count',), ) class NestedCircuitTypeSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail') circuit_count = RelatedObjectCountField('circuits') class Meta: model = CircuitType - fields = ['id', 'url', 'display', 'name', 'slug', 'circuit_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'circuit_count'] class NestedCircuitSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuit-detail') class Meta: model = Circuit - fields = ['id', 'url', 'display', 'cid'] + fields = ['id', 'url', 'display_url', 'display', 'cid'] class NestedCircuitTerminationSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') circuit = NestedCircuitSerializer() class Meta: model = CircuitTermination - fields = ['id', 'url', 'display', 'circuit', 'term_side', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'circuit', 'term_side', 'cable', '_occupied'] diff --git a/netbox/circuits/api/serializers.py b/netbox/circuits/api/serializers.py index 5e048218c5..9a2af4a674 100644 --- a/netbox/circuits/api/serializers.py +++ b/netbox/circuits/api/serializers.py @@ -1,3 +1,2 @@ from .serializers_.providers import * from .serializers_.circuits import * -from .nested_serializers import * diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index a0d0e5e134..c605a4bd5c 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -1,7 +1,5 @@ -from rest_framework import serializers - -from circuits.choices import CircuitStatusChoices -from circuits.models import Circuit, CircuitTermination, CircuitType +from circuits.choices import CircuitPriorityChoices, CircuitStatusChoices +from circuits.models import Circuit, CircuitGroup, CircuitGroupAssignment, CircuitTermination, CircuitType from dcim.api.serializers_.cables import CabledObjectSerializer from dcim.api.serializers_.sites import SiteSerializer from netbox.api.fields import ChoiceField, RelatedObjectCountField @@ -12,13 +10,14 @@ __all__ = ( 'CircuitSerializer', + 'CircuitGroupAssignmentSerializer', + 'CircuitGroupSerializer', 'CircuitTerminationSerializer', 'CircuitTypeSerializer', ) class CircuitTypeSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittype-detail') # Related object counts circuit_count = RelatedObjectCountField('circuits') @@ -26,27 +25,53 @@ class CircuitTypeSerializer(NetBoxModelSerializer): class Meta: model = CircuitType fields = [ - 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'circuit_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'circuit_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'circuit_count') class CircuitCircuitTerminationSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') site = SiteSerializer(nested=True, allow_null=True) provider_network = ProviderNetworkSerializer(nested=True, allow_null=True) class Meta: model = CircuitTermination fields = [ - 'id', 'url', 'display', 'site', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', - 'description', + 'id', 'url', 'display_url', 'display', 'site', 'provider_network', 'port_speed', 'upstream_speed', + 'xconnect_id', 'description', ] +class CircuitGroupSerializer(NetBoxModelSerializer): + tenant = TenantSerializer(nested=True, required=False, allow_null=True) + circuit_count = RelatedObjectCountField('assignments') + + class Meta: + model = CircuitGroup + fields = [ + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tenant', + 'tags', 'custom_fields', 'created', 'last_updated', 'circuit_count' + ] + brief_fields = ('id', 'url', 'display', 'name') + + +class CircuitGroupAssignmentSerializer_(NetBoxModelSerializer): + """ + Base serializer for group assignments under CircuitSerializer. + """ + group = CircuitGroupSerializer(nested=True) + priority = ChoiceField(choices=CircuitPriorityChoices, allow_blank=True, required=False) + + class Meta: + model = CircuitGroupAssignment + fields = [ + 'id', 'url', 'display_url', 'display', 'group', 'priority', 'tags', 'created', 'last_updated', + ] + brief_fields = ('id', 'url', 'display', 'group', 'priority') + + class CircuitSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuit-detail') provider = ProviderSerializer(nested=True) provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True, default=None) status = ChoiceField(choices=CircuitStatusChoices, required=False) @@ -54,19 +79,19 @@ class CircuitSerializer(NetBoxModelSerializer): tenant = TenantSerializer(nested=True, required=False, allow_null=True) termination_a = CircuitCircuitTerminationSerializer(read_only=True, allow_null=True) termination_z = CircuitCircuitTerminationSerializer(read_only=True, allow_null=True) + assignments = CircuitGroupAssignmentSerializer_(nested=True, many=True, required=False) class Meta: model = Circuit fields = [ - 'id', 'url', 'display', 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant', 'install_date', - 'termination_date', 'commit_rate', 'description', 'termination_a', 'termination_z', 'comments', 'tags', - 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant', + 'install_date', 'termination_date', 'commit_rate', 'description', 'termination_a', 'termination_z', + 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'assignments', ] - brief_fields = ('id', 'url', 'display', 'cid', 'description') + brief_fields = ('id', 'url', 'display', 'provider', 'cid', 'description') class CircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuittermination-detail') circuit = CircuitSerializer(nested=True) site = SiteSerializer(nested=True, required=False, allow_null=True) provider_network = ProviderNetworkSerializer(nested=True, required=False, allow_null=True) @@ -74,8 +99,19 @@ class CircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer class Meta: model = CircuitTermination fields = [ - 'id', 'url', 'display', 'circuit', 'term_side', 'site', 'provider_network', 'port_speed', 'upstream_speed', - 'xconnect_id', 'pp_info', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', - 'link_peers_type', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', + 'id', 'url', 'display_url', 'display', 'circuit', 'term_side', 'site', 'provider_network', 'port_speed', + 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'mark_connected', 'cable', 'cable_end', + 'link_peers', 'link_peers_type', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] brief_fields = ('id', 'url', 'display', 'circuit', 'term_side', 'description', 'cable', '_occupied') + + +class CircuitGroupAssignmentSerializer(CircuitGroupAssignmentSerializer_): + circuit = CircuitSerializer(nested=True) + + class Meta: + model = CircuitGroupAssignment + fields = [ + 'id', 'url', 'display_url', 'display', 'group', 'circuit', 'priority', 'tags', 'created', 'last_updated', + ] + brief_fields = ('id', 'url', 'display', 'group', 'circuit', 'priority') diff --git a/netbox/circuits/api/serializers_/nested.py b/netbox/circuits/api/serializers_/nested.py new file mode 100644 index 0000000000..7f03de9423 --- /dev/null +++ b/netbox/circuits/api/serializers_/nested.py @@ -0,0 +1,13 @@ +from circuits.models import ProviderAccount +from netbox.api.serializers import WritableNestedSerializer + +__all__ = ( + 'NestedProviderAccountSerializer', +) + + +class NestedProviderAccountSerializer(WritableNestedSerializer): + + class Meta: + model = ProviderAccount + fields = ['id', 'url', 'display_url', 'display', 'name', 'account'] diff --git a/netbox/circuits/api/serializers_/providers.py b/netbox/circuits/api/serializers_/providers.py index fa44897877..4e37871079 100644 --- a/netbox/circuits/api/serializers_/providers.py +++ b/netbox/circuits/api/serializers_/providers.py @@ -5,7 +5,7 @@ from ipam.models import ASN from netbox.api.fields import RelatedObjectCountField, SerializedPKRelatedField from netbox.api.serializers import NetBoxModelSerializer -from ..nested_serializers import * +from .nested import NestedProviderAccountSerializer __all__ = ( 'ProviderAccountSerializer', @@ -15,7 +15,6 @@ class ProviderSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provider-detail') accounts = SerializedPKRelatedField( queryset=ProviderAccount.objects.all(), serializer=NestedProviderAccountSerializer, @@ -36,34 +35,32 @@ class ProviderSerializer(NetBoxModelSerializer): class Meta: model = Provider fields = [ - 'id', 'url', 'display', 'name', 'slug', 'accounts', 'description', 'comments', 'asns', 'tags', - 'custom_fields', 'created', 'last_updated', 'circuit_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'accounts', 'description', 'comments', + 'asns', 'tags', 'custom_fields', 'created', 'last_updated', 'circuit_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'circuit_count') class ProviderAccountSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:provideraccount-detail') provider = ProviderSerializer(nested=True) name = serializers.CharField(allow_blank=True, max_length=100, required=False, default='') class Meta: model = ProviderAccount fields = [ - 'id', 'url', 'display', 'provider', 'name', 'account', 'description', 'comments', 'tags', 'custom_fields', - 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'provider', 'name', 'account', 'description', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'account', 'description') class ProviderNetworkSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='circuits-api:providernetwork-detail') provider = ProviderSerializer(nested=True) class Meta: model = ProviderNetwork fields = [ - 'id', 'url', 'display', 'provider', 'name', 'service_id', 'description', 'comments', 'tags', + 'id', 'url', 'display_url', 'display', 'provider', 'name', 'service_id', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/circuits/api/urls.py b/netbox/circuits/api/urls.py index fcb7a1a512..00af3dec68 100644 --- a/netbox/circuits/api/urls.py +++ b/netbox/circuits/api/urls.py @@ -14,6 +14,8 @@ router.register('circuit-types', views.CircuitTypeViewSet) router.register('circuits', views.CircuitViewSet) router.register('circuit-terminations', views.CircuitTerminationViewSet) +router.register('circuit-groups', views.CircuitGroupViewSet) +router.register('circuit-group-assignments', views.CircuitGroupAssignmentViewSet) app_name = 'circuits-api' urlpatterns = router.urls diff --git a/netbox/circuits/api/views.py b/netbox/circuits/api/views.py index fffb59a574..8cce013d74 100644 --- a/netbox/circuits/api/views.py +++ b/netbox/circuits/api/views.py @@ -55,6 +55,26 @@ class CircuitTerminationViewSet(PassThroughPortMixin, NetBoxModelViewSet): filterset_class = filtersets.CircuitTerminationFilterSet +# +# Circuit Groups +# + +class CircuitGroupViewSet(NetBoxModelViewSet): + queryset = CircuitGroup.objects.all() + serializer_class = serializers.CircuitGroupSerializer + filterset_class = filtersets.CircuitGroupFilterSet + + +# +# Circuit Group Assignments +# + +class CircuitGroupAssignmentViewSet(NetBoxModelViewSet): + queryset = CircuitGroupAssignment.objects.all() + serializer_class = serializers.CircuitGroupAssignmentSerializer + filterset_class = filtersets.CircuitGroupAssignmentFilterSet + + # # Provider accounts # diff --git a/netbox/circuits/choices.py b/netbox/circuits/choices.py index e2d345581a..8c25c7459d 100644 --- a/netbox/circuits/choices.py +++ b/netbox/circuits/choices.py @@ -76,3 +76,19 @@ class CircuitTerminationPortSpeedChoices(ChoiceSet): (1544, 'T1 (1.544 Mbps)'), (2048, 'E1 (2.048 Mbps)'), ] + + +class CircuitPriorityChoices(ChoiceSet): + key = 'CircuitGroupAssignment.priority' + + PRIORITY_PRIMARY = 'primary' + PRIORITY_SECONDARY = 'secondary' + PRIORITY_TERTIARY = 'tertiary' + PRIORITY_INACTIVE = 'inactive' + + CHOICES = [ + (PRIORITY_PRIMARY, _('Primary')), + (PRIORITY_SECONDARY, _('Secondary')), + (PRIORITY_TERTIARY, _('Tertiary')), + (PRIORITY_INACTIVE, _('Inactive')), + ] diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index e526738743..c55807c755 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -13,6 +13,8 @@ __all__ = ( 'CircuitFilterSet', + 'CircuitGroupAssignmentFilterSet', + 'CircuitGroupFilterSet', 'CircuitTerminationFilterSet', 'CircuitTypeFilterSet', 'ProviderNetworkFilterSet', @@ -303,3 +305,60 @@ def search(self, queryset, name, value): Q(pp_info__icontains=value) | Q(description__icontains=value) ).distinct() + + +class CircuitGroupFilterSet(OrganizationalModelFilterSet, TenancyFilterSet): + + class Meta: + model = CircuitGroup + fields = ('id', 'name', 'slug', 'description') + + +class CircuitGroupAssignmentFilterSet(NetBoxModelFilterSet): + q = django_filters.CharFilter( + method='search', + label=_('Search'), + ) + provider_id = django_filters.ModelMultipleChoiceFilter( + field_name='circuit__provider', + queryset=Provider.objects.all(), + label=_('Provider (ID)'), + ) + provider = django_filters.ModelMultipleChoiceFilter( + field_name='circuit__provider__slug', + queryset=Provider.objects.all(), + to_field_name='slug', + label=_('Provider (slug)'), + ) + circuit_id = django_filters.ModelMultipleChoiceFilter( + queryset=Circuit.objects.all(), + label=_('Circuit (ID)'), + ) + circuit = django_filters.ModelMultipleChoiceFilter( + field_name='circuit__cid', + queryset=Circuit.objects.all(), + to_field_name='cid', + label=_('Circuit (CID)'), + ) + group_id = django_filters.ModelMultipleChoiceFilter( + queryset=CircuitGroup.objects.all(), + label=_('Circuit group (ID)'), + ) + group = django_filters.ModelMultipleChoiceFilter( + field_name='group__slug', + queryset=CircuitGroup.objects.all(), + to_field_name='slug', + label=_('Circuit group (slug)'), + ) + + class Meta: + model = CircuitGroupAssignment + fields = ('id', 'priority') + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(circuit__cid__icontains=value) | + Q(group__name__icontains=value) + ) diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index ea15c30100..3bb50a8d01 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -1,7 +1,7 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from circuits.choices import CircuitCommitRateChoices, CircuitStatusChoices +from circuits.choices import CircuitCommitRateChoices, CircuitPriorityChoices, CircuitStatusChoices from circuits.models import * from dcim.models import Site from ipam.models import ASN @@ -14,6 +14,8 @@ __all__ = ( 'CircuitBulkEditForm', + 'CircuitGroupAssignmentBulkEditForm', + 'CircuitGroupBulkEditForm', 'CircuitTerminationBulkEditForm', 'CircuitTypeBulkEditForm', 'ProviderBulkEditForm', @@ -219,3 +221,40 @@ class CircuitTerminationBulkEditForm(NetBoxModelBulkEditForm): FieldSet('port_speed', 'upstream_speed', name=_('Termination Details')), ) nullable_fields = ('description') + + +class CircuitGroupBulkEditForm(NetBoxModelBulkEditForm): + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + tenant = DynamicModelChoiceField( + label=_('Tenant'), + queryset=Tenant.objects.all(), + required=False + ) + + model = CircuitGroup + nullable_fields = ( + 'description', 'tenant', + ) + + +class CircuitGroupAssignmentBulkEditForm(NetBoxModelBulkEditForm): + circuit = DynamicModelChoiceField( + label=_('Circuit'), + queryset=Circuit.objects.all(), + required=False + ) + priority = forms.ChoiceField( + label=_('Priority'), + choices=add_blank_choice(CircuitPriorityChoices), + required=False + ) + + model = CircuitGroupAssignment + fieldsets = ( + FieldSet('circuit', 'priority'), + ) + nullable_fields = ('priority',) diff --git a/netbox/circuits/forms/bulk_import.py b/netbox/circuits/forms/bulk_import.py index 88fdd2c712..1e7b6361a6 100644 --- a/netbox/circuits/forms/bulk_import.py +++ b/netbox/circuits/forms/bulk_import.py @@ -11,6 +11,8 @@ __all__ = ( 'CircuitImportForm', + 'CircuitGroupAssignmentImportForm', + 'CircuitGroupImportForm', 'CircuitTerminationImportForm', 'CircuitTerminationImportRelatedForm', 'CircuitTypeImportForm', @@ -150,3 +152,24 @@ class Meta: 'circuit', 'term_side', 'site', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'tags' ] + + +class CircuitGroupImportForm(NetBoxModelImportForm): + tenant = CSVModelChoiceField( + label=_('Tenant'), + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text=_('Assigned tenant') + ) + + class Meta: + model = CircuitGroup + fields = ('name', 'slug', 'description', 'tenant', 'tags') + + +class CircuitGroupAssignmentImportForm(NetBoxModelImportForm): + + class Meta: + model = CircuitGroupAssignment + fields = ('circuit', 'group', 'priority') diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 6f6473c3d9..a658dd641e 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -1,7 +1,7 @@ from django import forms from django.utils.translation import gettext as _ -from circuits.choices import CircuitCommitRateChoices, CircuitStatusChoices, CircuitTerminationSideChoices +from circuits.choices import CircuitCommitRateChoices, CircuitPriorityChoices, CircuitStatusChoices, CircuitTerminationSideChoices from circuits.models import * from dcim.models import Region, Site, SiteGroup from ipam.models import ASN @@ -13,6 +13,8 @@ __all__ = ( 'CircuitFilterForm', + 'CircuitGroupAssignmentFilterForm', + 'CircuitGroupFilterForm', 'CircuitTerminationFilterForm', 'CircuitTypeFilterForm', 'ProviderFilterForm', @@ -230,3 +232,41 @@ class CircuitTerminationFilterForm(NetBoxModelFilterSetForm): label=_('Provider') ) tag = TagFilterField(model) + + +class CircuitGroupFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): + model = CircuitGroup + fieldsets = ( + FieldSet('q', 'filter_id', 'tag'), + FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), + ) + tag = TagFilterField(model) + + +class CircuitGroupAssignmentFilterForm(NetBoxModelFilterSetForm): + model = CircuitGroupAssignment + fieldsets = ( + FieldSet('q', 'filter_id', 'tag'), + FieldSet('provider_id', 'circuit_id', 'group_id', 'priority', name=_('Assignment')), + ) + provider_id = DynamicModelMultipleChoiceField( + queryset=Provider.objects.all(), + required=False, + label=_('Provider') + ) + circuit_id = DynamicModelMultipleChoiceField( + queryset=Circuit.objects.all(), + required=False, + label=_('Circuit') + ) + group_id = DynamicModelMultipleChoiceField( + queryset=CircuitGroup.objects.all(), + required=False, + label=_('Group') + ) + priority = forms.MultipleChoiceField( + label=_('Priority'), + choices=CircuitPriorityChoices, + required=False + ) + tag = TagFilterField(model) diff --git a/netbox/circuits/forms/model_forms.py b/netbox/circuits/forms/model_forms.py index ee5e47ce71..9a54fdccb9 100644 --- a/netbox/circuits/forms/model_forms.py +++ b/netbox/circuits/forms/model_forms.py @@ -12,6 +12,8 @@ __all__ = ( 'CircuitForm', + 'CircuitGroupAssignmentForm', + 'CircuitGroupForm', 'CircuitTerminationForm', 'CircuitTypeForm', 'ProviderForm', @@ -171,3 +173,36 @@ class Meta: options=CircuitTerminationPortSpeedChoices ), } + + +class CircuitGroupForm(TenancyForm, NetBoxModelForm): + slug = SlugField() + + fieldsets = ( + FieldSet('name', 'slug', 'description', 'tags', name=_('Circuit Group')), + FieldSet('tenant_group', 'tenant', name=_('Tenancy')), + ) + + class Meta: + model = CircuitGroup + fields = [ + 'name', 'slug', 'description', 'tenant_group', 'tenant', 'tags', + ] + + +class CircuitGroupAssignmentForm(NetBoxModelForm): + group = DynamicModelChoiceField( + label=_('Group'), + queryset=CircuitGroup.objects.all(), + ) + circuit = DynamicModelChoiceField( + label=_('Circuit'), + queryset=Circuit.objects.all(), + selector=True + ) + + class Meta: + model = CircuitGroupAssignment + fields = [ + 'group', 'circuit', 'priority', 'tags', + ] diff --git a/netbox/circuits/graphql/filters.py b/netbox/circuits/graphql/filters.py index 10887ce3f0..3ded6e6812 100644 --- a/netbox/circuits/graphql/filters.py +++ b/netbox/circuits/graphql/filters.py @@ -7,6 +7,8 @@ __all__ = ( 'CircuitTerminationFilter', 'CircuitFilter', + 'CircuitGroupAssignmentFilter', + 'CircuitGroupFilter', 'CircuitTypeFilter', 'ProviderFilter', 'ProviderAccountFilter', @@ -32,6 +34,18 @@ class CircuitTypeFilter(BaseFilterMixin): pass +@strawberry_django.filter(models.CircuitGroup, lookups=True) +@autotype_decorator(filtersets.CircuitGroupFilterSet) +class CircuitGroupFilter(BaseFilterMixin): + pass + + +@strawberry_django.filter(models.CircuitGroupAssignment, lookups=True) +@autotype_decorator(filtersets.CircuitGroupAssignmentFilterSet) +class CircuitGroupAssignmentFilter(BaseFilterMixin): + pass + + @strawberry_django.filter(models.Provider, lookups=True) @autotype_decorator(filtersets.ProviderFilterSet) class ProviderFilter(BaseFilterMixin): diff --git a/netbox/circuits/graphql/schema.py b/netbox/circuits/graphql/schema.py index d532d0d4b3..ac23421ce6 100644 --- a/netbox/circuits/graphql/schema.py +++ b/netbox/circuits/graphql/schema.py @@ -17,6 +17,12 @@ class CircuitsQuery: circuit_type: CircuitTypeType = strawberry_django.field() circuit_type_list: List[CircuitTypeType] = strawberry_django.field() + circuit_group: CircuitGroupType = strawberry_django.field() + circuit_group_list: List[CircuitGroupType] = strawberry_django.field() + + circuit_group_assignment: CircuitGroupAssignmentType = strawberry_django.field() + circuit_group_assignment_list: List[CircuitGroupAssignmentType] = strawberry_django.field() + provider: ProviderType = strawberry_django.field() provider_list: List[ProviderType] = strawberry_django.field() diff --git a/netbox/circuits/graphql/types.py b/netbox/circuits/graphql/types.py index bae91e6b02..45f0d065d5 100644 --- a/netbox/circuits/graphql/types.py +++ b/netbox/circuits/graphql/types.py @@ -6,13 +6,15 @@ from circuits import models from dcim.graphql.mixins import CabledObjectMixin from extras.graphql.mixins import ContactsMixin, CustomFieldsMixin, TagsMixin -from netbox.graphql.types import NetBoxObjectType, ObjectType, OrganizationalObjectType +from netbox.graphql.types import BaseObjectType, NetBoxObjectType, ObjectType, OrganizationalObjectType from tenancy.graphql.types import TenantType from .filters import * __all__ = ( 'CircuitTerminationType', 'CircuitType', + 'CircuitGroupAssignmentType', + 'CircuitGroupType', 'CircuitTypeType', 'ProviderType', 'ProviderAccountType', @@ -91,3 +93,22 @@ class CircuitType(NetBoxObjectType, ContactsMixin): tenant: TenantType | None terminations: List[CircuitTerminationType] + + +@strawberry_django.type( + models.CircuitGroup, + fields='__all__', + filters=CircuitGroupFilter +) +class CircuitGroupType(OrganizationalObjectType): + tenant: TenantType | None + + +@strawberry_django.type( + models.CircuitGroupAssignment, + fields='__all__', + filters=CircuitGroupAssignmentFilter +) +class CircuitGroupAssignmentType(TagsMixin, BaseObjectType): + group: Annotated["CircuitGroupType", strawberry.lazy('circuits.graphql.types')] + circuit: Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')] diff --git a/netbox/circuits/migrations/0044_circuit_groups.py b/netbox/circuits/migrations/0044_circuit_groups.py new file mode 100644 index 0000000000..98c3b8f3da --- /dev/null +++ b/netbox/circuits/migrations/0044_circuit_groups.py @@ -0,0 +1,88 @@ +import django.db.models.deletion +import taggit.managers +import utilities.json +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('circuits', '0043_circuittype_color'), + ('extras', '0119_notifications'), + ('tenancy', '0015_contactassignment_rename_content_type'), + ] + + operations = [ + migrations.CreateModel( + name='CircuitGroup', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ( + 'custom_field_data', + models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder), + ), + ('name', models.CharField(max_length=100, unique=True)), + ('slug', models.SlugField(max_length=100, unique=True)), + ('description', models.CharField(blank=True, max_length=200)), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ( + 'tenant', + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name='circuit_groups', + to='tenancy.tenant', + ), + ), + ], + options={ + 'verbose_name': 'Circuit group', + 'verbose_name_plural': 'Circuit group', + 'ordering': ('name',), + }, + ), + migrations.CreateModel( + name='CircuitGroupAssignment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ( + 'custom_field_data', + models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder), + ), + ('priority', models.CharField(blank=True, max_length=50)), + ( + 'circuit', + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='assignments', + to='circuits.circuit', + ), + ), + ( + 'group', + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='assignments', + to='circuits.circuitgroup', + ), + ), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'verbose_name': 'Circuit group assignment', + 'verbose_name_plural': 'Circuit group assignments', + 'ordering': ('group', 'circuit', 'priority', 'pk'), + }, + ), + migrations.AddConstraint( + model_name='circuitgroupassignment', + constraint=models.UniqueConstraint( + fields=('circuit', 'group'), name='circuits_circuitgroupassignment_unique_circuit_group' + ), + ), + ] diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index fa21d7cd33..68c938aa99 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -6,11 +6,13 @@ from circuits.choices import * from dcim.models import CabledObjectModel from netbox.models import ChangeLoggedModel, OrganizationalModel, PrimaryModel -from netbox.models.features import ContactsMixin, CustomFieldsMixin, CustomLinksMixin, ImageAttachmentsMixin, TagsMixin +from netbox.models.features import ContactsMixin, CustomFieldsMixin, CustomLinksMixin, ExportTemplatesMixin, ImageAttachmentsMixin, TagsMixin from utilities.fields import ColorField __all__ = ( 'Circuit', + 'CircuitGroup', + 'CircuitGroupAssignment', 'CircuitTermination', 'CircuitType', ) @@ -151,6 +153,75 @@ def clean(self): raise ValidationError({'provider_account': "The assigned account must belong to the assigned provider."}) +class CircuitGroup(OrganizationalModel): + """ + An administrative grouping of Circuits. + """ + tenant = models.ForeignKey( + to='tenancy.Tenant', + on_delete=models.PROTECT, + related_name='circuit_groups', + blank=True, + null=True + ) + + class Meta: + ordering = ('name',) + verbose_name = _('circuit group') + verbose_name_plural = _('circuit groups') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('circuits:circuitgroup', args=[self.pk]) + + +class CircuitGroupAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel): + """ + Assignment of a Circuit to a CircuitGroup with an optional priority. + """ + circuit = models.ForeignKey( + Circuit, + on_delete=models.CASCADE, + related_name='assignments' + ) + group = models.ForeignKey( + CircuitGroup, + on_delete=models.CASCADE, + related_name='assignments' + ) + priority = models.CharField( + verbose_name=_('priority'), + max_length=50, + choices=CircuitPriorityChoices, + blank=True + ) + prerequisite_models = ( + 'circuits.Circuit', + 'circuits.CircuitGroup', + ) + + class Meta: + ordering = ('group', 'circuit', 'priority', 'pk') + constraints = ( + models.UniqueConstraint( + fields=('circuit', 'group'), + name='%(app_label)s_%(class)s_unique_circuit_group' + ), + ) + verbose_name = _('Circuit group assignment') + verbose_name_plural = _('Circuit group assignments') + + def __str__(self): + if self.priority: + return f"{self.group} ({self.get_priority_display()})" + return str(self.group) + + def get_absolute_url(self): + return reverse('circuits:circuitgroupassignment', args=[self.pk]) + + class CircuitTermination( CustomFieldsMixin, CustomLinksMixin, diff --git a/netbox/circuits/search.py b/netbox/circuits/search.py index f3fa359bae..7a5711f032 100644 --- a/netbox/circuits/search.py +++ b/netbox/circuits/search.py @@ -13,6 +13,17 @@ class CircuitIndex(SearchIndex): display_attrs = ('provider', 'provider_account', 'type', 'status', 'tenant', 'description') +@register_search +class CircuitGroupIndex(SearchIndex): + model = models.CircuitGroup + fields = ( + ('name', 100), + ('slug', 110), + ('description', 500), + ) + display_attrs = ('description',) + + @register_search class CircuitTerminationIndex(SearchIndex): model = models.CircuitTermination diff --git a/netbox/circuits/tables/circuits.py b/netbox/circuits/tables/circuits.py index e1b99ff425..eefe2bd22d 100644 --- a/netbox/circuits/tables/circuits.py +++ b/netbox/circuits/tables/circuits.py @@ -9,6 +9,8 @@ from .columns import CommitRateColumn __all__ = ( + 'CircuitGroupAssignmentTable', + 'CircuitGroupTable', 'CircuitTable', 'CircuitTerminationTable', 'CircuitTypeTable', @@ -75,18 +77,22 @@ class CircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): verbose_name=_('Commit Rate') ) comments = columns.MarkdownColumn( - verbose_name=_('Comments'), + verbose_name=_('Comments') ) tags = columns.TagColumn( url_name='circuits:circuit_list' ) + assignments = columns.ManyToManyColumn( + verbose_name=_('Assignments'), + linkify_item=True + ) class Meta(NetBoxTable.Meta): model = Circuit fields = ( 'pk', 'id', 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant', 'tenant_group', 'termination_a', 'termination_z', 'install_date', 'termination_date', 'commit_rate', 'description', - 'comments', 'contacts', 'tags', 'created', 'last_updated', + 'comments', 'contacts', 'tags', 'created', 'last_updated', 'assignments', ) default_columns = ( 'pk', 'cid', 'provider', 'type', 'status', 'tenant', 'termination_a', 'termination_z', 'description', @@ -119,3 +125,55 @@ class Meta(NetBoxTable.Meta): 'xconnect_id', 'pp_info', 'description', 'created', 'last_updated', 'actions', ) default_columns = ('pk', 'id', 'circuit', 'provider', 'term_side', 'description') + + +class CircuitGroupTable(NetBoxTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True + ) + circuit_group_assignment_count = columns.LinkedCountColumn( + viewname='circuits:circuitgroupassignment_list', + url_params={'group_id': 'pk'}, + verbose_name=_('Circuits') + ) + tags = columns.TagColumn( + url_name='circuits:circuitgroup_list' + ) + + class Meta(NetBoxTable.Meta): + model = CircuitGroup + fields = ( + 'pk', 'name', 'description', 'circuit_group_assignment_count', 'tags', + 'created', 'last_updated', 'actions', + ) + default_columns = ('pk', 'name', 'description', 'circuit_group_assignment_count') + + +class CircuitGroupAssignmentTable(NetBoxTable): + group = tables.Column( + verbose_name=_('Group'), + linkify=True + ) + provider = tables.Column( + accessor='circuit__provider', + verbose_name=_('Provider'), + linkify=True + ) + circuit = tables.Column( + verbose_name=_('Circuit'), + linkify=True + ) + priority = tables.Column( + verbose_name=_('Priority'), + ) + tags = columns.TagColumn( + url_name='circuits:circuitgroupassignment_list' + ) + + class Meta(NetBoxTable.Meta): + model = CircuitGroupAssignment + fields = ( + 'pk', 'id', 'group', 'provider', 'circuit', 'priority', 'created', 'last_updated', 'actions', 'tags', + ) + default_columns = ('pk', 'group', 'provider', 'circuit', 'priority') diff --git a/netbox/circuits/tests/test_api.py b/netbox/circuits/tests/test_api.py index 0fc530447b..1edcd531ba 100644 --- a/netbox/circuits/tests/test_api.py +++ b/netbox/circuits/tests/test_api.py @@ -92,7 +92,7 @@ def setUpTestData(cls): class CircuitTest(APIViewTestCases.APIViewTestCase): model = Circuit - brief_fields = ['cid', 'description', 'display', 'id', 'url'] + brief_fields = ['cid', 'description', 'display', 'id', 'provider', 'url'] bulk_update_data = { 'status': 'planned', } @@ -208,10 +208,42 @@ def setUpTestData(cls): } +class CircuitGroupTest(APIViewTestCases.APIViewTestCase): + model = CircuitGroup + brief_fields = ['display', 'id', 'name', 'url'] + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + circuit_groups = ( + CircuitGroup(name="Circuit Group 1", slug='circuit-group-1'), + CircuitGroup(name="Circuit Group 2", slug='circuit-group-2'), + CircuitGroup(name="Circuit Group 3", slug='circuit-group-3'), + ) + CircuitGroup.objects.bulk_create(circuit_groups) + + cls.create_data = [ + { + 'name': 'Circuit Group 4', + 'slug': 'circuit-group-4', + }, + { + 'name': 'Circuit Group 5', + 'slug': 'circuit-group-5', + }, + { + 'name': 'Circuit Group 6', + 'slug': 'circuit-group-6', + }, + ] + + class ProviderAccountTest(APIViewTestCases.APIViewTestCase): model = ProviderAccount brief_fields = ['account', 'description', 'display', 'id', 'name', 'url'] - user_permissions = ('circuits.view_provider', ) + user_permissions = ('circuits.view_provider',) @classmethod def setUpTestData(cls): @@ -252,6 +284,78 @@ def setUpTestData(cls): } +class CircuitGroupAssignmentTest(APIViewTestCases.APIViewTestCase): + model = CircuitGroupAssignment + brief_fields = ['circuit', 'display', 'group', 'id', 'priority', 'url'] + bulk_update_data = { + 'priority': CircuitPriorityChoices.PRIORITY_INACTIVE, + } + user_permissions = ('circuits.view_circuit', 'circuits.view_circuitgroup') + + @classmethod + def setUpTestData(cls): + + circuit_groups = ( + CircuitGroup(name='Circuit Group 1', slug='circuit-group-1'), + CircuitGroup(name='Circuit Group 2', slug='circuit-group-2'), + CircuitGroup(name='Circuit Group 3', slug='circuit-group-3'), + CircuitGroup(name='Circuit Group 4', slug='circuit-group-4'), + CircuitGroup(name='Circuit Group 5', slug='circuit-group-5'), + CircuitGroup(name='Circuit Group 6', slug='circuit-group-6'), + ) + CircuitGroup.objects.bulk_create(circuit_groups) + + provider = Provider.objects.create(name='Provider 1', slug='provider-1') + circuittype = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1') + + circuits = ( + Circuit(cid='Circuit 1', provider=provider, type=circuittype), + Circuit(cid='Circuit 2', provider=provider, type=circuittype), + Circuit(cid='Circuit 3', provider=provider, type=circuittype), + Circuit(cid='Circuit 4', provider=provider, type=circuittype), + Circuit(cid='Circuit 5', provider=provider, type=circuittype), + Circuit(cid='Circuit 6', provider=provider, type=circuittype), + ) + Circuit.objects.bulk_create(circuits) + + assignments = ( + CircuitGroupAssignment( + group=circuit_groups[0], + circuit=circuits[0], + priority=CircuitPriorityChoices.PRIORITY_PRIMARY + ), + CircuitGroupAssignment( + group=circuit_groups[1], + circuit=circuits[1], + priority=CircuitPriorityChoices.PRIORITY_SECONDARY + ), + CircuitGroupAssignment( + group=circuit_groups[2], + circuit=circuits[2], + priority=CircuitPriorityChoices.PRIORITY_TERTIARY + ), + ) + CircuitGroupAssignment.objects.bulk_create(assignments) + + cls.create_data = [ + { + 'group': circuit_groups[3].pk, + 'circuit': circuits[3].pk, + 'priority': CircuitPriorityChoices.PRIORITY_PRIMARY, + }, + { + 'group': circuit_groups[4].pk, + 'circuit': circuits[4].pk, + 'priority': CircuitPriorityChoices.PRIORITY_SECONDARY, + }, + { + 'group': circuit_groups[5].pk, + 'circuit': circuits[5].pk, + 'priority': CircuitPriorityChoices.PRIORITY_TERTIARY, + }, + ] + + class ProviderNetworkTest(APIViewTestCases.APIViewTestCase): model = ProviderNetwork brief_fields = ['description', 'display', 'id', 'name', 'url'] diff --git a/netbox/circuits/tests/test_filtersets.py b/netbox/circuits/tests/test_filtersets.py index df10c3929e..bb350f0d12 100644 --- a/netbox/circuits/tests/test_filtersets.py +++ b/netbox/circuits/tests/test_filtersets.py @@ -451,6 +451,136 @@ def test_occupied(self): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 7) +class CircuitGroupTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = CircuitGroup.objects.all() + filterset = CircuitGroupFilterSet + + @classmethod + def setUpTestData(cls): + tenant_groups = ( + TenantGroup(name='Tenant group 1', slug='tenant-group-1'), + TenantGroup(name='Tenant group 2', slug='tenant-group-2'), + TenantGroup(name='Tenant group 3', slug='tenant-group-3'), + ) + for tenantgroup in tenant_groups: + tenantgroup.save() + + tenants = ( + Tenant(name='Tenant 1', slug='tenant-1', group=tenant_groups[0]), + Tenant(name='Tenant 2', slug='tenant-2', group=tenant_groups[1]), + Tenant(name='Tenant 3', slug='tenant-3', group=tenant_groups[2]), + ) + Tenant.objects.bulk_create(tenants) + + CircuitGroup.objects.bulk_create(( + CircuitGroup(name='Circuit Group 1', slug='circuit-group-1', description='foobar1', tenant=tenants[0]), + CircuitGroup(name='Circuit Group 2', slug='circuit-group-2', description='foobar2', tenant=tenants[1]), + CircuitGroup(name='Circuit Group 3', slug='circuit-group-3', tenant=tenants[1]), + )) + + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_name(self): + params = {'name': ['Circuit Group 1']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_slug(self): + params = {'slug': ['circuit-group-1']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_tenant(self): + tenants = Tenant.objects.all()[:2] + params = {'tenant_id': [tenants[0].pk, tenants[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + params = {'tenant': [tenants[0].slug, tenants[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + + def test_tenant_group(self): + tenant_groups = TenantGroup.objects.all()[:2] + params = {'tenant_group_id': [tenant_groups[0].pk, tenant_groups[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + params = {'tenant_group': [tenant_groups[0].slug, tenant_groups[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + + +class CircuitGroupAssignmentTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = CircuitGroupAssignment.objects.all() + filterset = CircuitGroupAssignmentFilterSet + + @classmethod + def setUpTestData(cls): + + circuit_groups = ( + CircuitGroup(name='Circuit Group 1', slug='circuit-group-1'), + CircuitGroup(name='Circuit Group 2', slug='circuit-group-2'), + CircuitGroup(name='Circuit Group 3', slug='circuit-group-3'), + CircuitGroup(name='Circuit Group 4', slug='circuit-group-4'), + ) + CircuitGroup.objects.bulk_create(circuit_groups) + + providers = Provider.objects.bulk_create(( + Provider(name='Provider 1', slug='provider-1'), + Provider(name='Provider 2', slug='provider-2'), + Provider(name='Provider 3', slug='provider-3'), + Provider(name='Provider 4', slug='provider-4'), + )) + circuittype = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1') + + circuits = ( + Circuit(cid='Circuit 1', provider=providers[0], type=circuittype), + Circuit(cid='Circuit 2', provider=providers[1], type=circuittype), + Circuit(cid='Circuit 3', provider=providers[2], type=circuittype), + Circuit(cid='Circuit 4', provider=providers[3], type=circuittype), + ) + Circuit.objects.bulk_create(circuits) + + assignments = ( + CircuitGroupAssignment( + group=circuit_groups[0], + circuit=circuits[0], + priority=CircuitPriorityChoices.PRIORITY_PRIMARY + ), + CircuitGroupAssignment( + group=circuit_groups[1], + circuit=circuits[1], + priority=CircuitPriorityChoices.PRIORITY_SECONDARY + ), + CircuitGroupAssignment( + group=circuit_groups[2], + circuit=circuits[2], + priority=CircuitPriorityChoices.PRIORITY_TERTIARY + ), + ) + CircuitGroupAssignment.objects.bulk_create(assignments) + + def test_group_id(self): + groups = CircuitGroup.objects.filter(name__in=['Circuit Group 1', 'Circuit Group 2']) + params = {'group_id': [groups[0].pk, groups[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'group': [groups[0].slug, groups[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_circuit(self): + circuits = Circuit.objects.all()[:2] + params = {'circuit_id': [circuits[0].pk, circuits[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'circuit': [circuits[0].cid, circuits[1].cid]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_provider(self): + providers = Provider.objects.all()[:2] + params = {'provider_id': [providers[0].pk, providers[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'provider': [providers[0].slug, providers[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + class ProviderNetworkTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = ProviderNetwork.objects.all() filterset = ProviderNetworkFilterSet diff --git a/netbox/circuits/tests/test_views.py b/netbox/circuits/tests/test_views.py index 577548703b..87e6d99b72 100644 --- a/netbox/circuits/tests/test_views.py +++ b/netbox/circuits/tests/test_views.py @@ -404,3 +404,109 @@ def test_trace(self): response = self.client.get(reverse('circuits:circuittermination_trace', kwargs={'pk': circuittermination.pk})) self.assertHttpStatus(response, 200) + + +class CircuitGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase): + model = CircuitGroup + + @classmethod + def setUpTestData(cls): + + circuit_groups = ( + CircuitGroup(name='Circuit Group 1', slug='circuit-group-1'), + CircuitGroup(name='Circuit Group 2', slug='circuit-group-2'), + CircuitGroup(name='Circuit Group 3', slug='circuit-group-3'), + ) + CircuitGroup.objects.bulk_create(circuit_groups) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'Circuit Group X', + 'slug': 'circuit-group-x', + 'description': 'A new Circuit Group', + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "name,slug", + "Circuit Group 4,circuit-group-4", + "Circuit Group 5,circuit-group-5", + "Circuit Group 6,circuit-group-6", + ) + + cls.csv_update_data = ( + "id,name,description", + f"{circuit_groups[0].pk},Circuit Group 7,New description7", + f"{circuit_groups[1].pk},Circuit Group 8,New description8", + f"{circuit_groups[2].pk},Circuit Group 9,New description9", + ) + + cls.bulk_edit_data = { + 'description': 'Foo', + } + + +class CircuitGroupAssignmentTestCase( + ViewTestCases.CreateObjectViewTestCase, + ViewTestCases.EditObjectViewTestCase, + ViewTestCases.DeleteObjectViewTestCase, + ViewTestCases.ListObjectsViewTestCase, + ViewTestCases.BulkEditObjectsViewTestCase, + ViewTestCases.BulkDeleteObjectsViewTestCase +): + model = CircuitGroupAssignment + + @classmethod + def setUpTestData(cls): + + circuit_groups = ( + CircuitGroup(name='Circuit Group 1', slug='circuit-group-1'), + CircuitGroup(name='Circuit Group 2', slug='circuit-group-2'), + CircuitGroup(name='Circuit Group 3', slug='circuit-group-3'), + CircuitGroup(name='Circuit Group 4', slug='circuit-group-4'), + ) + CircuitGroup.objects.bulk_create(circuit_groups) + + provider = Provider.objects.create(name='Provider 1', slug='provider-1') + circuittype = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1') + + circuits = ( + Circuit(cid='Circuit 1', provider=provider, type=circuittype), + Circuit(cid='Circuit 2', provider=provider, type=circuittype), + Circuit(cid='Circuit 3', provider=provider, type=circuittype), + Circuit(cid='Circuit 4', provider=provider, type=circuittype), + ) + Circuit.objects.bulk_create(circuits) + + assignments = ( + CircuitGroupAssignment( + group=circuit_groups[0], + circuit=circuits[0], + priority=CircuitPriorityChoices.PRIORITY_PRIMARY + ), + CircuitGroupAssignment( + group=circuit_groups[1], + circuit=circuits[1], + priority=CircuitPriorityChoices.PRIORITY_SECONDARY + ), + CircuitGroupAssignment( + group=circuit_groups[2], + circuit=circuits[2], + priority=CircuitPriorityChoices.PRIORITY_TERTIARY + ), + ) + CircuitGroupAssignment.objects.bulk_create(assignments) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'group': circuit_groups[3].pk, + 'circuit': circuits[3].pk, + 'priority': CircuitPriorityChoices.PRIORITY_INACTIVE, + 'tags': [t.pk for t in tags], + } + + cls.bulk_edit_data = { + 'priority': CircuitPriorityChoices.PRIORITY_INACTIVE, + } diff --git a/netbox/circuits/urls.py b/netbox/circuits/urls.py index 5c0ab99ee7..2171d49bea 100644 --- a/netbox/circuits/urls.py +++ b/netbox/circuits/urls.py @@ -55,4 +55,19 @@ path('circuit-terminations/delete/', views.CircuitTerminationBulkDeleteView.as_view(), name='circuittermination_bulk_delete'), path('circuit-terminations//', include(get_model_urls('circuits', 'circuittermination'))), + # Circuit Groups + path('circuit-groups/', views.CircuitGroupListView.as_view(), name='circuitgroup_list'), + path('circuit-groups/add/', views.CircuitGroupEditView.as_view(), name='circuitgroup_add'), + path('circuit-groups/import/', views.CircuitGroupBulkImportView.as_view(), name='circuitgroup_import'), + path('circuit-groups/edit/', views.CircuitGroupBulkEditView.as_view(), name='circuitgroup_bulk_edit'), + path('circuit-groups/delete/', views.CircuitGroupBulkDeleteView.as_view(), name='circuitgroup_bulk_delete'), + path('circuit-groups//', include(get_model_urls('circuits', 'circuitgroup'))), + + # Circuit Group Assignments + path('circuit-group-assignments/', views.CircuitGroupAssignmentListView.as_view(), name='circuitgroupassignment_list'), + path('circuit-group-assignments/add/', views.CircuitGroupAssignmentEditView.as_view(), name='circuitgroupassignment_add'), + path('circuit-group-assignments/import/', views.CircuitGroupAssignmentBulkImportView.as_view(), name='circuitgroupassignment_import'), + path('circuit-group-assignments/edit/', views.CircuitGroupAssignmentBulkEditView.as_view(), name='circuitgroupassignment_bulk_edit'), + path('circuit-group-assignments/delete/', views.CircuitGroupAssignmentBulkDeleteView.as_view(), name='circuitgroupassignment_bulk_delete'), + path('circuit-group-assignments//', include(get_model_urls('circuits', 'circuitgroupassignment'))), ] diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 0182e1a939..8218960c9d 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -443,3 +443,100 @@ class CircuitTerminationBulkDeleteView(generic.BulkDeleteView): # Trace view register_model_view(CircuitTermination, 'trace', kwargs={'model': CircuitTermination})(PathTraceView) + + +# +# Circuit Groups +# + +class CircuitGroupListView(generic.ObjectListView): + queryset = CircuitGroup.objects.annotate( + circuit_group_assignment_count=count_related(CircuitGroupAssignment, 'group') + ) + filterset = filtersets.CircuitGroupFilterSet + filterset_form = forms.CircuitGroupFilterForm + table = tables.CircuitGroupTable + + +@register_model_view(CircuitGroup) +class CircuitGroupView(GetRelatedModelsMixin, generic.ObjectView): + queryset = CircuitGroup.objects.all() + + def get_extra_context(self, request, instance): + return { + 'related_models': self.get_related_models(request, instance), + } + + +@register_model_view(CircuitGroup, 'edit') +class CircuitGroupEditView(generic.ObjectEditView): + queryset = CircuitGroup.objects.all() + form = forms.CircuitGroupForm + + +@register_model_view(CircuitGroup, 'delete') +class CircuitGroupDeleteView(generic.ObjectDeleteView): + queryset = CircuitGroup.objects.all() + + +class CircuitGroupBulkImportView(generic.BulkImportView): + queryset = CircuitGroup.objects.all() + model_form = forms.CircuitGroupImportForm + + +class CircuitGroupBulkEditView(generic.BulkEditView): + queryset = CircuitGroup.objects.all() + filterset = filtersets.CircuitGroupFilterSet + table = tables.CircuitGroupTable + form = forms.CircuitGroupBulkEditForm + + +class CircuitGroupBulkDeleteView(generic.BulkDeleteView): + queryset = CircuitGroup.objects.all() + filterset = filtersets.CircuitGroupFilterSet + table = tables.CircuitGroupTable + + +# +# Circuit Groups +# + +class CircuitGroupAssignmentListView(generic.ObjectListView): + queryset = CircuitGroupAssignment.objects.all() + filterset = filtersets.CircuitGroupAssignmentFilterSet + filterset_form = forms.CircuitGroupAssignmentFilterForm + table = tables.CircuitGroupAssignmentTable + + +@register_model_view(CircuitGroupAssignment) +class CircuitGroupAssignmentView(generic.ObjectView): + queryset = CircuitGroupAssignment.objects.all() + + +@register_model_view(CircuitGroupAssignment, 'edit') +class CircuitGroupAssignmentEditView(generic.ObjectEditView): + queryset = CircuitGroupAssignment.objects.all() + form = forms.CircuitGroupAssignmentForm + + +@register_model_view(CircuitGroupAssignment, 'delete') +class CircuitGroupAssignmentDeleteView(generic.ObjectDeleteView): + queryset = CircuitGroupAssignment.objects.all() + + +class CircuitGroupAssignmentBulkImportView(generic.BulkImportView): + queryset = CircuitGroupAssignment.objects.all() + model_form = forms.CircuitGroupAssignmentImportForm + + +class CircuitGroupAssignmentBulkEditView(generic.BulkEditView): + queryset = CircuitGroupAssignment.objects.all() + filterset = filtersets.CircuitGroupAssignmentFilterSet + table = tables.CircuitGroupAssignmentTable + form = forms.CircuitGroupAssignmentBulkEditForm + + +class CircuitGroupAssignmentBulkDeleteView(generic.BulkDeleteView): + queryset = CircuitGroupAssignment.objects.all() + filterset = filtersets.CircuitGroupAssignmentFilterSet + table = tables.CircuitGroupAssignmentTable diff --git a/netbox/core/api/nested_serializers.py b/netbox/core/api/nested_serializers.py index efb748ee04..3b40853cf2 100644 --- a/netbox/core/api/nested_serializers.py +++ b/netbox/core/api/nested_serializers.py @@ -1,3 +1,5 @@ +import warnings + from rest_framework import serializers from core.choices import JobStatusChoices @@ -12,25 +14,28 @@ 'NestedJobSerializer', ) +# TODO: Remove in v4.2 +warnings.warn( + f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.", + DeprecationWarning +) + class NestedDataSourceSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='core-api:datasource-detail') class Meta: model = DataSource - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedDataFileSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='core-api:datafile-detail') class Meta: model = DataFile - fields = ['id', 'url', 'display', 'path'] + fields = ['id', 'url', 'display_url', 'display', 'path'] class NestedJobSerializer(serializers.ModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='core-api:job-detail') status = ChoiceField(choices=JobStatusChoices) user = UserSerializer( nested=True, @@ -39,4 +44,4 @@ class NestedJobSerializer(serializers.ModelSerializer): class Meta: model = Job - fields = ['url', 'created', 'completed', 'user', 'status'] + fields = ['url', 'display_url', 'created', 'completed', 'user', 'status'] diff --git a/netbox/core/api/serializers.py b/netbox/core/api/serializers.py index 8553bb91c4..2dde6be9f9 100644 --- a/netbox/core/api/serializers.py +++ b/netbox/core/api/serializers.py @@ -1,3 +1,3 @@ +from .serializers_.change_logging import * from .serializers_.data import * from .serializers_.jobs import * -from .nested_serializers import * diff --git a/netbox/extras/api/serializers_/change_logging.py b/netbox/core/api/serializers_/change_logging.py similarity index 82% rename from netbox/extras/api/serializers_/change_logging.py rename to netbox/core/api/serializers_/change_logging.py index 46fb901fff..e8af31ae87 100644 --- a/netbox/extras/api/serializers_/change_logging.py +++ b/netbox/core/api/serializers_/change_logging.py @@ -1,8 +1,8 @@ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers -from extras.choices import * -from extras.models import ObjectChange +from core.choices import * +from core.models import ObjectChange from netbox.api.exceptions import SerializerNotFound from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.serializers import BaseModelSerializer @@ -15,7 +15,6 @@ class ObjectChangeSerializer(BaseModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:objectchange-detail') user = UserSerializer( nested=True, read_only=True @@ -44,8 +43,8 @@ class ObjectChangeSerializer(BaseModelSerializer): class Meta: model = ObjectChange fields = [ - 'id', 'url', 'display', 'time', 'user', 'user_name', 'request_id', 'action', 'changed_object_type', - 'changed_object_id', 'changed_object', 'prechange_data', 'postchange_data', + 'id', 'url', 'display_url', 'display', 'time', 'user', 'user_name', 'request_id', 'action', + 'changed_object_type', 'changed_object_id', 'changed_object', 'prechange_data', 'postchange_data', ] @extend_schema_field(serializers.JSONField(allow_null=True)) diff --git a/netbox/core/api/serializers_/data.py b/netbox/core/api/serializers_/data.py index e60d8d95ba..2c155ba6bc 100644 --- a/netbox/core/api/serializers_/data.py +++ b/netbox/core/api/serializers_/data.py @@ -1,5 +1,3 @@ -from rest_framework import serializers - from core.choices import * from core.models import DataFile, DataSource from netbox.api.fields import ChoiceField, RelatedObjectCountField @@ -13,9 +11,6 @@ class DataSourceSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='core-api:datasource-detail' - ) type = ChoiceField( choices=get_data_backend_choices() ) @@ -30,16 +25,14 @@ class DataSourceSerializer(NetBoxModelSerializer): class Meta: model = DataSource fields = [ - 'id', 'url', 'display', 'name', 'type', 'source_url', 'enabled', 'status', 'description', 'comments', - 'parameters', 'ignore_rules', 'custom_fields', 'created', 'last_updated', 'file_count', + 'id', 'url', 'display_url', 'display', 'name', 'type', 'source_url', 'enabled', 'status', 'description', + 'parameters', 'ignore_rules', 'comments', 'custom_fields', 'created', 'last_updated', 'last_synced', + 'file_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class DataFileSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField( - view_name='core-api:datafile-detail' - ) source = DataSourceSerializer( nested=True, read_only=True @@ -48,6 +41,6 @@ class DataFileSerializer(NetBoxModelSerializer): class Meta: model = DataFile fields = [ - 'id', 'url', 'display', 'source', 'path', 'last_updated', 'size', 'hash', + 'id', 'url', 'display_url', 'display', 'source', 'path', 'last_updated', 'size', 'hash', ] brief_fields = ('id', 'url', 'display', 'path') diff --git a/netbox/core/api/serializers_/jobs.py b/netbox/core/api/serializers_/jobs.py index 84afa3627e..e5e07aa414 100644 --- a/netbox/core/api/serializers_/jobs.py +++ b/netbox/core/api/serializers_/jobs.py @@ -12,7 +12,6 @@ class JobSerializer(BaseModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='core-api:job-detail') user = UserSerializer( nested=True, read_only=True @@ -25,7 +24,7 @@ class JobSerializer(BaseModelSerializer): class Meta: model = Job fields = [ - 'id', 'url', 'display', 'object_type', 'object_id', 'name', 'status', 'created', 'scheduled', 'interval', + 'id', 'url', 'display_url', 'display', 'object_type', 'object_id', 'name', 'status', 'created', 'scheduled', 'interval', 'started', 'completed', 'user', 'data', 'error', 'job_id', ] brief_fields = ('url', 'created', 'completed', 'user', 'status') diff --git a/netbox/core/api/urls.py b/netbox/core/api/urls.py index 7017c3739b..95ee1896ec 100644 --- a/netbox/core/api/urls.py +++ b/netbox/core/api/urls.py @@ -5,12 +5,10 @@ router = NetBoxRouter() router.APIRootView = views.CoreRootView -# Data sources router.register('data-sources', views.DataSourceViewSet) router.register('data-files', views.DataFileViewSet) - -# Jobs router.register('jobs', views.JobViewSet) +router.register('object-changes', views.ObjectChangeViewSet) app_name = 'core-api' urlpatterns = router.urls diff --git a/netbox/core/api/views.py b/netbox/core/api/views.py index 6338523d24..b3a024c026 100644 --- a/netbox/core/api/views.py +++ b/netbox/core/api/views.py @@ -7,7 +7,10 @@ from rest_framework.viewsets import ReadOnlyModelViewSet from core import filtersets +from core.choices import DataSourceStatusChoices +from core.jobs import SyncDataSourceJob from core.models import * +from netbox.api.metadata import ContentTypeMetadata from netbox.api.viewsets import NetBoxModelViewSet, NetBoxReadOnlyModelViewSet from . import serializers @@ -35,7 +38,11 @@ def sync(self, request, pk): if not request.user.has_perm('core.sync_datasource', obj=datasource): raise PermissionDenied(_("This user does not have permission to synchronize this data source.")) - datasource.enqueue_sync_job(request) + # Enqueue the sync job & update the DataSource's status + SyncDataSourceJob.enqueue(instance=datasource, user=request.user) + datasource.status = DataSourceStatusChoices.QUEUED + DataSource.objects.filter(pk=datasource.pk).update(status=datasource.status) + serializer = serializers.DataSourceSerializer(datasource, context={'request': request}) return Response(serializer.data) @@ -54,3 +61,13 @@ class JobViewSet(ReadOnlyModelViewSet): queryset = Job.objects.all() serializer_class = serializers.JobSerializer filterset_class = filtersets.JobFilterSet + + +class ObjectChangeViewSet(ReadOnlyModelViewSet): + """ + Retrieve a list of recent changes. + """ + metadata_class = ContentTypeMetadata + queryset = ObjectChange.objects.valid_models() + serializer_class = serializers.ObjectChangeSerializer + filterset_class = filtersets.ObjectChangeFilterSet diff --git a/netbox/core/apps.py b/netbox/core/apps.py index b1103469c1..855ac3170f 100644 --- a/netbox/core/apps.py +++ b/netbox/core/apps.py @@ -18,7 +18,7 @@ class CoreConfig(AppConfig): def ready(self): from core.api import schema # noqa from netbox.models.features import register_models - from . import data_backends, search + from . import data_backends, events, search # Register models register_models(*self.get_models()) diff --git a/netbox/core/choices.py b/netbox/core/choices.py index 8d70504145..01a072ce1c 100644 --- a/netbox/core/choices.py +++ b/netbox/core/choices.py @@ -59,8 +59,31 @@ class JobStatusChoices(ChoiceSet): (STATUS_FAILED, _('Failed'), 'red'), ) + ENQUEUED_STATE_CHOICES = ( + STATUS_PENDING, + STATUS_SCHEDULED, + STATUS_RUNNING, + ) + TERMINAL_STATE_CHOICES = ( STATUS_COMPLETED, STATUS_ERRORED, STATUS_FAILED, ) + + +# +# ObjectChanges +# + +class ObjectChangeActionChoices(ChoiceSet): + + ACTION_CREATE = 'create' + ACTION_UPDATE = 'update' + ACTION_DELETE = 'delete' + + CHOICES = ( + (ACTION_CREATE, _('Created'), 'green'), + (ACTION_UPDATE, _('Updated'), 'blue'), + (ACTION_DELETE, _('Deleted'), 'red'), + ) diff --git a/netbox/core/events.py b/netbox/core/events.py new file mode 100644 index 0000000000..384b61fd48 --- /dev/null +++ b/netbox/core/events.py @@ -0,0 +1,33 @@ +from django.utils.translation import gettext as _ + +from netbox.events import EventType, EVENT_TYPE_KIND_DANGER, EVENT_TYPE_KIND_SUCCESS, EVENT_TYPE_KIND_WARNING + +__all__ = ( + 'JOB_COMPLETED', + 'JOB_ERRORED', + 'JOB_FAILED', + 'JOB_STARTED', + 'OBJECT_CREATED', + 'OBJECT_DELETED', + 'OBJECT_UPDATED', +) + +# Object events +OBJECT_CREATED = 'object_created' +OBJECT_UPDATED = 'object_updated' +OBJECT_DELETED = 'object_deleted' + +# Job events +JOB_STARTED = 'job_started' +JOB_COMPLETED = 'job_completed' +JOB_FAILED = 'job_failed' +JOB_ERRORED = 'job_errored' + +# Register core events +EventType(OBJECT_CREATED, _('Object created')).register() +EventType(OBJECT_UPDATED, _('Object updated')).register() +EventType(OBJECT_DELETED, _('Object deleted'), destructive=True).register() +EventType(JOB_STARTED, _('Job started')).register() +EventType(JOB_COMPLETED, _('Job completed'), kind=EVENT_TYPE_KIND_SUCCESS).register() +EventType(JOB_FAILED, _('Job failed'), kind=EVENT_TYPE_KIND_WARNING).register() +EventType(JOB_ERRORED, _('Job errored'), kind=EVENT_TYPE_KIND_DANGER).register() diff --git a/netbox/core/filtersets.py b/netbox/core/filtersets.py index c5d332b68b..21fdaa4abe 100644 --- a/netbox/core/filtersets.py +++ b/netbox/core/filtersets.py @@ -1,3 +1,4 @@ +from django.contrib.contenttypes.models import ContentType from django.db.models import Q from django.utils.translation import gettext as _ @@ -5,6 +6,8 @@ from netbox.filtersets import BaseFilterSet, ChangeLoggedModelFilterSet, NetBoxModelFilterSet from netbox.utils import get_data_backend_choices +from users.models import User +from utilities.filters import ContentTypeFilter from .choices import * from .models import * @@ -13,6 +16,7 @@ 'DataFileFilterSet', 'DataSourceFilterSet', 'JobFilterSet', + 'ObjectChangeFilterSet', ) @@ -126,6 +130,43 @@ def search(self, queryset, name, value): ) +class ObjectChangeFilterSet(BaseFilterSet): + q = django_filters.CharFilter( + method='search', + label=_('Search'), + ) + time = django_filters.DateTimeFromToRangeFilter() + changed_object_type = ContentTypeFilter() + changed_object_type_id = django_filters.ModelMultipleChoiceFilter( + queryset=ContentType.objects.all() + ) + user_id = django_filters.ModelMultipleChoiceFilter( + queryset=User.objects.all(), + label=_('User (ID)'), + ) + user = django_filters.ModelMultipleChoiceFilter( + field_name='user__username', + queryset=User.objects.all(), + to_field_name='username', + label=_('User name'), + ) + + class Meta: + model = ObjectChange + fields = ( + 'id', 'user', 'user_name', 'request_id', 'action', 'changed_object_type_id', 'changed_object_id', + 'related_object_type', 'related_object_id', 'object_repr', + ) + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(user_name__icontains=value) | + Q(object_repr__icontains=value) + ) + + class ConfigRevisionFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', diff --git a/netbox/core/forms/filtersets.py b/netbox/core/forms/filtersets.py index 60a3acc44d..ab4b869b73 100644 --- a/netbox/core/forms/filtersets.py +++ b/netbox/core/forms/filtersets.py @@ -1,5 +1,4 @@ from django import forms -from django.contrib.auth import get_user_model from django.utils.translation import gettext_lazy as _ from core.choices import * @@ -7,8 +6,11 @@ from netbox.forms import NetBoxModelFilterSetForm from netbox.forms.mixins import SavedFiltersMixin from netbox.utils import get_data_backend_choices -from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm -from utilities.forms.fields import ContentTypeChoiceField, DynamicModelMultipleChoiceField +from users.models import User +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice +from utilities.forms.fields import ( + ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, +) from utilities.forms.rendering import FieldSet from utilities.forms.widgets import DateTimePicker @@ -17,6 +19,7 @@ 'DataFileFilterForm', 'DataSourceFilterForm', 'JobFilterForm', + 'ObjectChangeFilterForm', ) @@ -118,10 +121,44 @@ class JobFilterForm(SavedFiltersMixin, FilterForm): widget=DateTimePicker() ) user = DynamicModelMultipleChoiceField( - queryset=get_user_model().objects.all(), + queryset=User.objects.all(), + required=False, + label=_('User') + ) + + +class ObjectChangeFilterForm(SavedFiltersMixin, FilterForm): + model = ObjectChange + fieldsets = ( + FieldSet('q', 'filter_id'), + FieldSet('time_before', 'time_after', name=_('Time')), + FieldSet('action', 'user_id', 'changed_object_type_id', name=_('Attributes')), + ) + time_after = forms.DateTimeField( + required=False, + label=_('After'), + widget=DateTimePicker() + ) + time_before = forms.DateTimeField( + required=False, + label=_('Before'), + widget=DateTimePicker() + ) + action = forms.ChoiceField( + label=_('Action'), + choices=add_blank_choice(ObjectChangeActionChoices), + required=False + ) + user_id = DynamicModelMultipleChoiceField( + queryset=User.objects.all(), required=False, label=_('User') ) + changed_object_type_id = ContentTypeMultipleChoiceField( + queryset=ObjectType.objects.with_feature('change_logging'), + required=False, + label=_('Object Type'), + ) class ConfigRevisionFilterForm(SavedFiltersMixin, FilterForm): diff --git a/netbox/core/graphql/filters.py b/netbox/core/graphql/filters.py index 64b4d0de28..82da685a59 100644 --- a/netbox/core/graphql/filters.py +++ b/netbox/core/graphql/filters.py @@ -6,6 +6,7 @@ __all__ = ( 'DataFileFilter', 'DataSourceFilter', + 'ObjectChangeFilter', ) @@ -19,3 +20,9 @@ class DataFileFilter(BaseFilterMixin): @autotype_decorator(filtersets.DataSourceFilterSet) class DataSourceFilter(BaseFilterMixin): pass + + +@strawberry_django.filter(models.ObjectChange, lookups=True) +@autotype_decorator(filtersets.ObjectChangeFilterSet) +class ObjectChangeFilter(BaseFilterMixin): + pass diff --git a/netbox/core/graphql/mixins.py b/netbox/core/graphql/mixins.py new file mode 100644 index 0000000000..43f8761d18 --- /dev/null +++ b/netbox/core/graphql/mixins.py @@ -0,0 +1,24 @@ +from typing import Annotated, List + +import strawberry +import strawberry_django +from django.contrib.contenttypes.models import ContentType + +from core.models import ObjectChange + +__all__ = ( + 'ChangelogMixin', +) + + +@strawberry.type +class ChangelogMixin: + + @strawberry_django.field + def changelog(self, info) -> List[Annotated["ObjectChangeType", strawberry.lazy('.types')]]: + content_type = ContentType.objects.get_for_model(self) + object_changes = ObjectChange.objects.filter( + changed_object_type=content_type, + changed_object_id=self.pk + ) + return object_changes.restrict(info.context.request.user, 'view') diff --git a/netbox/core/graphql/types.py b/netbox/core/graphql/types.py index 8287bfa317..09385d7c12 100644 --- a/netbox/core/graphql/types.py +++ b/netbox/core/graphql/types.py @@ -10,6 +10,7 @@ __all__ = ( 'DataFileType', 'DataSourceType', + 'ObjectChangeType', ) @@ -30,3 +31,12 @@ class DataFileType(BaseObjectType): class DataSourceType(NetBoxObjectType): datafiles: List[Annotated["DataFileType", strawberry.lazy('core.graphql.types')]] + + +@strawberry_django.type( + models.ObjectChange, + fields='__all__', + filters=ObjectChangeFilter +) +class ObjectChangeType(BaseObjectType): + pass diff --git a/netbox/core/jobs.py b/netbox/core/jobs.py index 264313e620..d2b8463987 100644 --- a/netbox/core/jobs.py +++ b/netbox/core/jobs.py @@ -1,33 +1,33 @@ import logging +from netbox.jobs import JobRunner from netbox.search.backends import search_backend -from .choices import * +from .choices import DataSourceStatusChoices from .exceptions import SyncError from .models import DataSource -from rq.timeouts import JobTimeoutException logger = logging.getLogger(__name__) -def sync_datasource(job, *args, **kwargs): +class SyncDataSourceJob(JobRunner): """ Call sync() on a DataSource. """ - datasource = DataSource.objects.get(pk=job.object_id) - try: - job.start() - datasource.sync() + class Meta: + name = 'Synchronization' - # Update the search cache for DataFiles belonging to this source - search_backend.cache(datasource.datafiles.iterator()) + def run(self, *args, **kwargs): + datasource = DataSource.objects.get(pk=self.job.object_id) - job.terminate() + try: + datasource.sync() - except Exception as e: - job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=repr(e)) - DataSource.objects.filter(pk=datasource.pk).update(status=DataSourceStatusChoices.FAILED) - if type(e) in (SyncError, JobTimeoutException): - logging.error(e) - else: + # Update the search cache for DataFiles belonging to this source + search_backend.cache(datasource.datafiles.iterator()) + + except Exception as e: + DataSource.objects.filter(pk=datasource.pk).update(status=DataSourceStatusChoices.FAILED) + if type(e) is SyncError: + logging.error(e) raise e diff --git a/netbox/core/management/commands/nbshell.py b/netbox/core/management/commands/nbshell.py index b96870252e..e26f956c89 100644 --- a/netbox/core/management/commands/nbshell.py +++ b/netbox/core/management/commands/nbshell.py @@ -5,10 +5,10 @@ from django import get_version from django.apps import apps from django.conf import settings -from django.contrib.auth import get_user_model from django.core.management.base import BaseCommand from core.models import ObjectType +from users.models import User APPS = ('circuits', 'core', 'dcim', 'extras', 'ipam', 'tenancy', 'users', 'virtualization', 'vpn', 'wireless') @@ -18,7 +18,7 @@ node=platform.node(), python=platform.python_version(), django=get_version(), - netbox=settings.VERSION + netbox=settings.RELEASE.name ) @@ -61,7 +61,7 @@ def get_namespace(self): # Additional objects to include namespace['ObjectType'] = ObjectType - namespace['User'] = get_user_model() + namespace['User'] = User # Load convenience commands namespace.update({ diff --git a/netbox/core/migrations/0011_move_objectchange.py b/netbox/core/migrations/0011_move_objectchange.py new file mode 100644 index 0000000000..2b41133ecc --- /dev/null +++ b/netbox/core/migrations/0011_move_objectchange.py @@ -0,0 +1,45 @@ +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('core', '0010_gfk_indexes'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.SeparateDatabaseAndState( + state_operations=[ + migrations.CreateModel( + name='ObjectChange', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('time', models.DateTimeField(auto_now_add=True, db_index=True)), + ('user_name', models.CharField(editable=False, max_length=150)), + ('request_id', models.UUIDField(db_index=True, editable=False)), + ('action', models.CharField(max_length=50)), + ('changed_object_id', models.PositiveBigIntegerField()), + ('related_object_id', models.PositiveBigIntegerField(blank=True, null=True)), + ('object_repr', models.CharField(editable=False, max_length=200)), + ('prechange_data', models.JSONField(blank=True, editable=False, null=True)), + ('postchange_data', models.JSONField(blank=True, editable=False, null=True)), + ('changed_object_type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.contenttype')), + ('related_object_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.contenttype')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='changes', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'object change', + 'verbose_name_plural': 'object changes', + 'ordering': ['-time'], + 'indexes': [models.Index(fields=['changed_object_type', 'changed_object_id'], name='core_object_changed_c227ce_idx'), models.Index(fields=['related_object_type', 'related_object_id'], name='core_object_related_3375d6_idx')], + }, + ), + ], + # Table has been renamed from 'extras' app + database_operations=[], + ), + ] diff --git a/netbox/core/migrations/0012_job_object_type_optional.py b/netbox/core/migrations/0012_job_object_type_optional.py new file mode 100644 index 0000000000..3c6664afce --- /dev/null +++ b/netbox/core/migrations/0012_job_object_type_optional.py @@ -0,0 +1,24 @@ +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('core', '0011_move_objectchange'), + ] + + operations = [ + migrations.AlterField( + model_name='job', + name='object_type', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='jobs', + to='contenttypes.contenttype' + ), + ), + ] diff --git a/netbox/core/models/__init__.py b/netbox/core/models/__init__.py index 2c30ce02b9..db00e67aa8 100644 --- a/netbox/core/models/__init__.py +++ b/netbox/core/models/__init__.py @@ -1,5 +1,6 @@ -from .config import * from .contenttypes import * +from .change_logging import * +from .config import * from .data import * from .files import * from .jobs import * diff --git a/netbox/extras/models/change_logging.py b/netbox/core/models/change_logging.py similarity index 97% rename from netbox/extras/models/change_logging.py rename to netbox/core/models/change_logging.py index 8451a0d150..1d1bbc07c8 100644 --- a/netbox/extras/models/change_logging.py +++ b/netbox/core/models/change_logging.py @@ -8,11 +8,11 @@ from django.utils.translation import gettext_lazy as _ from mptt.models import MPTTModel -from core.models import ObjectType -from extras.choices import * +from core.choices import ObjectChangeActionChoices +from core.querysets import ObjectChangeQuerySet from netbox.models.features import ChangeLoggingMixin from utilities.data import shallow_compare_dict -from ..querysets import ObjectChangeQuerySet +from .contenttypes import ObjectType __all__ = ( 'ObjectChange', @@ -136,7 +136,7 @@ def save(self, *args, **kwargs): return super().save(*args, **kwargs) def get_absolute_url(self): - return reverse('extras:objectchange', args=[self.pk]) + return reverse('core:objectchange', args=[self.pk]) def get_action_color(self): return ObjectChangeActionChoices.colors.get(self.action) diff --git a/netbox/core/models/data.py b/netbox/core/models/data.py index 48fa2ff713..97f9fdac73 100644 --- a/netbox/core/models/data.py +++ b/netbox/core/models/data.py @@ -1,10 +1,10 @@ import hashlib import logging import os -import yaml from fnmatch import fnmatchcase from urllib.parse import urlparse +import yaml from django.conf import settings from django.contrib.contenttypes.fields import GenericForeignKey from django.core.exceptions import ValidationError @@ -12,7 +12,6 @@ from django.db import models from django.urls import reverse from django.utils import timezone -from django.utils.module_loading import import_string from django.utils.translation import gettext as _ from netbox.constants import CENSOR_TOKEN, CENSOR_TOKEN_CHANGED @@ -22,8 +21,6 @@ from utilities.querysets import RestrictedQuerySet from ..choices import * from ..exceptions import SyncError -from ..signals import post_sync, pre_sync -from .jobs import Job __all__ = ( 'AutoSyncRecord', @@ -153,21 +150,6 @@ def to_objectchange(self, action): return objectchange - def enqueue_sync_job(self, request): - """ - Enqueue a background job to synchronize the DataSource by calling sync(). - """ - # Set the status to "syncing" - self.status = DataSourceStatusChoices.QUEUED - DataSource.objects.filter(pk=self.pk).update(status=self.status) - - # Enqueue a sync job - return Job.enqueue( - import_string('core.jobs.sync_datasource'), - instance=self, - user=request.user - ) - def get_backend(self): backend_params = self.parameters or {} return self.backend_class(self.source_url, **backend_params) @@ -176,6 +158,8 @@ def sync(self): """ Create/update/delete child DataFiles as necessary to synchronize with the remote source. """ + from core.signals import post_sync, pre_sync + if self.status == DataSourceStatusChoices.SYNCING: raise SyncError(_("Cannot initiate sync; syncing already in progress.")) diff --git a/netbox/core/models/jobs.py b/netbox/core/models/jobs.py index b9f0d0b913..4a327a1d85 100644 --- a/netbox/core/models/jobs.py +++ b/netbox/core/models/jobs.py @@ -13,7 +13,6 @@ from core.choices import JobStatusChoices from core.models import ObjectType from core.signals import job_end, job_start -from extras.constants import EVENT_JOB_END, EVENT_JOB_START from netbox.config import get_config from netbox.constants import RQ_QUEUE_DEFAULT from utilities.querysets import RestrictedQuerySet @@ -32,6 +31,8 @@ class Job(models.Model): to='contenttypes.ContentType', related_name='jobs', on_delete=models.CASCADE, + blank=True, + null=True ) object_id = models.PositiveBigIntegerField( blank=True, @@ -198,25 +199,34 @@ def terminate(self, status=JobStatusChoices.STATUS_COMPLETED, error=None): job_end.send(self) @classmethod - def enqueue(cls, func, instance, name='', user=None, schedule_at=None, interval=None, **kwargs): + def enqueue(cls, func, instance=None, name='', user=None, schedule_at=None, interval=None, immediate=False, **kwargs): """ Create a Job instance and enqueue a job using the given callable Args: func: The callable object to be enqueued for execution - instance: The NetBox object to which this job pertains + instance: The NetBox object to which this job pertains (optional) name: Name for the job (optional) user: The user responsible for running the job schedule_at: Schedule the job to be executed at the passed date and time interval: Recurrence interval (in minutes) + immediate: Run the job immediately without scheduling it in the background. Should be used for interactive + management commands only. """ - object_type = ObjectType.objects.get_for_model(instance, for_concrete_model=False) - rq_queue_name = get_queue_for_model(object_type.model) + if schedule_at and immediate: + raise ValueError(_("enqueue() cannot be called with values for both schedule_at and immediate.")) + + if instance: + object_type = ObjectType.objects.get_for_model(instance, for_concrete_model=False) + object_id = instance.pk + else: + object_type = object_id = None + rq_queue_name = get_queue_for_model(object_type.model if object_type else None) queue = django_rq.get_queue(rq_queue_name) status = JobStatusChoices.STATUS_SCHEDULED if schedule_at else JobStatusChoices.STATUS_PENDING job = Job.objects.create( object_type=object_type, - object_id=instance.pk, + object_id=object_id, name=name, status=status, scheduled=schedule_at, @@ -225,8 +235,16 @@ def enqueue(cls, func, instance, name='', user=None, schedule_at=None, interval= job_id=uuid.uuid4() ) - if schedule_at: + # Run the job immediately, rather than enqueuing it as a background task. Note that this is a synchronous + # (blocking) operation, and execution will pause until the job completes. + if immediate: + func(job_id=str(job.job_id), job=job, **kwargs) + + # Schedule the job to run at a specific date & time. + elif schedule_at: queue.enqueue_at(schedule_at, func, job_id=str(job.job_id), job=job, **kwargs) + + # Schedule the job to run asynchronously at this first available opportunity. else: queue.enqueue(func, job_id=str(job.job_id), job=job, **kwargs) diff --git a/netbox/core/plugins.py b/netbox/core/plugins.py new file mode 100644 index 0000000000..1fcb37f2bf --- /dev/null +++ b/netbox/core/plugins.py @@ -0,0 +1,216 @@ +import datetime +import importlib +import importlib.util +from dataclasses import dataclass, field +from typing import Optional + +import requests +from django.conf import settings +from django.core.cache import cache + +from netbox.plugins import PluginConfig +from utilities.datetime import datetime_from_timestamp + +USER_AGENT_STRING = f'NetBox/{settings.RELEASE.version} {settings.RELEASE.edition}' +CACHE_KEY_CATALOG_FEED = 'plugins-catalog-feed' + + +@dataclass +class PluginAuthor: + """ + Identifying information for the author of a plugin. + """ + name: str + org_id: str = '' + url: str = '' + + +@dataclass +class PluginVersion: + """ + Details for a specific versioned release of a plugin. + """ + date: datetime.datetime = None + version: str = '' + netbox_min_version: str = '' + netbox_max_version: str = '' + has_model: bool = False + is_certified: bool = False + is_feature: bool = False + is_integration: bool = False + is_netboxlabs_supported: bool = False + + +@dataclass +class Plugin: + """ + The representation of a NetBox plugin in the catalog API. + """ + id: str = '' + status: str = '' + title_short: str = '' + title_long: str = '' + tag_line: str = '' + description_short: str = '' + slug: str = '' + author: Optional[PluginAuthor] = None + created_at: datetime.datetime = None + updated_at: datetime.datetime = None + license_type: str = '' + homepage_url: str = '' + package_name_pypi: str = '' + config_name: str = '' + is_certified: bool = False + release_latest: PluginVersion = field(default_factory=PluginVersion) + release_recent_history: list[PluginVersion] = field(default_factory=list) + is_local: bool = False # extra field for locally installed plugins + is_installed: bool = False + installed_version: str = '' + + +def get_local_plugins(plugins=None): + """ + Return a dictionary of all locally-installed plugins, mapped by name. + """ + plugins = plugins or {} + local_plugins = {} + + # Gather all locally-installed plugins + for plugin_name in settings.PLUGINS: + plugin = importlib.import_module(plugin_name) + plugin_config: PluginConfig = plugin.config + + local_plugins[plugin_config.name] = Plugin( + config_name=plugin_config.name, + title_short=plugin_config.verbose_name, + title_long=plugin_config.verbose_name, + tag_line=plugin_config.description, + description_short=plugin_config.description, + is_local=True, + is_installed=True, + installed_version=plugin_config.version, + ) + + # Update catalog entries for local plugins, or add them to the list if not listed + for k, v in local_plugins.items(): + if k in plugins: + plugins[k].is_local = True + plugins[k].is_installed = True + plugins[k].installed_version = v.installed_version + else: + plugins[k] = v + + return plugins + + +def get_catalog_plugins(): + """ + Return a dictionary of all entries in the plugins catalog, mapped by name. + """ + session = requests.Session() + + # Disable catalog fetching for isolated deployments + if settings.ISOLATED_DEPLOYMENT: + return {} + + def get_pages(): + # TODO: pagination is currently broken in API + payload = {'page': '1', 'per_page': '50'} + first_page = session.get( + settings.PLUGIN_CATALOG_URL, + headers={'User-Agent': USER_AGENT_STRING}, + proxies=settings.HTTP_PROXIES, + timeout=3, + params=payload + ).json() + yield first_page + num_pages = first_page['metadata']['pagination']['last_page'] + + for page in range(2, num_pages + 1): + payload['page'] = page + next_page = session.get( + settings.PLUGIN_CATALOG_URL, + headers={'User-Agent': USER_AGENT_STRING}, + proxies=settings.HTTP_PROXIES, + timeout=3, + params=payload + ).json() + yield next_page + + def make_plugin_dict(): + plugins = {} + + for page in get_pages(): + for data in page['data']: + + # Populate releases + releases = [] + for version in data['release_recent_history']: + releases.append( + PluginVersion( + date=datetime_from_timestamp(version['date']), + version=version['version'], + netbox_min_version=version['netbox_min_version'], + netbox_max_version=version['netbox_max_version'], + has_model=version['has_model'], + is_certified=version['is_certified'], + is_feature=version['is_feature'], + is_integration=version['is_integration'], + is_netboxlabs_supported=version['is_netboxlabs_supported'], + ) + ) + releases = sorted(releases, key=lambda x: x.date, reverse=True) + latest_release = PluginVersion( + date=datetime_from_timestamp(data['release_latest']['date']), + version=data['release_latest']['version'], + netbox_min_version=data['release_latest']['netbox_min_version'], + netbox_max_version=data['release_latest']['netbox_max_version'], + has_model=data['release_latest']['has_model'], + is_certified=data['release_latest']['is_certified'], + is_feature=data['release_latest']['is_feature'], + is_integration=data['release_latest']['is_integration'], + is_netboxlabs_supported=data['release_latest']['is_netboxlabs_supported'], + ) + + # Populate author (if any) + if data['author']: + author = PluginAuthor( + name=data['author']['name'], + org_id=data['author']['org_id'], + url=data['author']['url'], + ) + else: + author = None + + # Populate plugin data + plugins[data['config_name']] = Plugin( + id=data['id'], + status=data['status'], + title_short=data['title_short'], + title_long=data['title_long'], + tag_line=data['tag_line'], + description_short=data['description_short'], + slug=data['slug'], + author=author, + created_at=datetime_from_timestamp(data['created_at']), + updated_at=datetime_from_timestamp(data['updated_at']), + license_type=data['license_type'], + homepage_url=data['homepage_url'], + package_name_pypi=data['package_name_pypi'], + config_name=data['config_name'], + is_certified=data['is_certified'], + release_latest=latest_release, + release_recent_history=releases, + ) + + return plugins + + catalog_plugins = cache.get(CACHE_KEY_CATALOG_FEED, default={}) + if not catalog_plugins: + try: + catalog_plugins = make_plugin_dict() + cache.set(CACHE_KEY_CATALOG_FEED, catalog_plugins, 3600) + except requests.exceptions.RequestException: + pass + + return catalog_plugins diff --git a/netbox/core/querysets.py b/netbox/core/querysets.py new file mode 100644 index 0000000000..6e646cc879 --- /dev/null +++ b/netbox/core/querysets.py @@ -0,0 +1,26 @@ +from django.apps import apps +from django.contrib.contenttypes.models import ContentType +from django.db.utils import ProgrammingError + +from utilities.querysets import RestrictedQuerySet + +__all__ = ( + 'ObjectChangeQuerySet', +) + + +class ObjectChangeQuerySet(RestrictedQuerySet): + + def valid_models(self): + # Exclude any change records which refer to an instance of a model that's no longer installed. This + # can happen when a plugin is removed but its data remains in the database, for example. + try: + content_types = ContentType.objects.get_for_models(*apps.get_models()).values() + except ProgrammingError: + # Handle the case where the database schema has not yet been initialized + content_types = ContentType.objects.none() + + content_type_ids = set( + ct.pk for ct in content_types + ) + return self.filter(changed_object_type_id__in=content_type_ids) diff --git a/netbox/core/signals.py b/netbox/core/signals.py index f884a27b46..06432bf4ce 100644 --- a/netbox/core/signals.py +++ b/netbox/core/signals.py @@ -1,9 +1,26 @@ -from django.db.models.signals import post_save -from django.dispatch import Signal, receiver +import logging +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ValidationError +from django.db.models.fields.reverse_related import ManyToManyRel +from django.db.models.signals import m2m_changed, post_save, pre_delete +from django.dispatch import receiver, Signal +from django.utils.translation import gettext_lazy as _ +from django_prometheus.models import model_deletes, model_inserts, model_updates + +from core.choices import ObjectChangeActionChoices +from core.events import * +from core.models import ObjectChange +from extras.events import enqueue_event +from extras.utils import run_validators +from netbox.config import get_config +from netbox.context import current_request, events_queue +from netbox.models.features import ChangeLoggingMixin +from utilities.exceptions import AbortRequest from .models import ConfigRevision __all__ = ( + 'clear_events', 'job_end', 'job_start', 'post_sync', @@ -18,6 +35,152 @@ pre_sync = Signal() post_sync = Signal() +# Event signals +clear_events = Signal() + + +# +# Change logging & event handling +# + +@receiver((post_save, m2m_changed)) +def handle_changed_object(sender, instance, **kwargs): + """ + Fires when an object is created or updated. + """ + m2m_changed = False + + if not hasattr(instance, 'to_objectchange'): + return + + # Get the current request, or bail if not set + request = current_request.get() + if request is None: + return + + # Determine the type of change being made + if kwargs.get('created'): + event_type = OBJECT_CREATED + elif 'created' in kwargs: + event_type = OBJECT_UPDATED + elif kwargs.get('action') in ['post_add', 'post_remove'] and kwargs['pk_set']: + # m2m_changed with objects added or removed + m2m_changed = True + event_type = OBJECT_UPDATED + else: + return + + # Create/update an ObjectChange record for this change + action = { + OBJECT_CREATED: ObjectChangeActionChoices.ACTION_CREATE, + OBJECT_UPDATED: ObjectChangeActionChoices.ACTION_UPDATE, + OBJECT_DELETED: ObjectChangeActionChoices.ACTION_DELETE, + }[event_type] + objectchange = instance.to_objectchange(action) + # If this is a many-to-many field change, check for a previous ObjectChange instance recorded + # for this object by this request and update it + if m2m_changed and ( + prev_change := ObjectChange.objects.filter( + changed_object_type=ContentType.objects.get_for_model(instance), + changed_object_id=instance.pk, + request_id=request.id + ).first() + ): + prev_change.postchange_data = objectchange.postchange_data + prev_change.save() + elif objectchange and objectchange.has_changes: + objectchange.user = request.user + objectchange.request_id = request.id + objectchange.save() + + # Ensure that we're working with fresh M2M assignments + if m2m_changed: + instance.refresh_from_db() + + # Enqueue the object for event processing + queue = events_queue.get() + enqueue_event(queue, instance, request.user, request.id, event_type) + events_queue.set(queue) + + # Increment metric counters + if event_type == OBJECT_CREATED: + model_inserts.labels(instance._meta.model_name).inc() + elif event_type == OBJECT_UPDATED: + model_updates.labels(instance._meta.model_name).inc() + + +@receiver(pre_delete) +def handle_deleted_object(sender, instance, **kwargs): + """ + Fires when an object is deleted. + """ + # Run any deletion protection rules for the object. Note that this must occur prior + # to queueing any events for the object being deleted, in case a validation error is + # raised, causing the deletion to fail. + model_name = f'{sender._meta.app_label}.{sender._meta.model_name}' + validators = get_config().PROTECTION_RULES.get(model_name, []) + try: + run_validators(instance, validators) + except ValidationError as e: + raise AbortRequest( + _("Deletion is prevented by a protection rule: {message}").format(message=e) + ) + + # Get the current request, or bail if not set + request = current_request.get() + if request is None: + return + + # Record an ObjectChange if applicable + if hasattr(instance, 'to_objectchange'): + if hasattr(instance, 'snapshot') and not getattr(instance, '_prechange_snapshot', None): + instance.snapshot() + objectchange = instance.to_objectchange(ObjectChangeActionChoices.ACTION_DELETE) + objectchange.user = request.user + objectchange.request_id = request.id + objectchange.save() + + # Django does not automatically send an m2m_changed signal for the reverse direction of a + # many-to-many relationship (see https://code.djangoproject.com/ticket/17688), so we need to + # trigger one manually. We do this by checking for any reverse M2M relationships on the + # instance being deleted, and explicitly call .remove() on the remote M2M field to delete + # the association. This triggers an m2m_changed signal with the `post_remove` action type + # for the forward direction of the relationship, ensuring that the change is recorded. + for relation in instance._meta.related_objects: + if type(relation) is not ManyToManyRel: + continue + related_model = relation.related_model + related_field_name = relation.remote_field.name + if not issubclass(related_model, ChangeLoggingMixin): + # We only care about triggering the m2m_changed signal for models which support + # change logging + continue + for obj in related_model.objects.filter(**{related_field_name: instance.pk}): + obj.snapshot() # Ensure the change record includes the "before" state + getattr(obj, related_field_name).remove(instance) + + # Enqueue the object for event processing + queue = events_queue.get() + enqueue_event(queue, instance, request.user, request.id, OBJECT_DELETED) + events_queue.set(queue) + + # Increment metric counters + model_deletes.labels(instance._meta.model_name).inc() + + +@receiver(clear_events) +def clear_events_queue(sender, **kwargs): + """ + Delete any queued events (e.g. because of an aborted bulk transaction) + """ + logger = logging.getLogger('events') + logger.info(f"Clearing {len(events_queue.get())} queued events ({sender})") + events_queue.set({}) + + +# +# DataSource handlers +# @receiver(post_sync) def auto_sync(instance, **kwargs): diff --git a/netbox/core/tables/__init__.py b/netbox/core/tables/__init__.py index 8f219afa45..cec7342f9e 100644 --- a/netbox/core/tables/__init__.py +++ b/netbox/core/tables/__init__.py @@ -1,3 +1,4 @@ +from .change_logging import * from .config import * from .data import * from .jobs import * diff --git a/netbox/core/tables/change_logging.py b/netbox/core/tables/change_logging.py new file mode 100644 index 0000000000..aced0e8a63 --- /dev/null +++ b/netbox/core/tables/change_logging.py @@ -0,0 +1,53 @@ +import django_tables2 as tables +from django.utils.translation import gettext_lazy as _ + +from core.models import ObjectChange +from netbox.tables import NetBoxTable, columns +from .template_code import * + +__all__ = ( + 'ObjectChangeTable', +) + + +class ObjectChangeTable(NetBoxTable): + time = columns.DateTimeColumn( + verbose_name=_('Time'), + timespec='minutes', + linkify=True + ) + user_name = tables.Column( + verbose_name=_('Username') + ) + full_name = tables.TemplateColumn( + accessor=tables.A('user'), + template_code=OBJECTCHANGE_FULL_NAME, + verbose_name=_('Full Name'), + orderable=False + ) + action = columns.ChoiceFieldColumn( + verbose_name=_('Action'), + ) + changed_object_type = columns.ContentTypeColumn( + verbose_name=_('Type') + ) + object_repr = tables.TemplateColumn( + accessor=tables.A('changed_object'), + template_code=OBJECTCHANGE_OBJECT, + verbose_name=_('Object'), + orderable=False + ) + request_id = tables.TemplateColumn( + template_code=OBJECTCHANGE_REQUEST_ID, + verbose_name=_('Request ID') + ) + actions = columns.ActionsColumn( + actions=() + ) + + class Meta(NetBoxTable.Meta): + model = ObjectChange + fields = ( + 'pk', 'time', 'user_name', 'full_name', 'action', 'changed_object_type', 'object_repr', 'request_id', + 'actions', + ) diff --git a/netbox/core/tables/plugins.py b/netbox/core/tables/plugins.py index 21e90cd6b4..96c612366d 100644 --- a/netbox/core/tables/plugins.py +++ b/netbox/core/tables/plugins.py @@ -1,39 +1,84 @@ import django_tables2 as tables from django.utils.translation import gettext_lazy as _ -from netbox.tables import BaseTable + +from netbox.tables import BaseTable, columns __all__ = ( - 'PluginTable', + 'CatalogPluginTable', + 'PluginVersionTable', ) -class PluginTable(BaseTable): - name = tables.Column( - accessor=tables.A('verbose_name'), - verbose_name=_('Name') - ) +class PluginVersionTable(BaseTable): version = tables.Column( verbose_name=_('Version') ) - package = tables.Column( - accessor=tables.A('name'), - verbose_name=_('Package') + last_updated = columns.DateTimeColumn( + accessor=tables.A('date'), + timespec='minutes', + verbose_name=_('Last Updated') + ) + min_version = tables.Column( + accessor=tables.A('netbox_min_version'), + verbose_name=_('Minimum NetBox Version') + ) + max_version = tables.Column( + accessor=tables.A('netbox_max_version'), + verbose_name=_('Maximum NetBox Version') + ) + + class Meta(BaseTable.Meta): + empty_text = _('No plugin data found') + fields = ( + 'version', 'last_updated', 'min_version', 'max_version', + ) + default_columns = ( + 'version', 'last_updated', 'min_version', 'max_version', + ) + orderable = False + + +class CatalogPluginTable(BaseTable): + title_long = tables.Column( + linkify=('core:plugin', [tables.A('config_name')]), + verbose_name=_('Name') ) author = tables.Column( + accessor=tables.A('author__name'), verbose_name=_('Author') ) - author_email = tables.Column( - verbose_name=_('Author Email') + is_local = columns.BooleanColumn( + verbose_name=_('Local') + ) + is_installed = columns.BooleanColumn( + verbose_name=_('Installed') + ) + is_certified = columns.BooleanColumn( + verbose_name=_('Certified') + ) + created_at = columns.DateTimeColumn( + verbose_name=_('Published') + ) + updated_at = columns.DateTimeColumn( + verbose_name=_('Updated') + ) + installed_version = tables.Column( + verbose_name=_('Installed Version') ) - description = tables.Column( - verbose_name=_('Description') + latest_version = tables.Column( + accessor=tables.A('release_latest__version'), + verbose_name=_('Latest Version') ) class Meta(BaseTable.Meta): - empty_text = _('No plugins found') + empty_text = _('No plugin data found') fields = ( - 'name', 'version', 'package', 'author', 'author_email', 'description', + 'title_long', 'author', 'is_local', 'is_installed', 'is_certified', 'created_at', 'updated_at', + 'installed_version', 'latest_version', ) default_columns = ( - 'name', 'version', 'package', 'description', + 'title_long', 'author', 'is_local', 'is_installed', 'is_certified', 'installed_version', 'latest_version', ) + # List installed plugins first, then certified plugins, then + # everything else (with each tranche ordered alphabetically) + order_by = ('-is_installed', '-is_certified', 'name') diff --git a/netbox/core/tables/template_code.py b/netbox/core/tables/template_code.py new file mode 100644 index 0000000000..c8f0058e71 --- /dev/null +++ b/netbox/core/tables/template_code.py @@ -0,0 +1,16 @@ +OBJECTCHANGE_FULL_NAME = """ +{% load helpers %} +{{ value.get_full_name|placeholder }} +""" + +OBJECTCHANGE_OBJECT = """ +{% if value and value.get_absolute_url %} + {{ record.object_repr }} +{% else %} + {{ record.object_repr }} +{% endif %} +""" + +OBJECTCHANGE_REQUEST_ID = """ +{{ value }} +""" diff --git a/netbox/extras/tests/test_changelog.py b/netbox/core/tests/test_changelog.py similarity index 99% rename from netbox/extras/tests/test_changelog.py rename to netbox/core/tests/test_changelog.py index aac526e0f7..c58968ee8a 100644 --- a/netbox/extras/tests/test_changelog.py +++ b/netbox/core/tests/test_changelog.py @@ -3,11 +3,12 @@ from django.urls import reverse from rest_framework import status -from core.models import ObjectType +from core.choices import ObjectChangeActionChoices +from core.models import ObjectChange, ObjectType from dcim.choices import SiteStatusChoices from dcim.models import Site from extras.choices import * -from extras.models import CustomField, CustomFieldChoiceSet, ObjectChange, Tag +from extras.models import CustomField, CustomFieldChoiceSet, Tag from utilities.testing import APITestCase from utilities.testing.utils import create_tags, post_data from utilities.testing.views import ModelViewTestCase diff --git a/netbox/core/tests/test_filtersets.py b/netbox/core/tests/test_filtersets.py index aefb9eed0d..310be1d0ef 100644 --- a/netbox/core/tests/test_filtersets.py +++ b/netbox/core/tests/test_filtersets.py @@ -1,7 +1,13 @@ +import uuid from datetime import datetime, timezone +from django.contrib.contenttypes.models import ContentType from django.test import TestCase -from utilities.testing import ChangeLoggedFilterSetTests + +from dcim.models import Site +from ipam.models import IPAddress +from users.models import User +from utilities.testing import BaseFilterSetTests, ChangeLoggedFilterSetTests from ..choices import * from ..filtersets import * from ..models import * @@ -132,3 +138,99 @@ def test_hash(self): 'a78168c7c97115bafd96450ed03ea43acec495094c5caa28f0d02e20e3a76cc2', ]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class ObjectChangeTestCase(TestCase, BaseFilterSetTests): + queryset = ObjectChange.objects.all() + filterset = ObjectChangeFilterSet + ignore_fields = ('prechange_data', 'postchange_data') + + @classmethod + def setUpTestData(cls): + users = ( + User(username='user1'), + User(username='user2'), + User(username='user3'), + ) + User.objects.bulk_create(users) + + site = Site.objects.create(name='Test Site 1', slug='test-site-1') + ipaddress = IPAddress.objects.create(address='192.0.2.1/24') + + object_changes = ( + ObjectChange( + user=users[0], + user_name=users[0].username, + request_id=uuid.uuid4(), + action=ObjectChangeActionChoices.ACTION_CREATE, + changed_object=site, + object_repr=str(site), + postchange_data={'name': site.name, 'slug': site.slug} + ), + ObjectChange( + user=users[0], + user_name=users[0].username, + request_id=uuid.uuid4(), + action=ObjectChangeActionChoices.ACTION_UPDATE, + changed_object=site, + object_repr=str(site), + postchange_data={'name': site.name, 'slug': site.slug} + ), + ObjectChange( + user=users[1], + user_name=users[1].username, + request_id=uuid.uuid4(), + action=ObjectChangeActionChoices.ACTION_DELETE, + changed_object=site, + object_repr=str(site), + postchange_data={'name': site.name, 'slug': site.slug} + ), + ObjectChange( + user=users[1], + user_name=users[1].username, + request_id=uuid.uuid4(), + action=ObjectChangeActionChoices.ACTION_CREATE, + changed_object=ipaddress, + object_repr=str(ipaddress), + postchange_data={'address': ipaddress.address, 'status': ipaddress.status} + ), + ObjectChange( + user=users[2], + user_name=users[2].username, + request_id=uuid.uuid4(), + action=ObjectChangeActionChoices.ACTION_UPDATE, + changed_object=ipaddress, + object_repr=str(ipaddress), + postchange_data={'address': ipaddress.address, 'status': ipaddress.status} + ), + ObjectChange( + user=users[2], + user_name=users[2].username, + request_id=uuid.uuid4(), + action=ObjectChangeActionChoices.ACTION_DELETE, + changed_object=ipaddress, + object_repr=str(ipaddress), + postchange_data={'address': ipaddress.address, 'status': ipaddress.status} + ), + ) + ObjectChange.objects.bulk_create(object_changes) + + def test_q(self): + params = {'q': 'Site 1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + + def test_user(self): + params = {'user_id': User.objects.filter(username__in=['user1', 'user2']).values_list('pk', flat=True)} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + params = {'user': ['user1', 'user2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + + def test_user_name(self): + params = {'user_name': ['user1', 'user2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + + def test_changed_object_type(self): + params = {'changed_object_type': 'dcim.site'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + params = {'changed_object_type_id': [ContentType.objects.get(app_label='dcim', model='site').pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) diff --git a/netbox/core/tests/test_models.py b/netbox/core/tests/test_models.py index 0eeb66984d..ff71c2e88f 100644 --- a/netbox/core/tests/test_models.py +++ b/netbox/core/tests/test_models.py @@ -1,7 +1,7 @@ from django.test import TestCase from core.models import DataSource -from extras.choices import ObjectChangeActionChoices +from core.choices import ObjectChangeActionChoices from netbox.constants import CENSOR_TOKEN, CENSOR_TOKEN_CHANGED diff --git a/netbox/core/tests/test_views.py b/netbox/core/tests/test_views.py index b7a951a0fe..3c847e4efd 100644 --- a/netbox/core/tests/test_views.py +++ b/netbox/core/tests/test_views.py @@ -1,4 +1,4 @@ -import logging +import urllib.parse import uuid from datetime import datetime @@ -10,8 +10,11 @@ from rq.job import Job as RQ_Job, JobStatus from rq.registry import DeferredJobRegistry, FailedJobRegistry, FinishedJobRegistry, StartedJobRegistry +from core.choices import ObjectChangeActionChoices +from core.models import * +from dcim.models import Site +from users.models import User from utilities.testing import TestCase, ViewTestCases, create_tags -from ..models import * class DataSourceTestCase(ViewTestCases.PrimaryObjectViewTestCase): @@ -99,6 +102,43 @@ def setUpTestData(cls): DataFile.objects.bulk_create(data_files) +# TODO: Convert to StandardTestCases.Views +class ObjectChangeTestCase(TestCase): + user_permissions = ( + 'core.view_objectchange', + ) + + @classmethod + def setUpTestData(cls): + + site = Site(name='Site 1', slug='site-1') + site.save() + + # Create three ObjectChanges + user = User.objects.create_user(username='testuser2') + for i in range(1, 4): + oc = site.to_objectchange(action=ObjectChangeActionChoices.ACTION_UPDATE) + oc.user = user + oc.request_id = uuid.uuid4() + oc.save() + + def test_objectchange_list(self): + + url = reverse('core:objectchange_list') + params = { + "user": User.objects.first().pk, + } + + response = self.client.get('{}?{}'.format(url, urllib.parse.urlencode(params))) + self.assertHttpStatus(response, 200) + + def test_objectchange(self): + + objectchange = ObjectChange.objects.first() + response = self.client.get(objectchange.get_absolute_url()) + self.assertHttpStatus(response, 200) + + class BackgroundTaskTestCase(TestCase): user_permissions = () diff --git a/netbox/core/urls.py b/netbox/core/urls.py index 59eead615d..fd6ec89962 100644 --- a/netbox/core/urls.py +++ b/netbox/core/urls.py @@ -25,6 +25,10 @@ path('jobs//', views.JobView.as_view(), name='job'), path('jobs//delete/', views.JobDeleteView.as_view(), name='job_delete'), + # Change logging + path('changelog/', views.ObjectChangeListView.as_view(), name='objectchange_list'), + path('changelog//', include(get_model_urls('core', 'objectchange'))), + # Background Tasks path('background-queues/', views.BackgroundQueueListView.as_view(), name='background_queue_list'), path('background-queues///', views.BackgroundTaskListView.as_view(), name='background_task_list'), @@ -45,4 +49,8 @@ # System path('system/', views.SystemView.as_view(), name='system'), + + # Plugins + path('plugins/', views.PluginListView.as_view(), name='plugin_list'), + path('plugins//', views.PluginView.as_view(), name='plugin'), ) diff --git a/netbox/core/views.py b/netbox/core/views.py index 230134cc36..3c53196261 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -2,7 +2,6 @@ import platform from django import __version__ as DJANGO_VERSION -from django.apps import apps from django.conf import settings from django.contrib import messages from django.contrib.auth.mixins import UserPassesTestMixin @@ -25,18 +24,22 @@ from rq.worker import Worker from rq.worker_registration import clean_worker_registry -from extras.validators import CustomValidator from netbox.config import get_config, PARAMS from netbox.views import generic from netbox.views.generic.base import BaseObjectView from netbox.views.generic.mixins import TableMixin +from utilities.data import shallow_compare_dict from utilities.forms import ConfirmationForm from utilities.htmx import htmx_partial from utilities.json import ConfigJSONEncoder from utilities.query import count_related from utilities.views import ContentTypePermissionRequiredMixin, GetRelatedModelsMixin, register_model_view from . import filtersets, forms, tables +from .choices import DataSourceStatusChoices +from .jobs import SyncDataSourceJob from .models import * +from .plugins import get_catalog_plugins, get_local_plugins +from .tables import CatalogPluginTable, PluginVersionTable # @@ -76,7 +79,11 @@ def get(self, request, pk): def post(self, request, pk): datasource = get_object_or_404(self.queryset, pk=pk) - job = datasource.enqueue_sync_job(request) + + # Enqueue the sync job & update the DataSource's status + job = SyncDataSourceJob.enqueue(instance=datasource, user=request.user) + datasource.status = DataSourceStatusChoices.QUEUED + DataSource.objects.filter(pk=datasource.pk).update(status=datasource.status) messages.success( request, @@ -177,6 +184,75 @@ class JobBulkDeleteView(generic.BulkDeleteView): table = tables.JobTable +# +# Change logging +# + +class ObjectChangeListView(generic.ObjectListView): + queryset = ObjectChange.objects.valid_models() + filterset = filtersets.ObjectChangeFilterSet + filterset_form = forms.ObjectChangeFilterForm + table = tables.ObjectChangeTable + template_name = 'core/objectchange_list.html' + actions = { + 'export': {'view'}, + } + + +@register_model_view(ObjectChange) +class ObjectChangeView(generic.ObjectView): + queryset = ObjectChange.objects.valid_models() + + def get_extra_context(self, request, instance): + related_changes = ObjectChange.objects.valid_models().restrict(request.user, 'view').filter( + request_id=instance.request_id + ).exclude( + pk=instance.pk + ) + related_changes_table = tables.ObjectChangeTable( + data=related_changes[:50], + orderable=False + ) + + objectchanges = ObjectChange.objects.valid_models().restrict(request.user, 'view').filter( + changed_object_type=instance.changed_object_type, + changed_object_id=instance.changed_object_id, + ) + + next_change = objectchanges.filter(time__gt=instance.time).order_by('time').first() + prev_change = objectchanges.filter(time__lt=instance.time).order_by('-time').first() + + if not instance.prechange_data and instance.action in ['update', 'delete'] and prev_change: + non_atomic_change = True + prechange_data = prev_change.postchange_data_clean + else: + non_atomic_change = False + prechange_data = instance.prechange_data_clean + + if prechange_data and instance.postchange_data: + diff_added = shallow_compare_dict( + prechange_data or dict(), + instance.postchange_data_clean or dict(), + exclude=['last_updated'], + ) + diff_removed = { + x: prechange_data.get(x) for x in diff_added + } if prechange_data else {} + else: + diff_added = None + diff_removed = None + + return { + 'diff_added': diff_added, + 'diff_removed': diff_removed, + 'next_change': next_change, + 'prev_change': prev_change, + 'related_changes_table': related_changes_table, + 'related_changes_count': related_changes.count(), + 'non_atomic_change': non_atomic_change + } + + # # Config Revisions # @@ -516,7 +592,7 @@ def get(self, request, key): # -# Plugins +# System # class SystemView(UserPassesTestMixin, View): @@ -540,7 +616,7 @@ def get(self, request): except (ProgrammingError, IndexError): pass stats = { - 'netbox_version': settings.VERSION, + 'netbox_release': settings.RELEASE, 'django_version': DJANGO_VERSION, 'python_version': platform.python_version(), 'postgresql_version': psql_version, @@ -549,12 +625,6 @@ def get(self, request): 'rq_worker_count': Worker.count(get_connection('default')), } - # Plugins - plugins = [ - # Look up app config by package name - apps.get_app_config(plugin.rsplit('.', 1)[-1]) for plugin in settings.PLUGINS - ] - # Configuration try: config = ConfigRevision.objects.get(pk=cache.get('config_version')) @@ -564,12 +634,11 @@ def get(self, request): # Raw data export if 'export' in request.GET: + stats['netbox_release'] = stats['netbox_release'].asdict() params = [param.name for param in PARAMS] data = { **stats, - 'plugins': { - plugin.name: plugin.version for plugin in plugins - }, + 'plugins': settings.PLUGINS, 'config': { k: getattr(config, k) for k in sorted(params) }, @@ -578,15 +647,75 @@ def get(self, request): response['Content-Disposition'] = 'attachment; filename="netbox.json"' return response - plugins_table = tables.PluginTable(plugins, orderable=False) - plugins_table.configure(request) - # Serialize any CustomValidator classes if hasattr(config, 'CUSTOM_VALIDATORS') and config.CUSTOM_VALIDATORS: config.CUSTOM_VALIDATORS = json.dumps(config.CUSTOM_VALIDATORS, cls=ConfigJSONEncoder, indent=4) return render(request, 'core/system.html', { 'stats': stats, - 'plugins_table': plugins_table, 'config': config, }) + + +# +# Plugins +# + +class BasePluginView(UserPassesTestMixin, View): + CACHE_KEY_CATALOG_ERROR = 'plugins-catalog-error' + + def test_func(self): + return self.request.user.is_staff + + def get_cached_plugins(self, request): + catalog_plugins = {} + catalog_plugins_error = cache.get(self.CACHE_KEY_CATALOG_ERROR, default=False) + if not catalog_plugins_error: + catalog_plugins = get_catalog_plugins() + if not catalog_plugins: + # Cache for 5 minutes to avoid spamming connection + cache.set(self.CACHE_KEY_CATALOG_ERROR, True, 300) + messages.warning(request, _("Plugins catalog could not be loaded")) + + return get_local_plugins(catalog_plugins) + + +class PluginListView(BasePluginView): + + def get(self, request): + q = request.GET.get('q', None) + + plugins = self.get_cached_plugins(request).values() + if q: + plugins = [obj for obj in plugins if q.casefold() in obj.title_short.casefold()] + + table = CatalogPluginTable(plugins, user=request.user) + table.configure(request) + + # If this is an HTMX request, return only the rendered table HTML + if htmx_partial(request): + return render(request, 'htmx/table.html', { + 'table': table, + }) + + return render(request, 'core/plugin_list.html', { + 'table': table, + }) + + +class PluginView(BasePluginView): + + def get(self, request, name): + + plugins = self.get_cached_plugins(request) + if name not in plugins: + raise Http404(_("Plugin {name} not found").format(name=name)) + plugin = plugins[name] + + table = PluginVersionTable(plugin.release_recent_history, user=request.user) + table.configure(request) + + return render(request, 'core/plugin.html', { + 'plugin': plugin, + 'table': table, + }) diff --git a/netbox/dcim/api/nested_serializers.py b/netbox/dcim/api/nested_serializers.py index bcb141a711..5d83b91457 100644 --- a/netbox/dcim/api/nested_serializers.py +++ b/netbox/dcim/api/nested_serializers.py @@ -1,9 +1,15 @@ +import warnings + from drf_spectacular.utils import extend_schema_serializer from rest_framework import serializers from dcim import models from netbox.api.fields import RelatedObjectCountField from netbox.api.serializers import WritableNestedSerializer +from .serializers_.nested import ( + NestedDeviceBaySerializer, NestedDeviceSerializer, NestedInterfaceSerializer, NestedInterfaceTemplateSerializer, + NestedLocationSerializer, NestedModuleBaySerializer, NestedRegionSerializer, NestedSiteGroupSerializer, +) __all__ = [ 'NestedCableSerializer', @@ -48,93 +54,56 @@ 'NestedVirtualDeviceContextSerializer', ] +# TODO: Remove in v4.2 +warnings.warn( + f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.", + DeprecationWarning +) + # # Regions/sites # -@extend_schema_serializer( - exclude_fields=('site_count',), -) -class NestedRegionSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail') - site_count = serializers.IntegerField(read_only=True) - _depth = serializers.IntegerField(source='level', read_only=True) - - class Meta: - model = models.Region - fields = ['id', 'url', 'display', 'name', 'slug', 'site_count', '_depth'] - - -@extend_schema_serializer( - exclude_fields=('site_count',), -) -class NestedSiteGroupSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:sitegroup-detail') - site_count = serializers.IntegerField(read_only=True) - _depth = serializers.IntegerField(source='level', read_only=True) - - class Meta: - model = models.SiteGroup - fields = ['id', 'url', 'display', 'name', 'slug', 'site_count', '_depth'] - - class NestedSiteSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:site-detail') class Meta: model = models.Site - fields = ['id', 'url', 'display', 'name', 'slug'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug'] # # Racks # -@extend_schema_serializer( - exclude_fields=('rack_count',), -) -class NestedLocationSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:location-detail') - rack_count = serializers.IntegerField(read_only=True) - _depth = serializers.IntegerField(source='level', read_only=True) - - class Meta: - model = models.Location - fields = ['id', 'url', 'display', 'name', 'slug', 'rack_count', '_depth'] - - @extend_schema_serializer( exclude_fields=('rack_count',), ) class NestedRackRoleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail') rack_count = RelatedObjectCountField('racks') class Meta: model = models.RackRole - fields = ['id', 'url', 'display', 'name', 'slug', 'rack_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'rack_count'] @extend_schema_serializer( exclude_fields=('device_count',), ) class NestedRackSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail') device_count = RelatedObjectCountField('devices') class Meta: model = models.Rack - fields = ['id', 'url', 'display', 'name', 'device_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'device_count'] class NestedRackReservationSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackreservation-detail') user = serializers.SerializerMethodField(read_only=True) class Meta: model = models.RackReservation - fields = ['id', 'url', 'display', 'user', 'units'] + fields = ['id', 'url', 'display_url', 'display', 'user', 'units'] def get_user(self, obj): return obj.user.username @@ -148,34 +117,31 @@ def get_user(self, obj): exclude_fields=('devicetype_count',), ) class NestedManufacturerSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail') devicetype_count = RelatedObjectCountField('device_types') class Meta: model = models.Manufacturer - fields = ['id', 'url', 'display', 'name', 'slug', 'devicetype_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'devicetype_count'] @extend_schema_serializer( exclude_fields=('device_count',), ) class NestedDeviceTypeSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail') manufacturer = NestedManufacturerSerializer(read_only=True) device_count = RelatedObjectCountField('instances') class Meta: model = models.DeviceType - fields = ['id', 'url', 'display', 'manufacturer', 'model', 'slug', 'device_count'] + fields = ['id', 'url', 'display_url', 'display', 'manufacturer', 'model', 'slug', 'device_count'] class NestedModuleTypeSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:moduletype-detail') manufacturer = NestedManufacturerSerializer(read_only=True) class Meta: model = models.ModuleType - fields = ['id', 'url', 'display', 'manufacturer', 'model'] + fields = ['id', 'url', 'display_url', 'display', 'manufacturer', 'model'] # @@ -183,84 +149,67 @@ class Meta: # class NestedConsolePortTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleporttemplate-detail') class Meta: model = models.ConsolePortTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedConsoleServerPortTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverporttemplate-detail') class Meta: model = models.ConsoleServerPortTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedPowerPortTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerporttemplate-detail') class Meta: model = models.PowerPortTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedPowerOutletTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlettemplate-detail') class Meta: model = models.PowerOutletTemplate - fields = ['id', 'url', 'display', 'name'] - - -class NestedInterfaceTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfacetemplate-detail') - - class Meta: - model = models.InterfaceTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedRearPortTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail') class Meta: model = models.RearPortTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedFrontPortTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontporttemplate-detail') class Meta: model = models.FrontPortTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedModuleBayTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebaytemplate-detail') class Meta: model = models.ModuleBayTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedDeviceBayTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebaytemplate-detail') class Meta: model = models.DeviceBayTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedInventoryItemTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemtemplate-detail') _depth = serializers.IntegerField(source='level', read_only=True) class Meta: model = models.InventoryItemTemplate - fields = ['id', 'url', 'display', 'name', '_depth'] + fields = ['id', 'url', 'display_url', 'display', 'name', '_depth'] # @@ -271,171 +220,115 @@ class Meta: exclude_fields=('device_count', 'virtualmachine_count'), ) class NestedDeviceRoleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail') device_count = RelatedObjectCountField('devices') virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: model = models.DeviceRole - fields = ['id', 'url', 'display', 'name', 'slug', 'device_count', 'virtualmachine_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'device_count', 'virtualmachine_count'] @extend_schema_serializer( exclude_fields=('device_count', 'virtualmachine_count'), ) class NestedPlatformSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail') device_count = RelatedObjectCountField('devices') virtualmachine_count = RelatedObjectCountField('virtual_machines') class Meta: model = models.Platform - fields = ['id', 'url', 'display', 'name', 'slug', 'device_count', 'virtualmachine_count'] - - -class NestedDeviceSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail') - - class Meta: - model = models.Device - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'device_count', 'virtualmachine_count'] class ModuleNestedModuleBaySerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') class Meta: model = models.ModuleBay - fields = ['id', 'url', 'display', 'name'] - - -class ModuleBayNestedModuleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') - - class Meta: - model = models.Module - fields = ['id', 'url', 'display', 'serial'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedModuleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') device = NestedDeviceSerializer(read_only=True) module_bay = ModuleNestedModuleBaySerializer(read_only=True) module_type = NestedModuleTypeSerializer(read_only=True) class Meta: model = models.Module - fields = ['id', 'url', 'display', 'device', 'module_bay', 'module_type'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'module_bay', 'module_type'] class NestedConsoleServerPortSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.ConsoleServerPort - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] class NestedConsolePortSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.ConsolePort - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] class NestedPowerOutletSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.PowerOutlet - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] class NestedPowerPortSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail') device = NestedDeviceSerializer(read_only=True) _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.PowerPort - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] - - -class NestedInterfaceSerializer(WritableNestedSerializer): - device = NestedDeviceSerializer(read_only=True) - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail') - _occupied = serializers.BooleanField(required=False, read_only=True) - - class Meta: - model = models.Interface - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] class NestedRearPortSerializer(WritableNestedSerializer): device = NestedDeviceSerializer(read_only=True) - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.RearPort - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] class NestedFrontPortSerializer(WritableNestedSerializer): device = NestedDeviceSerializer(read_only=True) - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontport-detail') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.FrontPort - fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied'] - - -class NestedModuleBaySerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') - installed_module = ModuleBayNestedModuleSerializer(required=False, allow_null=True) - - class Meta: - model = models.ModuleBay - fields = ['id', 'url', 'display', 'installed_module', 'name'] - - -class NestedDeviceBaySerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail') - device = NestedDeviceSerializer(read_only=True) - - class Meta: - model = models.DeviceBay - fields = ['id', 'url', 'display', 'device', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] class NestedInventoryItemSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitem-detail') device = NestedDeviceSerializer(read_only=True) _depth = serializers.IntegerField(source='level', read_only=True) class Meta: model = models.InventoryItem - fields = ['id', 'url', 'display', 'device', 'name', '_depth'] + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', '_depth'] @extend_schema_serializer( exclude_fields=('inventoryitem_count',), ) class NestedInventoryItemRoleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail') inventoryitem_count = RelatedObjectCountField('inventory_items') class Meta: model = models.InventoryItemRole - fields = ['id', 'url', 'display', 'name', 'slug', 'inventoryitem_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'inventoryitem_count'] # @@ -443,11 +336,10 @@ class Meta: # class NestedCableSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') class Meta: model = models.Cable - fields = ['id', 'url', 'display', 'label'] + fields = ['id', 'url', 'display_url', 'display', 'label'] # @@ -458,13 +350,12 @@ class Meta: exclude_fields=('member_count',), ) class NestedVirtualChassisSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualchassis-detail') master = NestedDeviceSerializer() member_count = serializers.IntegerField(read_only=True) class Meta: model = models.VirtualChassis - fields = ['id', 'url', 'display', 'name', 'master', 'member_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'master', 'member_count'] # @@ -475,27 +366,24 @@ class Meta: exclude_fields=('powerfeed_count',), ) class NestedPowerPanelSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail') powerfeed_count = RelatedObjectCountField('powerfeeds') class Meta: model = models.PowerPanel - fields = ['id', 'url', 'display', 'name', 'powerfeed_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'powerfeed_count'] class NestedPowerFeedSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerfeed-detail') _occupied = serializers.BooleanField(required=False, read_only=True) class Meta: model = models.PowerFeed - fields = ['id', 'url', 'display', 'name', 'cable', '_occupied'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'cable', '_occupied'] class NestedVirtualDeviceContextSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualdevicecontext-detail') device = NestedDeviceSerializer() class Meta: model = models.VirtualDeviceContext - fields = ['id', 'url', 'display', 'name', 'identifier', 'device'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'identifier', 'device'] diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 4f8bbac176..30aa2e1a0a 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -11,4 +11,3 @@ from .serializers_.device_components import * from .serializers_.power import * from .serializers_.rackunits import * -from .nested_serializers import * diff --git a/netbox/dcim/api/serializers_/cables.py b/netbox/dcim/api/serializers_/cables.py index 809a07d2c5..397e5cd169 100644 --- a/netbox/dcim/api/serializers_/cables.py +++ b/netbox/dcim/api/serializers_/cables.py @@ -7,7 +7,7 @@ from dcim.constants import * from dcim.models import Cable, CablePath, CableTermination from netbox.api.fields import ChoiceField, ContentTypeField -from netbox.api.serializers import GenericObjectSerializer, NetBoxModelSerializer +from netbox.api.serializers import BaseModelSerializer, GenericObjectSerializer, NetBoxModelSerializer from tenancy.api.serializers_.tenants import TenantSerializer from utilities.api import get_serializer_for_model @@ -21,7 +21,6 @@ class CableSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') a_terminations = GenericObjectSerializer(many=True, required=False) b_terminations = GenericObjectSerializer(many=True, required=False) status = ChoiceField(choices=LinkStatusChoices, required=False) @@ -31,27 +30,26 @@ class CableSerializer(NetBoxModelSerializer): class Meta: model = Cable fields = [ - 'id', 'url', 'display', 'type', 'a_terminations', 'b_terminations', 'status', 'tenant', 'label', 'color', - 'length', 'length_unit', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'type', 'a_terminations', 'b_terminations', 'status', 'tenant', + 'label', 'color', 'length', 'length_unit', 'description', 'comments', 'tags', 'custom_fields', 'created', + 'last_updated', ] brief_fields = ('id', 'url', 'display', 'label', 'description') -class TracedCableSerializer(serializers.ModelSerializer): +class TracedCableSerializer(BaseModelSerializer): """ Used only while tracing a cable path. """ - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail') class Meta: model = Cable fields = [ - 'id', 'url', 'type', 'status', 'label', 'color', 'length', 'length_unit', 'description', + 'id', 'url', 'display_url', 'type', 'status', 'label', 'color', 'length', 'length_unit', 'description', ] class CableTerminationSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cabletermination-detail') termination_type = ContentTypeField( queryset=ContentType.objects.filter(CABLE_TERMINATION_MODELS) ) @@ -60,8 +58,8 @@ class CableTerminationSerializer(NetBoxModelSerializer): class Meta: model = CableTermination fields = [ - 'id', 'url', 'display', 'cable', 'cable_end', 'termination_type', 'termination_id', 'termination', - 'created', 'last_updated', + 'id', 'url', 'display', 'cable', 'cable_end', 'termination_type', 'termination_id', + 'termination', 'created', 'last_updated', ] @extend_schema_field(serializers.JSONField(allow_null=True)) diff --git a/netbox/dcim/api/serializers_/device_components.py b/netbox/dcim/api/serializers_/device_components.py index fd32d95d0c..60d6561dfc 100644 --- a/netbox/dcim/api/serializers_/device_components.py +++ b/netbox/dcim/api/serializers_/device_components.py @@ -15,7 +15,7 @@ from netbox.api.serializers import NetBoxModelSerializer, WritableNestedSerializer from utilities.api import get_serializer_for_model from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer -from wireless.api.nested_serializers import NestedWirelessLinkSerializer +from wireless.api.serializers_.nested import NestedWirelessLinkSerializer from wireless.api.serializers_.wirelesslans import WirelessLANSerializer from wireless.choices import * from wireless.models import WirelessLAN @@ -23,8 +23,8 @@ from .cables import CabledObjectSerializer from .devices import DeviceSerializer, ModuleSerializer, VirtualDeviceContextSerializer from .manufacturers import ManufacturerSerializer +from .nested import NestedInterfaceSerializer from .roles import InventoryItemRoleSerializer -from ..nested_serializers import * __all__ = ( 'ConsolePortSerializer', @@ -41,7 +41,6 @@ class ConsoleServerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -63,7 +62,7 @@ class ConsoleServerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, class Meta: model = ConsoleServerPort fields = [ - 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'speed', 'description', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'speed', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', @@ -72,7 +71,6 @@ class Meta: class ConsolePortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -94,7 +92,7 @@ class ConsolePortSerializer(NetBoxModelSerializer, CabledObjectSerializer, Conne class Meta: model = ConsolePort fields = [ - 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'speed', 'description', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'speed', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', @@ -103,7 +101,6 @@ class Meta: class PowerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -121,8 +118,8 @@ class PowerPortSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect class Meta: model = PowerPort fields = [ - 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', - 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'maximum_draw', + 'allocated_draw', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] @@ -130,7 +127,6 @@ class Meta: class PowerOutletSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -159,8 +155,8 @@ class PowerOutletSerializer(NetBoxModelSerializer, CabledObjectSerializer, Conne class Meta: model = PowerOutlet fields = [ - 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'power_port', 'feed_leg', - 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'power_port', + 'feed_leg', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] @@ -168,7 +164,6 @@ class Meta: class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail') device = DeviceSerializer(nested=True) vdcs = SerializedPKRelatedField( queryset=VirtualDeviceContext.objects.all(), @@ -224,11 +219,11 @@ class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect class Meta: model = Interface fields = [ - 'id', 'url', 'display', 'device', 'vdcs', 'module', 'name', 'label', 'type', 'enabled', 'parent', 'bridge', - 'lag', 'mtu', 'mac_address', 'speed', 'duplex', 'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', - 'rf_channel', 'poe_mode', 'poe_type', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', - 'untagged_vlan', 'tagged_vlans', 'mark_connected', 'cable', 'cable_end', 'wireless_link', 'link_peers', - 'link_peers_type', 'wireless_lans', 'vrf', 'l2vpn_termination', 'connected_endpoints', + 'id', 'url', 'display_url', 'display', 'device', 'vdcs', 'module', 'name', 'label', 'type', 'enabled', + 'parent', 'bridge', 'lag', 'mtu', 'mac_address', 'speed', 'duplex', 'wwn', 'mgmt_only', 'description', + 'mode', 'rf_role', 'rf_channel', 'poe_mode', 'poe_type', 'rf_channel_frequency', 'rf_channel_width', + 'tx_power', 'untagged_vlan', 'tagged_vlans', 'mark_connected', 'cable', 'cable_end', 'wireless_link', + 'link_peers', 'link_peers_type', 'wireless_lans', 'vrf', 'l2vpn_termination', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', '_occupied', ] @@ -250,7 +245,6 @@ def validate(self, data): class RearPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -263,9 +257,9 @@ class RearPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): class Meta: model = RearPort fields = [ - 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'color', 'positions', 'description', - 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'tags', 'custom_fields', 'created', - 'last_updated', '_occupied', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'color', 'positions', + 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'tags', + 'custom_fields', 'created', 'last_updated', '_occupied', ] brief_fields = ('id', 'url', 'display', 'device', 'name', 'description', 'cable', '_occupied') @@ -274,15 +268,13 @@ class FrontPortRearPortSerializer(WritableNestedSerializer): """ NestedRearPortSerializer but with parent device omitted (since front and rear ports must belong to same device) """ - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail') class Meta: model = RearPort - fields = ['id', 'url', 'display', 'name', 'label', 'description'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'label', 'description'] class FrontPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontport-detail') device = DeviceSerializer(nested=True) module = ModuleSerializer( nested=True, @@ -296,7 +288,7 @@ class FrontPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): class Meta: model = FrontPort fields = [ - 'id', 'url', 'display', 'device', 'module', 'name', 'label', 'type', 'color', 'rear_port', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'label', 'type', 'color', 'rear_port', 'rear_port_position', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] @@ -304,8 +296,14 @@ class Meta: class ModuleBaySerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail') device = DeviceSerializer(nested=True) + module = ModuleSerializer( + nested=True, + fields=('id', 'url', 'display'), + required=False, + allow_null=True, + default=None + ) installed_module = ModuleSerializer( nested=True, fields=('id', 'url', 'display', 'serial', 'description'), @@ -316,28 +314,26 @@ class ModuleBaySerializer(NetBoxModelSerializer): class Meta: model = ModuleBay fields = [ - 'id', 'url', 'display', 'device', 'name', 'installed_module', 'label', 'position', 'description', 'tags', - 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device', 'module', 'name', 'installed_module', 'label', 'position', + 'description', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'installed_module', 'name', 'description') class DeviceBaySerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail') device = DeviceSerializer(nested=True) installed_device = DeviceSerializer(nested=True, required=False, allow_null=True) class Meta: model = DeviceBay fields = [ - 'id', 'url', 'display', 'device', 'name', 'label', 'description', 'installed_device', 'tags', - 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device', 'name', 'label', 'description', 'installed_device', + 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'device', 'name', 'description') class InventoryItemSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitem-detail') device = DeviceSerializer(nested=True) parent = serializers.PrimaryKeyRelatedField(queryset=InventoryItem.objects.all(), allow_null=True, default=None) role = InventoryItemRoleSerializer(nested=True, required=False, allow_null=True) @@ -353,9 +349,9 @@ class InventoryItemSerializer(NetBoxModelSerializer): class Meta: model = InventoryItem fields = [ - 'id', 'url', 'display', 'device', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', 'serial', - 'asset_tag', 'discovered', 'description', 'component_type', 'component_id', 'component', 'tags', - 'custom_fields', 'created', 'last_updated', '_depth', + 'id', 'url', 'display_url', 'display', 'device', 'parent', 'name', 'label', 'role', 'manufacturer', + 'part_id', 'serial', 'asset_tag', 'discovered', 'description', 'component_type', 'component_id', + 'component', 'tags', 'custom_fields', 'created', 'last_updated', '_depth', ] brief_fields = ('id', 'url', 'display', 'device', 'name', 'description', '_depth') diff --git a/netbox/dcim/api/serializers_/devices.py b/netbox/dcim/api/serializers_/devices.py index f46b26b033..7a01b49e81 100644 --- a/netbox/dcim/api/serializers_/devices.py +++ b/netbox/dcim/api/serializers_/devices.py @@ -16,9 +16,9 @@ from .platforms import PlatformSerializer from .racks import RackSerializer from .roles import DeviceRoleSerializer +from .nested import NestedDeviceBaySerializer, NestedDeviceSerializer, NestedModuleBaySerializer from .sites import LocationSerializer, SiteSerializer from .virtualchassis import VirtualChassisSerializer -from ..nested_serializers import * __all__ = ( 'DeviceSerializer', @@ -29,7 +29,6 @@ class DeviceSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail') device_type = DeviceTypeSerializer(nested=True) role = DeviceRoleSerializer(nested=True) tenant = TenantSerializer( @@ -78,13 +77,13 @@ class DeviceSerializer(NetBoxModelSerializer): class Meta: model = Device fields = [ - 'id', 'url', 'display', 'name', 'device_type', 'role', 'tenant', 'platform', 'serial', 'asset_tag', 'site', - 'location', 'rack', 'position', 'face', 'latitude', 'longitude', 'parent_device', 'status', 'airflow', - 'primary_ip', 'primary_ip4', 'primary_ip6', 'oob_ip', 'cluster', 'virtual_chassis', 'vc_position', - 'vc_priority', 'description', 'comments', 'config_template', 'local_context_data', 'tags', 'custom_fields', - 'created', 'last_updated', 'console_port_count', 'console_server_port_count', 'power_port_count', - 'power_outlet_count', 'interface_count', 'front_port_count', 'rear_port_count', 'device_bay_count', - 'module_bay_count', 'inventory_item_count', + 'id', 'url', 'display_url', 'display', 'name', 'device_type', 'role', 'tenant', 'platform', 'serial', + 'asset_tag', 'site', 'location', 'rack', 'position', 'face', 'latitude', 'longitude', 'parent_device', + 'status', 'airflow', 'primary_ip', 'primary_ip4', 'primary_ip6', 'oob_ip', 'cluster', 'virtual_chassis', + 'vc_position', 'vc_priority', 'description', 'comments', 'config_template', 'local_context_data', 'tags', + 'custom_fields', 'created', 'last_updated', 'console_port_count', 'console_server_port_count', + 'power_port_count', 'power_outlet_count', 'interface_count', 'front_port_count', 'rear_port_count', + 'device_bay_count', 'module_bay_count', 'inventory_item_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description') @@ -105,13 +104,13 @@ class DeviceWithConfigContextSerializer(DeviceSerializer): class Meta(DeviceSerializer.Meta): fields = [ - 'id', 'url', 'display', 'name', 'device_type', 'role', 'tenant', 'platform', 'serial', 'asset_tag', 'site', - 'location', 'rack', 'position', 'face', 'latitude', 'longitude', 'parent_device', 'status', 'airflow', - 'primary_ip', 'primary_ip4', 'primary_ip6', 'oob_ip', 'cluster', 'virtual_chassis', 'vc_position', - 'vc_priority', 'description', 'comments', 'config_template', 'config_context', 'local_context_data', 'tags', - 'custom_fields', 'created', 'last_updated', 'console_port_count', 'console_server_port_count', - 'power_port_count', 'power_outlet_count', 'interface_count', 'front_port_count', 'rear_port_count', - 'device_bay_count', 'module_bay_count', 'inventory_item_count', + 'id', 'url', 'display_url', 'display', 'name', 'device_type', 'role', 'tenant', 'platform', 'serial', + 'asset_tag', 'site', 'location', 'rack', 'position', 'face', 'latitude', 'longitude', 'parent_device', + 'status', 'airflow', 'primary_ip', 'primary_ip4', 'primary_ip6', 'oob_ip', 'cluster', 'virtual_chassis', + 'vc_position', 'vc_priority', 'description', 'comments', 'config_template', 'config_context', + 'local_context_data', 'tags', 'custom_fields', 'created', 'last_updated', 'console_port_count', + 'console_server_port_count', 'power_port_count', 'power_outlet_count', 'interface_count', + 'front_port_count', 'rear_port_count', 'device_bay_count', 'module_bay_count', 'inventory_item_count', ] @extend_schema_field(serializers.JSONField(allow_null=True)) @@ -120,7 +119,6 @@ def get_config_context(self, obj): class VirtualDeviceContextSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualdevicecontext-detail') device = DeviceSerializer(nested=True) identifier = serializers.IntegerField(allow_null=True, max_value=32767, min_value=0, required=False, default=None) tenant = TenantSerializer(nested=True, required=False, allow_null=True, default=None) @@ -135,15 +133,14 @@ class VirtualDeviceContextSerializer(NetBoxModelSerializer): class Meta: model = VirtualDeviceContext fields = [ - 'id', 'url', 'display', 'name', 'device', 'identifier', 'tenant', 'primary_ip', 'primary_ip4', - 'primary_ip6', 'status', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', - 'interface_count', + 'id', 'url', 'display_url', 'display', 'name', 'device', 'identifier', 'tenant', 'primary_ip', + 'primary_ip4', 'primary_ip6', 'status', 'description', 'comments', 'tags', 'custom_fields', + 'created', 'last_updated', 'interface_count', ] brief_fields = ('id', 'url', 'display', 'name', 'identifier', 'device', 'description') class ModuleSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail') device = DeviceSerializer(nested=True) module_bay = NestedModuleBaySerializer() module_type = ModuleTypeSerializer(nested=True) @@ -152,7 +149,7 @@ class ModuleSerializer(NetBoxModelSerializer): class Meta: model = Module fields = [ - 'id', 'url', 'display', 'device', 'module_bay', 'module_type', 'status', 'serial', 'asset_tag', - 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device', 'module_bay', 'module_type', 'status', 'serial', + 'asset_tag', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'device', 'module_bay', 'module_type', 'description') diff --git a/netbox/dcim/api/serializers_/devicetype_components.py b/netbox/dcim/api/serializers_/devicetype_components.py index ca737ce38f..04f6395a6d 100644 --- a/netbox/dcim/api/serializers_/devicetype_components.py +++ b/netbox/dcim/api/serializers_/devicetype_components.py @@ -14,8 +14,8 @@ from wireless.choices import * from .devicetypes import DeviceTypeSerializer, ModuleTypeSerializer from .manufacturers import ManufacturerSerializer +from .nested import NestedInterfaceTemplateSerializer from .roles import InventoryItemRoleSerializer -from ..nested_serializers import * __all__ = ( 'ConsolePortTemplateSerializer', @@ -32,7 +32,6 @@ class ConsolePortTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleporttemplate-detail') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -54,14 +53,13 @@ class ConsolePortTemplateSerializer(ValidatedModelSerializer): class Meta: model = ConsolePortTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'description', 'created', - 'last_updated', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', + 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class ConsoleServerPortTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverporttemplate-detail') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -83,14 +81,13 @@ class ConsoleServerPortTemplateSerializer(ValidatedModelSerializer): class Meta: model = ConsoleServerPortTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'description', 'created', - 'last_updated', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', + 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class PowerPortTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerporttemplate-detail') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -113,14 +110,13 @@ class PowerPortTemplateSerializer(ValidatedModelSerializer): class Meta: model = PowerPortTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'maximum_draw', - 'allocated_draw', 'description', 'created', 'last_updated', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', + 'maximum_draw', 'allocated_draw', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class PowerOutletTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlettemplate-detail') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -154,14 +150,13 @@ class PowerOutletTemplateSerializer(ValidatedModelSerializer): class Meta: model = PowerOutletTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'power_port', 'feed_leg', - 'description', 'created', 'last_updated', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', + 'power_port', 'feed_leg', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class InterfaceTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfacetemplate-detail') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -201,14 +196,13 @@ class InterfaceTemplateSerializer(ValidatedModelSerializer): class Meta: model = InterfaceTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'enabled', 'mgmt_only', - 'description', 'bridge', 'poe_mode', 'poe_type', 'rf_role', 'created', 'last_updated', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'enabled', + 'mgmt_only', 'description', 'bridge', 'poe_mode', 'poe_type', 'rf_role', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class RearPortTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail') device_type = DeviceTypeSerializer( required=False, nested=True, @@ -226,14 +220,13 @@ class RearPortTemplateSerializer(ValidatedModelSerializer): class Meta: model = RearPortTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'color', 'positions', - 'description', 'created', 'last_updated', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'color', + 'positions', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class FrontPortTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontporttemplate-detail') device_type = DeviceTypeSerializer( nested=True, required=False, @@ -252,41 +245,50 @@ class FrontPortTemplateSerializer(ValidatedModelSerializer): class Meta: model = FrontPortTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'color', 'rear_port', - 'rear_port_position', 'description', 'created', 'last_updated', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'type', 'color', + 'rear_port', 'rear_port_position', 'description', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class ModuleBayTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebaytemplate-detail') device_type = DeviceTypeSerializer( - nested=True + nested=True, + required=False, + allow_null=True, + default=None + ) + module_type = ModuleTypeSerializer( + nested=True, + required=False, + allow_null=True, + default=None ) class Meta: model = ModuleBayTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'name', 'label', 'position', 'description', 'created', - 'last_updated', + 'id', 'url', 'display', 'device_type', 'module_type', 'name', 'label', 'position', 'description', + 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class DeviceBayTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebaytemplate-detail') device_type = DeviceTypeSerializer( nested=True ) class Meta: model = DeviceBayTemplate - fields = ['id', 'url', 'display', 'device_type', 'name', 'label', 'description', 'created', 'last_updated'] + fields = [ + 'id', 'url', 'display', 'device_type', 'name', 'label', 'description', + 'created', 'last_updated' + ] brief_fields = ('id', 'url', 'display', 'name', 'description') class InventoryItemTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemtemplate-detail') device_type = DeviceTypeSerializer( nested=True ) @@ -313,8 +315,9 @@ class InventoryItemTemplateSerializer(ValidatedModelSerializer): class Meta: model = InventoryItemTemplate fields = [ - 'id', 'url', 'display', 'device_type', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', - 'description', 'component_type', 'component_id', 'component', 'created', 'last_updated', '_depth', + 'id', 'url', 'display', 'device_type', 'parent', 'name', 'label', 'role', 'manufacturer', + 'part_id', 'description', 'component_type', 'component_id', 'component', 'created', 'last_updated', + '_depth', ] brief_fields = ('id', 'url', 'display', 'name', 'description', '_depth') diff --git a/netbox/dcim/api/serializers_/devicetypes.py b/netbox/dcim/api/serializers_/devicetypes.py index a5830fa90a..cda7388628 100644 --- a/netbox/dcim/api/serializers_/devicetypes.py +++ b/netbox/dcim/api/serializers_/devicetypes.py @@ -17,7 +17,6 @@ class DeviceTypeSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail') manufacturer = ManufacturerSerializer(nested=True) default_platform = PlatformSerializer(nested=True, required=False, allow_null=True) u_height = serializers.DecimalField( @@ -51,26 +50,39 @@ class DeviceTypeSerializer(NetBoxModelSerializer): class Meta: model = DeviceType fields = [ - 'id', 'url', 'display', 'manufacturer', 'default_platform', 'model', 'slug', 'part_number', 'u_height', - 'exclude_from_utilization', 'is_full_depth', 'subdevice_role', 'airflow', 'weight', 'weight_unit', - 'front_image', 'rear_image', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', - 'device_count', 'console_port_template_count', 'console_server_port_template_count', - 'power_port_template_count', 'power_outlet_template_count', 'interface_template_count', - 'front_port_template_count', 'rear_port_template_count', 'device_bay_template_count', - 'module_bay_template_count', 'inventory_item_template_count', + 'id', 'url', 'display_url', 'display', 'manufacturer', 'default_platform', 'model', 'slug', 'part_number', + 'u_height', 'exclude_from_utilization', 'is_full_depth', 'subdevice_role', 'airflow', 'weight', + 'weight_unit', 'front_image', 'rear_image', 'description', 'comments', 'tags', 'custom_fields', + 'created', 'last_updated', 'device_count', 'console_port_template_count', + 'console_server_port_template_count', 'power_port_template_count', 'power_outlet_template_count', + 'interface_template_count', 'front_port_template_count', 'rear_port_template_count', + 'device_bay_template_count', 'module_bay_template_count', 'inventory_item_template_count', ] brief_fields = ('id', 'url', 'display', 'manufacturer', 'model', 'slug', 'description', 'device_count') class ModuleTypeSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:moduletype-detail') - manufacturer = ManufacturerSerializer(nested=True) - weight_unit = ChoiceField(choices=WeightUnitChoices, allow_blank=True, required=False, allow_null=True) + manufacturer = ManufacturerSerializer( + nested=True + ) + weight_unit = ChoiceField( + choices=WeightUnitChoices, + allow_blank=True, + required=False, + allow_null=True + ) + airflow = ChoiceField( + choices=ModuleAirflowChoices, + allow_blank=True, + required=False, + allow_null=True + ) class Meta: model = ModuleType fields = [ - 'id', 'url', 'display', 'manufacturer', 'model', 'part_number', 'weight', 'weight_unit', 'description', - 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'manufacturer', 'model', 'part_number', 'airflow', + 'weight', 'weight_unit', 'description', 'comments', 'tags', 'custom_fields', + 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'manufacturer', 'model', 'description') diff --git a/netbox/dcim/api/serializers_/manufacturers.py b/netbox/dcim/api/serializers_/manufacturers.py index fd50fe97d7..61158e0f75 100644 --- a/netbox/dcim/api/serializers_/manufacturers.py +++ b/netbox/dcim/api/serializers_/manufacturers.py @@ -10,7 +10,6 @@ class ManufacturerSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail') # Related object counts devicetype_count = RelatedObjectCountField('device_types') @@ -20,7 +19,7 @@ class ManufacturerSerializer(NetBoxModelSerializer): class Meta: model = Manufacturer fields = [ - 'id', 'url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', 'created', 'last_updated', - 'devicetype_count', 'inventoryitem_count', 'platform_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'devicetype_count', 'inventoryitem_count', 'platform_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'devicetype_count') diff --git a/netbox/dcim/api/serializers_/nested.py b/netbox/dcim/api/serializers_/nested.py new file mode 100644 index 0000000000..bcf74319f9 --- /dev/null +++ b/netbox/dcim/api/serializers_/nested.py @@ -0,0 +1,97 @@ +from drf_spectacular.utils import extend_schema_serializer +from rest_framework import serializers + +from netbox.api.serializers import WritableNestedSerializer +from dcim import models + +__all__ = ( + 'NestedDeviceBaySerializer', + 'NestedDeviceSerializer', + 'NestedInterfaceSerializer', + 'NestedInterfaceTemplateSerializer', + 'NestedLocationSerializer', + 'NestedModuleBaySerializer', + 'NestedRegionSerializer', + 'NestedSiteGroupSerializer', +) + + +@extend_schema_serializer( + exclude_fields=('site_count',), +) +class NestedRegionSerializer(WritableNestedSerializer): + site_count = serializers.IntegerField(read_only=True) + _depth = serializers.IntegerField(source='level', read_only=True) + + class Meta: + model = models.Region + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'site_count', '_depth'] + + +@extend_schema_serializer( + exclude_fields=('site_count',), +) +class NestedSiteGroupSerializer(WritableNestedSerializer): + site_count = serializers.IntegerField(read_only=True) + _depth = serializers.IntegerField(source='level', read_only=True) + + class Meta: + model = models.SiteGroup + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'site_count', '_depth'] + + +@extend_schema_serializer( + exclude_fields=('rack_count',), +) +class NestedLocationSerializer(WritableNestedSerializer): + rack_count = serializers.IntegerField(read_only=True) + _depth = serializers.IntegerField(source='level', read_only=True) + + class Meta: + model = models.Location + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'rack_count', '_depth'] + + +class NestedDeviceSerializer(WritableNestedSerializer): + + class Meta: + model = models.Device + fields = ['id', 'url', 'display_url', 'display', 'name'] + + +class NestedInterfaceSerializer(WritableNestedSerializer): + device = NestedDeviceSerializer(read_only=True) + _occupied = serializers.BooleanField(required=False, read_only=True) + + class Meta: + model = models.Interface + fields = ['id', 'url', 'display_url', 'display', 'device', 'name', 'cable', '_occupied'] + + +class NestedInterfaceTemplateSerializer(WritableNestedSerializer): + + class Meta: + model = models.InterfaceTemplate + fields = ['id', 'url', 'display_url', 'display', 'name'] + + +class NestedDeviceBaySerializer(WritableNestedSerializer): + device = NestedDeviceSerializer(read_only=True) + + class Meta: + model = models.DeviceBay + fields = ['id', 'url', 'display_url', 'display', 'device', 'name'] + + +class ModuleBayNestedModuleSerializer(WritableNestedSerializer): + + class Meta: + model = models.Module + fields = ['id', 'url', 'display_url', 'display', 'serial'] + + +class NestedModuleBaySerializer(WritableNestedSerializer): + + class Meta: + model = models.ModuleBay + fields = ['id', 'url', 'display_url', 'display', 'name'] diff --git a/netbox/dcim/api/serializers_/platforms.py b/netbox/dcim/api/serializers_/platforms.py index 7365404eb4..3c846f8fd1 100644 --- a/netbox/dcim/api/serializers_/platforms.py +++ b/netbox/dcim/api/serializers_/platforms.py @@ -12,7 +12,6 @@ class PlatformSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail') manufacturer = ManufacturerSerializer(nested=True, required=False, allow_null=True) config_template = ConfigTemplateSerializer(nested=True, required=False, allow_null=True, default=None) @@ -23,7 +22,7 @@ class PlatformSerializer(NetBoxModelSerializer): class Meta: model = Platform fields = [ - 'id', 'url', 'display', 'name', 'slug', 'manufacturer', 'config_template', 'description', 'tags', - 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'manufacturer', 'config_template', 'description', + 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'device_count', 'virtualmachine_count') diff --git a/netbox/dcim/api/serializers_/power.py b/netbox/dcim/api/serializers_/power.py index dddd54906e..fc65a0732f 100644 --- a/netbox/dcim/api/serializers_/power.py +++ b/netbox/dcim/api/serializers_/power.py @@ -17,7 +17,6 @@ class PowerPanelSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail') site = SiteSerializer(nested=True) location = LocationSerializer( nested=True, @@ -32,14 +31,13 @@ class PowerPanelSerializer(NetBoxModelSerializer): class Meta: model = PowerPanel fields = [ - 'id', 'url', 'display', 'site', 'location', 'name', 'description', 'comments', 'tags', 'custom_fields', - 'powerfeed_count', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'site', 'location', 'name', 'description', 'comments', 'tags', + 'custom_fields', 'powerfeed_count', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'powerfeed_count') class PowerFeedSerializer(NetBoxModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerfeed-detail') power_panel = PowerPanelSerializer(nested=True) rack = RackSerializer( nested=True, @@ -72,9 +70,9 @@ class PowerFeedSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect class Meta: model = PowerFeed fields = [ - 'id', 'url', 'display', 'power_panel', 'rack', 'name', 'status', 'type', 'supply', 'phase', 'voltage', - 'amperage', 'max_utilization', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', - 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'description', - 'tenant', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', + 'id', 'url', 'display_url', 'display', 'power_panel', 'rack', 'name', 'status', 'type', 'supply', + 'phase', 'voltage', 'amperage', 'max_utilization', 'mark_connected', 'cable', 'cable_end', 'link_peers', + 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', + 'description', 'tenant', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'cable', '_occupied') diff --git a/netbox/dcim/api/serializers_/racks.py b/netbox/dcim/api/serializers_/racks.py index a6754cba00..ee76b09ce0 100644 --- a/netbox/dcim/api/serializers_/racks.py +++ b/netbox/dcim/api/serializers_/racks.py @@ -3,12 +3,13 @@ from dcim.choices import * from dcim.constants import * -from dcim.models import Rack, RackReservation, RackRole +from dcim.models import Rack, RackReservation, RackRole, RackType from netbox.api.fields import ChoiceField, RelatedObjectCountField from netbox.api.serializers import NetBoxModelSerializer from netbox.config import ConfigItem from tenancy.api.serializers_.tenants import TenantSerializer from users.api.serializers_.users import UserSerializer +from .manufacturers import ManufacturerSerializer from .sites import LocationSerializer, SiteSerializer __all__ = ( @@ -16,11 +17,11 @@ 'RackReservationSerializer', 'RackRoleSerializer', 'RackSerializer', + 'RackTypeSerializer', ) class RackRoleSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail') # Related object counts rack_count = RelatedObjectCountField('racks') @@ -28,25 +29,95 @@ class RackRoleSerializer(NetBoxModelSerializer): class Meta: model = RackRole fields = [ - 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'rack_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'rack_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'rack_count') -class RackSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail') - site = SiteSerializer(nested=True) - location = LocationSerializer(nested=True, required=False, allow_null=True, default=None) - tenant = TenantSerializer(nested=True, required=False, allow_null=True) - status = ChoiceField(choices=RackStatusChoices, required=False) - role = RackRoleSerializer(nested=True, required=False, allow_null=True) - type = ChoiceField(choices=RackTypeChoices, allow_blank=True, required=False, allow_null=True) - facility_id = serializers.CharField(max_length=50, allow_blank=True, allow_null=True, label=_('Facility ID'), - default=None) - width = ChoiceField(choices=RackWidthChoices, required=False) - outer_unit = ChoiceField(choices=RackDimensionUnitChoices, allow_blank=True, required=False, allow_null=True) - weight_unit = ChoiceField(choices=WeightUnitChoices, allow_blank=True, required=False, allow_null=True) +class RackBaseSerializer(NetBoxModelSerializer): + form_factor = ChoiceField( + choices=RackFormFactorChoices, + allow_blank=True, + required=False, + allow_null=True + ) + width = ChoiceField( + choices=RackWidthChoices, + required=False + ) + outer_unit = ChoiceField( + choices=RackDimensionUnitChoices, + allow_blank=True, + required=False, + allow_null=True + ) + weight_unit = ChoiceField( + choices=WeightUnitChoices, + allow_blank=True, + required=False, + allow_null=True + ) + + +class RackTypeSerializer(RackBaseSerializer): + manufacturer = ManufacturerSerializer( + nested=True + ) + + class Meta: + model = RackType + fields = [ + 'id', 'url', 'display_url', 'display', 'manufacturer', 'model', 'slug', 'description', 'form_factor', + 'width', 'u_height', 'starting_unit', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'weight', + 'max_weight', 'weight_unit', 'mounting_depth', 'description', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', + ] + brief_fields = ('id', 'url', 'display', 'manufacturer', 'model', 'slug', 'description') + + +class RackSerializer(RackBaseSerializer): + site = SiteSerializer( + nested=True + ) + location = LocationSerializer( + nested=True, + required=False, + allow_null=True, + default=None + ) + tenant = TenantSerializer( + nested=True, + required=False, + allow_null=True + ) + status = ChoiceField( + choices=RackStatusChoices, + required=False + ) + airflow = ChoiceField( + choices=RackAirflowChoices, + allow_blank=True, + required=False + ) + role = RackRoleSerializer( + nested=True, + required=False, + allow_null=True + ) + facility_id = serializers.CharField( + max_length=50, + allow_blank=True, + allow_null=True, + label=_('Facility ID'), + default=None + ) + rack_type = RackTypeSerializer( + nested=True, + required=False, + allow_null=True, + default=None + ) # Related object counts device_count = RelatedObjectCountField('devices') @@ -55,16 +126,16 @@ class RackSerializer(NetBoxModelSerializer): class Meta: model = Rack fields = [ - 'id', 'url', 'display', 'name', 'facility_id', 'site', 'location', 'tenant', 'status', 'role', 'serial', - 'asset_tag', 'type', 'width', 'u_height', 'starting_unit', 'weight', 'max_weight', 'weight_unit', - 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth', 'description', 'comments', - 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', 'powerfeed_count', + 'id', 'url', 'display_url', 'display', 'name', 'facility_id', 'site', 'location', 'tenant', 'status', + 'role', 'serial', 'asset_tag', 'rack_type', 'form_factor', 'width', 'u_height', 'starting_unit', 'weight', + 'max_weight', 'weight_unit', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth', + 'airflow', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', + 'powerfeed_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'device_count') class RackReservationSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackreservation-detail') rack = RackSerializer(nested=True) user = UserSerializer(nested=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -72,8 +143,8 @@ class RackReservationSerializer(NetBoxModelSerializer): class Meta: model = RackReservation fields = [ - 'id', 'url', 'display', 'rack', 'units', 'created', 'last_updated', 'user', 'tenant', 'description', - 'comments', 'tags', 'custom_fields', + 'id', 'url', 'display_url', 'display', 'rack', 'units', 'created', 'last_updated', 'user', 'tenant', + 'description', 'comments', 'tags', 'custom_fields', ] brief_fields = ('id', 'url', 'display', 'user', 'description', 'units') diff --git a/netbox/dcim/api/serializers_/roles.py b/netbox/dcim/api/serializers_/roles.py index 41f8f377d8..e9c9d35639 100644 --- a/netbox/dcim/api/serializers_/roles.py +++ b/netbox/dcim/api/serializers_/roles.py @@ -12,7 +12,6 @@ class DeviceRoleSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail') config_template = ConfigTemplateSerializer(nested=True, required=False, allow_null=True, default=None) # Related object counts @@ -22,14 +21,13 @@ class DeviceRoleSerializer(NetBoxModelSerializer): class Meta: model = DeviceRole fields = [ - 'id', 'url', 'display', 'name', 'slug', 'color', 'vm_role', 'config_template', 'description', 'tags', - 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'vm_role', 'config_template', + 'description', 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'device_count', 'virtualmachine_count') class InventoryItemRoleSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitemrole-detail') # Related object counts inventoryitem_count = RelatedObjectCountField('inventory_items') @@ -37,7 +35,7 @@ class InventoryItemRoleSerializer(NetBoxModelSerializer): class Meta: model = InventoryItemRole fields = [ - 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'inventoryitem_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'inventoryitem_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'inventoryitem_count') diff --git a/netbox/dcim/api/serializers_/sites.py b/netbox/dcim/api/serializers_/sites.py index 60e1477e57..dc91f5dc76 100644 --- a/netbox/dcim/api/serializers_/sites.py +++ b/netbox/dcim/api/serializers_/sites.py @@ -8,7 +8,7 @@ from netbox.api.fields import ChoiceField, RelatedObjectCountField, SerializedPKRelatedField from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerializer from tenancy.api.serializers_.tenants import TenantSerializer -from ..nested_serializers import * +from .nested import NestedLocationSerializer, NestedRegionSerializer, NestedSiteGroupSerializer __all__ = ( 'LocationSerializer', @@ -19,35 +19,32 @@ class RegionSerializer(NestedGroupModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail') parent = NestedRegionSerializer(required=False, allow_null=True, default=None) site_count = serializers.IntegerField(read_only=True, default=0) class Meta: model = Region fields = [ - 'id', 'url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'site_count', '_depth', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'site_count', '_depth', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'site_count', '_depth') class SiteGroupSerializer(NestedGroupModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:sitegroup-detail') parent = NestedSiteGroupSerializer(required=False, allow_null=True, default=None) site_count = serializers.IntegerField(read_only=True, default=0) class Meta: model = SiteGroup fields = [ - 'id', 'url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'site_count', '_depth', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'parent', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'site_count', '_depth', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'site_count', '_depth') class SiteSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:site-detail') status = ChoiceField(choices=SiteStatusChoices, required=False) region = RegionSerializer(nested=True, required=False, allow_null=True) group = SiteGroupSerializer(nested=True, required=False, allow_null=True) @@ -72,16 +69,15 @@ class SiteSerializer(NetBoxModelSerializer): class Meta: model = Site fields = [ - 'id', 'url', 'display', 'name', 'slug', 'status', 'region', 'group', 'tenant', 'facility', 'time_zone', - 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'comments', 'asns', 'tags', - 'custom_fields', 'created', 'last_updated', 'circuit_count', 'device_count', 'prefix_count', 'rack_count', - 'virtualmachine_count', 'vlan_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'status', 'region', 'group', 'tenant', 'facility', + 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', + 'comments', 'asns', 'tags', 'custom_fields', 'created', 'last_updated', 'circuit_count', 'device_count', + 'prefix_count', 'rack_count', 'virtualmachine_count', 'vlan_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'slug') class LocationSerializer(NestedGroupModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:location-detail') site = SiteSerializer(nested=True) parent = NestedLocationSerializer(required=False, allow_null=True, default=None) status = ChoiceField(choices=LocationStatusChoices, required=False) @@ -92,7 +88,7 @@ class LocationSerializer(NestedGroupModelSerializer): class Meta: model = Location fields = [ - 'id', 'url', 'display', 'name', 'slug', 'site', 'parent', 'status', 'tenant', 'facility', 'description', - 'tags', 'custom_fields', 'created', 'last_updated', 'rack_count', 'device_count', '_depth', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'site', 'parent', 'status', 'tenant', 'facility', + 'description', 'tags', 'custom_fields', 'created', 'last_updated', 'rack_count', 'device_count', '_depth', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'rack_count', '_depth') diff --git a/netbox/dcim/api/serializers_/virtualchassis.py b/netbox/dcim/api/serializers_/virtualchassis.py index 5a5917119c..a93d2833f0 100644 --- a/netbox/dcim/api/serializers_/virtualchassis.py +++ b/netbox/dcim/api/serializers_/virtualchassis.py @@ -2,7 +2,7 @@ from dcim.models import VirtualChassis from netbox.api.serializers import NetBoxModelSerializer -from ..nested_serializers import * +from .nested import NestedDeviceSerializer __all__ = ( 'VirtualChassisSerializer', @@ -10,7 +10,6 @@ class VirtualChassisSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualchassis-detail') master = NestedDeviceSerializer(required=False, allow_null=True, default=None) members = NestedDeviceSerializer(many=True, read_only=True) @@ -20,7 +19,7 @@ class VirtualChassisSerializer(NetBoxModelSerializer): class Meta: model = VirtualChassis fields = [ - 'id', 'url', 'display', 'name', 'domain', 'master', 'description', 'comments', 'tags', 'custom_fields', - 'created', 'last_updated', 'member_count', 'members', + 'id', 'url', 'display_url', 'display', 'name', 'domain', 'master', 'description', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', 'member_count', 'members', ] brief_fields = ('id', 'url', 'display', 'name', 'master', 'description', 'member_count') diff --git a/netbox/dcim/api/urls.py b/netbox/dcim/api/urls.py index 36a0c99a59..d099b392a3 100644 --- a/netbox/dcim/api/urls.py +++ b/netbox/dcim/api/urls.py @@ -12,6 +12,7 @@ # Racks router.register('locations', views.LocationViewSet) +router.register('rack-types', views.RackTypeViewSet) router.register('rack-roles', views.RackRoleViewSet) router.register('racks', views.RackViewSet) router.register('rack-reservations', views.RackReservationViewSet) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index be7a9c3064..87aa7535c3 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -161,6 +161,16 @@ class RackRoleViewSet(NetBoxModelViewSet): filterset_class = filtersets.RackRoleFilterSet +# +# Rack Types +# + +class RackTypeViewSet(NetBoxModelViewSet): + queryset = RackType.objects.all() + serializer_class = serializers.RackTypeSerializer + filterset_class = filtersets.RackTypeFilterSet + + # # Racks # diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index 980c258c0b..d75b2f4896 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -51,7 +51,7 @@ class LocationStatusChoices(ChoiceSet): # Racks # -class RackTypeChoices(ChoiceSet): +class RackFormFactorChoices(ChoiceSet): TYPE_2POST = '2-post-frame' TYPE_4POST = '4-post-frame' @@ -127,6 +127,17 @@ class RackElevationDetailRenderChoices(ChoiceSet): ) +class RackAirflowChoices(ChoiceSet): + + FRONT_TO_REAR = 'front-to-rear' + REAR_TO_FRONT = 'rear-to-front' + + CHOICES = ( + (FRONT_TO_REAR, _('Front to rear')), + (REAR_TO_FRONT, _('Rear to front')), + ) + + # # DeviceTypes # @@ -224,6 +235,25 @@ class ModuleStatusChoices(ChoiceSet): ] +class ModuleAirflowChoices(ChoiceSet): + + FRONT_TO_REAR = 'front-to-rear' + REAR_TO_FRONT = 'rear-to-front' + LEFT_TO_RIGHT = 'left-to-right' + RIGHT_TO_LEFT = 'right-to-left' + SIDE_TO_REAR = 'side-to-rear' + PASSIVE = 'passive' + + CHOICES = ( + (FRONT_TO_REAR, _('Front to rear')), + (REAR_TO_FRONT, _('Rear to front')), + (LEFT_TO_RIGHT, _('Left to right')), + (RIGHT_TO_LEFT, _('Right to left')), + (SIDE_TO_REAR, _('Side to rear')), + (PASSIVE, _('Passive')), + ) + + # # ConsolePorts # diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index a69924753f..6517aadb45 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1,5 +1,4 @@ import django_filters -from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext as _ from drf_spectacular.types import OpenApiTypes @@ -16,6 +15,7 @@ ) from tenancy.filtersets import TenancyFilterSet, ContactModelFilterSet from tenancy.models import * +from users.models import User from utilities.filters import ( ContentTypeFilter, MultiValueCharFilter, MultiValueMACAddressFilter, MultiValueNumberFilter, MultiValueWWNFilter, NumericArrayFilter, TreeNodeMultipleChoiceFilter, @@ -69,6 +69,7 @@ 'RackFilterSet', 'RackReservationFilterSet', 'RackRoleFilterSet', + 'RackTypeFilterSet', 'RearPortFilterSet', 'RearPortTemplateFilterSet', 'RegionFilterSet', @@ -289,6 +290,41 @@ class Meta: fields = ('id', 'name', 'slug', 'color', 'description') +class RackTypeFilterSet(NetBoxModelFilterSet): + manufacturer_id = django_filters.ModelMultipleChoiceFilter( + queryset=Manufacturer.objects.all(), + label=_('Manufacturer (ID)'), + ) + manufacturer = django_filters.ModelMultipleChoiceFilter( + field_name='manufacturer__slug', + queryset=Manufacturer.objects.all(), + to_field_name='slug', + label=_('Manufacturer (slug)'), + ) + form_factor = django_filters.MultipleChoiceFilter( + choices=RackFormFactorChoices + ) + width = django_filters.MultipleChoiceFilter( + choices=RackWidthChoices + ) + + class Meta: + model = RackType + fields = ( + 'id', 'model', 'slug', 'u_height', 'starting_unit', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', + 'mounting_depth', 'weight', 'max_weight', 'weight_unit', 'description', + ) + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(model__icontains=value) | + Q(description__icontains=value) | + Q(comments__icontains=value) + ) + + class RackFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet): region_id = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), @@ -339,12 +375,33 @@ class RackFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSe to_field_name='slug', label=_('Location (slug)'), ) + manufacturer_id = django_filters.ModelMultipleChoiceFilter( + field_name='rack_type__manufacturer', + queryset=Manufacturer.objects.all(), + label=_('Manufacturer (ID)'), + ) + manufacturer = django_filters.ModelMultipleChoiceFilter( + field_name='rack_type__manufacturer__slug', + queryset=Manufacturer.objects.all(), + to_field_name='slug', + label=_('Manufacturer (slug)'), + ) + rack_type = django_filters.ModelMultipleChoiceFilter( + field_name='rack_type__slug', + queryset=RackType.objects.all(), + to_field_name='slug', + label=_('Rack type (slug)'), + ) + rack_type_id = django_filters.ModelMultipleChoiceFilter( + queryset=RackType.objects.all(), + label=_('Rack type (ID)'), + ) status = django_filters.MultipleChoiceFilter( choices=RackStatusChoices, null_value=None ) - type = django_filters.MultipleChoiceFilter( - choices=RackTypeChoices + form_factor = django_filters.MultipleChoiceFilter( + choices=RackFormFactorChoices ) width = django_filters.MultipleChoiceFilter( choices=RackWidthChoices @@ -367,7 +424,8 @@ class Meta: model = Rack fields = ( 'id', 'name', 'facility_id', 'asset_tag', 'u_height', 'starting_unit', 'desc_units', 'outer_width', - 'outer_depth', 'outer_unit', 'mounting_depth', 'weight', 'max_weight', 'weight_unit', 'description', + 'outer_depth', 'outer_unit', 'mounting_depth', 'airflow', 'weight', 'max_weight', 'weight_unit', + 'description', ) def search(self, queryset, name, value): @@ -439,12 +497,12 @@ class RackReservationFilterSet(NetBoxModelFilterSet, TenancyFilterSet): label=_('Location (slug)'), ) user_id = django_filters.ModelMultipleChoiceFilter( - queryset=get_user_model().objects.all(), + queryset=User.objects.all(), label=_('User (ID)'), ) user = django_filters.ModelMultipleChoiceFilter( field_name='user__username', - queryset=get_user_model().objects.all(), + queryset=User.objects.all(), to_field_name='username', label=_('User (name)'), ) @@ -652,7 +710,7 @@ class ModuleTypeFilterSet(NetBoxModelFilterSet): class Meta: model = ModuleType - fields = ('id', 'model', 'part_number', 'weight', 'weight_unit', 'description') + fields = ('id', 'model', 'part_number', 'airflow', 'weight', 'weight_unit', 'description') def search(self, queryset, name, value): if not value.strip(): @@ -698,9 +756,6 @@ class DeviceTypeComponentFilterSet(django_filters.FilterSet): label=_('Device type (ID)'), ) - # TODO: Remove in v4.1 - devicetype_id = device_type_id - def search(self, queryset, name, value): if not value.strip(): return queryset @@ -717,9 +772,6 @@ class ModularDeviceTypeComponentFilterSet(DeviceTypeComponentFilterSet): label=_('Module type (ID)'), ) - # TODO: Remove in v4.1 - moduletype_id = module_type_id - class ConsolePortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): @@ -806,7 +858,7 @@ class Meta: fields = ('id', 'name', 'label', 'type', 'color', 'positions', 'description') -class ModuleBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet): +class ModuleBayTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): class Meta: model = ModuleBayTemplate @@ -1270,11 +1322,11 @@ class ModuleFilterSet(NetBoxModelFilterSet): to_field_name='model', label=_('Module type (model)'), ) - module_bay_id = django_filters.ModelMultipleChoiceFilter( - field_name='module_bay', + module_bay_id = TreeNodeMultipleChoiceFilter( queryset=ModuleBay.objects.all(), - to_field_name='id', - label=_('Module Bay (ID)') + field_name='module_bay', + lookup_expr='in', + label=_('Module bay (ID)'), ) device_id = django_filters.ModelMultipleChoiceFilter( queryset=Device.objects.all(), @@ -1745,7 +1797,11 @@ class Meta: ) -class ModuleBayFilterSet(DeviceComponentFilterSet, NetBoxModelFilterSet): +class ModuleBayFilterSet(ModularDeviceComponentFilterSet, NetBoxModelFilterSet): + parent_id = django_filters.ModelMultipleChoiceFilter( + queryset=ModuleBay.objects.all(), + label=_('Parent module bay (ID)'), + ) installed_module_id = django_filters.ModelMultipleChoiceFilter( field_name='installed_module', queryset=ModuleBay.objects.all(), diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index bd9b68014a..96036f4da1 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -1,6 +1,5 @@ from django import forms from django.conf import settings -from django.contrib.auth import get_user_model from django.utils.translation import gettext_lazy as _ from timezone_field import TimeZoneFormField @@ -11,9 +10,10 @@ from ipam.models import ASN, VLAN, VLANGroup, VRF from netbox.forms import NetBoxModelBulkEditForm from tenancy.models import Tenant +from users.models import User from utilities.forms import BulkEditForm, add_blank_choice, form_from_model from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField -from utilities.forms.rendering import FieldSet +from utilities.forms.rendering import FieldSet, InlineFields from utilities.forms.widgets import BulkEditNullBooleanSelect, NumberWithOptions from wireless.models import WirelessLAN, WirelessLANGroup from wireless.choices import WirelessRoleChoices @@ -52,6 +52,7 @@ 'RackBulkEditForm', 'RackReservationBulkEditForm', 'RackRoleBulkEditForm', + 'RackTypeBulkEditForm', 'RearPortBulkEditForm', 'RearPortTemplateBulkEditForm', 'RegionBulkEditForm', @@ -218,6 +219,95 @@ class RackRoleBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('color', 'description') +class RackTypeBulkEditForm(NetBoxModelBulkEditForm): + manufacturer = DynamicModelChoiceField( + label=_('Manufacturer'), + queryset=Manufacturer.objects.all(), + required=False + ) + form_factor = forms.ChoiceField( + label=_('Form factor'), + choices=add_blank_choice(RackFormFactorChoices), + required=False + ) + width = forms.ChoiceField( + label=_('Width'), + choices=add_blank_choice(RackWidthChoices), + required=False + ) + u_height = forms.IntegerField( + required=False, + label=_('Height (U)') + ) + starting_unit = forms.IntegerField( + required=False, + min_value=1 + ) + desc_units = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect, + label=_('Descending units') + ) + outer_width = forms.IntegerField( + label=_('Outer width'), + required=False, + min_value=1 + ) + outer_depth = forms.IntegerField( + label=_('Outer depth'), + required=False, + min_value=1 + ) + outer_unit = forms.ChoiceField( + label=_('Outer unit'), + choices=add_blank_choice(RackDimensionUnitChoices), + required=False + ) + mounting_depth = forms.IntegerField( + label=_('Mounting depth'), + required=False, + min_value=1 + ) + weight = forms.DecimalField( + label=_('Weight'), + min_value=0, + required=False + ) + max_weight = forms.IntegerField( + label=_('Max weight'), + min_value=0, + required=False + ) + weight_unit = forms.ChoiceField( + label=_('Weight unit'), + choices=add_blank_choice(WeightUnitChoices), + required=False, + initial='' + ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + comments = CommentField() + + model = RackType + fieldsets = ( + FieldSet('manufacturer', 'description', 'form_factor', 'width', 'u_height', name=_('Rack Type')), + FieldSet( + InlineFields('outer_width', 'outer_depth', 'outer_unit', label=_('Outer Dimensions')), + InlineFields('weight', 'max_weight', 'weight_unit', label=_('Weight')), + 'mounting_depth', + name=_('Dimensions') + ), + FieldSet('starting_unit', 'desc_units', name=_('Numbering')), + ) + nullable_fields = ( + 'outer_width', 'outer_depth', 'outer_unit', 'weight', + 'max_weight', 'weight_unit', 'description', 'comments', + ) + + class RackBulkEditForm(NetBoxModelBulkEditForm): region = DynamicModelChoiceField( label=_('Region'), @@ -278,9 +368,9 @@ class RackBulkEditForm(NetBoxModelBulkEditForm): max_length=50, required=False ) - type = forms.ChoiceField( - label=_('Type'), - choices=add_blank_choice(RackTypeChoices), + form_factor = forms.ChoiceField( + label=_('Form factor'), + choices=add_blank_choice(RackFormFactorChoices), required=False ) width = forms.ChoiceField( @@ -317,6 +407,11 @@ class RackBulkEditForm(NetBoxModelBulkEditForm): required=False, min_value=1 ) + airflow = forms.ChoiceField( + label=_('Airflow'), + choices=add_blank_choice(RackAirflowChoices), + required=False + ) weight = forms.DecimalField( label=_('Weight'), min_value=0, @@ -345,8 +440,8 @@ class RackBulkEditForm(NetBoxModelBulkEditForm): FieldSet('status', 'role', 'tenant', 'serial', 'asset_tag', 'description', name=_('Rack')), FieldSet('region', 'site_group', 'site', 'location', name=_('Location')), FieldSet( - 'type', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth', - name=_('Hardware') + 'form_factor', 'width', 'u_height', 'desc_units', 'airflow', 'outer_width', 'outer_depth', 'outer_unit', + 'mounting_depth', name=_('Hardware') ), FieldSet('weight', 'max_weight', 'weight_unit', name=_('Weight')), ) @@ -359,9 +454,7 @@ class RackBulkEditForm(NetBoxModelBulkEditForm): class RackReservationBulkEditForm(NetBoxModelBulkEditForm): user = forms.ModelChoiceField( label=_('User'), - queryset=get_user_model().objects.order_by( - 'username' - ), + queryset=User.objects.order_by('username'), required=False ) tenant = DynamicModelChoiceField( @@ -471,6 +564,11 @@ class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): label=_('Part number'), required=False ) + airflow = forms.ChoiceField( + label=_('Airflow'), + choices=add_blank_choice(ModuleAirflowChoices), + required=False + ) weight = forms.DecimalField( label=_('Weight'), min_value=0, @@ -492,7 +590,11 @@ class ModuleTypeBulkEditForm(NetBoxModelBulkEditForm): model = ModuleType fieldsets = ( FieldSet('manufacturer', 'part_number', 'description', name=_('Module Type')), - FieldSet('weight', 'weight_unit', name=_('Weight')), + FieldSet( + 'airflow', + InlineFields('weight', 'max_weight', 'weight_unit', label=_('Weight')), + name=_('Chassis') + ), ) nullable_fields = ('part_number', 'weight', 'weight_unit', 'description', 'comments') diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index e49d14dd01..9b4a8475b7 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -45,6 +45,7 @@ 'RackImportForm', 'RackReservationImportForm', 'RackRoleImportForm', + 'RackTypeImportForm', 'RearPortImportForm', 'RegionImportForm', 'SiteImportForm', @@ -176,6 +177,54 @@ class Meta: fields = ('name', 'slug', 'color', 'description', 'tags') +class RackTypeImportForm(NetBoxModelImportForm): + manufacturer = forms.ModelChoiceField( + label=_('Manufacturer'), + queryset=Manufacturer.objects.all(), + to_field_name='name', + help_text=_('The manufacturer of this rack type') + ) + form_factor = CSVChoiceField( + label=_('Type'), + choices=RackFormFactorChoices, + required=False, + help_text=_('Form factor') + ) + starting_unit = forms.IntegerField( + required=False, + min_value=1, + help_text=_('The lowest-numbered position in the rack') + ) + width = forms.ChoiceField( + label=_('Width'), + choices=RackWidthChoices, + help_text=_('Rail-to-rail width (in inches)') + ) + outer_unit = CSVChoiceField( + label=_('Outer unit'), + choices=RackDimensionUnitChoices, + required=False, + help_text=_('Unit for outer dimensions') + ) + weight_unit = CSVChoiceField( + label=_('Weight unit'), + choices=WeightUnitChoices, + required=False, + help_text=_('Unit for rack weights') + ) + + class Meta: + model = RackType + fields = ( + 'manufacturer', 'model', 'slug', 'form_factor', 'width', 'u_height', 'starting_unit', 'desc_units', + 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth', 'weight', 'max_weight', + 'weight_unit', 'description', 'comments', 'tags', + ) + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + class RackImportForm(NetBoxModelImportForm): site = CSVModelChoiceField( label=_('Site'), @@ -207,11 +256,11 @@ class RackImportForm(NetBoxModelImportForm): to_field_name='name', help_text=_('Name of assigned role') ) - type = CSVChoiceField( + form_factor = CSVChoiceField( label=_('Type'), - choices=RackTypeChoices, + choices=RackFormFactorChoices, required=False, - help_text=_('Rack type') + help_text=_('Form factor') ) width = forms.ChoiceField( label=_('Width'), @@ -224,6 +273,12 @@ class RackImportForm(NetBoxModelImportForm): required=False, help_text=_('Unit for outer dimensions') ) + airflow = CSVChoiceField( + label=_('Airflow'), + choices=RackAirflowChoices, + required=False, + help_text=_('Airflow direction') + ) weight_unit = CSVChoiceField( label=_('Weight unit'), choices=WeightUnitChoices, @@ -234,9 +289,9 @@ class RackImportForm(NetBoxModelImportForm): class Meta: model = Rack fields = ( - 'site', 'location', 'name', 'facility_id', 'tenant', 'status', 'role', 'type', 'serial', 'asset_tag', - 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth', 'weight', - 'max_weight', 'weight_unit', 'description', 'comments', 'tags', + 'site', 'location', 'name', 'facility_id', 'tenant', 'status', 'role', 'form_factor', 'serial', 'asset_tag', + 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth', 'airflow', + 'weight', 'max_weight', 'weight_unit', 'description', 'comments', 'tags', ) def __init__(self, data=None, *args, **kwargs): @@ -351,6 +406,12 @@ class ModuleTypeImportForm(NetBoxModelImportForm): queryset=Manufacturer.objects.all(), to_field_name='name' ) + airflow = CSVChoiceField( + label=_('Airflow'), + choices=ModuleAirflowChoices, + required=False, + help_text=_('Airflow direction') + ) weight = forms.DecimalField( label=_('Weight'), required=False, @@ -365,7 +426,7 @@ class ModuleTypeImportForm(NetBoxModelImportForm): class Meta: model = ModuleType - fields = ['manufacturer', 'model', 'part_number', 'description', 'weight', 'weight_unit', 'comments', 'tags'] + fields = ['manufacturer', 'model', 'part_number', 'description', 'airflow', 'weight', 'weight_unit', 'comments', 'tags'] class DeviceRoleImportForm(NetBoxModelImportForm): diff --git a/netbox/dcim/forms/common.py b/netbox/dcim/forms/common.py index 3be4d08e8e..4341ec0411 100644 --- a/netbox/dcim/forms/common.py +++ b/netbox/dcim/forms/common.py @@ -70,6 +70,18 @@ def clean(self): class ModuleCommonForm(forms.Form): + def _get_module_bay_tree(self, module_bay): + module_bays = [] + while module_bay: + module_bays.append(module_bay) + if module_bay.module: + module_bay = module_bay.module.module_bay + else: + module_bay = None + + module_bays.reverse() + return module_bays + def clean(self): super().clean() @@ -88,6 +100,8 @@ def clean(self): self.instance._disable_replication = True return + module_bays = self._get_module_bay_tree(module_bay) + for templates, component_attribute in [ ("consoleporttemplates", "consoleports"), ("consoleserverporttemplates", "consoleserverports"), @@ -104,13 +118,24 @@ def clean(self): # Get the templates for the module type. for template in getattr(module_type, templates).all(): + resolved_name = template.name # Installing modules with placeholders require that the bay has a position value - if MODULE_TOKEN in template.name and not module_bay.position: - raise forms.ValidationError( - _("Cannot install module with placeholder values in a module bay with no position defined.") - ) + if MODULE_TOKEN in template.name: + if not module_bay.position: + raise forms.ValidationError( + _("Cannot install module with placeholder values in a module bay with no position defined.") + ) + + if len(module_bays) != template.name.count(MODULE_TOKEN): + raise forms.ValidationError( + _("Cannot install module with placeholder values in a module bay tree {level} in tree but {tokens} placeholders given.").format( + level=len(module_bays), tokens=template.name.count(MODULE_TOKEN) + ) + ) + + for module_bay in module_bays: + resolved_name = resolved_name.replace(MODULE_TOKEN, module_bay.position, 1) - resolved_name = template.name.replace(MODULE_TOKEN, module_bay.position) existing_item = installed_components.get(resolved_name) # It is not possible to adopt components already belonging to a module diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index dfe5a12fa4..e2b6fda07a 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -1,5 +1,4 @@ from django import forms -from django.contrib.auth import get_user_model from django.utils.translation import gettext_lazy as _ from dcim.choices import * @@ -10,6 +9,7 @@ from ipam.models import ASN, VRF from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import ContactModelFilterForm, TenancyFilterForm +from users.models import User from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.rendering import FieldSet @@ -48,6 +48,7 @@ 'RackElevationFilterForm', 'RackReservationFilterForm', 'RackRoleFilterForm', + 'RackTypeFilterForm', 'RearPortFilterForm', 'RegionFilterForm', 'SiteFilterForm', @@ -249,16 +250,82 @@ class RackRoleFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilterSetForm): +class RackBaseFilterForm(NetBoxModelFilterSetForm): + form_factor = forms.MultipleChoiceField( + label=_('Form factor'), + choices=RackFormFactorChoices, + required=False + ) + width = forms.MultipleChoiceField( + label=_('Width'), + choices=RackWidthChoices, + required=False + ) + u_height = forms.IntegerField( + required=False, + min_value=1 + ) + starting_unit = forms.IntegerField( + required=False, + min_value=1 + ) + desc_units = forms.NullBooleanField( + required=False, + label=_('Descending units'), + widget=forms.Select( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + airflow = forms.MultipleChoiceField( + label=_('Airflow'), + choices=add_blank_choice(RackAirflowChoices), + required=False + ) + weight = forms.DecimalField( + label=_('Weight'), + required=False, + min_value=1 + ) + max_weight = forms.IntegerField( + label=_('Max weight'), + required=False, + min_value=1 + ) + weight_unit = forms.ChoiceField( + label=_('Weight unit'), + choices=add_blank_choice(WeightUnitChoices), + required=False + ) + + +class RackTypeFilterForm(RackBaseFilterForm): + model = RackType + fieldsets = ( + FieldSet('q', 'filter_id', 'tag'), + FieldSet('form_factor', 'width', 'u_height', name=_('Rack Type')), + FieldSet('starting_unit', 'desc_units', name=_('Numbering')), + FieldSet('weight', 'max_weight', 'weight_unit', name=_('Weight')), + ) + selector_fields = ('filter_id', 'q', 'manufacturer_id') + manufacturer_id = DynamicModelMultipleChoiceField( + queryset=Manufacturer.objects.all(), + required=False, + label=_('Manufacturer') + ) + tag = TagFilterField(model) + + +class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, RackBaseFilterForm): model = Rack fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', name=_('Location')), - FieldSet('status', 'role_id', name=_('Function')), - FieldSet('type', 'width', 'serial', 'asset_tag', name=_('Hardware')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), - FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), + FieldSet('status', 'role_id', 'manufacturer_id', 'rack_type_id', 'serial', 'asset_tag', name=_('Rack')), + FieldSet('form_factor', 'width', 'u_height', 'airflow', name=_('Hardware')), + FieldSet('starting_unit', 'desc_units', name=_('Numbering')), FieldSet('weight', 'max_weight', 'weight_unit', name=_('Weight')), + FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), ) selector_fields = ('filter_id', 'q', 'region_id', 'site_group_id', 'site_id', 'location_id') region_id = DynamicModelMultipleChoiceField( @@ -293,22 +360,25 @@ class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilte choices=RackStatusChoices, required=False ) - type = forms.MultipleChoiceField( - label=_('Type'), - choices=RackTypeChoices, - required=False - ) - width = forms.MultipleChoiceField( - label=_('Width'), - choices=RackWidthChoices, - required=False - ) role_id = DynamicModelMultipleChoiceField( queryset=RackRole.objects.all(), required=False, null_option='None', label=_('Role') ) + manufacturer_id = DynamicModelMultipleChoiceField( + queryset=Manufacturer.objects.all(), + required=False, + label=_('Manufacturer') + ) + rack_type_id = DynamicModelMultipleChoiceField( + queryset=RackType.objects.all(), + required=False, + query_params={ + 'manufacturer_id': '$manufacturer_id' + }, + label=_('Rack type') + ) serial = forms.CharField( label=_('Serial'), required=False @@ -318,21 +388,6 @@ class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilte required=False ) tag = TagFilterField(model) - weight = forms.DecimalField( - label=_('Weight'), - required=False, - min_value=1 - ) - max_weight = forms.IntegerField( - label=_('Max weight'), - required=False, - min_value=1 - ) - weight_unit = forms.ChoiceField( - label=_('Weight unit'), - choices=add_blank_choice(WeightUnitChoices), - required=False - ) class RackElevationFilterForm(RackFilterForm): @@ -402,7 +457,7 @@ class RackReservationFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): label=_('Rack') ) user_id = DynamicModelMultipleChoiceField( - queryset=get_user_model().objects.all(), + queryset=User.objects.all(), required=False, label=_('User') ) @@ -550,7 +605,7 @@ class ModuleTypeFilterForm(NetBoxModelFilterSetForm): model = ModuleType fieldsets = ( FieldSet('q', 'filter_id', 'tag'), - FieldSet('manufacturer_id', 'part_number', name=_('Hardware')), + FieldSet('manufacturer_id', 'part_number', 'airflow', name=_('Hardware')), FieldSet( 'console_ports', 'console_server_ports', 'power_ports', 'power_outlets', 'interfaces', 'pass_through_ports', name=_('Components') @@ -610,6 +665,11 @@ class ModuleTypeFilterForm(NetBoxModelFilterSetForm): ) ) tag = TagFilterField(model) + airflow = forms.MultipleChoiceField( + label=_('Airflow'), + choices=add_blank_choice(ModuleAirflowChoices), + required=False + ) weight = forms.DecimalField( label=_('Weight'), required=False diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index c12ddccde6..7dc6d52397 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -1,5 +1,4 @@ from django import forms -from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext_lazy as _ from timezone_field import TimeZoneFormField @@ -11,7 +10,8 @@ from ipam.models import ASN, IPAddress, VLAN, VLANGroup, VRF from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm -from utilities.forms import add_blank_choice +from users.models import User +from utilities.forms import add_blank_choice, get_field_value from utilities.forms.fields import ( CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField, NumericArrayField, SlugField, ) @@ -57,6 +57,7 @@ 'RackForm', 'RackReservationForm', 'RackRoleForm', + 'RackTypeForm', 'RearPortForm', 'RearPortTemplateForm', 'RegionForm', @@ -201,6 +202,37 @@ class Meta: ] +class RackTypeForm(NetBoxModelForm): + manufacturer = DynamicModelChoiceField( + label=_('Manufacturer'), + queryset=Manufacturer.objects.all() + ) + comments = CommentField() + slug = SlugField( + label=_('Slug'), + slug_source='model' + ) + + fieldsets = ( + FieldSet('manufacturer', 'model', 'slug', 'description', 'form_factor', 'tags', name=_('Rack Type')), + FieldSet( + 'width', 'u_height', + InlineFields('outer_width', 'outer_depth', 'outer_unit', label=_('Outer Dimensions')), + InlineFields('weight', 'max_weight', 'weight_unit', label=_('Weight')), + 'mounting_depth', name=_('Dimensions') + ), + FieldSet('starting_unit', 'desc_units', name=_('Numbering')), + ) + + class Meta: + model = RackType + fields = [ + 'manufacturer', 'model', 'slug', 'form_factor', 'width', 'u_height', 'starting_unit', 'desc_units', + 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth', 'weight', 'max_weight', 'weight_unit', + 'description', 'comments', 'tags', + ] + + class RackForm(TenancyForm, NetBoxModelForm): site = DynamicModelChoiceField( label=_('Site'), @@ -220,28 +252,54 @@ class RackForm(TenancyForm, NetBoxModelForm): queryset=RackRole.objects.all(), required=False ) + rack_type = DynamicModelChoiceField( + label=_('Rack Type'), + queryset=RackType.objects.all(), + required=False, + help_text=_("Select a pre-defined rack type, or set physical characteristics below.") + ) comments = CommentField() fieldsets = ( - FieldSet('site', 'location', 'name', 'status', 'role', 'description', 'tags', name=_('Rack')), + FieldSet('site', 'location', 'name', 'status', 'role', 'rack_type', 'description', 'airflow', 'tags', name=_('Rack')), FieldSet('facility_id', 'serial', 'asset_tag', name=_('Inventory Control')), FieldSet('tenant_group', 'tenant', name=_('Tenancy')), - FieldSet( - 'type', 'width', 'starting_unit', 'u_height', - InlineFields('outer_width', 'outer_depth', 'outer_unit', label=_('Outer Dimensions')), - InlineFields('weight', 'max_weight', 'weight_unit', label=_('Weight')), - 'mounting_depth', 'desc_units', name=_('Dimensions') - ), ) class Meta: model = Rack fields = [ 'site', 'location', 'name', 'facility_id', 'tenant_group', 'tenant', 'status', 'role', 'serial', - 'asset_tag', 'type', 'width', 'u_height', 'starting_unit', 'desc_units', 'outer_width', 'outer_depth', - 'outer_unit', 'mounting_depth', 'weight', 'max_weight', 'weight_unit', 'description', 'comments', 'tags', + 'asset_tag', 'rack_type', 'form_factor', 'width', 'u_height', 'starting_unit', 'desc_units', 'outer_width', + 'outer_depth', 'outer_unit', 'mounting_depth', 'airflow', 'weight', 'max_weight', 'weight_unit', + 'description', 'comments', 'tags', ] + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Mimic HTMXSelect() + self.fields['rack_type'].widget.attrs.update({ + 'hx-get': '.', + 'hx-include': '#form_fields', + 'hx-target': '#form_fields', + }) + + # Omit RackType-defined fields if rack_type is set + if get_field_value(self, 'rack_type'): + for field_name in Rack.RACKTYPE_FIELDS: + del self.fields[field_name] + else: + self.fieldsets = ( + *self.fieldsets, + FieldSet( + 'form_factor', 'width', 'starting_unit', 'u_height', + InlineFields('outer_width', 'outer_depth', 'outer_unit', label=_('Outer Dimensions')), + InlineFields('weight', 'max_weight', 'weight_unit', label=_('Weight')), + 'mounting_depth', 'desc_units', name=_('Dimensions') + ), + ) + class RackReservationForm(TenancyForm, NetBoxModelForm): rack = DynamicModelChoiceField( @@ -256,9 +314,7 @@ class RackReservationForm(TenancyForm, NetBoxModelForm): ) user = forms.ModelChoiceField( label=_('User'), - queryset=get_user_model().objects.order_by( - 'username' - ) + queryset=User.objects.order_by('username') ) comments = CommentField() @@ -343,13 +399,14 @@ class ModuleTypeForm(NetBoxModelForm): fieldsets = ( FieldSet('manufacturer', 'model', 'part_number', 'description', 'tags', name=_('Module Type')), - FieldSet('weight', 'weight_unit', name=_('Weight')) + FieldSet('airflow', 'weight', 'weight_unit', name=_('Chassis')) ) class Meta: model = ModuleType fields = [ - 'manufacturer', 'model', 'part_number', 'weight', 'weight_unit', 'description', 'comments', 'tags', + 'manufacturer', 'model', 'part_number', 'airflow', 'weight', 'weight_unit', 'description', + 'comments', 'tags', ] @@ -659,11 +716,6 @@ class Meta: 'a_terminations_type', 'b_terminations_type', 'type', 'status', 'tenant_group', 'tenant', 'label', 'color', 'length', 'length_unit', 'description', 'comments', 'tags', ] - error_messages = { - 'length': { - 'max_value': _('Maximum length is 32767 (any unit)') - } - } class PowerPanelForm(NetBoxModelForm): @@ -981,15 +1033,15 @@ class Meta: ] -class ModuleBayTemplateForm(ComponentTemplateForm): +class ModuleBayTemplateForm(ModularComponentTemplateForm): fieldsets = ( - FieldSet('device_type', 'name', 'label', 'position', 'description'), + FieldSet('device_type', 'module_type', 'name', 'label', 'position', 'description'), ) class Meta: model = ModuleBayTemplate fields = [ - 'device_type', 'name', 'label', 'position', 'description', + 'device_type', 'module_type', 'name', 'label', 'position', 'description', ] @@ -1401,15 +1453,15 @@ class Meta: ] -class ModuleBayForm(DeviceComponentForm): +class ModuleBayForm(ModularDeviceComponentForm): fieldsets = ( - FieldSet('device', 'name', 'label', 'position', 'description', 'tags',), + FieldSet('device', 'module', 'name', 'label', 'position', 'description', 'tags',), ) class Meta: model = ModuleBay fields = [ - 'device', 'name', 'label', 'position', 'description', 'tags', + 'device', 'module', 'name', 'label', 'position', 'description', 'tags', ] diff --git a/netbox/dcim/graphql/filters.py b/netbox/dcim/graphql/filters.py index 2ae5e77717..8c256aecb4 100644 --- a/netbox/dcim/graphql/filters.py +++ b/netbox/dcim/graphql/filters.py @@ -38,6 +38,7 @@ 'RackFilter', 'RackReservationFilter', 'RackRoleFilter', + 'RackTypeFilter', 'RearPortFilter', 'RearPortTemplateFilter', 'RegionFilter', @@ -234,6 +235,12 @@ class PowerPortTemplateFilter(BaseFilterMixin): pass +@strawberry_django.filter(models.RackType, lookups=True) +@autotype_decorator(filtersets.RackTypeFilterSet) +class RackTypeFilter(BaseFilterMixin): + pass + + @strawberry_django.filter(models.Rack, lookups=True) @autotype_decorator(filtersets.RackFilterSet) class RackFilter(BaseFilterMixin): diff --git a/netbox/dcim/graphql/schema.py b/netbox/dcim/graphql/schema.py index 8039702933..65818fb20d 100644 --- a/netbox/dcim/graphql/schema.py +++ b/netbox/dcim/graphql/schema.py @@ -98,6 +98,9 @@ class DCIMQuery: power_port_template: PowerPortTemplateType = strawberry_django.field() power_port_template_list: List[PowerPortTemplateType] = strawberry_django.field() + rack_type: RackTypeType = strawberry_django.field() + rack_type_list: List[RackTypeType] = strawberry_django.field() + rack: RackType = strawberry_django.field() rack_list: List[RackType] = strawberry_django.field() diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index 99a9106cbb..24ba5cca4f 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -3,14 +3,10 @@ import strawberry import strawberry_django +from core.graphql.mixins import ChangelogMixin from dcim import models from extras.graphql.mixins import ( - ChangelogMixin, - ConfigContextMixin, - ContactsMixin, - CustomFieldsMixin, - ImageAttachmentsMixin, - TagsMixin, + ConfigContextMixin, ContactsMixin, CustomFieldsMixin, ImageAttachmentsMixin, TagsMixin, ) from ipam.graphql.mixins import IPAddressesMixin, VLANGroupsMixin from netbox.graphql.scalars import BigInt @@ -54,6 +50,7 @@ 'RackType', 'RackReservationType', 'RackRoleType', + 'RackTypeType', 'RearPortType', 'RearPortTemplateType', 'RegionType', @@ -499,12 +496,18 @@ class ModuleType(NetBoxObjectType): @strawberry_django.type( models.ModuleBay, - fields='__all__', + # fields='__all__', + exclude=('parent',), filters=ModuleBayFilter ) -class ModuleBayType(ComponentType): +class ModuleBayType(ModularComponentType): installed_module: Annotated["ModuleType", strawberry.lazy('dcim.graphql.types')] | None + children: List[Annotated["ModuleBayType", strawberry.lazy('dcim.graphql.types')]] + + @strawberry_django.field + def parent(self) -> Annotated["ModuleBayType", strawberry.lazy('dcim.graphql.types')] | None: + return self.parent @strawberry_django.type( @@ -512,7 +515,7 @@ class ModuleBayType(ComponentType): fields='__all__', filters=ModuleBayTemplateFilter ) -class ModuleBayTemplateType(ComponentTemplateType): +class ModuleBayTemplateType(ModularComponentTemplateType): _name: str @@ -610,6 +613,15 @@ class PowerPortTemplateType(ModularComponentTemplateType): poweroutlet_templates: List[Annotated["PowerOutletTemplateType", strawberry.lazy('dcim.graphql.types')]] +@strawberry_django.type( + models.RackType, + fields='__all__', + filters=RackTypeFilter +) +class RackTypeType(NetBoxObjectType): + manufacturer: Annotated["ManufacturerType", strawberry.lazy('dcim.graphql.types')] + + @strawberry_django.type( models.Rack, fields='__all__', @@ -622,6 +634,7 @@ class RackType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObje tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None role: Annotated["RackRoleType", strawberry.lazy('dcim.graphql.types')] | None + rack_type: Annotated["RackTypeType", strawberry.lazy('dcim.graphql.types')] | None reservations: List[Annotated["RackReservationType", strawberry.lazy('dcim.graphql.types')]] devices: List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]] powerfeeds: List[Annotated["PowerFeedType", strawberry.lazy('dcim.graphql.types')]] diff --git a/netbox/dcim/migrations/0188_racktype.py b/netbox/dcim/migrations/0188_racktype.py new file mode 100644 index 0000000000..aa45246e5c --- /dev/null +++ b/netbox/dcim/migrations/0188_racktype.py @@ -0,0 +1,98 @@ +import django.core.validators +import django.db.models.deletion +import taggit.managers +from django.db import migrations, models + +import utilities.fields +import utilities.json +import utilities.ordering + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0118_customfield_uniqueness'), + ('dcim', '0187_alter_device_vc_position'), + ] + + operations = [ + migrations.CreateModel( + name='RackType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField( + blank=True, + default=dict, + encoder=utilities.json.CustomFieldJSONEncoder + )), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('weight', models.DecimalField(blank=True, decimal_places=2, max_digits=8, null=True)), + ('weight_unit', models.CharField(blank=True, max_length=50)), + ('_abs_weight', models.PositiveBigIntegerField(blank=True, null=True)), + ('manufacturer', models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name='rack_types', + to='dcim.manufacturer' + )), + ('model', models.CharField(max_length=100)), + ('slug', models.SlugField(max_length=100, unique=True)), + ('form_factor', models.CharField(max_length=50)), + ('width', models.PositiveSmallIntegerField(default=19)), + ('u_height', models.PositiveSmallIntegerField( + default=42, + validators=[ + django.core.validators.MinValueValidator(1), + django.core.validators.MaxValueValidator(100), + ] + )), + ('starting_unit', models.PositiveSmallIntegerField( + default=1, + validators=[django.core.validators.MinValueValidator(1)] + )), + ('desc_units', models.BooleanField(default=False)), + ('outer_width', models.PositiveSmallIntegerField(blank=True, null=True)), + ('outer_depth', models.PositiveSmallIntegerField(blank=True, null=True)), + ('outer_unit', models.CharField(blank=True, max_length=50)), + ('max_weight', models.PositiveIntegerField(blank=True, null=True)), + ('_abs_max_weight', models.PositiveBigIntegerField(blank=True, null=True)), + ('mounting_depth', models.PositiveSmallIntegerField(blank=True, null=True)), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'verbose_name': 'racktype', + 'verbose_name_plural': 'racktypes', + 'ordering': ('manufacturer', 'model'), + }, + ), + migrations.RenameField( + model_name='rack', + old_name='type', + new_name='form_factor', + ), + migrations.AddField( + model_name='rack', + name='rack_type', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name='racks', + to='dcim.racktype', + ), + ), + migrations.AddConstraint( + model_name='racktype', + constraint=models.UniqueConstraint( + fields=('manufacturer', 'model'), name='dcim_racktype_unique_manufacturer_model' + ), + ), + migrations.AddConstraint( + model_name='racktype', + constraint=models.UniqueConstraint( + fields=('manufacturer', 'slug'), name='dcim_racktype_unique_manufacturer_slug' + ), + ), + ] diff --git a/netbox/dcim/migrations/0189_moduletype_rack_airflow.py b/netbox/dcim/migrations/0189_moduletype_rack_airflow.py new file mode 100644 index 0000000000..31787b67d4 --- /dev/null +++ b/netbox/dcim/migrations/0189_moduletype_rack_airflow.py @@ -0,0 +1,21 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0188_racktype'), + ] + + operations = [ + migrations.AddField( + model_name='moduletype', + name='airflow', + field=models.CharField(blank=True, max_length=50), + ), + migrations.AddField( + model_name='rack', + name='airflow', + field=models.CharField(blank=True, max_length=50), + ), + ] diff --git a/netbox/dcim/migrations/0190_nested_modules.py b/netbox/dcim/migrations/0190_nested_modules.py new file mode 100644 index 0000000000..9cef40efbb --- /dev/null +++ b/netbox/dcim/migrations/0190_nested_modules.py @@ -0,0 +1,74 @@ +import django.db.models.deletion +import mptt.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0189_moduletype_rack_airflow'), + ('extras', '0121_customfield_related_object_filter'), + ] + + operations = [ + migrations.AlterModelOptions( + name='modulebaytemplate', + options={'ordering': ('device_type', 'module_type', '_name')}, + ), + migrations.RemoveConstraint( + model_name='modulebay', + name='dcim_modulebay_unique_device_name', + ), + migrations.AddField( + model_name='modulebay', + name='level', + field=models.PositiveIntegerField(default=0, editable=False), + preserve_default=False, + ), + migrations.AddField( + model_name='modulebay', + name='lft', + field=models.PositiveIntegerField(default=0, editable=False), + preserve_default=False, + ), + migrations.AddField( + model_name='modulebay', + name='module', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.module'), + ), + migrations.AddField( + model_name='modulebay', + name='parent', + field=mptt.fields.TreeForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='dcim.modulebay'), + ), + migrations.AddField( + model_name='modulebay', + name='rght', + field=models.PositiveIntegerField(default=0, editable=False), + preserve_default=False, + ), + migrations.AddField( + model_name='modulebay', + name='tree_id', + field=models.PositiveIntegerField(db_index=True, default=0, editable=False), + preserve_default=False, + ), + migrations.AddField( + model_name='modulebaytemplate', + name='module_type', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.moduletype'), + ), + migrations.AlterField( + model_name='modulebaytemplate', + name='device_type', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='dcim.devicetype'), + ), + migrations.AddConstraint( + model_name='modulebay', + constraint=models.UniqueConstraint(fields=('device', 'module', 'name'), name='dcim_modulebay_unique_device_module_name'), + ), + migrations.AddConstraint( + model_name='modulebaytemplate', + constraint=models.UniqueConstraint(fields=('module_type', 'name'), name='dcim_modulebaytemplate_unique_module_type_name'), + ), + ] diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index dacd7ec3ed..28a403be03 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -158,14 +158,41 @@ def clean(self): _("A component template must be associated with either a device type or a module type.") ) + def _get_module_tree(self, module): + modules = [] + all_module_bays = module.device.modulebays.all().select_related('module') + while module: + modules.append(module) + if module.module_bay: + module = module.module_bay.module + else: + module = None + + modules.reverse() + return modules + def resolve_name(self, module): + if MODULE_TOKEN not in self.name: + return self.name + if module: - return self.name.replace(MODULE_TOKEN, module.module_bay.position) + modules = self._get_module_tree(module) + name = self.name + for module in modules: + name = name.replace(MODULE_TOKEN, module.module_bay.position, 1) + return name return self.name def resolve_label(self, module): + if MODULE_TOKEN not in self.label: + return self.label + if module: - return self.label.replace(MODULE_TOKEN, module.module_bay.position) + modules = self._get_module_tree(module) + label = self.label + for module in modules: + label = label.replace(MODULE_TOKEN, module.module_bay.position, 1) + return label return self.label @@ -628,7 +655,7 @@ def to_yaml(self): } -class ModuleBayTemplate(ComponentTemplateModel): +class ModuleBayTemplate(ModularComponentTemplateModel): """ A template for a ModuleBay to be created for a new parent Device. """ @@ -641,16 +668,16 @@ class ModuleBayTemplate(ComponentTemplateModel): component_model = ModuleBay - class Meta(ComponentTemplateModel.Meta): + class Meta(ModularComponentTemplateModel.Meta): verbose_name = _('module bay template') verbose_name_plural = _('module bay templates') - def instantiate(self, device): + def instantiate(self, **kwargs): return self.component_model( - device=device, name=self.name, label=self.label, - position=self.position + position=self.position, + **kwargs ) instantiate.do_not_call_in_templates = True diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 9438b741f5..62312cbf43 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -4,7 +4,7 @@ from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models -from django.db.models import Sum +from django.db.models import F, Sum from django.urls import reverse from django.utils.translation import gettext_lazy as _ from mptt.models import MPTTModel, TreeForeignKey @@ -1087,10 +1087,19 @@ def clean(self): # Bays # -class ModuleBay(ComponentModel, TrackingModelMixin): +class ModuleBay(ModularComponentModel, TrackingModelMixin, MPTTModel): """ An empty space within a Device which can house a child device """ + parent = TreeForeignKey( + to='self', + on_delete=models.CASCADE, + related_name='children', + blank=True, + null=True, + editable=False, + db_index=True + ) position = models.CharField( verbose_name=_('position'), max_length=30, @@ -1098,15 +1107,45 @@ class ModuleBay(ComponentModel, TrackingModelMixin): help_text=_('Identifier to reference when renaming installed components') ) + objects = TreeManager() + clone_fields = ('device',) - class Meta(ComponentModel.Meta): + class Meta(ModularComponentModel.Meta): + constraints = ( + models.UniqueConstraint( + fields=('device', 'module', 'name'), + name='%(app_label)s_%(class)s_unique_device_module_name' + ), + ) verbose_name = _('module bay') verbose_name_plural = _('module bays') + class MPTTMeta: + order_insertion_by = ('module',) + def get_absolute_url(self): return reverse('dcim:modulebay', kwargs={'pk': self.pk}) + def clean(self): + super().clean() + + # Check for recursion + if module := self.module: + module_bays = [self.pk] + modules = [] + while module: + if module.pk in modules or module.module_bay.pk in module_bays: + raise ValidationError(_("A module bay cannot belong to a module installed within it.")) + modules.append(module.pk) + module_bays.append(module.module_bay.pk) + module = module.module_bay.module if module.module_bay else None + + def save(self, *args, **kwargs): + if self.module: + self.parent = self.module.module_bay + super().save(*args, **kwargs) + class DeviceBay(ComponentModel, TrackingModelMixin): """ diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index abc9e0b085..c281e5de23 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -221,7 +221,7 @@ def get_absolute_url(self): return reverse('dcim:devicetype', args=[self.pk]) @property - def get_full_name(self): + def full_name(self): return f"{self.manufacturer} {self.model}" def to_yaml(self): @@ -388,8 +388,14 @@ class ModuleType(ImageAttachmentsMixin, PrimaryModel, WeightMixin): blank=True, help_text=_('Discrete part number (optional)') ) + airflow = models.CharField( + verbose_name=_('airflow'), + max_length=50, + choices=ModuleAirflowChoices, + blank=True + ) - clone_fields = ('manufacturer', 'weight', 'weight_unit',) + clone_fields = ('manufacturer', 'weight', 'weight_unit', 'airflow') prerequisite_models = ( 'dcim.Manufacturer', ) @@ -411,6 +417,10 @@ def __str__(self): def get_absolute_url(self): return reverse('dcim:moduletype', args=[self.pk]) + @property + def full_name(self): + return f"{self.manufacturer} {self.model}" + def to_yaml(self): data = { 'manufacturer': self.manufacturer.name, @@ -1036,7 +1046,8 @@ def save(self, *args, **kwargs): self._instantiate_components(self.device_type.interfacetemplates.all()) self._instantiate_components(self.device_type.rearporttemplates.all()) self._instantiate_components(self.device_type.frontporttemplates.all()) - self._instantiate_components(self.device_type.modulebaytemplates.all()) + # Disable bulk_create to accommodate MPTT + self._instantiate_components(self.device_type.modulebaytemplates.all(), bulk_create=False) self._instantiate_components(self.device_type.devicebaytemplates.all()) # Disable bulk_create to accommodate MPTT self._instantiate_components(self.device_type.inventoryitemtemplates.all(), bulk_create=False) @@ -1197,6 +1208,17 @@ def clean(self): ) ) + # Check for recursion + module = self + module_bays = [] + modules = [] + while module: + if module.pk in modules or module.module_bay.pk in module_bays: + raise ValidationError(_("A module bay cannot belong to a module installed within it.")) + modules.append(module.pk) + module_bays.append(module.module_bay.pk) + module = module.module_bay.module if module.module_bay else None + def save(self, *args, **kwargs): is_new = self.pk is None @@ -1218,7 +1240,8 @@ def save(self, *args, **kwargs): ("powerporttemplates", "powerports", PowerPort), ("poweroutlettemplates", "poweroutlets", PowerOutlet), ("rearporttemplates", "rearports", RearPort), - ("frontporttemplates", "frontports", FrontPort) + ("frontporttemplates", "frontports", FrontPort), + ("modulebaytemplates", "modulebays", ModuleBay), ]: create_instances = [] update_instances = [] @@ -1247,17 +1270,22 @@ def save(self, *args, **kwargs): if not disable_replication: create_instances.append(template_instance) - component_model.objects.bulk_create(create_instances) - # Emit the post_save signal for each newly created object - for component in create_instances: - post_save.send( - sender=component_model, - instance=component, - created=True, - raw=False, - using='default', - update_fields=None - ) + if component_model is not ModuleBay: + component_model.objects.bulk_create(create_instances) + # Emit the post_save signal for each newly created object + for component in create_instances: + post_save.send( + sender=component_model, + instance=component, + created=True, + raw=False, + using='default', + update_fields=None + ) + else: + # ModuleBays must be saved individually for MPTT + for instance in create_instances: + instance.save() update_fields = ['module'] component_model.objects.bulk_update(update_instances, update_fields) diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index 289c38133a..3198c26798 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -29,9 +29,189 @@ 'Rack', 'RackReservation', 'RackRole', + 'RackType', ) +# +# Rack Types +# + +class RackBase(WeightMixin, PrimaryModel): + """ + Base class for RackType & Rack. Holds + """ + width = models.PositiveSmallIntegerField( + choices=RackWidthChoices, + default=RackWidthChoices.WIDTH_19IN, + verbose_name=_('width'), + help_text=_('Rail-to-rail width') + ) + + # Numbering + u_height = models.PositiveSmallIntegerField( + default=RACK_U_HEIGHT_DEFAULT, + verbose_name=_('height (U)'), + validators=[MinValueValidator(1), MaxValueValidator(RACK_U_HEIGHT_MAX)], + help_text=_('Height in rack units') + ) + starting_unit = models.PositiveSmallIntegerField( + default=RACK_STARTING_UNIT_DEFAULT, + verbose_name=_('starting unit'), + validators=[MinValueValidator(1)], + help_text=_('Starting unit for rack') + ) + desc_units = models.BooleanField( + default=False, + verbose_name=_('descending units'), + help_text=_('Units are numbered top-to-bottom') + ) + + # Dimensions + outer_width = models.PositiveSmallIntegerField( + verbose_name=_('outer width'), + blank=True, + null=True, + help_text=_('Outer dimension of rack (width)') + ) + outer_depth = models.PositiveSmallIntegerField( + verbose_name=_('outer depth'), + blank=True, + null=True, + help_text=_('Outer dimension of rack (depth)') + ) + outer_unit = models.CharField( + verbose_name=_('outer unit'), + max_length=50, + choices=RackDimensionUnitChoices, + blank=True + ) + mounting_depth = models.PositiveSmallIntegerField( + verbose_name=_('mounting depth'), + blank=True, + null=True, + help_text=(_( + 'Maximum depth of a mounted device, in millimeters. For four-post racks, this is the distance between the ' + 'front and rear rails.' + )) + ) + + # Weight + # WeightMixin provides weight, weight_unit, and _abs_weight + max_weight = models.PositiveIntegerField( + verbose_name=_('max weight'), + blank=True, + null=True, + help_text=_('Maximum load capacity for the rack') + ) + # Stores the normalized max weight (in grams) for database ordering + _abs_max_weight = models.PositiveBigIntegerField( + blank=True, + null=True + ) + + class Meta: + abstract = True + + +class RackType(RackBase): + """ + Devices are housed within Racks. Each rack has a defined height measured in rack units, and a front and rear face. + Each Rack is assigned to a Site and (optionally) a Location. + """ + form_factor = models.CharField( + choices=RackFormFactorChoices, + max_length=50, + verbose_name=_('form factor') + ) + manufacturer = models.ForeignKey( + to='dcim.Manufacturer', + on_delete=models.PROTECT, + related_name='rack_types' + ) + model = models.CharField( + verbose_name=_('model'), + max_length=100 + ) + slug = models.SlugField( + verbose_name=_('slug'), + max_length=100, + unique=True + ) + + clone_fields = ( + 'manufacturer', 'form_factor', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', + 'outer_unit', 'mounting_depth', 'weight', 'max_weight', 'weight_unit', + ) + prerequisite_models = ( + 'dcim.Manufacturer', + ) + + class Meta: + ordering = ('manufacturer', 'model') + constraints = ( + models.UniqueConstraint( + fields=('manufacturer', 'model'), + name='%(app_label)s_%(class)s_unique_manufacturer_model' + ), + models.UniqueConstraint( + fields=('manufacturer', 'slug'), + name='%(app_label)s_%(class)s_unique_manufacturer_slug' + ), + ) + verbose_name = _('rack type') + verbose_name_plural = _('rack types') + + def __str__(self): + return self.model + + def get_absolute_url(self): + return reverse('dcim:racktype', args=[self.pk]) + + @property + def full_name(self): + return f"{self.manufacturer} {self.model}" + + def clean(self): + super().clean() + + # Validate outer dimensions and unit + if (self.outer_width is not None or self.outer_depth is not None) and not self.outer_unit: + raise ValidationError(_("Must specify a unit when setting an outer width/depth")) + + # Validate max_weight and weight_unit + if self.max_weight and not self.weight_unit: + raise ValidationError(_("Must specify a unit when setting a maximum weight")) + + def save(self, *args, **kwargs): + # Store the given max weight (if any) in grams for use in database ordering + if self.max_weight and self.weight_unit: + self._abs_max_weight = to_grams(self.max_weight, self.weight_unit) + else: + self._abs_max_weight = None + + # Clear unit if outer width & depth are not set + if self.outer_width is None and self.outer_depth is None: + self.outer_unit = '' + + super().save(*args, **kwargs) + + # Update all Racks associated with this RackType + for rack in self.racks.all(): + rack.snapshot() + rack.copy_racktype_attrs() + rack.save() + + @property + def units(self): + """ + Return a list of unit numbers, top to bottom. + """ + if self.desc_units: + return drange(decimal.Decimal(self.starting_unit), self.u_height + self.starting_unit, 0.5) + return drange(self.u_height + decimal.Decimal(0.5) + self.starting_unit - 1, 0.5 + self.starting_unit - 1, -0.5) + + # # Racks # @@ -54,11 +234,30 @@ def get_absolute_url(self): return reverse('dcim:rackrole', args=[self.pk]) -class Rack(ContactsMixin, ImageAttachmentsMixin, PrimaryModel, WeightMixin): +class Rack(ContactsMixin, ImageAttachmentsMixin, RackBase): """ Devices are housed within Racks. Each rack has a defined height measured in rack units, and a front and rear face. Each Rack is assigned to a Site and (optionally) a Location. """ + # Fields which cannot be set locally if a RackType is assigned + RACKTYPE_FIELDS = ( + 'form_factor', 'width', 'u_height', 'starting_unit', 'desc_units', 'outer_width', 'outer_depth', + 'outer_unit', 'mounting_depth', 'weight', 'weight_unit', 'max_weight', + ) + + form_factor = models.CharField( + choices=RackFormFactorChoices, + max_length=50, + blank=True, + verbose_name=_('form factor') + ) + rack_type = models.ForeignKey( + to='dcim.RackType', + on_delete=models.PROTECT, + related_name='racks', + blank=True, + null=True, + ) name = models.CharField( verbose_name=_('name'), max_length=100 @@ -121,72 +320,11 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, PrimaryModel, WeightMixin): verbose_name=_('asset tag'), help_text=_('A unique tag used to identify this rack') ) - type = models.CharField( - choices=RackTypeChoices, + airflow = models.CharField( + verbose_name=_('airflow'), max_length=50, - blank=True, - verbose_name=_('type') - ) - width = models.PositiveSmallIntegerField( - choices=RackWidthChoices, - default=RackWidthChoices.WIDTH_19IN, - verbose_name=_('width'), - help_text=_('Rail-to-rail width') - ) - u_height = models.PositiveSmallIntegerField( - default=RACK_U_HEIGHT_DEFAULT, - verbose_name=_('height (U)'), - validators=[MinValueValidator(1), MaxValueValidator(RACK_U_HEIGHT_MAX)], - help_text=_('Height in rack units') - ) - starting_unit = models.PositiveSmallIntegerField( - default=RACK_STARTING_UNIT_DEFAULT, - verbose_name=_('starting unit'), - validators=[MinValueValidator(1),], - help_text=_('Starting unit for rack') - ) - desc_units = models.BooleanField( - default=False, - verbose_name=_('descending units'), - help_text=_('Units are numbered top-to-bottom') - ) - outer_width = models.PositiveSmallIntegerField( - verbose_name=_('outer width'), - blank=True, - null=True, - help_text=_('Outer dimension of rack (width)') - ) - outer_depth = models.PositiveSmallIntegerField( - verbose_name=_('outer depth'), - blank=True, - null=True, - help_text=_('Outer dimension of rack (depth)') - ) - outer_unit = models.CharField( - verbose_name=_('outer unit'), - max_length=50, - choices=RackDimensionUnitChoices, - blank=True, - ) - max_weight = models.PositiveIntegerField( - verbose_name=_('max weight'), - blank=True, - null=True, - help_text=_('Maximum load capacity for the rack') - ) - # Stores the normalized max weight (in grams) for database ordering - _abs_max_weight = models.PositiveBigIntegerField( - blank=True, - null=True - ) - mounting_depth = models.PositiveSmallIntegerField( - verbose_name=_('mounting depth'), - blank=True, - null=True, - help_text=( - _('Maximum depth of a mounted device, in millimeters. For four-post racks, this is the ' - 'distance between the front and rear rails.') - ) + choices=RackAirflowChoices, + blank=True ) # Generic relations @@ -198,8 +336,8 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, PrimaryModel, WeightMixin): ) clone_fields = ( - 'site', 'location', 'tenant', 'status', 'role', 'type', 'width', 'u_height', 'desc_units', 'outer_width', - 'outer_depth', 'outer_unit', 'mounting_depth', 'weight', 'max_weight', 'weight_unit', + 'site', 'location', 'tenant', 'status', 'role', 'form_factor', 'width', 'airflow', 'u_height', 'desc_units', + 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth', 'weight', 'max_weight', 'weight_unit', ) prerequisite_models = ( 'dcim.Site', @@ -271,6 +409,7 @@ def clean(self): }) def save(self, *args, **kwargs): + self.copy_racktype_attrs() # Store the given max weight (if any) in grams for use in database ordering if self.max_weight and self.weight_unit: @@ -284,6 +423,14 @@ def save(self, *args, **kwargs): super().save(*args, **kwargs) + def copy_racktype_attrs(self): + """ + Copy physical attributes from the assigned RackType (if any). + """ + if self.rack_type: + for field_name in self.RACKTYPE_FIELDS: + setattr(self, field_name, getattr(self.rack_type, field_name)) + @property def units(self): """ diff --git a/netbox/dcim/search.py b/netbox/dcim/search.py index b349bcac06..38c1843fef 100644 --- a/netbox/dcim/search.py +++ b/netbox/dcim/search.py @@ -242,6 +242,17 @@ class PowerPortIndex(SearchIndex): display_attrs = ('device', 'label', 'type', 'description') +@register_search +class RackTypeIndex(SearchIndex): + model = models.RackType + fields = ( + ('model', 100), + ('description', 500), + ('comments', 5000), + ) + display_attrs = ('type', 'description') + + @register_search class RackIndex(SearchIndex): model = models.Rack diff --git a/netbox/dcim/svg/cables.py b/netbox/dcim/svg/cables.py index 9ce5d967bc..959414d754 100644 --- a/netbox/dcim/svg/cables.py +++ b/netbox/dcim/svg/cables.py @@ -393,6 +393,8 @@ def render(self): labels = [f"{cable}"] if len(links) > 2 else [f"Wireless {cable}", cable.get_status_display()] if cable.ssid: description.append(f"{cable.ssid}") + if cable.distance and cable.distance_unit: + description.append(f"{cable.distance} {cable.get_distance_unit_display()}") near = [term for term in near_terminations if term.object == cable.interface_a] far = [term for term in far_terminations if term.object == cable.interface_b] if not (near and far): diff --git a/netbox/dcim/tables/cables.py b/netbox/dcim/tables/cables.py index e4c16f142d..e12545fd29 100644 --- a/netbox/dcim/tables/cables.py +++ b/netbox/dcim/tables/cables.py @@ -110,7 +110,7 @@ class CableTable(TenancyColumnsMixin, NetBoxTable): status = columns.ChoiceFieldColumn() length = columns.TemplateColumn( template_code=CABLE_LENGTH, - order_by=('_abs_length', 'length_unit') + order_by=('_abs_length') ) color = columns.ColorColumn() comments = columns.MarkdownColumn() diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index e63a0c44c6..222d756a10 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -318,6 +318,9 @@ class ModularDeviceComponentTable(DeviceComponentTable): verbose_name=_('Inventory Items'), ) + class Meta(NetBoxTable.Meta): + pass + class CableTerminationTable(NetBoxTable): cable = tables.Column( @@ -849,7 +852,7 @@ class Meta(DeviceComponentTable.Meta): default_columns = ('pk', 'name', 'label', 'status', 'installed_device', 'description') -class ModuleBayTable(DeviceComponentTable): +class ModuleBayTable(ModularDeviceComponentTable): device = tables.Column( verbose_name=_('Device'), linkify={ @@ -857,6 +860,10 @@ class ModuleBayTable(DeviceComponentTable): 'args': [Accessor('device_id')], } ) + parent = tables.Column( + linkify=True, + verbose_name=_('Parent'), + ) installed_module = tables.Column( linkify=True, verbose_name=_('Installed Module') @@ -878,25 +885,38 @@ class ModuleBayTable(DeviceComponentTable): verbose_name=_('Module Status') ) - class Meta(DeviceComponentTable.Meta): + class Meta(ModularDeviceComponentTable.Meta): model = models.ModuleBay fields = ( - 'pk', 'id', 'name', 'device', 'label', 'position', 'installed_module', 'module_status', 'module_serial', - 'module_asset_tag', 'description', 'tags', + 'pk', 'id', 'name', 'device', 'parent', 'label', 'position', 'installed_module', 'module_status', + 'module_serial', 'module_asset_tag', 'description', 'tags', ) - default_columns = ('pk', 'name', 'device', 'label', 'installed_module', 'module_status', 'description') + default_columns = ( + 'pk', 'name', 'device', 'parent', 'label', 'installed_module', 'module_status', 'description', + ) + + def render_parent_bay(self, value): + return value.name if value else '' + + def render_installed_module(self, value): + return value.module_type if value else '' class DeviceModuleBayTable(ModuleBayTable): + name = columns.MPTTColumn( + verbose_name=_('Name'), + linkify=True, + order_by=Accessor('_name') + ) actions = columns.ActionsColumn( extra_buttons=MODULEBAY_BUTTONS ) - class Meta(DeviceComponentTable.Meta): + class Meta(ModuleBayTable.Meta): model = models.ModuleBay fields = ( - 'pk', 'id', 'name', 'label', 'position', 'installed_module', 'module_status', 'module_serial', 'module_asset_tag', - 'description', 'tags', 'actions', + 'pk', 'id', 'parent', 'name', 'label', 'position', 'installed_module', 'module_status', 'module_serial', + 'module_asset_tag', 'description', 'tags', 'actions', ) default_columns = ('pk', 'name', 'label', 'installed_module', 'module_status', 'description') diff --git a/netbox/dcim/tables/modules.py b/netbox/dcim/tables/modules.py index 0cd9e438ee..5b06e08b28 100644 --- a/netbox/dcim/tables/modules.py +++ b/netbox/dcim/tables/modules.py @@ -40,7 +40,7 @@ class ModuleTypeTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = ModuleType fields = ( - 'pk', 'id', 'model', 'manufacturer', 'part_number', 'weight', 'description', 'comments', 'tags', + 'pk', 'id', 'model', 'manufacturer', 'part_number', 'airflow', 'weight', 'description', 'comments', 'tags', ) default_columns = ( 'pk', 'model', 'manufacturer', 'part_number', diff --git a/netbox/dcim/tables/racks.py b/netbox/dcim/tables/racks.py index 22ca3da90d..a6b704161a 100644 --- a/netbox/dcim/tables/racks.py +++ b/netbox/dcim/tables/racks.py @@ -2,7 +2,7 @@ import django_tables2 as tables from django_tables2.utils import Accessor -from dcim.models import Rack, RackReservation, RackRole +from dcim.models import Rack, RackReservation, RackRole, RackType from netbox.tables import NetBoxTable, columns from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin from .template_code import WEIGHT @@ -11,6 +11,7 @@ 'RackTable', 'RackReservationTable', 'RackRoleTable', + 'RackTypeTable', ) @@ -44,6 +45,65 @@ class Meta(NetBoxTable.Meta): default_columns = ('pk', 'name', 'rack_count', 'color', 'description') +# +# Rack Types +# + +class RackTypeTable(NetBoxTable): + model = tables.Column( + verbose_name=_('Model'), + linkify=True + ) + manufacturer = tables.Column( + verbose_name=_('Manufacturer'), + linkify=True + ) + u_height = tables.TemplateColumn( + template_code="{{ value }}U", + verbose_name=_('Height') + ) + outer_width = tables.TemplateColumn( + template_code="{{ record.outer_width }} {{ record.outer_unit }}", + verbose_name=_('Outer Width') + ) + outer_depth = tables.TemplateColumn( + template_code="{{ record.outer_depth }} {{ record.outer_unit }}", + verbose_name=_('Outer Depth') + ) + weight = columns.TemplateColumn( + verbose_name=_('Weight'), + template_code=WEIGHT, + order_by=('_abs_weight', 'weight_unit') + ) + max_weight = columns.TemplateColumn( + verbose_name=_('Max Weight'), + template_code=WEIGHT, + order_by=('_abs_max_weight', 'weight_unit') + ) + comments = columns.MarkdownColumn( + verbose_name=_('Comments'), + ) + instance_count = columns.LinkedCountColumn( + viewname='dcim:rack_list', + url_params={'rack_type_id': 'pk'}, + verbose_name=_('Instances') + ) + tags = columns.TagColumn( + url_name='dcim:rack_list' + ) + + class Meta(NetBoxTable.Meta): + model = RackType + fields = ( + 'pk', 'id', 'model', 'manufacturer', 'form_factor', 'u_height', 'starting_unit', 'width', 'outer_width', + 'outer_depth', 'mounting_depth', 'airflow', 'weight', 'max_weight', 'description', 'comments', + 'instance_count', 'tags', 'created', 'last_updated', + ) + default_columns = ( + 'pk', 'model', 'manufacturer', 'type', 'u_height', 'description', 'instance_count', + ) + + # # Racks # @@ -68,6 +128,15 @@ class RackTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): role = columns.ColoredLabelColumn( verbose_name=_('Role'), ) + manufacturer = tables.Column( + verbose_name=_('Manufacturer'), + accessor=Accessor('rack_type__manufacturer'), + linkify=True + ) + rack_type = tables.Column( + linkify=True, + verbose_name=_('Type') + ) u_height = tables.TemplateColumn( template_code="{{ value }}U", verbose_name=_('Height') @@ -113,14 +182,14 @@ class RackTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): class Meta(NetBoxTable.Meta): model = Rack fields = ( - 'pk', 'id', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'tenant_group', 'role', 'serial', - 'asset_tag', 'type', 'u_height', 'starting_unit', 'width', 'outer_width', 'outer_depth', 'mounting_depth', - 'weight', 'max_weight', 'comments', 'device_count', 'get_utilization', 'get_power_utilization', - 'description', 'contacts', 'tags', 'created', 'last_updated', + 'pk', 'id', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'tenant_group', 'role', + 'rack_type', 'serial', 'asset_tag', 'form_factor', 'u_height', 'starting_unit', 'width', 'outer_width', + 'outer_depth', 'mounting_depth', 'airflow', 'weight', 'max_weight', 'comments', 'device_count', + 'get_utilization', 'get_power_utilization', 'description', 'contacts', 'tags', 'created', 'last_updated', ) default_columns = ( - 'pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'u_height', 'device_count', - 'get_utilization', + 'pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'rack_type', 'u_height', + 'device_count', 'get_utilization', ) diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 90b097e0ac..573fdbb967 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -1,4 +1,3 @@ -from django.contrib.auth import get_user_model from django.test import override_settings from django.urls import reverse from django.utils.translation import gettext as _ @@ -11,15 +10,13 @@ from ipam.models import ASN, RIR, VLAN, VRF from netbox.api.serializers import GenericObjectSerializer from tenancy.models import Tenant +from users.models import User from utilities.testing import APITestCase, APIViewTestCases, create_test_device from virtualization.models import Cluster, ClusterType from wireless.choices import WirelessChannelChoices from wireless.models import WirelessLAN -User = get_user_model() - - class AppTest(APITestCase): def test_root(self): @@ -195,7 +192,7 @@ class LocationTest(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } - user_permissions = ('dcim.view_site', ) + user_permissions = ('dcim.view_site',) @classmethod def setUpTestData(cls): @@ -275,6 +272,51 @@ def setUpTestData(cls): RackRole.objects.bulk_create(rack_roles) +class RackTypeTest(APIViewTestCases.APIViewTestCase): + model = RackType + brief_fields = ['description', 'display', 'id', 'manufacturer', 'model', 'slug', 'url'] + bulk_update_data = { + 'description': 'new description', + } + user_permissions = ('dcim.view_manufacturer',) + + @classmethod + def setUpTestData(cls): + manufacturers = ( + Manufacturer(name='Manufacturer 1', slug='manufacturer-1'), + Manufacturer(name='Manufacturer 2', slug='manufacturer-2'), + ) + Manufacturer.objects.bulk_create(manufacturers) + + rack_types = ( + RackType(manufacturer=manufacturers[0], model='Rack Type 1', slug='rack-type-1', form_factor=RackFormFactorChoices.TYPE_CABINET,), + RackType(manufacturer=manufacturers[0], model='Rack Type 2', slug='rack-type-2', form_factor=RackFormFactorChoices.TYPE_CABINET,), + RackType(manufacturer=manufacturers[0], model='Rack Type 3', slug='rack-type-3', form_factor=RackFormFactorChoices.TYPE_CABINET,), + ) + RackType.objects.bulk_create(rack_types) + + cls.create_data = [ + { + 'manufacturer': manufacturers[1].pk, + 'model': 'Rack Type 4', + 'slug': 'rack-type-4', + 'form_factor': RackFormFactorChoices.TYPE_CABINET, + }, + { + 'manufacturer': manufacturers[1].pk, + 'model': 'Rack Type 5', + 'slug': 'rack-type-5', + 'form_factor': RackFormFactorChoices.TYPE_CABINET, + }, + { + 'manufacturer': manufacturers[1].pk, + 'model': 'Rack Type 6', + 'slug': 'rack-type-6', + 'form_factor': RackFormFactorChoices.TYPE_CABINET, + }, + ] + + class RackTest(APIViewTestCases.APIViewTestCase): model = Rack brief_fields = ['description', 'device_count', 'display', 'id', 'name', 'url'] @@ -1329,7 +1371,8 @@ def setUpTestData(cls): ModuleBay(device=device, name='Module Bay 5'), ModuleBay(device=device, name='Module Bay 6'), ) - ModuleBay.objects.bulk_create(module_bays) + for module_bay in module_bays: + module_bay.save() modules = ( Module(device=device, module_bay=module_bays[0], module_type=module_types[0]), @@ -1795,12 +1838,13 @@ def setUpTestData(cls): device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1') device = Device.objects.create(device_type=device_type, role=role, name='Device 1', site=site) - device_bays = ( + module_bays = ( ModuleBay(device=device, name='Device Bay 1'), ModuleBay(device=device, name='Device Bay 2'), ModuleBay(device=device, name='Device Bay 3'), ) - ModuleBay.objects.bulk_create(device_bays) + for module_bay in module_bays: + module_bay.save() cls.create_data = [ { diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 557bec4526..e2d52a6094 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -1,4 +1,3 @@ -from django.contrib.auth import get_user_model from django.test import TestCase from circuits.models import Circuit, CircuitTermination, CircuitType, Provider @@ -8,12 +7,11 @@ from ipam.models import ASN, IPAddress, RIR, VRF from netbox.choices import ColorChoices from tenancy.models import Tenant, TenantGroup +from users.models import User from utilities.testing import ChangeLoggedFilterSetTests, create_test_device from virtualization.models import Cluster, ClusterType, ClusterGroup from wireless.choices import WirelessChannelChoices, WirelessRoleChoices -User = get_user_model() - class DeviceComponentFilterSetTests: @@ -40,10 +38,8 @@ def test_device_role(self): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_device_status(self): - params = {'device_status': ['active']} + params = {'device_status': ['active', 'planned']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - params = {'device_status': ['offline', 'active']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) class DeviceComponentTemplateFilterSetTests: @@ -56,9 +52,9 @@ def test_description(self): params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_devicetype_id(self): + def test_device_type_id(self): device_types = DeviceType.objects.all()[:2] - params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} + params = {'device_type_id': [device_types[0].pk, device_types[1].pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -474,6 +470,152 @@ def test_description(self): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) +class RackTypeTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = RackType.objects.all() + filterset = RackTypeFilterSet + + @classmethod + def setUpTestData(cls): + manufacturers = ( + Manufacturer(name='Manufacturer 1', slug='manufacturer-1'), + Manufacturer(name='Manufacturer 2', slug='manufacturer-2'), + Manufacturer(name='Manufacturer 3', slug='manufacturer-3'), + ) + Manufacturer.objects.bulk_create(manufacturers) + + racks = ( + RackType( + manufacturer=manufacturers[0], + model='RackType 1', + slug='rack-type-1', + form_factor=RackFormFactorChoices.TYPE_2POST, + width=RackWidthChoices.WIDTH_19IN, + u_height=42, + starting_unit=1, + desc_units=False, + outer_width=100, + outer_depth=100, + outer_unit=RackDimensionUnitChoices.UNIT_MILLIMETER, + mounting_depth=100, + weight=10, + max_weight=1000, + weight_unit=WeightUnitChoices.UNIT_POUND, + description='foobar1', + ), + RackType( + manufacturer=manufacturers[1], + model='RackType 2', + slug='rack-type-2', + form_factor=RackFormFactorChoices.TYPE_4POST, + width=RackWidthChoices.WIDTH_21IN, + u_height=43, + starting_unit=2, + desc_units=False, + outer_width=200, + outer_depth=200, + outer_unit=RackDimensionUnitChoices.UNIT_MILLIMETER, + mounting_depth=200, + weight=20, + max_weight=2000, + weight_unit=WeightUnitChoices.UNIT_POUND, + description='foobar2', + ), + RackType( + manufacturer=manufacturers[2], + model='RackType 3', + slug='rack-type-3', + form_factor=RackFormFactorChoices.TYPE_CABINET, + width=RackWidthChoices.WIDTH_23IN, + u_height=44, + starting_unit=3, + desc_units=True, + outer_width=300, + outer_depth=300, + outer_unit=RackDimensionUnitChoices.UNIT_INCH, + mounting_depth=300, + weight=30, + max_weight=3000, + weight_unit=WeightUnitChoices.UNIT_KILOGRAM, + description='foobar3' + ), + ) + RackType.objects.bulk_create(racks) + + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_manufacturer(self): + manufacturers = Manufacturer.objects.all()[:2] + params = {'manufacturer_id': [manufacturers[0].pk, manufacturers[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'manufacturer': [manufacturers[0].slug, manufacturers[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_model(self): + params = {'model': ['RackType 1', 'RackType 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_slug(self): + params = {'slug': ['rack-type-1', 'rack-type-2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_form_factor(self): + params = {'form_factor': [RackFormFactorChoices.TYPE_2POST, RackFormFactorChoices.TYPE_4POST]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_width(self): + params = {'width': [RackWidthChoices.WIDTH_19IN, RackWidthChoices.WIDTH_21IN]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_u_height(self): + params = {'u_height': [42, 43]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_starting_unit(self): + params = {'starting_unit': [1, 2]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_desc_units(self): + params = {'desc_units': 'true'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + params = {'desc_units': 'false'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_outer_width(self): + params = {'outer_width': [100, 200]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_outer_depth(self): + params = {'outer_depth': [100, 200]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_outer_unit(self): + self.assertEqual(RackType.objects.filter(outer_unit__isnull=False).count(), 3) + params = {'outer_unit': RackDimensionUnitChoices.UNIT_MILLIMETER} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_mounting_depth(self): + params = {'mounting_depth': [100, 200]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_weight(self): + params = {'weight': [10, 20]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_max_weight(self): + params = {'max_weight': [1000, 2000]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_weight_unit(self): + params = {'weight_unit': WeightUnitChoices.UNIT_POUND} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + class RackTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = Rack.objects.all() filterset = RackFilterSet @@ -513,6 +655,53 @@ def setUpTestData(cls): for location in locations: location.save() + manufacturers = ( + Manufacturer(name='Manufacturer 1', slug='manufacturer-1'), + Manufacturer(name='Manufacturer 2', slug='manufacturer-2'), + Manufacturer(name='Manufacturer 3', slug='manufacturer-3'), + ) + Manufacturer.objects.bulk_create(manufacturers) + + rack_types = ( + RackType( + manufacturer=manufacturers[0], + model='RackType 1', + slug='rack-type-1', + form_factor=RackFormFactorChoices.TYPE_2POST, + width=RackWidthChoices.WIDTH_19IN, + u_height=42, + starting_unit=1, + desc_units=False, + outer_width=100, + outer_depth=100, + outer_unit=RackDimensionUnitChoices.UNIT_MILLIMETER, + mounting_depth=100, + weight=10, + max_weight=1000, + weight_unit=WeightUnitChoices.UNIT_POUND, + description='foobar1' + ), + RackType( + manufacturer=manufacturers[1], + model='RackType 2', + slug='rack-type-2', + form_factor=RackFormFactorChoices.TYPE_4POST, + width=RackWidthChoices.WIDTH_21IN, + u_height=43, + starting_unit=2, + desc_units=False, + outer_width=200, + outer_depth=200, + outer_unit=RackDimensionUnitChoices.UNIT_MILLIMETER, + mounting_depth=200, + weight=20, + max_weight=2000, + weight_unit=WeightUnitChoices.UNIT_POUND, + description='foobar2' + ), + ) + RackType.objects.bulk_create(rack_types) + rack_roles = ( RackRole(name='Rack Role 1', slug='rack-role-1'), RackRole(name='Rack Role 2', slug='rack-role-2'), @@ -546,7 +735,7 @@ def setUpTestData(cls): role=rack_roles[0], serial='ABC', asset_tag='1001', - type=RackTypeChoices.TYPE_2POST, + form_factor=RackFormFactorChoices.TYPE_2POST, width=RackWidthChoices.WIDTH_19IN, u_height=42, desc_units=False, @@ -556,7 +745,8 @@ def setUpTestData(cls): weight=10, max_weight=1000, weight_unit=WeightUnitChoices.UNIT_POUND, - description='foobar1' + description='foobar1', + airflow=RackAirflowChoices.FRONT_TO_REAR ), Rack( name='Rack 2', @@ -568,7 +758,7 @@ def setUpTestData(cls): role=rack_roles[1], serial='DEF', asset_tag='1002', - type=RackTypeChoices.TYPE_4POST, + form_factor=RackFormFactorChoices.TYPE_4POST, width=RackWidthChoices.WIDTH_21IN, u_height=43, desc_units=False, @@ -578,7 +768,8 @@ def setUpTestData(cls): weight=20, max_weight=2000, weight_unit=WeightUnitChoices.UNIT_POUND, - description='foobar2' + description='foobar2', + airflow=RackAirflowChoices.REAR_TO_FRONT ), Rack( name='Rack 3', @@ -590,7 +781,7 @@ def setUpTestData(cls): role=rack_roles[2], serial='GHI', asset_tag='1003', - type=RackTypeChoices.TYPE_CABINET, + form_factor=RackFormFactorChoices.TYPE_CABINET, width=RackWidthChoices.WIDTH_23IN, u_height=44, desc_units=True, @@ -602,6 +793,28 @@ def setUpTestData(cls): weight_unit=WeightUnitChoices.UNIT_KILOGRAM, description='foobar3' ), + Rack( + name='Rack 4', + facility_id='rack-4', + site=sites[2], + location=locations[2], + tenant=tenants[2], + status=RackStatusChoices.STATUS_PLANNED, + role=rack_roles[2], + rack_type=rack_types[0], + description='foobar4' + ), + Rack( + name='Rack 5', + facility_id='rack-5', + site=sites[2], + location=locations[2], + tenant=tenants[2], + status=RackStatusChoices.STATUS_PLANNED, + role=rack_roles[2], + rack_type=rack_types[1], + description='foobar5' + ), ) Rack.objects.bulk_create(racks) @@ -625,21 +838,21 @@ def test_description(self): params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_type(self): - params = {'type': [RackTypeChoices.TYPE_2POST, RackTypeChoices.TYPE_4POST]} + def test_form_factor(self): + params = {'form_factor': [RackFormFactorChoices.TYPE_2POST, RackFormFactorChoices.TYPE_4POST]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_width(self): params = {'width': [RackWidthChoices.WIDTH_19IN, RackWidthChoices.WIDTH_21IN]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) def test_u_height(self): params = {'u_height': [42, 43]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) def test_starting_unit(self): params = {'starting_unit': [1]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5) params = {'starting_unit': [2]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 0) @@ -647,7 +860,7 @@ def test_desc_units(self): params = {'desc_units': 'true'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) params = {'desc_units': 'false'} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) def test_outer_width(self): params = {'outer_width': [100, 200]} @@ -658,7 +871,7 @@ def test_outer_depth(self): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_outer_unit(self): - self.assertEqual(Rack.objects.filter(outer_unit__isnull=False).count(), 3) + self.assertEqual(Rack.objects.filter(outer_unit__isnull=False).count(), 5) params = {'outer_unit': RackDimensionUnitChoices.UNIT_MILLIMETER} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -692,7 +905,7 @@ def test_location(self): def test_status(self): params = {'status': [RackStatusChoices.STATUS_ACTIVE, RackStatusChoices.STATUS_PLANNED]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) def test_role(self): roles = RackRole.objects.all()[:2] @@ -733,6 +946,24 @@ def test_weight_unit(self): params = {'weight_unit': WeightUnitChoices.UNIT_POUND} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_manufacturer(self): + manufacturers = Manufacturer.objects.all()[:2] + params = {'manufacturer_id': [manufacturers[0].pk, manufacturers[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'manufacturer': [manufacturers[0].slug, manufacturers[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_rack_type(self): + rack_types = RackType.objects.all()[:2] + params = {'rack_type_id': [rack_types[0].pk, rack_types[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'rack_type': [rack_types[0].slug, rack_types[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_airflow(self): + params = {'airflow': RackAirflowChoices.FRONT_TO_REAR} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + class RackReservationTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = RackReservation.objects.all() @@ -1155,7 +1386,8 @@ def setUpTestData(cls): part_number='Part Number 1', weight=10, weight_unit=WeightUnitChoices.UNIT_POUND, - description='foobar1' + description='foobar1', + airflow=ModuleAirflowChoices.FRONT_TO_REAR ), ModuleType( manufacturer=manufacturers[1], @@ -1163,7 +1395,8 @@ def setUpTestData(cls): part_number='Part Number 2', weight=20, weight_unit=WeightUnitChoices.UNIT_POUND, - description='foobar2' + description='foobar2', + airflow=ModuleAirflowChoices.REAR_TO_FRONT ), ModuleType( manufacturer=manufacturers[2], @@ -1274,6 +1507,10 @@ def test_weight_unit(self): params = {'weight_unit': WeightUnitChoices.UNIT_POUND} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_airflow(self): + params = {'airflow': RackAirflowChoices.FRONT_TO_REAR} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + class ConsolePortTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ChangeLoggedFilterSetTests): queryset = ConsolePortTemplate.objects.all() @@ -1650,16 +1887,27 @@ def setUpTestData(cls): ) DeviceType.objects.bulk_create(device_types) + module_types = ( + ModuleType(manufacturer=manufacturer, model='Module Type 1'), + ModuleType(manufacturer=manufacturer, model='Module Type 2'), + ) + ModuleType.objects.bulk_create(module_types) + ModuleBayTemplate.objects.bulk_create(( ModuleBayTemplate(device_type=device_types[0], name='Module Bay 1', description='foobar1'), - ModuleBayTemplate(device_type=device_types[1], name='Module Bay 2', description='foobar2'), - ModuleBayTemplate(device_type=device_types[2], name='Module Bay 3', description='foobar3'), + ModuleBayTemplate(device_type=device_types[1], name='Module Bay 2', description='foobar2', module_type=module_types[0]), + ModuleBayTemplate(device_type=device_types[2], name='Module Bay 3', description='foobar3', module_type=module_types[1]), )) def test_name(self): params = {'name': ['Module Bay 1', 'Module Bay 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_module_type(self): + module_types = ModuleType.objects.all()[:2] + params = {'module_type_id': [module_types[0].pk, module_types[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + class DeviceBayTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ChangeLoggedFilterSetTests): queryset = DeviceBayTemplate.objects.all() @@ -1759,9 +2007,9 @@ def test_name(self): params = {'name': ['Inventory Item 1', 'Inventory Item 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_devicetype_id(self): + def test_device_type_id(self): device_types = DeviceType.objects.all()[:2] - params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} + params = {'device_type_id': [device_types[0].pk, device_types[1].pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) def test_label(self): @@ -2088,10 +2336,8 @@ def setUpTestData(cls): FrontPort(device=devices[0], name='Front Port 1', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[0]), FrontPort(device=devices[1], name='Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[1]), )) - ModuleBay.objects.bulk_create(( - ModuleBay(device=devices[0], name='Module Bay 1'), - ModuleBay(device=devices[1], name='Module Bay 2'), - )) + ModuleBay.objects.create(device=devices[0], name='Module Bay 1') + ModuleBay.objects.create(device=devices[1], name='Module Bay 2') DeviceBay.objects.bulk_create(( DeviceBay(device=devices[0], name='Device Bay 1'), DeviceBay(device=devices[1], name='Device Bay 2'), @@ -2403,7 +2649,8 @@ def setUpTestData(cls): ModuleBay(device=devices[2], name='Module Bay 2'), ModuleBay(device=devices[2], name='Module Bay 3'), ) - ModuleBay.objects.bulk_create(module_bays) + for module_bay in module_bays: + module_bay.save() modules = ( Module( @@ -2595,9 +2842,9 @@ def setUpTestData(cls): devices = ( Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='planned'), Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), - Device(name=None, device_type=device_types[0], role=roles[0], site=sites[3], status='planned'), # For cable connections + Device(name=None, device_type=device_types[0], role=roles[0], site=sites[3], status='offline'), # For cable connections ) Device.objects.bulk_create(devices) @@ -2606,7 +2853,8 @@ def setUpTestData(cls): ModuleBay(device=devices[1], name='Module Bay 2'), ModuleBay(device=devices[2], name='Module Bay 3'), ) - ModuleBay.objects.bulk_create(module_bays) + for module_bay in module_bays: + module_bay.save() modules = ( Module(device=devices[0], module_bay=module_bays[0], module_type=module_type), @@ -2775,9 +3023,9 @@ def setUpTestData(cls): devices = ( Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='planned'), Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), - Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='planned'), # For cable connections + Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='offline'), # For cable connections ) Device.objects.bulk_create(devices) @@ -2786,7 +3034,8 @@ def setUpTestData(cls): ModuleBay(device=devices[1], name='Module Bay 2'), ModuleBay(device=devices[2], name='Module Bay 3'), ) - ModuleBay.objects.bulk_create(module_bays) + for module_bay in module_bays: + module_bay.save() modules = ( Module(device=devices[0], module_bay=module_bays[0], module_type=module_type), @@ -2955,9 +3204,9 @@ def setUpTestData(cls): devices = ( Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='planned'), Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), - Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='planned'), # For cable connections + Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='offline'), # For cable connections ) Device.objects.bulk_create(devices) @@ -2966,7 +3215,8 @@ def setUpTestData(cls): ModuleBay(device=devices[1], name='Module Bay 2'), ModuleBay(device=devices[2], name='Module Bay 3'), ) - ModuleBay.objects.bulk_create(module_bays) + for module_bay in module_bays: + module_bay.save() modules = ( Module(device=devices[0], module_bay=module_bays[0], module_type=module_type), @@ -3143,9 +3393,9 @@ def setUpTestData(cls): devices = ( Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='planned'), Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), - Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='planned'), # For cable connections + Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='offline'), # For cable connections ) Device.objects.bulk_create(devices) @@ -3154,7 +3404,8 @@ def setUpTestData(cls): ModuleBay(device=devices[1], name='Module Bay 2'), ModuleBay(device=devices[2], name='Module Bay 3'), ) - ModuleBay.objects.bulk_create(module_bays) + for module_bay in module_bays: + module_bay.save() modules = ( Module(device=devices[0], module_bay=module_bays[0], module_type=module_type), @@ -3353,7 +3604,7 @@ def setUpTestData(cls): virtual_chassis=virtual_chassis, vc_position=2, vc_priority=1, - status='active', + status='planned', ), Device( name='Device 2', @@ -3371,7 +3622,7 @@ def setUpTestData(cls): site=sites[2], location=locations[2], rack=racks[2], - status='planned', + status='offline', ), # For cable connections Device( @@ -3379,7 +3630,7 @@ def setUpTestData(cls): device_type=device_types[2], role=roles[2], site=sites[3], - status='planned', + status='offline', ), ) Device.objects.bulk_create(devices) @@ -3390,7 +3641,8 @@ def setUpTestData(cls): ModuleBay(device=devices[2], name='Module Bay 3'), ModuleBay(device=devices[3], name='Module Bay 4'), ) - ModuleBay.objects.bulk_create(module_bays) + for module_bay in module_bays: + module_bay.save() modules = ( Module(device=devices[0], module_bay=module_bays[0], module_type=module_type), @@ -3826,9 +4078,9 @@ def setUpTestData(cls): devices = ( Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='planned'), Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), - Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='planned'), # For cable connections + Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='offline'), # For cable connections ) Device.objects.bulk_create(devices) @@ -3837,7 +4089,8 @@ def setUpTestData(cls): ModuleBay(device=devices[1], name='Module Bay 2'), ModuleBay(device=devices[2], name='Module Bay 3'), ) - ModuleBay.objects.bulk_create(module_bays) + for module_bay in module_bays: + module_bay.save() modules = ( Module(device=devices[0], module_bay=module_bays[0], module_type=module_type), @@ -4015,9 +4268,9 @@ def setUpTestData(cls): devices = ( Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='planned'), Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), - Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='planned'), # For cable connections + Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='offline'), # For cable connections ) Device.objects.bulk_create(devices) @@ -4026,7 +4279,8 @@ def setUpTestData(cls): ModuleBay(device=devices[1], name='Module Bay 2'), ModuleBay(device=devices[2], name='Module Bay 3'), ) - ModuleBay.objects.bulk_create(module_bays) + for module_bay in module_bays: + module_bay.save() modules = ( Module(device=devices[0], module_bay=module_bays[0], module_type=module_type), @@ -4196,7 +4450,7 @@ def setUpTestData(cls): devices = ( Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='planned'), Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), ) Device.objects.bulk_create(devices) @@ -4205,8 +4459,22 @@ def setUpTestData(cls): ModuleBay(device=devices[0], name='Module Bay 1', label='A', description='First'), ModuleBay(device=devices[1], name='Module Bay 2', label='B', description='Second'), ModuleBay(device=devices[2], name='Module Bay 3', label='C', description='Third'), + ModuleBay(device=devices[2], name='Module Bay 4', label='D', description='Fourth'), + ModuleBay(device=devices[2], name='Module Bay 5', label='E', description='Fifth'), + ) + for module_bay in module_bays: + module_bay.save() + + module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Module Type 1') + modules = ( + Module(device=devices[0], module_bay=module_bays[0], module_type=module_type), + Module(device=devices[1], module_bay=module_bays[1], module_type=module_type), ) - ModuleBay.objects.bulk_create(module_bays) + Module.objects.bulk_create(modules) + module_bays[3].module = modules[0] + module_bays[3].save() + module_bays[4].module = modules[1] + module_bays[4].save() def test_name(self): params = {'name': ['Module Bay 1', 'Module Bay 2']} @@ -4262,6 +4530,11 @@ def test_device(self): params = {'device': [devices[0].name, devices[1].name]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_module(self): + modules = Module.objects.all()[:2] + params = {'module_id': [modules[0].pk, modules[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + class DeviceBayTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFilterSetTests): queryset = DeviceBay.objects.all() @@ -4325,7 +4598,7 @@ def setUpTestData(cls): devices = ( Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='planned'), Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), ) Device.objects.bulk_create(devices) diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index 9056a66c07..1c3dbb90b9 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -74,6 +74,61 @@ def test_change_location_site(self): self.assertEqual(PowerPanel.objects.get(pk=powerpanel1.pk).site, site_b) +class RackTypeTestCase(TestCase): + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + + RackType.objects.create( + manufacturer=manufacturer, + model='RackType 1', + slug='rack-type-1', + width=11, + u_height=22, + starting_unit=3, + desc_units=True, + outer_width=444, + outer_depth=5, + outer_unit=RackDimensionUnitChoices.UNIT_MILLIMETER, + weight=66, + weight_unit=WeightUnitChoices.UNIT_POUND, + max_weight=7777, + mounting_depth=8, + ) + + def test_rack_creation(self): + rack_type = RackType.objects.first() + sites = ( + Site(name='Site 1', slug='site-1'), + ) + Site.objects.bulk_create(sites) + locations = ( + Location(name='Location 1', slug='location-1', site=sites[0]), + ) + for location in locations: + location.save() + + rack = Rack.objects.create( + name='Rack 1', + facility_id='A101', + site=sites[0], + location=locations[0], + rack_type=rack_type + ) + self.assertEqual(rack.width, rack_type.width) + self.assertEqual(rack.u_height, rack_type.u_height) + self.assertEqual(rack.starting_unit, rack_type.starting_unit) + self.assertEqual(rack.desc_units, rack_type.desc_units) + self.assertEqual(rack.outer_width, rack_type.outer_width) + self.assertEqual(rack.outer_depth, rack_type.outer_depth) + self.assertEqual(rack.outer_unit, rack_type.outer_unit) + self.assertEqual(rack.weight, rack_type.weight) + self.assertEqual(rack.weight_unit, rack_type.weight_unit) + self.assertEqual(rack.max_weight, rack_type.max_weight) + self.assertEqual(rack.mounting_depth, rack_type.mounting_depth) + + class RackTestCase(TestCase): @classmethod @@ -565,6 +620,100 @@ def test_device_mismatched_site_cluster(self): Device(name='device1', site=sites[0], device_type=device_type, role=device_role, cluster=clusters[1]).full_clean() +class ModuleBayTestCase(TestCase): + + @classmethod + def setUpTestData(cls): + site = Site.objects.create(name='Test Site 1', slug='test-site-1') + manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') + device_type = DeviceType.objects.create( + manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1' + ) + device_role = DeviceRole.objects.create(name='Test Role 1', slug='test-role-1') + + # Create a CustomField with a default value & assign it to all component models + location = Location.objects.create(name='Location 1', slug='location-1', site=site) + rack = Rack.objects.create(name='Rack 1', site=site) + device = Device.objects.create(name='Device 1', device_type=device_type, role=device_role, site=site, location=location, rack=rack) + + module_bays = ( + ModuleBay(device=device, name='Module Bay 1', label='A', description='First'), + ModuleBay(device=device, name='Module Bay 2', label='B', description='Second'), + ModuleBay(device=device, name='Module Bay 3', label='C', description='Third'), + ) + for module_bay in module_bays: + module_bay.save() + + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Module Type 1') + modules = ( + Module(device=device, module_bay=module_bays[0], module_type=module_type), + Module(device=device, module_bay=module_bays[1], module_type=module_type), + Module(device=device, module_bay=module_bays[2], module_type=module_type), + ) + # M3 -> MB3 -> M2 -> MB2 -> M1 -> MB1 + Module.objects.bulk_create(modules) + module_bays[1].module = modules[0] + module_bays[1].clean() + module_bays[1].save() + module_bays[2].module = modules[1] + module_bays[2].clean() + module_bays[2].save() + + def test_module_bay_recursion(self): + module_bay_1 = ModuleBay.objects.get(name='Module Bay 1') + module_bay_2 = ModuleBay.objects.get(name='Module Bay 2') + module_bay_3 = ModuleBay.objects.get(name='Module Bay 3') + module_1 = Module.objects.get(module_bay=module_bay_1) + module_2 = Module.objects.get(module_bay=module_bay_2) + module_3 = Module.objects.get(module_bay=module_bay_3) + + # Confirm error if ModuleBay recurses + with self.assertRaises(ValidationError): + module_bay_1.module = module_3 + module_bay_1.clean() + module_bay_1.save() + + # Confirm error if Module recurses + with self.assertRaises(ValidationError): + module_1.module_bay = module_bay_3 + module_1.clean() + module_1.save() + + def test_single_module_token(self): + module_bays = ModuleBay.objects.all() + modules = Module.objects.all() + device_type = DeviceType.objects.first() + device_role = DeviceRole.objects.first() + site = Site.objects.first() + location = Location.objects.first() + rack = Rack.objects.first() + + # Create DeviceType components + ConsolePortTemplate.objects.create( + device_type=device_type, + name='{module}', + label='{module}', + ) + ModuleBayTemplate.objects.create( + device_type=device_type, + name='Module Bay 1' + ) + + device = Device.objects.create( + name='Device 2', + device_type=device_type, + role=device_role, + site=site, + location=location, + rack=rack + ) + cp = device.consoleports.first() + + def test_nested_module_token(self): + pass + + class CableTestCase(TestCase): @classmethod diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index ec85fc1d5f..7d6c343373 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -2,7 +2,6 @@ from zoneinfo import ZoneInfo import yaml -from django.contrib.auth import get_user_model from django.test import override_settings from django.urls import reverse from netaddr import EUI @@ -13,11 +12,10 @@ from ipam.models import ASN, RIR, VLAN, VRF from netbox.choices import CSVDelimiterChoices, ImportFormatChoices from tenancy.models import Tenant +from users.models import User from utilities.testing import ViewTestCases, create_tags, create_test_device, post_data from wireless.models import WirelessLAN -User = get_user_model() - class RegionTestCase(ViewTestCases.OrganizationalObjectViewTestCase): model = Region @@ -336,6 +334,76 @@ def setUpTestData(cls): } +class RackTypeTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = RackType + + @classmethod + def setUpTestData(cls): + manufacturers = ( + Manufacturer(name='Manufacturer 1', slug='manufacturer-1'), + Manufacturer(name='Manufacturer 2', slug='manufacturer-2'), + ) + Manufacturer.objects.bulk_create(manufacturers) + + rack_types = ( + RackType(manufacturer=manufacturers[0], model='RackType 1', slug='rack-type-1', form_factor=RackFormFactorChoices.TYPE_CABINET,), + RackType(manufacturer=manufacturers[0], model='RackType 2', slug='rack-type-2', form_factor=RackFormFactorChoices.TYPE_CABINET,), + RackType(manufacturer=manufacturers[0], model='RackType 3', slug='rack-type-3', form_factor=RackFormFactorChoices.TYPE_CABINET,), + ) + RackType.objects.bulk_create(rack_types) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'manufacturer': manufacturers[1].pk, + 'model': 'RackType X', + 'slug': 'rack-type-x', + 'type': RackFormFactorChoices.TYPE_CABINET, + 'width': RackWidthChoices.WIDTH_19IN, + 'u_height': 48, + 'desc_units': False, + 'outer_width': 500, + 'outer_depth': 500, + 'outer_unit': RackDimensionUnitChoices.UNIT_MILLIMETER, + 'starting_unit': 1, + 'weight': 100, + 'max_weight': 2000, + 'weight_unit': WeightUnitChoices.UNIT_POUND, + 'form_factor': RackFormFactorChoices.TYPE_CABINET, + 'comments': 'Some comments', + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "manufacturer,model,slug,width,u_height,weight,max_weight,weight_unit", + "Manufacturer 1,RackType 4,rack-type-4,19,42,100,2000,kg", + "Manufacturer 1,RackType 5,rack-type-5,19,42,100,2000,kg", + "Manufacturer 1,RackType 6,rack-type-6,19,42,100,2000,kg", + ) + + cls.csv_update_data = ( + "id,model", + f"{rack_types[0].pk},RackType 7", + f"{rack_types[1].pk},RackType 8", + f"{rack_types[2].pk},RackType 9", + ) + + cls.bulk_edit_data = { + 'manufacturer': manufacturers[1].pk, + 'type': RackFormFactorChoices.TYPE_4POST, + 'width': RackWidthChoices.WIDTH_23IN, + 'u_height': 49, + 'desc_units': True, + 'outer_width': 30, + 'outer_depth': 30, + 'outer_unit': RackDimensionUnitChoices.UNIT_INCH, + 'weight': 200, + 'max_weight': 4000, + 'weight_unit': WeightUnitChoices.UNIT_POUND, + 'comments': 'New comments', + } + + class RackTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = Rack @@ -380,7 +448,7 @@ def setUpTestData(cls): 'role': rackroles[1].pk, 'serial': '123456', 'asset_tag': 'ABCDEF', - 'type': RackTypeChoices.TYPE_CABINET, + 'form_factor': RackFormFactorChoices.TYPE_CABINET, 'width': RackWidthChoices.WIDTH_19IN, 'u_height': 48, 'desc_units': False, @@ -416,7 +484,7 @@ def setUpTestData(cls): 'status': RackStatusChoices.STATUS_DEPRECATED, 'role': rackroles[1].pk, 'serial': '654321', - 'type': RackTypeChoices.TYPE_4POST, + 'form_factor': RackFormFactorChoices.TYPE_4POST, 'width': RackWidthChoices.WIDTH_23IN, 'u_height': 49, 'desc_units': True, @@ -1832,12 +1900,9 @@ def test_device_frontports(self): @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) def test_device_modulebays(self): device = Device.objects.first() - device_bays = ( - ModuleBay(device=device, name='Module Bay 1'), - ModuleBay(device=device, name='Module Bay 2'), - ModuleBay(device=device, name='Module Bay 3'), - ) - ModuleBay.objects.bulk_create(device_bays) + ModuleBay.objects.create(device=device, name='Module Bay 1') + ModuleBay.objects.create(device=device, name='Module Bay 2') + ModuleBay.objects.create(device=device, name='Module Bay 3') url = reverse('dcim:device_modulebays', kwargs={'pk': device.pk}) self.assertHttpStatus(self.client.get(url), 200) @@ -1913,7 +1978,8 @@ def setUpTestData(cls): ModuleBay(device=devices[1], name='Module Bay 4'), ModuleBay(device=devices[1], name='Module Bay 5'), ) - ModuleBay.objects.bulk_create(module_bays) + for module_bay in module_bays: + module_bay.save() modules = ( Module(device=devices[0], module_bay=module_bays[0], module_type=module_types[0]), @@ -2715,7 +2781,8 @@ def setUpTestData(cls): ModuleBay(device=device, name='Module Bay 2'), ModuleBay(device=device, name='Module Bay 3'), ) - ModuleBay.objects.bulk_create(module_bays) + for module_bay in module_bays: + module_bay.save() tags = create_tags('Alpha', 'Bravo', 'Charlie') diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index c71a0aff13..627136bf96 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -63,6 +63,14 @@ path('racks/delete/', views.RackBulkDeleteView.as_view(), name='rack_bulk_delete'), path('racks//', include(get_model_urls('dcim', 'rack'))), + # Rack Types + path('rack-types/', views.RackTypeListView.as_view(), name='racktype_list'), + path('rack-types/add/', views.RackTypeEditView.as_view(), name='racktype_add'), + path('rack-types/import/', views.RackTypeBulkImportView.as_view(), name='racktype_import'), + path('rack-types/edit/', views.RackTypeBulkEditView.as_view(), name='racktype_bulk_edit'), + path('rack-types/delete/', views.RackTypeBulkDeleteView.as_view(), name='racktype_bulk_delete'), + path('rack-types//', include(get_model_urls('dcim', 'racktype'))), + # Manufacturers path('manufacturers/', views.ManufacturerListView.as_view(), name='manufacturer_list'), path('manufacturers/add/', views.ManufacturerEditView.as_view(), name='manufacturer_add'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 5fbcff862d..1f5b736039 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -581,6 +581,58 @@ class RackRoleBulkDeleteView(generic.BulkDeleteView): table = tables.RackRoleTable +# +# RackTypes +# + +class RackTypeListView(generic.ObjectListView): + queryset = RackType.objects.annotate( + instance_count=count_related(Rack, 'rack_type') + ) + filterset = filtersets.RackTypeFilterSet + filterset_form = forms.RackTypeFilterForm + table = tables.RackTypeTable + + +@register_model_view(RackType) +class RackTypeView(GetRelatedModelsMixin, generic.ObjectView): + queryset = RackType.objects.all() + + def get_extra_context(self, request, instance): + return { + 'related_models': self.get_related_models(request, instance), + } + + +@register_model_view(RackType, 'edit') +class RackTypeEditView(generic.ObjectEditView): + queryset = RackType.objects.all() + form = forms.RackTypeForm + + +@register_model_view(RackType, 'delete') +class RackTypeDeleteView(generic.ObjectDeleteView): + queryset = RackType.objects.all() + + +class RackTypeBulkImportView(generic.BulkImportView): + queryset = RackType.objects.all() + model_form = forms.RackTypeImportForm + + +class RackTypeBulkEditView(generic.BulkEditView): + queryset = RackType.objects.all() + filterset = filtersets.RackTypeFilterSet + table = tables.RackTypeTable + form = forms.RackTypeBulkEditForm + + +class RackTypeBulkDeleteView(generic.BulkDeleteView): + queryset = RackType.objects.all() + filterset = filtersets.RackTypeFilterSet + table = tables.RackTypeTable + + # # Racks # @@ -1264,6 +1316,21 @@ class ModuleTypeRearPortsView(ModuleTypeComponentsView): ) +@register_model_view(ModuleType, 'modulebays', path='module-bays') +class ModuleTypeModuleBaysView(ModuleTypeComponentsView): + child_model = ModuleBayTemplate + table = tables.ModuleBayTemplateTable + filterset = filtersets.ModuleBayTemplateFilterSet + viewname = 'dcim:moduletype_modulebays' + tab = ViewTab( + label=_('Module Bays'), + badge=lambda obj: obj.modulebaytemplates.count(), + permission='dcim.view_modulebaytemplate', + weight=570, + hide_if_empty=True + ) + + class ModuleTypeImportView(generic.BulkImportView): additional_permissions = [ 'dcim.add_moduletype', diff --git a/netbox/extras/api/customfields.py b/netbox/extras/api/customfields.py index 09f2479294..578ab8c4b3 100644 --- a/netbox/extras/api/customfields.py +++ b/netbox/extras/api/customfields.py @@ -6,6 +6,7 @@ from core.models import ObjectType from extras.choices import CustomFieldTypeChoices +from extras.constants import CUSTOMFIELD_EMPTY_VALUES from extras.models import CustomField from utilities.api import get_serializer_for_model @@ -75,7 +76,7 @@ def to_internal_value(self, data): # Serialize object and multi-object values for cf in self._get_custom_fields(): - if cf.name in data and data[cf.name] not in (None, []) and cf.type in ( + if cf.name in data and data[cf.name] not in CUSTOMFIELD_EMPTY_VALUES and cf.type in ( CustomFieldTypeChoices.TYPE_OBJECT, CustomFieldTypeChoices.TYPE_MULTIOBJECT ): diff --git a/netbox/extras/api/nested_serializers.py b/netbox/extras/api/nested_serializers.py index 4bada494f8..ba291b34e7 100644 --- a/netbox/extras/api/nested_serializers.py +++ b/netbox/extras/api/nested_serializers.py @@ -1,3 +1,5 @@ +import warnings + from rest_framework import serializers from extras import models @@ -20,81 +22,77 @@ 'NestedWebhookSerializer', ] +# TODO: Remove in v4.2 +warnings.warn( + f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.", + DeprecationWarning +) + class NestedEventRuleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:eventrule-detail') class Meta: model = models.EventRule - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedWebhookSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail') class Meta: model = models.Webhook - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedCustomFieldSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfield-detail') class Meta: model = models.CustomField - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedCustomFieldChoiceSetSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfieldchoiceset-detail') class Meta: model = models.CustomFieldChoiceSet - fields = ['id', 'url', 'display', 'name', 'choices_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'choices_count'] class NestedCustomLinkSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:customlink-detail') class Meta: model = models.CustomLink - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedConfigContextSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:configcontext-detail') class Meta: model = models.ConfigContext - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedConfigTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:configtemplate-detail') class Meta: model = models.ConfigTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedExportTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:exporttemplate-detail') class Meta: model = models.ExportTemplate - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] class NestedSavedFilterSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:savedfilter-detail') class Meta: model = models.SavedFilter - fields = ['id', 'url', 'display', 'name', 'slug'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug'] class NestedBookmarkSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:bookmark-detail') class Meta: model = models.Bookmark @@ -102,7 +100,6 @@ class Meta: class NestedImageAttachmentSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:imageattachment-detail') class Meta: model = models.ImageAttachment @@ -110,11 +107,10 @@ class Meta: class NestedJournalEntrySerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:journalentry-detail') class Meta: model = models.JournalEntry - fields = ['id', 'url', 'display', 'created'] + fields = ['id', 'url', 'display_url', 'display', 'created'] class NestedScriptSerializer(WritableNestedSerializer): @@ -123,12 +119,17 @@ class NestedScriptSerializer(WritableNestedSerializer): lookup_field='full_name', lookup_url_kwarg='pk' ) + display_url = serializers.HyperlinkedIdentityField( + view_name='extras:script', + lookup_field='full_name', + lookup_url_kwarg='pk' + ) name = serializers.CharField(read_only=True) display = serializers.SerializerMethodField(read_only=True) class Meta: model = models.Script - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] def get_display(self, obj): return f'{obj.name} ({obj.module})' diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index bd19b3184a..5e799b504e 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -1,16 +1,15 @@ from .serializers_.objecttypes import * from .serializers_.attachments import * from .serializers_.bookmarks import * -from .serializers_.change_logging import * from .serializers_.customfields import * from .serializers_.customlinks import * from .serializers_.dashboard import * from .serializers_.events import * from .serializers_.exporttemplates import * from .serializers_.journaling import * +from .serializers_.notifications import * from .serializers_.configcontexts import * from .serializers_.configtemplates import * from .serializers_.savedfilters import * from .serializers_.scripts import * from .serializers_.tags import * -from .nested_serializers import * diff --git a/netbox/extras/api/serializers_/attachments.py b/netbox/extras/api/serializers_/attachments.py index 4d2809bc64..fe0964eae4 100644 --- a/netbox/extras/api/serializers_/attachments.py +++ b/netbox/extras/api/serializers_/attachments.py @@ -14,7 +14,6 @@ class ImageAttachmentSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:imageattachment-detail') object_type = ContentTypeField( queryset=ObjectType.objects.all() ) @@ -25,8 +24,8 @@ class ImageAttachmentSerializer(ValidatedModelSerializer): class Meta: model = ImageAttachment fields = [ - 'id', 'url', 'display', 'object_type', 'object_id', 'parent', 'name', 'image', 'image_height', - 'image_width', 'created', 'last_updated', + 'id', 'url', 'display', 'object_type', 'object_id', 'parent', 'name', 'image', + 'image_height', 'image_width', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'image') diff --git a/netbox/extras/api/serializers_/bookmarks.py b/netbox/extras/api/serializers_/bookmarks.py index 7a2d4d6aa7..a404d83c34 100644 --- a/netbox/extras/api/serializers_/bookmarks.py +++ b/netbox/extras/api/serializers_/bookmarks.py @@ -14,7 +14,6 @@ class BookmarkSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:bookmark-detail') object_type = ContentTypeField( queryset=ObjectType.objects.with_feature('bookmarks'), ) diff --git a/netbox/extras/api/serializers_/configcontexts.py b/netbox/extras/api/serializers_/configcontexts.py index e9688f2549..42a11ffcdb 100644 --- a/netbox/extras/api/serializers_/configcontexts.py +++ b/netbox/extras/api/serializers_/configcontexts.py @@ -20,7 +20,6 @@ class ConfigContextSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:configcontext-detail') regions = SerializedPKRelatedField( queryset=Region.objects.all(), serializer=RegionSerializer, @@ -123,9 +122,9 @@ class ConfigContextSerializer(ValidatedModelSerializer): class Meta: model = ConfigContext fields = [ - 'id', 'url', 'display', 'name', 'weight', 'description', 'is_active', 'regions', 'site_groups', 'sites', - 'locations', 'device_types', 'roles', 'platforms', 'cluster_types', 'cluster_groups', 'clusters', - 'tenant_groups', 'tenants', 'tags', 'data_source', 'data_path', 'data_file', 'data_synced', 'data', - 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'weight', 'description', 'is_active', 'regions', + 'site_groups', 'sites', 'locations', 'device_types', 'roles', 'platforms', 'cluster_types', + 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', 'tags', 'data_source', 'data_path', + 'data_file', 'data_synced', 'data', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/extras/api/serializers_/configtemplates.py b/netbox/extras/api/serializers_/configtemplates.py index 935214478e..30d2fb4685 100644 --- a/netbox/extras/api/serializers_/configtemplates.py +++ b/netbox/extras/api/serializers_/configtemplates.py @@ -11,7 +11,6 @@ class ConfigTemplateSerializer(TaggableModelSerializer, ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:configtemplate-detail') data_source = DataSourceSerializer( nested=True, required=False @@ -24,7 +23,7 @@ class ConfigTemplateSerializer(TaggableModelSerializer, ValidatedModelSerializer class Meta: model = ConfigTemplate fields = [ - 'id', 'url', 'display', 'name', 'description', 'environment_params', 'template_code', 'data_source', - 'data_path', 'data_file', 'data_synced', 'tags', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'description', 'environment_params', 'template_code', + 'data_source', 'data_path', 'data_file', 'data_synced', 'tags', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/extras/api/serializers_/customfields.py b/netbox/extras/api/serializers_/customfields.py index 082047e94a..a65fafc4e9 100644 --- a/netbox/extras/api/serializers_/customfields.py +++ b/netbox/extras/api/serializers_/customfields.py @@ -16,7 +16,6 @@ class CustomFieldChoiceSetSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfieldchoiceset-detail') base_choices = ChoiceField( choices=CustomFieldChoiceSetBaseChoices, required=False @@ -31,14 +30,13 @@ class CustomFieldChoiceSetSerializer(ValidatedModelSerializer): class Meta: model = CustomFieldChoiceSet fields = [ - 'id', 'url', 'display', 'name', 'description', 'base_choices', 'extra_choices', 'order_alphabetically', - 'choices_count', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'description', 'base_choices', 'extra_choices', + 'order_alphabetically', 'choices_count', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'choices_count') class CustomFieldSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfield-detail') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('custom_fields'), many=True @@ -62,10 +60,11 @@ class CustomFieldSerializer(ValidatedModelSerializer): class Meta: model = CustomField fields = [ - 'id', 'url', 'display', 'object_types', 'type', 'related_object_type', 'data_type', 'name', 'label', - 'group_name', 'description', 'required', 'search_weight', 'filter_logic', 'ui_visible', 'ui_editable', - 'is_cloneable', 'default', 'weight', 'validation_minimum', 'validation_maximum', 'validation_regex', - 'choice_set', 'comments', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'object_types', 'type', 'related_object_type', 'data_type', + 'name', 'label', 'group_name', 'description', 'required', 'unique', 'search_weight', 'filter_logic', + 'ui_visible', 'ui_editable', 'is_cloneable', 'default', 'related_object_filter', 'weight', + 'validation_minimum', 'validation_maximum', 'validation_regex', 'choice_set', 'comments', 'created', + 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/extras/api/serializers_/customlinks.py b/netbox/extras/api/serializers_/customlinks.py index 8635ea2a08..6391e04713 100644 --- a/netbox/extras/api/serializers_/customlinks.py +++ b/netbox/extras/api/serializers_/customlinks.py @@ -11,7 +11,6 @@ class CustomLinkSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:customlink-detail') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('custom_links'), many=True @@ -20,7 +19,7 @@ class CustomLinkSerializer(ValidatedModelSerializer): class Meta: model = CustomLink fields = [ - 'id', 'url', 'display', 'object_types', 'name', 'enabled', 'link_text', 'link_url', 'weight', 'group_name', - 'button_class', 'new_window', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'object_types', 'name', 'enabled', 'link_text', 'link_url', + 'weight', 'group_name', 'button_class', 'new_window', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name') diff --git a/netbox/extras/api/serializers_/events.py b/netbox/extras/api/serializers_/events.py index 469da3e8ca..926259cf3a 100644 --- a/netbox/extras/api/serializers_/events.py +++ b/netbox/extras/api/serializers_/events.py @@ -21,7 +21,6 @@ # class EventRuleSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:eventrule-detail') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('event_rules'), many=True @@ -35,9 +34,9 @@ class EventRuleSerializer(NetBoxModelSerializer): class Meta: model = EventRule fields = [ - 'id', 'url', 'display', 'object_types', 'name', 'type_create', 'type_update', 'type_delete', - 'type_job_start', 'type_job_end', 'enabled', 'conditions', 'action_type', 'action_object_type', - 'action_object_id', 'action_object', 'description', 'custom_fields', 'tags', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'object_types', 'name', 'enabled', 'event_types', 'conditions', + 'action_type', 'action_object_type', 'action_object_id', 'action_object', 'description', 'custom_fields', + 'tags', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') @@ -58,13 +57,12 @@ def get_action_object(self, instance): # class WebhookSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail') class Meta: model = Webhook fields = [ - 'id', 'url', 'display', 'name', 'description', 'payload_url', 'http_method', 'http_content_type', - 'additional_headers', 'body_template', 'secret', 'ssl_verification', 'ca_file_path', 'custom_fields', - 'tags', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'description', 'payload_url', 'http_method', + 'http_content_type', 'additional_headers', 'body_template', 'secret', 'ssl_verification', 'ca_file_path', + 'custom_fields', 'tags', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/extras/api/serializers_/exporttemplates.py b/netbox/extras/api/serializers_/exporttemplates.py index 43cc061a72..faef9bb9ef 100644 --- a/netbox/extras/api/serializers_/exporttemplates.py +++ b/netbox/extras/api/serializers_/exporttemplates.py @@ -12,7 +12,6 @@ class ExportTemplateSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:exporttemplate-detail') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('export_templates'), many=True @@ -29,7 +28,7 @@ class ExportTemplateSerializer(ValidatedModelSerializer): class Meta: model = ExportTemplate fields = [ - 'id', 'url', 'display', 'object_types', 'name', 'description', 'template_code', 'mime_type', + 'id', 'url', 'display_url', 'display', 'object_types', 'name', 'description', 'template_code', 'mime_type', 'file_extension', 'as_attachment', 'data_source', 'data_path', 'data_file', 'data_synced', 'created', 'last_updated', ] diff --git a/netbox/extras/api/serializers_/journaling.py b/netbox/extras/api/serializers_/journaling.py index 1a44e7e2e7..cba56fc32f 100644 --- a/netbox/extras/api/serializers_/journaling.py +++ b/netbox/extras/api/serializers_/journaling.py @@ -1,4 +1,3 @@ -from django.contrib.auth import get_user_model from django.core.exceptions import ObjectDoesNotExist from drf_spectacular.utils import extend_schema_field from rest_framework import serializers @@ -8,6 +7,7 @@ from extras.models import JournalEntry from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.serializers import NetBoxModelSerializer +from users.models import User from utilities.api import get_serializer_for_model __all__ = ( @@ -16,14 +16,13 @@ class JournalEntrySerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:journalentry-detail') assigned_object_type = ContentTypeField( queryset=ObjectType.objects.all() ) assigned_object = serializers.SerializerMethodField(read_only=True) created_by = serializers.PrimaryKeyRelatedField( allow_null=True, - queryset=get_user_model().objects.all(), + queryset=User.objects.all(), required=False, default=serializers.CurrentUserDefault() ) @@ -35,8 +34,8 @@ class JournalEntrySerializer(NetBoxModelSerializer): class Meta: model = JournalEntry fields = [ - 'id', 'url', 'display', 'assigned_object_type', 'assigned_object_id', 'assigned_object', 'created', - 'created_by', 'kind', 'comments', 'tags', 'custom_fields', 'last_updated', + 'id', 'url', 'display_url', 'display', 'assigned_object_type', 'assigned_object_id', 'assigned_object', + 'created', 'created_by', 'kind', 'comments', 'tags', 'custom_fields', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'created') diff --git a/netbox/extras/api/serializers_/notifications.py b/netbox/extras/api/serializers_/notifications.py new file mode 100644 index 0000000000..62e1a8d635 --- /dev/null +++ b/netbox/extras/api/serializers_/notifications.py @@ -0,0 +1,82 @@ +from drf_spectacular.utils import extend_schema_field +from rest_framework import serializers + +from core.models import ObjectType +from extras.models import Notification, NotificationGroup, Subscription +from netbox.api.fields import ContentTypeField, SerializedPKRelatedField +from netbox.api.serializers import ValidatedModelSerializer +from users.api.serializers_.users import GroupSerializer, UserSerializer +from users.models import Group, User +from utilities.api import get_serializer_for_model + +__all__ = ( + 'NotificationSerializer', + 'NotificationGroupSerializer', + 'SubscriptionSerializer', +) + + +class NotificationSerializer(ValidatedModelSerializer): + object_type = ContentTypeField( + queryset=ObjectType.objects.with_feature('notifications'), + ) + object = serializers.SerializerMethodField(read_only=True) + user = UserSerializer(nested=True) + + class Meta: + model = Notification + fields = [ + 'id', 'url', 'display', 'object_type', 'object_id', 'object', 'user', 'created', 'read', 'event_type', + ] + brief_fields = ('id', 'url', 'display', 'object_type', 'object_id', 'user', 'read', 'event_type') + + @extend_schema_field(serializers.JSONField(allow_null=True)) + def get_object(self, instance): + serializer = get_serializer_for_model(instance.object) + context = {'request': self.context['request']} + return serializer(instance.object, nested=True, context=context).data + + +class NotificationGroupSerializer(ValidatedModelSerializer): + groups = SerializedPKRelatedField( + queryset=Group.objects.all(), + serializer=GroupSerializer, + nested=True, + required=False, + many=True + ) + users = SerializedPKRelatedField( + queryset=User.objects.all(), + serializer=UserSerializer, + nested=True, + required=False, + many=True + ) + + class Meta: + model = NotificationGroup + fields = [ + 'id', 'url', 'display', 'display_url', 'name', 'description', 'groups', 'users', + ] + brief_fields = ('id', 'url', 'display', 'name', 'description') + + +class SubscriptionSerializer(ValidatedModelSerializer): + object_type = ContentTypeField( + queryset=ObjectType.objects.with_feature('notifications'), + ) + object = serializers.SerializerMethodField(read_only=True) + user = UserSerializer(nested=True) + + class Meta: + model = Subscription + fields = [ + 'id', 'url', 'display', 'object_type', 'object_id', 'object', 'user', 'created', + ] + brief_fields = ('id', 'url', 'display', 'object_type', 'object_id', 'user') + + @extend_schema_field(serializers.JSONField(allow_null=True)) + def get_object(self, instance): + serializer = get_serializer_for_model(instance.object) + context = {'request': self.context['request']} + return serializer(instance.object, nested=True, context=context).data diff --git a/netbox/extras/api/serializers_/savedfilters.py b/netbox/extras/api/serializers_/savedfilters.py index 9e26f0c305..1403037971 100644 --- a/netbox/extras/api/serializers_/savedfilters.py +++ b/netbox/extras/api/serializers_/savedfilters.py @@ -11,7 +11,6 @@ class SavedFilterSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:savedfilter-detail') object_types = ContentTypeField( queryset=ObjectType.objects.all(), many=True @@ -20,7 +19,7 @@ class SavedFilterSerializer(ValidatedModelSerializer): class Meta: model = SavedFilter fields = [ - 'id', 'url', 'display', 'object_types', 'name', 'slug', 'description', 'user', 'weight', 'enabled', - 'shared', 'parameters', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'object_types', 'name', 'slug', 'description', 'user', 'weight', + 'enabled', 'shared', 'parameters', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description') diff --git a/netbox/extras/api/serializers_/scripts.py b/netbox/extras/api/serializers_/scripts.py index 38b3653aee..897ccf9664 100644 --- a/netbox/extras/api/serializers_/scripts.py +++ b/netbox/extras/api/serializers_/scripts.py @@ -14,7 +14,6 @@ class ScriptSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:script-detail') description = serializers.SerializerMethodField(read_only=True) vars = serializers.SerializerMethodField(read_only=True) result = JobSerializer(nested=True, read_only=True) @@ -22,7 +21,7 @@ class ScriptSerializer(ValidatedModelSerializer): class Meta: model = Script fields = [ - 'id', 'url', 'module', 'name', 'description', 'vars', 'result', 'display', 'is_executable', + 'id', 'url', 'display_url', 'module', 'name', 'description', 'vars', 'result', 'display', 'is_executable', ] brief_fields = ('id', 'url', 'display', 'name', 'description') diff --git a/netbox/extras/api/serializers_/tags.py b/netbox/extras/api/serializers_/tags.py index 9d91ba5e1e..946ed3c8a8 100644 --- a/netbox/extras/api/serializers_/tags.py +++ b/netbox/extras/api/serializers_/tags.py @@ -11,7 +11,6 @@ class TagSerializer(ValidatedModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detail') object_types = ContentTypeField( queryset=ObjectType.objects.with_feature('tags'), many=True, @@ -24,7 +23,7 @@ class TagSerializer(ValidatedModelSerializer): class Meta: model = Tag fields = [ - 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'object_types', 'tagged_items', 'created', - 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'object_types', + 'tagged_items', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'color', 'description') diff --git a/netbox/extras/api/urls.py b/netbox/extras/api/urls.py index 301cc1b0a5..bbcb8f0ef2 100644 --- a/netbox/extras/api/urls.py +++ b/netbox/extras/api/urls.py @@ -15,13 +15,15 @@ router.register('export-templates', views.ExportTemplateViewSet) router.register('saved-filters', views.SavedFilterViewSet) router.register('bookmarks', views.BookmarkViewSet) +router.register('notifications', views.NotificationViewSet) +router.register('notification-groups', views.NotificationGroupViewSet) +router.register('subscriptions', views.SubscriptionViewSet) router.register('tags', views.TagViewSet) router.register('image-attachments', views.ImageAttachmentViewSet) router.register('journal-entries', views.JournalEntryViewSet) router.register('config-contexts', views.ConfigContextViewSet) router.register('config-templates', views.ConfigTemplateViewSet) router.register('scripts', views.ScriptViewSet, basename='script') -router.register('object-changes', views.ObjectChangeViewSet) router.register('object-types', views.ObjectTypeViewSet) app_name = 'extras-api' diff --git a/netbox/extras/api/views.py b/netbox/extras/api/views.py index 05087b2d5e..142be1b8ab 100644 --- a/netbox/extras/api/views.py +++ b/netbox/extras/api/views.py @@ -1,5 +1,6 @@ from django.http import Http404 from django.shortcuts import get_object_or_404 +from django.utils.module_loading import import_string from django_rq.queues import get_connection from rest_framework import status from rest_framework.decorators import action @@ -11,10 +12,10 @@ from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet from rq import Worker -from core.models import Job, ObjectType +from core.models import ObjectType from extras import filtersets from extras.models import * -from extras.scripts import run_script +from extras.jobs import ScriptJob from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired from netbox.api.features import SyncedDataMixin from netbox.api.metadata import ContentTypeMetadata @@ -140,6 +141,27 @@ class BookmarkViewSet(NetBoxModelViewSet): filterset_class = filtersets.BookmarkFilterSet +# +# Notifications & subscriptions +# + +class NotificationViewSet(NetBoxModelViewSet): + metadata_class = ContentTypeMetadata + queryset = Notification.objects.all() + serializer_class = serializers.NotificationSerializer + + +class NotificationGroupViewSet(NetBoxModelViewSet): + queryset = NotificationGroup.objects.all() + serializer_class = serializers.NotificationGroupSerializer + + +class SubscriptionViewSet(NetBoxModelViewSet): + metadata_class = ContentTypeMetadata + queryset = Subscription.objects.all() + serializer_class = serializers.SubscriptionSerializer + + # # Tags # @@ -252,10 +274,8 @@ def post(self, request, pk): raise RQWorkerNotRunningException() if input_serializer.is_valid(): - Job.enqueue( - run_script, + ScriptJob.enqueue( instance=script, - name=script.python_class.class_name, user=request.user, data=input_serializer.data['data'], request=copy_safe_request(request), @@ -271,20 +291,6 @@ def post(self, request, pk): return Response(input_serializer.errors, status=status.HTTP_400_BAD_REQUEST) -# -# Change logging -# - -class ObjectChangeViewSet(ReadOnlyModelViewSet): - """ - Retrieve a list of recent changes. - """ - metadata_class = ContentTypeMetadata - queryset = ObjectChange.objects.valid_models() - serializer_class = serializers.ObjectChangeSerializer - filterset_class = filtersets.ObjectChangeFilterSet - - # # Object types # diff --git a/netbox/extras/choices.py b/netbox/extras/choices.py index 12e10f553a..4525d86891 100644 --- a/netbox/extras/choices.py +++ b/netbox/extras/choices.py @@ -127,23 +127,6 @@ class BookmarkOrderingChoices(ChoiceSet): (ORDERING_ALPHABETICAL_ZA, _('Alphabetical (Z-A)')), ) -# -# ObjectChanges -# - - -class ObjectChangeActionChoices(ChoiceSet): - - ACTION_CREATE = 'create' - ACTION_UPDATE = 'update' - ACTION_DELETE = 'delete' - - CHOICES = ( - (ACTION_CREATE, _('Created'), 'green'), - (ACTION_UPDATE, _('Updated'), 'blue'), - (ACTION_DELETE, _('Deleted'), 'red'), - ) - # # Journal entries @@ -173,16 +156,16 @@ class LogLevelChoices(ChoiceSet): LOG_DEBUG = 'debug' LOG_DEFAULT = 'default' - LOG_SUCCESS = 'success' LOG_INFO = 'info' + LOG_SUCCESS = 'success' LOG_WARNING = 'warning' LOG_FAILURE = 'failure' CHOICES = ( (LOG_DEBUG, _('Debug'), 'teal'), (LOG_DEFAULT, _('Default'), 'gray'), - (LOG_SUCCESS, _('Success'), 'green'), (LOG_INFO, _('Info'), 'cyan'), + (LOG_SUCCESS, _('Success'), 'green'), (LOG_WARNING, _('Warning'), 'yellow'), (LOG_FAILURE, _('Failure'), 'red'), ) @@ -190,8 +173,8 @@ class LogLevelChoices(ChoiceSet): SYSTEM_LEVELS = { LOG_DEBUG: logging.DEBUG, LOG_DEFAULT: logging.INFO, - LOG_SUCCESS: logging.INFO, LOG_INFO: logging.INFO, + LOG_SUCCESS: logging.INFO, LOG_WARNING: logging.WARNING, LOG_FAILURE: logging.ERROR, } @@ -208,35 +191,6 @@ class DurationChoices(ChoiceSet): ) -# -# Job results -# - -class JobResultStatusChoices(ChoiceSet): - - STATUS_PENDING = 'pending' - STATUS_SCHEDULED = 'scheduled' - STATUS_RUNNING = 'running' - STATUS_COMPLETED = 'completed' - STATUS_ERRORED = 'errored' - STATUS_FAILED = 'failed' - - CHOICES = ( - (STATUS_PENDING, _('Pending'), 'cyan'), - (STATUS_SCHEDULED, _('Scheduled'), 'gray'), - (STATUS_RUNNING, _('Running'), 'blue'), - (STATUS_COMPLETED, _('Completed'), 'green'), - (STATUS_ERRORED, _('Errored'), 'red'), - (STATUS_FAILED, _('Failed'), 'red'), - ) - - TERMINAL_STATE_CHOICES = ( - STATUS_COMPLETED, - STATUS_ERRORED, - STATUS_FAILED, - ) - - # # Webhooks # @@ -319,8 +273,10 @@ class EventRuleActionChoices(ChoiceSet): WEBHOOK = 'webhook' SCRIPT = 'script' + NOTIFICATION = 'notification' CHOICES = ( (WEBHOOK, _('Webhook')), (SCRIPT, _('Script')), + (NOTIFICATION, _('Notification')), ) diff --git a/netbox/extras/constants.py b/netbox/extras/constants.py index 48b44fb453..3bfe3b21b5 100644 --- a/netbox/extras/constants.py +++ b/netbox/extras/constants.py @@ -1,20 +1,21 @@ -# Events -EVENT_CREATE = 'create' -EVENT_UPDATE = 'update' -EVENT_DELETE = 'delete' -EVENT_JOB_START = 'job_start' -EVENT_JOB_END = 'job_end' +from core.events import * +from extras.choices import LogLevelChoices +# Custom fields +CUSTOMFIELD_EMPTY_VALUES = (None, '', []) # Webhooks HTTP_CONTENT_TYPE_JSON = 'application/json' WEBHOOK_EVENT_TYPES = { - EVENT_CREATE: 'created', - EVENT_UPDATE: 'updated', - EVENT_DELETE: 'deleted', - EVENT_JOB_START: 'job_started', - EVENT_JOB_END: 'job_ended', + # Map registered event types to public webhook "event" equivalents + OBJECT_CREATED: 'created', + OBJECT_UPDATED: 'updated', + OBJECT_DELETED: 'deleted', + JOB_STARTED: 'job_started', + JOB_COMPLETED: 'job_ended', + JOB_FAILED: 'job_ended', + JOB_ERRORED: 'job_ended', } # Dashboard @@ -128,8 +129,17 @@ 'title': 'Change Log', 'color': 'blue', 'config': { - 'model': 'extras.objectchange', + 'model': 'core.objectchange', 'page_size': 25, } }, ] + +LOG_LEVEL_RANK = { + LogLevelChoices.LOG_DEBUG: 0, + LogLevelChoices.LOG_DEFAULT: 1, + LogLevelChoices.LOG_INFO: 2, + LogLevelChoices.LOG_SUCCESS: 3, + LogLevelChoices.LOG_WARNING: 4, + LogLevelChoices.LOG_FAILURE: 5, +} diff --git a/netbox/extras/dashboard/widgets.py b/netbox/extras/dashboard/widgets.py index d23919d9e9..091819bd1e 100644 --- a/netbox/extras/dashboard/widgets.py +++ b/netbox/extras/dashboard/widgets.py @@ -320,7 +320,7 @@ def get_feed(self): try: response = requests.get( url=self.config['feed_url'], - headers={'User-Agent': f'NetBox/{settings.VERSION}'}, + headers={'User-Agent': f'NetBox/{settings.RELEASE.version}'}, proxies=settings.HTTP_PROXIES, timeout=3 ) diff --git a/netbox/extras/events.py b/netbox/extras/events.py index 9f2f79b240..f13a3b48fd 100644 --- a/netbox/extras/events.py +++ b/netbox/extras/events.py @@ -1,19 +1,22 @@ +import logging +from collections import defaultdict + from django.conf import settings -from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.utils import timezone from django.utils.module_loading import import_string from django.utils.translation import gettext as _ from django_rq import get_queue -from core.models import Job +from core.events import * from netbox.config import get_config from netbox.constants import RQ_QUEUE_DEFAULT from netbox.registry import registry +from users.models import User from utilities.api import get_serializer_for_model from utilities.rqworker import get_rq_retry from utilities.serialization import serialize_object -from .choices import * +from .choices import EventRuleActionChoices from .models import EventRule logger = logging.getLogger('netbox.events_processor') @@ -32,12 +35,12 @@ def serialize_for_event(instance): return serializer.data -def get_snapshots(instance, action): +def get_snapshots(instance, event_type): snapshots = { 'prechange': getattr(instance, '_prechange_snapshot', None), 'postchange': None, } - if action != ObjectChangeActionChoices.ACTION_DELETE: + if event_type != OBJECT_DELETED: # Use model's serialize_object() method if defined; fall back to serialize_object() utility function if hasattr(instance, 'serialize_object'): snapshots['postchange'] = instance.serialize_object() @@ -47,7 +50,7 @@ def get_snapshots(instance, action): return snapshots -def enqueue_object(queue, instance, user, request_id, action): +def enqueue_event(queue, instance, user, request_id, event_type): """ Enqueue a serialized representation of a created/updated/deleted object for the processing of events once the request has completed. @@ -62,27 +65,24 @@ def enqueue_object(queue, instance, user, request_id, action): key = f'{app_label}.{model_name}:{instance.pk}' if key in queue: queue[key]['data'] = serialize_for_event(instance) - queue[key]['snapshots']['postchange'] = get_snapshots(instance, action)['postchange'] + queue[key]['snapshots']['postchange'] = get_snapshots(instance, event_type)['postchange'] # If the object is being deleted, update any prior "update" event to "delete" - if action == ObjectChangeActionChoices.ACTION_DELETE: - queue[key]['event'] = action + if event_type == OBJECT_DELETED: + queue[key]['event_type'] = event_type else: queue[key] = { - 'content_type': ContentType.objects.get_for_model(instance), + 'object_type': ContentType.objects.get_for_model(instance), 'object_id': instance.pk, - 'event': action, + 'event_type': event_type, 'data': serialize_for_event(instance), - 'snapshots': get_snapshots(instance, action), + 'snapshots': get_snapshots(instance, event_type), 'username': user.username, 'request_id': request_id } -def process_event_rules(event_rules, model_name, event, data, username=None, snapshots=None, request_id=None): - if username: - user = get_user_model().objects.get(username=username) - else: - user = None +def process_event_rules(event_rules, object_type, event_type, data, username=None, snapshots=None, request_id=None): + user = User.objects.get(username=username) if username else None for event_rule in event_rules: @@ -100,8 +100,8 @@ def process_event_rules(event_rules, model_name, event, data, username=None, sna # Compile the task parameters params = { "event_rule": event_rule, - "model_name": model_name, - "event": event, + "model_name": object_type.model, + "event_type": event_type, "data": data, "snapshots": snapshots, "timestamp": timezone.now().isoformat(), @@ -125,14 +125,24 @@ def process_event_rules(event_rules, model_name, event, data, username=None, sna script = event_rule.action_object.python_class() # Enqueue a Job to record the script's execution - Job.enqueue( - "extras.scripts.run_script", + from extras.jobs import ScriptJob + ScriptJob.enqueue( instance=event_rule.action_object, name=script.name, user=user, data=data ) + # Notification groups + elif event_rule.action_type == EventRuleActionChoices.NOTIFICATION: + # Bulk-create notifications for all members of the notification group + event_rule.action_object.notify( + object_type=object_type, + object_id=data['id'], + object_repr=data.get('display'), + event_type=event_type + ) + else: raise ValueError(_("Unknown action type for an event rule: {action_type}").format( action_type=event_rule.action_type @@ -143,32 +153,29 @@ def process_event_queue(events): """ Flush a list of object representation to RQ for EventRule processing. """ - events_cache = { - 'type_create': {}, - 'type_update': {}, - 'type_delete': {}, - } + events_cache = defaultdict(dict) - for data in events: - action_flag = { - ObjectChangeActionChoices.ACTION_CREATE: 'type_create', - ObjectChangeActionChoices.ACTION_UPDATE: 'type_update', - ObjectChangeActionChoices.ACTION_DELETE: 'type_delete', - }[data['event']] - content_type = data['content_type'] + for event in events: + event_type = event['event_type'] + object_type = event['object_type'] # Cache applicable Event Rules - if content_type not in events_cache[action_flag]: - events_cache[action_flag][content_type] = EventRule.objects.filter( - **{action_flag: True}, - object_types=content_type, + if object_type not in events_cache[event_type]: + events_cache[event_type][object_type] = EventRule.objects.filter( + event_types__contains=[event['event_type']], + object_types=object_type, enabled=True ) - event_rules = events_cache[action_flag][content_type] + event_rules = events_cache[event_type][object_type] process_event_rules( - event_rules, content_type.model, data['event'], data['data'], data['username'], - snapshots=data['snapshots'], request_id=data['request_id'] + event_rules=event_rules, + object_type=object_type, + event_type=event['event_type'], + data=event['data'], + username=event['username'], + snapshots=event['snapshots'], + request_id=event['request_id'] ) diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index 274834d314..4f40ce5001 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -1,5 +1,4 @@ import django_filters -from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.db.models import Q from django.utils.translation import gettext as _ @@ -8,6 +7,7 @@ from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup from netbox.filtersets import BaseFilterSet, ChangeLoggedModelFilterSet, NetBoxModelFilterSet from tenancy.models import Tenant, TenantGroup +from users.models import Group, User from utilities.filters import ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter from virtualization.models import Cluster, ClusterGroup, ClusterType from .choices import * @@ -26,7 +26,7 @@ 'ImageAttachmentFilterSet', 'JournalEntryFilterSet', 'LocalConfigContextFilterSet', - 'ObjectChangeFilterSet', + 'NotificationGroupFilterSet', 'ObjectTypeFilterSet', 'SavedFilterFilterSet', 'ScriptFilterSet', @@ -98,6 +98,9 @@ class EventRuleFilterSet(NetBoxModelFilterSet): object_type = ContentTypeFilter( field_name='object_types' ) + event_type = MultiValueCharFilter( + method='filter_event_type' + ) action_type = django_filters.MultipleChoiceFilter( choices=EventRuleActionChoices ) @@ -107,8 +110,7 @@ class EventRuleFilterSet(NetBoxModelFilterSet): class Meta: model = EventRule fields = ( - 'id', 'name', 'type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end', 'enabled', - 'action_type', 'description', + 'id', 'name', 'enabled', 'action_type', 'description', ) def search(self, queryset, name, value): @@ -120,6 +122,9 @@ def search(self, queryset, name, value): Q(comments__icontains=value) ) + def filter_event_type(self, queryset, name, value): + return queryset.filter(event_types__overlap=value) + class CustomFieldFilterSet(ChangeLoggedModelFilterSet): q = django_filters.CharFilter( @@ -153,7 +158,7 @@ class CustomFieldFilterSet(ChangeLoggedModelFilterSet): class Meta: model = CustomField fields = ( - 'id', 'name', 'label', 'group_name', 'required', 'search_weight', 'filter_logic', 'ui_visible', + 'id', 'name', 'label', 'group_name', 'required', 'unique', 'search_weight', 'filter_logic', 'ui_visible', 'ui_editable', 'weight', 'is_cloneable', 'description', 'validation_minimum', 'validation_maximum', 'validation_regex', ) @@ -278,12 +283,12 @@ class SavedFilterFilterSet(ChangeLoggedModelFilterSet): field_name='object_types' ) user_id = django_filters.ModelMultipleChoiceFilter( - queryset=get_user_model().objects.all(), + queryset=User.objects.all(), label=_('User (ID)'), ) user = django_filters.ModelMultipleChoiceFilter( field_name='user__username', - queryset=get_user_model().objects.all(), + queryset=User.objects.all(), to_field_name='username', label=_('User (name)'), ) @@ -322,12 +327,12 @@ class BookmarkFilterSet(BaseFilterSet): object_type_id = MultiValueNumberFilter() object_type = ContentTypeFilter() user_id = django_filters.ModelMultipleChoiceFilter( - queryset=get_user_model().objects.all(), + queryset=User.objects.all(), label=_('User (ID)'), ) user = django_filters.ModelMultipleChoiceFilter( field_name='user__username', - queryset=get_user_model().objects.all(), + queryset=User.objects.all(), to_field_name='username', label=_('User (name)'), ) @@ -337,6 +342,49 @@ class Meta: fields = ('id', 'object_id') +class NotificationGroupFilterSet(ChangeLoggedModelFilterSet): + q = django_filters.CharFilter( + method='search', + label=_('Search'), + ) + user_id = django_filters.ModelMultipleChoiceFilter( + field_name='users', + queryset=User.objects.all(), + label=_('User (ID)'), + ) + user = django_filters.ModelMultipleChoiceFilter( + field_name='users__username', + queryset=User.objects.all(), + to_field_name='username', + label=_('User (name)'), + ) + group_id = django_filters.ModelMultipleChoiceFilter( + field_name='groups', + queryset=Group.objects.all(), + label=_('Group (ID)'), + ) + group = django_filters.ModelMultipleChoiceFilter( + field_name='groups__name', + queryset=Group.objects.all(), + to_field_name='name', + label=_('Group (name)'), + ) + + class Meta: + model = NotificationGroup + fields = ( + 'id', 'name', 'description', + ) + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) + ) + + class ImageAttachmentFilterSet(ChangeLoggedModelFilterSet): q = django_filters.CharFilter( method='search', @@ -361,12 +409,12 @@ class JournalEntryFilterSet(NetBoxModelFilterSet): queryset=ContentType.objects.all() ) created_by_id = django_filters.ModelMultipleChoiceFilter( - queryset=get_user_model().objects.all(), + queryset=User.objects.all(), label=_('User (ID)'), ) created_by = django_filters.ModelMultipleChoiceFilter( field_name='created_by__username', - queryset=get_user_model().objects.all(), + queryset=User.objects.all(), to_field_name='username', label=_('User (name)'), ) @@ -589,10 +637,6 @@ class ConfigContextFilterSet(ChangeLoggedModelFilterSet): label=_('Data file (ID)'), ) - # TODO: Remove in v4.1 - role = device_role - role_id = device_role_id - class Meta: model = ConfigContext fields = ('id', 'name', 'is_active', 'description', 'weight', 'auto_sync_enabled', 'data_synced') @@ -649,43 +693,6 @@ def _local_context_data(self, queryset, name, value): return queryset.exclude(local_context_data__isnull=value) -class ObjectChangeFilterSet(BaseFilterSet): - q = django_filters.CharFilter( - method='search', - label=_('Search'), - ) - time = django_filters.DateTimeFromToRangeFilter() - changed_object_type = ContentTypeFilter() - changed_object_type_id = django_filters.ModelMultipleChoiceFilter( - queryset=ContentType.objects.all() - ) - user_id = django_filters.ModelMultipleChoiceFilter( - queryset=get_user_model().objects.all(), - label=_('User (ID)'), - ) - user = django_filters.ModelMultipleChoiceFilter( - field_name='user__username', - queryset=get_user_model().objects.all(), - to_field_name='username', - label=_('User name'), - ) - - class Meta: - model = ObjectChange - fields = ( - 'id', 'user', 'user_name', 'request_id', 'action', 'changed_object_type_id', 'changed_object_id', - 'related_object_type', 'related_object_id', 'object_repr', - ) - - def search(self, queryset, name, value): - if not value.strip(): - return queryset - return queryset.filter( - Q(user_name__icontains=value) | - Q(object_repr__icontains=value) - ) - - # # ContentTypes # diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index 7e9f452e8f..30d06683b8 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -3,9 +3,11 @@ from extras.choices import * from extras.models import * +from netbox.events import get_event_type_choices from netbox.forms import NetBoxModelBulkEditForm from utilities.forms import BulkEditForm, add_blank_choice from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField +from utilities.forms.rendering import FieldSet from utilities.forms.widgets import BulkEditNullBooleanSelect __all__ = ( @@ -17,6 +19,7 @@ 'EventRuleBulkEditForm', 'ExportTemplateBulkEditForm', 'JournalEntryBulkEditForm', + 'NotificationGroupBulkEditForm', 'SavedFilterBulkEditForm', 'TagBulkEditForm', 'WebhookBulkEditForm', @@ -41,6 +44,11 @@ class CustomFieldBulkEditForm(BulkEditForm): required=False, widget=BulkEditNullBooleanSelect() ) + unique = forms.NullBooleanField( + label=_('Must be unique'), + required=False, + widget=BulkEditNullBooleanSelect() + ) weight = forms.IntegerField( label=_('Weight'), required=False @@ -64,8 +72,25 @@ class CustomFieldBulkEditForm(BulkEditForm): required=False, widget=BulkEditNullBooleanSelect() ) + validation_minimum = forms.IntegerField( + label=_('Minimum value'), + required=False, + ) + validation_maximum = forms.IntegerField( + label=_('Maximum value'), + required=False, + ) + validation_regex = forms.CharField( + label=_('Validation regex'), + required=False + ) comments = CommentField() + fieldsets = ( + FieldSet('group_name', 'description', 'weight', 'required', 'unique', 'choice_set', name=_('Attributes')), + FieldSet('ui_visible', 'ui_editable', 'is_cloneable', name=_('Behavior')), + FieldSet('validation_minimum', 'validation_maximum', 'validation_regex', name=_('Validation')), + ) nullable_fields = ('group_name', 'description', 'choice_set') @@ -222,33 +247,18 @@ class EventRuleBulkEditForm(NetBoxModelBulkEditForm): required=False, widget=BulkEditNullBooleanSelect() ) - type_create = forms.NullBooleanField( - label=_('On create'), - required=False, - widget=BulkEditNullBooleanSelect() - ) - type_update = forms.NullBooleanField( - label=_('On update'), - required=False, - widget=BulkEditNullBooleanSelect() - ) - type_delete = forms.NullBooleanField( - label=_('On delete'), - required=False, - widget=BulkEditNullBooleanSelect() - ) - type_job_start = forms.NullBooleanField( - label=_('On job start'), + event_types = forms.MultipleChoiceField( + choices=get_event_type_choices(), required=False, - widget=BulkEditNullBooleanSelect() + label=_('Event types') ) - type_job_end = forms.NullBooleanField( - label=_('On job end'), - required=False, - widget=BulkEditNullBooleanSelect() + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False ) - nullable_fields = ('description', 'conditions',) + nullable_fields = ('description', 'conditions') class TagBulkEditForm(BulkEditForm): @@ -318,3 +328,17 @@ class JournalEntryBulkEditForm(BulkEditForm): required=False ) comments = CommentField() + + +class NotificationGroupBulkEditForm(BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=NotificationGroup.objects.all(), + widget=forms.MultipleHiddenInput + ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + + nullable_fields = ('description',) diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index f2cf0b7210..55c9cd764f 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -3,16 +3,18 @@ from django import forms from django.contrib.postgres.forms import SimpleArrayField from django.core.exceptions import ObjectDoesNotExist -from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from core.models import ObjectType from extras.choices import * from extras.models import * +from netbox.events import get_event_type_choices from netbox.forms import NetBoxModelImportForm +from users.models import Group, User from utilities.forms import CSVModelForm from utilities.forms.fields import ( - CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVMultipleContentTypeField, SlugField, + CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVModelMultipleChoiceField, CSVMultipleChoiceField, + CSVMultipleContentTypeField, SlugField, ) __all__ = ( @@ -23,6 +25,7 @@ 'EventRuleImportForm', 'ExportTemplateImportForm', 'JournalEntryImportForm', + 'NotificationGroupImportForm', 'SavedFilterImportForm', 'TagImportForm', 'WebhookImportForm', @@ -69,8 +72,8 @@ class CustomFieldImportForm(CSVModelForm): class Meta: model = CustomField fields = ( - 'name', 'label', 'group_name', 'type', 'object_types', 'related_object_type', 'required', 'description', - 'search_weight', 'filter_logic', 'default', 'choice_set', 'weight', 'validation_minimum', + 'name', 'label', 'group_name', 'type', 'object_types', 'related_object_type', 'required', 'unique', + 'description', 'search_weight', 'filter_logic', 'default', 'choice_set', 'weight', 'validation_minimum', 'validation_maximum', 'validation_regex', 'ui_visible', 'ui_editable', 'is_cloneable', 'comments', ) @@ -184,6 +187,11 @@ class EventRuleImportForm(NetBoxModelImportForm): queryset=ObjectType.objects.with_feature('event_rules'), help_text=_("One or more assigned object types") ) + event_types = CSVMultipleChoiceField( + choices=get_event_type_choices(), + label=_('Event types'), + help_text=_('The event type(s) which will trigger this rule') + ) action_object = forms.CharField( label=_('Action object'), required=True, @@ -193,8 +201,8 @@ class EventRuleImportForm(NetBoxModelImportForm): class Meta: model = EventRule fields = ( - 'name', 'description', 'enabled', 'conditions', 'object_types', 'type_create', 'type_update', - 'type_delete', 'type_job_start', 'type_job_end', 'action_type', 'action_object', 'comments', 'tags' + 'name', 'description', 'enabled', 'conditions', 'object_types', 'event_types', 'action_type', + 'action_object', 'comments', 'tags' ) def clean(self): @@ -246,3 +254,24 @@ class Meta: fields = ( 'assigned_object_type', 'assigned_object_id', 'created_by', 'kind', 'comments', 'tags' ) + + +class NotificationGroupImportForm(CSVModelForm): + users = CSVModelMultipleChoiceField( + label=_('Users'), + queryset=User.objects.all(), + required=False, + to_field_name='username', + help_text=_('User names separated by commas, encased with double quotes') + ) + groups = CSVModelMultipleChoiceField( + label=_('Groups'), + queryset=Group.objects.all(), + required=False, + to_field_name='name', + help_text=_('Group names separated by commas, encased with double quotes') + ) + + class Meta: + model = NotificationGroup + fields = ('name', 'description', 'users', 'groups') diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index e6b001f2c9..05dcf96c47 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -1,20 +1,21 @@ from django import forms -from django.contrib.auth import get_user_model from django.utils.translation import gettext_lazy as _ from core.models import ObjectType, DataFile, DataSource from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup from extras.choices import * from extras.models import * +from netbox.events import get_event_type_choices from netbox.forms.base import NetBoxModelFilterSetForm from netbox.forms.mixins import SavedFiltersMixin from tenancy.models import Tenant, TenantGroup +from users.models import Group, User from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice from utilities.forms.fields import ( ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, TagFilterField, ) from utilities.forms.rendering import FieldSet -from utilities.forms.widgets import APISelectMultiple, DateTimePicker +from utilities.forms.widgets import DateTimePicker from virtualization.models import Cluster, ClusterGroup, ClusterType __all__ = ( @@ -28,7 +29,7 @@ 'ImageAttachmentFilterForm', 'JournalEntryFilterForm', 'LocalConfigContextFilterForm', - 'ObjectChangeFilterForm', + 'NotificationGroupFilterForm', 'SavedFilterFilterForm', 'TagFilterForm', 'WebhookFilterForm', @@ -39,9 +40,11 @@ class CustomFieldFilterForm(SavedFiltersMixin, FilterForm): fieldsets = ( FieldSet('q', 'filter_id'), FieldSet( - 'type', 'related_object_type_id', 'group_name', 'weight', 'required', 'choice_set_id', 'ui_visible', - 'ui_editable', 'is_cloneable', name=_('Attributes') + 'type', 'related_object_type_id', 'group_name', 'weight', 'required', 'unique', 'choice_set_id', + name=_('Attributes') ), + FieldSet('ui_visible', 'ui_editable', 'is_cloneable', name=_('Behavior')), + FieldSet('validation_minimum', 'validation_maximum', 'validation_regex', name=_('Validation')), ) related_object_type_id = ContentTypeMultipleChoiceField( queryset=ObjectType.objects.with_feature('custom_fields'), @@ -68,6 +71,13 @@ class CustomFieldFilterForm(SavedFiltersMixin, FilterForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) + unique = forms.NullBooleanField( + label=_('Must be unique'), + required=False, + widget=forms.Select( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) choice_set_id = DynamicModelMultipleChoiceField( queryset=CustomFieldChoiceSet.objects.all(), required=False, @@ -90,6 +100,18 @@ class CustomFieldFilterForm(SavedFiltersMixin, FilterForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) + validation_minimum = forms.IntegerField( + label=_('Minimum value'), + required=False + ) + validation_maximum = forms.IntegerField( + label=_('Maximum value'), + required=False + ) + validation_regex = forms.CharField( + label=_('Validation regex'), + required=False + ) class CustomFieldChoiceSetFilterForm(SavedFiltersMixin, FilterForm): @@ -251,14 +273,18 @@ class EventRuleFilterForm(NetBoxModelFilterSetForm): fieldsets = ( FieldSet('q', 'filter_id', 'tag'), - FieldSet('object_type_id', 'action_type', 'enabled', name=_('Attributes')), - FieldSet('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end', name=_('Events')), + FieldSet('object_type_id', 'event_type', 'action_type', 'enabled', name=_('Attributes')), ) object_type_id = ContentTypeMultipleChoiceField( queryset=ObjectType.objects.with_feature('event_rules'), required=False, label=_('Object type') ) + event_type = forms.MultipleChoiceField( + choices=get_event_type_choices, + required=False, + label=_('Event type') + ) action_type = forms.ChoiceField( choices=add_blank_choice(EventRuleActionChoices), required=False, @@ -271,41 +297,6 @@ class EventRuleFilterForm(NetBoxModelFilterSetForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) - type_create = forms.NullBooleanField( - required=False, - widget=forms.Select( - choices=BOOLEAN_WITH_BLANK_CHOICES - ), - label=_('Object creations') - ) - type_update = forms.NullBooleanField( - required=False, - widget=forms.Select( - choices=BOOLEAN_WITH_BLANK_CHOICES - ), - label=_('Object updates') - ) - type_delete = forms.NullBooleanField( - required=False, - widget=forms.Select( - choices=BOOLEAN_WITH_BLANK_CHOICES - ), - label=_('Object deletions') - ) - type_job_start = forms.NullBooleanField( - required=False, - widget=forms.Select( - choices=BOOLEAN_WITH_BLANK_CHOICES - ), - label=_('Job starts') - ) - type_job_end = forms.NullBooleanField( - required=False, - widget=forms.Select( - choices=BOOLEAN_WITH_BLANK_CHOICES - ), - label=_('Job terminations') - ) class TagFilterForm(SavedFiltersMixin, FilterForm): @@ -460,7 +451,7 @@ class JournalEntryFilterForm(NetBoxModelFilterSetForm): widget=DateTimePicker() ) created_by_id = DynamicModelMultipleChoiceField( - queryset=get_user_model().objects.all(), + queryset=User.objects.all(), required=False, label=_('User') ) @@ -477,35 +468,14 @@ class JournalEntryFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -class ObjectChangeFilterForm(SavedFiltersMixin, FilterForm): - model = ObjectChange - fieldsets = ( - FieldSet('q', 'filter_id'), - FieldSet('time_before', 'time_after', name=_('Time')), - FieldSet('action', 'user_id', 'changed_object_type_id', name=_('Attributes')), - ) - time_after = forms.DateTimeField( - required=False, - label=_('After'), - widget=DateTimePicker() - ) - time_before = forms.DateTimeField( - required=False, - label=_('Before'), - widget=DateTimePicker() - ) - action = forms.ChoiceField( - label=_('Action'), - choices=add_blank_choice(ObjectChangeActionChoices), - required=False - ) +class NotificationGroupFilterForm(SavedFiltersMixin, FilterForm): user_id = DynamicModelMultipleChoiceField( - queryset=get_user_model().objects.all(), + queryset=User.objects.all(), required=False, label=_('User') ) - changed_object_type_id = ContentTypeMultipleChoiceField( - queryset=ObjectType.objects.with_feature('change_logging'), + group_id = DynamicModelMultipleChoiceField( + queryset=Group.objects.all(), required=False, - label=_('Object Type'), + label=_('Group') ) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index ebd6e6c08b..a45daaf708 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -10,8 +10,10 @@ from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup from extras.choices import * from extras.models import * +from netbox.events import get_event_type_choices from netbox.forms import NetBoxModelForm from tenancy.models import Tenant, TenantGroup +from users.models import Group, User from utilities.forms import add_blank_choice, get_field_value from utilities.forms.fields import ( CommentField, ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelChoiceField, @@ -32,7 +34,9 @@ 'ExportTemplateForm', 'ImageAttachmentForm', 'JournalEntryForm', + 'NotificationGroupForm', 'SavedFilterForm', + 'SubscriptionForm', 'TagForm', 'WebhookForm', ) @@ -41,30 +45,36 @@ class CustomFieldForm(forms.ModelForm): object_types = ContentTypeMultipleChoiceField( label=_('Object types'), - queryset=ObjectType.objects.with_feature('custom_fields') + queryset=ObjectType.objects.with_feature('custom_fields'), + help_text=_("The type(s) of object that have this custom field") + ) + default = JSONField( + label=_('Default value'), + required=False ) related_object_type = ContentTypeChoiceField( label=_('Related object type'), queryset=ObjectType.objects.public(), - required=False, help_text=_("Type of the related object (for object/multi-object fields only)") ) + related_object_filter = JSONField( + label=_('Related object filter'), + required=False, + help_text=_('Specify query parameters as a JSON object.') + ) choice_set = DynamicModelChoiceField( - queryset=CustomFieldChoiceSet.objects.all(), - required=False + queryset=CustomFieldChoiceSet.objects.all() ) comments = CommentField() fieldsets = ( FieldSet( - 'object_types', 'name', 'label', 'group_name', 'type', 'related_object_type', 'required', 'description', + 'object_types', 'name', 'label', 'group_name', 'description', 'type', 'required', 'unique', 'default', name=_('Custom Field') ), FieldSet( 'search_weight', 'filter_logic', 'ui_visible', 'ui_editable', 'weight', 'is_cloneable', name=_('Behavior') ), - FieldSet('default', 'choice_set', name=_('Values')), - FieldSet('validation_minimum', 'validation_maximum', 'validation_regex', name=_('Validation')), ) class Meta: @@ -81,11 +91,75 @@ class Meta: def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + # Mimic HTMXSelect() + self.fields['type'].widget.attrs.update({ + 'hx-get': '.', + 'hx-include': '#form_fields', + 'hx-target': '#form_fields', + }) + # Disable changing the type of a CustomField as it almost universally causes errors if custom field data # is already present. if self.instance.pk: self.fields['type'].disabled = True + field_type = get_field_value(self, 'type') + + # Adjust for text fields + if field_type in ( + CustomFieldTypeChoices.TYPE_TEXT, + CustomFieldTypeChoices.TYPE_LONGTEXT, + CustomFieldTypeChoices.TYPE_URL + ): + self.fieldsets = ( + self.fieldsets[0], + FieldSet('validation_regex', name=_('Validation')), + *self.fieldsets[1:] + ) + else: + del self.fields['validation_regex'] + + # Adjust for numeric fields + if field_type in ( + CustomFieldTypeChoices.TYPE_INTEGER, + CustomFieldTypeChoices.TYPE_DECIMAL + ): + self.fieldsets = ( + self.fieldsets[0], + FieldSet('validation_minimum', 'validation_maximum', name=_('Validation')), + *self.fieldsets[1:] + ) + else: + del self.fields['validation_minimum'] + del self.fields['validation_maximum'] + + # Adjust for object & multi-object fields + if field_type in ( + CustomFieldTypeChoices.TYPE_OBJECT, + CustomFieldTypeChoices.TYPE_MULTIOBJECT + ): + self.fieldsets = ( + self.fieldsets[0], + FieldSet('related_object_type', 'related_object_filter', name=_('Related Object')), + *self.fieldsets[1:] + ) + else: + del self.fields['related_object_type'] + del self.fields['related_object_filter'] + + # Adjust for selection & multi-select fields + if field_type in ( + CustomFieldTypeChoices.TYPE_SELECT, + CustomFieldTypeChoices.TYPE_MULTISELECT + ): + self.fieldsets = ( + self.fieldsets[0], + FieldSet('choice_set', name=_('Choices')), + *self.fieldsets[1:] + ) + else: + del self.fields['choice_set'] + class CustomFieldChoiceSetForm(forms.ModelForm): extra_choices = forms.CharField( @@ -236,6 +310,43 @@ class Meta: fields = ('object_type', 'object_id') +class NotificationGroupForm(forms.ModelForm): + groups = DynamicModelMultipleChoiceField( + label=_('Groups'), + required=False, + queryset=Group.objects.all() + ) + users = DynamicModelMultipleChoiceField( + label=_('Users'), + required=False, + queryset=User.objects.all() + ) + + class Meta: + model = NotificationGroup + fields = ('name', 'description', 'groups', 'users') + + def clean(self): + super().clean() + + # At least one User or Group must be assigned + if not self.cleaned_data['groups'] and not self.cleaned_data['users']: + raise forms.ValidationError(_("A notification group specify at least one user or group.")) + + return self.cleaned_data + + +class SubscriptionForm(forms.ModelForm): + object_type = ContentTypeChoiceField( + label=_('Object type'), + queryset=ObjectType.objects.with_feature('notifications') + ) + + class Meta: + model = Subscription + fields = ('object_type', 'object_id') + + class WebhookForm(NetBoxModelForm): fieldsets = ( @@ -261,6 +372,10 @@ class EventRuleForm(NetBoxModelForm): label=_('Object types'), queryset=ObjectType.objects.with_feature('event_rules'), ) + event_types = forms.MultipleChoiceField( + choices=get_event_type_choices(), + label=_('Event types') + ) action_choice = forms.ChoiceField( label=_('Action choice'), choices=[] @@ -277,25 +392,16 @@ class EventRuleForm(NetBoxModelForm): fieldsets = ( FieldSet('name', 'description', 'object_types', 'enabled', 'tags', name=_('Event Rule')), - FieldSet('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end', name=_('Events')), - FieldSet('conditions', name=_('Conditions')), + FieldSet('event_types', 'conditions', name=_('Triggers')), FieldSet('action_type', 'action_choice', 'action_data', name=_('Action')), ) class Meta: model = EventRule fields = ( - 'object_types', 'name', 'description', 'type_create', 'type_update', 'type_delete', 'type_job_start', - 'type_job_end', 'enabled', 'conditions', 'action_type', 'action_object_type', 'action_object_id', - 'action_data', 'comments', 'tags' + 'object_types', 'name', 'description', 'enabled', 'event_types', 'conditions', 'action_type', + 'action_object_type', 'action_object_id', 'action_data', 'comments', 'tags' ) - labels = { - 'type_create': _('Creations'), - 'type_update': _('Updates'), - 'type_delete': _('Deletions'), - 'type_job_start': _('Job executions'), - 'type_job_end': _('Job terminations'), - } widgets = { 'conditions': forms.Textarea(attrs={'class': 'font-monospace'}), 'action_type': HTMXSelect(), @@ -327,6 +433,18 @@ def init_webhook_choice(self): initial=initial ) + def init_notificationgroup_choice(self): + initial = None + if self.instance.action_type == EventRuleActionChoices.NOTIFICATION: + notificationgroup_id = get_field_value(self, 'action_object_id') + initial = NotificationGroup.objects.get(pk=notificationgroup_id) if notificationgroup_id else None + self.fields['action_choice'] = DynamicModelChoiceField( + label=_('Notification group'), + queryset=NotificationGroup.objects.all(), + required=True, + initial=initial + ) + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['action_object_type'].required = False @@ -339,6 +457,8 @@ def __init__(self, *args, **kwargs): self.init_webhook_choice() elif action_type == EventRuleActionChoices.SCRIPT: self.init_script_choice() + elif action_type == EventRuleActionChoices.NOTIFICATION: + self.init_notificationgroup_choice() def clean(self): super().clean() @@ -355,6 +475,10 @@ def clean(self): for_concrete_model=False ) self.cleaned_data['action_object_id'] = action_choice.id + # Notification + elif self.cleaned_data.get('action_type') == EventRuleActionChoices.NOTIFICATION: + self.cleaned_data['action_object_type'] = ObjectType.objects.get_for_model(action_choice) + self.cleaned_data['action_object_id'] = action_choice.id return self.cleaned_data diff --git a/netbox/extras/graphql/filters.py b/netbox/extras/graphql/filters.py index af3a93588e..ff2e6a0f17 100644 --- a/netbox/extras/graphql/filters.py +++ b/netbox/extras/graphql/filters.py @@ -13,7 +13,7 @@ 'ExportTemplateFilter', 'ImageAttachmentFilter', 'JournalEntryFilter', - 'ObjectChangeFilter', + 'NotificationGroupFilter', 'SavedFilterFilter', 'TagFilter', 'WebhookFilter', @@ -68,9 +68,9 @@ class JournalEntryFilter(BaseFilterMixin): pass -@strawberry_django.filter(models.ObjectChange, lookups=True) -@autotype_decorator(filtersets.ObjectChangeFilterSet) -class ObjectChangeFilter(BaseFilterMixin): +@strawberry_django.filter(models.NotificationGroup, lookups=True) +@autotype_decorator(filtersets.NotificationGroupFilterSet) +class NotificationGroupFilter(BaseFilterMixin): pass diff --git a/netbox/extras/graphql/mixins.py b/netbox/extras/graphql/mixins.py index 456c6daa5c..542bbcc85b 100644 --- a/netbox/extras/graphql/mixins.py +++ b/netbox/extras/graphql/mixins.py @@ -2,12 +2,8 @@ import strawberry import strawberry_django -from django.contrib.contenttypes.models import ContentType - -from extras.models import ObjectChange __all__ = ( - 'ChangelogMixin', 'ConfigContextMixin', 'ContactsMixin', 'CustomFieldsMixin', @@ -17,23 +13,10 @@ ) if TYPE_CHECKING: - from .types import ImageAttachmentType, JournalEntryType, ObjectChangeType, TagType + from .types import ImageAttachmentType, JournalEntryType, TagType from tenancy.graphql.types import ContactAssignmentType -@strawberry.type -class ChangelogMixin: - - @strawberry_django.field - def changelog(self, info) -> List[Annotated["ObjectChangeType", strawberry.lazy('.types')]]: - content_type = ContentType.objects.get_for_model(self) - object_changes = ObjectChange.objects.filter( - changed_object_type=content_type, - changed_object_id=self.pk - ) - return object_changes.restrict(info.context.request.user, 'view') - - @strawberry.type class ConfigContextMixin: diff --git a/netbox/extras/graphql/schema.py b/netbox/extras/graphql/schema.py index b9586ab839..7d2d11bf16 100644 --- a/netbox/extras/graphql/schema.py +++ b/netbox/extras/graphql/schema.py @@ -35,6 +35,15 @@ class ExtrasQuery: journal_entry: JournalEntryType = strawberry_django.field() journal_entry_list: List[JournalEntryType] = strawberry_django.field() + notification: NotificationType = strawberry_django.field() + notification_list: List[NotificationType] = strawberry_django.field() + + notification_group: NotificationGroupType = strawberry_django.field() + notification_group_list: List[NotificationGroupType] = strawberry_django.field() + + subscription: SubscriptionType = strawberry_django.field() + subscription_list: List[SubscriptionType] = strawberry_django.field() + tag: TagType = strawberry_django.field() tag_list: List[TagType] = strawberry_django.field() diff --git a/netbox/extras/graphql/types.py b/netbox/extras/graphql/types.py index 6bb7ce411e..a43f80cc3e 100644 --- a/netbox/extras/graphql/types.py +++ b/netbox/extras/graphql/types.py @@ -18,8 +18,10 @@ 'ExportTemplateType', 'ImageAttachmentType', 'JournalEntryType', - 'ObjectChangeType', + 'NotificationGroupType', + 'NotificationType', 'SavedFilterType', + 'SubscriptionType', 'TagType', 'WebhookType', ) @@ -124,12 +126,20 @@ class JournalEntryType(CustomFieldsMixin, TagsMixin, ObjectType): @strawberry_django.type( - models.ObjectChange, - fields='__all__', - filters=ObjectChangeFilter + models.Notification, + # filters=NotificationFilter ) -class ObjectChangeType(BaseObjectType): - pass +class NotificationType(ObjectType): + user: Annotated["UserType", strawberry.lazy('users.graphql.types')] | None + + +@strawberry_django.type( + models.NotificationGroup, + filters=NotificationGroupFilter +) +class NotificationGroupType(ObjectType): + users: List[Annotated["UserType", strawberry.lazy('users.graphql.types')]] + groups: List[Annotated["GroupType", strawberry.lazy('users.graphql.types')]] @strawberry_django.type( @@ -141,6 +151,14 @@ class SavedFilterType(ObjectType): user: Annotated["UserType", strawberry.lazy('users.graphql.types')] | None +@strawberry_django.type( + models.Subscription, + # filters=NotificationFilter +) +class SubscriptionType(ObjectType): + user: Annotated["UserType", strawberry.lazy('users.graphql.types')] | None + + @strawberry_django.type( models.Tag, exclude=['extras_taggeditem_items', ], diff --git a/netbox/extras/jobs.py b/netbox/extras/jobs.py new file mode 100644 index 0000000000..e540ef4398 --- /dev/null +++ b/netbox/extras/jobs.py @@ -0,0 +1,107 @@ +import logging +import traceback +from contextlib import nullcontext + +from django.db import transaction +from django.utils.translation import gettext as _ + +from core.signals import clear_events +from extras.models import Script as ScriptModel +from netbox.context_managers import event_tracking +from netbox.jobs import JobRunner +from utilities.exceptions import AbortScript, AbortTransaction +from .utils import is_report + + +class ScriptJob(JobRunner): + """ + Script execution job. + + A wrapper for calling Script.run(). This performs error handling and provides a hook for committing changes. It + exists outside the Script class to ensure it cannot be overridden by a script author. + """ + + class Meta: + # An explicit job name is not set because it doesn't make sense in this context. Currently, there's no scenario + # where jobs other than this one are used. Therefore, it is hidden, resulting in a cleaner job table overview. + name = '' + + def run_script(self, script, request, data, commit): + """ + Core script execution task. We capture this within a method to allow for conditionally wrapping it with the + event_tracking context manager (which is bypassed if commit == False). + + Args: + request: The WSGI request associated with this execution (if any) + data: A dictionary of data to be passed to the script upon execution + commit: Passed through to Script.run() + """ + logger = logging.getLogger(f"netbox.scripts.{script.full_name}") + logger.info(f"Running script (commit={commit})") + + try: + try: + with transaction.atomic(): + script.output = script.run(data, commit) + if not commit: + raise AbortTransaction() + except AbortTransaction: + script.log_info(message=_("Database changes have been reverted automatically.")) + if script.failed: + logger.warning(f"Script failed") + raise + + except Exception as e: + if type(e) is AbortScript: + msg = _("Script aborted with error: ") + str(e) + if is_report(type(script)): + script.log_failure(message=msg) + else: + script.log_failure(msg) + logger.error(f"Script aborted with error: {e}") + + else: + stacktrace = traceback.format_exc() + script.log_failure( + message=_("An exception occurred: ") + f"`{type(e).__name__}: {e}`\n```\n{stacktrace}\n```" + ) + logger.error(f"Exception raised during script execution: {e}") + + if type(e) is not AbortTransaction: + script.log_info(message=_("Database changes have been reverted due to error.")) + + # Clear all pending events. Job termination (including setting the status) is handled by the job framework. + if request: + clear_events.send(request) + raise + + # Update the job data regardless of the execution status of the job. Successes should be reported as well as + # failures. + finally: + self.job.data = script.get_job_data() + + def run(self, data, request=None, commit=True, **kwargs): + """ + Run the script. + + Args: + job: The Job associated with this execution + data: A dictionary of data to be passed to the script upon execution + request: The WSGI request associated with this execution (if any) + commit: Passed through to Script.run() + """ + script = ScriptModel.objects.get(pk=self.job.object_id).python_class() + + # Add files to form data + if request: + files = request.FILES + for field_name, fileobj in files.items(): + data[field_name] = fileobj + + # Add the current request as a property of the script + script.request = request + + # Execute the script. If commit is True, wrap it with the event_tracking context manager to ensure we process + # change logging, event rules, etc. + with event_tracking(request) if commit else nullcontext(): + self.run_script(script, request, data, commit) diff --git a/netbox/extras/management/commands/housekeeping.py b/netbox/extras/management/commands/housekeeping.py index 467518fef9..cb8137ee28 100644 --- a/netbox/extras/management/commands/housekeeping.py +++ b/netbox/extras/management/commands/housekeeping.py @@ -9,8 +9,7 @@ from django.utils import timezone from packaging import version -from core.models import Job -from extras.models import ObjectChange +from core.models import Job, ObjectChange from netbox.config import Config @@ -94,7 +93,10 @@ def handle(self, *args, **options): # Check for new releases (if enabled) if options['verbosity']: self.stdout.write("[*] Checking for latest release") - if settings.RELEASE_CHECK_URL: + if settings.ISOLATED_DEPLOYMENT: + if options['verbosity']: + self.stdout.write(f"\tSkipping: ISOLATED_DEPLOYMENT is enabled") + elif settings.RELEASE_CHECK_URL: headers = { 'Accept': 'application/vnd.github.v3+json', } diff --git a/netbox/extras/management/commands/runscript.py b/netbox/extras/management/commands/runscript.py index 4afbd733e8..ab0d6d8948 100644 --- a/netbox/extras/management/commands/runscript.py +++ b/netbox/extras/management/commands/runscript.py @@ -1,19 +1,13 @@ import json import logging import sys -import traceback import uuid -from django.contrib.auth import get_user_model from django.core.management.base import BaseCommand, CommandError -from django.db import transaction -from core.choices import JobStatusChoices -from core.models import Job -from extras.context_managers import event_tracking +from extras.jobs import ScriptJob from extras.scripts import get_module_and_script -from extras.signals import clear_events -from utilities.exceptions import AbortTransaction +from users.models import User from utilities.request import NetBoxFakeRequest @@ -33,46 +27,6 @@ def add_arguments(self, parser): parser.add_argument('script', help="Script to run") def handle(self, *args, **options): - - def _run_script(script): - """ - Core script execution task. We capture this within a subfunction to allow for conditionally wrapping it with - the event_tracking context manager (which is bypassed if commit == False). - """ - try: - try: - with transaction.atomic(): - script.output = script.run(data=data, commit=commit) - if not commit: - raise AbortTransaction() - except AbortTransaction: - script.log_info("Database changes have been reverted automatically.") - clear_events.send(request) - job.data = script.get_job_data() - job.terminate() - except Exception as e: - stacktrace = traceback.format_exc() - script.log_failure( - f"An exception occurred: `{type(e).__name__}: {e}`\n```\n{stacktrace}\n```" - ) - script.log_info("Database changes have been reverted due to error.") - logger.error(f"Exception raised during script execution: {e}") - clear_events.send(request) - job.data = script.get_job_data() - job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=repr(e)) - - # Print any test method results - for test_name, attrs in job.data['tests'].items(): - self.stdout.write( - "\t{}: {} success, {} info, {} warning, {} failure".format( - test_name, attrs['success'], attrs['info'], attrs['warning'], attrs['failure'] - ) - ) - - logger.info(f"Script completed in {job.duration}") - - User = get_user_model() - # Params script = options['script'] loglevel = options['loglevel'] @@ -84,7 +38,8 @@ def _run_script(script): data = {} module_name, script_name = script.split('.', 1) - module, script = get_module_and_script(module_name, script_name) + module, script_obj = get_module_and_script(module_name, script_name) + script = script_obj.python_class # Take user from command line if provided and exists, other if options['user']: @@ -101,7 +56,7 @@ def _run_script(script): stdouthandler.setLevel(logging.DEBUG) stdouthandler.setFormatter(formatter) - logger = logging.getLogger(f"netbox.scripts.{script.python_class.full_name}") + logger = logging.getLogger(f"netbox.scripts.{script.full_name}") logger.addHandler(stdouthandler) try: @@ -117,42 +72,31 @@ def _run_script(script): raise CommandError(f"Invalid log level: {loglevel}") # Initialize the script form - script_instance = script.python_class() - form = script_instance.as_form(data, None) - - # Create the job - job = Job.objects.create( - object=script, - name=script_instance.class_name, - user=user, - job_id=uuid.uuid4() - ) - - request = NetBoxFakeRequest({ - 'META': {}, - 'POST': data, - 'GET': {}, - 'FILES': {}, - 'user': user, - 'path': '', - 'id': job.job_id - }) - - if form.is_valid(): - job.status = JobStatusChoices.STATUS_RUNNING - job.save() - - logger.info(f"Running script (commit={commit})") - script.request = request - - # Execute the script. If commit is True, wrap it with the event_tracking context manager to ensure we process - # change logging, webhooks, etc. - with event_tracking(request): - _run_script(script_instance) - else: + script = script() + form = script.as_form(data, None) + if not form.is_valid(): logger.error('Data is not valid:') for field, errors in form.errors.get_json_data().items(): for error in errors: logger.error(f'\t{field}: {error.get("message")}') - job.status = JobStatusChoices.STATUS_ERRORED - job.save() + raise CommandError() + + # Execute the script. + job = ScriptJob.enqueue( + instance=script_obj, + user=user, + immediate=True, + data=data, + request=NetBoxFakeRequest({ + 'META': {}, + 'POST': data, + 'GET': {}, + 'FILES': {}, + 'user': user, + 'path': '', + 'id': uuid.uuid4() + }), + commit=commit, + ) + + logger.info(f"Script completed in {job.duration}") diff --git a/netbox/extras/migrations/0117_move_objectchange.py b/netbox/extras/migrations/0117_move_objectchange.py new file mode 100644 index 0000000000..a69b5a7118 --- /dev/null +++ b/netbox/extras/migrations/0117_move_objectchange.py @@ -0,0 +1,124 @@ +from django.db import migrations + + +def update_content_types(apps, schema_editor): + ContentType = apps.get_model('contenttypes', 'ContentType') + + # Delete the new ContentTypes effected by the new model in the core app + ContentType.objects.filter(app_label='core', model='objectchange').delete() + + # Update the app labels of the original ContentTypes for extras.ObjectChange to ensure that any + # foreign key references are preserved + ContentType.objects.filter(app_label='extras', model='objectchange').update(app_label='core') + + +def update_dashboard_widgets(apps, schema_editor): + Dashboard = apps.get_model('extras', 'Dashboard') + + for dashboard in Dashboard.objects.all(): + for key, widget in dashboard.config.items(): + if widget['config'].get('model') == 'extras.objectchange': + widget['config']['model'] = 'core.objectchange' + elif models := widget['config'].get('models'): + models = list(map(lambda x: x.replace('extras.objectchange', 'core.objectchange'), models)) + dashboard.config[key]['config']['models'] = models + dashboard.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0116_custom_link_button_color'), + ('core', '0011_move_objectchange'), + ] + + operations = [ + migrations.SeparateDatabaseAndState( + state_operations=[ + migrations.DeleteModel( + name='ObjectChange', + ), + ], + database_operations=[ + migrations.AlterModelTable( + name='ObjectChange', + table='core_objectchange', + ), + + # Rename PK sequence + migrations.RunSQL( + "ALTER TABLE extras_objectchange_id_seq" + " RENAME TO core_objectchange_id_seq" + ), + + # Rename indexes. Hashes generated by schema_editor._create_index_name() + migrations.RunSQL( + "ALTER INDEX extras_objectchange_pkey" + " RENAME TO core_objectchange_pkey" + ), + migrations.RunSQL( + "ALTER INDEX extras_obje_changed_927fe5_idx" + " RENAME TO core_objectchange_changed_object_type_id_cha_79a9ed1e" + ), + migrations.RunSQL( + "ALTER INDEX extras_obje_related_bfcdef_idx" + " RENAME TO core_objectchange_related_object_type_id_rel_a71d604a" + ), + migrations.RunSQL( + "ALTER INDEX extras_objectchange_changed_object_type_id_b755bb60" + " RENAME TO core_objectchange_changed_object_type_id_2070ade6" + ), + migrations.RunSQL( + "ALTER INDEX extras_objectchange_related_object_type_id_fe6e521f" + " RENAME TO core_objectchange_related_object_type_id_b80958af" + ), + migrations.RunSQL( + "ALTER INDEX extras_objectchange_request_id_4ae21e90" + " RENAME TO core_objectchange_request_id_d9d160ac" + ), + migrations.RunSQL( + "ALTER INDEX extras_objectchange_time_224380ea" + " RENAME TO core_objectchange_time_800f60a5" + ), + migrations.RunSQL( + "ALTER INDEX extras_objectchange_user_id_7fdf8186" + " RENAME TO core_objectchange_user_id_2b2142be" + ), + + # Rename constraints + migrations.RunSQL( + "ALTER TABLE core_objectchange RENAME CONSTRAINT " + "extras_objectchange_changed_object_id_check TO " + "core_objectchange_changed_object_id_check" + ), + migrations.RunSQL( + "ALTER TABLE core_objectchange RENAME CONSTRAINT " + "extras_objectchange_related_object_id_check TO " + "core_objectchange_related_object_id_check" + ), + migrations.RunSQL( + "ALTER TABLE core_objectchange RENAME CONSTRAINT " + "extras_objectchange_changed_object_type__b755bb60_fk_django_co TO " + "core_objectchange_changed_object_type_id_2070ade6" + ), + migrations.RunSQL( + "ALTER TABLE core_objectchange RENAME CONSTRAINT " + "extras_objectchange_related_object_type__fe6e521f_fk_django_co TO " + "core_objectchange_related_object_type_id_b80958af" + ), + migrations.RunSQL( + "ALTER TABLE core_objectchange RENAME CONSTRAINT " + "extras_objectchange_user_id_7fdf8186_fk_auth_user_id TO " + "core_objectchange_user_id_2b2142be" + ), + ], + ), + migrations.RunPython( + code=update_content_types, + reverse_code=migrations.RunPython.noop + ), + migrations.RunPython( + code=update_dashboard_widgets, + reverse_code=migrations.RunPython.noop + ), + ] diff --git a/netbox/extras/migrations/0118_customfield_uniqueness.py b/netbox/extras/migrations/0118_customfield_uniqueness.py new file mode 100644 index 0000000000..b7693aa24e --- /dev/null +++ b/netbox/extras/migrations/0118_customfield_uniqueness.py @@ -0,0 +1,16 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0117_move_objectchange'), + ] + + operations = [ + migrations.AddField( + model_name='customfield', + name='unique', + field=models.BooleanField(default=False), + ), + ] diff --git a/netbox/extras/migrations/0119_notifications.py b/netbox/extras/migrations/0119_notifications.py new file mode 100644 index 0000000000..c266f3b6c9 --- /dev/null +++ b/netbox/extras/migrations/0119_notifications.py @@ -0,0 +1,79 @@ +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('extras', '0118_customfield_uniqueness'), + ('users', '0009_update_group_perms'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='NotificationGroup', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('name', models.CharField(max_length=100, unique=True)), + ('description', models.CharField(blank=True, max_length=200)), + ('groups', models.ManyToManyField(blank=True, related_name='notification_groups', to='users.group')), + ('users', models.ManyToManyField(blank=True, related_name='notification_groups', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'notification group', + 'verbose_name_plural': 'notification groups', + 'ordering': ('name',), + }, + ), + migrations.CreateModel( + name='Subscription', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ('object_id', models.PositiveBigIntegerField()), + ('object_type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='contenttypes.contenttype')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subscriptions', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'subscription', + 'verbose_name_plural': 'subscriptions', + 'ordering': ('-created', 'user'), + }, + ), + migrations.CreateModel( + name='Notification', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ('read', models.DateTimeField(blank=True, null=True)), + ('object_id', models.PositiveBigIntegerField()), + ('event_type', models.CharField(max_length=50)), + ('object_type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='contenttypes.contenttype')), + ('object_repr', models.CharField(editable=False, max_length=200)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'notification', + 'verbose_name_plural': 'notifications', + 'ordering': ('-created', 'pk'), + 'indexes': [models.Index(fields=['object_type', 'object_id'], name='extras_noti_object__be74d5_idx')], + }, + ), + migrations.AddConstraint( + model_name='notification', + constraint=models.UniqueConstraint(fields=('object_type', 'object_id', 'user'), name='extras_notification_unique_per_object_and_user'), + ), + migrations.AddIndex( + model_name='subscription', + index=models.Index(fields=['object_type', 'object_id'], name='extras_subs_object__37ef68_idx'), + ), + migrations.AddConstraint( + model_name='subscription', + constraint=models.UniqueConstraint(fields=('object_type', 'object_id', 'user'), name='extras_subscription_unique_per_object_and_user'), + ), + ] diff --git a/netbox/extras/migrations/0120_eventrule_event_types.py b/netbox/extras/migrations/0120_eventrule_event_types.py new file mode 100644 index 0000000000..f62c83e4c2 --- /dev/null +++ b/netbox/extras/migrations/0120_eventrule_event_types.py @@ -0,0 +1,75 @@ +import django.contrib.postgres.fields +from django.db import migrations, models + +from core.events import * + + +def set_event_types(apps, schema_editor): + EventRule = apps.get_model('extras', 'EventRule') + event_rules = EventRule.objects.all() + + for event_rule in event_rules: + event_rule.event_types = [] + if event_rule.type_create: + event_rule.event_types.append(OBJECT_CREATED) + if event_rule.type_update: + event_rule.event_types.append(OBJECT_UPDATED) + if event_rule.type_delete: + event_rule.event_types.append(OBJECT_DELETED) + if event_rule.type_job_start: + event_rule.event_types.append(JOB_STARTED) + if event_rule.type_job_end: + # Map type_job_end to all job termination events + event_rule.event_types.extend([JOB_COMPLETED, JOB_ERRORED, JOB_FAILED]) + + EventRule.objects.bulk_update(event_rules, ['event_types']) + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0119_notifications'), + ] + + operations = [ + migrations.AddField( + model_name='eventrule', + name='event_types', + field=django.contrib.postgres.fields.ArrayField( + base_field=models.CharField(max_length=50), + blank=True, + null=True, + size=None + ), + ), + migrations.RunPython( + code=set_event_types, + reverse_code=migrations.RunPython.noop + ), + migrations.AlterField( + model_name='eventrule', + name='event_types', + field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=50), size=None), + preserve_default=False, + ), + migrations.RemoveField( + model_name='eventrule', + name='type_create', + ), + migrations.RemoveField( + model_name='eventrule', + name='type_delete', + ), + migrations.RemoveField( + model_name='eventrule', + name='type_job_end', + ), + migrations.RemoveField( + model_name='eventrule', + name='type_job_start', + ), + migrations.RemoveField( + model_name='eventrule', + name='type_update', + ), + ] diff --git a/netbox/extras/migrations/0121_customfield_related_object_filter.py b/netbox/extras/migrations/0121_customfield_related_object_filter.py new file mode 100644 index 0000000000..d6e41fd7de --- /dev/null +++ b/netbox/extras/migrations/0121_customfield_related_object_filter.py @@ -0,0 +1,16 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0120_eventrule_event_types'), + ] + + operations = [ + migrations.AddField( + model_name='customfield', + name='related_object_filter', + field=models.JSONField(blank=True, null=True), + ), + ] diff --git a/netbox/extras/models/__init__.py b/netbox/extras/models/__init__.py index ebed3b1fbb..e857210342 100644 --- a/netbox/extras/models/__init__.py +++ b/netbox/extras/models/__init__.py @@ -1,8 +1,8 @@ -from .change_logging import * from .configs import * from .customfields import * from .dashboard import * from .models import * +from .notifications import * from .scripts import * from .search import * from .staging import * diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index 67ff5a5e62..839a6ace91 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -21,6 +21,7 @@ from netbox.models.features import CloningMixin, ExportTemplatesMixin from netbox.search import FieldTypes from utilities import filters +from utilities.datetime import datetime_from_timestamp from utilities.forms.fields import ( CSVChoiceField, CSVModelChoiceField, CSVModelMultipleChoiceField, CSVMultipleChoiceField, DynamicChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, DynamicMultipleChoiceField, JSONField, LaxURLField, @@ -128,7 +129,12 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): required = models.BooleanField( verbose_name=_('required'), default=False, - help_text=_("If true, this field is required when creating new objects or editing an existing object.") + help_text=_("This field is required when creating new objects or editing an existing object.") + ) + unique = models.BooleanField( + verbose_name=_('must be unique'), + default=False, + help_text=_("The value of this field must be unique for the assigned object") ) search_weight = models.PositiveSmallIntegerField( verbose_name=_('search weight'), @@ -153,6 +159,14 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): 'Default value for the field (must be a JSON value). Encapsulate strings with double quotes (e.g. "Foo").' ) ) + related_object_filter = models.JSONField( + blank=True, + null=True, + help_text=_( + 'Filter the object selection choices using a query_params dict (must be a JSON value).' + 'Encapsulate strings with double quotes (e.g. "Foo").' + ) + ) weight = models.PositiveSmallIntegerField( default=100, verbose_name=_('display weight'), @@ -215,9 +229,9 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): objects = CustomFieldManager() clone_fields = ( - 'object_types', 'type', 'related_object_type', 'group_name', 'description', 'required', 'search_weight', - 'filter_logic', 'default', 'weight', 'validation_minimum', 'validation_maximum', 'validation_regex', - 'choice_set', 'ui_visible', 'ui_editable', 'is_cloneable', + 'object_types', 'type', 'related_object_type', 'group_name', 'description', 'required', 'unique', + 'search_weight', 'filter_logic', 'default', 'weight', 'validation_minimum', 'validation_maximum', + 'validation_regex', 'choice_set', 'ui_visible', 'ui_editable', 'is_cloneable', ) class Meta: @@ -334,6 +348,12 @@ def clean(self): 'validation_regex': _("Regular expression validation is supported only for text and URL fields") }) + # Uniqueness can not be enforced for boolean fields + if self.unique and self.type == CustomFieldTypeChoices.TYPE_BOOLEAN: + raise ValidationError({ + 'unique': _("Uniqueness cannot be enforced for boolean fields") + }) + # Choice set must be set on selection fields, and *only* on selection fields if self.type in ( CustomFieldTypeChoices.TYPE_SELECT, @@ -359,6 +379,17 @@ def clean(self): 'type': _("{type} fields may not define an object type.") .format(type=self.get_type_display()) }) + # Related object filter can be set only for object-type fields, and must contain a dictionary mapping (if set) + if self.related_object_filter is not None: + if self.type not in (CustomFieldTypeChoices.TYPE_OBJECT, CustomFieldTypeChoices.TYPE_MULTIOBJECT): + raise ValidationError({ + 'related_object_filter': _("A related object filter can be defined only for object fields.") + }) + if type(self.related_object_filter) is not dict: + raise ValidationError({ + 'related_object_filter': _("Filter must be defined as a dictionary mapping attributes to values.") + }) + def serialize(self, value): """ Prepare a value for storage as JSON data. @@ -497,7 +528,8 @@ def to_form_field(self, set_initial=True, enforce_required=True, enforce_visibil field = field_class( queryset=model.objects.all(), required=required, - initial=initial + initial=initial, + query_params=self.related_object_filter ) # Multiple objects @@ -508,6 +540,7 @@ def to_form_field(self, set_initial=True, enforce_required=True, enforce_visibil queryset=model.objects.all(), required=required, initial=initial, + query_params=self.related_object_filter ) # Text @@ -659,12 +692,8 @@ def validate(self, value): # Validate date & time elif self.type == CustomFieldTypeChoices.TYPE_DATETIME: if type(value) is not datetime: - # Work around UTC issue for Python < 3.11; see - # https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat - if type(value) is str and value.endswith('Z'): - value = f'{value[:-1]}+00:00' try: - datetime.fromisoformat(value) + datetime_from_timestamp(value) except ValueError: raise ValidationError( _("Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS).") diff --git a/netbox/extras/models/dashboard.py b/netbox/extras/models/dashboard.py index 7b9293777b..669785cdde 100644 --- a/netbox/extras/models/dashboard.py +++ b/netbox/extras/models/dashboard.py @@ -1,4 +1,3 @@ -from django.contrib.auth import get_user_model from django.db import models from django.utils.translation import gettext_lazy as _ @@ -11,7 +10,7 @@ class Dashboard(models.Model): user = models.OneToOneField( - to=get_user_model(), + to='users.User', on_delete=models.CASCADE, related_name='dashboard' ) diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 49249eaa06..d8a274c897 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -3,12 +3,12 @@ from django.conf import settings from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation +from django.contrib.postgres.fields import ArrayField from django.core.validators import ValidationError from django.db import models from django.http import HttpResponse from django.urls import reverse from django.utils import timezone -from django.utils.formats import date_format from django.utils.translation import gettext_lazy as _ from rest_framework.utils.encoders import JSONEncoder @@ -18,14 +18,15 @@ from extras.constants import * from extras.utils import image_upload from netbox.config import get_config +from netbox.events import get_event_type_choices from netbox.models import ChangeLoggedModel from netbox.models.features import ( CloningMixin, CustomFieldsMixin, CustomLinksMixin, ExportTemplatesMixin, SyncedDataMixin, TagsMixin, ) from utilities.html import clean_html +from utilities.jinja2 import render_jinja2 from utilities.querydict import dict_to_querydict from utilities.querysets import RestrictedQuerySet -from utilities.jinja2 import render_jinja2 __all__ = ( 'Bookmark', @@ -61,30 +62,9 @@ class EventRule(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLogged max_length=200, blank=True ) - type_create = models.BooleanField( - verbose_name=_('on create'), - default=False, - help_text=_("Triggers when a matching object is created.") - ) - type_update = models.BooleanField( - verbose_name=_('on update'), - default=False, - help_text=_("Triggers when a matching object is updated.") - ) - type_delete = models.BooleanField( - verbose_name=_('on delete'), - default=False, - help_text=_("Triggers when a matching object is deleted.") - ) - type_job_start = models.BooleanField( - verbose_name=_('on job start'), - default=False, - help_text=_("Triggers when a job for a matching object is started.") - ) - type_job_end = models.BooleanField( - verbose_name=_('on job end'), - default=False, - help_text=_("Triggers when a job for a matching object terminates.") + event_types = ArrayField( + base_field=models.CharField(max_length=50, choices=get_event_type_choices), + help_text=_("The types of event which will trigger this rule.") ) enabled = models.BooleanField( verbose_name=_('enabled'), @@ -145,14 +125,6 @@ def get_absolute_url(self): def clean(self): super().clean() - # At least one action type must be selected - if not any([ - self.type_create, self.type_update, self.type_delete, self.type_job_start, self.type_job_end - ]): - raise ValidationError( - _("At least one event type must be selected: create, update, delete, job start, and/or job end.") - ) - # Validate that any conditions are in the correct format if self.conditions: try: diff --git a/netbox/extras/models/notifications.py b/netbox/extras/models/notifications.py new file mode 100644 index 0000000000..7fe03147cd --- /dev/null +++ b/netbox/extras/models/notifications.py @@ -0,0 +1,235 @@ +from functools import cached_property + +from django.conf import settings +from django.contrib.contenttypes.fields import GenericForeignKey +from django.core.exceptions import ValidationError +from django.db import models +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ + +from core.models import ObjectType +from extras.querysets import NotificationQuerySet +from netbox.models import ChangeLoggedModel +from netbox.registry import registry +from users.models import User +from utilities.querysets import RestrictedQuerySet + +__all__ = ( + 'Notification', + 'NotificationGroup', + 'Subscription', +) + + +def get_event_type_choices(): + """ + Compile a list of choices from all registered event types + """ + return [ + (name, event.text) + for name, event in registry['event_types'].items() + ] + + +class Notification(models.Model): + """ + A notification message for a User relating to a specific object in NetBox. + """ + created = models.DateTimeField( + verbose_name=_('created'), + auto_now_add=True + ) + read = models.DateTimeField( + verbose_name=_('read'), + null=True, + blank=True + ) + user = models.ForeignKey( + to=settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name='notifications' + ) + object_type = models.ForeignKey( + to='contenttypes.ContentType', + on_delete=models.PROTECT + ) + object_id = models.PositiveBigIntegerField() + object = GenericForeignKey( + ct_field='object_type', + fk_field='object_id' + ) + object_repr = models.CharField( + max_length=200, + editable=False + ) + event_type = models.CharField( + verbose_name=_('event'), + max_length=50, + choices=get_event_type_choices + ) + + objects = NotificationQuerySet.as_manager() + + class Meta: + ordering = ('-created', 'pk') + indexes = ( + models.Index(fields=('object_type', 'object_id')), + ) + constraints = ( + models.UniqueConstraint( + fields=('object_type', 'object_id', 'user'), + name='%(app_label)s_%(class)s_unique_per_object_and_user' + ), + ) + verbose_name = _('notification') + verbose_name_plural = _('notifications') + + def __str__(self): + return self.object_repr + + def get_absolute_url(self): + return reverse('account:notifications') + + def clean(self): + super().clean() + + # Validate the assigned object type + if self.object_type not in ObjectType.objects.with_feature('notifications'): + raise ValidationError( + _("Objects of this type ({type}) do not support notifications.").format(type=self.object_type) + ) + + def save(self, *args, **kwargs): + # Record a string representation of the associated object + if self.object: + self.object_repr = self.get_object_repr(self.object) + + super().save(*args, **kwargs) + + @cached_property + def event(self): + """ + Returns the registered Event which triggered this Notification. + """ + return registry['event_types'].get(self.event_type) + + @classmethod + def get_object_repr(cls, obj): + return str(obj)[:200] + + +class NotificationGroup(ChangeLoggedModel): + """ + A collection of users and/or groups to be informed for certain notifications. + """ + name = models.CharField( + verbose_name=_('name'), + max_length=100, + unique=True + ) + description = models.CharField( + verbose_name=_('description'), + max_length=200, + blank=True + ) + groups = models.ManyToManyField( + to='users.Group', + verbose_name=_('groups'), + blank=True, + related_name='notification_groups' + ) + users = models.ManyToManyField( + to='users.User', + verbose_name=_('users'), + blank=True, + related_name='notification_groups' + ) + + objects = RestrictedQuerySet.as_manager() + + class Meta: + ordering = ('name',) + verbose_name = _('notification group') + verbose_name_plural = _('notification groups') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('extras:notificationgroup', args=[self.pk]) + + @cached_property + def members(self): + """ + Return all Users who belong to this notification group. + """ + return self.users.union( + User.objects.filter(groups__in=self.groups.all()) + ).order_by('username') + + def notify(self, **kwargs): + """ + Bulk-create Notifications for all members of this group. + """ + Notification.objects.bulk_create([ + Notification(user=member, **kwargs) + for member in self.members + ]) + notify.alters_data = True + + +class Subscription(models.Model): + """ + A User's subscription to a particular object, to be notified of changes. + """ + created = models.DateTimeField( + verbose_name=_('created'), + auto_now_add=True + ) + user = models.ForeignKey( + to=settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name='subscriptions' + ) + object_type = models.ForeignKey( + to='contenttypes.ContentType', + on_delete=models.PROTECT + ) + object_id = models.PositiveBigIntegerField() + object = GenericForeignKey( + ct_field='object_type', + fk_field='object_id' + ) + + objects = RestrictedQuerySet.as_manager() + + class Meta: + ordering = ('-created', 'user') + indexes = ( + models.Index(fields=('object_type', 'object_id')), + ) + constraints = ( + models.UniqueConstraint( + fields=('object_type', 'object_id', 'user'), + name='%(app_label)s_%(class)s_unique_per_object_and_user' + ), + ) + verbose_name = _('subscription') + verbose_name_plural = _('subscriptions') + + def __str__(self): + if self.object: + return str(self.object) + return super().__str__() + + def get_absolute_url(self): + return reverse('account:subscriptions') + + def clean(self): + super().clean() + + # Validate the assigned object type + if self.object_type not in ObjectType.objects.with_feature('notifications'): + raise ValidationError( + _("Objects of this type ({type}) do not support notifications.").format(type=self.object_type) + ) diff --git a/netbox/extras/models/staging.py b/netbox/extras/models/staging.py index 7ffbde0896..b944a6fb90 100644 --- a/netbox/extras/models/staging.py +++ b/netbox/extras/models/staging.py @@ -1,6 +1,5 @@ import logging -from django.contrib.auth import get_user_model from django.contrib.contenttypes.fields import GenericForeignKey from django.db import models, transaction from django.utils.translation import gettext_lazy as _ @@ -34,7 +33,7 @@ class Branch(ChangeLoggedModel): blank=True ) user = models.ForeignKey( - to=get_user_model(), + to='users.User', on_delete=models.SET_NULL, blank=True, null=True diff --git a/netbox/extras/querysets.py b/netbox/extras/querysets.py index b3bdc0a3e4..9b3722eef0 100644 --- a/netbox/extras/querysets.py +++ b/netbox/extras/querysets.py @@ -1,13 +1,16 @@ -from django.apps import apps -from django.contrib.contenttypes.models import ContentType from django.contrib.postgres.aggregates import JSONBAgg from django.db.models import OuterRef, Subquery, Q -from django.db.utils import ProgrammingError from extras.models.tags import TaggedItem from utilities.query_functions import EmptyGroupByJSONBAgg from utilities.querysets import RestrictedQuerySet +__all__ = ( + 'ConfigContextModelQuerySet', + 'ConfigContextQuerySet', + 'NotificationQuerySet', +) + class ConfigContextQuerySet(RestrictedQuerySet): @@ -150,18 +153,10 @@ def _get_config_context_filters(self): return base_query -class ObjectChangeQuerySet(RestrictedQuerySet): - - def valid_models(self): - # Exclude any change records which refer to an instance of a model that's no longer installed. This - # can happen when a plugin is removed but its data remains in the database, for example. - try: - content_types = ContentType.objects.get_for_models(*apps.get_models()).values() - except ProgrammingError: - # Handle the case where the database schema has not yet been initialized - content_types = ContentType.objects.none() +class NotificationQuerySet(RestrictedQuerySet): - content_type_ids = set( - ct.pk for ct in content_types - ) - return self.filter(changed_object_type_id__in=content_type_ids) + def unread(self): + """ + Return only unread notifications. + """ + return self.filter(read__isnull=True) diff --git a/netbox/extras/scripts.py b/netbox/extras/scripts.py index b54302870f..96d08d8af4 100644 --- a/netbox/extras/scripts.py +++ b/netbox/extras/scripts.py @@ -2,32 +2,23 @@ import json import logging import os -import traceback -from datetime import timedelta import yaml from django import forms from django.conf import settings from django.core.validators import RegexValidator -from django.db import transaction from django.utils import timezone from django.utils.functional import classproperty from django.utils.translation import gettext as _ -from core.choices import JobStatusChoices -from core.models import Job from extras.choices import LogLevelChoices -from extras.models import ScriptModule, Script as ScriptModel -from extras.signals import clear_events +from extras.models import ScriptModule from ipam.formfields import IPAddressFormField, IPNetworkFormField from ipam.validators import MaxPrefixLengthValidator, MinPrefixLengthValidator, prefix_validator -from utilities.exceptions import AbortScript, AbortTransaction from utilities.forms import add_blank_choice from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField from utilities.forms.widgets import DatePicker, DateTimePicker -from .context_managers import event_tracking from .forms import ScriptForm -from .utils import is_report __all__ = ( @@ -48,7 +39,6 @@ 'StringVar', 'TextVar', 'get_module_and_script', - 'run_script', ) @@ -613,111 +603,3 @@ def get_module_and_script(module_name, script_name): module = ScriptModule.objects.get(file_path=f'{module_name}.py') script = module.scripts.get(name=script_name) return module, script - - -def run_script(data, job, request=None, commit=True, **kwargs): - """ - A wrapper for calling Script.run(). This performs error handling and provides a hook for committing changes. It - exists outside the Script class to ensure it cannot be overridden by a script author. - - Args: - data: A dictionary of data to be passed to the script upon execution - job: The Job associated with this execution - request: The WSGI request associated with this execution (if any) - commit: Passed through to Script.run() - """ - job.start() - - script = ScriptModel.objects.get(pk=job.object_id).python_class() - - logger = logging.getLogger(f"netbox.scripts.{script.full_name}") - logger.info(f"Running script (commit={commit})") - - # Add files to form data - if request: - files = request.FILES - for field_name, fileobj in files.items(): - data[field_name] = fileobj - - # Add the current request as a property of the script - script.request = request - - def set_job_data(script): - job.data = { - 'log': script.messages, - 'output': script.output, - 'tests': script.tests, - } - - return job - - def _run_script(job): - """ - Core script execution task. We capture this within a subfunction to allow for conditionally wrapping it with - the event_tracking context manager (which is bypassed if commit == False). - """ - try: - try: - with transaction.atomic(): - script.output = script.run(data, commit) - if not commit: - raise AbortTransaction() - except AbortTransaction: - script.log_info(message=_("Database changes have been reverted automatically.")) - if request: - clear_events.send(request) - - job.data = script.get_job_data() - if script.failed: - logger.warning(f"Script failed") - job.terminate(status=JobStatusChoices.STATUS_FAILED) - else: - job.terminate() - - except Exception as e: - if type(e) is AbortScript: - msg = _("Script aborted with error: ") + str(e) - if is_report(type(script)): - script.log_failure(message=msg) - else: - script.log_failure(msg) - - logger.error(f"Script aborted with error: {e}") - else: - stacktrace = traceback.format_exc() - script.log_failure( - message=_("An exception occurred: ") + f"`{type(e).__name__}: {e}`\n```\n{stacktrace}\n```" - ) - logger.error(f"Exception raised during script execution: {e}") - script.log_info(message=_("Database changes have been reverted due to error.")) - - job.data = script.get_job_data() - job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=repr(e)) - if request: - clear_events.send(request) - - logger.info(f"Script completed in {job.duration}") - - # Execute the script. If commit is True, wrap it with the event_tracking context manager to ensure we process - # change logging, event rules, etc. - if commit: - with event_tracking(request): - _run_script(job) - else: - _run_script(job) - - # Schedule the next job if an interval has been set - if job.interval: - new_scheduled_time = job.scheduled + timedelta(minutes=job.interval) - Job.enqueue( - run_script, - instance=job.object, - name=job.name, - user=job.user, - schedule_at=new_scheduled_time, - interval=job.interval, - job_timeout=script.job_timeout, - data=data, - request=request, - commit=commit - ) diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py index 9d439ace9a..10c3f73c54 100644 --- a/netbox/extras/signals.py +++ b/netbox/extras/signals.py @@ -1,188 +1,18 @@ -import importlib -import logging - from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import ImproperlyConfigured, ValidationError -from django.db.models.fields.reverse_related import ManyToManyRel from django.db.models.signals import m2m_changed, post_save, pre_delete -from django.dispatch import receiver, Signal -from django.utils.translation import gettext_lazy as _ -from django_prometheus.models import model_deletes, model_inserts, model_updates +from django.dispatch import receiver +from core.events import * from core.models import ObjectType from core.signals import job_end, job_start -from extras.constants import EVENT_JOB_END, EVENT_JOB_START from extras.events import process_event_rules -from extras.models import EventRule +from extras.models import EventRule, Notification, Subscription from netbox.config import get_config -from netbox.context import current_request, events_queue -from netbox.models.features import ChangeLoggingMixin +from netbox.registry import registry from netbox.signals import post_clean from utilities.exceptions import AbortRequest -from .choices import ObjectChangeActionChoices -from .events import enqueue_object, get_snapshots, serialize_for_event -from .models import CustomField, ObjectChange, TaggedItem -from .validators import CustomValidator - - -def run_validators(instance, validators): - """ - Run the provided iterable of validators for the instance. - """ - request = current_request.get() - for validator in validators: - - # Loading a validator class by dotted path - if type(validator) is str: - module, cls = validator.rsplit('.', 1) - validator = getattr(importlib.import_module(module), cls)() - - # Constructing a new instance on the fly from a ruleset - elif type(validator) is dict: - validator = CustomValidator(validator) - - elif not issubclass(validator.__class__, CustomValidator): - raise ImproperlyConfigured(f"Invalid value for custom validator: {validator}") - - validator(instance, request) - - -# -# Change logging/webhooks -# - -# Define a custom signal that can be sent to clear any queued events -clear_events = Signal() - - -@receiver((post_save, m2m_changed)) -def handle_changed_object(sender, instance, **kwargs): - """ - Fires when an object is created or updated. - """ - m2m_changed = False - - if not hasattr(instance, 'to_objectchange'): - return - - # Get the current request, or bail if not set - request = current_request.get() - if request is None: - return - - # Determine the type of change being made - if kwargs.get('created'): - action = ObjectChangeActionChoices.ACTION_CREATE - elif 'created' in kwargs: - action = ObjectChangeActionChoices.ACTION_UPDATE - elif kwargs.get('action') in ['post_add', 'post_remove'] and kwargs['pk_set']: - # m2m_changed with objects added or removed - m2m_changed = True - action = ObjectChangeActionChoices.ACTION_UPDATE - else: - return - - # Create/update an ObjectChange record for this change - objectchange = instance.to_objectchange(action) - # If this is a many-to-many field change, check for a previous ObjectChange instance recorded - # for this object by this request and update it - if m2m_changed and ( - prev_change := ObjectChange.objects.filter( - changed_object_type=ContentType.objects.get_for_model(instance), - changed_object_id=instance.pk, - request_id=request.id - ).first() - ): - prev_change.postchange_data = objectchange.postchange_data - prev_change.save() - elif objectchange and objectchange.has_changes: - objectchange.user = request.user - objectchange.request_id = request.id - objectchange.save() - - # Ensure that we're working with fresh M2M assignments - if m2m_changed: - instance.refresh_from_db() - - # Enqueue the object for event processing - queue = events_queue.get() - enqueue_object(queue, instance, request.user, request.id, action) - events_queue.set(queue) - - # Increment metric counters - if action == ObjectChangeActionChoices.ACTION_CREATE: - model_inserts.labels(instance._meta.model_name).inc() - elif action == ObjectChangeActionChoices.ACTION_UPDATE: - model_updates.labels(instance._meta.model_name).inc() - - -@receiver(pre_delete) -def handle_deleted_object(sender, instance, **kwargs): - """ - Fires when an object is deleted. - """ - # Run any deletion protection rules for the object. Note that this must occur prior - # to queueing any events for the object being deleted, in case a validation error is - # raised, causing the deletion to fail. - model_name = f'{sender._meta.app_label}.{sender._meta.model_name}' - validators = get_config().PROTECTION_RULES.get(model_name, []) - try: - run_validators(instance, validators) - except ValidationError as e: - raise AbortRequest( - _("Deletion is prevented by a protection rule: {message}").format(message=e) - ) - - # Get the current request, or bail if not set - request = current_request.get() - if request is None: - return - - # Record an ObjectChange if applicable - if hasattr(instance, 'to_objectchange'): - if hasattr(instance, 'snapshot') and not getattr(instance, '_prechange_snapshot', None): - instance.snapshot() - objectchange = instance.to_objectchange(ObjectChangeActionChoices.ACTION_DELETE) - objectchange.user = request.user - objectchange.request_id = request.id - objectchange.save() - - # Django does not automatically send an m2m_changed signal for the reverse direction of a - # many-to-many relationship (see https://code.djangoproject.com/ticket/17688), so we need to - # trigger one manually. We do this by checking for any reverse M2M relationships on the - # instance being deleted, and explicitly call .remove() on the remote M2M field to delete - # the association. This triggers an m2m_changed signal with the `post_remove` action type - # for the forward direction of the relationship, ensuring that the change is recorded. - for relation in instance._meta.related_objects: - if type(relation) is not ManyToManyRel: - continue - related_model = relation.related_model - related_field_name = relation.remote_field.name - if not issubclass(related_model, ChangeLoggingMixin): - # We only care about triggering the m2m_changed signal for models which support - # change logging - continue - for obj in related_model.objects.filter(**{related_field_name: instance.pk}): - obj.snapshot() # Ensure the change record includes the "before" state - getattr(obj, related_field_name).remove(instance) - - # Enqueue the object for event processing - queue = events_queue.get() - enqueue_object(queue, instance, request.user, request.id, ObjectChangeActionChoices.ACTION_DELETE) - events_queue.set(queue) - - # Increment metric counters - model_deletes.labels(instance._meta.model_name).inc() - - -@receiver(clear_events) -def clear_events_queue(sender, **kwargs): - """ - Delete any queued events (e.g. because of an aborted bulk transaction) - """ - logger = logging.getLogger('events') - logger.info(f"Clearing {len(events_queue.get())} queued events ({sender})") - events_queue.set({}) +from .models import CustomField, TaggedItem +from .utils import run_validators # @@ -268,9 +98,19 @@ def process_job_start_event_rules(sender, **kwargs): """ Process event rules for jobs starting. """ - event_rules = EventRule.objects.filter(type_job_start=True, enabled=True, object_types=sender.object_type) + event_rules = EventRule.objects.filter( + event_types__contains=[JOB_STARTED], + enabled=True, + object_types=sender.object_type + ) username = sender.user.username if sender.user else None - process_event_rules(event_rules, sender.object_type.model, EVENT_JOB_START, sender.data, username) + process_event_rules( + event_rules=event_rules, + object_type=sender.object_type, + event_type=JOB_STARTED, + data=sender.data, + username=username + ) @receiver(job_end) @@ -278,6 +118,57 @@ def process_job_end_event_rules(sender, **kwargs): """ Process event rules for jobs terminating. """ - event_rules = EventRule.objects.filter(type_job_end=True, enabled=True, object_types=sender.object_type) + event_rules = EventRule.objects.filter( + event_types__contains=[JOB_COMPLETED], + enabled=True, + object_types=sender.object_type + ) username = sender.user.username if sender.user else None - process_event_rules(event_rules, sender.object_type.model, EVENT_JOB_END, sender.data, username) + process_event_rules( + event_rules=event_rules, + object_type=sender.object_type, + event_type=JOB_COMPLETED, + data=sender.data, + username=username + ) + + +# +# Notifications +# + +@receiver((post_save, pre_delete)) +def notify_object_changed(sender, instance, **kwargs): + # Skip for newly-created objects + if kwargs.get('created'): + return + + # Determine event type + if 'created' in kwargs: + event_type = OBJECT_UPDATED + else: + event_type = OBJECT_DELETED + + # Skip unsupported object types + ct = ContentType.objects.get_for_model(instance) + if ct.model not in registry['model_features']['notifications'].get(ct.app_label, []): + return + + # Find all subscribed Users + subscribed_users = Subscription.objects.filter(object_type=ct, object_id=instance.pk).values_list('user', flat=True) + if not subscribed_users: + return + + # Delete any existing Notifications for the object + Notification.objects.filter(object_type=ct, object_id=instance.pk, user__in=subscribed_users).delete() + + # Create Notifications for Subscribers + Notification.objects.bulk_create([ + Notification( + user_id=user, + object=instance, + object_repr=Notification.get_object_repr(instance), + event_type=event_type + ) + for user in subscribed_users + ]) diff --git a/netbox/extras/tables/columns.py b/netbox/extras/tables/columns.py new file mode 100644 index 0000000000..9b6aadcbf5 --- /dev/null +++ b/netbox/extras/tables/columns.py @@ -0,0 +1,13 @@ +from django.utils.translation import gettext as _ + +from netbox.tables.columns import ActionsColumn, ActionsItem + +__all__ = ( + 'NotificationActionsColumn', +) + + +class NotificationActionsColumn(ActionsColumn): + actions = { + 'dismiss': ActionsItem(_('Dismiss'), 'trash-can-outline', 'delete', 'danger'), + } diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index 420a586387..e538c488ec 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -6,8 +6,9 @@ from extras.models import * from netbox.constants import EMPTY_TABLE_TEXT +from netbox.events import get_event_text from netbox.tables import BaseTable, NetBoxTable, columns -from .template_code import * +from .columns import NotificationActionsColumn __all__ = ( 'BookmarkTable', @@ -20,22 +21,36 @@ 'ExportTemplateTable', 'ImageAttachmentTable', 'JournalEntryTable', - 'ObjectChangeTable', + 'NotificationGroupTable', + 'NotificationTable', 'SavedFilterTable', 'ReportResultsTable', 'ScriptResultsTable', + 'SubscriptionTable', 'TaggedItemTable', 'TagTable', 'WebhookTable', ) -IMAGEATTACHMENT_IMAGE = ''' +IMAGEATTACHMENT_IMAGE = """ {% if record.image %} {{ record }} {% else %} — {% endif %} -''' +""" + +NOTIFICATION_ICON = """ + +""" + +NOTIFICATION_LINK = """ +{% if not record.event.destructive %} + {{ record.object_repr }} +{% else %} + {{ record.object_repr }} +{% endif %} +""" class CustomFieldTable(NetBoxTable): @@ -50,6 +65,10 @@ class CustomFieldTable(NetBoxTable): verbose_name=_('Required'), false_mark=None ) + unique = columns.BooleanColumn( + verbose_name=_('Validate Uniqueness'), + false_mark=None + ) ui_visible = columns.ChoiceFieldColumn( verbose_name=_('Visible') ) @@ -75,15 +94,27 @@ class CustomFieldTable(NetBoxTable): verbose_name=_('Is Cloneable'), false_mark=None ) + validation_minimum = tables.Column( + verbose_name=_('Minimum Value'), + ) + validation_maximum = tables.Column( + verbose_name=_('Maximum Value'), + ) + validation_regex = tables.Column( + verbose_name=_('Validation Regex'), + ) class Meta(NetBoxTable.Meta): model = CustomField fields = ( 'pk', 'id', 'name', 'object_types', 'label', 'type', 'related_object_type', 'group_name', 'required', - 'default', 'description', 'search_weight', 'filter_logic', 'ui_visible', 'ui_editable', 'is_cloneable', - 'weight', 'choice_set', 'choices', 'comments', 'created', 'last_updated', + 'unique', 'default', 'description', 'search_weight', 'filter_logic', 'ui_visible', 'ui_editable', + 'is_cloneable', 'weight', 'choice_set', 'choices', 'validation_minimum', 'validation_maximum', + 'validation_regex', 'comments', 'created', 'last_updated', + ) + default_columns = ( + 'pk', 'name', 'object_types', 'label', 'group_name', 'type', 'required', 'unique', 'description', ) - default_columns = ('pk', 'name', 'object_types', 'label', 'group_name', 'type', 'required', 'description') class CustomFieldChoiceSetTable(NetBoxTable): @@ -258,6 +289,90 @@ class Meta(NetBoxTable.Meta): default_columns = ('object', 'object_type', 'created') +class SubscriptionTable(NetBoxTable): + object_type = columns.ContentTypeColumn( + verbose_name=_('Object Type'), + ) + object = tables.Column( + verbose_name=_('Object'), + linkify=True, + orderable=False + ) + user = tables.Column( + verbose_name=_('User'), + linkify=True + ) + actions = columns.ActionsColumn( + actions=('delete',) + ) + + class Meta(NetBoxTable.Meta): + model = Subscription + fields = ('pk', 'object', 'object_type', 'created', 'user') + default_columns = ('object', 'object_type', 'created') + + +class NotificationTable(NetBoxTable): + icon = columns.TemplateColumn( + template_code=NOTIFICATION_ICON, + accessor=tables.A('event'), + attrs={ + 'td': {'class': 'w-1'}, + 'th': {'class': 'w-1'}, + }, + verbose_name='' + ) + object_type = columns.ContentTypeColumn( + verbose_name=_('Object Type'), + ) + object = columns.TemplateColumn( + verbose_name=_('Object'), + template_code=NOTIFICATION_LINK, + orderable=False + ) + created = columns.DateTimeColumn( + timespec='minutes', + verbose_name=_('Created'), + ) + read = columns.DateTimeColumn( + timespec='minutes', + verbose_name=_('Read'), + ) + user = tables.Column( + verbose_name=_('User'), + linkify=True + ) + actions = NotificationActionsColumn( + actions=('dismiss',) + ) + + class Meta(NetBoxTable.Meta): + model = Notification + fields = ('pk', 'icon', 'object', 'object_type', 'event_type', 'created', 'read', 'user') + default_columns = ('icon', 'object', 'object_type', 'event_type', 'created') + row_attrs = { + 'data-read': lambda record: bool(record.read), + } + + +class NotificationGroupTable(NetBoxTable): + name = tables.Column( + linkify=True, + verbose_name=_('Name') + ) + users = columns.ManyToManyColumn( + linkify_item=True + ) + groups = columns.ManyToManyColumn( + linkify_item=True + ) + + class Meta(NetBoxTable.Meta): + model = NotificationGroup + fields = ('pk', 'name', 'description', 'groups', 'users') + default_columns = ('name', 'description', 'groups', 'users') + + class WebhookTable(NetBoxTable): name = tables.Column( verbose_name=_('Name'), @@ -299,20 +414,10 @@ class EventRuleTable(NetBoxTable): enabled = columns.BooleanColumn( verbose_name=_('Enabled'), ) - type_create = columns.BooleanColumn( - verbose_name=_('Create') - ) - type_update = columns.BooleanColumn( - verbose_name=_('Update') - ) - type_delete = columns.BooleanColumn( - verbose_name=_('Delete') - ) - type_job_start = columns.BooleanColumn( - verbose_name=_('Job Start') - ) - type_job_end = columns.BooleanColumn( - verbose_name=_('Job End') + event_types = columns.ArrayColumn( + verbose_name=_('Event Types'), + func=get_event_text, + orderable=False ) tags = columns.TagColumn( url_name='extras:webhook_list' @@ -322,12 +427,10 @@ class Meta(NetBoxTable.Meta): model = EventRule fields = ( 'pk', 'id', 'name', 'enabled', 'description', 'action_type', 'action_object', 'object_types', - 'type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end', 'tags', 'created', - 'last_updated', + 'event_types', 'tags', 'created', 'last_updated', ) default_columns = ( - 'pk', 'name', 'enabled', 'action_type', 'action_object', 'object_types', 'type_create', 'type_update', - 'type_delete', 'type_job_start', 'type_job_end', + 'pk', 'name', 'enabled', 'action_type', 'action_object', 'object_types', 'event_types', ) @@ -458,49 +561,6 @@ class Meta(NetBoxTable.Meta): ) -class ObjectChangeTable(NetBoxTable): - time = columns.DateTimeColumn( - verbose_name=_('Time'), - timespec='minutes', - linkify=True - ) - user_name = tables.Column( - verbose_name=_('Username') - ) - full_name = tables.TemplateColumn( - accessor=tables.A('user'), - template_code=OBJECTCHANGE_FULL_NAME, - verbose_name=_('Full Name'), - orderable=False - ) - action = columns.ChoiceFieldColumn( - verbose_name=_('Action'), - ) - changed_object_type = columns.ContentTypeColumn( - verbose_name=_('Type') - ) - object_repr = tables.TemplateColumn( - accessor=tables.A('changed_object'), - template_code=OBJECTCHANGE_OBJECT, - verbose_name=_('Object'), - orderable=False - ) - request_id = tables.TemplateColumn( - template_code=OBJECTCHANGE_REQUEST_ID, - verbose_name=_('Request ID') - ) - actions = columns.ActionsColumn( - actions=() - ) - - class Meta(NetBoxTable.Meta): - model = ObjectChange - fields = ( - 'pk', 'id', 'time', 'user_name', 'full_name', 'action', 'changed_object_type', 'object_repr', 'request_id', - 'actions', - ) - - class JournalEntryTable(NetBoxTable): created = columns.DateTimeColumn( verbose_name=_('Created'), diff --git a/netbox/extras/tables/template_code.py b/netbox/extras/tables/template_code.py deleted file mode 100644 index 2c62484696..0000000000 --- a/netbox/extras/tables/template_code.py +++ /dev/null @@ -1,25 +0,0 @@ -CONFIGCONTEXT_ACTIONS = """ -{% if perms.extras.change_configcontext %} - -{% endif %} -{% if perms.extras.delete_configcontext %} - -{% endif %} -""" - -OBJECTCHANGE_FULL_NAME = """ -{% load helpers %} -{{ value.get_full_name|placeholder }} -""" - -OBJECTCHANGE_OBJECT = """ -{% if value and value.get_absolute_url %} - {{ record.object_repr }} -{% else %} - {{ record.object_repr }} -{% endif %} -""" - -OBJECTCHANGE_REQUEST_ID = """ -{{ value }} -""" diff --git a/netbox/extras/tests/test_api.py b/netbox/extras/tests/test_api.py index 5d243ae1a9..5defbd0bdc 100644 --- a/netbox/extras/tests/test_api.py +++ b/netbox/extras/tests/test_api.py @@ -1,21 +1,21 @@ import datetime -from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.urls import reverse from django.utils.timezone import make_aware from rest_framework import status from core.choices import ManagedFileRootPathChoices +from core.events import * from core.models import ObjectType from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Rack, Location, RackRole, Site from extras.choices import * from extras.models import * from extras.scripts import BooleanVar, IntegerVar, Script as PythonClass, StringVar +from netbox.events import * +from users.models import Group, User from utilities.testing import APITestCase, APIViewTestCases -User = get_user_model() - class AppTest(APITestCase): @@ -113,9 +113,9 @@ def setUpTestData(cls): Webhook.objects.bulk_create(webhooks) event_rules = ( - EventRule(name='EventRule 1', type_create=True, action_object=webhooks[0]), - EventRule(name='EventRule 2', type_create=True, action_object=webhooks[1]), - EventRule(name='EventRule 3', type_create=True, action_object=webhooks[2]), + EventRule(name='EventRule 1', event_types=[OBJECT_CREATED], action_object=webhooks[0]), + EventRule(name='EventRule 2', event_types=[OBJECT_CREATED], action_object=webhooks[1]), + EventRule(name='EventRule 3', event_types=[OBJECT_CREATED], action_object=webhooks[2]), ) EventRule.objects.bulk_create(event_rules) @@ -123,7 +123,7 @@ def setUpTestData(cls): { 'name': 'EventRule 4', 'object_types': ['dcim.device', 'dcim.devicetype'], - 'type_create': True, + 'event_types': [OBJECT_CREATED], 'action_type': EventRuleActionChoices.WEBHOOK, 'action_object_type': 'extras.webhook', 'action_object_id': webhooks[3].pk, @@ -131,7 +131,7 @@ def setUpTestData(cls): { 'name': 'EventRule 5', 'object_types': ['dcim.device', 'dcim.devicetype'], - 'type_create': True, + 'event_types': [OBJECT_CREATED], 'action_type': EventRuleActionChoices.WEBHOOK, 'action_object_type': 'extras.webhook', 'action_object_id': webhooks[4].pk, @@ -139,7 +139,7 @@ def setUpTestData(cls): { 'name': 'EventRule 6', 'object_types': ['dcim.device', 'dcim.devicetype'], - 'type_create': True, + 'event_types': [OBJECT_CREATED], 'action_type': EventRuleActionChoices.WEBHOOK, 'action_object_type': 'extras.webhook', 'action_object_id': webhooks[5].pk, @@ -890,3 +890,196 @@ def test_get_object(self): url = reverse('extras-api:objecttype-detail', kwargs={'pk': object_type.pk}) self.assertHttpStatus(self.client.get(url, **self.header), status.HTTP_200_OK) + + +class SubscriptionTest(APIViewTestCases.APIViewTestCase): + model = Subscription + brief_fields = ['display', 'id', 'object_id', 'object_type', 'url', 'user'] + + @classmethod + def setUpTestData(cls): + users = ( + User(username='User 1'), + User(username='User 2'), + User(username='User 3'), + User(username='User 4'), + ) + User.objects.bulk_create(users) + sites = ( + Site(name='Site 1', slug='site-1'), + Site(name='Site 2', slug='site-2'), + Site(name='Site 3', slug='site-3'), + ) + Site.objects.bulk_create(sites) + + subscriptions = ( + Subscription( + object=sites[0], + user=users[0], + ), + Subscription( + object=sites[1], + user=users[1], + ), + Subscription( + object=sites[2], + user=users[2], + ), + ) + Subscription.objects.bulk_create(subscriptions) + + cls.create_data = [ + { + 'object_type': 'dcim.site', + 'object_id': sites[0].pk, + 'user': users[3].pk, + }, + { + 'object_type': 'dcim.site', + 'object_id': sites[1].pk, + 'user': users[3].pk, + }, + { + 'object_type': 'dcim.site', + 'object_id': sites[2].pk, + 'user': users[3].pk, + }, + ] + + +class NotificationGroupTest(APIViewTestCases.APIViewTestCase): + model = NotificationGroup + brief_fields = ['description', 'display', 'id', 'name', 'url'] + create_data = [ + { + 'object_types': ['dcim.site'], + 'name': 'Custom Link 4', + 'enabled': True, + 'link_text': 'Link 4', + 'link_url': 'http://example.com/?4', + }, + { + 'object_types': ['dcim.site'], + 'name': 'Custom Link 5', + 'enabled': True, + 'link_text': 'Link 5', + 'link_url': 'http://example.com/?5', + }, + { + 'object_types': ['dcim.site'], + 'name': 'Custom Link 6', + 'enabled': False, + 'link_text': 'Link 6', + 'link_url': 'http://example.com/?6', + }, + ] + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + users = ( + User(username='User 1'), + User(username='User 2'), + User(username='User 3'), + ) + User.objects.bulk_create(users) + groups = ( + Group(name='Group 1'), + Group(name='Group 2'), + Group(name='Group 3'), + ) + Group.objects.bulk_create(groups) + + notification_groups = ( + NotificationGroup(name='Notification Group 1'), + NotificationGroup(name='Notification Group 2'), + NotificationGroup(name='Notification Group 3'), + ) + NotificationGroup.objects.bulk_create(notification_groups) + for i, notification_group in enumerate(notification_groups): + notification_group.users.add(users[i]) + notification_group.groups.add(groups[i]) + + cls.create_data = [ + { + 'name': 'Notification Group 4', + 'description': 'Foo', + 'users': [users[0].pk], + 'groups': [groups[0].pk], + }, + { + 'name': 'Notification Group 5', + 'description': 'Bar', + 'users': [users[1].pk], + 'groups': [groups[1].pk], + }, + { + 'name': 'Notification Group 6', + 'description': 'Baz', + 'users': [users[2].pk], + 'groups': [groups[2].pk], + }, + ] + + +class NotificationTest(APIViewTestCases.APIViewTestCase): + model = Notification + brief_fields = ['display', 'event_type', 'id', 'object_id', 'object_type', 'read', 'url', 'user'] + + @classmethod + def setUpTestData(cls): + users = ( + User(username='User 1'), + User(username='User 2'), + User(username='User 3'), + User(username='User 4'), + ) + User.objects.bulk_create(users) + sites = ( + Site(name='Site 1', slug='site-1'), + Site(name='Site 2', slug='site-2'), + Site(name='Site 3', slug='site-3'), + ) + Site.objects.bulk_create(sites) + + notifications = ( + Notification( + object=sites[0], + event_type=OBJECT_CREATED, + user=users[0], + ), + Notification( + object=sites[1], + event_type=OBJECT_UPDATED, + user=users[1], + ), + Notification( + object=sites[2], + event_type=OBJECT_DELETED, + user=users[2], + ), + ) + Notification.objects.bulk_create(notifications) + + cls.create_data = [ + { + 'object_type': 'dcim.site', + 'object_id': sites[0].pk, + 'user': users[3].pk, + 'event_type': OBJECT_CREATED, + }, + { + 'object_type': 'dcim.site', + 'object_id': sites[1].pk, + 'user': users[3].pk, + 'event_type': OBJECT_UPDATED, + }, + { + 'object_type': 'dcim.site', + 'object_id': sites[2].pk, + 'user': users[3].pk, + 'event_type': OBJECT_DELETED, + }, + ] diff --git a/netbox/extras/tests/test_conditions.py b/netbox/extras/tests/test_conditions.py index dd528b918d..dfe460f99d 100644 --- a/netbox/extras/tests/test_conditions.py +++ b/netbox/extras/tests/test_conditions.py @@ -1,6 +1,7 @@ from django.contrib.contenttypes.models import ContentType from django.test import TestCase +from core.events import * from dcim.choices import SiteStatusChoices from dcim.models import Site from extras.conditions import Condition, ConditionSet @@ -230,8 +231,7 @@ def test_event_rule_conditions_without_logic_operator(self): """ event_rule = EventRule( name='Event Rule 1', - type_create=True, - type_update=True, + event_types=[OBJECT_CREATED, OBJECT_UPDATED], conditions={ 'attr': 'status.value', 'value': 'active', @@ -251,8 +251,7 @@ def test_event_rule_conditions_with_logical_operation(self): """ event_rule = EventRule( name='Event Rule 1', - type_create=True, - type_update=True, + event_types=[OBJECT_CREATED, OBJECT_UPDATED], conditions={ "attr": "status.value", "value": ["planned", "staging"], @@ -273,8 +272,7 @@ def test_event_rule_conditions_with_logical_operation_and_negate(self): """ event_rule = EventRule( name='Event Rule 1', - type_create=True, - type_update=True, + event_types=[OBJECT_CREATED, OBJECT_UPDATED], conditions={ "attr": "status.value", "value": ["planned", "staging"], @@ -300,8 +298,7 @@ def test_event_rule_conditions_with_incorrect_key_must_return_false(self): webhook = Webhook.objects.create(name='Webhook 100', payload_url='http://example.com/?1', http_method='POST') form = EventRuleForm({ "name": "Event Rule 1", - "type_create": True, - "type_update": True, + "event_types": [OBJECT_CREATED, OBJECT_UPDATED], "action_object_type": ct.pk, "action_type": "webhook", "action_choice": webhook.pk, diff --git a/netbox/extras/tests/test_customfields.py b/netbox/extras/tests/test_customfields.py index d4917cde98..697b756ecb 100644 --- a/netbox/extras/tests/test_customfields.py +++ b/netbox/extras/tests/test_customfields.py @@ -1140,6 +1140,29 @@ def test_regex_validation(self): response = self.client.patch(url, data, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_200_OK) + def test_uniqueness_validation(self): + # Create a unique custom field + cf_text = CustomField.objects.get(name='text_field') + cf_text.unique = True + cf_text.save() + + # Set a value on site 1 + site1 = Site.objects.get(name='Site 1') + site1.custom_field_data['text_field'] = 'ABC123' + site1.save() + + site2 = Site.objects.get(name='Site 2') + url = reverse('dcim-api:site-detail', kwargs={'pk': site2.pk}) + self.add_permissions('dcim.change_site') + + data = {'custom_fields': {'text_field': 'ABC123'}} + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + + data = {'custom_fields': {'text_field': 'DEF456'}} + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + class CustomFieldImportTest(TestCase): user_permissions = ( diff --git a/netbox/extras/tests/test_customvalidators.py b/netbox/extras/tests/test_customvalidators.py index 217fddd184..49deb9da5e 100644 --- a/netbox/extras/tests/test_customvalidators.py +++ b/netbox/extras/tests/test_customvalidators.py @@ -14,7 +14,7 @@ class MyValidator(CustomValidator): - def validate(self, instance): + def validate(self, instance, request): if instance.name != 'foo': self.fail("Name must be foo!") diff --git a/netbox/extras/tests/test_event_rules.py b/netbox/extras/tests/test_event_rules.py index bef045fb5e..7f7b0b81f3 100644 --- a/netbox/extras/tests/test_event_rules.py +++ b/netbox/extras/tests/test_event_rules.py @@ -9,14 +9,15 @@ from requests import Session from rest_framework import status +from core.events import * from core.models import ObjectType from dcim.choices import SiteStatusChoices from dcim.models import Site -from extras.choices import EventRuleActionChoices, ObjectChangeActionChoices -from extras.context_managers import event_tracking -from extras.events import enqueue_object, flush_events, serialize_for_event +from extras.choices import EventRuleActionChoices +from extras.events import enqueue_event, flush_events, serialize_for_event from extras.models import EventRule, Tag, Webhook from extras.webhooks import generate_signature, send_webhook +from netbox.context_managers import event_tracking from utilities.testing import APITestCase @@ -45,22 +46,22 @@ def setUpTestData(cls): webhook_type = ObjectType.objects.get(app_label='extras', model='webhook') event_rules = EventRule.objects.bulk_create(( EventRule( - name='Webhook Event 1', - type_create=True, + name='Event Rule 1', + event_types=[OBJECT_CREATED], action_type=EventRuleActionChoices.WEBHOOK, action_object_type=webhook_type, action_object_id=webhooks[0].id ), EventRule( - name='Webhook Event 2', - type_update=True, + name='Event Rule 2', + event_types=[OBJECT_UPDATED], action_type=EventRuleActionChoices.WEBHOOK, action_object_type=webhook_type, action_object_id=webhooks[0].id ), EventRule( - name='Webhook Event 3', - type_delete=True, + name='Event Rule 3', + event_types=[OBJECT_DELETED], action_type=EventRuleActionChoices.WEBHOOK, action_object_type=webhook_type, action_object_id=webhooks[0].id @@ -81,8 +82,7 @@ def test_eventrule_conditions(self): """ event_rule = EventRule( name='Event Rule 1', - type_create=True, - type_update=True, + event_types=[OBJECT_CREATED, OBJECT_UPDATED], conditions={ 'and': [ { @@ -130,8 +130,8 @@ def test_single_create_process_eventrule(self): # Verify that a background task was queued for the new object self.assertEqual(self.queue.count, 1) job = self.queue.jobs[0] - self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_create=True)) - self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_CREATE) + self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(name='Event Rule 1')) + self.assertEqual(job.kwargs['event_type'], OBJECT_CREATED) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], response.data['id']) self.assertEqual(len(job.kwargs['data']['tags']), len(response.data['tags'])) @@ -180,8 +180,8 @@ def test_bulk_create_process_eventrule(self): # Verify that a background task was queued for each new object self.assertEqual(self.queue.count, 3) for i, job in enumerate(self.queue.jobs): - self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_create=True)) - self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_CREATE) + self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(name='Event Rule 1')) + self.assertEqual(job.kwargs['event_type'], OBJECT_CREATED) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], response.data[i]['id']) self.assertEqual(len(job.kwargs['data']['tags']), len(response.data[i]['tags'])) @@ -211,8 +211,8 @@ def test_single_update_process_eventrule(self): # Verify that a background task was queued for the updated object self.assertEqual(self.queue.count, 1) job = self.queue.jobs[0] - self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_update=True)) - self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_UPDATE) + self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(name='Event Rule 2')) + self.assertEqual(job.kwargs['event_type'], OBJECT_UPDATED) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], site.pk) self.assertEqual(len(job.kwargs['data']['tags']), len(response.data['tags'])) @@ -267,8 +267,8 @@ def test_bulk_update_process_eventrule(self): # Verify that a background task was queued for each updated object self.assertEqual(self.queue.count, 3) for i, job in enumerate(self.queue.jobs): - self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_update=True)) - self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_UPDATE) + self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(name='Event Rule 2')) + self.assertEqual(job.kwargs['event_type'], OBJECT_UPDATED) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], data[i]['id']) self.assertEqual(len(job.kwargs['data']['tags']), len(response.data[i]['tags'])) @@ -293,8 +293,8 @@ def test_single_delete_process_eventrule(self): # Verify that a task was queued for the deleted object self.assertEqual(self.queue.count, 1) job = self.queue.jobs[0] - self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_delete=True)) - self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_DELETE) + self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(name='Event Rule 3')) + self.assertEqual(job.kwargs['event_type'], OBJECT_DELETED) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], site.pk) self.assertEqual(job.kwargs['snapshots']['prechange']['name'], 'Site 1') @@ -326,8 +326,8 @@ def test_bulk_delete_process_eventrule(self): # Verify that a background task was queued for each deleted object self.assertEqual(self.queue.count, 3) for i, job in enumerate(self.queue.jobs): - self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_delete=True)) - self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_DELETE) + self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(name='Event Rule 3')) + self.assertEqual(job.kwargs['event_type'], OBJECT_DELETED) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], sites[i].pk) self.assertEqual(job.kwargs['snapshots']['prechange']['name'], sites[i].name) @@ -341,7 +341,7 @@ def dummy_send(_, request, **kwargs): A dummy implementation of Session.send() to be used for testing. Always returns a 200 HTTP response. """ - event = EventRule.objects.get(type_create=True) + event = EventRule.objects.get(name='Event Rule 1') webhook = event.action_object signature = generate_signature(request.body, webhook.secret) @@ -364,12 +364,12 @@ def dummy_send(_, request, **kwargs): # Enqueue a webhook for processing webhooks_queue = {} site = Site.objects.create(name='Site 1', slug='site-1') - enqueue_object( + enqueue_event( webhooks_queue, instance=site, user=self.user, request_id=request_id, - action=ObjectChangeActionChoices.ACTION_CREATE + event_type=OBJECT_CREATED ) flush_events(list(webhooks_queue.values())) @@ -377,7 +377,7 @@ def dummy_send(_, request, **kwargs): job = self.queue.jobs[0] # Patch the Session object with our dummy_send() method, then process the webhook for sending - with patch.object(Session, 'send', dummy_send) as mock_send: + with patch.object(Session, 'send', dummy_send): send_webhook(**job.kwargs) def test_duplicate_triggers(self): @@ -398,7 +398,7 @@ def test_duplicate_triggers(self): site.save() self.assertEqual(self.queue.count, 1, msg="Duplicate jobs found in queue") job = self.queue.get_jobs()[0] - self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_CREATE) + self.assertEqual(job.kwargs['event_type'], OBJECT_CREATED) self.queue.empty() # Test multiple updates @@ -410,7 +410,7 @@ def test_duplicate_triggers(self): site.save() self.assertEqual(self.queue.count, 1, msg="Duplicate jobs found in queue") job = self.queue.get_jobs()[0] - self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_UPDATE) + self.assertEqual(job.kwargs['event_type'], OBJECT_UPDATED) self.queue.empty() # Test update & delete @@ -421,5 +421,5 @@ def test_duplicate_triggers(self): site.delete() self.assertEqual(self.queue.count, 1, msg="Duplicate jobs found in queue") job = self.queue.get_jobs()[0] - self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_DELETE) + self.assertEqual(job.kwargs['event_type'], OBJECT_DELETED) self.queue.empty() diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index b68c02efce..9048d5fd97 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -1,32 +1,29 @@ import uuid from datetime import datetime, timezone -from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.test import TestCase from circuits.models import Provider -from core.choices import ManagedFileRootPathChoices -from core.models import ObjectType +from core.choices import ManagedFileRootPathChoices, ObjectChangeActionChoices +from core.events import * +from core.models import ObjectChange, ObjectType from dcim.filtersets import SiteFilterSet from dcim.models import DeviceRole, DeviceType, Manufacturer, Platform, Rack, Region, Site, SiteGroup from dcim.models import Location from extras.choices import * from extras.filtersets import * from extras.models import * -from ipam.models import IPAddress from tenancy.models import Tenant, TenantGroup +from users.models import Group, User from utilities.testing import BaseFilterSetTests, ChangeLoggedFilterSetTests, create_tags from virtualization.models import Cluster, ClusterGroup, ClusterType -User = get_user_model() - - class CustomFieldTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = CustomField.objects.all() filterset = CustomFieldFilterSet - ignore_fields = ('default',) + ignore_fields = ('default', 'related_object_filter') @classmethod def setUpTestData(cls): @@ -255,7 +252,7 @@ def test_ssl_verification(self): class EventRuleTestCase(TestCase, BaseFilterSetTests): queryset = EventRule.objects.all() filterset = EventRuleFilterSet - ignore_fields = ('action_data', 'conditions') + ignore_fields = ('action_data', 'conditions', 'event_types') @classmethod def setUpTestData(cls): @@ -296,11 +293,7 @@ def setUpTestData(cls): name='Event Rule 1', action_object=webhooks[0], enabled=True, - type_create=True, - type_update=False, - type_delete=False, - type_job_start=False, - type_job_end=False, + event_types=[OBJECT_CREATED], action_type=EventRuleActionChoices.WEBHOOK, description='foobar1' ), @@ -308,11 +301,7 @@ def setUpTestData(cls): name='Event Rule 2', action_object=webhooks[1], enabled=True, - type_create=False, - type_update=True, - type_delete=False, - type_job_start=False, - type_job_end=False, + event_types=[OBJECT_UPDATED], action_type=EventRuleActionChoices.WEBHOOK, description='foobar2' ), @@ -320,11 +309,7 @@ def setUpTestData(cls): name='Event Rule 3', action_object=webhooks[2], enabled=False, - type_create=False, - type_update=False, - type_delete=True, - type_job_start=False, - type_job_end=False, + event_types=[OBJECT_DELETED], action_type=EventRuleActionChoices.WEBHOOK, description='foobar3' ), @@ -332,22 +317,14 @@ def setUpTestData(cls): name='Event Rule 4', action_object=scripts[0], enabled=False, - type_create=False, - type_update=False, - type_delete=False, - type_job_start=True, - type_job_end=False, + event_types=[JOB_STARTED], action_type=EventRuleActionChoices.SCRIPT, ), EventRule( name='Event Rule 5', action_object=scripts[1], enabled=False, - type_create=False, - type_update=False, - type_delete=False, - type_job_start=False, - type_job_end=True, + event_types=[JOB_COMPLETED], action_type=EventRuleActionChoices.SCRIPT, ), ) @@ -388,25 +365,9 @@ def test_enabled(self): params = {'enabled': False} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) - def test_type_create(self): - params = {'type_create': True} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - - def test_type_update(self): - params = {'type_update': True} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - - def test_type_delete(self): - params = {'type_delete': True} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - - def test_type_job_start(self): - params = {'type_job_start': True} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - - def test_type_job_end(self): - params = {'type_job_end': True} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_event_type(self): + params = {'event_type': [OBJECT_CREATED, OBJECT_UPDATED]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) class CustomLinkTestCase(TestCase, ChangeLoggedFilterSetTests): @@ -1137,6 +1098,8 @@ class TagTestCase(TestCase, ChangeLoggedFilterSetTests): 'asnrange', 'cable', 'circuit', + 'circuitgroup', + 'circuitgroupassignment', 'circuittermination', 'circuittype', 'cluster', @@ -1188,6 +1151,7 @@ class TagTestCase(TestCase, ChangeLoggedFilterSetTests): 'rack', 'rackreservation', 'rackrole', + 'racktype', 'rearport', 'region', 'rir', @@ -1280,102 +1244,6 @@ def test_object_types(self): ) -class ObjectChangeTestCase(TestCase, BaseFilterSetTests): - queryset = ObjectChange.objects.all() - filterset = ObjectChangeFilterSet - ignore_fields = ('prechange_data', 'postchange_data') - - @classmethod - def setUpTestData(cls): - users = ( - User(username='user1'), - User(username='user2'), - User(username='user3'), - ) - User.objects.bulk_create(users) - - site = Site.objects.create(name='Test Site 1', slug='test-site-1') - ipaddress = IPAddress.objects.create(address='192.0.2.1/24') - - object_changes = ( - ObjectChange( - user=users[0], - user_name=users[0].username, - request_id=uuid.uuid4(), - action=ObjectChangeActionChoices.ACTION_CREATE, - changed_object=site, - object_repr=str(site), - postchange_data={'name': site.name, 'slug': site.slug} - ), - ObjectChange( - user=users[0], - user_name=users[0].username, - request_id=uuid.uuid4(), - action=ObjectChangeActionChoices.ACTION_UPDATE, - changed_object=site, - object_repr=str(site), - postchange_data={'name': site.name, 'slug': site.slug} - ), - ObjectChange( - user=users[1], - user_name=users[1].username, - request_id=uuid.uuid4(), - action=ObjectChangeActionChoices.ACTION_DELETE, - changed_object=site, - object_repr=str(site), - postchange_data={'name': site.name, 'slug': site.slug} - ), - ObjectChange( - user=users[1], - user_name=users[1].username, - request_id=uuid.uuid4(), - action=ObjectChangeActionChoices.ACTION_CREATE, - changed_object=ipaddress, - object_repr=str(ipaddress), - postchange_data={'address': ipaddress.address, 'status': ipaddress.status} - ), - ObjectChange( - user=users[2], - user_name=users[2].username, - request_id=uuid.uuid4(), - action=ObjectChangeActionChoices.ACTION_UPDATE, - changed_object=ipaddress, - object_repr=str(ipaddress), - postchange_data={'address': ipaddress.address, 'status': ipaddress.status} - ), - ObjectChange( - user=users[2], - user_name=users[2].username, - request_id=uuid.uuid4(), - action=ObjectChangeActionChoices.ACTION_DELETE, - changed_object=ipaddress, - object_repr=str(ipaddress), - postchange_data={'address': ipaddress.address, 'status': ipaddress.status} - ), - ) - ObjectChange.objects.bulk_create(object_changes) - - def test_q(self): - params = {'q': 'Site 1'} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) - - def test_user(self): - params = {'user_id': User.objects.filter(username__in=['user1', 'user2']).values_list('pk', flat=True)} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) - params = {'user': ['user1', 'user2']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) - - def test_user_name(self): - params = {'user_name': ['user1', 'user2']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) - - def test_changed_object_type(self): - params = {'changed_object_type': 'dcim.site'} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) - params = {'changed_object_type_id': [ContentType.objects.get(app_label='dcim', model='site').pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) - - class ChangeLoggedFilterSetTestCase(TestCase): """ Evaluate base ChangeLoggedFilterSet filters using the Site model. @@ -1467,3 +1335,65 @@ def test_modified_by_request(self): params = {'modified_by_request': self.create_update_request_id} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) self.assertEqual(self.queryset.count(), 4) + + +class NotificationGroupTestCase(TestCase, BaseFilterSetTests): + queryset = NotificationGroup.objects.all() + filterset = NotificationGroupFilterSet + + @classmethod + def setUpTestData(cls): + users = ( + User(username='User 1'), + User(username='User 2'), + User(username='User 3'), + ) + User.objects.bulk_create(users) + + groups = ( + Group(name='Group 1'), + Group(name='Group 2'), + Group(name='Group 3'), + ) + Group.objects.bulk_create(groups) + + sites = ( + Site(name='Site 1', slug='site-1'), + Site(name='Site 2', slug='site-2'), + Site(name='Site 3', slug='site-3'), + ) + Site.objects.bulk_create(sites) + + tenants = ( + Tenant(name='Tenant 1', slug='tenant-1'), + Tenant(name='Tenant 2', slug='tenant-2'), + Tenant(name='Tenant 3', slug='tenant-3'), + ) + Tenant.objects.bulk_create(tenants) + + notification_groups = ( + NotificationGroup(name='Notification Group 1'), + NotificationGroup(name='Notification Group 2'), + NotificationGroup(name='Notification Group 3'), + ) + NotificationGroup.objects.bulk_create(notification_groups) + notification_groups[0].users.add(users[0]) + notification_groups[1].users.add(users[1]) + notification_groups[2].users.add(users[2]) + notification_groups[0].groups.add(groups[0]) + notification_groups[1].groups.add(groups[1]) + notification_groups[2].groups.add(groups[2]) + + def test_user(self): + users = User.objects.filter(username__startswith='User') + params = {'user': [users[0].username, users[1].username]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'user_id': [users[0].pk, users[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_group(self): + groups = Group.objects.all() + params = {'group': [groups[0].name, groups[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'group_id': [groups[0].pk, groups[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) diff --git a/netbox/extras/tests/test_views.py b/netbox/extras/tests/test_views.py index fd478acd42..796d36180c 100644 --- a/netbox/extras/tests/test_views.py +++ b/netbox/extras/tests/test_views.py @@ -1,18 +1,14 @@ -import urllib.parse -import uuid - -from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.urls import reverse +from core.events import * from core.models import ObjectType from dcim.models import DeviceType, Manufacturer, Site from extras.choices import * from extras.models import * +from users.models import Group, User from utilities.testing import ViewTestCases, TestCase -User = get_user_model() - class CustomFieldTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = CustomField @@ -399,9 +395,9 @@ def setUpTestData(cls): site_type = ObjectType.objects.get_for_model(Site) event_rules = ( - EventRule(name='EventRule 1', type_create=True, action_object=webhooks[0]), - EventRule(name='EventRule 2', type_create=True, action_object=webhooks[1]), - EventRule(name='EventRule 3', type_create=True, action_object=webhooks[2]), + EventRule(name='EventRule 1', event_types=[OBJECT_CREATED], action_object=webhooks[0]), + EventRule(name='EventRule 2', event_types=[OBJECT_CREATED], action_object=webhooks[1]), + EventRule(name='EventRule 3', event_types=[OBJECT_CREATED], action_object=webhooks[2]), ) for event in event_rules: event.save() @@ -411,9 +407,7 @@ def setUpTestData(cls): cls.form_data = { 'name': 'Event X', 'object_types': [site_type.pk], - 'type_create': False, - 'type_update': True, - 'type_delete': True, + 'event_types': [OBJECT_UPDATED, OBJECT_DELETED], 'conditions': None, 'action_type': 'webhook', 'action_object_type': webhook_ct.pk, @@ -423,8 +417,8 @@ def setUpTestData(cls): } cls.csv_data = ( - "name,object_types,type_create,action_type,action_object", - "Webhook 4,dcim.site,True,webhook,Webhook 1", + f'name,object_types,event_types,action_type,action_object', + f'Webhook 4,dcim.site,"{OBJECT_CREATED},{OBJECT_UPDATED}",webhook,Webhook 1', ) cls.csv_update_data = ( @@ -435,7 +429,7 @@ def setUpTestData(cls): ) cls.bulk_edit_data = { - 'type_update': True, + 'description': 'New description', } @@ -567,43 +561,6 @@ def setUpTestData(cls): } -# TODO: Convert to StandardTestCases.Views -class ObjectChangeTestCase(TestCase): - user_permissions = ( - 'extras.view_objectchange', - ) - - @classmethod - def setUpTestData(cls): - - site = Site(name='Site 1', slug='site-1') - site.save() - - # Create three ObjectChanges - user = User.objects.create_user(username='testuser2') - for i in range(1, 4): - oc = site.to_objectchange(action=ObjectChangeActionChoices.ACTION_UPDATE) - oc.user = user - oc.request_id = uuid.uuid4() - oc.save() - - def test_objectchange_list(self): - - url = reverse('extras:objectchange_list') - params = { - "user": User.objects.first().pk, - } - - response = self.client.get('{}?{}'.format(url, urllib.parse.urlencode(params))) - self.assertHttpStatus(response, 200) - - def test_objectchange(self): - - objectchange = ObjectChange.objects.first() - response = self.client.get(objectchange.get_absolute_url()) - self.assertHttpStatus(response, 200) - - class JournalEntryTestCase( # ViewTestCases.GetObjectViewTestCase, ViewTestCases.CreateObjectViewTestCase, @@ -660,3 +617,166 @@ def test_view_object_with_custom_link(self): response = self.client.get(site.get_absolute_url(), follow=True) self.assertEqual(response.status_code, 200) self.assertIn(f'FOO {site.name} BAR', str(response.content)) + + +class SubscriptionTestCase( + ViewTestCases.CreateObjectViewTestCase, + ViewTestCases.DeleteObjectViewTestCase, + ViewTestCases.ListObjectsViewTestCase, + ViewTestCases.BulkDeleteObjectsViewTestCase +): + model = Subscription + + @classmethod + def setUpTestData(cls): + site_ct = ContentType.objects.get_for_model(Site) + sites = ( + Site(name='Site 1', slug='site-1'), + Site(name='Site 2', slug='site-2'), + Site(name='Site 3', slug='site-3'), + Site(name='Site 4', slug='site-4'), + ) + Site.objects.bulk_create(sites) + + cls.form_data = { + 'object_type': site_ct.pk, + 'object_id': sites[3].pk, + } + + def setUp(self): + super().setUp() + + sites = Site.objects.all() + user = self.user + + subscriptions = ( + Subscription(object=sites[0], user=user), + Subscription(object=sites[1], user=user), + Subscription(object=sites[2], user=user), + ) + Subscription.objects.bulk_create(subscriptions) + + def _get_url(self, action, instance=None): + if action == 'list': + return reverse('account:subscriptions') + return super()._get_url(action, instance) + + def test_list_objects_anonymous(self): + self.client.logout() + url = reverse('account:subscriptions') + login_url = reverse('login') + self.assertRedirects(self.client.get(url), f'{login_url}?next={url}') + + def test_list_objects_with_permission(self): + return + + def test_list_objects_with_constrained_permission(self): + return + + +class NotificationGroupTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = NotificationGroup + + @classmethod + def setUpTestData(cls): + users = ( + User(username='User 1'), + User(username='User 2'), + User(username='User 3'), + ) + User.objects.bulk_create(users) + groups = ( + Group(name='Group 1'), + Group(name='Group 2'), + Group(name='Group 3'), + ) + Group.objects.bulk_create(groups) + + notification_groups = ( + NotificationGroup(name='Notification Group 1'), + NotificationGroup(name='Notification Group 2'), + NotificationGroup(name='Notification Group 3'), + ) + NotificationGroup.objects.bulk_create(notification_groups) + for i, notification_group in enumerate(notification_groups): + notification_group.users.add(users[i]) + notification_group.groups.add(groups[i]) + + cls.form_data = { + 'name': 'Notification Group X', + 'description': 'Blah', + 'users': [users[0].pk, users[1].pk], + 'groups': [groups[0].pk, groups[1].pk], + } + + cls.csv_data = ( + 'name,description,users,groups', + 'Notification Group 4,Foo,"User 1,User 2","Group 1,Group 2"', + 'Notification Group 5,Bar,"User 1,User 2","Group 1,Group 2"', + 'Notification Group 6,Baz,"User 1,User 2","Group 1,Group 2"', + ) + + cls.csv_update_data = ( + "id,name", + f"{notification_groups[0].pk},Notification Group 7", + f"{notification_groups[1].pk},Notification Group 8", + f"{notification_groups[2].pk},Notification Group 9", + ) + + cls.bulk_edit_data = { + 'description': 'New description', + } + + +class NotificationTestCase( + ViewTestCases.DeleteObjectViewTestCase, + ViewTestCases.ListObjectsViewTestCase, + ViewTestCases.BulkDeleteObjectsViewTestCase +): + model = Notification + + @classmethod + def setUpTestData(cls): + site_ct = ContentType.objects.get_for_model(Site) + sites = ( + Site(name='Site 1', slug='site-1'), + Site(name='Site 2', slug='site-2'), + Site(name='Site 3', slug='site-3'), + Site(name='Site 4', slug='site-4'), + ) + Site.objects.bulk_create(sites) + + cls.form_data = { + 'object_type': site_ct.pk, + 'object_id': sites[3].pk, + } + + def setUp(self): + super().setUp() + + sites = Site.objects.all() + user = self.user + + notifications = ( + Notification(object=sites[0], user=user), + Notification(object=sites[1], user=user), + Notification(object=sites[2], user=user), + ) + Notification.objects.bulk_create(notifications) + + def _get_url(self, action, instance=None): + if action == 'list': + return reverse('account:notifications') + return super()._get_url(action, instance) + + def test_list_objects_anonymous(self): + self.client.logout() + url = reverse('account:notifications') + login_url = reverse('login') + self.assertRedirects(self.client.get(url), f'{login_url}?next={url}') + + def test_list_objects_with_permission(self): + return + + def test_list_objects_with_constrained_permission(self): + return diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index 14e74c5ca3..b13af1db9c 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -53,6 +53,24 @@ path('bookmarks/delete/', views.BookmarkBulkDeleteView.as_view(), name='bookmark_bulk_delete'), path('bookmarks//', include(get_model_urls('extras', 'bookmark'))), + # Notification groups + path('notification-groups/', views.NotificationGroupListView.as_view(), name='notificationgroup_list'), + path('notification-groups/add/', views.NotificationGroupEditView.as_view(), name='notificationgroup_add'), + path('notification-groups/import/', views.NotificationGroupBulkImportView.as_view(), name='notificationgroup_import'), + path('notification-groups/edit/', views.NotificationGroupBulkEditView.as_view(), name='notificationgroup_bulk_edit'), + path('notification-groups/delete/', views.NotificationGroupBulkDeleteView.as_view(), name='notificationgroup_bulk_delete'), + path('notification-groups//', include(get_model_urls('extras', 'notificationgroup'))), + + # Notifications + path('notifications/', views.NotificationsView.as_view(), name='notifications'), + path('notifications/delete/', views.NotificationBulkDeleteView.as_view(), name='notification_bulk_delete'), + path('notifications//', include(get_model_urls('extras', 'notification'))), + + # Subscriptions + path('subscriptions/add/', views.SubscriptionCreateView.as_view(), name='subscription_add'), + path('subscriptions/delete/', views.SubscriptionBulkDeleteView.as_view(), name='subscription_bulk_delete'), + path('subscriptions//', include(get_model_urls('extras', 'subscription'))), + # Webhooks path('webhooks/', views.WebhookListView.as_view(), name='webhook_list'), path('webhooks/add/', views.WebhookEditView.as_view(), name='webhook_add'), @@ -106,10 +124,6 @@ path('journal-entries/import/', views.JournalEntryBulkImportView.as_view(), name='journalentry_import'), path('journal-entries//', include(get_model_urls('extras', 'journalentry'))), - # Change logging - path('changelog/', views.ObjectChangeListView.as_view(), name='objectchange_list'), - path('changelog//', include(get_model_urls('extras', 'objectchange'))), - # User dashboard path('dashboard/reset/', views.DashboardResetView.as_view(), name='dashboard_reset'), path('dashboard/widgets/add/', views.DashboardWidgetAddView.as_view(), name='dashboardwidget_add'), @@ -125,11 +139,6 @@ path('scripts//jobs/', views.ScriptJobsView.as_view(), name='script_jobs'), path('script-modules//', include(get_model_urls('extras', 'scriptmodule'))), - # Redirects for legacy script URLs - # TODO: Remove in NetBox v4.1 - path('scripts///', views.LegacyScriptRedirectView.as_view()), - path('scripts////', views.LegacyScriptRedirectView.as_view()), - # Markdown path('render/markdown/', views.RenderMarkdownView.as_view(), name="render_markdown"), ] diff --git a/netbox/extras/utils.py b/netbox/extras/utils.py index e67b9b50c7..28d2e13f07 100644 --- a/netbox/extras/utils.py +++ b/netbox/extras/utils.py @@ -1,5 +1,19 @@ +import importlib + +from django.core.exceptions import ImproperlyConfigured from taggit.managers import _TaggableManager +from netbox.context import current_request +from .validators import CustomValidator + +__all__ = ( + 'image_upload', + 'is_report', + 'is_script', + 'is_taggable', + 'run_validators', +) + def is_taggable(obj): """ @@ -48,3 +62,25 @@ def is_report(obj): return issubclass(obj, Report) and obj != Report except TypeError: return False + + +def run_validators(instance, validators): + """ + Run the provided iterable of CustomValidators for the instance. + """ + request = current_request.get() + for validator in validators: + + # Loading a validator class by dotted path + if type(validator) is str: + module, cls = validator.rsplit('.', 1) + validator = getattr(importlib.import_module(module), cls)() + + # Constructing a new instance on the fly from a ruleset + elif type(validator) is dict: + validator = CustomValidator(validator) + + elif not issubclass(validator.__class__, CustomValidator): + raise ImproperlyConfigured(f"Invalid value for custom validator: {validator}") + + validator(instance, request) diff --git a/netbox/extras/validators.py b/netbox/extras/validators.py index 082f87d642..6823c19784 100644 --- a/netbox/extras/validators.py +++ b/netbox/extras/validators.py @@ -123,13 +123,7 @@ def __call__(self, instance, request=None): ) # Execute custom validation logic (if any) - # TODO: Remove in v4.1 - # Inspect the validate() method, which may have been overridden, to determine - # whether we should pass the request (maintains backward compatibility for pre-v4.0) - if 'request' in inspect.signature(self.validate).parameters: - self.validate(instance, request) - else: - self.validate(instance) + self.validate(instance, request) @staticmethod def _get_request_attr(request, name): diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 0a2c792228..b3d942fd8e 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -6,6 +6,8 @@ from django.http import HttpResponseBadRequest, HttpResponseForbidden, HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse +from django.utils.module_loading import import_string +from django.utils import timezone from django.utils.translation import gettext as _ from django.views.generic import View @@ -14,12 +16,13 @@ from core.models import Job from core.tables import JobTable from dcim.models import Device, DeviceRole, Platform +from extras.choices import LogLevelChoices from extras.dashboard.forms import DashboardWidgetAddForm, DashboardWidgetForm from extras.dashboard.utils import get_widget_class from netbox.constants import DEFAULT_ACTION_PERMISSIONS +from netbox.registry import registry from netbox.views import generic from netbox.views.generic.mixins import TableMixin -from utilities.data import shallow_compare_dict from utilities.forms import ConfirmationForm, get_field_value from utilities.htmx import htmx_partial from utilities.paginator import EnhancedPaginator, get_paginate_count @@ -31,8 +34,8 @@ from utilities.views import ContentTypePermissionRequiredMixin, get_viewname, register_model_view from virtualization.models import VirtualMachine from . import filtersets, forms, tables +from .constants import LOG_LEVEL_RANK from .models import * -from .scripts import run_script from .tables import ReportResultsTable, ScriptResultsTable @@ -355,6 +358,144 @@ def get_queryset(self, request): return Bookmark.objects.filter(user=request.user) +# +# Notification groups +# + +class NotificationGroupListView(generic.ObjectListView): + queryset = NotificationGroup.objects.all() + filterset = filtersets.NotificationGroupFilterSet + filterset_form = forms.NotificationGroupFilterForm + table = tables.NotificationGroupTable + + +@register_model_view(NotificationGroup) +class NotificationGroupView(generic.ObjectView): + queryset = NotificationGroup.objects.all() + + +@register_model_view(NotificationGroup, 'edit') +class NotificationGroupEditView(generic.ObjectEditView): + queryset = NotificationGroup.objects.all() + form = forms.NotificationGroupForm + + +@register_model_view(NotificationGroup, 'delete') +class NotificationGroupDeleteView(generic.ObjectDeleteView): + queryset = NotificationGroup.objects.all() + + +class NotificationGroupBulkImportView(generic.BulkImportView): + queryset = NotificationGroup.objects.all() + model_form = forms.NotificationGroupImportForm + + +class NotificationGroupBulkEditView(generic.BulkEditView): + queryset = NotificationGroup.objects.all() + filterset = filtersets.NotificationGroupFilterSet + table = tables.NotificationGroupTable + form = forms.NotificationGroupBulkEditForm + + +class NotificationGroupBulkDeleteView(generic.BulkDeleteView): + queryset = NotificationGroup.objects.all() + filterset = filtersets.NotificationGroupFilterSet + table = tables.NotificationGroupTable + + +# +# Notifications +# + +class NotificationsView(LoginRequiredMixin, View): + """ + HTMX-only user-specific notifications list. + """ + def get(self, request): + return render(request, 'htmx/notifications.html', { + 'notifications': request.user.notifications.unread(), + 'total_count': request.user.notifications.count(), + }) + + +@register_model_view(Notification, 'read') +class NotificationReadView(LoginRequiredMixin, View): + """ + Mark the Notification read and redirect the user to its attached object. + """ + def get(self, request, pk): + # Mark the Notification as read + notification = get_object_or_404(request.user.notifications, pk=pk) + notification.read = timezone.now() + notification.save() + + # Redirect to the object if it has a URL (deleted objects will not) + if hasattr(notification.object, 'get_absolute_url'): + return redirect(notification.object.get_absolute_url()) + + return redirect('account:notifications') + + +@register_model_view(Notification, 'dismiss') +class NotificationDismissView(LoginRequiredMixin, View): + """ + A convenience view which allows deleting notifications with one click. + """ + def get(self, request, pk): + notification = get_object_or_404(request.user.notifications, pk=pk) + notification.delete() + + if htmx_partial(request): + return render(request, 'htmx/notifications.html', { + 'notifications': request.user.notifications.unread()[:10], + }) + + return redirect('account:notifications') + + +@register_model_view(Notification, 'delete') +class NotificationDeleteView(generic.ObjectDeleteView): + + def get_queryset(self, request): + return Notification.objects.filter(user=request.user) + + +class NotificationBulkDeleteView(generic.BulkDeleteView): + table = tables.NotificationTable + + def get_queryset(self, request): + return Notification.objects.filter(user=request.user) + + +# +# Subscriptions +# + +class SubscriptionCreateView(generic.ObjectEditView): + form = forms.SubscriptionForm + + def get_queryset(self, request): + return Subscription.objects.filter(user=request.user) + + def alter_object(self, obj, request, url_args, url_kwargs): + obj.user = request.user + return obj + + +@register_model_view(Subscription, 'delete') +class SubscriptionDeleteView(generic.ObjectDeleteView): + + def get_queryset(self, request): + return Subscription.objects.filter(user=request.user) + + +class SubscriptionBulkDeleteView(generic.BulkDeleteView): + table = tables.SubscriptionTable + + def get_queryset(self, request): + return Subscription.objects.filter(user=request.user) + + # # Webhooks # @@ -683,75 +824,6 @@ class ConfigTemplateBulkSyncDataView(generic.BulkSyncDataView): queryset = ConfigTemplate.objects.all() -# -# Change logging -# - -class ObjectChangeListView(generic.ObjectListView): - queryset = ObjectChange.objects.valid_models() - filterset = filtersets.ObjectChangeFilterSet - filterset_form = forms.ObjectChangeFilterForm - table = tables.ObjectChangeTable - template_name = 'extras/objectchange_list.html' - actions = { - 'export': {'view'}, - } - - -@register_model_view(ObjectChange) -class ObjectChangeView(generic.ObjectView): - queryset = ObjectChange.objects.valid_models() - - def get_extra_context(self, request, instance): - related_changes = ObjectChange.objects.valid_models().restrict(request.user, 'view').filter( - request_id=instance.request_id - ).exclude( - pk=instance.pk - ) - related_changes_table = tables.ObjectChangeTable( - data=related_changes[:50], - orderable=False - ) - - objectchanges = ObjectChange.objects.valid_models().restrict(request.user, 'view').filter( - changed_object_type=instance.changed_object_type, - changed_object_id=instance.changed_object_id, - ) - - next_change = objectchanges.filter(time__gt=instance.time).order_by('time').first() - prev_change = objectchanges.filter(time__lt=instance.time).order_by('-time').first() - - if not instance.prechange_data and instance.action in ['update', 'delete'] and prev_change: - non_atomic_change = True - prechange_data = prev_change.postchange_data_clean - else: - non_atomic_change = False - prechange_data = instance.prechange_data_clean - - if prechange_data and instance.postchange_data: - diff_added = shallow_compare_dict( - prechange_data or dict(), - instance.postchange_data_clean or dict(), - exclude=['last_updated'], - ) - diff_removed = { - x: prechange_data.get(x) for x in diff_added - } if prechange_data else {} - else: - diff_added = None - diff_removed = None - - return { - 'diff_added': diff_added, - 'diff_removed': diff_removed, - 'next_change': next_change, - 'prev_change': prev_change, - 'related_changes_table': related_changes_table, - 'related_changes_count': related_changes.count(), - 'non_atomic_change': non_atomic_change - } - - # # Image attachments # @@ -1100,10 +1172,9 @@ def post(self, request, **kwargs): if not get_workers_for_queue('default'): messages.error(request, _("Unable to run script: RQ worker process not running.")) elif form.is_valid(): - job = Job.enqueue( - run_script, + ScriptJob = import_string("extras.jobs.ScriptJob") + job = ScriptJob.enqueue( instance=script, - name=script_class.class_name, user=request.user, schedule_at=form.cleaned_data.pop('_schedule_at'), interval=form.cleaned_data.pop('_interval'), @@ -1159,25 +1230,6 @@ def get(self, request, **kwargs): }) -class LegacyScriptRedirectView(ContentTypePermissionRequiredMixin, View): - """ - Redirect legacy (pre-v4.0) script URLs. Examples: - /extras/scripts/// --> /extras/scripts// - /extras/scripts///source/ --> /extras/scripts//source/ - /extras/scripts///jobs/ --> /extras/scripts//jobs/ - """ - def get_required_permission(self): - return 'extras.view_script' - - def get(self, request, module, name, path=''): - module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__regex=f"^{module}\\.") - script = get_object_or_404(Script.objects.all(), module=module, name=name) - - url = reverse('extras:script', kwargs={'pk': script.pk}) - - return redirect(f'{url}{path}') - - class ScriptResultView(TableMixin, generic.ObjectView): queryset = Job.objects.all() @@ -1189,22 +1241,30 @@ def get_table(self, job, request, bulk_actions=True): tests = None table = None index = 0 + + try: + log_threshold = LOG_LEVEL_RANK[request.GET.get('log_threshold', LogLevelChoices.LOG_DEBUG)] + except KeyError: + log_threshold = LOG_LEVEL_RANK[LogLevelChoices.LOG_DEBUG] if job.data: + if 'log' in job.data: if 'tests' in job.data: tests = job.data['tests'] for log in job.data['log']: - index += 1 - result = { - 'index': index, - 'time': log.get('time'), - 'status': log.get('status'), - 'message': log.get('message'), - 'object': log.get('obj'), - 'url': log.get('url'), - } - data.append(result) + log_level = LOG_LEVEL_RANK.get(log.get('status'), LogLevelChoices.LOG_DEFAULT) + if log_level >= log_threshold: + index += 1 + result = { + 'index': index, + 'time': log.get('time'), + 'status': log.get('status'), + 'message': log.get('message'), + 'object': log.get('obj'), + 'url': log.get('url'), + } + data.append(result) table = ScriptResultsTable(data, user=request.user) table.configure(request) @@ -1216,17 +1276,19 @@ def get_table(self, job, request, bulk_actions=True): for method, test_data in tests.items(): if 'log' in test_data: for time, status, obj, url, message in test_data['log']: - index += 1 - result = { - 'index': index, - 'method': method, - 'time': time, - 'status': status, - 'object': obj, - 'url': url, - 'message': message, - } - data.append(result) + log_level = LOG_LEVEL_RANK.get(status, LogLevelChoices.LOG_DEFAULT) + if log_level >= log_threshold: + index += 1 + result = { + 'index': index, + 'method': method, + 'time': time, + 'status': status, + 'object': obj, + 'url': url, + 'message': message, + } + data.append(result) table = ReportResultsTable(data, user=request.user) table.configure(request) @@ -1240,10 +1302,16 @@ def get(self, request, **kwargs): if job.completed: table = self.get_table(job, request, bulk_actions=False) + log_threshold = request.GET.get('log_threshold', LogLevelChoices.LOG_DEBUG) + if log_threshold not in LOG_LEVEL_RANK: + log_threshold = LogLevelChoices.LOG_DEBUG + context = { 'script': job.object, 'job': job, 'table': table, + 'log_levels': dict(LogLevelChoices), + 'log_threshold': log_threshold, } if job.data and 'log' in job.data: @@ -1273,7 +1341,7 @@ def get(self, request, **kwargs): # Markdown # -class RenderMarkdownView(View): +class RenderMarkdownView(LoginRequiredMixin, View): def post(self, request): form = forms.RenderMarkdownForm(request.POST) diff --git a/netbox/extras/webhooks.py b/netbox/extras/webhooks.py index 53ec161d78..889c97ac27 100644 --- a/netbox/extras/webhooks.py +++ b/netbox/extras/webhooks.py @@ -25,7 +25,7 @@ def generate_signature(request_body, secret): @job('default') -def send_webhook(event_rule, model_name, event, data, timestamp, username, request_id=None, snapshots=None): +def send_webhook(event_rule, model_name, event_type, data, timestamp, username, request_id=None, snapshots=None): """ Make a POST request to the defined Webhook """ @@ -33,7 +33,7 @@ def send_webhook(event_rule, model_name, event, data, timestamp, username, reque # Prepare context data for headers & body templates context = { - 'event': WEBHOOK_EVENT_TYPES[event], + 'event': WEBHOOK_EVENT_TYPES.get(event_type, event_type), 'timestamp': timestamp, 'model': model_name, 'username': username, diff --git a/netbox/ipam/api/nested_serializers.py b/netbox/ipam/api/nested_serializers.py index 4d4a77bef9..57a1a65d53 100644 --- a/netbox/ipam/api/nested_serializers.py +++ b/netbox/ipam/api/nested_serializers.py @@ -1,3 +1,5 @@ +import warnings + from drf_spectacular.utils import extend_schema_serializer from rest_framework import serializers @@ -5,6 +7,7 @@ from netbox.api.fields import RelatedObjectCountField from netbox.api.serializers import WritableNestedSerializer from .field_serializers import IPAddressField +from .serializers_.nested import NestedIPAddressSerializer __all__ = [ 'NestedAggregateSerializer', @@ -25,17 +28,22 @@ 'NestedVRFSerializer', ] +# TODO: Remove in v4.2 +warnings.warn( + f"Dedicated nested serializers will be removed in NetBox v4.2. Use Serializer(nested=True) instead.", + DeprecationWarning +) + # # ASN ranges # class NestedASNRangeSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asnrange-detail') class Meta: model = models.ASNRange - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] # @@ -43,11 +51,10 @@ class Meta: # class NestedASNSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asn-detail') class Meta: model = models.ASN - fields = ['id', 'url', 'display', 'asn'] + fields = ['id', 'url', 'display_url', 'display', 'asn'] # @@ -58,12 +65,11 @@ class Meta: exclude_fields=('prefix_count',), ) class NestedVRFSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail') prefix_count = RelatedObjectCountField('prefixes') class Meta: model = models.VRF - fields = ['id', 'url', 'display', 'name', 'rd', 'prefix_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'rd', 'prefix_count'] # @@ -71,11 +77,10 @@ class Meta: # class NestedRouteTargetSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:routetarget-detail') class Meta: model = models.RouteTarget - fields = ['id', 'url', 'display', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'name'] # @@ -86,21 +91,19 @@ class Meta: exclude_fields=('aggregate_count',), ) class NestedRIRSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail') aggregate_count = RelatedObjectCountField('aggregates') class Meta: model = models.RIR - fields = ['id', 'url', 'display', 'name', 'slug', 'aggregate_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'aggregate_count'] class NestedAggregateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:aggregate-detail') family = serializers.IntegerField(read_only=True) class Meta: model = models.Aggregate - fields = ['id', 'url', 'display', 'family', 'prefix'] + fields = ['id', 'url', 'display_url', 'display', 'family', 'prefix'] # @@ -108,20 +111,18 @@ class Meta: # class NestedFHRPGroupSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroup-detail') class Meta: model = models.FHRPGroup - fields = ['id', 'url', 'display', 'protocol', 'group_id'] + fields = ['id', 'url', 'display_url', 'display', 'protocol', 'group_id'] class NestedFHRPGroupAssignmentSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroupassignment-detail') group = NestedFHRPGroupSerializer() class Meta: model = models.FHRPGroupAssignment - fields = ['id', 'url', 'display', 'group', 'interface_type', 'interface_id', 'priority'] + fields = ['id', 'url', 'display_url', 'display', 'group', 'interface_type', 'interface_id', 'priority'] # @@ -132,33 +133,30 @@ class Meta: exclude_fields=('prefix_count', 'vlan_count'), ) class NestedRoleSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail') prefix_count = RelatedObjectCountField('prefixes') vlan_count = RelatedObjectCountField('vlans') class Meta: model = models.Role - fields = ['id', 'url', 'display', 'name', 'slug', 'prefix_count', 'vlan_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'prefix_count', 'vlan_count'] @extend_schema_serializer( exclude_fields=('vlan_count',), ) class NestedVLANGroupSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail') vlan_count = RelatedObjectCountField('vlans') class Meta: model = models.VLANGroup - fields = ['id', 'url', 'display', 'name', 'slug', 'vlan_count'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'vlan_count'] class NestedVLANSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlan-detail') class Meta: model = models.VLAN - fields = ['id', 'url', 'display', 'vid', 'name'] + fields = ['id', 'url', 'display_url', 'display', 'vid', 'name'] # @@ -166,13 +164,12 @@ class Meta: # class NestedPrefixSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:prefix-detail') family = serializers.IntegerField(read_only=True) _depth = serializers.IntegerField(read_only=True) class Meta: model = models.Prefix - fields = ['id', 'url', 'display', 'family', 'prefix', '_depth'] + fields = ['id', 'url', 'display_url', 'display', 'family', 'prefix', '_depth'] # @@ -180,28 +177,13 @@ class Meta: # class NestedIPRangeSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:iprange-detail') family = serializers.IntegerField(read_only=True) start_address = IPAddressField() end_address = IPAddressField() class Meta: model = models.IPRange - fields = ['id', 'url', 'display', 'family', 'start_address', 'end_address'] - - -# -# IP addresses -# - -class NestedIPAddressSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail') - family = serializers.IntegerField(read_only=True) - address = IPAddressField() - - class Meta: - model = models.IPAddress - fields = ['id', 'url', 'display', 'family', 'address'] + fields = ['id', 'url', 'display_url', 'display', 'family', 'start_address', 'end_address'] # @@ -209,16 +191,14 @@ class Meta: # class NestedServiceTemplateSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:servicetemplate-detail') class Meta: model = models.ServiceTemplate - fields = ['id', 'url', 'display', 'name', 'protocol', 'ports'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'protocol', 'ports'] class NestedServiceSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:service-detail') class Meta: model = models.Service - fields = ['id', 'url', 'display', 'name', 'protocol', 'ports'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'protocol', 'ports'] diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index 1f5f210288..0bdfc53853 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -5,4 +5,3 @@ from .serializers_.ip import * from .serializers_.fhrpgroups import * from .serializers_.services import * -from .nested_serializers import * diff --git a/netbox/ipam/api/serializers_/asns.py b/netbox/ipam/api/serializers_/asns.py index 9a8ab5b00f..8baa073f55 100644 --- a/netbox/ipam/api/serializers_/asns.py +++ b/netbox/ipam/api/serializers_/asns.py @@ -14,7 +14,6 @@ class RIRSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:rir-detail') # Related object counts aggregate_count = RelatedObjectCountField('aggregates') @@ -22,14 +21,13 @@ class RIRSerializer(NetBoxModelSerializer): class Meta: model = RIR fields = [ - 'id', 'url', 'display', 'name', 'slug', 'is_private', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'aggregate_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'is_private', 'description', 'tags', + 'custom_fields', 'created', 'last_updated', 'aggregate_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'aggregate_count') class ASNRangeSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asnrange-detail') rir = RIRSerializer(nested=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) asn_count = serializers.IntegerField(read_only=True) @@ -37,14 +35,13 @@ class ASNRangeSerializer(NetBoxModelSerializer): class Meta: model = ASNRange fields = [ - 'id', 'url', 'display', 'name', 'slug', 'rir', 'start', 'end', 'tenant', 'description', 'tags', - 'custom_fields', 'created', 'last_updated', 'asn_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'rir', 'start', 'end', 'tenant', 'description', + 'tags', 'custom_fields', 'created', 'last_updated', 'asn_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class ASNSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:asn-detail') rir = RIRSerializer(nested=True, required=False, allow_null=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -55,8 +52,8 @@ class ASNSerializer(NetBoxModelSerializer): class Meta: model = ASN fields = [ - 'id', 'url', 'display', 'asn', 'rir', 'tenant', 'description', 'comments', 'tags', 'custom_fields', - 'created', 'last_updated', 'site_count', 'provider_count', + 'id', 'url', 'display_url', 'display', 'asn', 'rir', 'tenant', 'description', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', 'site_count', 'provider_count', ] brief_fields = ('id', 'url', 'display', 'asn', 'description') diff --git a/netbox/ipam/api/serializers_/fhrpgroups.py b/netbox/ipam/api/serializers_/fhrpgroups.py index 9bf1d4548d..b5bebbc956 100644 --- a/netbox/ipam/api/serializers_/fhrpgroups.py +++ b/netbox/ipam/api/serializers_/fhrpgroups.py @@ -15,20 +15,18 @@ class FHRPGroupSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroup-detail') ip_addresses = IPAddressSerializer(nested=True, many=True, read_only=True) class Meta: model = FHRPGroup fields = [ - 'id', 'name', 'url', 'display', 'protocol', 'group_id', 'auth_type', 'auth_key', 'description', 'comments', - 'tags', 'custom_fields', 'created', 'last_updated', 'ip_addresses', + 'id', 'name', 'url', 'display_url', 'display', 'protocol', 'group_id', 'auth_type', 'auth_key', + 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'ip_addresses', ] brief_fields = ('id', 'url', 'display', 'protocol', 'group_id', 'description') class FHRPGroupAssignmentSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroupassignment-detail') group = FHRPGroupSerializer(nested=True) interface_type = ContentTypeField( queryset=ContentType.objects.all() @@ -38,8 +36,8 @@ class FHRPGroupAssignmentSerializer(NetBoxModelSerializer): class Meta: model = FHRPGroupAssignment fields = [ - 'id', 'url', 'display', 'group', 'interface_type', 'interface_id', 'interface', 'priority', 'created', - 'last_updated', + 'id', 'url', 'display', 'group', 'interface_type', 'interface_id', 'interface', + 'priority', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'group', 'interface_type', 'interface_id', 'priority') diff --git a/netbox/ipam/api/serializers_/ip.py b/netbox/ipam/api/serializers_/ip.py index 7c53d68caf..535ffcec1b 100644 --- a/netbox/ipam/api/serializers_/ip.py +++ b/netbox/ipam/api/serializers_/ip.py @@ -11,11 +11,11 @@ from tenancy.api.serializers_.tenants import TenantSerializer from utilities.api import get_serializer_for_model from .asns import RIRSerializer +from .nested import NestedIPAddressSerializer from .roles import RoleSerializer from .vlans import VLANSerializer from .vrfs import VRFSerializer from ..field_serializers import IPAddressField, IPNetworkField -from ..nested_serializers import * __all__ = ( 'AggregateSerializer', @@ -29,7 +29,6 @@ class AggregateSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:aggregate-detail') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) rir = RIRSerializer(nested=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -38,14 +37,13 @@ class AggregateSerializer(NetBoxModelSerializer): class Meta: model = Aggregate fields = [ - 'id', 'url', 'display', 'family', 'prefix', 'rir', 'tenant', 'date_added', 'description', 'comments', - 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'family', 'prefix', 'rir', 'tenant', 'date_added', 'description', + 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'family', 'prefix', 'description') class PrefixSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:prefix-detail') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) site = SiteSerializer(nested=True, required=False, allow_null=True) vrf = VRFSerializer(nested=True, required=False, allow_null=True) @@ -60,9 +58,9 @@ class PrefixSerializer(NetBoxModelSerializer): class Meta: model = Prefix fields = [ - 'id', 'url', 'display', 'family', 'prefix', 'site', 'vrf', 'tenant', 'vlan', 'status', 'role', 'is_pool', - 'mark_utilized', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'children', - '_depth', + 'id', 'url', 'display_url', 'display', 'family', 'prefix', 'site', 'vrf', 'tenant', 'vlan', 'status', + 'role', 'is_pool', 'mark_utilized', 'description', 'comments', 'tags', 'custom_fields', + 'created', 'last_updated', 'children', '_depth', ] brief_fields = ('id', 'url', 'display', 'family', 'prefix', 'description', '_depth') @@ -119,7 +117,6 @@ def to_representation(self, instance): # class IPRangeSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:iprange-detail') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) start_address = IPAddressField() end_address = IPAddressField() @@ -131,8 +128,8 @@ class IPRangeSerializer(NetBoxModelSerializer): class Meta: model = IPRange fields = [ - 'id', 'url', 'display', 'family', 'start_address', 'end_address', 'size', 'vrf', 'tenant', 'status', 'role', - 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'family', 'start_address', 'end_address', 'size', 'vrf', 'tenant', + 'status', 'role', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'mark_utilized', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'family', 'start_address', 'end_address', 'description') @@ -143,7 +140,6 @@ class Meta: # class IPAddressSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail') family = ChoiceField(choices=IPAddressFamilyChoices, read_only=True) address = IPAddressField() vrf = VRFSerializer(nested=True, required=False, allow_null=True) @@ -162,9 +158,9 @@ class IPAddressSerializer(NetBoxModelSerializer): class Meta: model = IPAddress fields = [ - 'id', 'url', 'display', 'family', 'address', 'vrf', 'tenant', 'status', 'role', 'assigned_object_type', - 'assigned_object_id', 'assigned_object', 'nat_inside', 'nat_outside', 'dns_name', 'description', 'comments', - 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'family', 'address', 'vrf', 'tenant', 'status', 'role', + 'assigned_object_type', 'assigned_object_id', 'assigned_object', 'nat_inside', 'nat_outside', + 'dns_name', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'family', 'address', 'description') diff --git a/netbox/ipam/api/serializers_/nested.py b/netbox/ipam/api/serializers_/nested.py new file mode 100644 index 0000000000..5297565bb9 --- /dev/null +++ b/netbox/ipam/api/serializers_/nested.py @@ -0,0 +1,18 @@ +from rest_framework import serializers + +from ipam import models +from netbox.api.serializers import WritableNestedSerializer +from ..field_serializers import IPAddressField + +__all__ = ( + 'NestedIPAddressSerializer', +) + + +class NestedIPAddressSerializer(WritableNestedSerializer): + family = serializers.IntegerField(read_only=True) + address = IPAddressField() + + class Meta: + model = models.IPAddress + fields = ['id', 'url', 'display_url', 'display', 'family', 'address'] diff --git a/netbox/ipam/api/serializers_/roles.py b/netbox/ipam/api/serializers_/roles.py index 8208b8074e..9a97a8570e 100644 --- a/netbox/ipam/api/serializers_/roles.py +++ b/netbox/ipam/api/serializers_/roles.py @@ -10,7 +10,6 @@ class RoleSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:role-detail') # Related object counts prefix_count = RelatedObjectCountField('prefixes') @@ -19,7 +18,7 @@ class RoleSerializer(NetBoxModelSerializer): class Meta: model = Role fields = [ - 'id', 'url', 'display', 'name', 'slug', 'weight', 'description', 'tags', 'custom_fields', 'created', - 'last_updated', 'prefix_count', 'vlan_count', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'weight', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'prefix_count', 'vlan_count', ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'prefix_count', 'vlan_count') diff --git a/netbox/ipam/api/serializers_/services.py b/netbox/ipam/api/serializers_/services.py index 407739667d..e0b2014f62 100644 --- a/netbox/ipam/api/serializers_/services.py +++ b/netbox/ipam/api/serializers_/services.py @@ -15,20 +15,18 @@ class ServiceTemplateSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:servicetemplate-detail') protocol = ChoiceField(choices=ServiceProtocolChoices, required=False) class Meta: model = ServiceTemplate fields = [ - 'id', 'url', 'display', 'name', 'protocol', 'ports', 'description', 'comments', 'tags', 'custom_fields', - 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'protocol', 'ports', 'description', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'protocol', 'ports', 'description') class ServiceSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:service-detail') device = DeviceSerializer(nested=True, required=False, allow_null=True) virtual_machine = VirtualMachineSerializer(nested=True, required=False, allow_null=True) protocol = ChoiceField(choices=ServiceProtocolChoices, required=False) @@ -43,7 +41,7 @@ class ServiceSerializer(NetBoxModelSerializer): class Meta: model = Service fields = [ - 'id', 'url', 'display', 'device', 'virtual_machine', 'name', 'protocol', 'ports', 'ipaddresses', - 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'device', 'virtual_machine', 'name', 'protocol', 'ports', + 'ipaddresses', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'protocol', 'ports', 'description') diff --git a/netbox/ipam/api/serializers_/vlans.py b/netbox/ipam/api/serializers_/vlans.py index f35d294cf3..608fcf0b47 100644 --- a/netbox/ipam/api/serializers_/vlans.py +++ b/netbox/ipam/api/serializers_/vlans.py @@ -6,7 +6,7 @@ from ipam.choices import * from ipam.constants import VLANGROUP_SCOPE_TYPES from ipam.models import VLAN, VLANGroup -from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField +from netbox.api.fields import ChoiceField, ContentTypeField, IntegerRangeSerializer, RelatedObjectCountField from netbox.api.serializers import NetBoxModelSerializer from tenancy.api.serializers_.tenants import TenantSerializer from utilities.api import get_serializer_for_model @@ -22,7 +22,6 @@ class VLANGroupSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlangroup-detail') scope_type = ContentTypeField( queryset=ContentType.objects.filter( model__in=VLANGROUP_SCOPE_TYPES @@ -33,6 +32,7 @@ class VLANGroupSerializer(NetBoxModelSerializer): ) scope_id = serializers.IntegerField(allow_null=True, required=False, default=None) scope = serializers.SerializerMethodField(read_only=True) + vid_ranges = IntegerRangeSerializer(many=True, required=False) utilization = serializers.CharField(read_only=True) # Related object counts @@ -41,7 +41,7 @@ class VLANGroupSerializer(NetBoxModelSerializer): class Meta: model = VLANGroup fields = [ - 'id', 'url', 'display', 'name', 'slug', 'scope_type', 'scope_id', 'scope', 'min_vid', 'max_vid', + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'scope_type', 'scope_id', 'scope', 'vid_ranges', 'description', 'tags', 'custom_fields', 'created', 'last_updated', 'vlan_count', 'utilization' ] brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'vlan_count') @@ -57,7 +57,6 @@ def get_scope(self, obj): class VLANSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vlan-detail') site = SiteSerializer(nested=True, required=False, allow_null=True) group = VLANGroupSerializer(nested=True, required=False, allow_null=True, default=None) tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -71,8 +70,9 @@ class VLANSerializer(NetBoxModelSerializer): class Meta: model = VLAN fields = [ - 'id', 'url', 'display', 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', - 'comments', 'l2vpn_termination', 'tags', 'custom_fields', 'created', 'last_updated', 'prefix_count', + 'id', 'url', 'display_url', 'display', 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', + 'description', 'comments', 'l2vpn_termination', 'tags', 'custom_fields', 'created', 'last_updated', + 'prefix_count', ] brief_fields = ('id', 'url', 'display', 'vid', 'name', 'description') diff --git a/netbox/ipam/api/serializers_/vrfs.py b/netbox/ipam/api/serializers_/vrfs.py index fdb5f98abf..ad54dc0955 100644 --- a/netbox/ipam/api/serializers_/vrfs.py +++ b/netbox/ipam/api/serializers_/vrfs.py @@ -12,20 +12,18 @@ class RouteTargetSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:routetarget-detail') tenant = TenantSerializer(nested=True, required=False, allow_null=True) class Meta: model = RouteTarget fields = [ - 'id', 'url', 'display', 'name', 'tenant', 'description', 'comments', 'tags', 'custom_fields', 'created', - 'last_updated', + 'id', 'url', 'display_url', 'display', 'name', 'tenant', 'description', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name', 'description') class VRFSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:vrf-detail') tenant = TenantSerializer(nested=True, required=False, allow_null=True) import_targets = SerializedPKRelatedField( queryset=RouteTarget.objects.all(), @@ -47,7 +45,7 @@ class VRFSerializer(NetBoxModelSerializer): class Meta: model = VRF fields = [ - 'id', 'url', 'display', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'comments', + 'id', 'url', 'display_url', 'display', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'comments', 'import_targets', 'export_targets', 'tags', 'custom_fields', 'created', 'last_updated', 'ipaddress_count', 'prefix_count', ] diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index d58f5bfc9c..30634850a2 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -911,14 +911,13 @@ class VLANGroupFilterSet(OrganizationalModelFilterSet): cluster = django_filters.NumberFilter( method='filter_scope' ) - - # TODO: Remove in v4.1 - sitegroup = site_group - clustergroup = cluster_group + contains_vid = django_filters.NumberFilter( + method='filter_contains_vid' + ) class Meta: model = VLANGroup - fields = ('id', 'name', 'slug', 'min_vid', 'max_vid', 'description', 'scope_id') + fields = ('id', 'name', 'slug', 'description', 'scope_id') def search(self, queryset, name, value): if not value.strip(): @@ -936,6 +935,21 @@ def filter_scope(self, queryset, name, value): scope_id=value ) + def filter_contains_vid(self, queryset, name, value): + """ + Return all VLANGroups which contain the given VLAN ID. + """ + table_name = VLANGroup._meta.db_table + # TODO: See if this can be optimized without compromising queryset integrity + # Expand VLAN ID ranges to query by integer + groups = VLANGroup.objects.raw( + f'SELECT id FROM {table_name}, unnest(vid_ranges) vid_range WHERE %s <@ vid_range', + params=(value,) + ) + return queryset.filter( + pk__in=[g.id for g in groups] + ) + class VLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet): region_id = TreeNodeMultipleChoiceFilter( @@ -1106,10 +1120,6 @@ class ServiceFilterSet(NetBoxModelFilterSet): lookup_expr='contains' ) - # TODO: Remove in v4.1 - ipaddress = ip_address - ipaddress_id = ip_address_id - class Meta: model = Service fields = ('id', 'name', 'protocol', 'description') diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index 5f3353ea1f..f4a7eabb7d 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -12,6 +12,7 @@ from utilities.forms import add_blank_choice from utilities.forms.fields import ( CommentField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, NumericArrayField, + NumericRangeArrayField, ) from utilities.forms.rendering import FieldSet from utilities.forms.widgets import BulkEditNullBooleanSelect @@ -422,18 +423,6 @@ class FHRPGroupBulkEditForm(NetBoxModelBulkEditForm): class VLANGroupBulkEditForm(NetBoxModelBulkEditForm): - min_vid = forms.IntegerField( - min_value=VLAN_VID_MIN, - max_value=VLAN_VID_MAX, - required=False, - label=_('Minimum child VLAN VID') - ) - max_vid = forms.IntegerField( - min_value=VLAN_VID_MIN, - max_value=VLAN_VID_MAX, - required=False, - label=_('Maximum child VLAN VID') - ) description = forms.CharField( label=_('Description'), max_length=200, @@ -497,10 +486,14 @@ class VLANGroupBulkEditForm(NetBoxModelBulkEditForm): 'group_id': '$clustergroup', } ) + vid_ranges = NumericRangeArrayField( + label=_('VLAN ID ranges'), + required=False + ) model = VLANGroup fieldsets = ( - FieldSet('site', 'min_vid', 'max_vid', 'description'), + FieldSet('site', 'vid_ranges', 'description'), FieldSet( 'scope_type', 'region', 'sitegroup', 'site', 'location', 'rack', 'clustergroup', 'cluster', name=_('Scope') ), diff --git a/netbox/ipam/forms/bulk_import.py b/netbox/ipam/forms/bulk_import.py index bfff1f4f4f..dea250c792 100644 --- a/netbox/ipam/forms/bulk_import.py +++ b/netbox/ipam/forms/bulk_import.py @@ -9,7 +9,8 @@ from netbox.forms import NetBoxModelImportForm from tenancy.models import Tenant from utilities.forms.fields import ( - CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVModelMultipleChoiceField, SlugField + CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVModelMultipleChoiceField, SlugField, + NumericRangeArrayField, ) from virtualization.models import VirtualMachine, VMInterface @@ -411,22 +412,13 @@ class VLANGroupImportForm(NetBoxModelImportForm): required=False, label=_('Scope type (app & model)') ) - min_vid = forms.IntegerField( - min_value=VLAN_VID_MIN, - max_value=VLAN_VID_MAX, - required=False, - label=_('Minimum child VLAN VID (default: {minimum})').format(minimum=VLAN_VID_MIN) - ) - max_vid = forms.IntegerField( - min_value=VLAN_VID_MIN, - max_value=VLAN_VID_MAX, - required=False, - label=_('Maximum child VLAN VID (default: {maximum})').format(maximum=VLAN_VID_MIN) + vid_ranges = NumericRangeArrayField( + required=False ) class Meta: model = VLANGroup - fields = ('name', 'slug', 'scope_type', 'scope_id', 'min_vid', 'max_vid', 'description', 'tags') + fields = ('name', 'slug', 'scope_type', 'scope_id', 'vid_ranges', 'description', 'tags') labels = { 'scope_id': 'Scope ID', } diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index 80fb042265..a326943217 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -413,7 +413,7 @@ class VLANGroupFilterForm(NetBoxModelFilterSetForm): FieldSet('q', 'filter_id', 'tag'), FieldSet('region', 'sitegroup', 'site', 'location', 'rack', name=_('Location')), FieldSet('cluster_group', 'cluster', name=_('Cluster')), - FieldSet('min_vid', 'max_vid', name=_('VLAN ID')), + FieldSet('contains_vid', name=_('VLANs')), ) model = VLANGroup region = DynamicModelMultipleChoiceField( @@ -441,18 +441,6 @@ class VLANGroupFilterForm(NetBoxModelFilterSetForm): required=False, label=_('Rack') ) - min_vid = forms.IntegerField( - required=False, - min_value=VLAN_VID_MIN, - max_value=VLAN_VID_MAX, - label=_('Minimum VID') - ) - max_vid = forms.IntegerField( - required=False, - min_value=VLAN_VID_MIN, - max_value=VLAN_VID_MAX, - label=_('Maximum VID') - ) cluster = DynamicModelMultipleChoiceField( queryset=Cluster.objects.all(), required=False, @@ -463,6 +451,11 @@ class VLANGroupFilterForm(NetBoxModelFilterSetForm): required=False, label=_('Cluster group') ) + contains_vid = forms.IntegerField( + min_value=0, + required=False, + label=_('Contains VLAN ID') + ) tag = TagFilterField(model) diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index f5e3bca303..f98f8b24ff 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -14,7 +14,7 @@ from utilities.forms import add_blank_choice from utilities.forms.fields import ( CommentField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, NumericArrayField, - SlugField, + NumericRangeArrayField, SlugField ) from utilities.forms.rendering import FieldSet, InlineFields, ObjectAttribute, TabbedGroups from utilities.forms.utils import get_field_value @@ -565,6 +565,9 @@ def clean_group(self): class VLANGroupForm(NetBoxModelForm): slug = SlugField() + vid_ranges = NumericRangeArrayField( + label=_('VLAN IDs') + ) scope_type = ContentTypeChoiceField( queryset=ContentType.objects.filter(model__in=VLANGROUP_SCOPE_TYPES), widget=HTMXSelect(), @@ -581,14 +584,14 @@ class VLANGroupForm(NetBoxModelForm): fieldsets = ( FieldSet('name', 'slug', 'description', 'tags', name=_('VLAN Group')), - FieldSet('min_vid', 'max_vid', name=_('Child VLANs')), + FieldSet('vid_ranges', name=_('Child VLANs')), FieldSet('scope_type', 'scope', name=_('Scope')), ) class Meta: model = VLANGroup fields = [ - 'name', 'slug', 'description', 'min_vid', 'max_vid', 'scope_type', 'scope', 'tags', + 'name', 'slug', 'description', 'vid_ranges', 'scope_type', 'scope', 'tags', ] def __init__(self, *args, **kwargs): diff --git a/netbox/ipam/graphql/types.py b/netbox/ipam/graphql/types.py index 36e09eaac2..46d45816e7 100644 --- a/netbox/ipam/graphql/types.py +++ b/netbox/ipam/graphql/types.py @@ -251,6 +251,7 @@ class VLANType(NetBoxObjectType): class VLANGroupType(OrganizationalObjectType): vlans: List[VLANType] + vid_ranges: List[str] @strawberry_django.field def scope(self) -> Annotated[Union[ diff --git a/netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py b/netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py new file mode 100644 index 0000000000..b01941401f --- /dev/null +++ b/netbox/ipam/migrations/0070_vlangroup_vlan_id_ranges.py @@ -0,0 +1,55 @@ +import django.contrib.postgres.fields +import django.contrib.postgres.fields.ranges +from django.db import migrations, models +from django.db.backends.postgresql.psycopg_any import NumericRange + +import ipam.models.vlans + + +def set_vid_ranges(apps, schema_editor): + """ + Convert the min_vid & max_vid fields to a range in the new vid_ranges ArrayField. + """ + VLANGroup = apps.get_model('ipam', 'VLANGroup') + for group in VLANGroup.objects.all(): + group.vid_ranges = [ + NumericRange(group.min_vid, group.max_vid, bounds='[]') + ] + group._total_vlan_ids = group.max_vid - group.min_vid + 1 + group.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0069_gfk_indexes'), + ] + + operations = [ + migrations.AddField( + model_name='vlangroup', + name='vid_ranges', + field=django.contrib.postgres.fields.ArrayField( + base_field=django.contrib.postgres.fields.ranges.IntegerRangeField(), + default=ipam.models.vlans.default_vid_ranges, + size=None + ), + ), + migrations.AddField( + model_name='vlangroup', + name='_total_vlan_ids', + field=models.PositiveBigIntegerField(default=4094), + ), + migrations.RunPython( + code=set_vid_ranges, + reverse_code=migrations.RunPython.noop + ), + migrations.RemoveField( + model_name='vlangroup', + name='max_vid', + ), + migrations.RemoveField( + model_name='vlangroup', + name='min_vid', + ), + ] diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index 7434bd0b44..ca6b27d079 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -1,7 +1,9 @@ from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation +from django.contrib.postgres.fields import ArrayField, IntegerRangeField from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models +from django.db.backends.postgresql.psycopg_any import NumericRange from django.urls import reverse from django.utils.translation import gettext_lazy as _ @@ -10,6 +12,7 @@ from ipam.constants import * from ipam.querysets import VLANQuerySet, VLANGroupQuerySet from netbox.models import OrganizationalModel, PrimaryModel +from utilities.data import check_ranges_overlap, ranges_to_string from virtualization.models import VMInterface __all__ = ( @@ -18,9 +21,16 @@ ) +def default_vid_ranges(): + return [ + NumericRange(VLAN_VID_MIN, VLAN_VID_MAX, bounds='[]') + ] + + class VLANGroup(OrganizationalModel): """ - A VLAN group is an arbitrary collection of VLANs within which VLAN IDs and names must be unique. + A VLAN group is an arbitrary collection of VLANs within which VLAN IDs and names must be unique. Each group must + define one or more ranges of valid VLAN IDs, and may be assigned a specific scope. """ name = models.CharField( verbose_name=_('name'), @@ -45,23 +55,13 @@ class VLANGroup(OrganizationalModel): ct_field='scope_type', fk_field='scope_id' ) - min_vid = models.PositiveSmallIntegerField( - verbose_name=_('minimum VLAN ID'), - default=VLAN_VID_MIN, - validators=( - MinValueValidator(VLAN_VID_MIN), - MaxValueValidator(VLAN_VID_MAX) - ), - help_text=_('Lowest permissible ID of a child VLAN') + vid_ranges = ArrayField( + IntegerRangeField(), + verbose_name=_('VLAN ID ranges'), + default=default_vid_ranges ) - max_vid = models.PositiveSmallIntegerField( - verbose_name=_('maximum VLAN ID'), - default=VLAN_VID_MAX, - validators=( - MinValueValidator(VLAN_VID_MIN), - MaxValueValidator(VLAN_VID_MAX) - ), - help_text=_('Highest permissible ID of a child VLAN') + _total_vlan_ids = models.PositiveBigIntegerField( + default=VLAN_VID_MAX - VLAN_VID_MIN + 1 ) objects = VLANGroupQuerySet.as_manager() @@ -96,17 +96,33 @@ def clean(self): if self.scope_id and not self.scope_type: raise ValidationError(_("Cannot set scope_id without scope_type.")) - # Validate min/max child VID limits - if self.max_vid < self.min_vid: - raise ValidationError({ - 'max_vid': _("Maximum child VID must be greater than or equal to minimum child VID") - }) + # Validate VID ranges + if self.vid_ranges and check_ranges_overlap(self.vid_ranges): + raise ValidationError({'vid_ranges': _("Ranges cannot overlap.")}) + for vid_range in self.vid_ranges: + if vid_range.lower >= vid_range.upper: + raise ValidationError({ + 'vid_ranges': _( + "Maximum child VID must be greater than or equal to minimum child VID ({value})" + ).format(value=vid_range) + }) + + def save(self, *args, **kwargs): + self._total_vlan_ids = 0 + for vid_range in self.vid_ranges: + self._total_vlan_ids += vid_range.upper - vid_range.lower + 1 + + super().save(*args, **kwargs) def get_available_vids(self): """ Return all available VLANs within this group. """ - available_vlans = {vid for vid in range(self.min_vid, self.max_vid + 1)} + available_vlans = set() + for vlan_range in self.vid_ranges: + available_vlans = available_vlans.union({ + vid for vid in range(vlan_range.lower, vlan_range.upper) + }) available_vlans -= set(VLAN.objects.filter(group=self).values_list('vid', flat=True)) return sorted(available_vlans) @@ -126,6 +142,10 @@ def get_child_vlans(self): """ return VLAN.objects.filter(group=self).order_by('vid') + @property + def vid_ranges_list(self): + return ranges_to_string(self.vid_ranges) + class VLAN(PrimaryModel): """ @@ -231,13 +251,14 @@ def clean(self): ).format(group=self.group, scope=self.group.scope, site=self.site) ) - # Validate group min/max VIDs - if self.group and not self.group.min_vid <= self.vid <= self.group.max_vid: - raise ValidationError({ - 'vid': _( - "VID must be between {minimum} and {maximum} for VLANs in group {group}" - ).format(minimum=self.group.min_vid, maximum=self.group.max_vid, group=self.group) - }) + # Check that the VLAN ID is permitted in the assigned group (if any) + if self.group: + if not any([self.vid in r for r in self.group.vid_ranges]): + raise ValidationError({ + 'vid': _( + "VID must be in ranges {ranges} for VLANs in group {group}" + ).format(ranges=ranges_to_string(self.group.vid_ranges), group=self.group) + }) def get_status_color(self): return VLANStatusChoices.colors.get(self.status) diff --git a/netbox/ipam/querysets.py b/netbox/ipam/querysets.py index a3f37fe3ca..771e9b3b9d 100644 --- a/netbox/ipam/querysets.py +++ b/netbox/ipam/querysets.py @@ -9,6 +9,7 @@ __all__ = ( 'ASNRangeQuerySet', 'PrefixQuerySet', + 'VLANGroupQuerySet', 'VLANQuerySet', ) @@ -63,7 +64,7 @@ def annotate_utilization(self): return self.annotate( vlan_count=count_related(VLAN, 'group'), - utilization=Round(F('vlan_count') / (F('max_vid') - F('min_vid') + 1.0) * 100, 2) + utilization=Round(F('vlan_count') * 100.0 / F('_total_vlan_ids'), 2) ) diff --git a/netbox/ipam/search.py b/netbox/ipam/search.py index a1cddbb1a8..59b741b8fd 100644 --- a/netbox/ipam/search.py +++ b/netbox/ipam/search.py @@ -154,9 +154,8 @@ class VLANGroupIndex(SearchIndex): ('name', 100), ('slug', 110), ('description', 500), - ('max_vid', 2000), ) - display_attrs = ('scope_type', 'min_vid', 'max_vid', 'description') + display_attrs = ('scope_type', 'description') @register_search diff --git a/netbox/ipam/tables/vlans.py b/netbox/ipam/tables/vlans.py index 4cc13e3677..5387ce24ce 100644 --- a/netbox/ipam/tables/vlans.py +++ b/netbox/ipam/tables/vlans.py @@ -72,6 +72,10 @@ class VLANGroupTable(NetBoxTable): linkify=True, orderable=False ) + vid_ranges_list = tables.Column( + verbose_name=_('VID Ranges'), + orderable=False + ) vlan_count = columns.LinkedCountColumn( viewname='ipam:vlan_list', url_params={'group_id': 'pk'}, @@ -91,7 +95,7 @@ class VLANGroupTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = VLANGroup fields = ( - 'pk', 'id', 'name', 'scope_type', 'scope', 'min_vid', 'max_vid', 'vlan_count', 'slug', 'description', + 'pk', 'id', 'name', 'scope_type', 'scope', 'vid_ranges_list', 'vlan_count', 'slug', 'description', 'tags', 'created', 'last_updated', 'actions', 'utilization', ) default_columns = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'utilization', 'description') diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index aed66e9795..59335cbbe5 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -8,6 +8,7 @@ from ipam.choices import * from ipam.models import * from tenancy.models import Tenant +from utilities.data import string_to_ranges from utilities.testing import APITestCase, APIViewTestCases, create_test_device, disable_warnings @@ -883,8 +884,7 @@ def test_list_available_vlans(self): vlangroup = VLANGroup.objects.create( name='VLAN Group X', slug='vlan-group-x', - min_vid=MIN_VID, - max_vid=MAX_VID + vid_ranges=string_to_ranges(f"{MIN_VID}-{MAX_VID}") ) # Create a set of VLANs within the group diff --git a/netbox/ipam/tests/test_filtersets.py b/netbox/ipam/tests/test_filtersets.py index 3a46423a54..e149c0a8d7 100644 --- a/netbox/ipam/tests/test_filtersets.py +++ b/netbox/ipam/tests/test_filtersets.py @@ -1,4 +1,5 @@ from django.contrib.contenttypes.models import ContentType +from django.db.backends.postgresql.psycopg_any import NumericRange from django.test import TestCase from netaddr import IPNetwork @@ -1465,6 +1466,7 @@ def test_virtual_machine(self): class VLANGroupTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = VLANGroup.objects.all() filterset = VLANGroupFilterSet + ignore_fields = ('vid_ranges',) @classmethod def setUpTestData(cls): @@ -1494,14 +1496,55 @@ def setUpTestData(cls): cluster.save() vlan_groups = ( - VLANGroup(name='VLAN Group 1', slug='vlan-group-1', scope=region, description='foobar1'), - VLANGroup(name='VLAN Group 2', slug='vlan-group-2', scope=sitegroup, description='foobar2'), - VLANGroup(name='VLAN Group 3', slug='vlan-group-3', scope=site, description='foobar3'), - VLANGroup(name='VLAN Group 4', slug='vlan-group-4', scope=location), - VLANGroup(name='VLAN Group 5', slug='vlan-group-5', scope=rack), - VLANGroup(name='VLAN Group 6', slug='vlan-group-6', scope=clustergroup), - VLANGroup(name='VLAN Group 7', slug='vlan-group-7', scope=cluster), - VLANGroup(name='VLAN Group 8', slug='vlan-group-8'), + VLANGroup( + name='VLAN Group 1', + slug='vlan-group-1', + vid_ranges=[NumericRange(1, 11), NumericRange(100, 200)], + scope=region, + description='foobar1' + ), + VLANGroup( + name='VLAN Group 2', + slug='vlan-group-2', + vid_ranges=[NumericRange(1, 11), NumericRange(200, 300)], + scope=sitegroup, + description='foobar2' + ), + VLANGroup( + name='VLAN Group 3', + slug='vlan-group-3', + vid_ranges=[NumericRange(1, 11), NumericRange(300, 400)], + scope=site, + description='foobar3' + ), + VLANGroup( + name='VLAN Group 4', + slug='vlan-group-4', + vid_ranges=[NumericRange(1, 11), NumericRange(400, 500)], + scope=location + ), + VLANGroup( + name='VLAN Group 5', + slug='vlan-group-5', + vid_ranges=[NumericRange(1, 11), NumericRange(500, 600)], + scope=rack + ), + VLANGroup( + name='VLAN Group 6', + slug='vlan-group-6', + vid_ranges=[NumericRange(1, 11), NumericRange(600, 700)], + scope=clustergroup + ), + VLANGroup( + name='VLAN Group 7', + slug='vlan-group-7', + vid_ranges=[NumericRange(1, 11), NumericRange(700, 800)], + scope=cluster + ), + VLANGroup( + name='VLAN Group 8', + slug='vlan-group-8' + ), ) VLANGroup.objects.bulk_create(vlan_groups) @@ -1521,12 +1564,18 @@ def test_description(self): params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_contains_vid(self): + params = {'contains_vid': 123} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'contains_vid': 1} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8) + def test_region(self): params = {'region': Region.objects.first().pk} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - def test_sitegroup(self): - params = {'sitegroup': SiteGroup.objects.first().pk} + def test_site_group(self): + params = {'site_group': SiteGroup.objects.first().pk} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) def test_site(self): @@ -1541,8 +1590,8 @@ def test_rack(self): params = {'rack': Rack.objects.first().pk} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - def test_clustergroup(self): - params = {'clustergroup': ClusterGroup.objects.first().pk} + def test_cluster_group(self): + params = {'cluster_group': ClusterGroup.objects.first().pk} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) def test_cluster(self): diff --git a/netbox/ipam/tests/test_models.py b/netbox/ipam/tests/test_models.py index d0f42e8a6b..39eb33a4fc 100644 --- a/netbox/ipam/tests/test_models.py +++ b/netbox/ipam/tests/test_models.py @@ -1,6 +1,7 @@ from django.core.exceptions import ValidationError from django.test import TestCase, override_settings from netaddr import IPNetwork, IPSet +from utilities.data import string_to_ranges from ipam.choices import * from ipam.models import * @@ -509,8 +510,7 @@ def setUpTestData(cls): vlangroup = VLANGroup.objects.create( name='VLAN Group 1', slug='vlan-group-1', - min_vid=100, - max_vid=199 + vid_ranges=string_to_ranges('100-199'), ) VLAN.objects.bulk_create(( VLAN(name='VLAN 100', vid=100, group=vlangroup), @@ -533,3 +533,13 @@ def test_get_next_available_vid(self): VLAN.objects.create(name='VLAN 104', vid=104, group=vlangroup) self.assertEqual(vlangroup.get_next_available_vid(), 105) + + def test_vid_validation(self): + vlangroup = VLANGroup.objects.first() + + vlan = VLAN(vid=1, name='VLAN 1', group=vlangroup) + with self.assertRaises(ValidationError): + vlan.full_clean() + + vlan = VLAN(vid=109, name='VLAN 109', group=vlangroup) + vlan.full_clean() diff --git a/netbox/ipam/tests/test_views.py b/netbox/ipam/tests/test_views.py index bc42341ba3..2acb80ac12 100644 --- a/netbox/ipam/tests/test_views.py +++ b/netbox/ipam/tests/test_views.py @@ -764,9 +764,8 @@ def setUpTestData(cls): cls.form_data = { 'name': 'VLAN Group X', 'slug': 'vlan-group-x', - 'min_vid': 1, - 'max_vid': 4094, 'description': 'A new VLAN group', + 'vid_ranges': '100-199,300-399', 'tags': [t.pk for t in tags], } diff --git a/netbox/ipam/utils.py b/netbox/ipam/utils.py index 21b90fbcd4..3297abd8fb 100644 --- a/netbox/ipam/utils.py +++ b/netbox/ipam/utils.py @@ -90,44 +90,58 @@ def add_available_ipaddresses(prefix, ipaddress_list, is_pool=False): return output -def add_available_vlans(vlans, vlan_group=None): +def available_vlans_from_range(vlans, vlan_group, vid_range): """ Create fake records for all gaps between used VLANs """ - min_vid = vlan_group.min_vid if vlan_group else VLAN_VID_MIN - max_vid = vlan_group.max_vid if vlan_group else VLAN_VID_MAX + min_vid = int(vid_range.lower) if vid_range else VLAN_VID_MIN + max_vid = int(vid_range.upper) if vid_range else VLAN_VID_MAX if not vlans: return [{ 'vid': min_vid, 'vlan_group': vlan_group, - 'available': max_vid - min_vid + 1 + 'available': max_vid - min_vid }] - prev_vid = max_vid + prev_vid = min_vid - 1 new_vlans = [] for vlan in vlans: + + # Ignore VIDs outside the range + if not min_vid <= vlan.vid < max_vid: + continue + + # Annotate any available VIDs between the previous (or minimum) VID + # and the current VID if vlan.vid - prev_vid > 1: new_vlans.append({ 'vid': prev_vid + 1, 'vlan_group': vlan_group, 'available': vlan.vid - prev_vid - 1, }) + prev_vid = vlan.vid - if vlans[0].vid > min_vid: - new_vlans.append({ - 'vid': min_vid, - 'vlan_group': vlan_group, - 'available': vlans[0].vid - min_vid, - }) + # Annotate any remaining available VLANs if prev_vid < max_vid: new_vlans.append({ 'vid': prev_vid + 1, 'vlan_group': vlan_group, - 'available': max_vid - prev_vid, + 'available': max_vid - prev_vid - 1, }) + return new_vlans + + +def add_available_vlans(vlans, vlan_group): + """ + Create fake records for all gaps between used VLANs + """ + new_vlans = [] + for vid_range in vlan_group.vid_ranges: + new_vlans.extend(available_vlans_from_range(vlans, vlan_group, vid_range)) + vlans = list(vlans) + new_vlans vlans.sort(key=lambda v: v.vid if type(v) is VLAN else v['vid']) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index e0087f5d10..67d56f15e7 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -915,7 +915,7 @@ class IPAddressContactsView(ObjectContactsView): # class VLANGroupListView(generic.ObjectListView): - queryset = VLANGroup.objects.annotate_utilization().prefetch_related('tags') + queryset = VLANGroup.objects.annotate_utilization() filterset = filtersets.VLANGroupFilterSet filterset_form = forms.VLANGroupFilterForm table = tables.VLANGroupTable @@ -923,7 +923,7 @@ class VLANGroupListView(generic.ObjectListView): @register_model_view(VLANGroup) class VLANGroupView(GetRelatedModelsMixin, generic.ObjectView): - queryset = VLANGroup.objects.annotate_utilization().prefetch_related('tags') + queryset = VLANGroup.objects.annotate_utilization() def get_extra_context(self, request, instance): return { diff --git a/netbox/netbox/api/fields.py b/netbox/netbox/api/fields.py index 08ffd0bc45..e7d1ef5745 100644 --- a/netbox/netbox/api/fields.py +++ b/netbox/netbox/api/fields.py @@ -1,4 +1,5 @@ from django.core.exceptions import ObjectDoesNotExist +from django.db.backends.postgresql.psycopg_any import NumericRange from django.utils.translation import gettext as _ from drf_spectacular.types import OpenApiTypes from drf_spectacular.utils import extend_schema_field @@ -11,6 +12,7 @@ 'ChoiceField', 'ContentTypeField', 'IPNetworkSerializer', + 'IntegerRangeSerializer', 'RelatedObjectCountField', 'SerializedPKRelatedField', ) @@ -154,3 +156,19 @@ def __init__(self, relation, **kwargs): self.relation = relation super().__init__(**kwargs) + + +class IntegerRangeSerializer(serializers.Serializer): + """ + Represents a range of integers. + """ + def to_internal_value(self, data): + if not isinstance(data, (list, tuple)) or len(data) != 2: + raise ValidationError(_("Ranges must be specified in the form (lower, upper).")) + if type(data[0]) is not int or type(data[1]) is not int: + raise ValidationError(_("Range boundaries must be defined as integers.")) + + return NumericRange(data[0], data[1], bounds='[]') + + def to_representation(self, instance): + return instance.lower, instance.upper - 1 diff --git a/netbox/netbox/api/serializers/base.py b/netbox/netbox/api/serializers/base.py index 58ef452197..8115fe020a 100644 --- a/netbox/netbox/api/serializers/base.py +++ b/netbox/netbox/api/serializers/base.py @@ -6,6 +6,7 @@ from drf_spectacular.types import OpenApiTypes from utilities.api import get_related_object_by_attrs +from .fields import NetBoxAPIHyperlinkedIdentityField, NetBoxURLHyperlinkedIdentityField __all__ = ( 'BaseModelSerializer', @@ -14,6 +15,8 @@ class BaseModelSerializer(serializers.ModelSerializer): + url = NetBoxAPIHyperlinkedIdentityField() + display_url = NetBoxURLHyperlinkedIdentityField() display = serializers.SerializerMethodField(read_only=True) def __init__(self, *args, nested=False, fields=None, **kwargs): diff --git a/netbox/netbox/api/serializers/fields.py b/netbox/netbox/api/serializers/fields.py new file mode 100644 index 0000000000..4fee360437 --- /dev/null +++ b/netbox/netbox/api/serializers/fields.py @@ -0,0 +1,53 @@ +from rest_framework import serializers + +__all__ = ( + 'NetBoxAPIHyperlinkedIdentityField', + 'NetBoxURLHyperlinkedIdentityField', +) + + +class BaseNetBoxHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): + """ + Overrides HyperlinkedIdentityField to use standard NetBox view naming + instead of passing in the view_name. Initialize with a blank view_name + and it will get replaced in the get_url call. Derived classes must + define a get_view_name. + """ + def __init__(self, *args, **kwargs): + super().__init__(view_name="", *args, **kwargs) + + def get_url(self, obj, view_name, request, format): + """ + Given an object, return the URL that hyperlinks to the object. + + May raise a `NoReverseMatch` if the `view_name` and `lookup_field` + attributes are not configured to correctly match the URL conf. + """ + # Unsaved objects will not yet have a valid URL. + if hasattr(obj, 'pk') and obj.pk in (None, ''): + return None + + lookup_value = getattr(obj, self.lookup_field) + kwargs = {self.lookup_url_kwarg: lookup_value} + + model_name = self.parent.Meta.model._meta.model_name + app_name = self.parent.Meta.model._meta.app_label + view_name = self.get_view_name(app_name, model_name) + return self.reverse(view_name, kwargs=kwargs, request=request, format=format) + + def get_view_name(self, app_name, model_name): + raise NotImplementedError(_('{class_name} must implement get_view_name()').format( + class_name=self.__class__.__name__ + )) + + +class NetBoxAPIHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): + + def get_view_name(self, app_name, model_name): + return f'{app_name}-api:{model_name}-detail' + + +class NetBoxURLHyperlinkedIdentityField(BaseNetBoxHyperlinkedIdentityField): + + def get_view_name(self, app_name, model_name): + return f'{app_name}:{model_name}' diff --git a/netbox/netbox/api/serializers/nested.py b/netbox/netbox/api/serializers/nested.py index e43fd7428c..04033c71fa 100644 --- a/netbox/netbox/api/serializers/nested.py +++ b/netbox/netbox/api/serializers/nested.py @@ -21,10 +21,9 @@ def to_internal_value(self, data): return get_related_object_by_attrs(queryset, data) -# Declared here for use by PrimaryModelSerializer, but should be imported from extras.api.nested_serializers +# Declared here for use by PrimaryModelSerializer class NestedTagSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detail') class Meta: model = Tag - fields = ['id', 'url', 'display', 'name', 'slug', 'color'] + fields = ['id', 'url', 'display_url', 'display', 'name', 'slug', 'color'] diff --git a/netbox/netbox/api/views.py b/netbox/netbox/api/views.py index cfbe82f14f..d58d1affe5 100644 --- a/netbox/netbox/api/views.py +++ b/netbox/netbox/api/views.py @@ -66,7 +66,7 @@ def get(self, request): return Response({ 'django-version': DJANGO_VERSION, 'installed-apps': installed_apps, - 'netbox-version': settings.VERSION, + 'netbox-version': settings.RELEASE.full_version, 'plugins': get_installed_plugins(), 'python-version': platform.python_version(), 'rq-workers-running': Worker.count(get_connection('default')), diff --git a/netbox/netbox/authentication/__init__.py b/netbox/netbox/authentication/__init__.py index 8c4bde4369..7394f6ded4 100644 --- a/netbox/netbox/authentication/__init__.py +++ b/netbox/netbox/authentication/__init__.py @@ -2,7 +2,6 @@ from collections import defaultdict from django.conf import settings -from django.contrib.auth import get_user_model from django.contrib.auth.backends import ModelBackend, RemoteUserBackend as _RemoteUserBackend from django.contrib.auth.models import AnonymousUser from django.core.exceptions import ImproperlyConfigured @@ -10,14 +9,12 @@ from django.utils.translation import gettext_lazy as _ from users.constants import CONSTRAINT_TOKEN_USER -from users.models import Group, ObjectPermission +from users.models import Group, ObjectPermission, User from utilities.permissions import ( permission_is_exempt, qs_filter_from_constraints, resolve_permission, resolve_permission_type, ) from .misc import _mirror_groups -UserModel = get_user_model() - AUTH_BACKEND_ATTRS = { # backend name: title, MDI icon name 'amazon': ('Amazon AWS', 'aws'), @@ -218,15 +215,15 @@ def authenticate(self, request, remote_user, remote_groups=None): # instead we use get_or_create when creating unknown users since it has # built-in safeguards for multiple threads. if self.create_unknown_user: - user, created = UserModel._default_manager.get_or_create(**{ - UserModel.USERNAME_FIELD: username + user, created = User._default_manager.get_or_create(**{ + User.USERNAME_FIELD: username }) if created: user = self.configure_user(request, user) else: try: - user = UserModel._default_manager.get_by_natural_key(username) - except UserModel.DoesNotExist: + user = User._default_manager.get_by_natural_key(username) + except User.DoesNotExist: pass if self.user_can_authenticate(user): if settings.REMOTE_AUTH_GROUP_SYNC_ENABLED: diff --git a/netbox/netbox/constants.py b/netbox/netbox/constants.py index e797f4f295..b8c679ec04 100644 --- a/netbox/netbox/constants.py +++ b/netbox/netbox/constants.py @@ -1,7 +1,3 @@ -# Prefix for nested serializers -# TODO: Remove in v4.1 -NESTED_SERIALIZER_PREFIX = 'Nested' - # RQ queue names RQ_QUEUE_DEFAULT = 'default' RQ_QUEUE_HIGH = 'high' @@ -27,6 +23,9 @@ 'wirelesslangroup': 105600, 'inventoryitem': 105700, 'inventoryitemtemplate': 105800, + + # Jobs + 'job-schedules': 110100, } # Default view action permission mapping diff --git a/netbox/extras/context_managers.py b/netbox/netbox/context_managers.py similarity index 94% rename from netbox/extras/context_managers.py rename to netbox/netbox/context_managers.py index e72cb8cc2d..ca434df822 100644 --- a/netbox/extras/context_managers.py +++ b/netbox/netbox/context_managers.py @@ -1,7 +1,7 @@ from contextlib import contextmanager from netbox.context import current_request, events_queue -from .events import flush_events +from extras.events import flush_events @contextmanager diff --git a/netbox/netbox/events.py b/netbox/netbox/events.py new file mode 100644 index 0000000000..e48c328151 --- /dev/null +++ b/netbox/netbox/events.py @@ -0,0 +1,79 @@ +from dataclasses import dataclass + +from netbox.registry import registry + +EVENT_TYPE_KIND_INFO = 'info' +EVENT_TYPE_KIND_SUCCESS = 'success' +EVENT_TYPE_KIND_WARNING = 'warning' +EVENT_TYPE_KIND_DANGER = 'danger' + +__all__ = ( + 'EVENT_TYPE_KIND_DANGER', + 'EVENT_TYPE_KIND_INFO', + 'EVENT_TYPE_KIND_SUCCESS', + 'EVENT_TYPE_KIND_WARNING', + 'EventType', + 'get_event_type', + 'get_event_type_choices', + 'get_event_text', +) + + +def get_event_type(name): + return registry['event_types'].get(name) + + +def get_event_text(name): + if event := registry['event_types'].get(name): + return event.text + return '' + + +def get_event_type_choices(): + return [ + (event.name, event.text) for event in registry['event_types'].values() + ] + + +@dataclass +class EventType: + """ + A type of event which can occur in NetBox. Event rules can be defined to automatically + perform some action in response to an event. + + Args: + name: The unique name under which the event is registered. + text: The human-friendly event name. This should support translation. + kind: The event's classification (info, success, warning, or danger). The default type is info. + destructive: Indicates that the associated object was destroyed as a result of the event (default: False). + """ + name: str + text: str + kind: str = EVENT_TYPE_KIND_INFO + destructive: bool = False + + def __str__(self): + return self.text + + def register(self): + if self.name in registry['event_types']: + raise Exception(f"An event type named {self.name} has already been registered!") + registry['event_types'][self.name] = self + + @property + def color(self): + return { + EVENT_TYPE_KIND_INFO: 'blue', + EVENT_TYPE_KIND_SUCCESS: 'green', + EVENT_TYPE_KIND_WARNING: 'orange', + EVENT_TYPE_KIND_DANGER: 'red', + }.get(self.kind) + + @property + def icon(self): + return { + EVENT_TYPE_KIND_INFO: 'mdi mdi-information', + EVENT_TYPE_KIND_SUCCESS: 'mdi mdi-check-circle', + EVENT_TYPE_KIND_WARNING: 'mdi mdi-alert-box', + EVENT_TYPE_KIND_DANGER: 'mdi mdi-alert-octagon', + }.get(self.kind) diff --git a/netbox/netbox/filtersets.py b/netbox/netbox/filtersets.py index 7f07cfbfbc..ac43fe57f4 100644 --- a/netbox/netbox/filtersets.py +++ b/netbox/netbox/filtersets.py @@ -7,9 +7,11 @@ from django_filters.utils import get_model_field, resolve_field from django.utils.translation import gettext as _ -from extras.choices import CustomFieldFilterLogicChoices, ObjectChangeActionChoices +from core.choices import ObjectChangeActionChoices +from core.models import ObjectChange +from extras.choices import CustomFieldFilterLogicChoices from extras.filters import TagFilter -from extras.models import CustomField, ObjectChange, SavedFilter +from extras.models import CustomField, SavedFilter from utilities.constants import ( FILTER_CHAR_BASED_LOOKUP_MAP, FILTER_NEGATION_LOOKUP_MAP, FILTER_TREENODE_NEGATION_LOOKUP_MAP, FILTER_NUMERIC_BASED_LOOKUP_MAP diff --git a/netbox/netbox/graphql/schema.py b/netbox/netbox/graphql/schema.py index 78b2e54e70..a7609c9d20 100644 --- a/netbox/netbox/graphql/schema.py +++ b/netbox/netbox/graphql/schema.py @@ -1,5 +1,7 @@ import strawberry +from django.conf import settings from strawberry_django.optimizer import DjangoOptimizerExtension +from strawberry.extensions import MaxAliasesLimiter from strawberry.schema.config import StrawberryConfig from circuits.graphql.schema import CircuitsQuery @@ -37,5 +39,6 @@ class Query( config=StrawberryConfig(auto_camel_case=False), extensions=[ DjangoOptimizerExtension(prefetch_custom_queryset=True), + MaxAliasesLimiter(max_alias_count=settings.GRAPHQL_MAX_ALIASES), ] ) diff --git a/netbox/netbox/graphql/types.py b/netbox/netbox/graphql/types.py index 64aa3617a7..a4fc990807 100644 --- a/netbox/netbox/graphql/types.py +++ b/netbox/netbox/graphql/types.py @@ -1,17 +1,10 @@ -from typing import Annotated, List - import strawberry -from strawberry import auto import strawberry_django +from django.contrib.contenttypes.models import ContentType +from core.graphql.mixins import ChangelogMixin from core.models import ObjectType as ObjectType_ -from django.contrib.contenttypes.models import ContentType -from extras.graphql.mixins import ( - ChangelogMixin, - CustomFieldsMixin, - JournalEntriesMixin, - TagsMixin, -) +from extras.graphql.mixins import CustomFieldsMixin, JournalEntriesMixin, TagsMixin __all__ = ( 'BaseObjectType', diff --git a/netbox/netbox/jobs.py b/netbox/netbox/jobs.py new file mode 100644 index 0000000000..b0fcc3e994 --- /dev/null +++ b/netbox/netbox/jobs.py @@ -0,0 +1,133 @@ +import logging +from abc import ABC, abstractmethod +from datetime import timedelta + +from django.utils.functional import classproperty +from django_pglocks import advisory_lock +from rq.timeouts import JobTimeoutException + +from core.choices import JobStatusChoices +from core.models import Job, ObjectType +from netbox.constants import ADVISORY_LOCK_KEYS + +__all__ = ( + 'JobRunner', +) + + +class JobRunner(ABC): + """ + Background Job helper class. + + This class handles the execution of a background job. It is responsible for maintaining its state, reporting errors, + and scheduling recurring jobs. + """ + + class Meta: + pass + + def __init__(self, job): + """ + Args: + job: The specific `Job` this `JobRunner` is executing. + """ + self.job = job + + @classproperty + def name(cls): + return getattr(cls.Meta, 'name', cls.__name__) + + @abstractmethod + def run(self, *args, **kwargs): + """ + Run the job. + + A `JobRunner` class needs to implement this method to execute all commands of the job. + """ + pass + + @classmethod + def handle(cls, job, *args, **kwargs): + """ + Handle the execution of a `Job`. + + This method is called by the Job Scheduler to handle the execution of all job commands. It will maintain the + job's metadata and handle errors. For periodic jobs, a new job is automatically scheduled using its `interval`. + """ + try: + job.start() + cls(job).run(*args, **kwargs) + job.terminate() + + except Exception as e: + job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=repr(e)) + if type(e) is JobTimeoutException: + logging.error(e) + + # If the executed job is a periodic job, schedule its next execution at the specified interval. + finally: + if job.interval: + new_scheduled_time = (job.scheduled or job.started) + timedelta(minutes=job.interval) + cls.enqueue( + instance=job.object, + user=job.user, + schedule_at=new_scheduled_time, + interval=job.interval, + **kwargs, + ) + + @classmethod + def get_jobs(cls, instance=None): + """ + Get all jobs of this `JobRunner` related to a specific instance. + """ + jobs = Job.objects.filter(name=cls.name) + + if instance: + object_type = ObjectType.objects.get_for_model(instance, for_concrete_model=False) + jobs = jobs.filter( + object_type=object_type, + object_id=instance.pk, + ) + + return jobs + + @classmethod + def enqueue(cls, *args, **kwargs): + """ + Enqueue a new `Job`. + + This method is a wrapper of `Job.enqueue()` using `handle()` as function callback. See its documentation for + parameters. + """ + return Job.enqueue(cls.handle, name=cls.name, *args, **kwargs) + + @classmethod + @advisory_lock(ADVISORY_LOCK_KEYS['job-schedules']) + def enqueue_once(cls, instance=None, schedule_at=None, interval=None, *args, **kwargs): + """ + Enqueue a new `Job` once, i.e. skip duplicate jobs. + + Like `enqueue()`, this method adds a new `Job` to the job queue. However, if there's already a job of this + class scheduled for `instance`, the existing job will be updated if necessary. This ensures that a particular + schedule is only set up once at any given time, i.e. multiple calls to this method are idempotent. + + Note that this does not forbid running additional jobs with the `enqueue()` method, e.g. to schedule an + immediate synchronization job in addition to a periodic synchronization schedule. + + For additional parameters see `enqueue()`. + + Args: + instance: The NetBox object to which this job pertains (optional) + schedule_at: Schedule the job to be executed at the passed date and time + interval: Recurrence interval (in minutes) + """ + job = cls.get_jobs(instance).filter(status__in=JobStatusChoices.ENQUEUED_STATE_CHOICES).first() + if job: + # If the job parameters haven't changed, don't schedule a new job and keep the current schedule. Otherwise, + # delete the existing job and schedule a new job instead. + if (schedule_at and job.scheduled == schedule_at) and (job.interval == interval): + return job + job.delete() + + return cls.enqueue(instance=instance, schedule_at=schedule_at, interval=interval, *args, **kwargs) diff --git a/netbox/netbox/middleware.py b/netbox/netbox/middleware.py index e15cb560d9..8012965a46 100644 --- a/netbox/netbox/middleware.py +++ b/netbox/netbox/middleware.py @@ -1,6 +1,5 @@ import logging import uuid -from urllib import parse from django.conf import settings from django.contrib import auth, messages @@ -10,8 +9,8 @@ from django.db.utils import InternalError from django.http import Http404, HttpResponseRedirect -from extras.context_managers import event_tracking from netbox.config import clear_config, get_config +from netbox.context_managers import event_tracking from netbox.views import handler_500 from utilities.api import is_api_request from utilities.error_handlers import handle_rest_api_exception @@ -33,16 +32,6 @@ def __call__(self, request): # Assign a random unique ID to the request. This will be used for change logging. request.id = uuid.uuid4() - # Enforce the LOGIN_REQUIRED config parameter. If true, redirect all non-exempt unauthenticated requests - # to the login page. - if ( - settings.LOGIN_REQUIRED and - not request.user.is_authenticated and - not request.path_info.startswith(settings.AUTH_EXEMPT_PATHS) - ): - login_url = f'{settings.LOGIN_URL}?next={parse.quote(request.get_full_path_info())}' - return HttpResponseRedirect(login_url) - # Enable the event_tracking context manager and process the request. with event_tracking(request): response = self.get_response(request) diff --git a/netbox/netbox/models/__init__.py b/netbox/netbox/models/__init__.py index 2c262b2586..4ba5f60da4 100644 --- a/netbox/netbox/models/__init__.py +++ b/netbox/netbox/models/__init__.py @@ -29,6 +29,7 @@ class NetBoxFeatureSet( CustomValidationMixin, ExportTemplatesMixin, JournalingMixin, + NotificationsMixin, TagsMixin, EventRulesMixin ): diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index 000e717a44..45eb700811 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -9,9 +9,10 @@ from django.utils.translation import gettext_lazy as _ from taggit.managers import TaggableManager -from core.choices import JobStatusChoices +from core.choices import JobStatusChoices, ObjectChangeActionChoices from core.models import ObjectType from extras.choices import * +from extras.constants import CUSTOMFIELD_EMPTY_VALUES from extras.utils import is_taggable from netbox.config import get_config from netbox.registry import registry @@ -33,6 +34,7 @@ 'ImageAttachmentsMixin', 'JobsMixin', 'JournalingMixin', + 'NotificationsMixin', 'SyncedDataMixin', 'TagsMixin', 'register_models', @@ -90,7 +92,8 @@ def to_objectchange(self, action): Return a new ObjectChange representing a change made to this object. This will typically be called automatically by ChangeLoggingMiddleware. """ - from extras.models import ObjectChange + # TODO: Fix circular import + from core.models import ObjectChange exclude = [] if get_config().CHANGELOG_SKIP_EMPTY_CHANGES: @@ -248,7 +251,7 @@ def get_custom_fields_by_group(self): for cf in visible_custom_fields: value = self.custom_field_data.get(cf.name) - if value in (None, '', []) and cf.ui_visible == CustomFieldUIVisibleChoices.IF_SET: + if value in CUSTOMFIELD_EMPTY_VALUES and cf.ui_visible == CustomFieldUIVisibleChoices.IF_SET: continue value = cf.deserialize(value) groups[cf.group_name][cf] = value @@ -284,6 +287,15 @@ def clean(self): name=field_name, error=e.message )) + # Validate uniqueness if enforced + if custom_fields[field_name].unique and value not in CUSTOMFIELD_EMPTY_VALUES: + if self._meta.model.objects.exclude(pk=self.pk).filter(**{ + f'custom_field_data__{field_name}': value + }).exists(): + raise ValidationError(_("Custom field '{name}' must have a unique value.").format( + name=field_name + )) + # Check for missing required values for cf in custom_fields.values(): if cf.required and cf.name not in self.custom_field_data: @@ -366,6 +378,20 @@ class Meta: abstract = True +class NotificationsMixin(models.Model): + """ + Enables support for user notifications. + """ + subscriptions = GenericRelation( + to='extras.Subscription', + content_type_field='object_type', + object_id_field='object_id' + ) + + class Meta: + abstract = True + + class JobsMixin(models.Model): """ Enables support for job results. @@ -571,13 +597,14 @@ def sync_data(self): 'custom_fields': CustomFieldsMixin, 'custom_links': CustomLinksMixin, 'custom_validation': CustomValidationMixin, + 'event_rules': EventRulesMixin, 'export_templates': ExportTemplatesMixin, 'image_attachments': ImageAttachmentsMixin, 'jobs': JobsMixin, 'journaling': JournalingMixin, + 'notifications': NotificationsMixin, 'synced_data': SyncedDataMixin, 'tags': TagsMixin, - 'event_rules': EventRulesMixin, } registry['model_features'].update({ diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index cae9cb3215..a1d65d6e22 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -20,6 +20,29 @@ get_model_item('dcim', 'location', _('Locations')), ), ), + MenuGroup( + label=_('Tenancy'), + items=( + get_model_item('tenancy', 'tenant', _('Tenants')), + get_model_item('tenancy', 'tenantgroup', _('Tenant Groups')), + ), + ), + MenuGroup( + label=_('Contacts'), + items=( + get_model_item('tenancy', 'contact', _('Contacts')), + get_model_item('tenancy', 'contactgroup', _('Contact Groups')), + get_model_item('tenancy', 'contactrole', _('Contact Roles')), + get_model_item('tenancy', 'contactassignment', _('Contact Assignments'), actions=['import']), + ), + ), + ), +) + +RACKS_MENU = Menu( + label=_('Racks'), + icon_class='mdi mdi-door-sliding', + groups=( MenuGroup( label=_('Racks'), items=( @@ -34,19 +57,9 @@ ), ), MenuGroup( - label=_('Tenancy'), + label=_('Rack Types'), items=( - get_model_item('tenancy', 'tenant', _('Tenants')), - get_model_item('tenancy', 'tenantgroup', _('Tenant Groups')), - ), - ), - MenuGroup( - label=_('Contacts'), - items=( - get_model_item('tenancy', 'contact', _('Contacts')), - get_model_item('tenancy', 'contactgroup', _('Contact Groups')), - get_model_item('tenancy', 'contactrole', _('Contact Roles')), - get_model_item('tenancy', 'contactassignment', _('Contact Assignments'), actions=['import']), + get_model_item('dcim', 'racktype', _('Rack Types')), ), ), ), @@ -258,6 +271,8 @@ items=( get_model_item('circuits', 'circuit', _('Circuits')), get_model_item('circuits', 'circuittype', _('Circuit Types')), + get_model_item('circuits', 'circuitgroup', _('Circuit Groups')), + get_model_item('circuits', 'circuitgroupassignment', _('Group Assignments')), get_model_item('circuits', 'circuittermination', _('Circuit Terminations')), ), ), @@ -355,8 +370,9 @@ MenuGroup( label=_('Logging'), items=( + get_model_item('extras', 'notificationgroup', _('Notification Groups')), get_model_item('extras', 'journalentry', _('Journal Entries'), actions=['import']), - get_model_item('extras', 'objectchange', _('Change Log'), actions=[]), + get_model_item('core', 'objectchange', _('Change Log'), actions=[]), ), ), ), @@ -433,6 +449,11 @@ link_text=_('System'), auth_required=True ), + MenuItem( + link='core:plugin_list', + link_text=_('Plugins'), + auth_required=True + ), MenuItem( link='core:configrevision_list', link_text=_('Configuration History'), @@ -451,6 +472,7 @@ MENUS = [ ORGANIZATION_MENU, + RACKS_MENU, DEVICES_MENU, CONNECTIONS_MENU, WIRELESS_MENU, diff --git a/netbox/netbox/plugins/registration.py b/netbox/netbox/plugins/registration.py index d27bb67cad..c845727942 100644 --- a/netbox/netbox/plugins/registration.py +++ b/netbox/netbox/plugins/registration.py @@ -18,8 +18,8 @@ def register_template_extensions(class_list): """ Register a list of PluginTemplateExtension classes """ - # Validation for template_extension in class_list: + # Validation if not inspect.isclass(template_extension): raise TypeError( _("PluginTemplateExtension class {template_extension} was passed as an instance!").format( @@ -32,21 +32,23 @@ def register_template_extensions(class_list): template_extension=template_extension ) ) - if template_extension.model is None: - raise TypeError( - _("PluginTemplateExtension class {template_extension} does not define a valid model!").format( - template_extension=template_extension - ) - ) - registry['plugins']['template_extensions'][template_extension.model].append(template_extension) + if template_extension.models: + # Registration for multiple models + models = template_extension.models + elif template_extension.model: + # Registration for a single model + models = [template_extension.model] + else: + # Global registration (no specific models) + models = [None] + for model in models: + registry['plugins']['template_extensions'][model].append(template_extension) def register_menu(menu): if not isinstance(menu, PluginMenu): - raise TypeError(_("{item} must be an instance of netbox.plugins.PluginMenuItem").format( - item=menu_link - )) + raise TypeError(_("{item} must be an instance of netbox.plugins.PluginMenuItem").format(item=menu)) registry['plugins']['menus'].append(menu) diff --git a/netbox/netbox/plugins/templates.py b/netbox/netbox/plugins/templates.py index 85229dbafd..e1f4b7a47d 100644 --- a/netbox/netbox/plugins/templates.py +++ b/netbox/netbox/plugins/templates.py @@ -14,11 +14,13 @@ class PluginTemplateExtension: The `model` attribute on the class defines the which model detail page this class renders content for. It should be set as a string in the form '.'. render() provides the following context data: - * object - The object being viewed + * object - The object being viewed (object views only) + * model - The type of object being viewed (list views only) * request - The current request * settings - Global NetBox settings * config - Plugin-specific configuration parameters """ + models = None model = None def __init__(self, context): @@ -36,39 +38,65 @@ def render(self, template_name, extra_context=None): return get_template(template_name).render({**self.context, **extra_context}) - def left_page(self): + # + # Global methods + # + + def navbar(self): """ - Content that will be rendered on the left of the detail page view. Content should be returned as an - HTML string. Note that content does not need to be marked as safe because this is automatically handled. + Content that will be rendered inside the top navigation menu. Content should be returned as an HTML + string. Note that content does not need to be marked as safe because this is automatically handled. """ raise NotImplementedError - def right_page(self): + # + # Object list views + # + + def list_buttons(self): """ - Content that will be rendered on the right of the detail page view. Content should be returned as an + Buttons that will be rendered and added to the existing list of buttons on the list view. Content + should be returned as an HTML string. Note that content does not need to be marked as safe because this is + automatically handled. + """ + raise NotImplementedError + + # + # Object detail views + # + + def buttons(self): + """ + Buttons that will be rendered and added to the existing list of buttons on the detail page view. Content + should be returned as an HTML string. Note that content does not need to be marked as safe because this is + automatically handled. + """ + raise NotImplementedError + + def alerts(self): + """ + Arbitrary content to be inserted at the top of an object's detail view. Content should be returned as an HTML string. Note that content does not need to be marked as safe because this is automatically handled. """ raise NotImplementedError - def full_width_page(self): + def left_page(self): """ - Content that will be rendered within the full width of the detail page view. Content should be returned as an + Content that will be rendered on the left of the detail page view. Content should be returned as an HTML string. Note that content does not need to be marked as safe because this is automatically handled. """ raise NotImplementedError - def buttons(self): + def right_page(self): """ - Buttons that will be rendered and added to the existing list of buttons on the detail page view. Content - should be returned as an HTML string. Note that content does not need to be marked as safe because this is - automatically handled. + Content that will be rendered on the right of the detail page view. Content should be returned as an + HTML string. Note that content does not need to be marked as safe because this is automatically handled. """ raise NotImplementedError - def list_buttons(self): + def full_width_page(self): """ - Buttons that will be rendered and added to the existing list of buttons on the list view. Content - should be returned as an HTML string. Note that content does not need to be marked as safe because this is - automatically handled. + Content that will be rendered within the full width of the detail page view. Content should be returned as an + HTML string. Note that content does not need to be marked as safe because this is automatically handled. """ raise NotImplementedError diff --git a/netbox/netbox/registry.py b/netbox/netbox/registry.py index d783647ec8..0920cbccf9 100644 --- a/netbox/netbox/registry.py +++ b/netbox/netbox/registry.py @@ -25,6 +25,7 @@ def __delitem__(self, key): 'counter_fields': collections.defaultdict(dict), 'data_backends': dict(), 'denormalized_fields': collections.defaultdict(list), + 'event_types': dict(), 'model_features': dict(), 'models': collections.defaultdict(set), 'plugins': dict(), diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 76167025ec..3601fde9ff 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -18,14 +18,15 @@ from netbox.config import PARAMS as CONFIG_PARAMS from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW from netbox.plugins import PluginConfig +from utilities.release import load_release_data from utilities.string import trailing_slash - # # Environment setup # -VERSION = '4.0.11' +RELEASE = load_release_data() +VERSION = RELEASE.full_version # Retained for backward compatibility HOSTNAME = platform.node() # Set the base directory two levels up BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -61,7 +62,17 @@ ADMINS = getattr(configuration, 'ADMINS', []) ALLOW_TOKEN_RETRIEVAL = getattr(configuration, 'ALLOW_TOKEN_RETRIEVAL', True) ALLOWED_HOSTS = getattr(configuration, 'ALLOWED_HOSTS') # Required -AUTH_PASSWORD_VALIDATORS = getattr(configuration, 'AUTH_PASSWORD_VALIDATORS', []) +AUTH_PASSWORD_VALIDATORS = getattr(configuration, 'AUTH_PASSWORD_VALIDATORS', [ + { + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + "OPTIONS": { + "min_length": 12, + }, + }, + { + "NAME": "utilities.password_validation.AlphanumericPasswordValidator", + }, +]) BASE_PATH = trailing_slash(getattr(configuration, 'BASE_PATH', '')) CHANGELOG_SKIP_EMPTY_CHANGES = getattr(configuration, 'CHANGELOG_SKIP_EMPTY_CHANGES', True) CENSUS_REPORTING_ENABLED = getattr(configuration, 'CENSUS_REPORTING_ENABLED', True) @@ -82,6 +93,16 @@ 'extras.add_bookmark': ({'user': '$user'},), 'extras.change_bookmark': ({'user': '$user'},), 'extras.delete_bookmark': ({'user': '$user'},), + # Permit users to manage their own notifications + 'extras.view_notification': ({'user': '$user'},), + 'extras.add_notification': ({'user': '$user'},), + 'extras.change_notification': ({'user': '$user'},), + 'extras.delete_notification': ({'user': '$user'},), + # Permit users to manage their own subscriptions + 'extras.view_subscription': ({'user': '$user'},), + 'extras.add_subscription': ({'user': '$user'},), + 'extras.change_subscription': ({'user': '$user'},), + 'extras.delete_subscription': ({'user': '$user'},), # Permit users to manage their own API tokens 'users.view_token': ({'user': '$user'},), 'users.add_token': ({'user': '$user'},), @@ -98,8 +119,10 @@ EXEMPT_VIEW_PERMISSIONS = getattr(configuration, 'EXEMPT_VIEW_PERMISSIONS', []) FIELD_CHOICES = getattr(configuration, 'FIELD_CHOICES', {}) FILE_UPLOAD_MAX_MEMORY_SIZE = getattr(configuration, 'FILE_UPLOAD_MAX_MEMORY_SIZE', 2621440) +GRAPHQL_MAX_ALIASES = getattr(configuration, 'GRAPHQL_MAX_ALIASES', 10) HTTP_PROXIES = getattr(configuration, 'HTTP_PROXIES', None) INTERNAL_IPS = getattr(configuration, 'INTERNAL_IPS', ('127.0.0.1', '::1')) +ISOLATED_DEPLOYMENT = getattr(configuration, 'ISOLATED_DEPLOYMENT', False) JINJA2_FILTERS = getattr(configuration, 'JINJA2_FILTERS', {}) LANGUAGE_CODE = getattr(configuration, 'DEFAULT_LANGUAGE', 'en-us') LANGUAGE_COOKIE_PATH = CSRF_COOKIE_PATH @@ -518,15 +541,6 @@ def _setting(name, default=None): ('users', 'user'), ) -# All URLs starting with a string listed here are exempt from login enforcement -AUTH_EXEMPT_PATHS = ( - f'/{BASE_PATH}api/', - f'/{BASE_PATH}graphql/', - f'/{BASE_PATH}login/', - f'/{BASE_PATH}oauth/', - f'/{BASE_PATH}metrics', -) - # All URLs starting with a string listed here are exempt from maintenance mode enforcement MAINTENANCE_EXEMPT_PATHS = ( f'/{BASE_PATH}admin/', @@ -551,7 +565,7 @@ def _setting(name, default=None): # Initialize the SDK sentry_sdk.init( dsn=SENTRY_DSN, - release=VERSION, + release=RELEASE.full_version, sample_rate=SENTRY_SAMPLE_RATE, traces_sample_rate=SENTRY_TRACES_SAMPLE_RATE, send_default_pii=SENTRY_SEND_DEFAULT_PII, @@ -571,11 +585,11 @@ def _setting(name, default=None): DEPLOYMENT_ID = hashlib.sha256(SECRET_KEY.encode('utf-8')).hexdigest()[:16] CENSUS_URL = 'https://census.netbox.oss.netboxlabs.com/api/v1/' CENSUS_PARAMS = { - 'version': VERSION, + 'version': RELEASE.full_version, 'python_version': sys.version.split()[0], 'deployment_id': DEPLOYMENT_ID, } -if CENSUS_REPORTING_ENABLED and not DEBUG and 'test' not in sys.argv: +if CENSUS_REPORTING_ENABLED and not ISOLATED_DEPLOYMENT and not DEBUG and 'test' not in sys.argv: try: # Report anonymous census data requests.get(f'{CENSUS_URL}?{urlencode(CENSUS_PARAMS)}', timeout=3, proxies=HTTP_PROXIES) @@ -629,7 +643,7 @@ def _setting(name, default=None): # Django REST framework (API) # -REST_FRAMEWORK_VERSION = '.'.join(VERSION.split('-')[0].split('.')[:2]) # Use major.minor as API version +REST_FRAMEWORK_VERSION = '.'.join(RELEASE.version.split('-')[0].split('.')[:2]) # Use major.minor as API version REST_FRAMEWORK = { 'ALLOWED_VERSIONS': [REST_FRAMEWORK_VERSION], 'COERCE_DECIMAL_TO_STRING': False, @@ -674,7 +688,7 @@ def _setting(name, default=None): SPECTACULAR_SETTINGS = { 'TITLE': 'NetBox REST API', 'LICENSE': {'name': 'Apache v2 License'}, - 'VERSION': VERSION, + 'VERSION': RELEASE.full_version, 'COMPONENT_SPLIT_REQUEST': True, 'REDOC_DIST': 'SIDECAR', 'SERVERS': [{ @@ -772,6 +786,8 @@ def _setting(name, default=None): # Plugins # +PLUGIN_CATALOG_URL = 'https://api.netbox.oss.netboxlabs.com/v1/plugins' + # Register any configured plugins for plugin_name in PLUGINS: try: @@ -826,7 +842,7 @@ def _setting(name, default=None): # Validate user-provided configuration settings and assign defaults if plugin_name not in PLUGINS_CONFIG: PLUGINS_CONFIG[plugin_name] = {} - plugin_config.validate(PLUGINS_CONFIG[plugin_name], VERSION) + plugin_config.validate(PLUGINS_CONFIG[plugin_name], RELEASE.version) # Add middleware plugin_middleware = plugin_config.middleware diff --git a/netbox/netbox/tables/columns.py b/netbox/netbox/tables/columns.py index 479efa8644..0e70a1624f 100644 --- a/netbox/netbox/tables/columns.py +++ b/netbox/netbox/tables/columns.py @@ -173,6 +173,7 @@ def __init__(self, *args, **kwargs): kwargs['attrs'] = { 'th': { 'class': 'w-1', + 'aria-label': _('Select all'), }, 'td': { 'class': 'w-1', @@ -284,7 +285,7 @@ def render(self, record, table, **kwargs): if len(self.actions) == 1 or (self.split_actions and idx == 0): dropdown_class = attrs.css_class button = ( - f'' + f'' f'' ) diff --git a/netbox/netbox/tests/dummy_plugin/template_content.py b/netbox/netbox/tests/dummy_plugin/template_content.py index b63338f2f0..e9a6b9da1c 100644 --- a/netbox/netbox/tests/dummy_plugin/template_content.py +++ b/netbox/netbox/tests/dummy_plugin/template_content.py @@ -1,8 +1,20 @@ from netbox.plugins.templates import PluginTemplateExtension +class GlobalContent(PluginTemplateExtension): + + def navbar(self): + return "GLOBAL CONTENT - NAVBAR" + + class SiteContent(PluginTemplateExtension): - model = 'dcim.site' + models = ['dcim.site'] + + def buttons(self): + return "SITE CONTENT - BUTTONS" + + def alerts(self): + return "SITE CONTENT - ALERTS" def left_page(self): return "SITE CONTENT - LEFT PAGE" @@ -13,11 +25,8 @@ def right_page(self): def full_width_page(self): return "SITE CONTENT - FULL WIDTH PAGE" - def buttons(self): - return "SITE CONTENT - BUTTONS" - def list_buttons(self): return "SITE CONTENT - LIST BUTTONS" -template_extensions = [SiteContent] +template_extensions = [GlobalContent, SiteContent] diff --git a/netbox/netbox/tests/test_authentication.py b/netbox/netbox/tests/test_authentication.py index 6e049dcafa..5c7a30dc77 100644 --- a/netbox/netbox/tests/test_authentication.py +++ b/netbox/netbox/tests/test_authentication.py @@ -1,7 +1,6 @@ import datetime from django.conf import settings -from django.contrib.auth import get_user_model from django.test import Client from django.test.utils import override_settings from django.urls import reverse @@ -11,14 +10,11 @@ from core.models import ObjectType from dcim.models import Site from ipam.models import Prefix -from users.models import Group, ObjectPermission, Token +from users.models import Group, ObjectPermission, Token, User from utilities.testing import TestCase from utilities.testing.api import APITestCase -User = get_user_model() - - class TokenAuthenticationTestCase(APITestCase): @override_settings(LOGIN_REQUIRED=True, EXEMPT_VIEW_PERMISSIONS=['*']) diff --git a/netbox/netbox/tests/test_jobs.py b/netbox/netbox/tests/test_jobs.py new file mode 100644 index 0000000000..cb3024038a --- /dev/null +++ b/netbox/netbox/tests/test_jobs.py @@ -0,0 +1,129 @@ +from datetime import timedelta + +from django.test import TestCase +from django.utils import timezone +from django_rq import get_queue + +from ..jobs import * +from core.models import Job +from core.choices import JobStatusChoices + + +class TestJobRunner(JobRunner): + def run(self, *args, **kwargs): + pass + + +class JobRunnerTestCase(TestCase): + def tearDown(self): + super().tearDown() + + # Clear all queues after running each test + get_queue('default').connection.flushall() + get_queue('high').connection.flushall() + get_queue('low').connection.flushall() + + @staticmethod + def get_schedule_at(offset=1): + # Schedule jobs a week in advance to avoid accidentally running jobs on worker nodes used for testing. + return timezone.now() + timedelta(weeks=offset) + + +class JobRunnerTest(JobRunnerTestCase): + """ + Test internal logic of `JobRunner`. + """ + + def test_name_default(self): + self.assertEqual(TestJobRunner.name, TestJobRunner.__name__) + + def test_name_set(self): + class NamedJobRunner(TestJobRunner): + class Meta: + name = 'TestName' + + self.assertEqual(NamedJobRunner.name, 'TestName') + + def test_handle(self): + job = TestJobRunner.enqueue(immediate=True) + + self.assertEqual(job.status, JobStatusChoices.STATUS_COMPLETED) + + def test_handle_errored(self): + class ErroredJobRunner(TestJobRunner): + EXP = Exception('Test error') + + def run(self, *args, **kwargs): + raise self.EXP + + job = ErroredJobRunner.enqueue(immediate=True) + + self.assertEqual(job.status, JobStatusChoices.STATUS_ERRORED) + self.assertEqual(job.error, repr(ErroredJobRunner.EXP)) + + +class EnqueueTest(JobRunnerTestCase): + """ + Test enqueuing of `JobRunner`. + """ + + def test_enqueue(self): + instance = Job() + for i in range(1, 3): + job = TestJobRunner.enqueue(instance, schedule_at=self.get_schedule_at()) + + self.assertIsInstance(job, Job) + self.assertEqual(TestJobRunner.get_jobs(instance).count(), i) + + def test_enqueue_once(self): + job = TestJobRunner.enqueue_once(instance=Job(), schedule_at=self.get_schedule_at()) + + self.assertIsInstance(job, Job) + self.assertEqual(job.name, TestJobRunner.__name__) + + def test_enqueue_once_twice_same(self): + instance = Job() + schedule_at = self.get_schedule_at() + job1 = TestJobRunner.enqueue_once(instance, schedule_at=schedule_at) + job2 = TestJobRunner.enqueue_once(instance, schedule_at=schedule_at) + + self.assertEqual(job1, job2) + self.assertEqual(TestJobRunner.get_jobs(instance).count(), 1) + + def test_enqueue_once_twice_different_schedule_at(self): + instance = Job() + job1 = TestJobRunner.enqueue_once(instance, schedule_at=self.get_schedule_at()) + job2 = TestJobRunner.enqueue_once(instance, schedule_at=self.get_schedule_at(2)) + + self.assertNotEqual(job1, job2) + self.assertRaises(Job.DoesNotExist, job1.refresh_from_db) + self.assertEqual(TestJobRunner.get_jobs(instance).count(), 1) + + def test_enqueue_once_twice_different_interval(self): + instance = Job() + schedule_at = self.get_schedule_at() + job1 = TestJobRunner.enqueue_once(instance, schedule_at=schedule_at) + job2 = TestJobRunner.enqueue_once(instance, schedule_at=schedule_at, interval=60) + + self.assertNotEqual(job1, job2) + self.assertEqual(job1.interval, None) + self.assertEqual(job2.interval, 60) + self.assertRaises(Job.DoesNotExist, job1.refresh_from_db) + self.assertEqual(TestJobRunner.get_jobs(instance).count(), 1) + + def test_enqueue_once_with_enqueue(self): + instance = Job() + job1 = TestJobRunner.enqueue_once(instance, schedule_at=self.get_schedule_at(2)) + job2 = TestJobRunner.enqueue(instance, schedule_at=self.get_schedule_at()) + + self.assertNotEqual(job1, job2) + self.assertEqual(TestJobRunner.get_jobs(instance).count(), 2) + + def test_enqueue_once_after_enqueue(self): + instance = Job() + job1 = TestJobRunner.enqueue(instance, schedule_at=self.get_schedule_at()) + job2 = TestJobRunner.enqueue_once(instance, schedule_at=self.get_schedule_at(2)) + + self.assertNotEqual(job1, job2) + self.assertRaises(Job.DoesNotExist, job1.refresh_from_db) + self.assertEqual(TestJobRunner.get_jobs(instance).count(), 1) diff --git a/netbox/netbox/tests/test_plugins.py b/netbox/netbox/tests/test_plugins.py index 9ce20e204c..351fef9e2d 100644 --- a/netbox/netbox/tests/test_plugins.py +++ b/netbox/netbox/tests/test_plugins.py @@ -99,8 +99,9 @@ def test_template_extensions(self): """ Check that plugin TemplateExtensions are registered. """ - from netbox.tests.dummy_plugin.template_content import SiteContent + from netbox.tests.dummy_plugin.template_content import GlobalContent, SiteContent + self.assertIn(GlobalContent, registry['plugins']['template_extensions'][None]) self.assertIn(SiteContent, registry['plugins']['template_extensions']['dcim.site']) def test_registered_columns(self): @@ -165,11 +166,11 @@ class DummyConfigWithRequiredSettings(dummy_config): required_settings = ['foo'] # Validation should pass when all required settings are present - DummyConfigWithRequiredSettings.validate({'foo': True}, settings.VERSION) + DummyConfigWithRequiredSettings.validate({'foo': True}, settings.RELEASE.version) # Validation should fail when a required setting is missing with self.assertRaises(ImproperlyConfigured): - DummyConfigWithRequiredSettings.validate({}, settings.VERSION) + DummyConfigWithRequiredSettings.validate({}, settings.RELEASE.version) def test_default_settings(self): """ @@ -182,12 +183,12 @@ class DummyConfigWithDefaultSettings(dummy_config): # Populate the default value if setting has not been specified user_config = {} - DummyConfigWithDefaultSettings.validate(user_config, settings.VERSION) + DummyConfigWithDefaultSettings.validate(user_config, settings.RELEASE.version) self.assertEqual(user_config['bar'], 123) # Don't overwrite specified values user_config = {'bar': 456} - DummyConfigWithDefaultSettings.validate(user_config, settings.VERSION) + DummyConfigWithDefaultSettings.validate(user_config, settings.RELEASE.version) self.assertEqual(user_config['bar'], 456) def test_graphql(self): diff --git a/netbox/netbox/urls.py b/netbox/netbox/urls.py index a5e5e36f4b..b0175ec043 100644 --- a/netbox/netbox/urls.py +++ b/netbox/netbox/urls.py @@ -57,7 +57,7 @@ path( "api/schema/", - cache_page(timeout=86400, key_prefix=f"api_schema_{settings.VERSION}")( + cache_page(timeout=86400, key_prefix=f"api_schema_{settings.RELEASE.version}")( SpectacularAPIView.as_view() ), name="schema", diff --git a/netbox/netbox/views/errors.py b/netbox/netbox/views/errors.py index a0f783ed6c..9e8ed5a3a4 100644 --- a/netbox/netbox/views/errors.py +++ b/netbox/netbox/views/errors.py @@ -54,7 +54,7 @@ def handler_500(request, template_name=ERROR_500_TEMPLATE_NAME): return HttpResponseServerError(template.render({ 'error': error, 'exception': str(type_), - 'netbox_version': settings.VERSION, + 'netbox_version': settings.RELEASE.full_version, 'python_version': platform.python_version(), 'plugins': get_installed_plugins(), })) diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 36ceef7f1c..d7d28b95f5 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -19,9 +19,9 @@ from mptt.models import MPTTModel from core.models import ObjectType +from core.signals import clear_events from extras.choices import CustomFieldUIEditableChoices from extras.models import CustomField, ExportTemplate -from extras.signals import clear_events from utilities.error_handlers import handle_protectederror from utilities.exceptions import AbortRequest, AbortTransaction, PermissionsViolation from utilities.forms import BulkRenameForm, ConfirmationForm, restrict_form_fields diff --git a/netbox/netbox/views/generic/feature_views.py b/netbox/netbox/views/generic/feature_views.py index 240e8ca285..0c463e084f 100644 --- a/netbox/netbox/views/generic/feature_views.py +++ b/netbox/netbox/views/generic/feature_views.py @@ -1,3 +1,4 @@ +from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.contenttypes.models import ContentType from django.contrib import messages from django.db import transaction @@ -6,12 +7,13 @@ from django.utils.translation import gettext as _ from django.views.generic import View -from core.models import Job -from core.tables import JobTable -from extras import forms, tables -from extras.models import * +from core.models import Job, ObjectChange +from core.tables import JobTable, ObjectChangeTable +from extras.forms import JournalEntryForm +from extras.models import JournalEntry +from extras.tables import JournalEntryTable from utilities.permissions import get_permission_for_model -from utilities.views import GetReturnURLMixin, ViewTab +from utilities.views import ConditionalLoginRequiredMixin, GetReturnURLMixin, ViewTab from .base import BaseMultiObjectView __all__ = ( @@ -23,7 +25,7 @@ ) -class ObjectChangeLogView(View): +class ObjectChangeLogView(ConditionalLoginRequiredMixin, View): """ Present a history of changes made to a particular object. The model class must be passed as a keyword argument when referencing this view in a URL path. For example: @@ -56,7 +58,7 @@ def get(self, request, model, **kwargs): Q(changed_object_type=content_type, changed_object_id=obj.pk) | Q(related_object_type=content_type, related_object_id=obj.pk) ) - objectchanges_table = tables.ObjectChangeTable( + objectchanges_table = ObjectChangeTable( data=objectchanges, orderable=False, user=request.user @@ -76,7 +78,7 @@ def get(self, request, model, **kwargs): }) -class ObjectJournalView(View): +class ObjectJournalView(ConditionalLoginRequiredMixin, View): """ Show all journal entries for an object. The model class must be passed as a keyword argument when referencing this view in a URL path. For example: @@ -108,13 +110,13 @@ def get(self, request, model, **kwargs): assigned_object_type=content_type, assigned_object_id=obj.pk ) - journalentry_table = tables.JournalEntryTable(journalentries, user=request.user) + journalentry_table = JournalEntryTable(journalentries, user=request.user) journalentry_table.configure(request) journalentry_table.columns.hide('assigned_object_type') journalentry_table.columns.hide('assigned_object') if request.user.has_perm('extras.add_journalentry'): - form = forms.JournalEntryForm( + form = JournalEntryForm( initial={ 'assigned_object_type': ContentType.objects.get_for_model(obj), 'assigned_object_id': obj.pk @@ -137,7 +139,7 @@ def get(self, request, model, **kwargs): }) -class ObjectJobsView(View): +class ObjectJobsView(ConditionalLoginRequiredMixin, View): """ Render a list of all Job assigned to an object. For example: @@ -190,7 +192,7 @@ def get(self, request, model, **kwargs): }) -class ObjectSyncDataView(View): +class ObjectSyncDataView(LoginRequiredMixin, View): def post(self, request, model, **kwargs): """ diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index cad7facd35..3572645220 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -13,7 +13,7 @@ from django.utils.safestring import mark_safe from django.utils.translation import gettext as _ -from extras.signals import clear_events +from core.signals import clear_events from utilities.error_handlers import handle_protectederror from utilities.exceptions import AbortRequest, PermissionsViolation from utilities.forms import ConfirmationForm, restrict_form_fields @@ -234,6 +234,8 @@ def get(self, request, *args, **kwargs): # If this is an HTMX request, return only the rendered form HTML if htmx_partial(request): return render(request, self.htmx_template_name, { + 'model': model, + 'object': obj, 'form': form, }) @@ -288,6 +290,7 @@ def post(self, request, *args, **kwargs): msg = f'{msg} {obj}' messages.success(request, msg) + # If adding another object, redirect back to the edit form if '_addanother' in request.POST: redirect_url = request.path @@ -303,6 +306,12 @@ def post(self, request, *args, **kwargs): return_url = self.get_return_url(request, obj) + # If the object has been created or edited via HTMX, return an HTMX redirect to the object view + if request.htmx: + return HttpResponse(headers={ + 'HX-Location': return_url, + }) + return redirect(return_url) except (AbortRequest, PermissionsViolation) as e: diff --git a/netbox/netbox/views/htmx.py b/netbox/netbox/views/htmx.py index 04ddcb06ba..b7894e36c3 100644 --- a/netbox/netbox/views/htmx.py +++ b/netbox/netbox/views/htmx.py @@ -1,3 +1,4 @@ +from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.http import Http404 @@ -6,7 +7,7 @@ from django.views.generic import View -class ObjectSelectorView(View): +class ObjectSelectorView(LoginRequiredMixin, View): template_name = 'htmx/object_selector.html' def get(self, request): diff --git a/netbox/netbox/views/misc.py b/netbox/netbox/views/misc.py index 9678b71e33..c584e99e40 100644 --- a/netbox/netbox/views/misc.py +++ b/netbox/netbox/views/misc.py @@ -19,6 +19,7 @@ from netbox.tables import SearchTable from utilities.htmx import htmx_partial from utilities.paginator import EnhancedPaginator, get_paginate_count +from utilities.views import ConditionalLoginRequiredMixin __all__ = ( 'HomeView', @@ -28,7 +29,7 @@ Link = namedtuple('Link', ('label', 'viewname', 'permission', 'count')) -class HomeView(View): +class HomeView(ConditionalLoginRequiredMixin, View): template_name = 'home.html' def get(self, request): @@ -50,7 +51,7 @@ def get(self, request): latest_release = cache.get('latest_release') if latest_release: release_version, release_url = latest_release - if release_version > version.parse(settings.VERSION): + if release_version > version.parse(settings.RELEASE.version): new_release = { 'version': str(release_version), 'url': release_url, @@ -62,7 +63,7 @@ def get(self, request): }) -class SearchView(View): +class SearchView(ConditionalLoginRequiredMixin, View): def get(self, request): results = [] diff --git a/netbox/project-static/dist/graphiql/graphiql.min.css b/netbox/project-static/dist/graphiql/graphiql.min.css index 6318023d0e..1bcbfba31a 100644 --- a/netbox/project-static/dist/graphiql/graphiql.min.css +++ b/netbox/project-static/dist/graphiql/graphiql.min.css @@ -339,7 +339,2012 @@ /*!********************************************************************************************!*\ !*** css ../../../node_modules/css-loader/dist/cjs.js!../../graphiql-react/dist/style.css ***! \********************************************************************************************/ -.graphiql-container *{box-sizing:border-box;font-variant-ligatures:none}.graphiql-container,.CodeMirror-info,.CodeMirror-lint-tooltip,.graphiql-dialog,.graphiql-dialog-overlay,.graphiql-tooltip,[data-radix-popper-content-wrapper]{--color-primary: 320, 95%, 43%;--color-secondary: 242, 51%, 61%;--color-tertiary: 188, 100%, 36%;--color-info: 208, 100%, 46%;--color-success: 158, 60%, 42%;--color-warning: 36, 100%, 41%;--color-error: 13, 93%, 58%;--color-neutral: 219, 28%, 32%;--color-base: 219, 28%, 100%;--alpha-secondary: .76;--alpha-tertiary: .5;--alpha-background-heavy: .15;--alpha-background-medium: .1;--alpha-background-light: .07;--font-family: "Roboto", sans-serif;--font-family-mono: "Fira Code", monospace;--font-size-hint:.75rem;--font-size-inline-code:.8125rem;--font-size-body:.9375rem;--font-size-h4:1.125rem;--font-size-h3:1.375rem;--font-size-h2:1.8125rem;--font-weight-regular: 400;--font-weight-medium: 500;--line-height: 1.5;--px-2: 2px;--px-4: 4px;--px-6: 6px;--px-8: 8px;--px-10: 10px;--px-12: 12px;--px-16: 16px;--px-20: 20px;--px-24: 24px;--border-radius-2: 2px;--border-radius-4: 4px;--border-radius-8: 8px;--border-radius-12: 12px;--popover-box-shadow: 0px 6px 20px rgba(59, 76, 106, .13), 0px 1.34018px 4.46726px rgba(59, 76, 106, .0774939), 0px .399006px 1.33002px rgba(59, 76, 106, .0525061);--popover-border: none;--sidebar-width: 60px;--toolbar-width: 40px;--session-header-height: 51px}@media (prefers-color-scheme: dark){body:not(.graphiql-light) .graphiql-container,body:not(.graphiql-light) .CodeMirror-info,body:not(.graphiql-light) .CodeMirror-lint-tooltip,body:not(.graphiql-light) .graphiql-dialog,body:not(.graphiql-light) .graphiql-dialog-overlay,body:not(.graphiql-light) .graphiql-tooltip,body:not(.graphiql-light) [data-radix-popper-content-wrapper]{--color-primary: 338, 100%, 67%;--color-secondary: 243, 100%, 77%;--color-tertiary: 188, 100%, 44%;--color-info: 208, 100%, 72%;--color-success: 158, 100%, 42%;--color-warning: 30, 100%, 80%;--color-error: 13, 100%, 58%;--color-neutral: 219, 29%, 78%;--color-base: 219, 29%, 18%;--popover-box-shadow: none;--popover-border: 1px solid hsl(var(--color-neutral))}}body.graphiql-dark .graphiql-container,body.graphiql-dark .CodeMirror-info,body.graphiql-dark .CodeMirror-lint-tooltip,body.graphiql-dark .graphiql-dialog,body.graphiql-dark .graphiql-dialog-overlay,body.graphiql-dark .graphiql-tooltip,body.graphiql-dark [data-radix-popper-content-wrapper]{--color-primary: 338, 100%, 67%;--color-secondary: 243, 100%, 77%;--color-tertiary: 188, 100%, 44%;--color-info: 208, 100%, 72%;--color-success: 158, 100%, 42%;--color-warning: 30, 100%, 80%;--color-error: 13, 100%, 58%;--color-neutral: 219, 29%, 78%;--color-base: 219, 29%, 18%;--popover-box-shadow: none;--popover-border: 1px solid hsl(var(--color-neutral))}.graphiql-container,.CodeMirror-info,.CodeMirror-lint-tooltip,.graphiql-dialog,.graphiql-container:is(button),.CodeMirror-info:is(button),.CodeMirror-lint-tooltip:is(button),.graphiql-dialog:is(button){color:hsla(var(--color-neutral),1);font-family:var(--font-family);font-size:var(--font-size-body);font-weight:var(----font-weight-regular);line-height:var(--line-height)}.graphiql-container input,.CodeMirror-info input,.CodeMirror-lint-tooltip input,.graphiql-dialog input{color:hsla(var(--color-neutral),1);font-family:var(--font-family);font-size:var(--font-size-caption)}.graphiql-container input::placeholder,.CodeMirror-info input::placeholder,.CodeMirror-lint-tooltip input::placeholder,.graphiql-dialog input::placeholder{color:hsla(var(--color-neutral),var(--alpha-secondary))}.graphiql-container a,.CodeMirror-info a,.CodeMirror-lint-tooltip a,.graphiql-dialog a{color:hsl(var(--color-primary))}.graphiql-container a:focus,.CodeMirror-info a:focus,.CodeMirror-lint-tooltip a:focus,.graphiql-dialog a:focus{outline:hsl(var(--color-primary)) auto 1px}.graphiql-un-styled,button.graphiql-un-styled{all:unset;border-radius:var(--border-radius-4);cursor:pointer}:is(.graphiql-un-styled,button.graphiql-un-styled):hover{background-color:hsla(var(--color-neutral),var(--alpha-background-light))}:is(.graphiql-un-styled,button.graphiql-un-styled):active{background-color:hsla(var(--color-neutral),var(--alpha-background-medium))}:is(.graphiql-un-styled,button.graphiql-un-styled):focus{outline:hsla(var(--color-neutral),var(--alpha-background-heavy)) auto 1px}.graphiql-button,button.graphiql-button{background-color:hsla(var(--color-neutral),var(--alpha-background-light));border:none;border-radius:var(--border-radius-4);color:hsla(var(--color-neutral),1);cursor:pointer;font-size:var(--font-size-body);padding:var(--px-8) var(--px-12)}:is(.graphiql-button,button.graphiql-button):hover,:is(.graphiql-button,button.graphiql-button):active{background-color:hsla(var(--color-neutral),var(--alpha-background-medium))}:is(.graphiql-button,button.graphiql-button):focus{outline:hsla(var(--color-neutral),var(--alpha-background-heavy)) auto 1px}.graphiql-button-success:is(.graphiql-button,button.graphiql-button){background-color:hsla(var(--color-success),var(--alpha-background-heavy))}.graphiql-button-error:is(.graphiql-button,button.graphiql-button){background-color:hsla(var(--color-error),var(--alpha-background-heavy))}.graphiql-button-group{background-color:hsla(var(--color-neutral),var(--alpha-background-light));border-radius:calc(var(--border-radius-4) + var(--px-4));display:flex;padding:var(--px-4)}.graphiql-button-group>button.graphiql-button{background-color:transparent}.graphiql-button-group>button.graphiql-button:hover{background-color:hsla(var(--color-neutral),var(--alpha-background-light))}.graphiql-button-group>button.graphiql-button.active{background-color:hsl(var(--color-base));cursor:default}.graphiql-button-group>*+*{margin-left:var(--px-8)}.graphiql-dialog-overlay{position:fixed;inset:0;background-color:hsla(var(--color-neutral),var(--alpha-background-heavy));z-index:10}.graphiql-dialog{background-color:hsl(var(--color-base));border:var(--popover-border);border-radius:var(--border-radius-12);box-shadow:var(--popover-box-shadow);margin:0;max-height:80vh;max-width:80vw;overflow:auto;padding:0;width:unset;transform:translate(-50%,-50%);top:50%;left:50%;position:fixed;z-index:10}.graphiql-dialog-close>svg{color:hsla(var(--color-neutral),var(--alpha-secondary));display:block;height:var(--px-12);padding:var(--px-12);width:var(--px-12)}.graphiql-dropdown-content{background-color:hsl(var(--color-base));border:var(--popover-border);border-radius:var(--border-radius-8);box-shadow:var(--popover-box-shadow);font-size:inherit;max-width:250px;padding:var(--px-4);font-family:var(--font-family);color:hsl(var(--color-neutral));max-height:min(calc(var(--radix-dropdown-menu-content-available-height) - 10px),400px);overflow-y:scroll}.graphiql-dropdown-item{border-radius:var(--border-radius-4);font-size:inherit;margin:var(--px-4);overflow:hidden;padding:var(--px-6) var(--px-8);text-overflow:ellipsis;white-space:nowrap;outline:none;cursor:pointer;line-height:var(--line-height)}.graphiql-dropdown-item[data-selected],.graphiql-dropdown-item[data-current-nav],.graphiql-dropdown-item:hover{background-color:hsla(var(--color-neutral),var(--alpha-background-light));color:inherit}.graphiql-dropdown-item:not(:first-child){margin-top:0}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) blockquote{margin-left:0;margin-right:0;padding-left:var(--px-8)}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) code,:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) pre{border-radius:var(--border-radius-4);font-family:var(--font-family-mono);font-size:var(--font-size-inline-code)}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) code{padding:var(--px-2)}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) pre{overflow:auto;padding:var(--px-6) var(--px-8)}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) pre code{background-color:initial;border-radius:0;padding:0}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) ol,:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) ul{padding-left:var(--px-16)}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) ol{list-style-type:decimal}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) ul{list-style-type:disc}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) img{border-radius:var(--border-radius-4);max-height:120px;max-width:100%}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation)>:first-child{margin-top:0}:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation)>:last-child{margin-bottom:0}:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) a{color:hsl(var(--color-primary));text-decoration:none}:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) a:hover{text-decoration:underline}:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) blockquote{border-left:1.5px solid hsla(var(--color-neutral),var(--alpha-tertiary))}:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) code,:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) pre{background-color:hsla(var(--color-neutral),var(--alpha-background-light));color:hsla(var(--color-neutral),1)}:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description)>*{margin:var(--px-12) 0}:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation) a{color:hsl(var(--color-warning));text-decoration:underline}:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation) blockquote{border-left:1.5px solid hsl(var(--color-warning))}:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation) code,:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation) pre{background-color:hsla(var(--color-warning),var(--alpha-background-heavy))}:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation)>*{margin:var(--px-8) 0}.graphiql-markdown-preview>:not(:first-child){display:none}.CodeMirror-hint-information-deprecation,.CodeMirror-info .info-deprecation{background-color:hsla(var(--color-warning),var(--alpha-background-light));border:1px solid hsl(var(--color-warning));border-radius:var(--border-radius-4);color:hsl(var(--color-warning));margin-top:var(--px-12);padding:var(--px-6) var(--px-8)}.CodeMirror-hint-information-deprecation-label,.CodeMirror-info .info-deprecation-label{font-size:var(--font-size-hint);font-weight:var(--font-weight-medium)}.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation-reason{margin-top:var(--px-6)}.graphiql-spinner{height:56px;margin:auto;margin-top:var(--px-16);width:56px}.graphiql-spinner:after{animation:rotation .8s linear 0s infinite;border:4px solid transparent;border-radius:100%;border-top:4px solid hsla(var(--color-neutral),var(--alpha-tertiary));content:"";display:inline-block;height:46px;vertical-align:middle;width:46px}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.graphiql-tooltip{background:hsl(var(--color-base));border:var(--popover-border);border-radius:var(--border-radius-4);box-shadow:var(--popover-box-shadow);color:hsl(var(--color-neutral));font-size:inherit;padding:var(--px-4) var(--px-6);font-family:var(--font-family)}.graphiql-tabs{display:flex;align-items:center;overflow-x:auto;padding:var(--px-12)}.graphiql-tabs>:not(:first-child){margin-left:var(--px-12)}.graphiql-tab{align-items:stretch;border-radius:var(--border-radius-8);color:hsla(var(--color-neutral),var(--alpha-secondary));display:flex}.graphiql-tab>button.graphiql-tab-close{visibility:hidden}.graphiql-tab.graphiql-tab-active>button.graphiql-tab-close,.graphiql-tab:hover>button.graphiql-tab-close,.graphiql-tab:focus-within>button.graphiql-tab-close{visibility:unset}.graphiql-tab.graphiql-tab-active{background-color:hsla(var(--color-neutral),var(--alpha-background-heavy));color:hsla(var(--color-neutral),1)}button.graphiql-tab-button{padding:var(--px-4) 0 var(--px-4) var(--px-8)}button.graphiql-tab-close{align-items:center;display:flex;padding:var(--px-4) var(--px-8)}button.graphiql-tab-close>svg{height:var(--px-8);width:var(--px-8)}.graphiql-history-header{font-size:var(--font-size-h2);font-weight:var(--font-weight-medium);display:flex;justify-content:space-between;align-items:center}.graphiql-history-header button{font-size:var(--font-size-inline-code);padding:var(--px-6) var(--px-10)}.graphiql-history-items{margin:var(--px-16) 0 0;list-style:none;padding:0}.graphiql-history-item{border-radius:var(--border-radius-4);color:hsla(var(--color-neutral),var(--alpha-secondary));display:flex;font-size:var(--font-size-inline-code);font-family:var(--font-family-mono);height:34px}.graphiql-history-item:hover{color:hsla(var(--color-neutral),1);background-color:hsla(var(--color-neutral),var(--alpha-background-light))}.graphiql-history-item:not(:first-child){margin-top:var(--px-4)}.graphiql-history-item.editable{background-color:hsla(var(--color-primary),var(--alpha-background-medium))}.graphiql-history-item.editable>input{background:transparent;border:none;flex:1;margin:0;outline:none;padding:0 var(--px-10);width:100%}.graphiql-history-item.editable>input::placeholder{color:hsla(var(--color-neutral),var(--alpha-secondary))}.graphiql-history-item.editable>button{color:hsl(var(--color-primary));padding:0 var(--px-10)}.graphiql-history-item.editable>button:active{background-color:hsla(var(--color-primary),var(--alpha-background-heavy))}.graphiql-history-item.editable>button:focus{outline:hsl(var(--color-primary)) auto 1px}.graphiql-history-item.editable>button>svg{display:block}button.graphiql-history-item-label{flex:1;padding:var(--px-8) var(--px-10);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}button.graphiql-history-item-action{align-items:center;color:hsla(var(--color-neutral),var(--alpha-secondary));display:flex;padding:var(--px-8) var(--px-6)}button.graphiql-history-item-action:hover{color:hsla(var(--color-neutral),1)}button.graphiql-history-item-action>svg{height:14px;width:14px}.graphiql-history-item-spacer{height:var(--px-16)}.graphiql-doc-explorer-default-value{color:hsl(var(--color-success))}a.graphiql-doc-explorer-type-name{color:hsl(var(--color-warning));text-decoration:none}a.graphiql-doc-explorer-type-name:hover{text-decoration:underline}a.graphiql-doc-explorer-type-name:focus{outline:hsl(var(--color-warning)) auto 1px}.graphiql-doc-explorer-argument>*+*{margin-top:var(--px-12)}.graphiql-doc-explorer-argument-name{color:hsl(var(--color-secondary))}.graphiql-doc-explorer-argument-deprecation{background-color:hsla(var(--color-warning),var(--alpha-background-light));border:1px solid hsl(var(--color-warning));border-radius:var(--border-radius-4);color:hsl(var(--color-warning));padding:var(--px-8)}.graphiql-doc-explorer-argument-deprecation-label{font-size:var(--font-size-hint);font-weight:var(--font-weight-medium)}.graphiql-doc-explorer-deprecation{background-color:hsla(var(--color-warning),var(--alpha-background-light));border:1px solid hsl(var(--color-warning));border-radius:var(--px-4);color:hsl(var(--color-warning));padding:var(--px-8)}.graphiql-doc-explorer-deprecation-label{font-size:var(--font-size-hint);font-weight:var(--font-weight-medium)}.graphiql-doc-explorer-directive{color:hsl(var(--color-secondary))}.graphiql-doc-explorer-section-title{align-items:center;display:flex;font-size:var(--font-size-hint);font-weight:var(--font-weight-medium);line-height:1}.graphiql-doc-explorer-section-title>svg{height:var(--px-16);margin-right:var(--px-8);width:var(--px-16)}.graphiql-doc-explorer-section-content{margin-left:var(--px-8);margin-top:var(--px-16)}.graphiql-doc-explorer-section-content>*+*{margin-top:var(--px-16)}.graphiql-doc-explorer-root-type{color:hsl(var(--color-info))}.graphiql-doc-explorer-search{color:hsla(var(--color-neutral),var(--alpha-secondary))}.graphiql-doc-explorer-search:not([data-state="idle"]){border:var(--popover-border);border-radius:var(--border-radius-4);box-shadow:var(--popover-box-shadow);color:hsla(var(--color-neutral),1)}.graphiql-doc-explorer-search:not([data-state="idle"]) .graphiql-doc-explorer-search-input{background:hsl(var(--color-base))}.graphiql-doc-explorer-search-input{align-items:center;background-color:hsla(var(--color-neutral),var(--alpha-background-light));border-radius:var(--border-radius-4);display:flex;padding:var(--px-8) var(--px-12)}.graphiql-doc-explorer-search [role=combobox]{border:none;background-color:transparent;margin-left:var(--px-4);width:100%}.graphiql-doc-explorer-search [role=combobox]:focus{outline:none}.graphiql-doc-explorer-search [role=listbox]{background-color:hsl(var(--color-base));border:none;border-bottom-left-radius:var(--border-radius-4);border-bottom-right-radius:var(--border-radius-4);border-top:1px solid hsla(var(--color-neutral),var(--alpha-background-heavy));max-height:400px;overflow-y:auto;margin:0;font-size:var(--font-size-body);padding:var(--px-4);position:relative}.graphiql-doc-explorer-search [role=option]{border-radius:var(--border-radius-4);color:hsla(var(--color-neutral),var(--alpha-secondary));overflow-x:hidden;padding:var(--px-8) var(--px-12);text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.graphiql-doc-explorer-search [role=option][data-headlessui-state=active]{background-color:hsla(var(--color-neutral),var(--alpha-background-light))}.graphiql-doc-explorer-search [role=option]:hover{background-color:hsla(var(--color-neutral),var(--alpha-background-medium))}.graphiql-doc-explorer-search [role=option][data-headlessui-state=active]:hover{background-color:hsla(var(--color-neutral),var(--alpha-background-heavy))}:is(.graphiql-doc-explorer-search [role="option"])+:is(.graphiql-doc-explorer-search [role="option"]){margin-top:var(--px-4)}.graphiql-doc-explorer-search-type{color:hsl(var(--color-info))}.graphiql-doc-explorer-search-field{color:hsl(var(--color-warning))}.graphiql-doc-explorer-search-argument{color:hsl(var(--color-secondary))}.graphiql-doc-explorer-search-divider{color:hsla(var(--color-neutral),var(--alpha-secondary));font-size:var(--font-size-hint);font-weight:var(--font-weight-medium);margin-top:var(--px-8);padding:var(--px-8) var(--px-12)}.graphiql-doc-explorer-search-empty{color:hsla(var(--color-neutral),var(--alpha-secondary));padding:var(--px-8) var(--px-12)}a.graphiql-doc-explorer-field-name{color:hsl(var(--color-info));text-decoration:none}a.graphiql-doc-explorer-field-name:hover{text-decoration:underline}a.graphiql-doc-explorer-field-name:focus{outline:hsl(var(--color-info)) auto 1px}.graphiql-doc-explorer-item>:not(:first-child){margin-top:var(--px-12)}.graphiql-doc-explorer-argument-multiple{margin-left:var(--px-8)}.graphiql-doc-explorer-enum-value{color:hsl(var(--color-info))}.graphiql-doc-explorer-header{display:flex;justify-content:space-between;position:relative}.graphiql-doc-explorer-header:focus-within .graphiql-doc-explorer-title{visibility:hidden}.graphiql-doc-explorer-header:focus-within .graphiql-doc-explorer-back:not(:focus){color:transparent}.graphiql-doc-explorer-header-content{display:flex;flex-direction:column;min-width:0}.graphiql-doc-explorer-search{position:absolute;right:0;top:0}.graphiql-doc-explorer-search:focus-within{left:0}.graphiql-doc-explorer-search [role=combobox]{height:24px;width:4ch}.graphiql-doc-explorer-search [role=combobox]:focus{width:100%}a.graphiql-doc-explorer-back{align-items:center;color:hsla(var(--color-neutral),var(--alpha-secondary));display:flex;text-decoration:none}a.graphiql-doc-explorer-back:hover{text-decoration:underline}a.graphiql-doc-explorer-back:focus{outline:hsla(var(--color-neutral),var(--alpha-secondary)) auto 1px}a.graphiql-doc-explorer-back:focus+.graphiql-doc-explorer-title{visibility:unset}a.graphiql-doc-explorer-back>svg{height:var(--px-8);margin-right:var(--px-8);width:var(--px-8)}.graphiql-doc-explorer-title{font-weight:var(--font-weight-medium);font-size:var(--font-size-h2);overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.graphiql-doc-explorer-title:not(:first-child){font-size:var(--font-size-h3);margin-top:var(--px-8)}.graphiql-doc-explorer-content>*{color:hsla(var(--color-neutral),var(--alpha-secondary));margin-top:var(--px-20)}.graphiql-doc-explorer-error{background-color:hsla(var(--color-error),var(--alpha-background-heavy));border:1px solid hsl(var(--color-error));border-radius:var(--border-radius-8);color:hsl(var(--color-error));padding:var(--px-8) var(--px-12)}.CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid black;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor .CodeMirror-line::selection,.cm-fat-cursor .CodeMirror-line>span::selection,.cm-fat-cursor .CodeMirror-line>span>span::selection{background:transparent}.cm-fat-cursor .CodeMirror-line::-moz-selection,.cm-fat-cursor .CodeMirror-line>span::-moz-selection,.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:transparent}.cm-fat-cursor{caret-color:transparent}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3,.cm-s-default .cm-type{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error,.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:white}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-50px;margin-right:-50px;padding-bottom:50px;height:100%;outline:none;position:relative;z-index:0}.CodeMirror-sizer{position:relative;border-right:50px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none;outline:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-50px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors,.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:#ff06}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:""}span.CodeMirror-selectedtext{background:none}.graphiql-container .CodeMirror{height:100%;position:absolute;width:100%}.graphiql-container .CodeMirror{font-family:var(--font-family-mono)}.graphiql-container .CodeMirror,.graphiql-container .CodeMirror-gutters{background:none;background-color:var(--editor-background, hsl(var(--color-base)))}.graphiql-container .CodeMirror-linenumber{padding:0}.graphiql-container .CodeMirror-gutters{border:none}.cm-s-graphiql{color:hsla(var(--color-neutral),var(--alpha-tertiary))}.cm-s-graphiql .cm-keyword{color:hsl(var(--color-primary))}.cm-s-graphiql .cm-def{color:hsl(var(--color-tertiary))}.cm-s-graphiql .cm-punctuation{color:hsla(var(--color-neutral),var(--alpha-tertiary))}.cm-s-graphiql .cm-variable{color:hsl(var(--color-secondary))}.cm-s-graphiql .cm-atom{color:hsl(var(--color-tertiary))}.cm-s-graphiql .cm-number{color:hsl(var(--color-success))}.cm-s-graphiql .cm-string{color:hsl(var(--color-warning))}.cm-s-graphiql .cm-builtin{color:hsl(var(--color-success))}.cm-s-graphiql .cm-string-2{color:hsl(var(--color-secondary))}.cm-s-graphiql .cm-attribute,.cm-s-graphiql .cm-meta{color:hsl(var(--color-tertiary))}.cm-s-graphiql .cm-property{color:hsl(var(--color-info))}.cm-s-graphiql .cm-qualifier{color:hsl(var(--color-secondary))}.cm-s-graphiql .cm-comment{color:hsla(var(--color-neutral),var(--alpha-secondary))}.cm-s-graphiql .cm-ws{color:hsla(var(--color-neutral),var(--alpha-tertiary))}.cm-s-graphiql .cm-invalidchar{color:hsl(var(--color-error))}.cm-s-graphiql .CodeMirror-cursor{border-left:2px solid hsla(var(--color-neutral),var(--alpha-secondary))}.cm-s-graphiql .CodeMirror-linenumber{color:hsla(var(--color-neutral),var(--alpha-tertiary))}.graphiql-container div.CodeMirror span.CodeMirror-matchingbracket,.graphiql-container div.CodeMirror span.CodeMirror-nonmatchingbracket{color:hsl(var(--color-warning))}.graphiql-container .CodeMirror-selected,.graphiql-container .CodeMirror-focused .CodeMirror-selected{background:hsla(var(--color-neutral),var(--alpha-background-heavy))}.graphiql-container .CodeMirror-dialog{background:inherit;color:inherit;left:0;right:0;overflow:hidden;padding:var(--px-2) var(--px-6);position:absolute;z-index:6}.graphiql-container .CodeMirror-dialog-top{border-bottom:1px solid hsla(var(--color-neutral),var(--alpha-background-heavy));padding-bottom:var(--px-12);top:0}.graphiql-container .CodeMirror-dialog-bottom{border-top:1px solid hsla(var(--color-neutral),var(--alpha-background-heavy));bottom:0;padding-top:var(--px-12)}.graphiql-container .CodeMirror-search-hint{display:none}.graphiql-container .CodeMirror-dialog input{border:1px solid hsla(var(--color-neutral),var(--alpha-background-heavy));border-radius:var(--border-radius-4);padding:var(--px-4)}.graphiql-container .CodeMirror-dialog input:focus{outline:hsl(var(--color-primary)) solid 2px}.graphiql-container .cm-searching{background-color:hsla(var(--color-warning),var(--alpha-background-light));padding-bottom:1.5px;padding-top:.5px}.CodeMirror-foldmarker{color:#00f;text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;font-family:arial;line-height:.3;cursor:pointer}.CodeMirror-foldgutter{width:.7em}.CodeMirror-foldgutter-open,.CodeMirror-foldgutter-folded{cursor:pointer}.CodeMirror-foldgutter-open:after{content:"▾"}.CodeMirror-foldgutter-folded:after{content:"▸"}.CodeMirror-foldgutter{width:var(--px-12)}.CodeMirror-foldmarker{background-color:hsl(var(--color-info));border-radius:var(--border-radius-4);color:hsl(var(--color-base));font-family:inherit;margin:0 var(--px-4);padding:0 var(--px-8);text-shadow:none}.CodeMirror-foldgutter-open,.CodeMirror-foldgutter-folded{color:hsla(var(--color-neutral),var(--alpha-tertiary))}.CodeMirror-foldgutter-open:after,.CodeMirror-foldgutter-folded:after{margin:0 var(--px-2)}.graphiql-editor{height:100%;position:relative;width:100%}.graphiql-editor.hidden{left:-9999px;position:absolute;top:-9999px;visibility:hidden}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid black;border-radius:4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-marker{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-lint-line-error{background-color:#b74c5114}.CodeMirror-lint-line-warning{background-color:#ffd3001a}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-repeat:repeat-x;background-size:10px 3px;background-position:0 95%}.cm-s-graphiql .CodeMirror-lint-mark-error{color:hsl(var(--color-error))}.CodeMirror-lint-mark-error{background-image:linear-gradient(45deg,transparent 65%,hsl(var(--color-error)) 80%,transparent 90%),linear-gradient(135deg,transparent 5%,hsl(var(--color-error)) 15%,transparent 25%),linear-gradient(135deg,transparent 45%,hsl(var(--color-error)) 55%,transparent 65%),linear-gradient(45deg,transparent 25%,hsl(var(--color-error)) 35%,transparent 50%)}.cm-s-graphiql .CodeMirror-lint-mark-warning{color:hsl(var(--color-warning))}.CodeMirror-lint-mark-warning{background-image:linear-gradient(45deg,transparent 65%,hsl(var(--color-warning)) 80%,transparent 90%),linear-gradient(135deg,transparent 5%,hsl(var(--color-warning)) 15%,transparent 25%),linear-gradient(135deg,transparent 45%,hsl(var(--color-warning)) 55%,transparent 65%),linear-gradient(45deg,transparent 25%,hsl(var(--color-warning)) 35%,transparent 50%)}.CodeMirror-lint-tooltip{background-color:hsl(var(--color-base));border:var(--popover-border);border-radius:var(--border-radius-8);box-shadow:var(--popover-box-shadow);font-size:var(--font-size-body);font-family:var(--font-family);max-width:600px;overflow:hidden;padding:var(--px-12)}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{background-image:none;padding:0}.CodeMirror-lint-message-error{color:hsl(var(--color-error))}.CodeMirror-lint-message-warning{color:hsl(var(--color-warning))}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px #0003;border-radius:3px;border:1px solid silver;background:white;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-hints{background:hsl(var(--color-base));border:var(--popover-border);border-radius:var(--border-radius-8);box-shadow:var(--popover-box-shadow);display:grid;font-family:var(--font-family);font-size:var(--font-size-body);grid-template-columns:auto fit-content(300px);max-height:264px;padding:0}.CodeMirror-hint{border-radius:var(--border-radius-4);color:hsla(var(--color-neutral),var(--alpha-secondary));grid-column:1 / 2;margin:var(--px-4);padding:var(--px-6) var(--px-8)!important}.CodeMirror-hint:not(:first-child){margin-top:0}li.CodeMirror-hint-active{background:hsla(var(--color-primary),var(--alpha-background-medium));color:hsl(var(--color-primary))}.CodeMirror-hint-information{border-left:1px solid hsla(var(--color-neutral),var(--alpha-background-heavy));grid-column:2 / 3;grid-row:1 / 99999;max-height:264px;overflow:auto;padding:var(--px-12)}.CodeMirror-hint-information-header{display:flex;align-items:baseline}.CodeMirror-hint-information-field-name{font-size:var(--font-size-h4);font-weight:var(--font-weight-medium)}.CodeMirror-hint-information-type-name-pill{border:1px solid hsla(var(--color-neutral),var(--alpha-tertiary));border-radius:var(--border-radius-4);color:hsla(var(--color-neutral),var(--alpha-secondary));margin-left:var(--px-6);padding:var(--px-4)}.CodeMirror-hint-information-type-name{color:inherit;text-decoration:none}.CodeMirror-hint-information-type-name:hover{text-decoration:underline dotted}.CodeMirror-hint-information-description{color:hsla(var(--color-neutral),var(--alpha-secondary));margin-top:var(--px-12)}.CodeMirror-info{background-color:hsl(var(--color-base));border:var(--popover-border);border-radius:var(--border-radius-8);box-shadow:var(--popover-box-shadow);color:hsla(var(--color-neutral),1);max-height:300px;max-width:400px;opacity:0;overflow:auto;padding:var(--px-12);position:fixed;transition:opacity .15s;z-index:10}.CodeMirror-info a{color:inherit;text-decoration:none}.CodeMirror-info a:hover{text-decoration:underline dotted}.CodeMirror-info .CodeMirror-info-header{display:flex;align-items:baseline}.CodeMirror-info .CodeMirror-info-header>.type-name,.CodeMirror-info .CodeMirror-info-header>.field-name,.CodeMirror-info .CodeMirror-info-header>.arg-name,.CodeMirror-info .CodeMirror-info-header>.directive-name,.CodeMirror-info .CodeMirror-info-header>.enum-value{font-size:var(--font-size-h4);font-weight:var(--font-weight-medium)}.CodeMirror-info .type-name-pill{border:1px solid hsla(var(--color-neutral),var(--alpha-tertiary));border-radius:var(--border-radius-4);color:hsla(var(--color-neutral),var(--alpha-secondary));margin-left:var(--px-6);padding:var(--px-4)}.CodeMirror-info .info-description{color:hsla(var(--color-neutral),var(--alpha-secondary));margin-top:var(--px-12);overflow:hidden}.CodeMirror-jump-token{text-decoration:underline dotted;cursor:pointer}.auto-inserted-leaf.cm-property{animation-duration:6s;animation-name:insertionFade;border-radius:var(--border-radius-4);padding:var(--px-2)}@keyframes insertionFade{0%,to{background-color:none}15%,85%{background-color:hsla(var(--color-warning),var(--alpha-background-light))}}button.graphiql-toolbar-button{display:flex;align-items:center;justify-content:center;height:var(--toolbar-width);width:var(--toolbar-width)}button.graphiql-toolbar-button.error{background:hsla(var(--color-error),var(--alpha-background-heavy))}.graphiql-execute-button-wrapper{position:relative}button.graphiql-execute-button{background-color:hsl(var(--color-primary));border:none;border-radius:var(--border-radius-8);cursor:pointer;height:var(--toolbar-width);padding:0;width:var(--toolbar-width)}button.graphiql-execute-button:hover{background-color:hsla(var(--color-primary),.9)}button.graphiql-execute-button:active{background-color:hsla(var(--color-primary),.8)}button.graphiql-execute-button:focus{outline:hsla(var(--color-primary),.8) auto 1px}button.graphiql-execute-button>svg{color:#fff;display:block;height:var(--px-16);margin:auto;width:var(--px-16)}button.graphiql-toolbar-menu{display:block;height:var(--toolbar-width);width:var(--toolbar-width)} +/* a very simple box-model reset, intentionally does not include pseudo elements */ +.graphiql-container * { + box-sizing: border-box; + font-variant-ligatures: none; +} + +.graphiql-container, +.CodeMirror-info, +.CodeMirror-lint-tooltip, +.graphiql-dialog, +.graphiql-dialog-overlay, +.graphiql-tooltip, +[data-radix-popper-content-wrapper] { + /* Colors */ + --color-primary: 320, 95%, 43%; + --color-secondary: 242, 51%, 61%; + --color-tertiary: 188, 100%, 36%; + --color-info: 208, 100%, 46%; + --color-success: 158, 60%, 42%; + --color-warning: 36, 100%, 41%; + --color-error: 13, 93%, 58%; + --color-neutral: 219, 28%, 32%; + --color-base: 219, 28%, 100%; + + /* Color alpha values */ + --alpha-secondary: 0.76; + --alpha-tertiary: 0.5; + --alpha-background-heavy: 0.15; + --alpha-background-medium: 0.1; + --alpha-background-light: 0.07; + + /* Font */ + --font-family: 'Roboto', sans-serif; + --font-family-mono: 'Fira Code', monospace; + --font-size-hint: calc(12rem / 16); + --font-size-inline-code: calc(13rem / 16); + --font-size-body: calc(15rem / 16); + --font-size-h4: calc(18rem / 16); + --font-size-h3: calc(22rem / 16); + --font-size-h2: calc(29rem / 16); + --font-weight-regular: 400; + --font-weight-medium: 500; + --line-height: 1.5; + + /* Spacing */ + --px-2: 2px; + --px-4: 4px; + --px-6: 6px; + --px-8: 8px; + --px-10: 10px; + --px-12: 12px; + --px-16: 16px; + --px-20: 20px; + --px-24: 24px; + + /* Border radius */ + --border-radius-2: 2px; + --border-radius-4: 4px; + --border-radius-8: 8px; + --border-radius-12: 12px; + + /* Popover styles (tooltip, dialog, etc) */ + --popover-box-shadow: 0px 6px 20px rgba(59, 76, 106, 0.13), + 0px 1.34018px 4.46726px rgba(59, 76, 106, 0.0774939), + 0px 0.399006px 1.33002px rgba(59, 76, 106, 0.0525061); + --popover-border: none; + + /* Layout */ + --sidebar-width: 60px; + --toolbar-width: 40px; + --session-header-height: 51px; +} + +@media (prefers-color-scheme: dark) { + body:not(.graphiql-light) .graphiql-container, + body:not(.graphiql-light) .CodeMirror-info, + body:not(.graphiql-light) .CodeMirror-lint-tooltip, + body:not(.graphiql-light) .graphiql-dialog, + body:not(.graphiql-light) .graphiql-dialog-overlay, + body:not(.graphiql-light) .graphiql-tooltip, + body:not(.graphiql-light) [data-radix-popper-content-wrapper] { + --color-primary: 338, 100%, 67%; + --color-secondary: 243, 100%, 77%; + --color-tertiary: 188, 100%, 44%; + --color-info: 208, 100%, 72%; + --color-success: 158, 100%, 42%; + --color-warning: 30, 100%, 80%; + --color-error: 13, 100%, 58%; + --color-neutral: 219, 29%, 78%; + --color-base: 219, 29%, 18%; + + --popover-box-shadow: none; + --popover-border: 1px solid hsl(var(--color-neutral)); + } +} + +body.graphiql-dark .graphiql-container, +body.graphiql-dark .CodeMirror-info, +body.graphiql-dark .CodeMirror-lint-tooltip, +body.graphiql-dark .graphiql-dialog, +body.graphiql-dark .graphiql-dialog-overlay, +body.graphiql-dark .graphiql-tooltip, +body.graphiql-dark [data-radix-popper-content-wrapper] { + --color-primary: 338, 100%, 67%; + --color-secondary: 243, 100%, 77%; + --color-tertiary: 188, 100%, 44%; + --color-info: 208, 100%, 72%; + --color-success: 158, 100%, 42%; + --color-warning: 30, 100%, 80%; + --color-error: 13, 100%, 58%; + --color-neutral: 219, 29%, 78%; + --color-base: 219, 29%, 18%; + + --popover-box-shadow: none; + --popover-border: 1px solid hsl(var(--color-neutral)); +} + +.graphiql-container, + .CodeMirror-info, + .CodeMirror-lint-tooltip, + .graphiql-dialog, + .graphiql-container:is(button), + .CodeMirror-info:is(button), + .CodeMirror-lint-tooltip:is(button), + .graphiql-dialog:is(button) { + color: hsl(var(--color-neutral)); + font-family: var(--font-family); + font-size: var(--font-size-body); + font-weight: var(--font-weight-regular); + line-height: var(--line-height); + } + +.graphiql-container input, .CodeMirror-info input, .CodeMirror-lint-tooltip input, .graphiql-dialog input { + color: hsl(var(--color-neutral)); + font-family: var(--font-family); + font-size: var(--font-size-caption) + } + +.graphiql-container input::placeholder, .CodeMirror-info input::placeholder, .CodeMirror-lint-tooltip input::placeholder, .graphiql-dialog input::placeholder { + color: hsla(var(--color-neutral), var(--alpha-secondary)); + } + +.graphiql-container a, .CodeMirror-info a, .CodeMirror-lint-tooltip a, .graphiql-dialog a { + color: hsl(var(--color-primary)) + } + +.graphiql-container a:focus, .CodeMirror-info a:focus, .CodeMirror-lint-tooltip a:focus, .graphiql-dialog a:focus { + outline: hsl(var(--color-primary)) auto 1px; + } +.graphiql-un-styled, +button.graphiql-un-styled { + all: unset; + border-radius: var(--border-radius-4); + cursor: pointer +} + +:is(.graphiql-un-styled,button.graphiql-un-styled):hover { + background-color: hsla(var(--color-neutral), var(--alpha-background-light)); + } + +:is(.graphiql-un-styled,button.graphiql-un-styled):active { + background-color: hsla( + var(--color-neutral), + var(--alpha-background-medium) + ); + } + +:is(.graphiql-un-styled,button.graphiql-un-styled):focus { + outline: hsla(var(--color-neutral), var(--alpha-background-heavy)) auto 1px; + } + +.graphiql-button, +button.graphiql-button { + background-color: hsla(var(--color-neutral), var(--alpha-background-light)); + border: none; + border-radius: var(--border-radius-4); + color: hsl(var(--color-neutral)); + cursor: pointer; + font-size: var(--font-size-body); + padding: var(--px-8) var(--px-12) +} + +:is(.graphiql-button,button.graphiql-button):hover, + :is(.graphiql-button,button.graphiql-button):active { + background-color: hsla( + var(--color-neutral), + var(--alpha-background-medium) + ); + } + +:is(.graphiql-button,button.graphiql-button):focus { + outline: hsla(var(--color-neutral), var(--alpha-background-heavy)) auto 1px; + } + +.graphiql-button-success:is(.graphiql-button,button.graphiql-button) { + background-color: hsla(var(--color-success), var(--alpha-background-heavy)); + } + +.graphiql-button-error:is(.graphiql-button,button.graphiql-button) { + background-color: hsla(var(--color-error), var(--alpha-background-heavy)); + } +.graphiql-button-group { + background-color: hsla(var(--color-neutral), var(--alpha-background-light)); + /* Border radius of button plus padding */ + border-radius: calc(var(--border-radius-4) + var(--px-4)); + display: flex; + padding: var(--px-4) +} +.graphiql-button-group > button.graphiql-button { + background-color: transparent + } +.graphiql-button-group > button.graphiql-button:hover { + background-color: hsla( + var(--color-neutral), + var(--alpha-background-light) + ); + } +.graphiql-button-group > button.graphiql-button.active { + background-color: hsl(var(--color-base)); + cursor: default; + } +.graphiql-button-group > * + * { + margin-left: var(--px-8); + } +.graphiql-dialog-overlay { + position: fixed; + inset: 0; + background-color: hsla(var(--color-neutral), var(--alpha-background-heavy)); + /** + * CodeMirror has a `z-index` set for the container of the scrollbar of the + * editor, so we have to add one here to make sure that the dialog is shown + * above the editor scrollbar (if they are visible). + */ + z-index: 10; +} + +.graphiql-dialog { + background-color: hsl(var(--color-base)); + border: var(--popover-border); + border-radius: var(--border-radius-12); + box-shadow: var(--popover-box-shadow); + margin: 0; + max-height: 80vh; + max-width: 80vw; + overflow: auto; + padding: 0; + width: unset; + transform: translate(-50%, -50%); + top: 50%; + left: 50%; + position: fixed; + z-index: 10; +} + +.graphiql-dialog-close > svg { + color: hsla(var(--color-neutral), var(--alpha-secondary)); + display: block; + height: var(--px-12); + padding: var(--px-12); + width: var(--px-12); +} +.graphiql-dropdown-content { + background-color: hsl(var(--color-base)); + border: var(--popover-border); + border-radius: var(--border-radius-8); + box-shadow: var(--popover-box-shadow); + font-size: inherit; + max-width: 250px; + padding: var(--px-4); + font-family: var(--font-family); + color: hsl(var(--color-neutral)); + max-height: min( + calc(var(--radix-dropdown-menu-content-available-height) - 10px), + 400px + ); + overflow-y: scroll; +} + +.graphiql-dropdown-item { + border-radius: var(--border-radius-4); + font-size: inherit; + margin: var(--px-4); + overflow: hidden; + padding: var(--px-6) var(--px-8); + text-overflow: ellipsis; + white-space: nowrap; + outline: none; + cursor: pointer; + line-height: var(--line-height) +} + +.graphiql-dropdown-item[data-selected], + .graphiql-dropdown-item[data-current-nav], + .graphiql-dropdown-item:hover { + background-color: hsla(var(--color-neutral), var(--alpha-background-light)); + color: inherit; + } + +.graphiql-dropdown-item:not(:first-child) { + margin-top: 0; + } +/** + * We render markdown in the following places: + * - In the hint tooltip when typing in the query editor (field description + * and, optionally, deprecation reason). + * - In the info tooltip when hovering over a field in the query editor + * (field description and, optionally, deprecation reason). + */ + +:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) blockquote { + margin-left: 0; + margin-right: 0; + padding-left: var(--px-8); + } + +:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) code, + :is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) pre { + border-radius: var(--border-radius-4); + font-family: var(--font-family-mono); + font-size: var(--font-size-inline-code); + } + +:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) code { + padding: var(--px-2); + } + +:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) pre { + overflow: auto; + padding: var(--px-6) var(--px-8); + } + +:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) pre code { + background-color: initial; + border-radius: 0; + padding: 0; + } + +:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) ol, + :is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) ul { + padding-left: var(--px-16); + } + +:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) ol { + list-style-type: decimal; + } + +:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) ul { + list-style-type: disc; + } + +:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) img { + border-radius: var(--border-radius-4); + max-height: 120px; + max-width: 100%; + } + +:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) > :first-child { + margin-top: 0; + } + +:is(.graphiql-markdown-description,.graphiql-markdown-deprecation,.CodeMirror-hint-information-description,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-description,.CodeMirror-info .info-deprecation) > :last-child { + margin-bottom: 0; + } + +:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) a { + color: hsl(var(--color-primary)); + text-decoration: none + } + +:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) a:hover { + text-decoration: underline; + } + +:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) blockquote { + border-left: 1.5px solid hsla(var(--color-neutral), var(--alpha-tertiary)); + } + +:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) code, + :is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) pre { + background-color: hsla(var(--color-neutral), var(--alpha-background-light)); + color: hsl(var(--color-neutral)); + } + +:is(.graphiql-markdown-description,.CodeMirror-hint-information-description,.CodeMirror-info .info-description) > * { + margin: var(--px-12) 0; + } + +:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation) a { + color: hsl(var(--color-warning)); + text-decoration: underline; + } + +:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation) blockquote { + border-left: 1.5px solid hsl(var(--color-warning)); + } + +:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation) code, + :is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation) pre { + background-color: hsla(var(--color-warning), var(--alpha-background-heavy)); + } + +:is(.graphiql-markdown-deprecation,.CodeMirror-hint-information-deprecation-reason,.CodeMirror-info .info-deprecation) > * { + margin: var(--px-8) 0; + } + +.graphiql-markdown-preview > :not(:first-child) { + display: none; +} + +/** + * We show deprecations in the following places: + * - In the hint tooltip when typing in the query editor. + * - In the info tooltip when hovering over a field in the query editor. + */ + +.CodeMirror-hint-information-deprecation, +.CodeMirror-info .info-deprecation { + background-color: hsla(var(--color-warning), var(--alpha-background-light)); + border: 1px solid hsl(var(--color-warning)); + border-radius: var(--border-radius-4); + color: hsl(var(--color-warning)); + margin-top: var(--px-12); + padding: var(--px-6) var(--px-8); +} + +.CodeMirror-hint-information-deprecation-label, +.CodeMirror-info .info-deprecation-label { + font-size: var(--font-size-hint); + font-weight: var(--font-weight-medium); +} + +.CodeMirror-hint-information-deprecation-reason, +.CodeMirror-info .info-deprecation-reason { + margin-top: var(--px-6); +} +.graphiql-spinner { + height: 56px; + margin: auto; + margin-top: var(--px-16); + width: 56px +} + +.graphiql-spinner::after { + animation: rotation 0.8s linear 0s infinite; + border: 4px solid transparent; + border-radius: 100%; + border-top: 4px solid hsla(var(--color-neutral), var(--alpha-tertiary)); + content: ''; + display: inline-block; + height: 46px; + vertical-align: middle; + width: 46px; + } + +@keyframes rotation { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} +.graphiql-tooltip { + background: hsl(var(--color-base)); + border: var(--popover-border); + border-radius: var(--border-radius-4); + box-shadow: var(--popover-box-shadow); + color: hsl(var(--color-neutral)); + font-size: inherit; + padding: var(--px-4) var(--px-6); + font-family: var(--font-family); +} +.graphiql-tabs { + display: flex; + align-items: center; + overflow-x: auto; + padding: var(--px-12) +} + +.graphiql-tabs > :not(:first-child) { + margin-left: var(--px-12); + } + +.graphiql-tab { + align-items: stretch; + border-radius: var(--border-radius-8); + color: hsla(var(--color-neutral), var(--alpha-secondary)); + display: flex +} + +.graphiql-tab > button.graphiql-tab-close { + visibility: hidden; + } + +.graphiql-tab.graphiql-tab-active > button.graphiql-tab-close, + .graphiql-tab:hover > button.graphiql-tab-close, + .graphiql-tab:focus-within > button.graphiql-tab-close { + visibility: unset; + } + +.graphiql-tab.graphiql-tab-active { + background-color: hsla(var(--color-neutral), var(--alpha-background-heavy)); + color: hsla(var(--color-neutral), 1); + } + +button.graphiql-tab-button { + padding: var(--px-4) 0 var(--px-4) var(--px-8); +} + +button.graphiql-tab-close { + align-items: center; + display: flex; + padding: var(--px-4) var(--px-8) +} + +button.graphiql-tab-close > svg { + height: var(--px-8); + width: var(--px-8); + } +.graphiql-history-header { + font-size: var(--font-size-h2); + font-weight: var(--font-weight-medium); + display: flex; + justify-content: space-between; + align-items: center; +} + +.graphiql-history-header button { + font-size: var(--font-size-inline-code); + padding: var(--px-6) var(--px-10); +} + +.graphiql-history-items { + margin: var(--px-16) 0 0; + list-style: none; + padding: 0; +} + +.graphiql-history-item { + border-radius: var(--border-radius-4); + color: hsla(var(--color-neutral), var(--alpha-secondary)); + display: flex; + font-size: var(--font-size-inline-code); + font-family: var(--font-family-mono); + height: 34px +} + +.graphiql-history-item:hover { + color: hsl(var(--color-neutral)); + background-color: hsla(var(--color-neutral), var(--alpha-background-light)); + } + +.graphiql-history-item:not(:first-child) { + margin-top: var(--px-4); + } + +.graphiql-history-item.editable { + background-color: hsla( + var(--color-primary), + var(--alpha-background-medium) + ) + } + +.graphiql-history-item.editable > input { + background: transparent; + border: none; + flex: 1; + margin: 0; + outline: none; + padding: 0 var(--px-10); + width: 100% + } + +.graphiql-history-item.editable > input::placeholder { + color: hsla(var(--color-neutral), var(--alpha-secondary)); + } + +.graphiql-history-item.editable > button { + color: hsl(var(--color-primary)); + padding: 0 var(--px-10) + } + +.graphiql-history-item.editable > button:active { + background-color: hsla( + var(--color-primary), + var(--alpha-background-heavy) + ); + } + +.graphiql-history-item.editable > button:focus { + outline: hsl(var(--color-primary)) auto 1px; + } + +.graphiql-history-item.editable > button > svg { + display: block; + } + +button.graphiql-history-item-label { + flex: 1; + padding: var(--px-8) var(--px-10); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +button.graphiql-history-item-action { + align-items: center; + color: hsla(var(--color-neutral), var(--alpha-secondary)); + display: flex; + padding: var(--px-8) var(--px-6) +} + +button.graphiql-history-item-action:hover { + color: hsl(var(--color-neutral)); + } + +button.graphiql-history-item-action > svg { + height: 14px; + width: 14px; + } + +.graphiql-history-item-spacer { + height: var(--px-16); +} +.graphiql-doc-explorer-default-value { + color: hsl(var(--color-success)); +} +a.graphiql-doc-explorer-type-name { + color: hsl(var(--color-warning)); + text-decoration: none +} +a.graphiql-doc-explorer-type-name:hover { + text-decoration: underline; + } +a.graphiql-doc-explorer-type-name:focus { + outline: hsl(var(--color-warning)) auto 1px; + } + + .graphiql-doc-explorer-argument > * + * { + margin-top: var(--px-12); + } + +.graphiql-doc-explorer-argument-name { + color: hsl(var(--color-secondary)); +} + +.graphiql-doc-explorer-argument-deprecation { + background-color: hsla(var(--color-warning), var(--alpha-background-light)); + border: 1px solid hsl(var(--color-warning)); + border-radius: var(--border-radius-4); + color: hsl(var(--color-warning)); + padding: var(--px-8); +} + +.graphiql-doc-explorer-argument-deprecation-label { + font-size: var(--font-size-hint); + font-weight: var(--font-weight-medium); +} +.graphiql-doc-explorer-deprecation { + background-color: hsla(var(--color-warning), var(--alpha-background-light)); + border: 1px solid hsl(var(--color-warning)); + border-radius: var(--px-4); + color: hsl(var(--color-warning)); + padding: var(--px-8); +} + +.graphiql-doc-explorer-deprecation-label { + font-size: var(--font-size-hint); + font-weight: var(--font-weight-medium); +} +.graphiql-doc-explorer-directive { + color: hsl(var(--color-secondary)); +} +.graphiql-doc-explorer-section-title { + align-items: center; + display: flex; + font-size: var(--font-size-hint); + font-weight: var(--font-weight-medium); + line-height: 1 +} + +.graphiql-doc-explorer-section-title > svg { + height: var(--px-16); + margin-right: var(--px-8); + width: var(--px-16); + } + +.graphiql-doc-explorer-section-content { + margin-left: var(--px-8); + margin-top: var(--px-16) +} + +.graphiql-doc-explorer-section-content > * + * { + margin-top: var(--px-16); + } +.graphiql-doc-explorer-root-type { + color: hsl(var(--color-info)); +} +.graphiql-doc-explorer-search { + color: hsla(var(--color-neutral), var(--alpha-secondary)) +} + +.graphiql-doc-explorer-search:not([data-state='idle']) { + border: var(--popover-border); + border-radius: var(--border-radius-4); + box-shadow: var(--popover-box-shadow); + color: hsl(var(--color-neutral)) + } + +.graphiql-doc-explorer-search:not([data-state='idle']) .graphiql-doc-explorer-search-input { + background: hsl(var(--color-base)); + } + +.graphiql-doc-explorer-search-input { + align-items: center; + background-color: hsla(var(--color-neutral), var(--alpha-background-light)); + border-radius: var(--border-radius-4); + display: flex; + padding: var(--px-8) var(--px-12); +} + +.graphiql-doc-explorer-search [role='combobox'] { + border: none; + background-color: transparent; + margin-left: var(--px-4); + width: 100% +} + +.graphiql-doc-explorer-search [role='combobox']:focus { + outline: none; + } + +.graphiql-doc-explorer-search [role='listbox'] { + background-color: hsl(var(--color-base)); + border: none; + border-bottom-left-radius: var(--border-radius-4); + border-bottom-right-radius: var(--border-radius-4); + border-top: 1px solid + hsla(var(--color-neutral), var(--alpha-background-heavy)); + max-height: 400px; + overflow-y: auto; + margin: 0; + font-size: var(--font-size-body); + padding: var(--px-4); + /** + * This makes sure that the logic for auto-scrolling the search results when + * using keyboard navigation works properly (we use `offsetTop` there). + */ + position: relative; +} + +.graphiql-doc-explorer-search [role='option'] { + border-radius: var(--border-radius-4); + color: hsla(var(--color-neutral), var(--alpha-secondary)); + overflow-x: hidden; + padding: var(--px-8) var(--px-12); + text-overflow: ellipsis; + white-space: nowrap; + cursor: pointer +} + +.graphiql-doc-explorer-search [role='option'][data-headlessui-state='active'] { + background-color: hsla(var(--color-neutral), var(--alpha-background-light)); + } + +.graphiql-doc-explorer-search [role='option']:hover { + background-color: hsla( + var(--color-neutral), + var(--alpha-background-medium) + ); + } + +.graphiql-doc-explorer-search [role='option'][data-headlessui-state='active']:hover { + background-color: hsla(var(--color-neutral), var(--alpha-background-heavy)); + } + +:is(.graphiql-doc-explorer-search [role='option']) + :is(.graphiql-doc-explorer-search [role='option']) { + margin-top: var(--px-4); + } + +.graphiql-doc-explorer-search-type { + color: hsl(var(--color-info)); +} + +.graphiql-doc-explorer-search-field { + color: hsl(var(--color-warning)); +} + +.graphiql-doc-explorer-search-argument { + color: hsl(var(--color-secondary)); +} + +.graphiql-doc-explorer-search-divider { + color: hsla(var(--color-neutral), var(--alpha-secondary)); + font-size: var(--font-size-hint); + font-weight: var(--font-weight-medium); + margin-top: var(--px-8); + padding: var(--px-8) var(--px-12); +} + +.graphiql-doc-explorer-search-empty { + color: hsla(var(--color-neutral), var(--alpha-secondary)); + padding: var(--px-8) var(--px-12); +} +a.graphiql-doc-explorer-field-name { + color: hsl(var(--color-info)); + text-decoration: none +} +a.graphiql-doc-explorer-field-name:hover { + text-decoration: underline; + } +a.graphiql-doc-explorer-field-name:focus { + outline: hsl(var(--color-info)) auto 1px; + } +.graphiql-doc-explorer-item > :not(:first-child) { + margin-top: var(--px-12); +} + +.graphiql-doc-explorer-argument-multiple { + margin-left: var(--px-8); +} + +.graphiql-doc-explorer-enum-value { + color: hsl(var(--color-info)); +} +/* The header of the doc explorer */ +.graphiql-doc-explorer-header { + display: flex; + justify-content: space-between; + position: relative +} +.graphiql-doc-explorer-header:focus-within .graphiql-doc-explorer-title { + /* Hide the header when focussing the search input */ + visibility: hidden; + } +.graphiql-doc-explorer-header:focus-within .graphiql-doc-explorer-back:not(:focus) { + /** + * Make the back link invisible when focussing the search input. Hiding + * it in any other way makes it impossible to focus the link by pressing + * Shift-Tab while the input is focussed. + */ + color: transparent; + } +.graphiql-doc-explorer-header-content { + display: flex; + flex-direction: column; + min-width: 0; +} + +/* The search input in the header of the doc explorer */ +.graphiql-doc-explorer-search { + position: absolute; + right: 0; + top: 0 +} +.graphiql-doc-explorer-search:focus-within { + left: 0; + } +.graphiql-doc-explorer-search:not(:focus-within) [role='combobox'] { + height: 24px; + width: 5ch; + } +.graphiql-doc-explorer-search [role='combobox']:focus { + width: 100%; + } + +/* The back-button in the doc explorer */ +a.graphiql-doc-explorer-back { + align-items: center; + color: hsla(var(--color-neutral), var(--alpha-secondary)); + display: flex; + text-decoration: none +} +a.graphiql-doc-explorer-back:hover { + text-decoration: underline; + } +a.graphiql-doc-explorer-back:focus { + outline: hsla(var(--color-neutral), var(--alpha-secondary)) auto 1px + } +a.graphiql-doc-explorer-back:focus + .graphiql-doc-explorer-title { + /* Don't hide the header when focussing the back link */ + visibility: unset; + } +a.graphiql-doc-explorer-back > svg { + height: var(--px-8); + margin-right: var(--px-8); + width: var(--px-8); + } + +/* The title of the currently active page in the doc explorer */ +.graphiql-doc-explorer-title { + font-weight: var(--font-weight-medium); + font-size: var(--font-size-h2); + overflow-x: hidden; + text-overflow: ellipsis; + white-space: nowrap +} +.graphiql-doc-explorer-title:not(:first-child) { + font-size: var(--font-size-h3); + margin-top: var(--px-8); + } + +/* The contents of the currently active page in the doc explorer */ +.graphiql-doc-explorer-content > * { + color: hsla(var(--color-neutral), var(--alpha-secondary)); + margin-top: var(--px-20); +} + +/* Error message */ +.graphiql-doc-explorer-error { + background-color: hsla(var(--color-error), var(--alpha-background-heavy)); + border: 1px solid hsl(var(--color-error)); + border-radius: var(--border-radius-8); + color: hsl(var(--color-error)); + padding: var(--px-8) var(--px-12); +} +/* BASICS */ + +.CodeMirror { + /* Set height, width, borders, and global font properties here */ + font-family: monospace; + height: 300px; + color: black; + direction: ltr; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} + +.CodeMirror pre.CodeMirror-line, +.CodeMirror pre.CodeMirror-line-like { + padding: 0 4px; /* Horizontal padding of content */ +} + +.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + border-right: 1px solid #ddd; + background-color: #f7f7f7; + white-space: nowrap; +} + +.CodeMirror-linenumbers {} + +.CodeMirror-linenumber { + padding: 0 3px 0 5px; + min-width: 20px; + text-align: right; + color: #999; + white-space: nowrap; +} + +.CodeMirror-guttermarker { color: black; } + +.CodeMirror-guttermarker-subtle { color: #999; } + +/* CURSOR */ + +.CodeMirror-cursor { + border-left: 1px solid black; + border-right: none; + width: 0; +} + +/* Shown when moving in bi-directional text */ + +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} + +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + border: 0 !important; + background: #7e7; +} + +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} + +.cm-fat-cursor .CodeMirror-line::selection, +.cm-fat-cursor .CodeMirror-line > span::selection, +.cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; } + +.cm-fat-cursor .CodeMirror-line::-moz-selection, +.cm-fat-cursor .CodeMirror-line > span::-moz-selection, +.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; } + +.cm-fat-cursor { caret-color: transparent; } + +@-moz-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +@-webkit-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +@keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +/* Can style cursor different in overwrite (non-insert) mode */ + +.CodeMirror-overwrite .CodeMirror-cursor {} + +.cm-tab { display: inline-block; text-decoration: inherit; } + +.CodeMirror-rulers { + position: absolute; + left: 0; right: 0; top: -50px; bottom: 0; + overflow: hidden; +} + +.CodeMirror-ruler { + border-left: 1px solid #ccc; + top: 0; bottom: 0; + position: absolute; +} + +/* DEFAULT THEME */ + +.cm-s-default .cm-header {color: blue;} + +.cm-s-default .cm-quote {color: #090;} + +.cm-negative {color: #d44;} + +.cm-positive {color: #292;} + +.cm-header, .cm-strong {font-weight: bold;} + +.cm-em {font-style: italic;} + +.cm-link {text-decoration: underline;} + +.cm-strikethrough {text-decoration: line-through;} + +.cm-s-default .cm-keyword {color: #708;} + +.cm-s-default .cm-atom {color: #219;} + +.cm-s-default .cm-number {color: #164;} + +.cm-s-default .cm-def {color: #00f;} + +.cm-s-default .cm-variable, +.cm-s-default .cm-punctuation, +.cm-s-default .cm-property, +.cm-s-default .cm-operator {} + +.cm-s-default .cm-variable-2 {color: #05a;} + +.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;} + +.cm-s-default .cm-comment {color: #a50;} + +.cm-s-default .cm-string {color: #a11;} + +.cm-s-default .cm-string-2 {color: #f50;} + +.cm-s-default .cm-meta {color: #555;} + +.cm-s-default .cm-qualifier {color: #555;} + +.cm-s-default .cm-builtin {color: #30a;} + +.cm-s-default .cm-bracket {color: #997;} + +.cm-s-default .cm-tag {color: #170;} + +.cm-s-default .cm-attribute {color: #00c;} + +.cm-s-default .cm-hr {color: #999;} + +.cm-s-default .cm-link {color: #00c;} + +.cm-s-default .cm-error {color: #f00;} + +.cm-invalidchar {color: #f00;} + +.CodeMirror-composing { border-bottom: 2px solid; } + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} + +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} + +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } + +.CodeMirror-activeline-background {background: #e8f2ff;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + position: relative; + overflow: hidden; + background: white; +} + +.CodeMirror-scroll { + overflow: scroll !important; /* Things will break if this is overridden */ + /* 50px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -50px; margin-right: -50px; + padding-bottom: 50px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; + z-index: 0; +} + +.CodeMirror-sizer { + position: relative; + border-right: 50px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actual scrolling happens, thus preventing shaking and + flickering artifacts. */ + +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; + outline: none; +} + +.CodeMirror-vscrollbar { + right: 0; top: 0; + overflow-x: hidden; + overflow-y: scroll; +} + +.CodeMirror-hscrollbar { + bottom: 0; left: 0; + overflow-y: hidden; + overflow-x: scroll; +} + +.CodeMirror-scrollbar-filler { + right: 0; bottom: 0; +} + +.CodeMirror-gutter-filler { + left: 0; bottom: 0; +} + +.CodeMirror-gutters { + position: absolute; left: 0; top: 0; + min-height: 100%; + z-index: 3; +} + +.CodeMirror-gutter { + white-space: normal; + height: 100%; + display: inline-block; + vertical-align: top; + margin-bottom: -50px; +} + +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} + +.CodeMirror-gutter-background { + position: absolute; + top: 0; bottom: 0; + z-index: 4; +} + +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} + +.CodeMirror-gutter-wrapper ::selection { background-color: transparent } + +.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } + +.CodeMirror-lines { + cursor: text; + min-height: 1px; /* prevents collapsing before first draw */ +} + +.CodeMirror pre.CodeMirror-line, +.CodeMirror pre.CodeMirror-line-like { + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; + border-width: 0; + background: transparent; + font-family: inherit; + font-size: inherit; + margin: 0; + white-space: pre; + word-wrap: normal; + line-height: inherit; + color: inherit; + z-index: 2; + position: relative; + overflow: visible; + -webkit-tap-highlight-color: transparent; + -webkit-font-variant-ligatures: contextual; + font-variant-ligatures: contextual; +} + +.CodeMirror-wrap pre.CodeMirror-line, +.CodeMirror-wrap pre.CodeMirror-line-like { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} + +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + padding: 0.1px; /* Force widget margins to stay inside of the container */ +} + +.CodeMirror-widget {} + +.CodeMirror-rtl pre { direction: rtl; } + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ + +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-cursor { + position: absolute; + pointer-events: none; +} + +.CodeMirror-measure pre { position: static; } + +div.CodeMirror-cursors { + visibility: hidden; + position: relative; + z-index: 3; +} + +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } + +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } + +.CodeMirror-crosshair { cursor: crosshair; } + +.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } + +.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } + +.cm-searching { + background-color: #ffa; + background-color: rgba(255, 255, 0, .4); +} + +/* Used to force a border model for a node */ + +.cm-force-border { padding-right: .1px; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ + +.cm-tab-wrap-hack:after { content: ''; } + +/* Help users use markselection to safely style text background */ + +span.CodeMirror-selectedtext { background: none; } + +/* Make the editors fill up their container and make them scrollable */ + +.graphiql-container .CodeMirror { + height: 100%; + position: absolute; + width: 100%; +} + +/* Override font settings */ + +.graphiql-container .CodeMirror { + font-family: var(--font-family-mono); +} + +/* Set default background color */ + +.graphiql-container .CodeMirror, +.graphiql-container .CodeMirror-gutters { + background: none; + background-color: var(--editor-background, hsl(var(--color-base))); +} + +/* No padding around line numbers */ + +.graphiql-container .CodeMirror-linenumber { + padding: 0; +} + +/* No border between gutter and editor */ + +.graphiql-container .CodeMirror-gutters { + border: none; +} + +/** + * Editor theme + */ + +.cm-s-graphiql { + /* Default to punctuation */ + color: hsla(var(--color-neutral), var(--alpha-tertiary)) + + /* OperationType, `fragment`, `on` */ +} + +.cm-s-graphiql .cm-keyword { + color: hsl(var(--color-primary)); + } + +/* Name (OperationDefinition), FragmentName */ + +.cm-s-graphiql .cm-def { + color: hsl(var(--color-tertiary)); + } + +/* Punctuator (except `$` and `@`) */ + +.cm-s-graphiql .cm-punctuation { + color: hsla(var(--color-neutral), var(--alpha-tertiary)); + } + +/* Variable */ + +.cm-s-graphiql .cm-variable { + color: hsl(var(--color-secondary)); + } + +/* NamedType */ + +.cm-s-graphiql .cm-atom { + color: hsl(var(--color-tertiary)); + } + +/* IntValue, FloatValue */ + +.cm-s-graphiql .cm-number { + color: hsl(var(--color-success)); + } + +/* StringValue */ + +.cm-s-graphiql .cm-string { + color: hsl(var(--color-warning)); + } + +/* BooleanValue */ + +.cm-s-graphiql .cm-builtin { + color: hsl(var(--color-success)); + } + +/* EnumValue */ + +.cm-s-graphiql .cm-string-2 { + color: hsl(var(--color-secondary)); + } + +/* Name (ObjectField, Argument) */ + +.cm-s-graphiql .cm-attribute { + color: hsl(var(--color-tertiary)); + } + +/* Name (Directive) */ + +.cm-s-graphiql .cm-meta { + color: hsl(var(--color-tertiary)); + } + +/* Name (Alias, Field without Alias) */ + +.cm-s-graphiql .cm-property { + color: hsl(var(--color-info)); + } + +/* Name (Field with Alias) */ + +.cm-s-graphiql .cm-qualifier { + color: hsl(var(--color-secondary)); + } + +/* Comment */ + +.cm-s-graphiql .cm-comment { + color: hsla(var(--color-neutral), var(--alpha-secondary)); + } + +/* Whitespace */ + +.cm-s-graphiql .cm-ws { + color: hsla(var(--color-neutral), var(--alpha-tertiary)); + } + +/* Invalid characters */ + +.cm-s-graphiql .cm-invalidchar { + color: hsl(var(--color-error)); + } + +/* Cursor */ + +.cm-s-graphiql .CodeMirror-cursor { + border-left: 2px solid hsla(var(--color-neutral), var(--alpha-secondary)); + } + +/* Color for line numbers and fold-gutters */ + +.cm-s-graphiql .CodeMirror-linenumber { + color: hsla(var(--color-neutral), var(--alpha-tertiary)); + } + +/* Matching bracket colors */ + +.graphiql-container div.CodeMirror span.CodeMirror-matchingbracket, +.graphiql-container div.CodeMirror span.CodeMirror-nonmatchingbracket { + color: hsl(var(--color-warning)); +} + +/* Selected text blocks */ + +.graphiql-container .CodeMirror-selected, +.graphiql-container .CodeMirror-focused .CodeMirror-selected { + background: hsla(var(--color-neutral), var(--alpha-background-heavy)); +} + +/* Position the search dialog */ + +.graphiql-container .CodeMirror-dialog { + background: inherit; + color: inherit; + left: 0; + right: 0; + overflow: hidden; + padding: var(--px-2) var(--px-6); + position: absolute; + z-index: 6; +} + +.graphiql-container .CodeMirror-dialog-top { + border-bottom: 1px solid + hsla(var(--color-neutral), var(--alpha-background-heavy)); + padding-bottom: var(--px-12); + top: 0; +} + +.graphiql-container .CodeMirror-dialog-bottom { + border-top: 1px solid + hsla(var(--color-neutral), var(--alpha-background-heavy)); + bottom: 0; + padding-top: var(--px-12); +} + +/* Hide the search hint */ + +.graphiql-container .CodeMirror-search-hint { + display: none; +} + +/* Style the input field for searching */ + +.graphiql-container .CodeMirror-dialog input { + border: 1px solid hsla(var(--color-neutral), var(--alpha-background-heavy)); + border-radius: var(--border-radius-4); + padding: var(--px-4); +} + +.graphiql-container .CodeMirror-dialog input:focus { + outline: hsl(var(--color-primary)) solid 2px; +} + +/* Set the highlight color for search results */ + +.graphiql-container .cm-searching { + background-color: hsla(var(--color-warning), var(--alpha-background-light)); + /** + * When cycling through search results, CodeMirror overlays the current + * selection with another element that has the .CodeMirror-selected class + * applied. This adds another background color (see above), but this extra + * box does not quite match the height of this element. To match them up we + * add some extra padding here. (Note that this doesn't affect the line + * height of the CodeMirror editor as all line wrappers have a fixed height.) + */ + padding-bottom: 1.5px; + padding-top: 0.5px; +} +.CodeMirror-foldmarker { + color: blue; + text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px; + font-family: arial; + line-height: .3; + cursor: pointer; +} +.CodeMirror-foldgutter { + width: .7em; +} +.CodeMirror-foldgutter-open, +.CodeMirror-foldgutter-folded { + cursor: pointer; +} +.CodeMirror-foldgutter-open:after { + content: "\25BE"; +} +.CodeMirror-foldgutter-folded:after { + content: "\25B8"; +} +.CodeMirror-foldgutter { + width: var(--px-12); +} +.CodeMirror-foldmarker { + background-color: hsl(var(--color-info)); + border-radius: var(--border-radius-4); + color: hsl(var(--color-base)); + font-family: inherit; + margin: 0 var(--px-4); + padding: 0 var(--px-8); + text-shadow: none; +} +.CodeMirror-foldgutter-open, +.CodeMirror-foldgutter-folded { + color: hsla(var(--color-neutral), var(--alpha-tertiary)) +} +.CodeMirror-foldgutter-open::after, .CodeMirror-foldgutter-folded::after { + margin: 0 var(--px-2); + } +.graphiql-editor { + height: 100%; + position: relative; + width: 100% +} +.graphiql-editor.hidden { + /* Just setting `display: none;` would break the editor gutters */ + left: -9999px; + position: absolute; + top: -9999px; + visibility: hidden; + } +/* The lint marker gutter */ +.CodeMirror-lint-markers { + width: 16px; +} +.CodeMirror-lint-tooltip { + background-color: #ffd; + border: 1px solid black; + border-radius: 4px 4px 4px 4px; + color: black; + font-family: monospace; + font-size: 10pt; + overflow: hidden; + padding: 2px 5px; + position: fixed; + white-space: pre; + white-space: pre-wrap; + z-index: 100; + max-width: 600px; + opacity: 0; + transition: opacity .4s; + -moz-transition: opacity .4s; + -webkit-transition: opacity .4s; + -o-transition: opacity .4s; + -ms-transition: opacity .4s; +} +.CodeMirror-lint-mark { + background-position: left bottom; + background-repeat: repeat-x; +} +.CodeMirror-lint-mark-warning { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=); +} +.CodeMirror-lint-mark-error { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==); +} +.CodeMirror-lint-marker { + background-position: center center; + background-repeat: no-repeat; + cursor: pointer; + display: inline-block; + height: 16px; + width: 16px; + vertical-align: middle; + position: relative; +} +.CodeMirror-lint-message { + padding-left: 18px; + background-position: top left; + background-repeat: no-repeat; +} +.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=); +} +.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=); +} +.CodeMirror-lint-marker-multiple { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC); + background-repeat: no-repeat; + background-position: right bottom; + width: 100%; height: 100%; +} +.CodeMirror-lint-line-error { + background-color: rgba(183, 76, 81, 0.08); +} +.CodeMirror-lint-line-warning { + background-color: rgba(255, 211, 0, 0.1); +} +/* Text styles */ +.CodeMirror-lint-mark-error, +.CodeMirror-lint-mark-warning { + background-repeat: repeat-x; + /** + * The following two are very specific to the font size, so we use + * "magic values" instead of variables. + */ + background-size: 10px 3px; + background-position: 0 95%; +} +.cm-s-graphiql .CodeMirror-lint-mark-error { + color: hsl(var(--color-error)); +} +.CodeMirror-lint-mark-error { + background-image: linear-gradient( + 45deg, + transparent 65%, + hsl(var(--color-error)) 80%, + transparent 90% + ), + linear-gradient( + 135deg, + transparent 5%, + hsl(var(--color-error)) 15%, + transparent 25% + ), + linear-gradient( + 135deg, + transparent 45%, + hsl(var(--color-error)) 55%, + transparent 65% + ), + linear-gradient( + 45deg, + transparent 25%, + hsl(var(--color-error)) 35%, + transparent 50% + ); +} +.cm-s-graphiql .CodeMirror-lint-mark-warning { + color: hsl(var(--color-warning)); +} +.CodeMirror-lint-mark-warning { + background-image: linear-gradient( + 45deg, + transparent 65%, + hsl(var(--color-warning)) 80%, + transparent 90% + ), + linear-gradient( + 135deg, + transparent 5%, + hsl(var(--color-warning)) 15%, + transparent 25% + ), + linear-gradient( + 135deg, + transparent 45%, + hsl(var(--color-warning)) 55%, + transparent 65% + ), + linear-gradient( + 45deg, + transparent 25%, + hsl(var(--color-warning)) 35%, + transparent 50% + ); +} +/* Popup styles */ +.CodeMirror-lint-tooltip { + background-color: hsl(var(--color-base)); + border: var(--popover-border); + border-radius: var(--border-radius-8); + box-shadow: var(--popover-box-shadow); + font-size: var(--font-size-body); + font-family: var(--font-family); + max-width: 600px; + overflow: hidden; + padding: var(--px-12); +} +.CodeMirror-lint-message-error, +.CodeMirror-lint-message-warning { + background-image: none; + padding: 0; +} +.CodeMirror-lint-message-error { + color: hsl(var(--color-error)); +} +.CodeMirror-lint-message-warning { + color: hsl(var(--color-warning)); +} +.CodeMirror-hints { + position: absolute; + z-index: 10; + overflow: hidden; + list-style: none; + + margin: 0; + padding: 2px; + + -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); + -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); + box-shadow: 2px 3px 5px rgba(0,0,0,.2); + border-radius: 3px; + border: 1px solid silver; + + background: white; + font-size: 90%; + font-family: monospace; + + max-height: 20em; + overflow-y: auto; +} + +.CodeMirror-hint { + margin: 0; + padding: 0 4px; + border-radius: 2px; + white-space: pre; + color: black; + cursor: pointer; +} + +li.CodeMirror-hint-active { + background: #08f; + color: white; +} + +/* Popup styles */ + +.CodeMirror-hints { + background: hsl(var(--color-base)); + border: var(--popover-border); + border-radius: var(--border-radius-8); + box-shadow: var(--popover-box-shadow); + display: grid; + font-family: var(--font-family); + font-size: var(--font-size-body); + grid-template-columns: auto fit-content(300px); + /* By default this is equals exactly 8 items including margins */ + max-height: 264px; + padding: 0; +} + +/* Autocomplete items */ + +.CodeMirror-hint { + border-radius: var(--border-radius-4); + color: hsla(var(--color-neutral), var(--alpha-secondary)); + grid-column: 1 / 2; + margin: var(--px-4); + /* Override element style added by codemirror */ + padding: var(--px-6) var(--px-8) !important +} + +.CodeMirror-hint:not(:first-child) { + margin-top: 0; + } + +li.CodeMirror-hint-active { + background: hsla(var(--color-primary), var(--alpha-background-medium)); + color: hsl(var(--color-primary)); +} + +/* Sidebar with additional information */ + +.CodeMirror-hint-information { + border-left: 1px solid + hsla(var(--color-neutral), var(--alpha-background-heavy)); + grid-column: 2 / 3; + grid-row: 1 / 99999; + /* Same as the popup */ + max-height: 264px; + overflow: auto; + padding: var(--px-12); +} + +.CodeMirror-hint-information-header { + display: flex; + align-items: baseline; +} + +.CodeMirror-hint-information-field-name { + font-size: var(--font-size-h4); + font-weight: var(--font-weight-medium); +} + +.CodeMirror-hint-information-type-name-pill { + border: 1px solid hsla(var(--color-neutral), var(--alpha-tertiary)); + border-radius: var(--border-radius-4); + color: hsla(var(--color-neutral), var(--alpha-secondary)); + margin-left: var(--px-6); + padding: var(--px-4); +} + +.CodeMirror-hint-information-type-name { + color: inherit; + text-decoration: none +} + +.CodeMirror-hint-information-type-name:hover { + text-decoration: underline dotted; + } + +.CodeMirror-hint-information-description { + color: hsla(var(--color-neutral), var(--alpha-secondary)); + margin-top: var(--px-12); +} +/* Popup styles */ +.CodeMirror-info { + background-color: hsl(var(--color-base)); + border: var(--popover-border); + border-radius: var(--border-radius-8); + box-shadow: var(--popover-box-shadow); + color: hsl(var(--color-neutral)); + max-height: 300px; + max-width: 400px; + opacity: 0; + overflow: auto; + padding: var(--px-12); + position: fixed; + transition: opacity 0.15s; + z-index: 10 + + /* Link styles */ +} +.CodeMirror-info a { + color: inherit; + text-decoration: none + } +.CodeMirror-info a:hover { + text-decoration: underline dotted; + } +/* Align elements in header */ +.CodeMirror-info .CodeMirror-info-header { + display: flex; + align-items: baseline; + } +/* Main elements */ +.CodeMirror-info .CodeMirror-info-header > .type-name, + .CodeMirror-info .CodeMirror-info-header > .field-name, + .CodeMirror-info .CodeMirror-info-header > .arg-name, + .CodeMirror-info .CodeMirror-info-header > .directive-name, + .CodeMirror-info .CodeMirror-info-header > .enum-value { + font-size: var(--font-size-h4); + font-weight: var(--font-weight-medium); + } +/* Type names */ +.CodeMirror-info .type-name-pill { + border: 1px solid hsla(var(--color-neutral), var(--alpha-tertiary)); + border-radius: var(--border-radius-4); + color: hsla(var(--color-neutral), var(--alpha-secondary)); + margin-left: var(--px-6); + padding: var(--px-4); + } +/* Descriptions */ +.CodeMirror-info .info-description { + color: hsla(var(--color-neutral), var(--alpha-secondary)); + margin-top: var(--px-12); + overflow: hidden; + } +/* Underline the clickable token */ +.CodeMirror-jump-token { + text-decoration: underline dotted; + cursor: pointer; +} +.auto-inserted-leaf.cm-property { + animation-duration: 6s; + animation-name: insertionFade; + border-radius: var(--border-radius-4); + padding: var(--px-2); +} + +@keyframes insertionFade { + from, + to { + background-color: none; + } + + 15%, + 85% { + background-color: hsla(var(--color-warning), var(--alpha-background-light)); + } +} +button.graphiql-toolbar-button { + display: flex; + align-items: center; + justify-content: center; + height: var(--toolbar-width); + width: var(--toolbar-width) +} +button.graphiql-toolbar-button.error { + background: hsla(var(--color-error), var(--alpha-background-heavy)); + } +.graphiql-execute-button-wrapper { + position: relative; +} + +button.graphiql-execute-button { + background-color: hsl(var(--color-primary)); + border: none; + border-radius: var(--border-radius-8); + cursor: pointer; + height: var(--toolbar-width); + padding: 0; + width: var(--toolbar-width) +} + +button.graphiql-execute-button:hover { + background-color: hsla(var(--color-primary), 0.9); + } + +button.graphiql-execute-button:active { + background-color: hsla(var(--color-primary), 0.8); + } + +button.graphiql-execute-button:focus { + outline: hsla(var(--color-primary), 0.8) auto 1px; + } + +button.graphiql-execute-button > svg { + color: white; + display: block; + height: var(--px-16); + margin: auto; + width: var(--px-16); + } +button.graphiql-toolbar-menu { + display: block; + height: var(--toolbar-width); + width: var(--toolbar-width); +} /*!*********************************************************************************************************************!*\ !*** css ../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./style.css ***! @@ -375,7 +2380,7 @@ width: calc(var(--sidebar-width) - (2 * var(--px-8))); } .graphiql-container .graphiql-sidebar button.active { - color: hsla(var(--color-neutral), 1); + color: hsl(var(--color-neutral)); } .graphiql-container .graphiql-sidebar button:not(:first-child) { margin-top: var(--px-4); @@ -491,7 +2496,7 @@ button.graphiql-tab-add > svg { color: hsla(var(--color-neutral), var(--alpha-secondary)); } .graphiql-container .graphiql-editor-tools button.active { - color: hsla(var(--color-neutral), 1); + color: hsl(var(--color-neutral)); } /* The tab buttons to switch between editor tools */ .graphiql-container diff --git a/netbox/project-static/dist/graphiql/graphiql.min.js b/netbox/project-static/dist/graphiql/graphiql.min.js index ceac0a1c44..862ce3a803 100644 --- a/netbox/project-static/dist/graphiql/graphiql.min.js +++ b/netbox/project-static/dist/graphiql/graphiql.min.js @@ -24,8 +24,7 @@ var index = (0, _memoize.default)(function (prop) { /* n */ && prop.charCodeAt(2) < 91; } /* Z+1 */); -var _default = index; -exports["default"] = _default; +var _default = exports["default"] = index; /***/ }), @@ -48,8 +47,7 @@ function memoize(fn) { return cache[arg]; }; } -var _default = memoize; -exports["default"] = _default; +var _default = exports["default"] = memoize; /***/ }), @@ -1773,7 +1771,7 @@ function getRectRelativeToOffsetParent(element, offsetParent, strategy) { height: rect.height }; } -const platform = { +const platform = exports.platform = { getClippingRect, convertOffsetParentRelativeRectToViewportRelativeRect, isElement, @@ -1810,7 +1808,6 @@ const platform = { * removed from the DOM or hidden from the screen. * @see https://floating-ui.com/docs/autoUpdate */ -exports.platform = platform; function autoUpdate(reference, floating, update, options) { if (options === void 0) { options = {}; @@ -1990,10 +1987,11 @@ Object.defineProperty(exports, "size", ({ })); exports.useFloating = useFloating; var _dom = __webpack_require__(/*! @floating-ui/dom */ "../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.esm.js"); -var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +var React = _react; var ReactDOM = _interopRequireWildcard(__webpack_require__(/*! react-dom */ "react-dom")); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /** * Provides data to position an inner element of the floating element so that it * appears centered to the reference element. @@ -2031,7 +2029,7 @@ const arrow = options => { }; }; exports.arrow = arrow; -var index = typeof document !== 'undefined' ? React.useLayoutEffect : React.useEffect; +var index = typeof document !== 'undefined' ? _react.useLayoutEffect : _react.useEffect; // Fork of `fast-deep-equal` that only does the comparisons we need and compares // functions @@ -2267,17 +2265,15 @@ exports.Animation = void 0; var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); var _easingEs = __webpack_require__(/*! ./utils/easing.es.js */ "../../../node_modules/@motionone/animation/dist/utils/easing.es.js"); class Animation { - constructor(output) { - let keyframes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 1]; - let { - easing, - duration: initialDuration = _utils.defaults.duration, - delay = _utils.defaults.delay, - endDelay = _utils.defaults.endDelay, - repeat = _utils.defaults.repeat, - offset, - direction = "normal" - } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + constructor(output, keyframes = [0, 1], { + easing, + duration: initialDuration = _utils.defaults.duration, + delay = _utils.defaults.delay, + endDelay = _utils.defaults.endDelay, + repeat = _utils.defaults.repeat, + offset, + direction = "normal" + } = {}) { this.startTime = null; this.rate = 1; this.t = 0; @@ -2525,8 +2521,7 @@ var _stopAnimationEs = __webpack_require__(/*! ./utils/stop-animation.es.js */ " function getDevToolsRecord() { return window.__MOTION_DEV_TOOLS_RECORD; } -function animateStyle(element, key, keyframesDefinition) { - let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; +function animateStyle(element, key, keyframesDefinition, options = {}) { const record = getDevToolsRecord(); const isRecording = options.record !== false && record; let animation; @@ -2747,8 +2742,7 @@ var _optionsEs = __webpack_require__(/*! ./utils/options.es.js */ "../../../node var _resolveElementsEs = __webpack_require__(/*! ../utils/resolve-elements.es.js */ "../../../node_modules/@motionone/dom/dist/utils/resolve-elements.es.js"); var _controlsEs = __webpack_require__(/*! ./utils/controls.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/controls.es.js"); var _staggerEs = __webpack_require__(/*! ../utils/stagger.es.js */ "../../../node_modules/@motionone/dom/dist/utils/stagger.es.js"); -function animate(elements, keyframes) { - let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; +function animate(elements, keyframes, options = {}) { elements = (0, _resolveElementsEs.resolveElements)(elements); const numElements = elements.length; /** @@ -2794,7 +2788,7 @@ exports.style = void 0; var _cssVarEs = __webpack_require__(/*! ./utils/css-var.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/css-var.es.js"); var _getStyleNameEs = __webpack_require__(/*! ./utils/get-style-name.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/get-style-name.es.js"); var _transformsEs = __webpack_require__(/*! ./utils/transforms.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/transforms.es.js"); -const style = { +const style = exports.style = { get: (element, name) => { name = (0, _getStyleNameEs.getStyleName)(name); let value = (0, _cssVarEs.isCssVar)(name) ? element.style.getPropertyValue(name) : getComputedStyle(element)[name]; @@ -2813,7 +2807,6 @@ const style = { } } }; -exports.style = style; /***/ }), @@ -2832,8 +2825,7 @@ exports.withControls = exports.controls = void 0; var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); var _stopAnimationEs = __webpack_require__(/*! ./stop-animation.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/stop-animation.es.js"); const createAnimation = factory => factory(); -const withControls = function (animationFactory, options) { - let duration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _utils.defaults.duration; +const withControls = (animationFactory, options, duration = _utils.defaults.duration) => { return new Proxy({ animations: animationFactory.map(createAnimation).filter(Boolean), duration, @@ -2847,7 +2839,7 @@ const withControls = function (animationFactory, options) { */ exports.withControls = withControls; const getActiveAnimation = state => state.animations[0]; -const controls = { +const controls = exports.controls = { get: (target, key) => { const activeAnimation = getActiveAnimation(target); switch (key) { @@ -2893,7 +2885,6 @@ const controls = { return false; } }; -exports.controls = controls; const selectFinished = animation => animation.finished; /***/ }), @@ -2915,8 +2906,7 @@ exports.registeredProperties = void 0; var _transformsEs = __webpack_require__(/*! ./transforms.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/transforms.es.js"); const isCssVar = name => name.startsWith("--"); exports.isCssVar = isCssVar; -const registeredProperties = new Set(); -exports.registeredProperties = registeredProperties; +const registeredProperties = exports.registeredProperties = new Set(); function registerCssVariable(name) { if (registeredProperties.has(name)) return; registeredProperties.add(name); @@ -2951,10 +2941,7 @@ exports.cubicBezierAsString = exports.convertEasing = void 0; var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); const convertEasing = easing => (0, _utils.isCubicBezier)(easing) ? cubicBezierAsString(easing) : easing; exports.convertEasing = convertEasing; -const cubicBezierAsString = _ref => { - let [a, b, c, d] = _ref; - return `cubic-bezier(${a}, ${b}, ${c}, ${d})`; -}; +const cubicBezierAsString = ([a, b, c, d]) => `cubic-bezier(${a}, ${b}, ${c}, ${d})`; exports.cubicBezierAsString = cubicBezierAsString; /***/ }), @@ -2992,8 +2979,7 @@ const featureTests = { }).finished) }; const results = {}; -const supports = {}; -exports.supports = supports; +const supports = exports.supports = {}; for (const key in featureTests) { supports[key] = () => { if (results[key] === undefined) results[key] = featureTests[key](); @@ -3084,8 +3070,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.stopAnimation = stopAnimation; -function stopAnimation(animation) { - let needsCommit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; +function stopAnimation(animation, needsCommit = true) { if (!animation || animation.playState === "finished") return; // Suppress error thrown by WAAPI try { @@ -3158,8 +3143,7 @@ exports.createStyleString = createStyleString; var _styleObjectEs = __webpack_require__(/*! ./style-object.es.js */ "../../../node_modules/@motionone/dom/dist/animate/utils/style-object.es.js"); const camelLetterToPipeLetter = letter => `-${letter.toLowerCase()}`; const camelToPipeCase = str => str.replace(/[A-Z]/g, camelLetterToPipeLetter); -function createStyleString() { - let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; +function createStyleString(target = {}) { const styles = (0, _styleObjectEs.createStyles)(target); let style = ""; for (const key in styles) { @@ -3189,19 +3173,17 @@ var _dataEs = __webpack_require__(/*! ../data.es.js */ "../../../node_modules/@m * A list of all transformable axes. We'll use this list to generated a version * of each axes for each transform. */ -const axes = ["", "X", "Y", "Z"]; +const axes = exports.axes = ["", "X", "Y", "Z"]; /** * An ordered array of each transformable value. By default, transform values * will be sorted to this order. */ -exports.axes = axes; const order = ["translate", "scale", "rotate", "skew"]; -const transformAlias = { +const transformAlias = exports.transformAlias = { x: "translateX", y: "translateY", z: "translateZ" }; -exports.transformAlias = transformAlias; const rotation = { syntax: "", initialValue: "0deg", @@ -3221,8 +3203,7 @@ const baseTransformProperties = { }, skew: rotation }; -const transformDefinitions = new Map(); -exports.transformDefinitions = transformDefinitions; +const transformDefinitions = exports.transformDefinitions = new Map(); const asTransformCssVar = name => `--motion-${name}`; /** * Generate a list of every possible transform key @@ -3281,14 +3262,9 @@ exports.createGeneratorEasing = createGeneratorEasing; var _generators = __webpack_require__(/*! @motionone/generators */ "../../../node_modules/@motionone/generators/dist/index.es.js"); function createGeneratorEasing(createGenerator) { const keyframesCache = new WeakMap(); - return function () { - let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return (options = {}) => { const generatorCache = new Map(); - const getGenerator = function () { - let from = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - let to = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100; - let velocity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; - let isScale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + const getGenerator = (from = 0, to = 100, velocity = 0, isScale = false) => { const key = `${from}-${to}-${velocity}-${isScale}`; if (!generatorCache.has(key)) { generatorCache.set(key, createGenerator(Object.assign({ @@ -3378,8 +3354,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.glide = void 0; var _generators = __webpack_require__(/*! @motionone/generators */ "../../../node_modules/@motionone/generators/dist/index.es.js"); var _createGeneratorEasingEs = __webpack_require__(/*! ../create-generator-easing.es.js */ "../../../node_modules/@motionone/dom/dist/easing/create-generator-easing.es.js"); -const glide = (0, _createGeneratorEasingEs.createGeneratorEasing)(_generators.glide); -exports.glide = glide; +const glide = exports.glide = (0, _createGeneratorEasingEs.createGeneratorEasing)(_generators.glide); /***/ }), @@ -3397,8 +3372,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.spring = void 0; var _generators = __webpack_require__(/*! @motionone/generators */ "../../../node_modules/@motionone/generators/dist/index.es.js"); var _createGeneratorEasingEs = __webpack_require__(/*! ../create-generator-easing.es.js */ "../../../node_modules/@motionone/dom/dist/easing/create-generator-easing.es.js"); -const spring = (0, _createGeneratorEasingEs.createGeneratorEasing)(_generators.spring); -exports.spring = spring; +const spring = exports.spring = (0, _createGeneratorEasingEs.createGeneratorEasing)(_generators.spring); /***/ }), @@ -3419,12 +3393,11 @@ const thresholds = { any: 0, all: 1 }; -function inView(elementOrSelector, onStart) { - let { - root, - margin: rootMargin, - amount = "any" - } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; +function inView(elementOrSelector, onStart, { + root, + margin: rootMargin, + amount = "any" +} = {}) { /** * If this browser doesn't support IntersectionObserver, return a dummy stop function. * Default triggering of onStart is tricky - it could be used for starting/stopping @@ -3502,12 +3475,11 @@ function getElementSize(target, borderBoxSize) { }; } } -function notifyTarget(_ref) { - let { - target, - contentRect, - borderBoxSize - } = _ref; +function notifyTarget({ + target, + contentRect, + borderBoxSize +}) { var _a; (_a = resizeHandlers.get(target)) === null || _a === void 0 ? void 0 : _a.forEach(handler => { handler({ @@ -3625,7 +3597,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.scroll = scroll; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); +var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.mjs"); var _indexEs = __webpack_require__(/*! ../resize/index.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/resize/index.es.js"); var _infoEs = __webpack_require__(/*! ./info.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/info.es.js"); var _onScrollHandlerEs = __webpack_require__(/*! ./on-scroll-handler.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/on-scroll-handler.es.js"); @@ -3633,8 +3605,7 @@ const scrollListeners = new WeakMap(); const resizeListeners = new WeakMap(); const onScrollHandlers = new WeakMap(); const getEventTarget = element => element === document.documentElement ? window : element; -function scroll(onScroll) { - let _a = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; +function scroll(onScroll, _a = {}) { var { container = document.documentElement } = _a, @@ -3788,14 +3759,12 @@ Object.defineProperty(exports, "__esModule", ({ exports.namedEdges = void 0; exports.resolveEdge = resolveEdge; var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -const namedEdges = { +const namedEdges = exports.namedEdges = { start: 0, center: 0.5, end: 1 }; -exports.namedEdges = namedEdges; -function resolveEdge(edge, length) { - let inset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; +function resolveEdge(edge, length, inset = 0) { let delta = 0; /** * If we have this edge defined as a preset, replace the definition @@ -4010,13 +3979,12 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ScrollOffset = void 0; -const ScrollOffset = { +const ScrollOffset = exports.ScrollOffset = { Enter: [[0, 1], [1, 1]], Exit: [[0, 0], [1, 0]], Any: [[1, 0], [0, 1]], All: [[0, 0], [1, 1]] }; -exports.ScrollOffset = ScrollOffset; /***/ }), @@ -4035,9 +4003,7 @@ exports.createOnScrollHandler = createOnScrollHandler; var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); var _infoEs = __webpack_require__(/*! ./info.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/info.es.js"); var _indexEs = __webpack_require__(/*! ./offsets/index.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/scroll/offsets/index.es.js"); -function measure(container) { - let target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : container; - let info = arguments.length > 2 ? arguments[2] : undefined; +function measure(container, target = container, info) { /** * Find inset of target within scrollable container */ @@ -4056,8 +4022,7 @@ function measure(container) { info.x.containerLength = container.clientWidth; info.y.containerLength = container.clientHeight; } -function createOnScrollHandler(element, onScroll, info) { - let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; +function createOnScrollHandler(element, onScroll, info, options = {}) { const axis = options.axis || "y"; return { measure: () => measure(element, options.target, info), @@ -4072,10 +4037,9 @@ function createOnScrollHandler(element, onScroll, info) { } function scrubAnimation(controls, axisInfo) { controls.pause(); - controls.forEachNative((animation, _ref) => { - let { - easing - } = _ref; + controls.forEachNative((animation, { + easing + }) => { var _a, _b; if (animation.updateDuration) { if (!easing) animation.easing = _utils.noopReturn; @@ -4252,13 +4216,12 @@ const mouseEvent = (element, name, action) => event => { action(); (0, _eventsEs.dispatchPointerEvent)(element, name, event); }; -const hover = { +const hover = exports.hover = { isActive: options => Boolean(options.hover), - subscribe: (element, _ref) => { - let { - enable, - disable - } = _ref; + subscribe: (element, { + enable, + disable + }) => { const onEnter = mouseEvent(element, "hoverstart", enable); const onLeave = mouseEvent(element, "hoverend", disable); element.addEventListener("pointerenter", onEnter); @@ -4269,7 +4232,6 @@ const hover = { }; } }; -exports.hover = hover; /***/ }), @@ -4285,19 +4247,17 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.inView = void 0; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); +var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.mjs"); var _eventsEs = __webpack_require__(/*! ../utils/events.es.js */ "../../../node_modules/@motionone/dom/dist/state/utils/events.es.js"); var _inViewEs = __webpack_require__(/*! ../../gestures/in-view.es.js */ "../../../node_modules/@motionone/dom/dist/gestures/in-view.es.js"); -const inView = { +const inView = exports.inView = { isActive: options => Boolean(options.inView), - subscribe: (element, _ref, _ref2) => { - let { - enable, - disable - } = _ref; - let { - inViewOptions = {} - } = _ref2; + subscribe: (element, { + enable, + disable + }, { + inViewOptions = {} + }) => { const { once } = inViewOptions, @@ -4314,7 +4274,6 @@ const inView = { }, viewOptions); } }; -exports.inView = inView; /***/ }), @@ -4331,13 +4290,12 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.press = void 0; var _eventsEs = __webpack_require__(/*! ../utils/events.es.js */ "../../../node_modules/@motionone/dom/dist/state/utils/events.es.js"); -const press = { +const press = exports.press = { isActive: options => Boolean(options.press), - subscribe: (element, _ref) => { - let { - enable, - disable - } = _ref; + subscribe: (element, { + enable, + disable + }) => { const onPointerUp = event => { disable(); (0, _eventsEs.dispatchPointerEvent)(element, "pressend", event); @@ -4355,7 +4313,6 @@ const press = { }; } }; -exports.press = press; /***/ }), @@ -4372,7 +4329,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.createMotionState = createMotionState; exports.mountedStates = void 0; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); +var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.mjs"); var _heyListen = __webpack_require__(/*! hey-listen */ "../../../node_modules/hey-listen/dist/hey-listen.es.js"); var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); var _animateStyleEs = __webpack_require__(/*! ../animate/animate-style.es.js */ "../../../node_modules/@motionone/dom/dist/animate/animate-style.es.js"); @@ -4399,11 +4356,8 @@ const stateTypes = ["initial", "animate", ...Object.keys(gestures), "exit"]; * A global store of all generated motion states. This can be used to lookup * a motion state for a given Element. */ -const mountedStates = new WeakMap(); -exports.mountedStates = mountedStates; -function createMotionState() { - let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - let parent = arguments.length > 1 ? arguments[1] : undefined; +const mountedStates = exports.mountedStates = new WeakMap(); +function createMotionState(options = {}, parent) { /** * The element represented by the motion state. This is an empty reference * when we create the state to support SSR and allow for later mounting @@ -4710,7 +4664,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.createAnimationsFromTimeline = createAnimationsFromTimeline; exports.timeline = timeline; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); +var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.mjs"); var _heyListen = __webpack_require__(/*! hey-listen */ "../../../node_modules/hey-listen/dist/hey-listen.es.js"); var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); var _staggerEs = __webpack_require__(/*! ../utils/stagger.es.js */ "../../../node_modules/@motionone/dom/dist/utils/stagger.es.js"); @@ -4723,8 +4677,7 @@ var _transformsEs = __webpack_require__(/*! ../animate/utils/transforms.es.js */ var _calcTimeEs = __webpack_require__(/*! ./utils/calc-time.es.js */ "../../../node_modules/@motionone/dom/dist/timeline/utils/calc-time.es.js"); var _editEs = __webpack_require__(/*! ./utils/edit.es.js */ "../../../node_modules/@motionone/dom/dist/timeline/utils/edit.es.js"); var _sortEs = __webpack_require__(/*! ./utils/sort.es.js */ "../../../node_modules/@motionone/dom/dist/timeline/utils/sort.es.js"); -function timeline(definition) { - let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; +function timeline(definition, options = {}) { var _a; const animationDefinitions = createAnimationsFromTimeline(definition, options); /** @@ -4735,8 +4688,7 @@ function timeline(definition) { // Get the duration from the first animation definition (_a = animationDefinitions[0]) === null || _a === void 0 ? void 0 : _a[3].duration); } -function createAnimationsFromTimeline(definition) { - let _a = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; +function createAnimationsFromTimeline(definition, _a = {}) { var { defaultOptions = {} } = _a, @@ -5051,13 +5003,11 @@ exports.resolveOption = resolveOption; exports.stagger = stagger; var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); var _animation = __webpack_require__(/*! @motionone/animation */ "../../../node_modules/@motionone/animation/dist/index.es.js"); -function stagger() { - let duration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.1; - let { - start = 0, - from = 0, - easing - } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; +function stagger(duration = 0.1, { + start = 0, + from = 0, + easing +} = {}) { return (i, total) => { const fromIndex = (0, _utils.isNumber)(from) ? from : getFromIndex(from, total); const distance = Math.abs(fromIndex - i); @@ -5187,14 +5137,11 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.steps = void 0; var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); -const steps = function (steps) { - let direction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "end"; - return progress => { - progress = direction === "end" ? Math.min(progress, 0.999) : Math.max(progress, 0.001); - const expanded = progress * steps; - const rounded = direction === "end" ? Math.floor(expanded) : Math.ceil(expanded); - return (0, _utils.clamp)(0, 1, rounded / steps); - }; +const steps = (steps, direction = "end") => progress => { + progress = direction === "end" ? Math.min(progress, 0.999) : Math.max(progress, 0.001); + const expanded = progress * steps; + const rounded = direction === "end" ? Math.floor(expanded) : Math.ceil(expanded); + return (0, _utils.clamp)(0, 1, rounded / steps); }; exports.steps = steps; @@ -5215,20 +5162,19 @@ exports.glide = void 0; var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); var _velocityEs = __webpack_require__(/*! ../utils/velocity.es.js */ "../../../node_modules/@motionone/generators/dist/utils/velocity.es.js"); var _indexEs = __webpack_require__(/*! ../spring/index.es.js */ "../../../node_modules/@motionone/generators/dist/spring/index.es.js"); -const glide = _ref => { - let { - from = 0, - velocity = 0.0, - power = 0.8, - decay = 0.325, - bounceDamping, - bounceStiffness, - changeTarget, - min, - max, - restDistance = 0.5, - restSpeed - } = _ref; +const glide = ({ + from = 0, + velocity = 0.0, + power = 0.8, + decay = 0.325, + bounceDamping, + bounceStiffness, + changeTarget, + min, + max, + restDistance = 0.5, + restSpeed +}) => { decay = _utils.time.ms(decay); const state = { hasReachedTarget: false, @@ -5366,12 +5312,11 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.defaults = void 0; -const defaults = { +const defaults = exports.defaults = { stiffness: 100.0, damping: 10.0, mass: 1.0 }; -exports.defaults = defaults; /***/ }), @@ -5392,17 +5337,16 @@ var _defaultsEs = __webpack_require__(/*! ./defaults.es.js */ "../../../node_mod var _utilsEs = __webpack_require__(/*! ./utils.es.js */ "../../../node_modules/@motionone/generators/dist/spring/utils.es.js"); var _hasReachedTargetEs = __webpack_require__(/*! ../utils/has-reached-target.es.js */ "../../../node_modules/@motionone/generators/dist/utils/has-reached-target.es.js"); var _velocityEs = __webpack_require__(/*! ../utils/velocity.es.js */ "../../../node_modules/@motionone/generators/dist/utils/velocity.es.js"); -const spring = function () { - let { - stiffness = _defaultsEs.defaults.stiffness, - damping = _defaultsEs.defaults.damping, - mass = _defaultsEs.defaults.mass, - from = 0, - to = 1, - velocity = 0.0, - restSpeed = 2, - restDistance = 0.5 - } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; +const spring = ({ + stiffness = _defaultsEs.defaults.stiffness, + damping = _defaultsEs.defaults.damping, + mass = _defaultsEs.defaults.mass, + from = 0, + to = 1, + velocity = 0.0, + restSpeed = 2, + restDistance = 0.5 +} = {}) => { velocity = velocity ? _utils.time.s(velocity) : 0.0; const state = { done: false, @@ -5451,12 +5395,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.calcDampingRatio = void 0; var _defaultsEs = __webpack_require__(/*! ./defaults.es.js */ "../../../node_modules/@motionone/generators/dist/spring/defaults.es.js"); -const calcDampingRatio = function () { - let stiffness = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _defaultsEs.defaults.stiffness; - let damping = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _defaultsEs.defaults.damping; - let mass = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _defaultsEs.defaults.mass; - return damping / (2 * Math.sqrt(stiffness * mass)); -}; +const calcDampingRatio = (stiffness = _defaultsEs.defaults.stiffness, damping = _defaultsEs.defaults.damping, mass = _defaultsEs.defaults.mass) => damping / (2 * Math.sqrt(stiffness * mass)); exports.calcDampingRatio = calcDampingRatio; /***/ }), @@ -5494,8 +5433,7 @@ exports.pregenerateKeyframes = pregenerateKeyframes; var _utils = __webpack_require__(/*! @motionone/utils */ "../../../node_modules/@motionone/utils/dist/index.es.js"); const timeStep = 10; const maxDuration = 10000; -function pregenerateKeyframes(generator) { - let toUnit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _utils.noopReturn; +function pregenerateKeyframes(generator, toUnit = _utils.noopReturn) { let overshootDuration = undefined; let timestamp = timeStep; let state = generator(0); @@ -5648,14 +5586,13 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.defaults = void 0; -const defaults = { +const defaults = exports.defaults = { duration: 0.3, delay: 0, endDelay: 0, repeat: 0, easing: "ease" }; -exports.defaults = defaults; /***/ }), @@ -5855,9 +5792,7 @@ var _offsetEs = __webpack_require__(/*! ./offset.es.js */ "../../../node_modules var _progressEs = __webpack_require__(/*! ./progress.es.js */ "../../../node_modules/@motionone/utils/dist/progress.es.js"); var _easingEs = __webpack_require__(/*! ./easing.es.js */ "../../../node_modules/@motionone/utils/dist/easing.es.js"); var _clampEs = __webpack_require__(/*! ./clamp.es.js */ "../../../node_modules/@motionone/utils/dist/clamp.es.js"); -function interpolate(output) { - let input = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _offsetEs.defaultOffset)(output.length); - let easing = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _noopEs.noopReturn; +function interpolate(output, input = (0, _offsetEs.defaultOffset)(output.length), easing = _noopEs.noopReturn) { const length = output.length; /** * If the input length is lower than the output we @@ -6080,11 +6015,10 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.time = void 0; -const time = { +const time = exports.time = { ms: seconds => seconds * 1000, s: milliseconds => milliseconds / 1000 }; -exports.time = time; /***/ }), @@ -6193,10 +6127,12 @@ function makePushPullAsyncIterableIterator() { // We monkey patch the original generator for clean-up // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const originalReturn = asyncIterableIterator.return.bind(asyncIterableIterator); - asyncIterableIterator.return = function () { + asyncIterableIterator.return = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ...args) => { isRunning = false; finishedD.resolve(SYMBOL_FINISHED); - return originalReturn(...arguments); + return originalReturn(...args); }; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const originalThrow = asyncIterableIterator.throw.bind(asyncIterableIterator); @@ -6289,10 +6225,9 @@ function $parcel$export(e, n, v, s) { }); } $parcel$export(module.exports, "composeEventHandlers", () => $1a6a90a521dcd173$export$b9ecd428b558ff10); -function $1a6a90a521dcd173$export$b9ecd428b558ff10(originalEventHandler, ourEventHandler) { - let { - checkForDefaultPrevented = true - } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; +function $1a6a90a521dcd173$export$b9ecd428b558ff10(originalEventHandler, ourEventHandler, { + checkForDefaultPrevented = true +} = {}) { return function handleEvent(event) { originalEventHandler === null || originalEventHandler === void 0 || originalEventHandler(event); if (checkForDefaultPrevented === false || !event.defaultPrevented) return ourEventHandler === null || ourEventHandler === void 0 ? void 0 : ourEventHandler(event); @@ -6518,20 +6453,14 @@ function $9c2aaba23466b352$var$setRef(ref, value) { * A utility to compose multiple refs together * Accepts callback refs and RefObject(s) */ -function $9c2aaba23466b352$export$43e446d32b3d21af() { - for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) { - refs[_key] = arguments[_key]; - } +function $9c2aaba23466b352$export$43e446d32b3d21af(...refs) { return node => refs.forEach(ref => $9c2aaba23466b352$var$setRef(ref, node)); } /** * A custom hook that composes multiple refs * Accepts callback refs and RefObject(s) */ -function $9c2aaba23466b352$export$c7b2cbe3552a0d05() { - for (var _len2 = arguments.length, refs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - refs[_key2] = arguments[_key2]; - } +function $9c2aaba23466b352$export$c7b2cbe3552a0d05(...refs) { // eslint-disable-next-line react-hooks/exhaustive-deps return $dJwbH$react.useCallback($9c2aaba23466b352$export$43e446d32b3d21af(...refs), refs); } @@ -6582,8 +6511,7 @@ function $dec3cc0142d4f286$export$fd42f52fd3ae1109(rootComponentName, defaultCon /* ------------------------------------------------------------------------------------------------- * createContextScope * -----------------------------------------------------------------------------------------------*/ -function $dec3cc0142d4f286$export$50c7b4e9d9f19c1(scopeName) { - let createContextScopeDeps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; +function $dec3cc0142d4f286$export$50c7b4e9d9f19c1(scopeName, createContextScopeDeps = []) { let defaultContexts = []; /* ----------------------------------------------------------------------------------------------- * createContext @@ -6638,10 +6566,7 @@ function $dec3cc0142d4f286$export$50c7b4e9d9f19c1(scopeName) { /* ------------------------------------------------------------------------------------------------- * composeContextScopes * -----------------------------------------------------------------------------------------------*/ -function $dec3cc0142d4f286$var$composeContextScopes() { - for (var _len = arguments.length, scopes = new Array(_len), _key = 0; _key < _len; _key++) { - scopes[_key] = arguments[_key]; - } +function $dec3cc0142d4f286$var$composeContextScopes(...scopes) { const baseScope = scopes[0]; if (scopes.length === 1) return baseScope; const createScope1 = () => { @@ -6650,11 +6575,10 @@ function $dec3cc0142d4f286$var$composeContextScopes() { scopeName: createScope.scopeName })); return function useComposedScopes(overrideScopes) { - const nextScopes1 = scopeHooks.reduce((nextScopes, _ref) => { - let { - useScope: useScope, - scopeName: scopeName - } = _ref; + const nextScopes1 = scopeHooks.reduce((nextScopes, { + useScope: useScope, + scopeName: scopeName + }) => { // We are calling a hook inside a callback which React warns against to avoid inconsistent // renders, however, scoping doesn't have render side effects so we ignore the rule. // eslint-disable-next-line react-hooks/rules-of-hooks @@ -7066,10 +6990,9 @@ const [$f4833395aa1bca1a$export$69b62a49393917d6, $f4833395aa1bca1a$var$useWarni titleName: $f4833395aa1bca1a$var$TITLE_NAME, docsSlug: 'dialog' }); -const $f4833395aa1bca1a$var$TitleWarning = _ref => { - let { - titleId: titleId - } = _ref; +const $f4833395aa1bca1a$var$TitleWarning = ({ + titleId: titleId +}) => { const titleWarningContext = $f4833395aa1bca1a$var$useWarningContext($f4833395aa1bca1a$var$TITLE_WARNING_NAME); const MESSAGE = `\`${titleWarningContext.contentName}\` requires a \`${titleWarningContext.titleName}\` for the component to be accessible for screen reader users. @@ -7085,11 +7008,10 @@ For more information, see https://radix-ui.com/primitives/docs/components/${titl return null; }; const $f4833395aa1bca1a$var$DESCRIPTION_WARNING_NAME = 'DialogDescriptionWarning'; -const $f4833395aa1bca1a$var$DescriptionWarning = _ref2 => { - let { - contentRef: contentRef, - descriptionId: descriptionId - } = _ref2; +const $f4833395aa1bca1a$var$DescriptionWarning = ({ + contentRef: contentRef, + descriptionId: descriptionId +}) => { const descriptionWarningContext = $f4833395aa1bca1a$var$useWarningContext($f4833395aa1bca1a$var$DESCRIPTION_WARNING_NAME); const MESSAGE = `Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${descriptionWarningContext.contentName}}.`; $aJCrN$react.useEffect(() => { @@ -7325,8 +7247,7 @@ Object.assign($d715e0554b679f1f$export$4d5eb2109db14228, { * to mimic layer dismissing behaviour present in OS. * Returns props to pass to the node we want to check for outside events. */ -function $d715e0554b679f1f$var$usePointerDownOutside(onPointerDownOutside) { - let ownerDocument = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : globalThis === null || globalThis === void 0 ? void 0 : globalThis.document; +function $d715e0554b679f1f$var$usePointerDownOutside(onPointerDownOutside, ownerDocument = globalThis === null || globalThis === void 0 ? void 0 : globalThis.document) { const handlePointerDownOutside = $g2vWm$radixuireactusecallbackref.useCallbackRef(onPointerDownOutside); const isPointerInsideReactTreeRef = $g2vWm$react.useRef(false); const handleClickRef = $g2vWm$react.useRef(() => {}); @@ -7394,8 +7315,7 @@ function $d715e0554b679f1f$var$usePointerDownOutside(onPointerDownOutside) { * Listens for when focus happens outside a react subtree. * Returns props to pass to the root (node) of the subtree we want to check. */ -function $d715e0554b679f1f$var$useFocusOutside(onFocusOutside) { - let ownerDocument = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : globalThis === null || globalThis === void 0 ? void 0 : globalThis.document; +function $d715e0554b679f1f$var$useFocusOutside(onFocusOutside, ownerDocument = globalThis === null || globalThis === void 0 ? void 0 : globalThis.document) { const handleFocusOutside = $g2vWm$radixuireactusecallbackref.useCallbackRef(onFocusOutside); const isFocusInsideReactTreeRef = $g2vWm$react.useRef(false); $g2vWm$react.useEffect(() => { @@ -7421,10 +7341,9 @@ function $d715e0554b679f1f$var$dispatchUpdate() { const event = new CustomEvent($d715e0554b679f1f$var$CONTEXT_UPDATE); document.dispatchEvent(event); } -function $d715e0554b679f1f$var$handleAndDispatchCustomEvent(name, handler, detail, _ref) { - let { - discrete: discrete - } = _ref; +function $d715e0554b679f1f$var$handleAndDispatchCustomEvent(name, handler, detail, { + discrete: discrete +}) { const target = detail.originalEvent.target; const event = new CustomEvent(name, { bubbles: false, @@ -8142,10 +8061,9 @@ Object.assign($2bc01e66e04aa9ed$export$20e40289641fbbb6, { * Attempts focusing the first element in a list of candidates. * Stops when focus has actually moved. */ -function $2bc01e66e04aa9ed$var$focusFirst(candidates) { - let { - select = false - } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; +function $2bc01e66e04aa9ed$var$focusFirst(candidates, { + select = false +} = {}) { const previouslyFocusedElement = document.activeElement; for (const candidate of candidates) { $2bc01e66e04aa9ed$var$focus(candidate, { @@ -8200,10 +8118,9 @@ function $2bc01e66e04aa9ed$var$findVisible(elements, container) { })) return element; } } -function $2bc01e66e04aa9ed$var$isHidden(node, _ref) { - let { - upTo: upTo - } = _ref; +function $2bc01e66e04aa9ed$var$isHidden(node, { + upTo: upTo +}) { if (getComputedStyle(node).visibility === 'hidden') return true; while (node) { // we stop at `upTo` (excluding it) @@ -8216,10 +8133,9 @@ function $2bc01e66e04aa9ed$var$isHidden(node, _ref) { function $2bc01e66e04aa9ed$var$isSelectableInput(element) { return element instanceof HTMLInputElement && 'select' in element; } -function $2bc01e66e04aa9ed$var$focus(element) { - let { - select = false - } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; +function $2bc01e66e04aa9ed$var$focus(element, { + select = false +} = {}) { // only focus if that element is focusable if (element && element.focus) { const previouslyFocusedElement = document.activeElement; // NOTE: we prevent scrolling on focus, to minimize jarring transitions for users @@ -9524,13 +9440,12 @@ const $34310caa050a8d63$export$bc4ae5855d3c4fc = /*#__PURE__*/$50Iv9$react.forwa ...detectOverflowOptions }), $50Iv9$floatinguireactdom.size({ ...detectOverflowOptions, - apply: _ref => { - let { - elements: elements, - rects: rects, - availableWidth: availableWidth, - availableHeight: availableHeight - } = _ref; + apply: ({ + elements: elements, + rects: rects, + availableWidth: availableWidth, + availableHeight: availableHeight + }) => { const { width: anchorWidth, height: anchorHeight @@ -10333,10 +10248,9 @@ $82dc8d030dec7549$var$SlotClone.displayName = 'SlotClone'; /* ------------------------------------------------------------------------------------------------- * Slottable * -----------------------------------------------------------------------------------------------*/ -const $82dc8d030dec7549$export$d9f1ccf0bdb05d45 = _ref => { - let { - children: children - } = _ref; +const $82dc8d030dec7549$export$d9f1ccf0bdb05d45 = ({ + children: children +}) => { return /*#__PURE__*/$dAvBt$react.createElement($dAvBt$react.Fragment, null, children); }; /* ---------------------------------------------------------------------------------------------- */ @@ -10354,9 +10268,9 @@ function $82dc8d030dec7549$var$mergeProps(slotProps, childProps) { const isHandler = /^on[A-Z]/.test(propName); if (isHandler) { // if the handler exists on both, we compose them - if (slotPropValue && childPropValue) overrideProps[propName] = function () { - childPropValue(...arguments); - slotPropValue(...arguments); + if (slotPropValue && childPropValue) overrideProps[propName] = (...args) => { + childPropValue(...args); + slotPropValue(...args); };else if (slotPropValue) overrideProps[propName] = slotPropValue; } else if (propName === 'style') overrideProps[propName] = { ...slotPropValue, @@ -10830,8 +10744,7 @@ function $c34afbc43c90cc6f$var$getExitSideFromRect(point, rect) { throw new Error('unreachable'); } } -function $c34afbc43c90cc6f$var$getPaddedExitPoints(exitPoint, exitSide) { - let padding = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5; +function $c34afbc43c90cc6f$var$getPaddedExitPoints(exitPoint, exitSide, padding = 5) { const paddedExitPoints = []; switch (exitSide) { case 'top': @@ -10982,11 +10895,8 @@ function $28e03942f763e819$export$25bec8c6f54ee79a(callback) { $92muK$react.useEffect(() => { callbackRef.current = callback; }); // https://github.com/facebook/react/issues/19240 - return $92muK$react.useMemo(() => function () { + return $92muK$react.useMemo(() => (...args) => { var _callbackRef$current; - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } return (_callbackRef$current = callbackRef.current) === null || _callbackRef$current === void 0 ? void 0 : _callbackRef$current.call(callbackRef, ...args); }, []); } @@ -11012,12 +10922,11 @@ function $parcel$export(e, n, v, s) { }); } $parcel$export(module.exports, "useControllableState", () => $b84d42d44371bff7$export$6f32135080cb4c3); -function $b84d42d44371bff7$export$6f32135080cb4c3(_ref) { - let { - prop: prop, - defaultProp: defaultProp, - onChange = () => {} - } = _ref; +function $b84d42d44371bff7$export$6f32135080cb4c3({ + prop: prop, + defaultProp: defaultProp, + onChange = () => {} +}) { const [uncontrolledProp, setUncontrolledProp] = $b84d42d44371bff7$var$useUncontrolledState({ defaultProp: defaultProp, onChange: onChange @@ -11034,11 +10943,10 @@ function $b84d42d44371bff7$export$6f32135080cb4c3(_ref) { }, [isControlled, prop, setUncontrolledProp, handleChange]); return [value1, setValue]; } -function $b84d42d44371bff7$var$useUncontrolledState(_ref2) { - let { - defaultProp: defaultProp, - onChange: onChange - } = _ref2; +function $b84d42d44371bff7$var$useUncontrolledState({ + defaultProp: defaultProp, + onChange: onChange +}) { const uncontrolledState = $ijazI$react.useState(defaultProp); const [value] = uncontrolledState; const prevValueRef = $ijazI$react.useRef(value); @@ -11077,8 +10985,7 @@ $parcel$export(module.exports, "useEscapeKeydown", () => $24c84e9f83c4454f$expor /** * Listens for when the escape key is down */ -function $24c84e9f83c4454f$export$3a72a57244d6e765(onEscapeKeyDownProp) { - let ownerDocument = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : globalThis === null || globalThis === void 0 ? void 0 : globalThis.document; +function $24c84e9f83c4454f$export$3a72a57244d6e765(onEscapeKeyDownProp, ownerDocument = globalThis === null || globalThis === void 0 ? void 0 : globalThis.document) { const onEscapeKeyDown = $b0gz3$radixuireactusecallbackref.useCallbackRef(onEscapeKeyDownProp); $b0gz3$react.useEffect(() => { const handleKeyDown = event => { @@ -11457,8 +11364,7 @@ function clsx() { for (var e, t, f = 0, n = ""; f < arguments.length;) (e = arguments[f++]) && (t = r(e)) && (n && (n += " "), n += t); return n; } -var _default = clsx; -exports["default"] = _default; +var _default = exports["default"] = clsx; /***/ }), @@ -11588,8 +11494,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.isNode = void 0; -const isNode = false; -exports.isNode = isNode; +const isNode = exports.isNode = false; /***/ }), @@ -12980,7 +12885,7 @@ Object.defineProperty(exports, "decodeXMLStrict", ({ Object.defineProperty(exports, "__esModule", ({ value: true })); -var tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); +var tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.mjs"); var React = __webpack_require__(/*! react */ "react"); var heyListen = __webpack_require__(/*! hey-listen */ "../../../node_modules/hey-listen/dist/hey-listen.es.js"); var styleValueTypes = __webpack_require__(/*! style-value-types */ "../../../node_modules/style-value-types/dist/valueTypes.cjs.js"); @@ -18905,7 +18810,6 @@ var NodeStack = /** @class */function () { */ } }; - NodeStack.prototype.exitAnimationComplete = function () { this.members.forEach(function (node) { var _a, _b, _c, _d, _e; @@ -18997,997 +18901,994 @@ function createProjectionNode(_a) { measureScroll = _a.measureScroll, checkIsScrollRoot = _a.checkIsScrollRoot, resetTransform = _a.resetTransform; - return (/** @class */function () { - function ProjectionNode(id, latestValues, parent) { - var _this = this; - if (latestValues === void 0) { - latestValues = {}; - } - if (parent === void 0) { - parent = defaultParent === null || defaultParent === void 0 ? void 0 : defaultParent(); - } - /** - * A Set containing all this component's children. This is used to iterate - * through the children. - * - * TODO: This could be faster to iterate as a flat array stored on the root node. - */ - this.children = new Set(); - /** - * Options for the node. We use this to configure what kind of layout animations - * we should perform (if any). - */ - this.options = {}; - /** - * We use this to detect when its safe to shut down part of a projection tree. - * We have to keep projecting children for scale correction and relative projection - * until all their parents stop performing layout animations. - */ - this.isTreeAnimating = false; - this.isAnimationBlocked = false; - /** - * Flag to true if we think this layout has been changed. We can't always know this, - * currently we set it to true every time a component renders, or if it has a layoutDependency - * if that has changed between renders. Additionally, components can be grouped by LayoutGroup - * and if one node is dirtied, they all are. - */ - this.isLayoutDirty = false; - /** - * Block layout updates for instant layout transitions throughout the tree. - */ - this.updateManuallyBlocked = false; - this.updateBlockedByResize = false; - /** - * Set to true between the start of the first `willUpdate` call and the end of the `didUpdate` - * call. - */ - this.isUpdating = false; - /** - * If this is an SVG element we currently disable projection transforms - */ - this.isSVG = false; - /** - * Flag to true (during promotion) if a node doing an instant layout transition needs to reset - * its projection styles. - */ - this.needsReset = false; - /** - * Flags whether this node should have its transform reset prior to measuring. - */ - this.shouldResetTransform = false; - /** - * An object representing the calculated contextual/accumulated/tree scale. - * This will be used to scale calculcated projection transforms, as these are - * calculated in screen-space but need to be scaled for elements to actually - * make it to their calculated destinations. - * - * TODO: Lazy-init - */ - this.treeScale = { - x: 1, - y: 1 - }; - /** - * - */ - this.eventHandlers = new Map(); - // Note: Currently only running on root node - this.potentialNodes = new Map(); - this.checkUpdateFailed = function () { - if (_this.isUpdating) { - _this.isUpdating = false; - _this.clearAllSnapshots(); - } - }; - this.updateProjection = function () { - _this.nodes.forEach(resolveTargetDelta); - _this.nodes.forEach(calcProjection); - }; - this.hasProjected = false; - this.isVisible = true; - this.animationProgress = 0; - /** - * Shared layout - */ - // TODO Only running on root node - this.sharedNodes = new Map(); - this.id = id; - this.latestValues = latestValues; - this.root = parent ? parent.root || parent : this; - this.path = parent ? tslib.__spreadArray(tslib.__spreadArray([], tslib.__read(parent.path), false), [parent], false) : []; - this.parent = parent; - this.depth = parent ? parent.depth + 1 : 0; - id && this.root.registerPotentialNode(id, this); - for (var i = 0; i < this.path.length; i++) { - this.path[i].shouldResetTransform = true; - } - if (this.root === this) this.nodes = new FlatTree(); + return /** @class */function () { + function ProjectionNode(id, latestValues, parent) { + var _this = this; + if (latestValues === void 0) { + latestValues = {}; } - ProjectionNode.prototype.addEventListener = function (name, handler) { - if (!this.eventHandlers.has(name)) { - this.eventHandlers.set(name, new SubscriptionManager()); - } - return this.eventHandlers.get(name).add(handler); + if (parent === void 0) { + parent = defaultParent === null || defaultParent === void 0 ? void 0 : defaultParent(); + } + /** + * A Set containing all this component's children. This is used to iterate + * through the children. + * + * TODO: This could be faster to iterate as a flat array stored on the root node. + */ + this.children = new Set(); + /** + * Options for the node. We use this to configure what kind of layout animations + * we should perform (if any). + */ + this.options = {}; + /** + * We use this to detect when its safe to shut down part of a projection tree. + * We have to keep projecting children for scale correction and relative projection + * until all their parents stop performing layout animations. + */ + this.isTreeAnimating = false; + this.isAnimationBlocked = false; + /** + * Flag to true if we think this layout has been changed. We can't always know this, + * currently we set it to true every time a component renders, or if it has a layoutDependency + * if that has changed between renders. Additionally, components can be grouped by LayoutGroup + * and if one node is dirtied, they all are. + */ + this.isLayoutDirty = false; + /** + * Block layout updates for instant layout transitions throughout the tree. + */ + this.updateManuallyBlocked = false; + this.updateBlockedByResize = false; + /** + * Set to true between the start of the first `willUpdate` call and the end of the `didUpdate` + * call. + */ + this.isUpdating = false; + /** + * If this is an SVG element we currently disable projection transforms + */ + this.isSVG = false; + /** + * Flag to true (during promotion) if a node doing an instant layout transition needs to reset + * its projection styles. + */ + this.needsReset = false; + /** + * Flags whether this node should have its transform reset prior to measuring. + */ + this.shouldResetTransform = false; + /** + * An object representing the calculated contextual/accumulated/tree scale. + * This will be used to scale calculcated projection transforms, as these are + * calculated in screen-space but need to be scaled for elements to actually + * make it to their calculated destinations. + * + * TODO: Lazy-init + */ + this.treeScale = { + x: 1, + y: 1 }; - ProjectionNode.prototype.notifyListeners = function (name) { - var args = []; - for (var _i = 1; _i < arguments.length; _i++) { - args[_i - 1] = arguments[_i]; + /** + * + */ + this.eventHandlers = new Map(); + // Note: Currently only running on root node + this.potentialNodes = new Map(); + this.checkUpdateFailed = function () { + if (_this.isUpdating) { + _this.isUpdating = false; + _this.clearAllSnapshots(); } - var subscriptionManager = this.eventHandlers.get(name); - subscriptionManager === null || subscriptionManager === void 0 ? void 0 : subscriptionManager.notify.apply(subscriptionManager, tslib.__spreadArray([], tslib.__read(args), false)); }; - ProjectionNode.prototype.hasListeners = function (name) { - return this.eventHandlers.has(name); - }; - ProjectionNode.prototype.registerPotentialNode = function (id, node) { - this.potentialNodes.set(id, node); + this.updateProjection = function () { + _this.nodes.forEach(resolveTargetDelta); + _this.nodes.forEach(calcProjection); }; + this.hasProjected = false; + this.isVisible = true; + this.animationProgress = 0; /** - * Lifecycles + * Shared layout */ - ProjectionNode.prototype.mount = function (instance, isLayoutDirty) { - var _this = this; - var _a; - if (isLayoutDirty === void 0) { - isLayoutDirty = false; - } - if (this.instance) return; - this.isSVG = instance instanceof SVGElement && instance.tagName !== "svg"; - this.instance = instance; - var _b = this.options, - layoutId = _b.layoutId, - layout = _b.layout, - visualElement = _b.visualElement; - if (visualElement && !visualElement.getInstance()) { - visualElement.mount(instance); - } - this.root.nodes.add(this); - (_a = this.parent) === null || _a === void 0 ? void 0 : _a.children.add(this); - this.id && this.root.potentialNodes.delete(this.id); - if (isLayoutDirty && (layout || layoutId)) { - this.isLayoutDirty = true; - } - if (attachResizeListener) { - var unblockTimeout_1; - var resizeUnblockUpdate_1 = function () { - return _this.root.updateBlockedByResize = false; - }; - attachResizeListener(instance, function () { - _this.root.updateBlockedByResize = true; - clearTimeout(unblockTimeout_1); - unblockTimeout_1 = window.setTimeout(resizeUnblockUpdate_1, 250); - if (globalProjectionState.hasAnimatedSinceResize) { - globalProjectionState.hasAnimatedSinceResize = false; - _this.nodes.forEach(finishAnimation); + // TODO Only running on root node + this.sharedNodes = new Map(); + this.id = id; + this.latestValues = latestValues; + this.root = parent ? parent.root || parent : this; + this.path = parent ? tslib.__spreadArray(tslib.__spreadArray([], tslib.__read(parent.path), false), [parent], false) : []; + this.parent = parent; + this.depth = parent ? parent.depth + 1 : 0; + id && this.root.registerPotentialNode(id, this); + for (var i = 0; i < this.path.length; i++) { + this.path[i].shouldResetTransform = true; + } + if (this.root === this) this.nodes = new FlatTree(); + } + ProjectionNode.prototype.addEventListener = function (name, handler) { + if (!this.eventHandlers.has(name)) { + this.eventHandlers.set(name, new SubscriptionManager()); + } + return this.eventHandlers.get(name).add(handler); + }; + ProjectionNode.prototype.notifyListeners = function (name) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + var subscriptionManager = this.eventHandlers.get(name); + subscriptionManager === null || subscriptionManager === void 0 ? void 0 : subscriptionManager.notify.apply(subscriptionManager, tslib.__spreadArray([], tslib.__read(args), false)); + }; + ProjectionNode.prototype.hasListeners = function (name) { + return this.eventHandlers.has(name); + }; + ProjectionNode.prototype.registerPotentialNode = function (id, node) { + this.potentialNodes.set(id, node); + }; + /** + * Lifecycles + */ + ProjectionNode.prototype.mount = function (instance, isLayoutDirty) { + var _this = this; + var _a; + if (isLayoutDirty === void 0) { + isLayoutDirty = false; + } + if (this.instance) return; + this.isSVG = instance instanceof SVGElement && instance.tagName !== "svg"; + this.instance = instance; + var _b = this.options, + layoutId = _b.layoutId, + layout = _b.layout, + visualElement = _b.visualElement; + if (visualElement && !visualElement.getInstance()) { + visualElement.mount(instance); + } + this.root.nodes.add(this); + (_a = this.parent) === null || _a === void 0 ? void 0 : _a.children.add(this); + this.id && this.root.potentialNodes.delete(this.id); + if (isLayoutDirty && (layout || layoutId)) { + this.isLayoutDirty = true; + } + if (attachResizeListener) { + var unblockTimeout_1; + var resizeUnblockUpdate_1 = function () { + return _this.root.updateBlockedByResize = false; + }; + attachResizeListener(instance, function () { + _this.root.updateBlockedByResize = true; + clearTimeout(unblockTimeout_1); + unblockTimeout_1 = window.setTimeout(resizeUnblockUpdate_1, 250); + if (globalProjectionState.hasAnimatedSinceResize) { + globalProjectionState.hasAnimatedSinceResize = false; + _this.nodes.forEach(finishAnimation); + } + }); + } + if (layoutId) { + this.root.registerSharedNode(layoutId, this); + } + // Only register the handler if it requires layout animation + if (this.options.animate !== false && visualElement && (layoutId || layout)) { + this.addEventListener("didUpdate", function (_a) { + var _b, _c, _d, _e, _f; + var delta = _a.delta, + hasLayoutChanged = _a.hasLayoutChanged, + hasRelativeTargetChanged = _a.hasRelativeTargetChanged, + newLayout = _a.layout; + if (_this.isTreeAnimationBlocked()) { + _this.target = undefined; + _this.relativeTarget = undefined; + return; + } + // TODO: Check here if an animation exists + var layoutTransition = (_c = (_b = _this.options.transition) !== null && _b !== void 0 ? _b : visualElement.getDefaultTransition()) !== null && _c !== void 0 ? _c : defaultLayoutTransition; + var _g = visualElement.getProps(), + onLayoutAnimationStart = _g.onLayoutAnimationStart, + onLayoutAnimationComplete = _g.onLayoutAnimationComplete; + /** + * The target layout of the element might stay the same, + * but its position relative to its parent has changed. + */ + var targetChanged = !_this.targetLayout || !boxEquals(_this.targetLayout, newLayout) || hasRelativeTargetChanged; + /** + * If the layout hasn't seemed to have changed, it might be that the + * element is visually in the same place in the document but its position + * relative to its parent has indeed changed. So here we check for that. + */ + var hasOnlyRelativeTargetChanged = !hasLayoutChanged && hasRelativeTargetChanged; + if (((_d = _this.resumeFrom) === null || _d === void 0 ? void 0 : _d.instance) || hasOnlyRelativeTargetChanged || hasLayoutChanged && (targetChanged || !_this.currentAnimation)) { + if (_this.resumeFrom) { + _this.resumingFrom = _this.resumeFrom; + _this.resumingFrom.resumingFrom = undefined; } - }); - } - if (layoutId) { - this.root.registerSharedNode(layoutId, this); - } - // Only register the handler if it requires layout animation - if (this.options.animate !== false && visualElement && (layoutId || layout)) { - this.addEventListener("didUpdate", function (_a) { - var _b, _c, _d, _e, _f; - var delta = _a.delta, - hasLayoutChanged = _a.hasLayoutChanged, - hasRelativeTargetChanged = _a.hasRelativeTargetChanged, - newLayout = _a.layout; - if (_this.isTreeAnimationBlocked()) { - _this.target = undefined; - _this.relativeTarget = undefined; - return; + _this.setAnimationOrigin(delta, hasOnlyRelativeTargetChanged); + var animationOptions = tslib.__assign(tslib.__assign({}, getValueTransition(layoutTransition, "layout")), { + onPlay: onLayoutAnimationStart, + onComplete: onLayoutAnimationComplete + }); + if (visualElement.shouldReduceMotion) { + animationOptions.delay = 0; + animationOptions.type = false; } - // TODO: Check here if an animation exists - var layoutTransition = (_c = (_b = _this.options.transition) !== null && _b !== void 0 ? _b : visualElement.getDefaultTransition()) !== null && _c !== void 0 ? _c : defaultLayoutTransition; - var _g = visualElement.getProps(), - onLayoutAnimationStart = _g.onLayoutAnimationStart, - onLayoutAnimationComplete = _g.onLayoutAnimationComplete; - /** - * The target layout of the element might stay the same, - * but its position relative to its parent has changed. - */ - var targetChanged = !_this.targetLayout || !boxEquals(_this.targetLayout, newLayout) || hasRelativeTargetChanged; + _this.startAnimation(animationOptions); + } else { /** - * If the layout hasn't seemed to have changed, it might be that the - * element is visually in the same place in the document but its position - * relative to its parent has indeed changed. So here we check for that. + * If the layout hasn't changed and we have an animation that hasn't started yet, + * finish it immediately. Otherwise it will be animating from a location + * that was probably never commited to screen and look like a jumpy box. */ - var hasOnlyRelativeTargetChanged = !hasLayoutChanged && hasRelativeTargetChanged; - if (((_d = _this.resumeFrom) === null || _d === void 0 ? void 0 : _d.instance) || hasOnlyRelativeTargetChanged || hasLayoutChanged && (targetChanged || !_this.currentAnimation)) { - if (_this.resumeFrom) { - _this.resumingFrom = _this.resumeFrom; - _this.resumingFrom.resumingFrom = undefined; - } - _this.setAnimationOrigin(delta, hasOnlyRelativeTargetChanged); - var animationOptions = tslib.__assign(tslib.__assign({}, getValueTransition(layoutTransition, "layout")), { - onPlay: onLayoutAnimationStart, - onComplete: onLayoutAnimationComplete - }); - if (visualElement.shouldReduceMotion) { - animationOptions.delay = 0; - animationOptions.type = false; - } - _this.startAnimation(animationOptions); - } else { - /** - * If the layout hasn't changed and we have an animation that hasn't started yet, - * finish it immediately. Otherwise it will be animating from a location - * that was probably never commited to screen and look like a jumpy box. - */ - if (!hasLayoutChanged && _this.animationProgress === 0) { - _this.finishAnimation(); - } - _this.isLead() && ((_f = (_e = _this.options).onExitComplete) === null || _f === void 0 ? void 0 : _f.call(_e)); + if (!hasLayoutChanged && _this.animationProgress === 0) { + _this.finishAnimation(); } - _this.targetLayout = newLayout; - }); - } - }; - ProjectionNode.prototype.unmount = function () { - var _a, _b; - this.options.layoutId && this.willUpdate(); - this.root.nodes.remove(this); - (_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.remove(this); - (_b = this.parent) === null || _b === void 0 ? void 0 : _b.children.delete(this); - this.instance = undefined; - sync.cancelSync.preRender(this.updateProjection); - }; - // only on the root - ProjectionNode.prototype.blockUpdate = function () { - this.updateManuallyBlocked = true; - }; - ProjectionNode.prototype.unblockUpdate = function () { - this.updateManuallyBlocked = false; - }; - ProjectionNode.prototype.isUpdateBlocked = function () { - return this.updateManuallyBlocked || this.updateBlockedByResize; - }; - ProjectionNode.prototype.isTreeAnimationBlocked = function () { - var _a; - return this.isAnimationBlocked || ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.isTreeAnimationBlocked()) || false; - }; - // Note: currently only running on root node - ProjectionNode.prototype.startUpdate = function () { - var _a; - if (this.isUpdateBlocked()) return; - this.isUpdating = true; - (_a = this.nodes) === null || _a === void 0 ? void 0 : _a.forEach(resetRotation); - }; - ProjectionNode.prototype.willUpdate = function (shouldNotifyListeners) { - var _a, _b, _c; - if (shouldNotifyListeners === void 0) { - shouldNotifyListeners = true; - } - if (this.root.isUpdateBlocked()) { - (_b = (_a = this.options).onExitComplete) === null || _b === void 0 ? void 0 : _b.call(_a); - return; - } - !this.root.isUpdating && this.root.startUpdate(); - if (this.isLayoutDirty) return; - this.isLayoutDirty = true; - for (var i = 0; i < this.path.length; i++) { - var node = this.path[i]; - node.shouldResetTransform = true; - /** - * TODO: Check we haven't updated the scroll - * since the last didUpdate - */ - node.updateScroll(); - } - var _d = this.options, - layoutId = _d.layoutId, - layout = _d.layout; - if (layoutId === undefined && !layout) return; - var transformTemplate = (_c = this.options.visualElement) === null || _c === void 0 ? void 0 : _c.getProps().transformTemplate; - this.prevTransformTemplateValue = transformTemplate === null || transformTemplate === void 0 ? void 0 : transformTemplate(this.latestValues, ""); - this.updateSnapshot(); - shouldNotifyListeners && this.notifyListeners("willUpdate"); - }; - // Note: Currently only running on root node - ProjectionNode.prototype.didUpdate = function () { - var updateWasBlocked = this.isUpdateBlocked(); - // When doing an instant transition, we skip the layout update, - // but should still clean up the measurements so that the next - // snapshot could be taken correctly. - if (updateWasBlocked) { - this.unblockUpdate(); - this.clearAllSnapshots(); - this.nodes.forEach(clearMeasurements); - return; - } - if (!this.isUpdating) return; - this.isUpdating = false; - /** - * Search for and mount newly-added projection elements. - * - * TODO: Every time a new component is rendered we could search up the tree for - * the closest mounted node and query from there rather than document. - */ - if (this.potentialNodes.size) { - this.potentialNodes.forEach(mountNodeEarly); - this.potentialNodes.clear(); - } - /** - * Write - */ - this.nodes.forEach(resetTransformStyle); - /** - * Read ================== - */ - // Update layout measurements of updated children - this.nodes.forEach(updateLayout); + _this.isLead() && ((_f = (_e = _this.options).onExitComplete) === null || _f === void 0 ? void 0 : _f.call(_e)); + } + _this.targetLayout = newLayout; + }); + } + }; + ProjectionNode.prototype.unmount = function () { + var _a, _b; + this.options.layoutId && this.willUpdate(); + this.root.nodes.remove(this); + (_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.remove(this); + (_b = this.parent) === null || _b === void 0 ? void 0 : _b.children.delete(this); + this.instance = undefined; + sync.cancelSync.preRender(this.updateProjection); + }; + // only on the root + ProjectionNode.prototype.blockUpdate = function () { + this.updateManuallyBlocked = true; + }; + ProjectionNode.prototype.unblockUpdate = function () { + this.updateManuallyBlocked = false; + }; + ProjectionNode.prototype.isUpdateBlocked = function () { + return this.updateManuallyBlocked || this.updateBlockedByResize; + }; + ProjectionNode.prototype.isTreeAnimationBlocked = function () { + var _a; + return this.isAnimationBlocked || ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.isTreeAnimationBlocked()) || false; + }; + // Note: currently only running on root node + ProjectionNode.prototype.startUpdate = function () { + var _a; + if (this.isUpdateBlocked()) return; + this.isUpdating = true; + (_a = this.nodes) === null || _a === void 0 ? void 0 : _a.forEach(resetRotation); + }; + ProjectionNode.prototype.willUpdate = function (shouldNotifyListeners) { + var _a, _b, _c; + if (shouldNotifyListeners === void 0) { + shouldNotifyListeners = true; + } + if (this.root.isUpdateBlocked()) { + (_b = (_a = this.options).onExitComplete) === null || _b === void 0 ? void 0 : _b.call(_a); + return; + } + !this.root.isUpdating && this.root.startUpdate(); + if (this.isLayoutDirty) return; + this.isLayoutDirty = true; + for (var i = 0; i < this.path.length; i++) { + var node = this.path[i]; + node.shouldResetTransform = true; /** - * Write + * TODO: Check we haven't updated the scroll + * since the last didUpdate */ - // Notify listeners that the layout is updated - this.nodes.forEach(notifyLayoutUpdate); + node.updateScroll(); + } + var _d = this.options, + layoutId = _d.layoutId, + layout = _d.layout; + if (layoutId === undefined && !layout) return; + var transformTemplate = (_c = this.options.visualElement) === null || _c === void 0 ? void 0 : _c.getProps().transformTemplate; + this.prevTransformTemplateValue = transformTemplate === null || transformTemplate === void 0 ? void 0 : transformTemplate(this.latestValues, ""); + this.updateSnapshot(); + shouldNotifyListeners && this.notifyListeners("willUpdate"); + }; + // Note: Currently only running on root node + ProjectionNode.prototype.didUpdate = function () { + var updateWasBlocked = this.isUpdateBlocked(); + // When doing an instant transition, we skip the layout update, + // but should still clean up the measurements so that the next + // snapshot could be taken correctly. + if (updateWasBlocked) { + this.unblockUpdate(); this.clearAllSnapshots(); - // Flush any scheduled updates - sync.flushSync.update(); - sync.flushSync.preRender(); - sync.flushSync.render(); - }; - ProjectionNode.prototype.clearAllSnapshots = function () { - this.nodes.forEach(clearSnapshot); - this.sharedNodes.forEach(removeLeadSnapshots); - }; - ProjectionNode.prototype.scheduleUpdateProjection = function () { - sync__default["default"].preRender(this.updateProjection, false, true); - }; - ProjectionNode.prototype.scheduleCheckAfterUnmount = function () { - var _this = this; - /** - * If the unmounting node is in a layoutGroup and did trigger a willUpdate, - * we manually call didUpdate to give a chance to the siblings to animate. - * Otherwise, cleanup all snapshots to prevents future nodes from reusing them. - */ - sync__default["default"].postRender(function () { - if (_this.isLayoutDirty) { - _this.root.didUpdate(); - } else { - _this.root.checkUpdateFailed(); - } - }); - }; + this.nodes.forEach(clearMeasurements); + return; + } + if (!this.isUpdating) return; + this.isUpdating = false; + /** + * Search for and mount newly-added projection elements. + * + * TODO: Every time a new component is rendered we could search up the tree for + * the closest mounted node and query from there rather than document. + */ + if (this.potentialNodes.size) { + this.potentialNodes.forEach(mountNodeEarly); + this.potentialNodes.clear(); + } /** - * Update measurements + * Write */ - ProjectionNode.prototype.updateSnapshot = function () { - if (this.snapshot || !this.instance) return; - var measured = this.measure(); - var layout = this.removeTransform(this.removeElementScroll(measured)); - roundBox(layout); - this.snapshot = { - measured: measured, - layout: layout, - latestValues: {} - }; - }; - ProjectionNode.prototype.updateLayout = function () { - var _a; - if (!this.instance) return; - // TODO: Incorporate into a forwarded scroll offset - this.updateScroll(); - if (!(this.options.alwaysMeasureLayout && this.isLead()) && !this.isLayoutDirty) { - return; - } - /** - * When a node is mounted, it simply resumes from the prevLead's - * snapshot instead of taking a new one, but the ancestors scroll - * might have updated while the prevLead is unmounted. We need to - * update the scroll again to make sure the layout we measure is - * up to date. - */ - if (this.resumeFrom && !this.resumeFrom.instance) { - for (var i = 0; i < this.path.length; i++) { - var node = this.path[i]; - node.updateScroll(); - } - } - var measured = this.measure(); - roundBox(measured); - var prevLayout = this.layout; - this.layout = { - measured: measured, - actual: this.removeElementScroll(measured) - }; - this.layoutCorrected = createBox(); - this.isLayoutDirty = false; - this.projectionDelta = undefined; - this.notifyListeners("measure", this.layout.actual); - (_a = this.options.visualElement) === null || _a === void 0 ? void 0 : _a.notifyLayoutMeasure(this.layout.actual, prevLayout === null || prevLayout === void 0 ? void 0 : prevLayout.actual); - }; - ProjectionNode.prototype.updateScroll = function () { - if (this.options.layoutScroll && this.instance) { - this.isScrollRoot = checkIsScrollRoot(this.instance); - this.scroll = measureScroll(this.instance); - } - }; - ProjectionNode.prototype.resetTransform = function () { - var _a; - if (!resetTransform) return; - var isResetRequested = this.isLayoutDirty || this.shouldResetTransform; - var hasProjection = this.projectionDelta && !isDeltaZero(this.projectionDelta); - var transformTemplate = (_a = this.options.visualElement) === null || _a === void 0 ? void 0 : _a.getProps().transformTemplate; - var transformTemplateValue = transformTemplate === null || transformTemplate === void 0 ? void 0 : transformTemplate(this.latestValues, ""); - var transformTemplateHasChanged = transformTemplateValue !== this.prevTransformTemplateValue; - if (isResetRequested && (hasProjection || hasTransform(this.latestValues) || transformTemplateHasChanged)) { - resetTransform(this.instance, transformTemplateValue); - this.shouldResetTransform = false; - this.scheduleRender(); + this.nodes.forEach(resetTransformStyle); + /** + * Read ================== + */ + // Update layout measurements of updated children + this.nodes.forEach(updateLayout); + /** + * Write + */ + // Notify listeners that the layout is updated + this.nodes.forEach(notifyLayoutUpdate); + this.clearAllSnapshots(); + // Flush any scheduled updates + sync.flushSync.update(); + sync.flushSync.preRender(); + sync.flushSync.render(); + }; + ProjectionNode.prototype.clearAllSnapshots = function () { + this.nodes.forEach(clearSnapshot); + this.sharedNodes.forEach(removeLeadSnapshots); + }; + ProjectionNode.prototype.scheduleUpdateProjection = function () { + sync__default["default"].preRender(this.updateProjection, false, true); + }; + ProjectionNode.prototype.scheduleCheckAfterUnmount = function () { + var _this = this; + /** + * If the unmounting node is in a layoutGroup and did trigger a willUpdate, + * we manually call didUpdate to give a chance to the siblings to animate. + * Otherwise, cleanup all snapshots to prevents future nodes from reusing them. + */ + sync__default["default"].postRender(function () { + if (_this.isLayoutDirty) { + _this.root.didUpdate(); + } else { + _this.root.checkUpdateFailed(); } + }); + }; + /** + * Update measurements + */ + ProjectionNode.prototype.updateSnapshot = function () { + if (this.snapshot || !this.instance) return; + var measured = this.measure(); + var layout = this.removeTransform(this.removeElementScroll(measured)); + roundBox(layout); + this.snapshot = { + measured: measured, + layout: layout, + latestValues: {} }; - ProjectionNode.prototype.measure = function () { - var visualElement = this.options.visualElement; - if (!visualElement) return createBox(); - var box = visualElement.measureViewportBox(); - // Remove viewport scroll to give page-relative coordinates - var scroll = this.root.scroll; - if (scroll) { - translateAxis(box.x, scroll.x); - translateAxis(box.y, scroll.y); - } - return box; - }; - ProjectionNode.prototype.removeElementScroll = function (box) { - var boxWithoutScroll = createBox(); - copyBoxInto(boxWithoutScroll, box); - /** - * Performance TODO: Keep a cumulative scroll offset down the tree - * rather than loop back up the path. - */ + }; + ProjectionNode.prototype.updateLayout = function () { + var _a; + if (!this.instance) return; + // TODO: Incorporate into a forwarded scroll offset + this.updateScroll(); + if (!(this.options.alwaysMeasureLayout && this.isLead()) && !this.isLayoutDirty) { + return; + } + /** + * When a node is mounted, it simply resumes from the prevLead's + * snapshot instead of taking a new one, but the ancestors scroll + * might have updated while the prevLead is unmounted. We need to + * update the scroll again to make sure the layout we measure is + * up to date. + */ + if (this.resumeFrom && !this.resumeFrom.instance) { for (var i = 0; i < this.path.length; i++) { var node = this.path[i]; - var scroll_1 = node.scroll, - options = node.options, - isScrollRoot = node.isScrollRoot; - if (node !== this.root && scroll_1 && options.layoutScroll) { + node.updateScroll(); + } + } + var measured = this.measure(); + roundBox(measured); + var prevLayout = this.layout; + this.layout = { + measured: measured, + actual: this.removeElementScroll(measured) + }; + this.layoutCorrected = createBox(); + this.isLayoutDirty = false; + this.projectionDelta = undefined; + this.notifyListeners("measure", this.layout.actual); + (_a = this.options.visualElement) === null || _a === void 0 ? void 0 : _a.notifyLayoutMeasure(this.layout.actual, prevLayout === null || prevLayout === void 0 ? void 0 : prevLayout.actual); + }; + ProjectionNode.prototype.updateScroll = function () { + if (this.options.layoutScroll && this.instance) { + this.isScrollRoot = checkIsScrollRoot(this.instance); + this.scroll = measureScroll(this.instance); + } + }; + ProjectionNode.prototype.resetTransform = function () { + var _a; + if (!resetTransform) return; + var isResetRequested = this.isLayoutDirty || this.shouldResetTransform; + var hasProjection = this.projectionDelta && !isDeltaZero(this.projectionDelta); + var transformTemplate = (_a = this.options.visualElement) === null || _a === void 0 ? void 0 : _a.getProps().transformTemplate; + var transformTemplateValue = transformTemplate === null || transformTemplate === void 0 ? void 0 : transformTemplate(this.latestValues, ""); + var transformTemplateHasChanged = transformTemplateValue !== this.prevTransformTemplateValue; + if (isResetRequested && (hasProjection || hasTransform(this.latestValues) || transformTemplateHasChanged)) { + resetTransform(this.instance, transformTemplateValue); + this.shouldResetTransform = false; + this.scheduleRender(); + } + }; + ProjectionNode.prototype.measure = function () { + var visualElement = this.options.visualElement; + if (!visualElement) return createBox(); + var box = visualElement.measureViewportBox(); + // Remove viewport scroll to give page-relative coordinates + var scroll = this.root.scroll; + if (scroll) { + translateAxis(box.x, scroll.x); + translateAxis(box.y, scroll.y); + } + return box; + }; + ProjectionNode.prototype.removeElementScroll = function (box) { + var boxWithoutScroll = createBox(); + copyBoxInto(boxWithoutScroll, box); + /** + * Performance TODO: Keep a cumulative scroll offset down the tree + * rather than loop back up the path. + */ + for (var i = 0; i < this.path.length; i++) { + var node = this.path[i]; + var scroll_1 = node.scroll, + options = node.options, + isScrollRoot = node.isScrollRoot; + if (node !== this.root && scroll_1 && options.layoutScroll) { + /** + * If this is a new scroll root, we want to remove all previous scrolls + * from the viewport box. + */ + if (isScrollRoot) { + copyBoxInto(boxWithoutScroll, box); + var rootScroll = this.root.scroll; /** - * If this is a new scroll root, we want to remove all previous scrolls - * from the viewport box. + * Undo the application of page scroll that was originally added + * to the measured bounding box. */ - if (isScrollRoot) { - copyBoxInto(boxWithoutScroll, box); - var rootScroll = this.root.scroll; - /** - * Undo the application of page scroll that was originally added - * to the measured bounding box. - */ - if (rootScroll) { - translateAxis(boxWithoutScroll.x, -rootScroll.x); - translateAxis(boxWithoutScroll.y, -rootScroll.y); - } + if (rootScroll) { + translateAxis(boxWithoutScroll.x, -rootScroll.x); + translateAxis(boxWithoutScroll.y, -rootScroll.y); } - translateAxis(boxWithoutScroll.x, scroll_1.x); - translateAxis(boxWithoutScroll.y, scroll_1.y); - } - } - return boxWithoutScroll; - }; - ProjectionNode.prototype.applyTransform = function (box, transformOnly) { - if (transformOnly === void 0) { - transformOnly = false; - } - var withTransforms = createBox(); - copyBoxInto(withTransforms, box); - for (var i = 0; i < this.path.length; i++) { - var node = this.path[i]; - if (!transformOnly && node.options.layoutScroll && node.scroll && node !== node.root) { - transformBox(withTransforms, { - x: -node.scroll.x, - y: -node.scroll.y - }); } - if (!hasTransform(node.latestValues)) continue; - transformBox(withTransforms, node.latestValues); + translateAxis(boxWithoutScroll.x, scroll_1.x); + translateAxis(boxWithoutScroll.y, scroll_1.y); } - if (hasTransform(this.latestValues)) { - transformBox(withTransforms, this.latestValues); + } + return boxWithoutScroll; + }; + ProjectionNode.prototype.applyTransform = function (box, transformOnly) { + if (transformOnly === void 0) { + transformOnly = false; + } + var withTransforms = createBox(); + copyBoxInto(withTransforms, box); + for (var i = 0; i < this.path.length; i++) { + var node = this.path[i]; + if (!transformOnly && node.options.layoutScroll && node.scroll && node !== node.root) { + transformBox(withTransforms, { + x: -node.scroll.x, + y: -node.scroll.y + }); } - return withTransforms; - }; - ProjectionNode.prototype.removeTransform = function (box) { - var _a; - var boxWithoutTransform = createBox(); - copyBoxInto(boxWithoutTransform, box); - for (var i = 0; i < this.path.length; i++) { - var node = this.path[i]; - if (!node.instance) continue; - if (!hasTransform(node.latestValues)) continue; - hasScale(node.latestValues) && node.updateSnapshot(); - var sourceBox = createBox(); - var nodeBox = node.measure(); - copyBoxInto(sourceBox, nodeBox); - removeBoxTransforms(boxWithoutTransform, node.latestValues, (_a = node.snapshot) === null || _a === void 0 ? void 0 : _a.layout, sourceBox); - } - if (hasTransform(this.latestValues)) { - removeBoxTransforms(boxWithoutTransform, this.latestValues); - } - return boxWithoutTransform; - }; + if (!hasTransform(node.latestValues)) continue; + transformBox(withTransforms, node.latestValues); + } + if (hasTransform(this.latestValues)) { + transformBox(withTransforms, this.latestValues); + } + return withTransforms; + }; + ProjectionNode.prototype.removeTransform = function (box) { + var _a; + var boxWithoutTransform = createBox(); + copyBoxInto(boxWithoutTransform, box); + for (var i = 0; i < this.path.length; i++) { + var node = this.path[i]; + if (!node.instance) continue; + if (!hasTransform(node.latestValues)) continue; + hasScale(node.latestValues) && node.updateSnapshot(); + var sourceBox = createBox(); + var nodeBox = node.measure(); + copyBoxInto(sourceBox, nodeBox); + removeBoxTransforms(boxWithoutTransform, node.latestValues, (_a = node.snapshot) === null || _a === void 0 ? void 0 : _a.layout, sourceBox); + } + if (hasTransform(this.latestValues)) { + removeBoxTransforms(boxWithoutTransform, this.latestValues); + } + return boxWithoutTransform; + }; + /** + * + */ + ProjectionNode.prototype.setTargetDelta = function (delta) { + this.targetDelta = delta; + this.root.scheduleUpdateProjection(); + }; + ProjectionNode.prototype.setOptions = function (options) { + var _a; + this.options = tslib.__assign(tslib.__assign(tslib.__assign({}, this.options), options), { + crossfade: (_a = options.crossfade) !== null && _a !== void 0 ? _a : true + }); + }; + ProjectionNode.prototype.clearMeasurements = function () { + this.scroll = undefined; + this.layout = undefined; + this.snapshot = undefined; + this.prevTransformTemplateValue = undefined; + this.targetDelta = undefined; + this.target = undefined; + this.isLayoutDirty = false; + }; + /** + * Frame calculations + */ + ProjectionNode.prototype.resolveTargetDelta = function () { + var _a; + var _b = this.options, + layout = _b.layout, + layoutId = _b.layoutId; /** - * + * If we have no layout, we can't perform projection, so early return */ - ProjectionNode.prototype.setTargetDelta = function (delta) { - this.targetDelta = delta; - this.root.scheduleUpdateProjection(); - }; - ProjectionNode.prototype.setOptions = function (options) { - var _a; - this.options = tslib.__assign(tslib.__assign(tslib.__assign({}, this.options), options), { - crossfade: (_a = options.crossfade) !== null && _a !== void 0 ? _a : true - }); - }; - ProjectionNode.prototype.clearMeasurements = function () { - this.scroll = undefined; - this.layout = undefined; - this.snapshot = undefined; - this.prevTransformTemplateValue = undefined; - this.targetDelta = undefined; - this.target = undefined; - this.isLayoutDirty = false; - }; + if (!this.layout || !(layout || layoutId)) return; /** - * Frame calculations + * If we don't have a targetDelta but do have a layout, we can attempt to resolve + * a relativeParent. This will allow a component to perform scale correction + * even if no animation has started. */ - ProjectionNode.prototype.resolveTargetDelta = function () { - var _a; - var _b = this.options, - layout = _b.layout, - layoutId = _b.layoutId; - /** - * If we have no layout, we can't perform projection, so early return - */ - if (!this.layout || !(layout || layoutId)) return; - /** - * If we don't have a targetDelta but do have a layout, we can attempt to resolve - * a relativeParent. This will allow a component to perform scale correction - * even if no animation has started. - */ - // TODO If this is unsuccessful this currently happens every frame - if (!this.targetDelta && !this.relativeTarget) { - // TODO: This is a semi-repetition of further down this function, make DRY - this.relativeParent = this.getClosestProjectingParent(); - if (this.relativeParent && this.relativeParent.layout) { - this.relativeTarget = createBox(); - this.relativeTargetOrigin = createBox(); - calcRelativePosition(this.relativeTargetOrigin, this.layout.actual, this.relativeParent.layout.actual); - copyBoxInto(this.relativeTarget, this.relativeTargetOrigin); - } - } - /** - * If we have no relative target or no target delta our target isn't valid - * for this frame. - */ - if (!this.relativeTarget && !this.targetDelta) return; - /** - * Lazy-init target data structure - */ - if (!this.target) { - this.target = createBox(); - this.targetWithTransforms = createBox(); + // TODO If this is unsuccessful this currently happens every frame + if (!this.targetDelta && !this.relativeTarget) { + // TODO: This is a semi-repetition of further down this function, make DRY + this.relativeParent = this.getClosestProjectingParent(); + if (this.relativeParent && this.relativeParent.layout) { + this.relativeTarget = createBox(); + this.relativeTargetOrigin = createBox(); + calcRelativePosition(this.relativeTargetOrigin, this.layout.actual, this.relativeParent.layout.actual); + copyBoxInto(this.relativeTarget, this.relativeTargetOrigin); } + } + /** + * If we have no relative target or no target delta our target isn't valid + * for this frame. + */ + if (!this.relativeTarget && !this.targetDelta) return; + /** + * Lazy-init target data structure + */ + if (!this.target) { + this.target = createBox(); + this.targetWithTransforms = createBox(); + } + /** + * If we've got a relative box for this component, resolve it into a target relative to the parent. + */ + if (this.relativeTarget && this.relativeTargetOrigin && ((_a = this.relativeParent) === null || _a === void 0 ? void 0 : _a.target)) { + calcRelativeBox(this.target, this.relativeTarget, this.relativeParent.target); /** - * If we've got a relative box for this component, resolve it into a target relative to the parent. + * If we've only got a targetDelta, resolve it into a target */ - if (this.relativeTarget && this.relativeTargetOrigin && ((_a = this.relativeParent) === null || _a === void 0 ? void 0 : _a.target)) { - calcRelativeBox(this.target, this.relativeTarget, this.relativeParent.target); - /** - * If we've only got a targetDelta, resolve it into a target - */ - } else if (this.targetDelta) { - if (Boolean(this.resumingFrom)) { - // TODO: This is creating a new object every frame - this.target = this.applyTransform(this.layout.actual); - } else { - copyBoxInto(this.target, this.layout.actual); - } - applyBoxDelta(this.target, this.targetDelta); + } else if (this.targetDelta) { + if (Boolean(this.resumingFrom)) { + // TODO: This is creating a new object every frame + this.target = this.applyTransform(this.layout.actual); } else { - /** - * If no target, use own layout as target - */ copyBoxInto(this.target, this.layout.actual); } + applyBoxDelta(this.target, this.targetDelta); + } else { /** - * If we've been told to attempt to resolve a relative target, do so. - */ - if (this.attemptToResolveRelativeTarget) { - this.attemptToResolveRelativeTarget = false; - this.relativeParent = this.getClosestProjectingParent(); - if (this.relativeParent && Boolean(this.relativeParent.resumingFrom) === Boolean(this.resumingFrom) && !this.relativeParent.options.layoutScroll && this.relativeParent.target) { - this.relativeTarget = createBox(); - this.relativeTargetOrigin = createBox(); - calcRelativePosition(this.relativeTargetOrigin, this.target, this.relativeParent.target); - copyBoxInto(this.relativeTarget, this.relativeTargetOrigin); - } - } - }; - ProjectionNode.prototype.getClosestProjectingParent = function () { - if (!this.parent || hasTransform(this.parent.latestValues)) return undefined; - if ((this.parent.relativeTarget || this.parent.targetDelta) && this.parent.layout) { - return this.parent; - } else { - return this.parent.getClosestProjectingParent(); - } - }; - ProjectionNode.prototype.calcProjection = function () { - var _a; - var _b = this.options, - layout = _b.layout, - layoutId = _b.layoutId; - /** - * If this section of the tree isn't animating we can - * delete our target sources for the following frame. - */ - this.isTreeAnimating = Boolean(((_a = this.parent) === null || _a === void 0 ? void 0 : _a.isTreeAnimating) || this.currentAnimation || this.pendingAnimation); - if (!this.isTreeAnimating) { - this.targetDelta = this.relativeTarget = undefined; - } - if (!this.layout || !(layout || layoutId)) return; - var lead = this.getLead(); - /** - * Reset the corrected box with the latest values from box, as we're then going - * to perform mutative operations on it. - */ - copyBoxInto(this.layoutCorrected, this.layout.actual); - /** - * Apply all the parent deltas to this box to produce the corrected box. This - * is the layout box, as it will appear on screen as a result of the transforms of its parents. - */ - applyTreeDeltas(this.layoutCorrected, this.treeScale, this.path, Boolean(this.resumingFrom) || this !== lead); - var target = lead.target; - if (!target) return; - if (!this.projectionDelta) { - this.projectionDelta = createDelta(); - this.projectionDeltaWithTransform = createDelta(); - } - var prevTreeScaleX = this.treeScale.x; - var prevTreeScaleY = this.treeScale.y; - var prevProjectionTransform = this.projectionTransform; - /** - * Update the delta between the corrected box and the target box before user-set transforms were applied. - * This will allow us to calculate the corrected borderRadius and boxShadow to compensate - * for our layout reprojection, but still allow them to be scaled correctly by the user. - * It might be that to simplify this we may want to accept that user-set scale is also corrected - * and we wouldn't have to keep and calc both deltas, OR we could support a user setting - * to allow people to choose whether these styles are corrected based on just the - * layout reprojection or the final bounding box. + * If no target, use own layout as target */ - calcBoxDelta(this.projectionDelta, this.layoutCorrected, target, this.latestValues); - this.projectionTransform = buildProjectionTransform(this.projectionDelta, this.treeScale); - if (this.projectionTransform !== prevProjectionTransform || this.treeScale.x !== prevTreeScaleX || this.treeScale.y !== prevTreeScaleY) { - this.hasProjected = true; - this.scheduleRender(); - this.notifyListeners("projectionUpdate", target); - } - }; - ProjectionNode.prototype.hide = function () { - this.isVisible = false; - // TODO: Schedule render - }; - - ProjectionNode.prototype.show = function () { - this.isVisible = true; - // TODO: Schedule render - }; - - ProjectionNode.prototype.scheduleRender = function (notifyAll) { - var _a, _b, _c; - if (notifyAll === void 0) { - notifyAll = true; - } - (_b = (_a = this.options).scheduleRender) === null || _b === void 0 ? void 0 : _b.call(_a); - notifyAll && ((_c = this.getStack()) === null || _c === void 0 ? void 0 : _c.scheduleRender()); - if (this.resumingFrom && !this.resumingFrom.instance) { - this.resumingFrom = undefined; + copyBoxInto(this.target, this.layout.actual); + } + /** + * If we've been told to attempt to resolve a relative target, do so. + */ + if (this.attemptToResolveRelativeTarget) { + this.attemptToResolveRelativeTarget = false; + this.relativeParent = this.getClosestProjectingParent(); + if (this.relativeParent && Boolean(this.relativeParent.resumingFrom) === Boolean(this.resumingFrom) && !this.relativeParent.options.layoutScroll && this.relativeParent.target) { + this.relativeTarget = createBox(); + this.relativeTargetOrigin = createBox(); + calcRelativePosition(this.relativeTargetOrigin, this.target, this.relativeParent.target); + copyBoxInto(this.relativeTarget, this.relativeTargetOrigin); } - }; - ProjectionNode.prototype.setAnimationOrigin = function (delta, hasOnlyRelativeTargetChanged) { - var _this = this; + } + }; + ProjectionNode.prototype.getClosestProjectingParent = function () { + if (!this.parent || hasTransform(this.parent.latestValues)) return undefined; + if ((this.parent.relativeTarget || this.parent.targetDelta) && this.parent.layout) { + return this.parent; + } else { + return this.parent.getClosestProjectingParent(); + } + }; + ProjectionNode.prototype.calcProjection = function () { + var _a; + var _b = this.options, + layout = _b.layout, + layoutId = _b.layoutId; + /** + * If this section of the tree isn't animating we can + * delete our target sources for the following frame. + */ + this.isTreeAnimating = Boolean(((_a = this.parent) === null || _a === void 0 ? void 0 : _a.isTreeAnimating) || this.currentAnimation || this.pendingAnimation); + if (!this.isTreeAnimating) { + this.targetDelta = this.relativeTarget = undefined; + } + if (!this.layout || !(layout || layoutId)) return; + var lead = this.getLead(); + /** + * Reset the corrected box with the latest values from box, as we're then going + * to perform mutative operations on it. + */ + copyBoxInto(this.layoutCorrected, this.layout.actual); + /** + * Apply all the parent deltas to this box to produce the corrected box. This + * is the layout box, as it will appear on screen as a result of the transforms of its parents. + */ + applyTreeDeltas(this.layoutCorrected, this.treeScale, this.path, Boolean(this.resumingFrom) || this !== lead); + var target = lead.target; + if (!target) return; + if (!this.projectionDelta) { + this.projectionDelta = createDelta(); + this.projectionDeltaWithTransform = createDelta(); + } + var prevTreeScaleX = this.treeScale.x; + var prevTreeScaleY = this.treeScale.y; + var prevProjectionTransform = this.projectionTransform; + /** + * Update the delta between the corrected box and the target box before user-set transforms were applied. + * This will allow us to calculate the corrected borderRadius and boxShadow to compensate + * for our layout reprojection, but still allow them to be scaled correctly by the user. + * It might be that to simplify this we may want to accept that user-set scale is also corrected + * and we wouldn't have to keep and calc both deltas, OR we could support a user setting + * to allow people to choose whether these styles are corrected based on just the + * layout reprojection or the final bounding box. + */ + calcBoxDelta(this.projectionDelta, this.layoutCorrected, target, this.latestValues); + this.projectionTransform = buildProjectionTransform(this.projectionDelta, this.treeScale); + if (this.projectionTransform !== prevProjectionTransform || this.treeScale.x !== prevTreeScaleX || this.treeScale.y !== prevTreeScaleY) { + this.hasProjected = true; + this.scheduleRender(); + this.notifyListeners("projectionUpdate", target); + } + }; + ProjectionNode.prototype.hide = function () { + this.isVisible = false; + // TODO: Schedule render + }; + ProjectionNode.prototype.show = function () { + this.isVisible = true; + // TODO: Schedule render + }; + ProjectionNode.prototype.scheduleRender = function (notifyAll) { + var _a, _b, _c; + if (notifyAll === void 0) { + notifyAll = true; + } + (_b = (_a = this.options).scheduleRender) === null || _b === void 0 ? void 0 : _b.call(_a); + notifyAll && ((_c = this.getStack()) === null || _c === void 0 ? void 0 : _c.scheduleRender()); + if (this.resumingFrom && !this.resumingFrom.instance) { + this.resumingFrom = undefined; + } + }; + ProjectionNode.prototype.setAnimationOrigin = function (delta, hasOnlyRelativeTargetChanged) { + var _this = this; + var _a; + if (hasOnlyRelativeTargetChanged === void 0) { + hasOnlyRelativeTargetChanged = false; + } + var snapshot = this.snapshot; + var snapshotLatestValues = (snapshot === null || snapshot === void 0 ? void 0 : snapshot.latestValues) || {}; + var mixedValues = tslib.__assign({}, this.latestValues); + var targetDelta = createDelta(); + this.relativeTarget = this.relativeTargetOrigin = undefined; + this.attemptToResolveRelativeTarget = !hasOnlyRelativeTargetChanged; + var relativeLayout = createBox(); + var isSharedLayoutAnimation = snapshot === null || snapshot === void 0 ? void 0 : snapshot.isShared; + var isOnlyMember = (((_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.members.length) || 0) <= 1; + var shouldCrossfadeOpacity = Boolean(isSharedLayoutAnimation && !isOnlyMember && this.options.crossfade === true && !this.path.some(hasOpacityCrossfade)); + this.animationProgress = 0; + this.mixTargetDelta = function (latest) { var _a; - if (hasOnlyRelativeTargetChanged === void 0) { - hasOnlyRelativeTargetChanged = false; - } - var snapshot = this.snapshot; - var snapshotLatestValues = (snapshot === null || snapshot === void 0 ? void 0 : snapshot.latestValues) || {}; - var mixedValues = tslib.__assign({}, this.latestValues); - var targetDelta = createDelta(); - this.relativeTarget = this.relativeTargetOrigin = undefined; - this.attemptToResolveRelativeTarget = !hasOnlyRelativeTargetChanged; - var relativeLayout = createBox(); - var isSharedLayoutAnimation = snapshot === null || snapshot === void 0 ? void 0 : snapshot.isShared; - var isOnlyMember = (((_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.members.length) || 0) <= 1; - var shouldCrossfadeOpacity = Boolean(isSharedLayoutAnimation && !isOnlyMember && this.options.crossfade === true && !this.path.some(hasOpacityCrossfade)); - this.animationProgress = 0; - this.mixTargetDelta = function (latest) { - var _a; - var progress = latest / 1000; - mixAxisDelta(targetDelta.x, delta.x, progress); - mixAxisDelta(targetDelta.y, delta.y, progress); - _this.setTargetDelta(targetDelta); - if (_this.relativeTarget && _this.relativeTargetOrigin && _this.layout && ((_a = _this.relativeParent) === null || _a === void 0 ? void 0 : _a.layout)) { - calcRelativePosition(relativeLayout, _this.layout.actual, _this.relativeParent.layout.actual); - mixBox(_this.relativeTarget, _this.relativeTargetOrigin, relativeLayout, progress); - } - if (isSharedLayoutAnimation) { - _this.animationValues = mixedValues; - mixValues(mixedValues, snapshotLatestValues, _this.latestValues, progress, shouldCrossfadeOpacity, isOnlyMember); - } - _this.root.scheduleUpdateProjection(); - _this.scheduleRender(); - _this.animationProgress = progress; - }; - this.mixTargetDelta(0); + var progress = latest / 1000; + mixAxisDelta(targetDelta.x, delta.x, progress); + mixAxisDelta(targetDelta.y, delta.y, progress); + _this.setTargetDelta(targetDelta); + if (_this.relativeTarget && _this.relativeTargetOrigin && _this.layout && ((_a = _this.relativeParent) === null || _a === void 0 ? void 0 : _a.layout)) { + calcRelativePosition(relativeLayout, _this.layout.actual, _this.relativeParent.layout.actual); + mixBox(_this.relativeTarget, _this.relativeTargetOrigin, relativeLayout, progress); + } + if (isSharedLayoutAnimation) { + _this.animationValues = mixedValues; + mixValues(mixedValues, snapshotLatestValues, _this.latestValues, progress, shouldCrossfadeOpacity, isOnlyMember); + } + _this.root.scheduleUpdateProjection(); + _this.scheduleRender(); + _this.animationProgress = progress; }; - ProjectionNode.prototype.startAnimation = function (options) { - var _this = this; - var _a, _b; - this.notifyListeners("animationStart"); - (_a = this.currentAnimation) === null || _a === void 0 ? void 0 : _a.stop(); - if (this.resumingFrom) { - (_b = this.resumingFrom.currentAnimation) === null || _b === void 0 ? void 0 : _b.stop(); - } - if (this.pendingAnimation) { - sync.cancelSync.update(this.pendingAnimation); - this.pendingAnimation = undefined; - } - /** - * Start the animation in the next frame to have a frame with progress 0, - * where the target is the same as when the animation started, so we can - * calculate the relative positions correctly for instant transitions. - */ - this.pendingAnimation = sync__default["default"].update(function () { - globalProjectionState.hasAnimatedSinceResize = true; - _this.currentAnimation = animate(0, animationTarget, tslib.__assign(tslib.__assign({}, options), { - onUpdate: function (latest) { - var _a; - _this.mixTargetDelta(latest); - (_a = options.onUpdate) === null || _a === void 0 ? void 0 : _a.call(options, latest); - }, - onComplete: function () { - var _a; - (_a = options.onComplete) === null || _a === void 0 ? void 0 : _a.call(options); - _this.completeAnimation(); - } - })); - if (_this.resumingFrom) { - _this.resumingFrom.currentAnimation = _this.currentAnimation; + this.mixTargetDelta(0); + }; + ProjectionNode.prototype.startAnimation = function (options) { + var _this = this; + var _a, _b; + this.notifyListeners("animationStart"); + (_a = this.currentAnimation) === null || _a === void 0 ? void 0 : _a.stop(); + if (this.resumingFrom) { + (_b = this.resumingFrom.currentAnimation) === null || _b === void 0 ? void 0 : _b.stop(); + } + if (this.pendingAnimation) { + sync.cancelSync.update(this.pendingAnimation); + this.pendingAnimation = undefined; + } + /** + * Start the animation in the next frame to have a frame with progress 0, + * where the target is the same as when the animation started, so we can + * calculate the relative positions correctly for instant transitions. + */ + this.pendingAnimation = sync__default["default"].update(function () { + globalProjectionState.hasAnimatedSinceResize = true; + _this.currentAnimation = animate(0, animationTarget, tslib.__assign(tslib.__assign({}, options), { + onUpdate: function (latest) { + var _a; + _this.mixTargetDelta(latest); + (_a = options.onUpdate) === null || _a === void 0 ? void 0 : _a.call(options, latest); + }, + onComplete: function () { + var _a; + (_a = options.onComplete) === null || _a === void 0 ? void 0 : _a.call(options); + _this.completeAnimation(); } - _this.pendingAnimation = undefined; - }); - }; - ProjectionNode.prototype.completeAnimation = function () { - var _a; - if (this.resumingFrom) { - this.resumingFrom.currentAnimation = undefined; - this.resumingFrom.preserveOpacity = undefined; + })); + if (_this.resumingFrom) { + _this.resumingFrom.currentAnimation = _this.currentAnimation; } - (_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.exitAnimationComplete(); - this.resumingFrom = this.currentAnimation = this.animationValues = undefined; - this.notifyListeners("animationComplete"); - }; - ProjectionNode.prototype.finishAnimation = function () { - var _a; - if (this.currentAnimation) { - (_a = this.mixTargetDelta) === null || _a === void 0 ? void 0 : _a.call(this, animationTarget); - this.currentAnimation.stop(); + _this.pendingAnimation = undefined; + }); + }; + ProjectionNode.prototype.completeAnimation = function () { + var _a; + if (this.resumingFrom) { + this.resumingFrom.currentAnimation = undefined; + this.resumingFrom.preserveOpacity = undefined; + } + (_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.exitAnimationComplete(); + this.resumingFrom = this.currentAnimation = this.animationValues = undefined; + this.notifyListeners("animationComplete"); + }; + ProjectionNode.prototype.finishAnimation = function () { + var _a; + if (this.currentAnimation) { + (_a = this.mixTargetDelta) === null || _a === void 0 ? void 0 : _a.call(this, animationTarget); + this.currentAnimation.stop(); + } + this.completeAnimation(); + }; + ProjectionNode.prototype.applyTransformsToTarget = function () { + var _a = this.getLead(), + targetWithTransforms = _a.targetWithTransforms, + target = _a.target, + layout = _a.layout, + latestValues = _a.latestValues; + if (!targetWithTransforms || !target || !layout) return; + copyBoxInto(targetWithTransforms, target); + /** + * Apply the latest user-set transforms to the targetBox to produce the targetBoxFinal. + * This is the final box that we will then project into by calculating a transform delta and + * applying it to the corrected box. + */ + transformBox(targetWithTransforms, latestValues); + /** + * Update the delta between the corrected box and the final target box, after + * user-set transforms are applied to it. This will be used by the renderer to + * create a transform style that will reproject the element from its actual layout + * into the desired bounding box. + */ + calcBoxDelta(this.projectionDeltaWithTransform, this.layoutCorrected, targetWithTransforms, latestValues); + }; + ProjectionNode.prototype.registerSharedNode = function (layoutId, node) { + var _a, _b, _c; + if (!this.sharedNodes.has(layoutId)) { + this.sharedNodes.set(layoutId, new NodeStack()); + } + var stack = this.sharedNodes.get(layoutId); + stack.add(node); + node.promote({ + transition: (_a = node.options.initialPromotionConfig) === null || _a === void 0 ? void 0 : _a.transition, + preserveFollowOpacity: (_c = (_b = node.options.initialPromotionConfig) === null || _b === void 0 ? void 0 : _b.shouldPreserveFollowOpacity) === null || _c === void 0 ? void 0 : _c.call(_b, node) + }); + }; + ProjectionNode.prototype.isLead = function () { + var stack = this.getStack(); + return stack ? stack.lead === this : true; + }; + ProjectionNode.prototype.getLead = function () { + var _a; + var layoutId = this.options.layoutId; + return layoutId ? ((_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.lead) || this : this; + }; + ProjectionNode.prototype.getPrevLead = function () { + var _a; + var layoutId = this.options.layoutId; + return layoutId ? (_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.prevLead : undefined; + }; + ProjectionNode.prototype.getStack = function () { + var layoutId = this.options.layoutId; + if (layoutId) return this.root.sharedNodes.get(layoutId); + }; + ProjectionNode.prototype.promote = function (_a) { + var _b = _a === void 0 ? {} : _a, + needsReset = _b.needsReset, + transition = _b.transition, + preserveFollowOpacity = _b.preserveFollowOpacity; + var stack = this.getStack(); + if (stack) stack.promote(this, preserveFollowOpacity); + if (needsReset) { + this.projectionDelta = undefined; + this.needsReset = true; + } + if (transition) this.setOptions({ + transition: transition + }); + }; + ProjectionNode.prototype.relegate = function () { + var stack = this.getStack(); + if (stack) { + return stack.relegate(this); + } else { + return false; + } + }; + ProjectionNode.prototype.resetRotation = function () { + var visualElement = this.options.visualElement; + if (!visualElement) return; + // If there's no detected rotation values, we can early return without a forced render. + var hasRotate = false; + // Keep a record of all the values we've reset + var resetValues = {}; + // Check the rotate value of all axes and reset to 0 + for (var i = 0; i < transformAxes.length; i++) { + var axis = transformAxes[i]; + var key = "rotate" + axis; + // If this rotation doesn't exist as a motion value, then we don't + // need to reset it + if (!visualElement.getStaticValue(key)) { + continue; } - this.completeAnimation(); - }; - ProjectionNode.prototype.applyTransformsToTarget = function () { - var _a = this.getLead(), - targetWithTransforms = _a.targetWithTransforms, - target = _a.target, - layout = _a.layout, - latestValues = _a.latestValues; - if (!targetWithTransforms || !target || !layout) return; - copyBoxInto(targetWithTransforms, target); + hasRotate = true; + // Record the rotation and then temporarily set it to 0 + resetValues[key] = visualElement.getStaticValue(key); + visualElement.setStaticValue(key, 0); + } + // If there's no rotation values, we don't need to do any more. + if (!hasRotate) return; + // Force a render of this element to apply the transform with all rotations + // set to 0. + visualElement === null || visualElement === void 0 ? void 0 : visualElement.syncRender(); + // Put back all the values we reset + for (var key in resetValues) { + visualElement.setStaticValue(key, resetValues[key]); + } + // Schedule a render for the next frame. This ensures we won't visually + // see the element with the reset rotate value applied. + visualElement.scheduleRender(); + }; + ProjectionNode.prototype.getProjectionStyles = function (styleProp) { + var _a, _b, _c, _d, _e, _f; + if (styleProp === void 0) { + styleProp = {}; + } + // TODO: Return lifecycle-persistent object + var styles = {}; + if (!this.instance || this.isSVG) return styles; + if (!this.isVisible) { + return { + visibility: "hidden" + }; + } else { + styles.visibility = ""; + } + var transformTemplate = (_a = this.options.visualElement) === null || _a === void 0 ? void 0 : _a.getProps().transformTemplate; + if (this.needsReset) { + this.needsReset = false; + styles.opacity = ""; + styles.pointerEvents = resolveMotionValue(styleProp.pointerEvents) || ""; + styles.transform = transformTemplate ? transformTemplate(this.latestValues, "") : "none"; + return styles; + } + var lead = this.getLead(); + if (!this.projectionDelta || !this.layout || !lead.target) { + var emptyStyles = {}; + if (this.options.layoutId) { + emptyStyles.opacity = (_b = this.latestValues.opacity) !== null && _b !== void 0 ? _b : 1; + emptyStyles.pointerEvents = resolveMotionValue(styleProp.pointerEvents) || ""; + } + if (this.hasProjected && !hasTransform(this.latestValues)) { + emptyStyles.transform = transformTemplate ? transformTemplate({}, "") : "none"; + this.hasProjected = false; + } + return emptyStyles; + } + var valuesToRender = lead.animationValues || lead.latestValues; + this.applyTransformsToTarget(); + styles.transform = buildProjectionTransform(this.projectionDeltaWithTransform, this.treeScale, valuesToRender); + if (transformTemplate) { + styles.transform = transformTemplate(valuesToRender, styles.transform); + } + var _g = this.projectionDelta, + x = _g.x, + y = _g.y; + styles.transformOrigin = "".concat(x.origin * 100, "% ").concat(y.origin * 100, "% 0"); + if (lead.animationValues) { /** - * Apply the latest user-set transforms to the targetBox to produce the targetBoxFinal. - * This is the final box that we will then project into by calculating a transform delta and - * applying it to the corrected box. + * If the lead component is animating, assign this either the entering/leaving + * opacity */ - transformBox(targetWithTransforms, latestValues); + styles.opacity = lead === this ? (_d = (_c = valuesToRender.opacity) !== null && _c !== void 0 ? _c : this.latestValues.opacity) !== null && _d !== void 0 ? _d : 1 : this.preserveOpacity ? this.latestValues.opacity : valuesToRender.opacityExit; + } else { /** - * Update the delta between the corrected box and the final target box, after - * user-set transforms are applied to it. This will be used by the renderer to - * create a transform style that will reproject the element from its actual layout - * into the desired bounding box. + * Or we're not animating at all, set the lead component to its actual + * opacity and other components to hidden. */ - calcBoxDelta(this.projectionDeltaWithTransform, this.layoutCorrected, targetWithTransforms, latestValues); - }; - ProjectionNode.prototype.registerSharedNode = function (layoutId, node) { - var _a, _b, _c; - if (!this.sharedNodes.has(layoutId)) { - this.sharedNodes.set(layoutId, new NodeStack()); - } - var stack = this.sharedNodes.get(layoutId); - stack.add(node); - node.promote({ - transition: (_a = node.options.initialPromotionConfig) === null || _a === void 0 ? void 0 : _a.transition, - preserveFollowOpacity: (_c = (_b = node.options.initialPromotionConfig) === null || _b === void 0 ? void 0 : _b.shouldPreserveFollowOpacity) === null || _c === void 0 ? void 0 : _c.call(_b, node) - }); - }; - ProjectionNode.prototype.isLead = function () { - var stack = this.getStack(); - return stack ? stack.lead === this : true; - }; - ProjectionNode.prototype.getLead = function () { - var _a; - var layoutId = this.options.layoutId; - return layoutId ? ((_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.lead) || this : this; - }; - ProjectionNode.prototype.getPrevLead = function () { - var _a; - var layoutId = this.options.layoutId; - return layoutId ? (_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.prevLead : undefined; - }; - ProjectionNode.prototype.getStack = function () { - var layoutId = this.options.layoutId; - if (layoutId) return this.root.sharedNodes.get(layoutId); - }; - ProjectionNode.prototype.promote = function (_a) { - var _b = _a === void 0 ? {} : _a, - needsReset = _b.needsReset, - transition = _b.transition, - preserveFollowOpacity = _b.preserveFollowOpacity; - var stack = this.getStack(); - if (stack) stack.promote(this, preserveFollowOpacity); - if (needsReset) { - this.projectionDelta = undefined; - this.needsReset = true; - } - if (transition) this.setOptions({ - transition: transition - }); - }; - ProjectionNode.prototype.relegate = function () { - var stack = this.getStack(); - if (stack) { - return stack.relegate(this); - } else { - return false; - } - }; - ProjectionNode.prototype.resetRotation = function () { - var visualElement = this.options.visualElement; - if (!visualElement) return; - // If there's no detected rotation values, we can early return without a forced render. - var hasRotate = false; - // Keep a record of all the values we've reset - var resetValues = {}; - // Check the rotate value of all axes and reset to 0 - for (var i = 0; i < transformAxes.length; i++) { - var axis = transformAxes[i]; - var key = "rotate" + axis; - // If this rotation doesn't exist as a motion value, then we don't - // need to reset it - if (!visualElement.getStaticValue(key)) { - continue; + styles.opacity = lead === this ? (_e = valuesToRender.opacity) !== null && _e !== void 0 ? _e : "" : (_f = valuesToRender.opacityExit) !== null && _f !== void 0 ? _f : 0; + } + /** + * Apply scale correction + */ + for (var key in scaleCorrectors) { + if (valuesToRender[key] === undefined) continue; + var _h = scaleCorrectors[key], + correct = _h.correct, + applyTo = _h.applyTo; + var corrected = correct(valuesToRender[key], lead); + if (applyTo) { + var num = applyTo.length; + for (var i = 0; i < num; i++) { + styles[applyTo[i]] = corrected; } - hasRotate = true; - // Record the rotation and then temporarily set it to 0 - resetValues[key] = visualElement.getStaticValue(key); - visualElement.setStaticValue(key, 0); - } - // If there's no rotation values, we don't need to do any more. - if (!hasRotate) return; - // Force a render of this element to apply the transform with all rotations - // set to 0. - visualElement === null || visualElement === void 0 ? void 0 : visualElement.syncRender(); - // Put back all the values we reset - for (var key in resetValues) { - visualElement.setStaticValue(key, resetValues[key]); - } - // Schedule a render for the next frame. This ensures we won't visually - // see the element with the reset rotate value applied. - visualElement.scheduleRender(); - }; - ProjectionNode.prototype.getProjectionStyles = function (styleProp) { - var _a, _b, _c, _d, _e, _f; - if (styleProp === void 0) { - styleProp = {}; - } - // TODO: Return lifecycle-persistent object - var styles = {}; - if (!this.instance || this.isSVG) return styles; - if (!this.isVisible) { - return { - visibility: "hidden" - }; - } else { - styles.visibility = ""; - } - var transformTemplate = (_a = this.options.visualElement) === null || _a === void 0 ? void 0 : _a.getProps().transformTemplate; - if (this.needsReset) { - this.needsReset = false; - styles.opacity = ""; - styles.pointerEvents = resolveMotionValue(styleProp.pointerEvents) || ""; - styles.transform = transformTemplate ? transformTemplate(this.latestValues, "") : "none"; - return styles; - } - var lead = this.getLead(); - if (!this.projectionDelta || !this.layout || !lead.target) { - var emptyStyles = {}; - if (this.options.layoutId) { - emptyStyles.opacity = (_b = this.latestValues.opacity) !== null && _b !== void 0 ? _b : 1; - emptyStyles.pointerEvents = resolveMotionValue(styleProp.pointerEvents) || ""; - } - if (this.hasProjected && !hasTransform(this.latestValues)) { - emptyStyles.transform = transformTemplate ? transformTemplate({}, "") : "none"; - this.hasProjected = false; - } - return emptyStyles; - } - var valuesToRender = lead.animationValues || lead.latestValues; - this.applyTransformsToTarget(); - styles.transform = buildProjectionTransform(this.projectionDeltaWithTransform, this.treeScale, valuesToRender); - if (transformTemplate) { - styles.transform = transformTemplate(valuesToRender, styles.transform); - } - var _g = this.projectionDelta, - x = _g.x, - y = _g.y; - styles.transformOrigin = "".concat(x.origin * 100, "% ").concat(y.origin * 100, "% 0"); - if (lead.animationValues) { - /** - * If the lead component is animating, assign this either the entering/leaving - * opacity - */ - styles.opacity = lead === this ? (_d = (_c = valuesToRender.opacity) !== null && _c !== void 0 ? _c : this.latestValues.opacity) !== null && _d !== void 0 ? _d : 1 : this.preserveOpacity ? this.latestValues.opacity : valuesToRender.opacityExit; } else { - /** - * Or we're not animating at all, set the lead component to its actual - * opacity and other components to hidden. - */ - styles.opacity = lead === this ? (_e = valuesToRender.opacity) !== null && _e !== void 0 ? _e : "" : (_f = valuesToRender.opacityExit) !== null && _f !== void 0 ? _f : 0; - } - /** - * Apply scale correction - */ - for (var key in scaleCorrectors) { - if (valuesToRender[key] === undefined) continue; - var _h = scaleCorrectors[key], - correct = _h.correct, - applyTo = _h.applyTo; - var corrected = correct(valuesToRender[key], lead); - if (applyTo) { - var num = applyTo.length; - for (var i = 0; i < num; i++) { - styles[applyTo[i]] = corrected; - } - } else { - styles[key] = corrected; - } + styles[key] = corrected; } - /** - * Disable pointer events on follow components. This is to ensure - * that if a follow component covers a lead component it doesn't block - * pointer events on the lead. - */ - if (this.options.layoutId) { - styles.pointerEvents = lead === this ? resolveMotionValue(styleProp.pointerEvents) || "" : "none"; - } - return styles; - }; - ProjectionNode.prototype.clearSnapshot = function () { - this.resumeFrom = this.snapshot = undefined; - }; - // Only run on root - ProjectionNode.prototype.resetTree = function () { - this.root.nodes.forEach(function (node) { - var _a; - return (_a = node.currentAnimation) === null || _a === void 0 ? void 0 : _a.stop(); - }); - this.root.nodes.forEach(clearMeasurements); - this.root.sharedNodes.clear(); - }; - return ProjectionNode; - }() - ); + } + /** + * Disable pointer events on follow components. This is to ensure + * that if a follow component covers a lead component it doesn't block + * pointer events on the lead. + */ + if (this.options.layoutId) { + styles.pointerEvents = lead === this ? resolveMotionValue(styleProp.pointerEvents) || "" : "none"; + } + return styles; + }; + ProjectionNode.prototype.clearSnapshot = function () { + this.resumeFrom = this.snapshot = undefined; + }; + // Only run on root + ProjectionNode.prototype.resetTree = function () { + this.root.nodes.forEach(function (node) { + var _a; + return (_a = node.currentAnimation) === null || _a === void 0 ? void 0 : _a.stop(); + }); + this.root.nodes.forEach(clearMeasurements); + this.root.sharedNodes.clear(); + }; + return ProjectionNode; + }(); } function updateLayout(node) { node.updateLayout(); @@ -21662,9 +21563,7 @@ function createRenderStep(runNextFrame) { let flushNextFrame = false; const toKeepAlive = new WeakSet(); const step = { - schedule: function (callback) { - let keepAlive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + schedule: (callback, keepAlive = false, immediate = false) => { const addToCurrentFrame = immediate && isProcessing; const buffer = addToCurrentFrame ? toRun : toRunNextFrame; if (keepAlive) toKeepAlive.add(callback); @@ -21722,9 +21621,7 @@ const steps = stepsOrder.reduce((acc, key) => { }, {}); const sync = stepsOrder.reduce((acc, key) => { const step = steps[key]; - acc[key] = function (process) { - let keepAlive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - let immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + acc[key] = (process, keepAlive = false, immediate = false) => { if (!runNextFrame) startLoop(); return step.schedule(process, keepAlive, immediate); }; @@ -21794,6 +21691,108 @@ exports.getNonce = getNonce; /***/ }), +/***/ "../../../node_modules/get-value/index.js": +/*!************************************************!*\ + !*** ../../../node_modules/get-value/index.js ***! + \************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + + + +/*! + * get-value + * + * Copyright (c) 2014-2018, Jon Schlinkert. + * Released under the MIT License. + */ + +const isObject = __webpack_require__(/*! isobject */ "../../../node_modules/isobject/index.js"); +module.exports = function (target, path, options) { + if (!isObject(options)) { + options = { + default: options + }; + } + if (!isValidObject(target)) { + return typeof options.default !== 'undefined' ? options.default : target; + } + if (typeof path === 'number') { + path = String(path); + } + const isArray = Array.isArray(path); + const isString = typeof path === 'string'; + const splitChar = options.separator || '.'; + const joinChar = options.joinChar || (typeof splitChar === 'string' ? splitChar : '.'); + if (!isString && !isArray) { + return target; + } + if (isString && path in target) { + return isValid(path, target, options) ? target[path] : options.default; + } + let segs = isArray ? path : split(path, splitChar, options); + let len = segs.length; + let idx = 0; + do { + let prop = segs[idx]; + if (typeof prop === 'number') { + prop = String(prop); + } + while (prop && prop.slice(-1) === '\\') { + prop = join([prop.slice(0, -1), segs[++idx] || ''], joinChar, options); + } + if (prop in target) { + if (!isValid(prop, target, options)) { + return options.default; + } + target = target[prop]; + } else { + let hasProp = false; + let n = idx + 1; + while (n < len) { + prop = join([prop, segs[n++]], joinChar, options); + if (hasProp = prop in target) { + if (!isValid(prop, target, options)) { + return options.default; + } + target = target[prop]; + idx = n - 1; + break; + } + } + if (!hasProp) { + return options.default; + } + } + } while (++idx < len && isValidObject(target)); + if (idx === len) { + return target; + } + return options.default; +}; +function join(segs, joinChar, options) { + if (typeof options.join === 'function') { + return options.join(segs); + } + return segs[0] + joinChar + segs[1]; +} +function split(path, splitChar, options) { + if (typeof options.split === 'function') { + return options.split(path); + } + return path.split(splitChar); +} +function isValid(key, target, options) { + if (typeof options.isValid === 'function') { + return options.isValid(key, target); + } + return true; +} +function isValidObject(val) { + return isObject(val) || Array.isArray(val) || typeof val === 'function'; +} + +/***/ }), + /***/ "../../../node_modules/graphql-ws/lib/client.mjs": /*!*******************************************************!*\ !*** ../../../node_modules/graphql-ws/lib/client.mjs ***! @@ -21827,6 +21826,44 @@ var _utils = __webpack_require__(/*! ./utils.mjs */ "../../../node_modules/graph * client * */ +var __await = void 0 && (void 0).__await || function (v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); +}; +var __asyncGenerator = void 0 && (void 0).__asyncGenerator || function (thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), + i, + q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { + return this; + }, i; + function verb(n) { + if (g[n]) i[n] = function (v) { + return new Promise(function (a, b) { + q.push([n, v, a, b]) > 1 || resume(n, v); + }); + }; + } + function resume(n, v) { + try { + step(g[n](v)); + } catch (e) { + settle(q[0][3], e); + } + } + function step(r) { + r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); + } + function fulfill(value) { + resume("next", value); + } + function reject(value) { + resume("throw", value); + } + function settle(f, v) { + if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); + } +}; /** This file is the entry point for browsers, re-export common elements. */ @@ -21841,7 +21878,7 @@ function createClient(options) { connectionParams, lazy = true, onNonLazyError = console.error, - lazyCloseTimeout = 0, + lazyCloseTimeout: lazyCloseTimeoutMs = 0, keepAlive = 0, disablePong, connectionAckWaitTimeout = 0, @@ -21855,9 +21892,8 @@ function createClient(options) { // add random timeout from 300ms to 3s Math.floor(Math.random() * (3000 - 300) + 300))); }, - isFatalConnectionProblem = errOrCloseEvent => - // non `CloseEvent`s are fatal by default - !isLikeCloseEvent(errOrCloseEvent), + shouldRetry = isLikeCloseEvent, + isFatalConnectionProblem, on, webSocketImpl, /** @@ -21894,7 +21930,7 @@ function createClient(options) { // @ts-expect-error: Support more browsers window.MozWebSocket; } - if (!ws) throw new Error('WebSocket implementation missing'); + if (!ws) throw new Error("WebSocket implementation missing; on Node you can `import WebSocket from 'ws';` and pass `webSocketImpl: WebSocket` to `createClient`"); const WebSocketImpl = ws; // websocket status emitter, subscriptions are handled differently const emitter = (() => { @@ -21932,10 +21968,7 @@ function createClient(options) { l.splice(l.indexOf(listener), 1); }; }, - emit(event) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } + emit(event, ...args) { // we copy the listeners so that unlistens dont "pull the rug under our feet" for (const listener of [...listeners[event]]) { // @ts-expect-error: The args should fit @@ -21961,10 +21994,14 @@ function createClient(options) { } let connecting, locks = 0, + lazyCloseTimeout, retrying = false, retries = 0, disposed = false; async function connect() { + // clear the lazy close timeout immediatelly so that close gets debounced + // see: https://github.com/enisdenjo/graphql-ws/issues/388 + clearTimeout(lazyCloseTimeout); const [socket, throwOnClose] = await (connecting !== null && connecting !== void 0 ? connecting : connecting = new Promise((connected, denied) => (async () => { if (retrying) { await retryWait(retries); @@ -21999,6 +22036,11 @@ function createClient(options) { clearTimeout(connectionAckTimeout); clearTimeout(queuedPing); denied(errOrEvent); + if (isLikeCloseEvent(errOrEvent) && errOrEvent.code === 4499) { + socket.close(4499, 'Terminated'); // close event is artificial and emitted manually, see `Client.terminate()` below + socket.onerror = null; + socket.onclose = null; + } }); socket.onerror = err => emitter.emit('error', err); socket.onclose = event => emitter.emit('closed', event); @@ -22006,6 +22048,9 @@ function createClient(options) { try { emitter.emit('opened', socket); const payload = typeof connectionParams === 'function' ? await connectionParams() : connectionParams; + // connectionParams might take too long causing the server to kick off the client + // the necessary error/close event is already reported - simply stop execution + if (socket.readyState !== WebSocketImpl.OPEN) return; socket.send((0, _common.stringifyMessage)(payload ? { type: _common.MessageType.ConnectionInit, payload @@ -22025,10 +22070,9 @@ function createClient(options) { } }; let acknowledged = false; - socket.onmessage = _ref => { - let { - data - } = _ref; + socket.onmessage = ({ + data + }) => { try { const message = (0, _common.parseMessage)(data, reviver); emitter.emit('message', message); @@ -22045,12 +22089,10 @@ function createClient(options) { type: _common.MessageType.Pong // payload is completely absent if not provided })); - emitter.emit('pong', false, message.payload); } return; // ping and pongs can be received whenever } - if (acknowledged) return; // already connected and acknowledged if (message.type !== _common.MessageType.ConnectionAck) throw new Error(`First message cannot be of type ${message.type}`); clearTimeout(connectionAckTimeout); @@ -22078,13 +22120,12 @@ function createClient(options) { if (!locks) { // and if no more locks are present, complete the connection const complete = () => socket.close(1000, 'Normal Closure'); - if (isFinite(lazyCloseTimeout) && lazyCloseTimeout > 0) { + if (isFinite(lazyCloseTimeoutMs) && lazyCloseTimeoutMs > 0) { // if the keepalive is set, allow for the specified calmdown time and - // then complete. but only if no lock got created in the meantime and - // if the socket is still open - setTimeout(() => { - if (!locks && socket.readyState === WebSocketImpl.OPEN) complete(); - }, lazyCloseTimeout); + // then complete if the socket is still open. + lazyCloseTimeout = setTimeout(() => { + if (socket.readyState === WebSocketImpl.OPEN) complete(); + }, lazyCloseTimeoutMs); } else { // otherwise complete immediately complete(); @@ -22104,7 +22145,9 @@ function createClient(options) { _common.CloseCode.SubprotocolNotAcceptable, // CloseCode.ConnectionInitialisationTimeout, might not time out after retry // CloseCode.ConnectionAcknowledgementTimeout, might not time out after retry - _common.CloseCode.SubscriberAlreadyExists, _common.CloseCode.TooManyInitialisationRequests].includes(errOrCloseEvent.code))) throw errOrCloseEvent; + _common.CloseCode.SubscriberAlreadyExists, _common.CloseCode.TooManyInitialisationRequests + // 4499, // Terminated, probably because the socket froze, we want to retry + ].includes(errOrCloseEvent.code))) throw errOrCloseEvent; // client was disposed, no retries should proceed regardless if (disposed) return false; // normal closure (possibly all subscriptions have completed) @@ -22112,8 +22155,10 @@ function createClient(options) { if (isLikeCloseEvent(errOrCloseEvent) && errOrCloseEvent.code === 1000) return locks > 0; // retries are not allowed or we tried to many times, report error if (!retryAttempts || retries >= retryAttempts) throw errOrCloseEvent; - // throw fatal connection problems immediately - if (isFatalConnectionProblem(errOrCloseEvent)) throw errOrCloseEvent; + // throw non-retryable connection problems + if (!shouldRetry(errOrCloseEvent)) throw errOrCloseEvent; + // @deprecated throw fatal connection problems immediately + if (isFatalConnectionProblem === null || isFatalConnectionProblem === void 0 ? void 0 : isFatalConnectionProblem(errOrCloseEvent)) throw errOrCloseEvent; // looks good, start retrying return retrying = true; } @@ -22139,7 +22184,7 @@ function createClient(options) { return { on: emitter.on, subscribe(payload, sink) { - const id = generateID(); + const id = generateID(payload); let done = false, errored = false, releaser = () => { @@ -22158,7 +22203,7 @@ function createClient(options) { switch (message.type) { case _common.MessageType.Next: { - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- payload will fit type sink.next(message.payload); return; } @@ -22214,6 +22259,73 @@ function createClient(options) { if (!done) releaser(); }; }, + iterate(request) { + const pending = []; + const deferred = { + done: false, + error: null, + resolve: () => { + // noop + } + }; + const dispose = this.subscribe(request, { + next(val) { + pending.push(val); + deferred.resolve(); + }, + error(err) { + deferred.done = true; + deferred.error = err; + deferred.resolve(); + }, + complete() { + deferred.done = true; + deferred.resolve(); + } + }); + const iterator = function iterator() { + return __asyncGenerator(this, arguments, function* iterator_1() { + for (;;) { + if (!pending.length) { + // only wait if there are no pending messages available + yield __await(new Promise(resolve => deferred.resolve = resolve)); + } + // first flush + while (pending.length) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + yield yield __await(pending.shift()); + } + // then error + if (deferred.error) { + throw deferred.error; + } + // or complete + if (deferred.done) { + return yield __await(void 0); + } + } + }); + }(); + iterator.throw = async err => { + if (!deferred.done) { + deferred.done = true; + deferred.error = err; + deferred.resolve(); + } + return { + done: true, + value: undefined + }; + }; + iterator.return = async () => { + dispose(); + return { + done: true, + value: undefined + }; + }; + return iterator; + }, async dispose() { disposed = true; if (connecting) { @@ -22221,6 +22333,16 @@ function createClient(options) { const [socket] = await connecting; socket.close(1000, 'Normal Closure'); } + }, + terminate() { + if (connecting) { + // only if there is a connection + emitter.emit('closed', { + code: 4499, + reason: 'Terminated', + wasClean: false + }); + } } }; } @@ -22250,10 +22372,11 @@ function isWebSocket(val) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.MessageType = exports.GRAPHQL_TRANSPORT_WS_PROTOCOL = exports.CloseCode = void 0; +exports.MessageType = exports.GRAPHQL_TRANSPORT_WS_PROTOCOL = exports.DEPRECATED_GRAPHQL_WS_PROTOCOL = exports.CloseCode = void 0; exports.isMessage = isMessage; exports.parseMessage = parseMessage; exports.stringifyMessage = stringifyMessage; +exports.validateMessage = validateMessage; var _utils = __webpack_require__(/*! ./utils.mjs */ "../../../node_modules/graphql-ws/lib/utils.mjs"); /** * @@ -22262,19 +22385,23 @@ var _utils = __webpack_require__(/*! ./utils.mjs */ "../../../node_modules/graph */ /** - * The WebSocket sub-protocol used for the [GraphQL over WebSocket Protocol](/PROTOCOL.md). + * The WebSocket sub-protocol used for the [GraphQL over WebSocket Protocol](https://github.com/graphql/graphql-over-http/blob/main/rfcs/GraphQLOverWebSocket.md). * * @category Common */ -const GRAPHQL_TRANSPORT_WS_PROTOCOL = 'graphql-transport-ws'; +const GRAPHQL_TRANSPORT_WS_PROTOCOL = exports.GRAPHQL_TRANSPORT_WS_PROTOCOL = 'graphql-transport-ws'; +/** + * The deprecated subprotocol used by [subscriptions-transport-ws](https://github.com/apollographql/subscriptions-transport-ws). + * + * @private + */ +const DEPRECATED_GRAPHQL_WS_PROTOCOL = exports.DEPRECATED_GRAPHQL_WS_PROTOCOL = 'graphql-ws'; /** - * `graphql-ws` expected and standard close codes of the [GraphQL over WebSocket Protocol](/PROTOCOL.md). + * `graphql-ws` expected and standard close codes of the [GraphQL over WebSocket Protocol](https://github.com/graphql/graphql-over-http/blob/main/rfcs/GraphQLOverWebSocket.md). * * @category Common */ -exports.GRAPHQL_TRANSPORT_WS_PROTOCOL = GRAPHQL_TRANSPORT_WS_PROTOCOL; var CloseCode; -exports.CloseCode = CloseCode; (function (CloseCode) { CloseCode[CloseCode["InternalServerError"] = 4500] = "InternalServerError"; CloseCode[CloseCode["InternalClientError"] = 4005] = "InternalClientError"; @@ -22296,7 +22423,6 @@ exports.CloseCode = CloseCode; * @category Common */ var MessageType; -exports.MessageType = MessageType; (function (MessageType) { MessageType["ConnectionInit"] = "connection_init"; MessageType["ConnectionAck"] = "connection_ack"; @@ -22308,39 +22434,113 @@ exports.MessageType = MessageType; MessageType["Complete"] = "complete"; })(MessageType || (exports.MessageType = MessageType = {})); /** - * Checks if the provided value is a message. + * Validates the message against the GraphQL over WebSocket Protocol. + * + * Invalid messages will throw descriptive errors. + * + * @category Common + */ +function validateMessage(val) { + if (!(0, _utils.isObject)(val)) { + throw new Error(`Message is expected to be an object, but got ${(0, _utils.extendedTypeof)(val)}`); + } + if (!val.type) { + throw new Error(`Message is missing the 'type' property`); + } + if (typeof val.type !== 'string') { + throw new Error(`Message is expects the 'type' property to be a string, but got ${(0, _utils.extendedTypeof)(val.type)}`); + } + switch (val.type) { + case MessageType.ConnectionInit: + case MessageType.ConnectionAck: + case MessageType.Ping: + case MessageType.Pong: + { + if (val.payload != null && !(0, _utils.isObject)(val.payload)) { + throw new Error(`"${val.type}" message expects the 'payload' property to be an object or nullish or missing, but got "${val.payload}"`); + } + break; + } + case MessageType.Subscribe: + { + if (typeof val.id !== 'string') { + throw new Error(`"${val.type}" message expects the 'id' property to be a string, but got ${(0, _utils.extendedTypeof)(val.id)}`); + } + if (!val.id) { + throw new Error(`"${val.type}" message requires a non-empty 'id' property`); + } + if (!(0, _utils.isObject)(val.payload)) { + throw new Error(`"${val.type}" message expects the 'payload' property to be an object, but got ${(0, _utils.extendedTypeof)(val.payload)}`); + } + if (typeof val.payload.query !== 'string') { + throw new Error(`"${val.type}" message payload expects the 'query' property to be a string, but got ${(0, _utils.extendedTypeof)(val.payload.query)}`); + } + if (val.payload.variables != null && !(0, _utils.isObject)(val.payload.variables)) { + throw new Error(`"${val.type}" message payload expects the 'variables' property to be a an object or nullish or missing, but got ${(0, _utils.extendedTypeof)(val.payload.variables)}`); + } + if (val.payload.operationName != null && (0, _utils.extendedTypeof)(val.payload.operationName) !== 'string') { + throw new Error(`"${val.type}" message payload expects the 'operationName' property to be a string or nullish or missing, but got ${(0, _utils.extendedTypeof)(val.payload.operationName)}`); + } + if (val.payload.extensions != null && !(0, _utils.isObject)(val.payload.extensions)) { + throw new Error(`"${val.type}" message payload expects the 'extensions' property to be a an object or nullish or missing, but got ${(0, _utils.extendedTypeof)(val.payload.extensions)}`); + } + break; + } + case MessageType.Next: + { + if (typeof val.id !== 'string') { + throw new Error(`"${val.type}" message expects the 'id' property to be a string, but got ${(0, _utils.extendedTypeof)(val.id)}`); + } + if (!val.id) { + throw new Error(`"${val.type}" message requires a non-empty 'id' property`); + } + if (!(0, _utils.isObject)(val.payload)) { + throw new Error(`"${val.type}" message expects the 'payload' property to be an object, but got ${(0, _utils.extendedTypeof)(val.payload)}`); + } + break; + } + case MessageType.Error: + { + if (typeof val.id !== 'string') { + throw new Error(`"${val.type}" message expects the 'id' property to be a string, but got ${(0, _utils.extendedTypeof)(val.id)}`); + } + if (!val.id) { + throw new Error(`"${val.type}" message requires a non-empty 'id' property`); + } + if (!(0, _utils.areGraphQLErrors)(val.payload)) { + throw new Error(`"${val.type}" message expects the 'payload' property to be an array of GraphQL errors, but got ${JSON.stringify(val.payload)}`); + } + break; + } + case MessageType.Complete: + { + if (typeof val.id !== 'string') { + throw new Error(`"${val.type}" message expects the 'id' property to be a string, but got ${(0, _utils.extendedTypeof)(val.id)}`); + } + if (!val.id) { + throw new Error(`"${val.type}" message requires a non-empty 'id' property`); + } + break; + } + default: + throw new Error(`Invalid message 'type' property "${val.type}"`); + } + return val; +} +/** + * Checks if the provided value is a valid GraphQL over WebSocket message. + * + * @deprecated Use `validateMessage` instead. * * @category Common */ function isMessage(val) { - if ((0, _utils.isObject)(val)) { - // all messages must have the `type` prop - if (!(0, _utils.hasOwnStringProperty)(val, 'type')) { - return false; - } - // validate other properties depending on the `type` - switch (val.type) { - case MessageType.ConnectionInit: - // the connection init message can have optional payload object - return !(0, _utils.hasOwnProperty)(val, 'payload') || val.payload === undefined || (0, _utils.isObject)(val.payload); - case MessageType.ConnectionAck: - case MessageType.Ping: - case MessageType.Pong: - // the connection ack, ping and pong messages can have optional payload object too - return !(0, _utils.hasOwnProperty)(val, 'payload') || val.payload === undefined || (0, _utils.isObject)(val.payload); - case MessageType.Subscribe: - return (0, _utils.hasOwnStringProperty)(val, 'id') && (0, _utils.hasOwnObjectProperty)(val, 'payload') && (!(0, _utils.hasOwnProperty)(val.payload, 'operationName') || val.payload.operationName === undefined || val.payload.operationName === null || typeof val.payload.operationName === 'string') && (0, _utils.hasOwnStringProperty)(val.payload, 'query') && (!(0, _utils.hasOwnProperty)(val.payload, 'variables') || val.payload.variables === undefined || val.payload.variables === null || (0, _utils.hasOwnObjectProperty)(val.payload, 'variables')) && (!(0, _utils.hasOwnProperty)(val.payload, 'extensions') || val.payload.extensions === undefined || val.payload.extensions === null || (0, _utils.hasOwnObjectProperty)(val.payload, 'extensions')); - case MessageType.Next: - return (0, _utils.hasOwnStringProperty)(val, 'id') && (0, _utils.hasOwnObjectProperty)(val, 'payload'); - case MessageType.Error: - return (0, _utils.hasOwnStringProperty)(val, 'id') && (0, _utils.areGraphQLErrors)(val.payload); - case MessageType.Complete: - return (0, _utils.hasOwnStringProperty)(val, 'id'); - default: - return false; - } + try { + validateMessage(val); + return true; + } catch (_a) { + return false; } - return false; } /** * Parses the raw websocket message data to a valid message. @@ -22348,17 +22548,7 @@ function isMessage(val) { * @category Common */ function parseMessage(data, reviver) { - if (isMessage(data)) { - return data; - } - if (typeof data !== 'string') { - throw new Error('Message not parsable'); - } - const message = JSON.parse(data, reviver); - if (!isMessage(message)) { - throw new Error('Invalid message'); - } - return message; + return validateMessage(typeof data === 'string' ? JSON.parse(data, reviver) : data); } /** * Stringifies a valid message ready to be sent through the socket. @@ -22366,9 +22556,7 @@ function parseMessage(data, reviver) { * @category Common */ function stringifyMessage(msg, replacer) { - if (!isMessage(msg)) { - throw new Error('Cannot stringify invalid message'); - } + validateMessage(msg); return JSON.stringify(msg, replacer); } @@ -22384,12 +22572,16 @@ function stringifyMessage(msg, replacer) { var __createBinding = void 0 && (void 0).__createBinding || (Object.create ? function (o, m, k, k2) { if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { - enumerable: true, - get: function () { - return m[k]; - } - }); + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { + enumerable: true, + get: function () { + return m[k]; + } + }; + } + Object.defineProperty(o, k2, desc); } : function (o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; @@ -22417,6 +22609,7 @@ __exportStar(__webpack_require__(/*! ./common */ "../../../node_modules/graphql- Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.handleProtocols = handleProtocols; exports.makeServer = makeServer; var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); var _common = __webpack_require__(/*! ./common.mjs */ "../../../node_modules/graphql-ws/lib/common.mjs"); @@ -22454,7 +22647,7 @@ var __asyncValues = void 0 && (void 0).__asyncValues || function (o) { * is actually an API which is to be used with your favourite WebSocket * server library! * - * Read more about the Protocol in the PROTOCOL.md documentation file. + * Read more about the [GraphQL over WebSocket Protocol](https://github.com/graphql/graphql-over-http/blob/main/rfcs/GraphQLOverWebSocket.md). * * @category Server */ @@ -22500,8 +22693,8 @@ function makeServer(options) { if (!ctx.connectionInitReceived) socket.close(_common.CloseCode.ConnectionInitialisationTimeout, 'Connection initialisation timeout'); }, connectionInitWaitTimeout) : null; socket.onMessage(async function onMessage(data) { - var e_1, _a; - var _b; + var _a, e_1, _b, _c; + var _d; let message; try { message = (0, _common.parseMessage)(data, reviver); @@ -22542,11 +22735,10 @@ function makeServer(options) { type: _common.MessageType.Pong // payload is completely absent if not provided })); - return; } case _common.MessageType.Pong: - return await ((_b = socket.onPong) === null || _b === void 0 ? void 0 : _b.call(socket, message.payload)); + return await ((_d = socket.onPong) === null || _d === void 0 ? void 0 : _d.call(socket, message.payload)); case _common.MessageType.Subscribe: { if (!ctx.acknowledged) return socket.close(_common.CloseCode.Unauthorized, 'Unauthorized'); @@ -22592,82 +22784,88 @@ function makeServer(options) { if (notifyClient) await socket.send((0, _common.stringifyMessage)(completeMessage, replacer)); } }; - let execArgs; - const maybeExecArgsOrErrors = await (onSubscribe === null || onSubscribe === void 0 ? void 0 : onSubscribe(ctx, message)); - if (maybeExecArgsOrErrors) { - if ((0, _utils.areGraphQLErrors)(maybeExecArgsOrErrors)) return await emit.error(maybeExecArgsOrErrors);else if (Array.isArray(maybeExecArgsOrErrors)) throw new Error('Invalid return value from onSubscribe hook, expected an array of GraphQLError objects'); - // not errors, is exec args - execArgs = maybeExecArgsOrErrors; - } else { - // you either provide a schema dynamically through - // `onSubscribe` or you set one up during the server setup - if (!schema) throw new Error('The GraphQL schema is not provided'); - const args = { - operationName: payload.operationName, - document: (0, _graphql.parse)(payload.query), - variableValues: payload.variables - }; - execArgs = Object.assign(Object.assign({}, args), { - schema: typeof schema === 'function' ? await schema(ctx, message, args) : schema - }); - const validationErrors = (validate !== null && validate !== void 0 ? validate : _graphql.validate)(execArgs.schema, execArgs.document); - if (validationErrors.length > 0) return await emit.error(validationErrors); - } - const operationAST = (0, _graphql.getOperationAST)(execArgs.document, execArgs.operationName); - if (!operationAST) return await emit.error([new _graphql.GraphQLError('Unable to identify operation')]); - // if `onSubscribe` didnt specify a rootValue, inject one - if (!('rootValue' in execArgs)) execArgs.rootValue = roots === null || roots === void 0 ? void 0 : roots[operationAST.operation]; - // if `onSubscribe` didn't specify a context, inject one - if (!('contextValue' in execArgs)) execArgs.contextValue = typeof context === 'function' ? await context(ctx, message, execArgs) : context; - // the execution arguments have been prepared - // perform the operation and act accordingly - let operationResult; - if (operationAST.operation === 'subscription') operationResult = await (subscribe !== null && subscribe !== void 0 ? subscribe : _graphql.subscribe)(execArgs); - // operation === 'query' || 'mutation' - else operationResult = await (execute !== null && execute !== void 0 ? execute : _graphql.execute)(execArgs); - const maybeResult = await (onOperation === null || onOperation === void 0 ? void 0 : onOperation(ctx, message, execArgs, operationResult)); - if (maybeResult) operationResult = maybeResult; - if ((0, _utils.isAsyncIterable)(operationResult)) { - /** multiple emitted results */ - if (!(id in ctx.subscriptions)) { - // subscription was completed/canceled before the operation settled - if ((0, _utils.isAsyncGenerator)(operationResult)) operationResult.return(undefined); + try { + let execArgs; + const maybeExecArgsOrErrors = await (onSubscribe === null || onSubscribe === void 0 ? void 0 : onSubscribe(ctx, message)); + if (maybeExecArgsOrErrors) { + if ((0, _utils.areGraphQLErrors)(maybeExecArgsOrErrors)) return await emit.error(maybeExecArgsOrErrors);else if (Array.isArray(maybeExecArgsOrErrors)) throw new Error('Invalid return value from onSubscribe hook, expected an array of GraphQLError objects'); + // not errors, is exec args + execArgs = maybeExecArgsOrErrors; } else { - ctx.subscriptions[id] = operationResult; - try { - for (var operationResult_1 = __asyncValues(operationResult), operationResult_1_1; operationResult_1_1 = await operationResult_1.next(), !operationResult_1_1.done;) { - const result = operationResult_1_1.value; - await emit.next(result, execArgs); - } - } catch (e_1_1) { - e_1 = { - error: e_1_1 - }; - } finally { + // you either provide a schema dynamically through + // `onSubscribe` or you set one up during the server setup + if (!schema) throw new Error('The GraphQL schema is not provided'); + const args = { + operationName: payload.operationName, + document: (0, _graphql.parse)(payload.query), + variableValues: payload.variables + }; + execArgs = Object.assign(Object.assign({}, args), { + schema: typeof schema === 'function' ? await schema(ctx, message, args) : schema + }); + const validationErrors = (validate !== null && validate !== void 0 ? validate : _graphql.validate)(execArgs.schema, execArgs.document); + if (validationErrors.length > 0) return await emit.error(validationErrors); + } + const operationAST = (0, _graphql.getOperationAST)(execArgs.document, execArgs.operationName); + if (!operationAST) return await emit.error([new _graphql.GraphQLError('Unable to identify operation')]); + // if `onSubscribe` didnt specify a rootValue, inject one + if (!('rootValue' in execArgs)) execArgs.rootValue = roots === null || roots === void 0 ? void 0 : roots[operationAST.operation]; + // if `onSubscribe` didn't specify a context, inject one + if (!('contextValue' in execArgs)) execArgs.contextValue = typeof context === 'function' ? await context(ctx, message, execArgs) : context; + // the execution arguments have been prepared + // perform the operation and act accordingly + let operationResult; + if (operationAST.operation === 'subscription') operationResult = await (subscribe !== null && subscribe !== void 0 ? subscribe : _graphql.subscribe)(execArgs); + // operation === 'query' || 'mutation' + else operationResult = await (execute !== null && execute !== void 0 ? execute : _graphql.execute)(execArgs); + const maybeResult = await (onOperation === null || onOperation === void 0 ? void 0 : onOperation(ctx, message, execArgs, operationResult)); + if (maybeResult) operationResult = maybeResult; + if ((0, _utils.isAsyncIterable)(operationResult)) { + /** multiple emitted results */ + if (!(id in ctx.subscriptions)) { + // subscription was completed/canceled before the operation settled + if ((0, _utils.isAsyncGenerator)(operationResult)) operationResult.return(undefined); + } else { + ctx.subscriptions[id] = operationResult; try { - if (operationResult_1_1 && !operationResult_1_1.done && (_a = operationResult_1.return)) await _a.call(operationResult_1); + for (var _e = true, operationResult_1 = __asyncValues(operationResult), operationResult_1_1; operationResult_1_1 = await operationResult_1.next(), _a = operationResult_1_1.done, !_a; _e = true) { + _c = operationResult_1_1.value; + _e = false; + const result = _c; + await emit.next(result, execArgs); + } + } catch (e_1_1) { + e_1 = { + error: e_1_1 + }; } finally { - if (e_1) throw e_1.error; + try { + if (!_e && !_a && (_b = operationResult_1.return)) await _b.call(operationResult_1); + } finally { + if (e_1) throw e_1.error; + } } } + } else { + /** single emitted result */ + // if the client completed the subscription before the single result + // became available, he effectively canceled it and no data should be sent + if (id in ctx.subscriptions) await emit.next(operationResult, execArgs); } - } else { - /** single emitted result */ - // if the client completed the subscription before the single result - // became available, he effectively canceled it and no data should be sent - if (id in ctx.subscriptions) await emit.next(operationResult, execArgs); + // lack of subscription at this point indicates that the client + // completed the subscription, he doesnt need to be reminded + await emit.complete(id in ctx.subscriptions); + } finally { + // whatever happens to the subscription, we finally want to get rid of the reservation + delete ctx.subscriptions[id]; } - // lack of subscription at this point indicates that the client - // completed the subscription, he doesnt need to be reminded - await emit.complete(id in ctx.subscriptions); - delete ctx.subscriptions[id]; return; } case _common.MessageType.Complete: { const subscription = ctx.subscriptions[message.id]; - if ((0, _utils.isAsyncGenerator)(subscription)) await subscription.return(undefined); delete ctx.subscriptions[message.id]; // deleting the subscription means no further activity should take place + if ((0, _utils.isAsyncGenerator)(subscription)) await subscription.return(undefined); return; } default: @@ -22686,6 +22884,30 @@ function makeServer(options) { } }; } +/** + * Helper utility for choosing the "graphql-transport-ws" subprotocol from + * a set of WebSocket subprotocols. + * + * Accepts a set of already extracted WebSocket subprotocols or the raw + * Sec-WebSocket-Protocol header value. In either case, if the right + * protocol appears, it will be returned. + * + * By specification, the server should not provide a value with Sec-WebSocket-Protocol + * if it does not agree with client's subprotocols. The client has a responsibility + * to handle the connection afterwards. + * + * @category Server + */ +function handleProtocols(protocols) { + switch (true) { + case protocols instanceof Set && protocols.has(_common.GRAPHQL_TRANSPORT_WS_PROTOCOL): + case Array.isArray(protocols) && protocols.includes(_common.GRAPHQL_TRANSPORT_WS_PROTOCOL): + case typeof protocols === 'string' && protocols.split(',').map(p => p.trim()).includes(_common.GRAPHQL_TRANSPORT_WS_PROTOCOL): + return _common.GRAPHQL_TRANSPORT_WS_PROTOCOL; + default: + return false; + } +} /***/ }), @@ -22701,19 +22923,24 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.areGraphQLErrors = areGraphQLErrors; -exports.hasOwnArrayProperty = hasOwnArrayProperty; -exports.hasOwnObjectProperty = hasOwnObjectProperty; -exports.hasOwnProperty = hasOwnProperty; -exports.hasOwnStringProperty = hasOwnStringProperty; +exports.extendedTypeof = extendedTypeof; exports.isAsyncGenerator = isAsyncGenerator; exports.isAsyncIterable = isAsyncIterable; exports.isObject = isObject; exports.limitCloseReason = limitCloseReason; -// Extremely small optimisation, reduces runtime prototype traversal -const baseHasOwnProperty = Object.prototype.hasOwnProperty; +/** @private */ +function extendedTypeof(val) { + if (val === null) { + return 'null'; + } + if (Array.isArray(val)) { + return 'array'; + } + return typeof val; +} /** @private */ function isObject(val) { - return typeof val === 'object' && val !== null; + return extendedTypeof(val) === 'object'; } /** @private */ function isAsyncIterable(val) { @@ -22735,22 +22962,6 @@ function areGraphQLErrors(obj) { // error has at least a message obj.every(ob => 'message' in ob); } -/** @private */ -function hasOwnProperty(obj, prop) { - return baseHasOwnProperty.call(obj, prop); -} -/** @private */ -function hasOwnObjectProperty(obj, prop) { - return baseHasOwnProperty.call(obj, prop) && isObject(obj[prop]); -} -/** @private */ -function hasOwnArrayProperty(obj, prop) { - return baseHasOwnProperty.call(obj, prop) && Array.isArray(obj[prop]); -} -/** @private */ -function hasOwnStringProperty(obj, prop) { - return baseHasOwnProperty.call(obj, prop) && typeof obj[prop] === 'string'; -} /** * Limits the WebSocket close event reason to not exceed a length of one frame. * Reference: https://datatracker.ietf.org/doc/html/rfc6455#section-5.2. @@ -22775,83 +22986,18 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GraphQLError = void 0; -exports.formatError = formatError; -exports.printError = printError; var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _location = __webpack_require__(/*! ../language/location.mjs */ "../../../node_modules/graphql/language/location.mjs"); var _printLocation = __webpack_require__(/*! ../language/printLocation.mjs */ "../../../node_modules/graphql/language/printLocation.mjs"); -function toNormalizedOptions(args) { - const firstArg = args[0]; - if (firstArg == null || 'kind' in firstArg || 'length' in firstArg) { - return { - nodes: firstArg, - source: args[1], - positions: args[2], - path: args[3], - originalError: args[4], - extensions: args[5] - }; - } - return firstArg; -} /** * A GraphQLError describes an Error found during the parse, validate, or * execute phases of performing a GraphQL operation. In addition to a message * and stack trace, it also includes information about the locations in a * GraphQL document and/or execution result that correspond to the Error. */ - class GraphQLError extends Error { - /** - * An array of `{ line, column }` locations within the source GraphQL document - * which correspond to this error. - * - * Errors during validation often contain multiple locations, for example to - * point out two things with the same name. Errors during execution include a - * single location, the field which produced the error. - * - * Enumerable, and appears in the result of JSON.stringify(). - */ - - /** - * An array describing the JSON-path into the execution response which - * corresponds to this error. Only included for errors during execution. - * - * Enumerable, and appears in the result of JSON.stringify(). - */ - - /** - * An array of GraphQL AST Nodes corresponding to this error. - */ - - /** - * The source GraphQL document for the first location of this error. - * - * Note that if this Error represents more than one node, the source may not - * represent nodes after the first node. - */ - - /** - * An array of character offsets within the source GraphQL document - * which correspond to this error. - */ - - /** - * The original error thrown from a field resolver during execution. - */ - - /** - * Extension fields to add to the formatted error. - */ - - /** - * @deprecated Please use the `GraphQLErrorOptions` constructor overload instead. - */ - constructor(message) { + constructor(message, options = {}) { var _this$nodes, _nodeLocations$, _ref; - for (var _len = arguments.length, rawArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - rawArgs[_key - 1] = arguments[_key]; - } const { nodes, source, @@ -22859,22 +23005,22 @@ class GraphQLError extends Error { path, originalError, extensions - } = toNormalizedOptions(rawArgs); + } = options; super(message); this.name = 'GraphQLError'; this.path = path !== null && path !== void 0 ? path : undefined; - this.originalError = originalError !== null && originalError !== void 0 ? originalError : undefined; // Compute list of blame nodes. - + this.originalError = originalError !== null && originalError !== void 0 ? originalError : undefined; + // Compute list of blame nodes. this.nodes = undefinedIfEmpty(Array.isArray(nodes) ? nodes : nodes ? [nodes] : undefined); - const nodeLocations = undefinedIfEmpty((_this$nodes = this.nodes) === null || _this$nodes === void 0 ? void 0 : _this$nodes.map(node => node.loc).filter(loc => loc != null)); // Compute locations in the source for the given nodes/positions. - + const nodeLocations = undefinedIfEmpty((_this$nodes = this.nodes) === null || _this$nodes === void 0 ? void 0 : _this$nodes.map(node => node.loc).filter(loc => loc != null)); + // Compute locations in the source for the given nodes/positions. this.source = source !== null && source !== void 0 ? source : nodeLocations === null || nodeLocations === void 0 ? void 0 : (_nodeLocations$ = nodeLocations[0]) === null || _nodeLocations$ === void 0 ? void 0 : _nodeLocations$.source; this.positions = positions !== null && positions !== void 0 ? positions : nodeLocations === null || nodeLocations === void 0 ? void 0 : nodeLocations.map(loc => loc.start); this.locations = positions && source ? positions.map(pos => (0, _location.getLocation)(source, pos)) : nodeLocations === null || nodeLocations === void 0 ? void 0 : nodeLocations.map(loc => (0, _location.getLocation)(loc.source, loc.start)); const originalExtensions = (0, _isObjectLike.isObjectLike)(originalError === null || originalError === void 0 ? void 0 : originalError.extensions) ? originalError === null || originalError === void 0 ? void 0 : originalError.extensions : undefined; - this.extensions = (_ref = extensions !== null && extensions !== void 0 ? extensions : originalExtensions) !== null && _ref !== void 0 ? _ref : Object.create(null); // Only properties prescribed by the spec should be enumerable. + this.extensions = (_ref = extensions !== null && extensions !== void 0 ? extensions : originalExtensions) !== null && _ref !== void 0 ? _ref : Object.create(null); + // Only properties prescribed by the spec should be enumerable. // Keep the rest as non-enumerable. - Object.defineProperties(this, { message: { writable: true, @@ -22895,18 +23041,17 @@ class GraphQLError extends Error { originalError: { enumerable: false } - }); // Include (non-enumerable) stack trace. - + }); + // Include (non-enumerable) stack trace. /* c8 ignore start */ // FIXME: https://github.com/graphql/graphql-js/issues/2317 - - if (originalError !== null && originalError !== void 0 && originalError.stack) { + if ((originalError === null || originalError === void 0 ? void 0 : originalError.stack) != null) { Object.defineProperty(this, 'stack', { value: originalError.stack, writable: true, configurable: true }); - } else if (Error.captureStackTrace) { + } else if (Error.captureStackTrace != null) { Error.captureStackTrace(this, GraphQLError); } else { Object.defineProperty(this, 'stack', { @@ -22917,7 +23062,6 @@ class GraphQLError extends Error { } /* c8 ignore stop */ } - get [Symbol.toStringTag]() { return 'GraphQLError'; } @@ -22956,29 +23100,6 @@ exports.GraphQLError = GraphQLError; function undefinedIfEmpty(array) { return array === undefined || array.length === 0 ? undefined : array; } -/** - * See: https://spec.graphql.org/draft/#sec-Errors - */ - -/** - * Prints a GraphQLError to a string, representing useful location information - * about the error's position in the source. - * - * @deprecated Please use `error.toString` instead. Will be removed in v17 - */ -function printError(error) { - return error.toString(); -} -/** - * Given a GraphQLError, format it according to the rules described by the - * Response Format, Errors section of the GraphQL Specification. - * - * @deprecated Please use `error.toJSON` instead. Will be removed in v17 - */ - -function formatError(error) { - return error.toJSON(); -} /***/ }), @@ -22999,24 +23120,12 @@ Object.defineProperty(exports, "GraphQLError", ({ return _GraphQLError.GraphQLError; } })); -Object.defineProperty(exports, "formatError", ({ - enumerable: true, - get: function () { - return _GraphQLError.formatError; - } -})); Object.defineProperty(exports, "locatedError", ({ enumerable: true, get: function () { return _locatedError.locatedError; } })); -Object.defineProperty(exports, "printError", ({ - enumerable: true, - get: function () { - return _GraphQLError.printError; - } -})); Object.defineProperty(exports, "syntaxError", ({ enumerable: true, get: function () { @@ -23048,16 +23157,15 @@ var _GraphQLError = __webpack_require__(/*! ./GraphQLError.mjs */ "../../../node * GraphQL operation, produce a new GraphQLError aware of the location in the * document responsible for the original Error. */ - function locatedError(rawOriginalError, nodes, path) { - var _nodes; - const originalError = (0, _toError.toError)(rawOriginalError); // Note: this uses a brand-check to support GraphQL errors originating from other contexts. - + var _originalError$nodes; + const originalError = (0, _toError.toError)(rawOriginalError); + // Note: this uses a brand-check to support GraphQL errors originating from other contexts. if (isLocatedGraphQLError(originalError)) { return originalError; } return new _GraphQLError.GraphQLError(originalError.message, { - nodes: (_nodes = originalError.nodes) !== null && _nodes !== void 0 ? _nodes : nodes, + nodes: (_originalError$nodes = originalError.nodes) !== null && _originalError$nodes !== void 0 ? _originalError$nodes : nodes, source: originalError.source, positions: originalError.positions, path, @@ -23087,7 +23195,6 @@ var _GraphQLError = __webpack_require__(/*! ./GraphQLError.mjs */ "../../../node * Produces a GraphQLError representing a syntax error, containing useful * descriptive information about the syntax error's position in the source. */ - function syntaxError(source, position, description) { return new _GraphQLError.GraphQLError(`Syntax Error: ${description}`, { source, @@ -23097,6 +23204,613 @@ function syntaxError(source, position, description) { /***/ }), +/***/ "../../../node_modules/graphql/execution/IncrementalGraph.mjs": +/*!********************************************************************!*\ + !*** ../../../node_modules/graphql/execution/IncrementalGraph.mjs ***! + \********************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.IncrementalGraph = void 0; +var _BoxedPromiseOrValue = __webpack_require__(/*! ../jsutils/BoxedPromiseOrValue.mjs */ "../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs"); +var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +var _isPromise = __webpack_require__(/*! ../jsutils/isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); +var _promiseWithResolvers = __webpack_require__(/*! ../jsutils/promiseWithResolvers.mjs */ "../../../node_modules/graphql/jsutils/promiseWithResolvers.mjs"); +var _types = __webpack_require__(/*! ./types.mjs */ "../../../node_modules/graphql/execution/types.mjs"); +/** + * @internal + */ +class IncrementalGraph { + constructor() { + this._rootNodes = new Set(); + this._completedQueue = []; + this._nextQueue = []; + } + getNewRootNodes(incrementalDataRecords) { + const initialResultChildren = new Set(); + this._addIncrementalDataRecords(incrementalDataRecords, undefined, initialResultChildren); + return this._promoteNonEmptyToRoot(initialResultChildren); + } + addCompletedSuccessfulExecutionGroup(successfulExecutionGroup) { + for (const deferredFragmentRecord of successfulExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { + deferredFragmentRecord.pendingExecutionGroups.delete(successfulExecutionGroup.pendingExecutionGroup); + deferredFragmentRecord.successfulExecutionGroups.add(successfulExecutionGroup); + } + const incrementalDataRecords = successfulExecutionGroup.incrementalDataRecords; + if (incrementalDataRecords !== undefined) { + this._addIncrementalDataRecords(incrementalDataRecords, successfulExecutionGroup.pendingExecutionGroup.deferredFragmentRecords); + } + } + *currentCompletedBatch() { + let completed; + while ((completed = this._completedQueue.shift()) !== undefined) { + yield completed; + } + if (this._rootNodes.size === 0) { + for (const resolve of this._nextQueue) { + resolve(undefined); + } + } + } + nextCompletedBatch() { + const { + promise, + resolve + } = (0, _promiseWithResolvers.promiseWithResolvers)(); + this._nextQueue.push(resolve); + return promise; + } + abort() { + for (const resolve of this._nextQueue) { + resolve(undefined); + } + } + hasNext() { + return this._rootNodes.size > 0; + } + completeDeferredFragment(deferredFragmentRecord) { + if (!this._rootNodes.has(deferredFragmentRecord) || deferredFragmentRecord.pendingExecutionGroups.size > 0) { + return; + } + const successfulExecutionGroups = Array.from(deferredFragmentRecord.successfulExecutionGroups); + this._removeRootNode(deferredFragmentRecord); + for (const successfulExecutionGroup of successfulExecutionGroups) { + for (const otherDeferredFragmentRecord of successfulExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { + otherDeferredFragmentRecord.successfulExecutionGroups.delete(successfulExecutionGroup); + } + } + const newRootNodes = this._promoteNonEmptyToRoot(deferredFragmentRecord.children); + return { + newRootNodes, + successfulExecutionGroups + }; + } + removeDeferredFragment(deferredFragmentRecord) { + if (!this._rootNodes.has(deferredFragmentRecord)) { + return false; + } + this._removeRootNode(deferredFragmentRecord); + return true; + } + removeStream(streamRecord) { + this._removeRootNode(streamRecord); + } + _removeRootNode(deliveryGroup) { + this._rootNodes.delete(deliveryGroup); + } + _addIncrementalDataRecords(incrementalDataRecords, parents, initialResultChildren) { + for (const incrementalDataRecord of incrementalDataRecords) { + if ((0, _types.isPendingExecutionGroup)(incrementalDataRecord)) { + for (const deferredFragmentRecord of incrementalDataRecord.deferredFragmentRecords) { + this._addDeferredFragment(deferredFragmentRecord, initialResultChildren); + deferredFragmentRecord.pendingExecutionGroups.add(incrementalDataRecord); + } + if (this._completesRootNode(incrementalDataRecord)) { + this._onExecutionGroup(incrementalDataRecord); + } + } else if (parents === undefined) { + initialResultChildren !== undefined || (0, _invariant.invariant)(false); + initialResultChildren.add(incrementalDataRecord); + } else { + for (const parent of parents) { + this._addDeferredFragment(parent, initialResultChildren); + parent.children.add(incrementalDataRecord); + } + } + } + } + _promoteNonEmptyToRoot(maybeEmptyNewRootNodes) { + const newRootNodes = []; + for (const node of maybeEmptyNewRootNodes) { + if ((0, _types.isDeferredFragmentRecord)(node)) { + if (node.pendingExecutionGroups.size > 0) { + for (const pendingExecutionGroup of node.pendingExecutionGroups) { + if (!this._completesRootNode(pendingExecutionGroup)) { + this._onExecutionGroup(pendingExecutionGroup); + } + } + this._rootNodes.add(node); + newRootNodes.push(node); + continue; + } + for (const child of node.children) { + maybeEmptyNewRootNodes.add(child); + } + } else { + this._rootNodes.add(node); + newRootNodes.push(node); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this._onStreamItems(node); + } + } + return newRootNodes; + } + _completesRootNode(pendingExecutionGroup) { + return pendingExecutionGroup.deferredFragmentRecords.some(deferredFragmentRecord => this._rootNodes.has(deferredFragmentRecord)); + } + _addDeferredFragment(deferredFragmentRecord, initialResultChildren) { + if (this._rootNodes.has(deferredFragmentRecord)) { + return; + } + const parent = deferredFragmentRecord.parent; + if (parent === undefined) { + initialResultChildren !== undefined || (0, _invariant.invariant)(false); + initialResultChildren.add(deferredFragmentRecord); + return; + } + parent.children.add(deferredFragmentRecord); + this._addDeferredFragment(parent, initialResultChildren); + } + _onExecutionGroup(pendingExecutionGroup) { + let completedExecutionGroup = pendingExecutionGroup.result; + if (!(completedExecutionGroup instanceof _BoxedPromiseOrValue.BoxedPromiseOrValue)) { + completedExecutionGroup = completedExecutionGroup(); + } + const value = completedExecutionGroup.value; + if ((0, _isPromise.isPromise)(value)) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + value.then(resolved => this._enqueue(resolved)); + } else { + this._enqueue(value); + } + } + async _onStreamItems(streamRecord) { + let items = []; + let errors = []; + let incrementalDataRecords = []; + const streamItemQueue = streamRecord.streamItemQueue; + let streamItemRecord; + while ((streamItemRecord = streamItemQueue.shift()) !== undefined) { + let result = streamItemRecord instanceof _BoxedPromiseOrValue.BoxedPromiseOrValue ? streamItemRecord.value : streamItemRecord().value; + if ((0, _isPromise.isPromise)(result)) { + if (items.length > 0) { + this._enqueue({ + streamRecord, + result: + // TODO add additional test case or rework for coverage + errors.length > 0 /* c8 ignore start */ ? { + items, + errors + } /* c8 ignore stop */ : { + items + }, + incrementalDataRecords + }); + items = []; + errors = []; + incrementalDataRecords = []; + } + // eslint-disable-next-line no-await-in-loop + result = await result; + // wait an additional tick to coalesce resolving additional promises + // within the queue + // eslint-disable-next-line no-await-in-loop + await Promise.resolve(); + } + if (result.item === undefined) { + if (items.length > 0) { + this._enqueue({ + streamRecord, + result: errors.length > 0 ? { + items, + errors + } : { + items + }, + incrementalDataRecords + }); + } + this._enqueue(result.errors === undefined ? { + streamRecord + } : { + streamRecord, + errors: result.errors + }); + return; + } + items.push(result.item); + if (result.errors !== undefined) { + errors.push(...result.errors); + } + if (result.incrementalDataRecords !== undefined) { + incrementalDataRecords.push(...result.incrementalDataRecords); + } + } + } + *_yieldCurrentCompletedIncrementalData(first) { + yield first; + yield* this.currentCompletedBatch(); + } + _enqueue(completed) { + const next = this._nextQueue.shift(); + if (next !== undefined) { + next(this._yieldCurrentCompletedIncrementalData(completed)); + return; + } + this._completedQueue.push(completed); + } +} +exports.IncrementalGraph = IncrementalGraph; + +/***/ }), + +/***/ "../../../node_modules/graphql/execution/IncrementalPublisher.mjs": +/*!************************************************************************!*\ + !*** ../../../node_modules/graphql/execution/IncrementalPublisher.mjs ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.buildIncrementalResponse = buildIncrementalResponse; +var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +var _Path = __webpack_require__(/*! ../jsutils/Path.mjs */ "../../../node_modules/graphql/jsutils/Path.mjs"); +var _IncrementalGraph = __webpack_require__(/*! ./IncrementalGraph.mjs */ "../../../node_modules/graphql/execution/IncrementalGraph.mjs"); +var _types = __webpack_require__(/*! ./types.mjs */ "../../../node_modules/graphql/execution/types.mjs"); +function buildIncrementalResponse(context, result, errors, incrementalDataRecords) { + const incrementalPublisher = new IncrementalPublisher(context); + return incrementalPublisher.buildResponse(result, errors, incrementalDataRecords); +} +/** + * This class is used to publish incremental results to the client, enabling semi-concurrent + * execution while preserving result order. + * + * @internal + */ +class IncrementalPublisher { + constructor(context) { + this._context = context; + this._nextId = 0; + this._incrementalGraph = new _IncrementalGraph.IncrementalGraph(); + } + buildResponse(data, errors, incrementalDataRecords) { + const newRootNodes = this._incrementalGraph.getNewRootNodes(incrementalDataRecords); + const pending = this._toPendingResults(newRootNodes); + const initialResult = errors === undefined ? { + data, + pending, + hasNext: true + } : { + errors, + data, + pending, + hasNext: true + }; + return { + initialResult, + subsequentResults: this._subscribe() + }; + } + _toPendingResults(newRootNodes) { + const pendingResults = []; + for (const node of newRootNodes) { + const id = String(this._getNextId()); + node.id = id; + const pendingResult = { + id, + path: (0, _Path.pathToArray)(node.path) + }; + if (node.label !== undefined) { + pendingResult.label = node.label; + } + pendingResults.push(pendingResult); + } + return pendingResults; + } + _getNextId() { + return String(this._nextId++); + } + _subscribe() { + let isDone = false; + const _next = async () => { + if (isDone) { + await this._returnAsyncIteratorsIgnoringErrors(); + return { + value: undefined, + done: true + }; + } + const context = { + pending: [], + incremental: [], + completed: [] + }; + let batch = this._incrementalGraph.currentCompletedBatch(); + do { + for (const completedResult of batch) { + this._handleCompletedIncrementalData(completedResult, context); + } + const { + incremental, + completed + } = context; + if (incremental.length > 0 || completed.length > 0) { + const hasNext = this._incrementalGraph.hasNext(); + if (!hasNext) { + isDone = true; + } + const subsequentIncrementalExecutionResult = { + hasNext + }; + const pending = context.pending; + if (pending.length > 0) { + subsequentIncrementalExecutionResult.pending = pending; + } + if (incremental.length > 0) { + subsequentIncrementalExecutionResult.incremental = incremental; + } + if (completed.length > 0) { + subsequentIncrementalExecutionResult.completed = completed; + } + return { + value: subsequentIncrementalExecutionResult, + done: false + }; + } + // eslint-disable-next-line no-await-in-loop + batch = await this._incrementalGraph.nextCompletedBatch(); + } while (batch !== undefined); + await this._returnAsyncIteratorsIgnoringErrors(); + return { + value: undefined, + done: true + }; + }; + const _return = async () => { + isDone = true; + this._incrementalGraph.abort(); + await this._returnAsyncIterators(); + return { + value: undefined, + done: true + }; + }; + const _throw = async error => { + isDone = true; + this._incrementalGraph.abort(); + await this._returnAsyncIterators(); + return Promise.reject(error); + }; + return { + [Symbol.asyncIterator]() { + return this; + }, + next: _next, + return: _return, + throw: _throw + }; + } + _handleCompletedIncrementalData(completedIncrementalData, context) { + if ((0, _types.isCompletedExecutionGroup)(completedIncrementalData)) { + this._handleCompletedExecutionGroup(completedIncrementalData, context); + } else { + this._handleCompletedStreamItems(completedIncrementalData, context); + } + } + _handleCompletedExecutionGroup(completedExecutionGroup, context) { + if ((0, _types.isFailedExecutionGroup)(completedExecutionGroup)) { + for (const deferredFragmentRecord of completedExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { + const id = deferredFragmentRecord.id; + if (!this._incrementalGraph.removeDeferredFragment(deferredFragmentRecord)) { + // This can occur if multiple deferred grouped field sets error for a fragment. + continue; + } + id !== undefined || (0, _invariant.invariant)(false); + context.completed.push({ + id, + errors: completedExecutionGroup.errors + }); + } + return; + } + this._incrementalGraph.addCompletedSuccessfulExecutionGroup(completedExecutionGroup); + for (const deferredFragmentRecord of completedExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { + const completion = this._incrementalGraph.completeDeferredFragment(deferredFragmentRecord); + if (completion === undefined) { + continue; + } + const id = deferredFragmentRecord.id; + id !== undefined || (0, _invariant.invariant)(false); + const incremental = context.incremental; + const { + newRootNodes, + successfulExecutionGroups + } = completion; + context.pending.push(...this._toPendingResults(newRootNodes)); + for (const successfulExecutionGroup of successfulExecutionGroups) { + const { + bestId, + subPath + } = this._getBestIdAndSubPath(id, deferredFragmentRecord, successfulExecutionGroup); + const incrementalEntry = { + ...successfulExecutionGroup.result, + id: bestId + }; + if (subPath !== undefined) { + incrementalEntry.subPath = subPath; + } + incremental.push(incrementalEntry); + } + context.completed.push({ + id + }); + } + } + _handleCompletedStreamItems(streamItemsResult, context) { + const streamRecord = streamItemsResult.streamRecord; + const id = streamRecord.id; + id !== undefined || (0, _invariant.invariant)(false); + if (streamItemsResult.errors !== undefined) { + context.completed.push({ + id, + errors: streamItemsResult.errors + }); + this._incrementalGraph.removeStream(streamRecord); + if ((0, _types.isCancellableStreamRecord)(streamRecord)) { + this._context.cancellableStreams !== undefined || (0, _invariant.invariant)(false); + this._context.cancellableStreams.delete(streamRecord); + streamRecord.earlyReturn().catch(() => { + /* c8 ignore next 1 */ + // ignore error + }); + } + } else if (streamItemsResult.result === undefined) { + context.completed.push({ + id + }); + this._incrementalGraph.removeStream(streamRecord); + if ((0, _types.isCancellableStreamRecord)(streamRecord)) { + this._context.cancellableStreams !== undefined || (0, _invariant.invariant)(false); + this._context.cancellableStreams.delete(streamRecord); + } + } else { + const incrementalEntry = { + id, + ...streamItemsResult.result + }; + context.incremental.push(incrementalEntry); + const incrementalDataRecords = streamItemsResult.incrementalDataRecords; + if (incrementalDataRecords !== undefined) { + const newRootNodes = this._incrementalGraph.getNewRootNodes(incrementalDataRecords); + context.pending.push(...this._toPendingResults(newRootNodes)); + } + } + } + _getBestIdAndSubPath(initialId, initialDeferredFragmentRecord, completedExecutionGroup) { + let maxLength = (0, _Path.pathToArray)(initialDeferredFragmentRecord.path).length; + let bestId = initialId; + for (const deferredFragmentRecord of completedExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { + if (deferredFragmentRecord === initialDeferredFragmentRecord) { + continue; + } + const id = deferredFragmentRecord.id; + // TODO: add test case for when an fragment has not been released, but might be processed for the shortest path. + /* c8 ignore next 3 */ + if (id === undefined) { + continue; + } + const fragmentPath = (0, _Path.pathToArray)(deferredFragmentRecord.path); + const length = fragmentPath.length; + if (length > maxLength) { + maxLength = length; + bestId = id; + } + } + const subPath = completedExecutionGroup.path.slice(maxLength); + return { + bestId, + subPath: subPath.length > 0 ? subPath : undefined + }; + } + async _returnAsyncIterators() { + const cancellableStreams = this._context.cancellableStreams; + if (cancellableStreams === undefined) { + return; + } + const promises = []; + for (const streamRecord of cancellableStreams) { + if (streamRecord.earlyReturn !== undefined) { + promises.push(streamRecord.earlyReturn()); + } + } + await Promise.all(promises); + } + async _returnAsyncIteratorsIgnoringErrors() { + await this._returnAsyncIterators().catch(() => { + // Ignore errors + }); + } +} + +/***/ }), + +/***/ "../../../node_modules/graphql/execution/buildExecutionPlan.mjs": +/*!**********************************************************************!*\ + !*** ../../../node_modules/graphql/execution/buildExecutionPlan.mjs ***! + \**********************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.buildExecutionPlan = buildExecutionPlan; +var _getBySet = __webpack_require__(/*! ../jsutils/getBySet.mjs */ "../../../node_modules/graphql/jsutils/getBySet.mjs"); +var _isSameSet = __webpack_require__(/*! ../jsutils/isSameSet.mjs */ "../../../node_modules/graphql/jsutils/isSameSet.mjs"); +function buildExecutionPlan(originalGroupedFieldSet, parentDeferUsages = new Set()) { + const groupedFieldSet = new Map(); + const newGroupedFieldSets = new Map(); + for (const [responseKey, fieldGroup] of originalGroupedFieldSet) { + const filteredDeferUsageSet = getFilteredDeferUsageSet(fieldGroup); + if ((0, _isSameSet.isSameSet)(filteredDeferUsageSet, parentDeferUsages)) { + groupedFieldSet.set(responseKey, fieldGroup); + continue; + } + let newGroupedFieldSet = (0, _getBySet.getBySet)(newGroupedFieldSets, filteredDeferUsageSet); + if (newGroupedFieldSet === undefined) { + newGroupedFieldSet = new Map(); + newGroupedFieldSets.set(filteredDeferUsageSet, newGroupedFieldSet); + } + newGroupedFieldSet.set(responseKey, fieldGroup); + } + return { + groupedFieldSet, + newGroupedFieldSets + }; +} +function getFilteredDeferUsageSet(fieldGroup) { + const filteredDeferUsageSet = new Set(); + for (const fieldDetails of fieldGroup) { + const deferUsage = fieldDetails.deferUsage; + if (deferUsage === undefined) { + filteredDeferUsageSet.clear(); + return filteredDeferUsageSet; + } + filteredDeferUsageSet.add(deferUsage); + } + for (const deferUsage of filteredDeferUsageSet) { + let parentDeferUsage = deferUsage.parentDeferUsage; + while (parentDeferUsage !== undefined) { + if (filteredDeferUsageSet.has(parentDeferUsage)) { + filteredDeferUsageSet.delete(deferUsage); + break; + } + parentDeferUsage = parentDeferUsage.parentDeferUsage; + } + } + return filteredDeferUsageSet; +} + +/***/ }), + /***/ "../../../node_modules/graphql/execution/collectFields.mjs": /*!*****************************************************************!*\ !*** ../../../node_modules/graphql/execution/collectFields.mjs ***! @@ -23110,6 +23824,9 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.collectFields = collectFields; exports.collectSubfields = collectSubfields; +var _AccumulatorMap = __webpack_require__(/*! ../jsutils/AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); +var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); @@ -23124,11 +23841,22 @@ var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/gra * * @internal */ - -function collectFields(schema, fragments, variableValues, runtimeType, selectionSet) { - const fields = new Map(); - collectFieldsImpl(schema, fragments, variableValues, runtimeType, selectionSet, fields, new Set()); - return fields; +function collectFields(schema, fragments, variableValues, runtimeType, operation) { + const groupedFieldSet = new _AccumulatorMap.AccumulatorMap(); + const newDeferUsages = []; + const context = { + schema, + fragments, + variableValues, + runtimeType, + operation, + visitedFragmentNames: new Set() + }; + collectFieldsImpl(context, operation.selectionSet, groupedFieldSet, newDeferUsages); + return { + groupedFieldSet, + newDeferUsages + }; } /** * Given an array of field nodes, collects all of the subfields of the passed @@ -23140,18 +23868,38 @@ function collectFields(schema, fragments, variableValues, runtimeType, selection * * @internal */ - -function collectSubfields(schema, fragments, variableValues, returnType, fieldNodes) { - const subFieldNodes = new Map(); - const visitedFragmentNames = new Set(); - for (const node of fieldNodes) { +// eslint-disable-next-line max-params +function collectSubfields(schema, fragments, variableValues, operation, returnType, fieldGroup) { + const context = { + schema, + fragments, + variableValues, + runtimeType: returnType, + operation, + visitedFragmentNames: new Set() + }; + const subGroupedFieldSet = new _AccumulatorMap.AccumulatorMap(); + const newDeferUsages = []; + for (const fieldDetail of fieldGroup) { + const node = fieldDetail.node; if (node.selectionSet) { - collectFieldsImpl(schema, fragments, variableValues, returnType, node.selectionSet, subFieldNodes, visitedFragmentNames); + collectFieldsImpl(context, node.selectionSet, subGroupedFieldSet, newDeferUsages, fieldDetail.deferUsage); } } - return subFieldNodes; + return { + groupedFieldSet: subGroupedFieldSet, + newDeferUsages + }; } -function collectFieldsImpl(schema, fragments, variableValues, runtimeType, selectionSet, fields, visitedFragmentNames) { +function collectFieldsImpl(context, selectionSet, groupedFieldSet, newDeferUsages, deferUsage) { + const { + schema, + fragments, + variableValues, + runtimeType, + operation, + visitedFragmentNames + } = context; for (const selection of selectionSet.selections) { switch (selection.kind) { case _kinds.Kind.FIELD: @@ -23159,13 +23907,10 @@ function collectFieldsImpl(schema, fragments, variableValues, runtimeType, selec if (!shouldIncludeNode(variableValues, selection)) { continue; } - const name = getFieldEntryKey(selection); - const fieldList = fields.get(name); - if (fieldList !== undefined) { - fieldList.push(selection); - } else { - fields.set(name, [selection]); - } + groupedFieldSet.add(getFieldEntryKey(selection), { + node: selection, + deferUsage + }); break; } case _kinds.Kind.INLINE_FRAGMENT: @@ -23173,31 +23918,61 @@ function collectFieldsImpl(schema, fragments, variableValues, runtimeType, selec if (!shouldIncludeNode(variableValues, selection) || !doesFragmentConditionMatch(schema, selection, runtimeType)) { continue; } - collectFieldsImpl(schema, fragments, variableValues, runtimeType, selection.selectionSet, fields, visitedFragmentNames); + const newDeferUsage = getDeferUsage(operation, variableValues, selection, deferUsage); + if (!newDeferUsage) { + collectFieldsImpl(context, selection.selectionSet, groupedFieldSet, newDeferUsages, deferUsage); + } else { + newDeferUsages.push(newDeferUsage); + collectFieldsImpl(context, selection.selectionSet, groupedFieldSet, newDeferUsages, newDeferUsage); + } break; } case _kinds.Kind.FRAGMENT_SPREAD: { const fragName = selection.name.value; - if (visitedFragmentNames.has(fragName) || !shouldIncludeNode(variableValues, selection)) { + const newDeferUsage = getDeferUsage(operation, variableValues, selection, deferUsage); + if (!newDeferUsage && (visitedFragmentNames.has(fragName) || !shouldIncludeNode(variableValues, selection))) { continue; } - visitedFragmentNames.add(fragName); const fragment = fragments[fragName]; - if (!fragment || !doesFragmentConditionMatch(schema, fragment, runtimeType)) { + if (fragment == null || !doesFragmentConditionMatch(schema, fragment, runtimeType)) { continue; } - collectFieldsImpl(schema, fragments, variableValues, runtimeType, fragment.selectionSet, fields, visitedFragmentNames); + if (!newDeferUsage) { + visitedFragmentNames.add(fragName); + collectFieldsImpl(context, fragment.selectionSet, groupedFieldSet, newDeferUsages, deferUsage); + } else { + newDeferUsages.push(newDeferUsage); + collectFieldsImpl(context, fragment.selectionSet, groupedFieldSet, newDeferUsages, newDeferUsage); + } break; } } } } +/** + * Returns an object containing the `@defer` arguments if a field should be + * deferred based on the experimental flag, defer directive present and + * not disabled by the "if" argument. + */ +function getDeferUsage(operation, variableValues, node, parentDeferUsage) { + const defer = (0, _values.getDirectiveValues)(_directives.GraphQLDeferDirective, node, variableValues); + if (!defer) { + return; + } + if (defer.if === false) { + return; + } + operation.operation !== _ast.OperationTypeNode.SUBSCRIPTION || (0, _invariant.invariant)(false, '`@defer` directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`.'); + return { + label: typeof defer.label === 'string' ? defer.label : undefined, + parentDeferUsage + }; +} /** * Determines if a field should be included based on the `@include` and `@skip` * directives, where `@skip` has higher precedence than `@include`. */ - function shouldIncludeNode(variableValues, node) { const skip = (0, _values.getDirectiveValues)(_directives.GraphQLSkipDirective, node, variableValues); if ((skip === null || skip === void 0 ? void 0 : skip.if) === true) { @@ -23212,7 +23987,6 @@ function shouldIncludeNode(variableValues, node) { /** * Determines if a fragment is applicable to the given type. */ - function doesFragmentConditionMatch(schema, fragment, type) { const typeConditionNode = fragment.typeCondition; if (!typeConditionNode) { @@ -23230,7 +24004,6 @@ function doesFragmentConditionMatch(schema, fragment, type) { /** * Implements the logic to compute the key of a given field's entry */ - function getFieldEntryKey(node) { return node.alias ? node.alias.value : node.name.value; } @@ -23248,16 +24021,18 @@ function getFieldEntryKey(node) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.assertValidExecutionArguments = assertValidExecutionArguments; exports.buildExecutionContext = buildExecutionContext; exports.buildResolveInfo = buildResolveInfo; +exports.createSourceEventStream = createSourceEventStream; exports.defaultTypeResolver = exports.defaultFieldResolver = void 0; exports.execute = execute; exports.executeSync = executeSync; -exports.getFieldDef = getFieldDef; -var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +exports.experimentalExecuteIncrementally = experimentalExecuteIncrementally; +exports.subscribe = subscribe; +var _BoxedPromiseOrValue = __webpack_require__(/*! ../jsutils/BoxedPromiseOrValue.mjs */ "../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +var _isAsyncIterable = __webpack_require__(/*! ../jsutils/isAsyncIterable.mjs */ "../../../node_modules/graphql/jsutils/isAsyncIterable.mjs"); var _isIterableObject = __webpack_require__(/*! ../jsutils/isIterableObject.mjs */ "../../../node_modules/graphql/jsutils/isIterableObject.mjs"); var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _isPromise = __webpack_require__(/*! ../jsutils/isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); @@ -23270,44 +24045,25 @@ var _locatedError = __webpack_require__(/*! ../error/locatedError.mjs */ "../../ var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); -var _introspection = __webpack_require__(/*! ../type/introspection.mjs */ "../../../node_modules/graphql/type/introspection.mjs"); +var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); var _validate = __webpack_require__(/*! ../type/validate.mjs */ "../../../node_modules/graphql/type/validate.mjs"); +var _buildExecutionPlan = __webpack_require__(/*! ./buildExecutionPlan.mjs */ "../../../node_modules/graphql/execution/buildExecutionPlan.mjs"); var _collectFields = __webpack_require__(/*! ./collectFields.mjs */ "../../../node_modules/graphql/execution/collectFields.mjs"); +var _IncrementalPublisher = __webpack_require__(/*! ./IncrementalPublisher.mjs */ "../../../node_modules/graphql/execution/IncrementalPublisher.mjs"); +var _mapAsyncIterable = __webpack_require__(/*! ./mapAsyncIterable.mjs */ "../../../node_modules/graphql/execution/mapAsyncIterable.mjs"); +var _types = __webpack_require__(/*! ./types.mjs */ "../../../node_modules/graphql/execution/types.mjs"); var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/graphql/execution/values.mjs"); +/* eslint-disable max-params */ +// This file contains a lot of such errors but we plan to refactor it anyway +// so just disable it for entire file. /** * A memoized collection of relevant subfields with regard to the return * type. Memoizing ensures the subfields are not repeatedly calculated, which * saves overhead when resolving lists of values. */ - -const collectSubfields = (0, _memoize.memoize3)((exeContext, returnType, fieldNodes) => (0, _collectFields.collectSubfields)(exeContext.schema, exeContext.fragments, exeContext.variableValues, returnType, fieldNodes)); -/** - * Terminology - * - * "Definitions" are the generic name for top-level statements in the document. - * Examples of this include: - * 1) Operations (such as a query) - * 2) Fragments - * - * "Operations" are a generic name for requests in the document. - * Examples of this include: - * 1) query, - * 2) mutation - * - * "Selections" are the definitions that can appear legally and at - * single level of the query. These include: - * 1) field references e.g `a` - * 2) fragment "spreads" e.g. `...c` - * 3) inline fragment "spreads" e.g. `...on Type { a }` - */ - -/** - * Data that must be available at all points during query execution. - * - * Namely, schema of the type system that is currently executing, - * and the fragments defined in the query document - */ - +const collectSubfields = (0, _memoize.memoize3)((exeContext, returnType, fieldGroup) => (0, _collectFields.collectSubfields)(exeContext.schema, exeContext.fragments, exeContext.variableValues, exeContext.operation, returnType, fieldGroup)); +const UNEXPECTED_EXPERIMENTAL_DIRECTIVES = 'The provided schema unexpectedly contains experimental directives (@defer or @stream). These directives may only be utilized if experimental execution features are explicitly enabled.'; +const UNEXPECTED_MULTIPLE_PAYLOADS = 'Executing this GraphQL operation would unexpectedly produce multiple payloads (due to @defer or @stream directive)'; /** * Implements the "Executing requests" section of the GraphQL specification. * @@ -23317,105 +24073,177 @@ const collectSubfields = (0, _memoize.memoize3)((exeContext, returnType, fieldNo * * If the arguments to this function do not result in a legal execution context, * a GraphQLError will be thrown immediately explaining the invalid input. + * + * This function does not support incremental delivery (`@defer` and `@stream`). + * If an operation which would defer or stream data is executed with this + * function, it will throw or return a rejected promise. + * Use `experimentalExecuteIncrementally` if you want to support incremental + * delivery. */ function execute(args) { - // Temporary for v15 to v16 migration. Remove in v17 - arguments.length < 2 || (0, _devAssert.devAssert)(false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.'); - const { - schema, - document, - variableValues, - rootValue - } = args; // If arguments are missing or incorrect, throw an error. - - assertValidExecutionArguments(schema, document, variableValues); // If a valid execution context cannot be created due to incorrect arguments, + if (args.schema.getDirective('defer') || args.schema.getDirective('stream')) { + throw new Error(UNEXPECTED_EXPERIMENTAL_DIRECTIVES); + } + const result = experimentalExecuteIncrementally(args); + if (!(0, _isPromise.isPromise)(result)) { + if ('initialResult' in result) { + // This can happen if the operation contains @defer or @stream directives + // and is not validated prior to execution + throw new Error(UNEXPECTED_MULTIPLE_PAYLOADS); + } + return result; + } + return result.then(incrementalResult => { + if ('initialResult' in incrementalResult) { + // This can happen if the operation contains @defer or @stream directives + // and is not validated prior to execution + throw new Error(UNEXPECTED_MULTIPLE_PAYLOADS); + } + return incrementalResult; + }); +} +/** + * Implements the "Executing requests" section of the GraphQL specification, + * including `@defer` and `@stream` as proposed in + * https://github.com/graphql/graphql-spec/pull/742 + * + * This function returns a Promise of an ExperimentalIncrementalExecutionResults + * object. This object either consists of a single ExecutionResult, or an + * object containing an `initialResult` and a stream of `subsequentResults`. + * + * If the arguments to this function do not result in a legal execution context, + * a GraphQLError will be thrown immediately explaining the invalid input. + */ +function experimentalExecuteIncrementally(args) { + // If a valid execution context cannot be created due to incorrect arguments, // a "Response" with only errors is returned. - - const exeContext = buildExecutionContext(args); // Return early errors if execution context failed. - + const exeContext = buildExecutionContext(args); + // Return early errors if execution context failed. if (!('schema' in exeContext)) { return { errors: exeContext }; - } // Return a Promise that will eventually resolve to the data described by - // The "Response" section of the GraphQL specification. - // - // If errors are encountered while executing a GraphQL field, only that - // field and its descendants will be omitted, and sibling fields will still - // be executed. An execution which encounters errors will still result in a - // resolved Promise. - // - // Errors from sub-fields of a NonNull type may propagate to the top level, - // at which point we still log the error and null the parent field, which - // in this case is the entire response. - + } + return executeOperation(exeContext); +} +/** + * Implements the "Executing operations" section of the spec. + * + * Returns a Promise that will eventually resolve to the data described by + * The "Response" section of the GraphQL specification. + * + * If errors are encountered while executing a GraphQL field, only that + * field and its descendants will be omitted, and sibling fields will still + * be executed. An execution which encounters errors will still result in a + * resolved Promise. + * + * Errors from sub-fields of a NonNull type may propagate to the top level, + * at which point we still log the error and null the parent field, which + * in this case is the entire response. + */ +function executeOperation(exeContext) { try { const { - operation + operation, + schema, + fragments, + variableValues, + rootValue } = exeContext; - const result = executeOperation(exeContext, operation, rootValue); - if ((0, _isPromise.isPromise)(result)) { - return result.then(data => buildResponse(data, exeContext.errors), error => { - exeContext.errors.push(error); - return buildResponse(null, exeContext.errors); + const rootType = schema.getRootType(operation.operation); + if (rootType == null) { + throw new _GraphQLError.GraphQLError(`Schema is not configured to execute ${operation.operation} operation.`, { + nodes: operation }); } - return buildResponse(result, exeContext.errors); + const collectedFields = (0, _collectFields.collectFields)(schema, fragments, variableValues, rootType, operation); + let groupedFieldSet = collectedFields.groupedFieldSet; + const newDeferUsages = collectedFields.newDeferUsages; + let graphqlWrappedResult; + if (newDeferUsages.length === 0) { + graphqlWrappedResult = executeRootGroupedFieldSet(exeContext, operation.operation, rootType, rootValue, groupedFieldSet, undefined); + } else { + const executionPlan = (0, _buildExecutionPlan.buildExecutionPlan)(groupedFieldSet); + groupedFieldSet = executionPlan.groupedFieldSet; + const newGroupedFieldSets = executionPlan.newGroupedFieldSets; + const newDeferMap = addNewDeferredFragments(newDeferUsages, new Map()); + graphqlWrappedResult = executeRootGroupedFieldSet(exeContext, operation.operation, rootType, rootValue, groupedFieldSet, newDeferMap); + if (newGroupedFieldSets.size > 0) { + const newPendingExecutionGroups = collectExecutionGroups(exeContext, rootType, rootValue, undefined, undefined, newGroupedFieldSets, newDeferMap); + graphqlWrappedResult = withNewExecutionGroups(graphqlWrappedResult, newPendingExecutionGroups); + } + } + if ((0, _isPromise.isPromise)(graphqlWrappedResult)) { + return graphqlWrappedResult.then(resolved => buildDataResponse(exeContext, resolved[0], resolved[1]), error => ({ + data: null, + errors: withError(exeContext.errors, error) + })); + } + return buildDataResponse(exeContext, graphqlWrappedResult[0], graphqlWrappedResult[1]); } catch (error) { - exeContext.errors.push(error); - return buildResponse(null, exeContext.errors); + return { + data: null, + errors: withError(exeContext.errors, error) + }; + } +} +function withNewExecutionGroups(result, newPendingExecutionGroups) { + if ((0, _isPromise.isPromise)(result)) { + return result.then(resolved => { + addIncrementalDataRecords(resolved, newPendingExecutionGroups); + return resolved; + }); } + addIncrementalDataRecords(result, newPendingExecutionGroups); + return result; +} +function addIncrementalDataRecords(graphqlWrappedResult, incrementalDataRecords) { + if (incrementalDataRecords === undefined) { + return; + } + if (graphqlWrappedResult[1] === undefined) { + graphqlWrappedResult[1] = [...incrementalDataRecords]; + } else { + graphqlWrappedResult[1].push(...incrementalDataRecords); + } +} +function withError(errors, error) { + return errors === undefined ? [error] : [...errors, error]; +} +function buildDataResponse(exeContext, data, incrementalDataRecords) { + const errors = exeContext.errors; + if (incrementalDataRecords === undefined) { + return errors !== undefined ? { + errors, + data + } : { + data + }; + } + return (0, _IncrementalPublisher.buildIncrementalResponse)(exeContext, data, errors, incrementalDataRecords); } /** * Also implements the "Executing requests" section of the GraphQL specification. * However, it guarantees to complete synchronously (or throw an error) assuming * that all field resolvers are also synchronous. */ - function executeSync(args) { - const result = execute(args); // Assert that the execution was synchronous. - - if ((0, _isPromise.isPromise)(result)) { + const result = experimentalExecuteIncrementally(args); + // Assert that the execution was synchronous. + if ((0, _isPromise.isPromise)(result) || 'initialResult' in result) { throw new Error('GraphQL execution failed to complete synchronously.'); } return result; } -/** - * Given a completed execution context and data, build the `{ errors, data }` - * response defined by the "Response" section of the GraphQL specification. - */ - -function buildResponse(data, errors) { - return errors.length === 0 ? { - data - } : { - errors, - data - }; -} -/** - * Essential assertions before executing to provide developer feedback for - * improper use of the GraphQL library. - * - * @internal - */ - -function assertValidExecutionArguments(schema, document, rawVariableValues) { - document || (0, _devAssert.devAssert)(false, 'Must provide document.'); // If the schema used for execution is invalid, throw an error. - - (0, _validate.assertValidSchema)(schema); // Variables, if provided, must be an object. - - rawVariableValues == null || (0, _isObjectLike.isObjectLike)(rawVariableValues) || (0, _devAssert.devAssert)(false, 'Variables must be provided as an Object where each property is a variable value. Perhaps look to see if an unparsed JSON string was provided.'); -} /** * Constructs a ExecutionContext object from the arguments passed to * execute, which we will pass throughout the other execution methods. * * Throws a GraphQLError if a valid execution context cannot be created. * + * TODO: consider no longer exporting this function * @internal */ - function buildExecutionContext(args) { var _definition$name, _operation$variableDe; const { @@ -23427,8 +24255,11 @@ function buildExecutionContext(args) { operationName, fieldResolver, typeResolver, - subscribeFieldResolver + subscribeFieldResolver, + enableEarlyExecution } = args; + // If the schema used for execution is invalid, throw an error. + (0, _validate.assertValidSchema)(schema); let operation; const fragments = Object.create(null); for (const definition of document.definitions) { @@ -23446,19 +24277,18 @@ function buildExecutionContext(args) { case _kinds.Kind.FRAGMENT_DEFINITION: fragments[definition.name.value] = definition; break; - default: // ignore non-executable definitions + default: + // ignore non-executable definitions } } - if (!operation) { if (operationName != null) { return [new _GraphQLError.GraphQLError(`Unknown operation named "${operationName}".`)]; } return [new _GraphQLError.GraphQLError('Must provide an operation.')]; - } // FIXME: https://github.com/graphql/graphql-js/issues/2203 - + } + // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ - const variableDefinitions = (_operation$variableDe = operation.variableDefinitions) !== null && _operation$variableDe !== void 0 ? _operation$variableDe : []; const coercedVariableValues = (0, _values.getVariableValues)(schema, variableDefinitions, rawVariableValues !== null && rawVariableValues !== void 0 ? rawVariableValues : {}, { maxErrors: 50 @@ -23476,92 +24306,100 @@ function buildExecutionContext(args) { fieldResolver: fieldResolver !== null && fieldResolver !== void 0 ? fieldResolver : defaultFieldResolver, typeResolver: typeResolver !== null && typeResolver !== void 0 ? typeResolver : defaultTypeResolver, subscribeFieldResolver: subscribeFieldResolver !== null && subscribeFieldResolver !== void 0 ? subscribeFieldResolver : defaultFieldResolver, - errors: [] + enableEarlyExecution: enableEarlyExecution === true, + errors: undefined, + cancellableStreams: undefined }; } -/** - * Implements the "Executing operations" section of the spec. - */ - -function executeOperation(exeContext, operation, rootValue) { - const rootType = exeContext.schema.getRootType(operation.operation); - if (rootType == null) { - throw new _GraphQLError.GraphQLError(`Schema is not configured to execute ${operation.operation} operation.`, { - nodes: operation - }); - } - const rootFields = (0, _collectFields.collectFields)(exeContext.schema, exeContext.fragments, exeContext.variableValues, rootType, operation.selectionSet); - const path = undefined; - switch (operation.operation) { +function buildPerEventExecutionContext(exeContext, payload) { + return { + ...exeContext, + rootValue: payload, + errors: undefined + }; +} +function executeRootGroupedFieldSet(exeContext, operation, rootType, rootValue, groupedFieldSet, deferMap) { + switch (operation) { case _ast.OperationTypeNode.QUERY: - return executeFields(exeContext, rootType, rootValue, path, rootFields); + return executeFields(exeContext, rootType, rootValue, undefined, groupedFieldSet, undefined, deferMap); case _ast.OperationTypeNode.MUTATION: - return executeFieldsSerially(exeContext, rootType, rootValue, path, rootFields); + return executeFieldsSerially(exeContext, rootType, rootValue, undefined, groupedFieldSet, undefined, deferMap); case _ast.OperationTypeNode.SUBSCRIPTION: // TODO: deprecate `subscribe` and move all logic here // Temporary solution until we finish merging execute and subscribe together - return executeFields(exeContext, rootType, rootValue, path, rootFields); + return executeFields(exeContext, rootType, rootValue, undefined, groupedFieldSet, undefined, deferMap); } } /** * Implements the "Executing selection sets" section of the spec * for fields that must be executed serially. */ - -function executeFieldsSerially(exeContext, parentType, sourceValue, path, fields) { - return (0, _promiseReduce.promiseReduce)(fields.entries(), (results, _ref) => { - let [responseName, fieldNodes] = _ref; +function executeFieldsSerially(exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap) { + return (0, _promiseReduce.promiseReduce)(groupedFieldSet, (graphqlWrappedResult, [responseName, fieldGroup]) => { const fieldPath = (0, _Path.addPath)(path, responseName, parentType.name); - const result = executeField(exeContext, parentType, sourceValue, fieldNodes, fieldPath); + const result = executeField(exeContext, parentType, sourceValue, fieldGroup, fieldPath, incrementalContext, deferMap); if (result === undefined) { - return results; + return graphqlWrappedResult; } if ((0, _isPromise.isPromise)(result)) { - return result.then(resolvedResult => { - results[responseName] = resolvedResult; - return results; + return result.then(resolved => { + graphqlWrappedResult[0][responseName] = resolved[0]; + addIncrementalDataRecords(graphqlWrappedResult, resolved[1]); + return graphqlWrappedResult; }); } - results[responseName] = result; - return results; - }, Object.create(null)); + graphqlWrappedResult[0][responseName] = result[0]; + addIncrementalDataRecords(graphqlWrappedResult, result[1]); + return graphqlWrappedResult; + }, [Object.create(null), undefined]); } /** * Implements the "Executing selection sets" section of the spec * for fields that may be executed in parallel. */ - -function executeFields(exeContext, parentType, sourceValue, path, fields) { +function executeFields(exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap) { const results = Object.create(null); + const graphqlWrappedResult = [results, undefined]; let containsPromise = false; try { - for (const [responseName, fieldNodes] of fields.entries()) { + for (const [responseName, fieldGroup] of groupedFieldSet) { const fieldPath = (0, _Path.addPath)(path, responseName, parentType.name); - const result = executeField(exeContext, parentType, sourceValue, fieldNodes, fieldPath); + const result = executeField(exeContext, parentType, sourceValue, fieldGroup, fieldPath, incrementalContext, deferMap); if (result !== undefined) { - results[responseName] = result; if ((0, _isPromise.isPromise)(result)) { + results[responseName] = result.then(resolved => { + addIncrementalDataRecords(graphqlWrappedResult, resolved[1]); + return resolved[0]; + }); containsPromise = true; + } else { + results[responseName] = result[0]; + addIncrementalDataRecords(graphqlWrappedResult, result[1]); } } } } catch (error) { if (containsPromise) { // Ensure that any promises returned by other fields are handled, as they may also reject. - return (0, _promiseForObject.promiseForObject)(results).finally(() => { + return (0, _promiseForObject.promiseForObject)(results, () => { + /* noop */ + }).finally(() => { throw error; }); } throw error; - } // If there are no promises, we can just return the object - + } + // If there are no promises, we can just return the object and any incrementalDataRecords if (!containsPromise) { - return results; - } // Otherwise, results is a map from field name to the result of resolving that + return graphqlWrappedResult; + } + // Otherwise, results is a map from field name to the result of resolving that // field, which is possibly a promise. Return a promise that will return this // same map, but with any promises replaced with the values they resolved to. - - return (0, _promiseForObject.promiseForObject)(results); + return (0, _promiseForObject.promiseForObject)(results, resolved => [resolved, graphqlWrappedResult[1]]); +} +function toNodes(fieldGroup) { + return fieldGroup.map(fieldDetails => fieldDetails.node); } /** * Implements the "Executing fields" section of the spec @@ -23569,51 +24407,49 @@ function executeFields(exeContext, parentType, sourceValue, path, fields) { * calling its resolve function, then calls completeValue to complete promises, * serialize scalars, or execute the sub-selection-set for objects. */ - -function executeField(exeContext, parentType, source, fieldNodes, path) { +function executeField(exeContext, parentType, source, fieldGroup, path, incrementalContext, deferMap) { var _fieldDef$resolve; - const fieldDef = getFieldDef(exeContext.schema, parentType, fieldNodes[0]); + const fieldName = fieldGroup[0].node.name.value; + const fieldDef = exeContext.schema.getField(parentType, fieldName); if (!fieldDef) { return; } const returnType = fieldDef.type; const resolveFn = (_fieldDef$resolve = fieldDef.resolve) !== null && _fieldDef$resolve !== void 0 ? _fieldDef$resolve : exeContext.fieldResolver; - const info = buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path); // Get the resolve function, regardless of if its result is normal or abrupt (error). - + const info = buildResolveInfo(exeContext, fieldDef, toNodes(fieldGroup), parentType, path); + // Get the resolve function, regardless of if its result is normal or abrupt (error). try { // Build a JS object of arguments from the field.arguments AST, using the // variables scope to fulfill any variable references. // TODO: find a way to memoize, in case this field is within a List type. - const args = (0, _values.getArgumentValues)(fieldDef, fieldNodes[0], exeContext.variableValues); // The resolve function's optional third argument is a context value that + const args = (0, _values.getArgumentValues)(fieldDef, fieldGroup[0].node, exeContext.variableValues); + // The resolve function's optional third argument is a context value that // is provided to every resolve function within an execution. It is commonly // used to represent an authenticated user, or request-specific caches. - const contextValue = exeContext.contextValue; const result = resolveFn(source, args, contextValue, info); - let completed; if ((0, _isPromise.isPromise)(result)) { - completed = result.then(resolved => completeValue(exeContext, returnType, fieldNodes, info, path, resolved)); - } else { - completed = completeValue(exeContext, returnType, fieldNodes, info, path, result); + return completePromisedValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); } + const completed = completeValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); if ((0, _isPromise.isPromise)(completed)) { // Note: we don't rely on a `catch` method, but we do expect "thenable" // to take a second callback for the error case. return completed.then(undefined, rawError => { - const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(path)); - return handleFieldError(error, returnType, exeContext); + handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); + return [null, undefined]; }); } return completed; } catch (rawError) { - const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(path)); - return handleFieldError(error, returnType, exeContext); + handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); + return [null, undefined]; } } /** + * TODO: consider no longer exporting this function * @internal */ - function buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path) { // The resolve function's optional fourth argument is a collection of // information about the current execution state. @@ -23630,16 +24466,22 @@ function buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path) { variableValues: exeContext.variableValues }; } -function handleFieldError(error, returnType, exeContext) { +function handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext) { + const error = (0, _locatedError.locatedError)(rawError, toNodes(fieldGroup), (0, _Path.pathToArray)(path)); // If the field type is non-nullable, then it is resolved without any // protection from errors, however it still properly locates the error. if ((0, _definition.isNonNullType)(returnType)) { throw error; - } // Otherwise, error protection is applied, logging the error and resolving + } + // Otherwise, error protection is applied, logging the error and resolving // a null value for this field if one is encountered. - - exeContext.errors.push(error); - return null; + const context = incrementalContext !== null && incrementalContext !== void 0 ? incrementalContext : exeContext; + let errors = context.errors; + if (errors === undefined) { + errors = []; + context.errors = errors; + } + errors.push(error); } /** * Implements the instructions for completeValue as defined in the @@ -23662,122 +24504,300 @@ function handleFieldError(error, returnType, exeContext) { * Otherwise, the field type expects a sub-selection set, and will complete the * value by executing all sub-selections. */ - -function completeValue(exeContext, returnType, fieldNodes, info, path, result) { +function completeValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { // If result is an Error, throw a located error. if (result instanceof Error) { throw result; - } // If field type is NonNull, complete for inner type, and throw field error + } + // If field type is NonNull, complete for inner type, and throw field error // if result is null. - if ((0, _definition.isNonNullType)(returnType)) { - const completed = completeValue(exeContext, returnType.ofType, fieldNodes, info, path, result); - if (completed === null) { + const completed = completeValue(exeContext, returnType.ofType, fieldGroup, info, path, result, incrementalContext, deferMap); + if (completed[0] === null) { throw new Error(`Cannot return null for non-nullable field ${info.parentType.name}.${info.fieldName}.`); } return completed; - } // If result value is null or undefined then return null. - + } + // If result value is null or undefined then return null. if (result == null) { - return null; - } // If field type is List, complete each item in the list with the inner type - + return [null, undefined]; + } + // If field type is List, complete each item in the list with the inner type if ((0, _definition.isListType)(returnType)) { - return completeListValue(exeContext, returnType, fieldNodes, info, path, result); - } // If field type is a leaf type, Scalar or Enum, serialize to a valid value, + return completeListValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); + } + // If field type is a leaf type, Scalar or Enum, serialize to a valid value, // returning null if serialization is not possible. - if ((0, _definition.isLeafType)(returnType)) { - return completeLeafValue(returnType, result); - } // If field type is an abstract type, Interface or Union, determine the + return [completeLeafValue(returnType, result), undefined]; + } + // If field type is an abstract type, Interface or Union, determine the // runtime Object type and complete for that type. - if ((0, _definition.isAbstractType)(returnType)) { - return completeAbstractValue(exeContext, returnType, fieldNodes, info, path, result); - } // If field type is Object, execute and complete all sub-selections. - + return completeAbstractValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); + } + // If field type is Object, execute and complete all sub-selections. if ((0, _definition.isObjectType)(returnType)) { - return completeObjectValue(exeContext, returnType, fieldNodes, info, path, result); + return completeObjectValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); } /* c8 ignore next 6 */ // Not reachable, all possible output types have been considered. - false || (0, _invariant.invariant)(false, 'Cannot complete value of unexpected output type: ' + (0, _inspect.inspect)(returnType)); } +async function completePromisedValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { + try { + const resolved = await result; + let completed = completeValue(exeContext, returnType, fieldGroup, info, path, resolved, incrementalContext, deferMap); + if ((0, _isPromise.isPromise)(completed)) { + completed = await completed; + } + return completed; + } catch (rawError) { + handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); + return [null, undefined]; + } +} +/** + * Returns an object containing info for streaming if a field should be + * streamed based on the experimental flag, stream directive present and + * not disabled by the "if" argument. + */ +function getStreamUsage(exeContext, fieldGroup, path) { + // do not stream inner lists of multi-dimensional lists + if (typeof path.key === 'number') { + return; + } + // TODO: add test for this case (a streamed list nested under a list). + /* c8 ignore next 7 */ + if (fieldGroup._streamUsage !== undefined) { + return fieldGroup._streamUsage; + } + // validation only allows equivalent streams on multiple fields, so it is + // safe to only check the first fieldNode for the stream directive + const stream = (0, _values.getDirectiveValues)(_directives.GraphQLStreamDirective, fieldGroup[0].node, exeContext.variableValues); + if (!stream) { + return; + } + if (stream.if === false) { + return; + } + typeof stream.initialCount === 'number' || (0, _invariant.invariant)(false, 'initialCount must be a number'); + stream.initialCount >= 0 || (0, _invariant.invariant)(false, 'initialCount must be a positive integer'); + exeContext.operation.operation !== _ast.OperationTypeNode.SUBSCRIPTION || (0, _invariant.invariant)(false, '`@stream` directive not supported on subscription operations. Disable `@stream` by setting the `if` argument to `false`.'); + const streamedFieldGroup = fieldGroup.map(fieldDetails => ({ + node: fieldDetails.node, + deferUsage: undefined + })); + const streamUsage = { + initialCount: stream.initialCount, + label: typeof stream.label === 'string' ? stream.label : undefined, + fieldGroup: streamedFieldGroup + }; + fieldGroup._streamUsage = streamUsage; + return streamUsage; +} +/** + * Complete a async iterator value by completing the result and calling + * recursively until all the results are completed. + */ +async function completeAsyncIteratorValue(exeContext, itemType, fieldGroup, info, path, asyncIterator, incrementalContext, deferMap) { + let containsPromise = false; + const completedResults = []; + const graphqlWrappedResult = [completedResults, undefined]; + let index = 0; + const streamUsage = getStreamUsage(exeContext, fieldGroup, path); + const earlyReturn = asyncIterator.return === undefined ? undefined : asyncIterator.return.bind(asyncIterator); + try { + // eslint-disable-next-line no-constant-condition + while (true) { + if (streamUsage && index >= streamUsage.initialCount) { + const streamItemQueue = buildAsyncStreamItemQueue(index, path, asyncIterator, exeContext, streamUsage.fieldGroup, info, itemType); + let streamRecord; + if (earlyReturn === undefined) { + streamRecord = { + label: streamUsage.label, + path, + streamItemQueue + }; + } else { + streamRecord = { + label: streamUsage.label, + path, + earlyReturn, + streamItemQueue + }; + if (exeContext.cancellableStreams === undefined) { + exeContext.cancellableStreams = new Set(); + } + exeContext.cancellableStreams.add(streamRecord); + } + addIncrementalDataRecords(graphqlWrappedResult, [streamRecord]); + break; + } + const itemPath = (0, _Path.addPath)(path, index, undefined); + let iteration; + try { + // eslint-disable-next-line no-await-in-loop + iteration = await asyncIterator.next(); + } catch (rawError) { + throw (0, _locatedError.locatedError)(rawError, toNodes(fieldGroup), (0, _Path.pathToArray)(path)); + } + // TODO: add test case for stream returning done before initialCount + /* c8 ignore next 3 */ + if (iteration.done) { + break; + } + const item = iteration.value; + // TODO: add tests for stream backed by asyncIterator that returns a promise + /* c8 ignore start */ + if ((0, _isPromise.isPromise)(item)) { + completedResults.push(completePromisedListItemValue(item, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap)); + containsPromise = true; + } else if ( /* c8 ignore stop */ + completeListItemValue(item, completedResults, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap) + // TODO: add tests for stream backed by asyncIterator that completes to a promise + /* c8 ignore start */) { + containsPromise = true; + } + /* c8 ignore stop */ + index++; + } + } catch (error) { + if (earlyReturn !== undefined) { + earlyReturn().catch(() => { + /* c8 ignore next 1 */ + // ignore error + }); + } + throw error; + } + return containsPromise ? /* c8 ignore start */Promise.all(completedResults).then(resolved => [resolved, graphqlWrappedResult[1]]) : /* c8 ignore stop */graphqlWrappedResult; +} /** * Complete a list value by completing each item in the list with the * inner type */ - -function completeListValue(exeContext, returnType, fieldNodes, info, path, result) { +function completeListValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { + const itemType = returnType.ofType; + if ((0, _isAsyncIterable.isAsyncIterable)(result)) { + const asyncIterator = result[Symbol.asyncIterator](); + return completeAsyncIteratorValue(exeContext, itemType, fieldGroup, info, path, asyncIterator, incrementalContext, deferMap); + } if (!(0, _isIterableObject.isIterableObject)(result)) { throw new _GraphQLError.GraphQLError(`Expected Iterable, but did not find one for field "${info.parentType.name}.${info.fieldName}".`); - } // This is specified as a simple map, however we're optimizing the path + } + return completeIterableValue(exeContext, itemType, fieldGroup, info, path, result, incrementalContext, deferMap); +} +function completeIterableValue(exeContext, itemType, fieldGroup, info, path, items, incrementalContext, deferMap) { + // This is specified as a simple map, however we're optimizing the path // where the list contains no Promises by avoiding creating another Promise. - - const itemType = returnType.ofType; let containsPromise = false; - const completedResults = Array.from(result, (item, index) => { + const completedResults = []; + const graphqlWrappedResult = [completedResults, undefined]; + let index = 0; + const streamUsage = getStreamUsage(exeContext, fieldGroup, path); + const iterator = items[Symbol.iterator](); + let iteration = iterator.next(); + while (!iteration.done) { + const item = iteration.value; + if (streamUsage && index >= streamUsage.initialCount) { + const syncStreamRecord = { + label: streamUsage.label, + path, + streamItemQueue: buildSyncStreamItemQueue(item, index, path, iterator, exeContext, streamUsage.fieldGroup, info, itemType) + }; + addIncrementalDataRecords(graphqlWrappedResult, [syncStreamRecord]); + break; + } // No need to modify the info object containing the path, // since from here on it is not ever accessed by resolver functions. const itemPath = (0, _Path.addPath)(path, index, undefined); - try { - let completedItem; - if ((0, _isPromise.isPromise)(item)) { - completedItem = item.then(resolved => completeValue(exeContext, itemType, fieldNodes, info, itemPath, resolved)); - } else { - completedItem = completeValue(exeContext, itemType, fieldNodes, info, itemPath, item); - } - if ((0, _isPromise.isPromise)(completedItem)) { - containsPromise = true; // Note: we don't rely on a `catch` method, but we do expect "thenable" - // to take a second callback for the error case. - - return completedItem.then(undefined, rawError => { - const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(itemPath)); - return handleFieldError(error, itemType, exeContext); - }); - } - return completedItem; - } catch (rawError) { - const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(itemPath)); - return handleFieldError(error, itemType, exeContext); + if ((0, _isPromise.isPromise)(item)) { + completedResults.push(completePromisedListItemValue(item, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap)); + containsPromise = true; + } else if (completeListItemValue(item, completedResults, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap)) { + containsPromise = true; } - }); - return containsPromise ? Promise.all(completedResults) : completedResults; + index++; + iteration = iterator.next(); + } + return containsPromise ? Promise.all(completedResults).then(resolved => [resolved, graphqlWrappedResult[1]]) : graphqlWrappedResult; } /** - * Complete a Scalar or Enum by serializing to a valid value, returning - * null if serialization is not possible. + * Complete a list item value by adding it to the completed results. + * + * Returns true if the value is a Promise. */ - -function completeLeafValue(returnType, result) { - const serializedResult = returnType.serialize(result); - if (serializedResult == null) { - throw new Error(`Expected \`${(0, _inspect.inspect)(returnType)}.serialize(${(0, _inspect.inspect)(result)})\` to ` + `return non-nullable value, returned: ${(0, _inspect.inspect)(serializedResult)}`); - } +function completeListItemValue(item, completedResults, parent, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap) { + try { + const completedItem = completeValue(exeContext, itemType, fieldGroup, info, itemPath, item, incrementalContext, deferMap); + if ((0, _isPromise.isPromise)(completedItem)) { + // Note: we don't rely on a `catch` method, but we do expect "thenable" + // to take a second callback for the error case. + completedResults.push(completedItem.then(resolved => { + addIncrementalDataRecords(parent, resolved[1]); + return resolved[0]; + }, rawError => { + handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); + return null; + })); + return true; + } + completedResults.push(completedItem[0]); + addIncrementalDataRecords(parent, completedItem[1]); + } catch (rawError) { + handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); + completedResults.push(null); + } + return false; +} +async function completePromisedListItemValue(item, parent, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap) { + try { + const resolved = await item; + let completed = completeValue(exeContext, itemType, fieldGroup, info, itemPath, resolved, incrementalContext, deferMap); + if ((0, _isPromise.isPromise)(completed)) { + completed = await completed; + } + addIncrementalDataRecords(parent, completed[1]); + return completed[0]; + } catch (rawError) { + handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); + return null; + } +} +/** + * Complete a Scalar or Enum by serializing to a valid value, returning + * null if serialization is not possible. + */ +function completeLeafValue(returnType, result) { + const serializedResult = returnType.serialize(result); + if (serializedResult == null) { + throw new Error(`Expected \`${(0, _inspect.inspect)(returnType)}.serialize(${(0, _inspect.inspect)(result)})\` to ` + `return non-nullable value, returned: ${(0, _inspect.inspect)(serializedResult)}`); + } return serializedResult; } /** * Complete a value of an abstract type by determining the runtime object type * of that value, then complete the value for that type. */ - -function completeAbstractValue(exeContext, returnType, fieldNodes, info, path, result) { +function completeAbstractValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { var _returnType$resolveTy; const resolveTypeFn = (_returnType$resolveTy = returnType.resolveType) !== null && _returnType$resolveTy !== void 0 ? _returnType$resolveTy : exeContext.typeResolver; const contextValue = exeContext.contextValue; const runtimeType = resolveTypeFn(result, contextValue, info, returnType); if ((0, _isPromise.isPromise)(runtimeType)) { - return runtimeType.then(resolvedRuntimeType => completeObjectValue(exeContext, ensureValidRuntimeType(resolvedRuntimeType, exeContext, returnType, fieldNodes, info, result), fieldNodes, info, path, result)); + return runtimeType.then(resolvedRuntimeType => completeObjectValue(exeContext, ensureValidRuntimeType(resolvedRuntimeType, exeContext, returnType, fieldGroup, info, result), fieldGroup, info, path, result, incrementalContext, deferMap)); } - return completeObjectValue(exeContext, ensureValidRuntimeType(runtimeType, exeContext, returnType, fieldNodes, info, result), fieldNodes, info, path, result); + return completeObjectValue(exeContext, ensureValidRuntimeType(runtimeType, exeContext, returnType, fieldGroup, info, result), fieldGroup, info, path, result, incrementalContext, deferMap); } -function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldNodes, info, result) { +function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldGroup, info, result) { if (runtimeTypeName == null) { - throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" must resolve to an Object type at runtime for field "${info.parentType.name}.${info.fieldName}". Either the "${returnType.name}" type should provide a "resolveType" function or each possible type should provide an "isTypeOf" function.`, fieldNodes); - } // releases before 16.0.0 supported returning `GraphQLObjectType` from `resolveType` + throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" must resolve to an Object type at runtime for field "${info.parentType.name}.${info.fieldName}". Either the "${returnType.name}" type should provide a "resolveType" function or each possible type should provide an "isTypeOf" function.`, { + nodes: toNodes(fieldGroup) + }); + } + // releases before 16.0.0 supported returning `GraphQLObjectType` from `resolveType` // TODO: remove in 17.0.0 release - if ((0, _definition.isObjectType)(runtimeTypeName)) { throw new _GraphQLError.GraphQLError('Support for returning GraphQLObjectType from resolveType was removed in graphql-js@16.0.0 please return type name instead.'); } @@ -23787,17 +24807,17 @@ function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldNo const runtimeType = exeContext.schema.getType(runtimeTypeName); if (runtimeType == null) { throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" was resolved to a type "${runtimeTypeName}" that does not exist inside the schema.`, { - nodes: fieldNodes + nodes: toNodes(fieldGroup) }); } if (!(0, _definition.isObjectType)(runtimeType)) { throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" was resolved to a non-object type "${runtimeTypeName}".`, { - nodes: fieldNodes + nodes: toNodes(fieldGroup) }); } if (!exeContext.schema.isSubType(returnType, runtimeType)) { throw new _GraphQLError.GraphQLError(`Runtime Object type "${runtimeType.name}" is not a possible type for "${returnType.name}".`, { - nodes: fieldNodes + nodes: toNodes(fieldGroup) }); } return runtimeType; @@ -23805,34 +24825,92 @@ function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldNo /** * Complete an Object value by executing all sub-selections. */ - -function completeObjectValue(exeContext, returnType, fieldNodes, info, path, result) { - // Collect sub-fields to execute to complete this value. - const subFieldNodes = collectSubfields(exeContext, returnType, fieldNodes); // If there is an isTypeOf predicate function, call it with the +function completeObjectValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { + // If there is an isTypeOf predicate function, call it with the // current result. If isTypeOf returns false, then raise an error rather // than continuing execution. - if (returnType.isTypeOf) { const isTypeOf = returnType.isTypeOf(result, exeContext.contextValue, info); if ((0, _isPromise.isPromise)(isTypeOf)) { return isTypeOf.then(resolvedIsTypeOf => { if (!resolvedIsTypeOf) { - throw invalidReturnTypeError(returnType, result, fieldNodes); + throw invalidReturnTypeError(returnType, result, fieldGroup); } - return executeFields(exeContext, returnType, result, path, subFieldNodes); + return collectAndExecuteSubfields(exeContext, returnType, fieldGroup, path, result, incrementalContext, deferMap); }); } if (!isTypeOf) { - throw invalidReturnTypeError(returnType, result, fieldNodes); + throw invalidReturnTypeError(returnType, result, fieldGroup); } } - return executeFields(exeContext, returnType, result, path, subFieldNodes); + return collectAndExecuteSubfields(exeContext, returnType, fieldGroup, path, result, incrementalContext, deferMap); } -function invalidReturnTypeError(returnType, result, fieldNodes) { +function invalidReturnTypeError(returnType, result, fieldGroup) { return new _GraphQLError.GraphQLError(`Expected value of type "${returnType.name}" but got: ${(0, _inspect.inspect)(result)}.`, { - nodes: fieldNodes + nodes: toNodes(fieldGroup) }); } +/** + * Instantiates new DeferredFragmentRecords for the given path within an + * incremental data record, returning an updated map of DeferUsage + * objects to DeferredFragmentRecords. + * + * Note: As defer directives may be used with operations returning lists, + * a DeferUsage object may correspond to many DeferredFragmentRecords. + * + * DeferredFragmentRecord creation includes the following steps: + * 1. The new DeferredFragmentRecord is instantiated at the given path. + * 2. The parent result record is calculated from the given incremental data + * record. + * 3. The IncrementalPublisher is notified that a new DeferredFragmentRecord + * with the calculated parent has been added; the record will be released only + * after the parent has completed. + * + */ +function addNewDeferredFragments(newDeferUsages, newDeferMap, path) { + // For each new deferUsage object: + for (const newDeferUsage of newDeferUsages) { + const parentDeferUsage = newDeferUsage.parentDeferUsage; + const parent = parentDeferUsage === undefined ? undefined : deferredFragmentRecordFromDeferUsage(parentDeferUsage, newDeferMap); + // Instantiate the new record. + const deferredFragmentRecord = new _types.DeferredFragmentRecord(path, newDeferUsage.label, parent); + // Update the map. + newDeferMap.set(newDeferUsage, deferredFragmentRecord); + } + return newDeferMap; +} +function deferredFragmentRecordFromDeferUsage(deferUsage, deferMap) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return deferMap.get(deferUsage); +} +function collectAndExecuteSubfields(exeContext, returnType, fieldGroup, path, result, incrementalContext, deferMap) { + // Collect sub-fields to execute to complete this value. + const collectedSubfields = collectSubfields(exeContext, returnType, fieldGroup); + let groupedFieldSet = collectedSubfields.groupedFieldSet; + const newDeferUsages = collectedSubfields.newDeferUsages; + if (deferMap === undefined && newDeferUsages.length === 0) { + return executeFields(exeContext, returnType, result, path, groupedFieldSet, incrementalContext, undefined); + } + const subExecutionPlan = buildSubExecutionPlan(groupedFieldSet, incrementalContext === null || incrementalContext === void 0 ? void 0 : incrementalContext.deferUsageSet); + groupedFieldSet = subExecutionPlan.groupedFieldSet; + const newGroupedFieldSets = subExecutionPlan.newGroupedFieldSets; + const newDeferMap = addNewDeferredFragments(newDeferUsages, new Map(deferMap), path); + const subFields = executeFields(exeContext, returnType, result, path, groupedFieldSet, incrementalContext, newDeferMap); + if (newGroupedFieldSets.size > 0) { + const newPendingExecutionGroups = collectExecutionGroups(exeContext, returnType, result, path, incrementalContext === null || incrementalContext === void 0 ? void 0 : incrementalContext.deferUsageSet, newGroupedFieldSets, newDeferMap); + return withNewExecutionGroups(subFields, newPendingExecutionGroups); + } + return subFields; +} +function buildSubExecutionPlan(originalGroupedFieldSet, deferUsageSet) { + let executionPlan = originalGroupedFieldSet._executionPlan; + if (executionPlan !== undefined) { + return executionPlan; + } + executionPlan = (0, _buildExecutionPlan.buildExecutionPlan)(originalGroupedFieldSet, deferUsageSet); + originalGroupedFieldSet._executionPlan = executionPlan; + return executionPlan; +} /** * If a resolveType function is not given, then a default resolve behavior is * used which attempts two strategies: @@ -23843,13 +24921,12 @@ function invalidReturnTypeError(returnType, result, fieldNodes) { * Otherwise, test each possible type for the abstract type by calling * isTypeOf for the object being coerced, returning the first type that matches. */ - const defaultTypeResolver = function (value, contextValue, info, abstractType) { // First, look for `__typename`. if ((0, _isObjectLike.isObjectLike)(value) && typeof value.__typename === 'string') { return value.__typename; - } // Otherwise, test each possible type. - + } + // Otherwise, test each possible type. const possibleTypes = info.schema.getPossibleTypes(abstractType); const promisedIsTypeOfResults = []; for (let i = 0; i < possibleTypes.length; i++) { @@ -23891,27 +24968,340 @@ const defaultFieldResolver = function (source, args, contextValue, info) { } }; /** - * This method looks up the field on the given type definition. - * It has special casing for the three introspection fields, - * __schema, __type and __typename. __typename is special because - * it can always be queried as a field, even in situations where no - * other fields are allowed, like on a Union. __schema and __type - * could get automatically added to the query type, but that would - * require mutating type definitions, which would cause issues. + * Implements the "Subscribe" algorithm described in the GraphQL specification. * - * @internal + * Returns a Promise which resolves to either an AsyncIterator (if successful) + * or an ExecutionResult (error). The promise will be rejected if the schema or + * other arguments to this function are invalid, or if the resolved event stream + * is not an async iterable. + * + * If the client-provided arguments to this function do not result in a + * compliant subscription, a GraphQL Response (ExecutionResult) with descriptive + * errors and no data will be returned. + * + * If the source stream could not be created due to faulty subscription resolver + * logic or underlying systems, the promise will resolve to a single + * ExecutionResult containing `errors` and no `data`. + * + * If the operation succeeded, the promise resolves to an AsyncIterator, which + * yields a stream of ExecutionResults representing the response stream. + * + * This function does not support incremental delivery (`@defer` and `@stream`). + * If an operation which would defer or stream data is executed with this + * function, a field error will be raised at the location of the `@defer` or + * `@stream` directive. + * + * Accepts an object with named arguments. */ exports.defaultFieldResolver = defaultFieldResolver; -function getFieldDef(schema, parentType, fieldNode) { - const fieldName = fieldNode.name.value; - if (fieldName === _introspection.SchemaMetaFieldDef.name && schema.getQueryType() === parentType) { - return _introspection.SchemaMetaFieldDef; - } else if (fieldName === _introspection.TypeMetaFieldDef.name && schema.getQueryType() === parentType) { - return _introspection.TypeMetaFieldDef; - } else if (fieldName === _introspection.TypeNameMetaFieldDef.name) { - return _introspection.TypeNameMetaFieldDef; +function subscribe(args) { + // If a valid execution context cannot be created due to incorrect arguments, + // a "Response" with only errors is returned. + const exeContext = buildExecutionContext(args); + // Return early errors if execution context failed. + if (!('schema' in exeContext)) { + return { + errors: exeContext + }; + } + const resultOrStream = createSourceEventStreamImpl(exeContext); + if ((0, _isPromise.isPromise)(resultOrStream)) { + return resultOrStream.then(resolvedResultOrStream => mapSourceToResponse(exeContext, resolvedResultOrStream)); + } + return mapSourceToResponse(exeContext, resultOrStream); +} +function mapSourceToResponse(exeContext, resultOrStream) { + if (!(0, _isAsyncIterable.isAsyncIterable)(resultOrStream)) { + return resultOrStream; + } + // For each payload yielded from a subscription, map it over the normal + // GraphQL `execute` function, with `payload` as the rootValue. + // This implements the "MapSourceToResponseEvent" algorithm described in + // the GraphQL specification. The `execute` function provides the + // "ExecuteSubscriptionEvent" algorithm, as it is nearly identical to the + // "ExecuteQuery" algorithm, for which `execute` is also used. + return (0, _mapAsyncIterable.mapAsyncIterable)(resultOrStream, payload => executeOperation(buildPerEventExecutionContext(exeContext, payload))); +} +/** + * Implements the "CreateSourceEventStream" algorithm described in the + * GraphQL specification, resolving the subscription source event stream. + * + * Returns a Promise which resolves to either an AsyncIterable (if successful) + * or an ExecutionResult (error). The promise will be rejected if the schema or + * other arguments to this function are invalid, or if the resolved event stream + * is not an async iterable. + * + * If the client-provided arguments to this function do not result in a + * compliant subscription, a GraphQL Response (ExecutionResult) with + * descriptive errors and no data will be returned. + * + * If the the source stream could not be created due to faulty subscription + * resolver logic or underlying systems, the promise will resolve to a single + * ExecutionResult containing `errors` and no `data`. + * + * If the operation succeeded, the promise resolves to the AsyncIterable for the + * event stream returned by the resolver. + * + * A Source Event Stream represents a sequence of events, each of which triggers + * a GraphQL execution for that event. + * + * This may be useful when hosting the stateful subscription service in a + * different process or machine than the stateless GraphQL execution engine, + * or otherwise separating these two steps. For more on this, see the + * "Supporting Subscriptions at Scale" information in the GraphQL specification. + */ +function createSourceEventStream(args) { + // If a valid execution context cannot be created due to incorrect arguments, + // a "Response" with only errors is returned. + const exeContext = buildExecutionContext(args); + // Return early errors if execution context failed. + if (!('schema' in exeContext)) { + return { + errors: exeContext + }; } - return parentType.getFields()[fieldName]; + return createSourceEventStreamImpl(exeContext); +} +function createSourceEventStreamImpl(exeContext) { + try { + const eventStream = executeSubscription(exeContext); + if ((0, _isPromise.isPromise)(eventStream)) { + return eventStream.then(undefined, error => ({ + errors: [error] + })); + } + return eventStream; + } catch (error) { + return { + errors: [error] + }; + } +} +function executeSubscription(exeContext) { + const { + schema, + fragments, + operation, + variableValues, + rootValue + } = exeContext; + const rootType = schema.getSubscriptionType(); + if (rootType == null) { + throw new _GraphQLError.GraphQLError('Schema is not configured to execute subscription operation.', { + nodes: operation + }); + } + const { + groupedFieldSet + } = (0, _collectFields.collectFields)(schema, fragments, variableValues, rootType, operation); + const firstRootField = groupedFieldSet.entries().next().value; + const [responseName, fieldGroup] = firstRootField; + const fieldName = fieldGroup[0].node.name.value; + const fieldDef = schema.getField(rootType, fieldName); + const fieldNodes = fieldGroup.map(fieldDetails => fieldDetails.node); + if (!fieldDef) { + throw new _GraphQLError.GraphQLError(`The subscription field "${fieldName}" is not defined.`, { + nodes: fieldNodes + }); + } + const path = (0, _Path.addPath)(undefined, responseName, rootType.name); + const info = buildResolveInfo(exeContext, fieldDef, fieldNodes, rootType, path); + try { + var _fieldDef$subscribe; + // Implements the "ResolveFieldEventStream" algorithm from GraphQL specification. + // It differs from "ResolveFieldValue" due to providing a different `resolveFn`. + // Build a JS object of arguments from the field.arguments AST, using the + // variables scope to fulfill any variable references. + const args = (0, _values.getArgumentValues)(fieldDef, fieldNodes[0], variableValues); + // The resolve function's optional third argument is a context value that + // is provided to every resolve function within an execution. It is commonly + // used to represent an authenticated user, or request-specific caches. + const contextValue = exeContext.contextValue; + // Call the `subscribe()` resolver or the default resolver to produce an + // AsyncIterable yielding raw payloads. + const resolveFn = (_fieldDef$subscribe = fieldDef.subscribe) !== null && _fieldDef$subscribe !== void 0 ? _fieldDef$subscribe : exeContext.subscribeFieldResolver; + const result = resolveFn(rootValue, args, contextValue, info); + if ((0, _isPromise.isPromise)(result)) { + return result.then(assertEventStream).then(undefined, error => { + throw (0, _locatedError.locatedError)(error, fieldNodes, (0, _Path.pathToArray)(path)); + }); + } + return assertEventStream(result); + } catch (error) { + throw (0, _locatedError.locatedError)(error, fieldNodes, (0, _Path.pathToArray)(path)); + } +} +function assertEventStream(result) { + if (result instanceof Error) { + throw result; + } + // Assert field returned an event stream, otherwise yield an error. + if (!(0, _isAsyncIterable.isAsyncIterable)(result)) { + throw new _GraphQLError.GraphQLError('Subscription field must return Async Iterable. ' + `Received: ${(0, _inspect.inspect)(result)}.`); + } + return result; +} +function collectExecutionGroups(exeContext, parentType, sourceValue, path, parentDeferUsages, newGroupedFieldSets, deferMap) { + const newPendingExecutionGroups = []; + for (const [deferUsageSet, groupedFieldSet] of newGroupedFieldSets) { + const deferredFragmentRecords = getDeferredFragmentRecords(deferUsageSet, deferMap); + const pendingExecutionGroup = { + deferredFragmentRecords, + result: undefined + }; + const executor = () => executeExecutionGroup(pendingExecutionGroup, exeContext, parentType, sourceValue, path, groupedFieldSet, { + errors: undefined, + deferUsageSet + }, deferMap); + if (exeContext.enableEarlyExecution) { + pendingExecutionGroup.result = new _BoxedPromiseOrValue.BoxedPromiseOrValue(shouldDefer(parentDeferUsages, deferUsageSet) ? Promise.resolve().then(executor) : executor()); + } else { + pendingExecutionGroup.result = () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor()); + } + newPendingExecutionGroups.push(pendingExecutionGroup); + } + return newPendingExecutionGroups; +} +function shouldDefer(parentDeferUsages, deferUsages) { + // If we have a new child defer usage, defer. + // Otherwise, this defer usage was already deferred when it was initially + // encountered, and is now in the midst of executing early, so the new + // deferred grouped fields set can be executed immediately. + return parentDeferUsages === undefined || !Array.from(deferUsages).every(deferUsage => parentDeferUsages.has(deferUsage)); +} +function executeExecutionGroup(pendingExecutionGroup, exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap) { + let result; + try { + result = executeFields(exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap); + } catch (error) { + return { + pendingExecutionGroup, + path: (0, _Path.pathToArray)(path), + errors: withError(incrementalContext.errors, error) + }; + } + if ((0, _isPromise.isPromise)(result)) { + return result.then(resolved => buildCompletedExecutionGroup(incrementalContext.errors, pendingExecutionGroup, path, resolved), error => ({ + pendingExecutionGroup, + path: (0, _Path.pathToArray)(path), + errors: withError(incrementalContext.errors, error) + })); + } + return buildCompletedExecutionGroup(incrementalContext.errors, pendingExecutionGroup, path, result); +} +function buildCompletedExecutionGroup(errors, pendingExecutionGroup, path, result) { + return { + pendingExecutionGroup, + path: (0, _Path.pathToArray)(path), + result: errors === undefined ? { + data: result[0] + } : { + data: result[0], + errors + }, + incrementalDataRecords: result[1] + }; +} +function getDeferredFragmentRecords(deferUsages, deferMap) { + return Array.from(deferUsages).map(deferUsage => deferredFragmentRecordFromDeferUsage(deferUsage, deferMap)); +} +function buildSyncStreamItemQueue(initialItem, initialIndex, streamPath, iterator, exeContext, fieldGroup, info, itemType) { + const streamItemQueue = []; + const enableEarlyExecution = exeContext.enableEarlyExecution; + const firstExecutor = () => { + const initialPath = (0, _Path.addPath)(streamPath, initialIndex, undefined); + const firstStreamItem = new _BoxedPromiseOrValue.BoxedPromiseOrValue(completeStreamItem(initialPath, initialItem, exeContext, { + errors: undefined + }, fieldGroup, info, itemType)); + let iteration = iterator.next(); + let currentIndex = initialIndex + 1; + let currentStreamItem = firstStreamItem; + while (!iteration.done) { + // TODO: add test case for early sync termination + /* c8 ignore next 6 */ + if (currentStreamItem instanceof _BoxedPromiseOrValue.BoxedPromiseOrValue) { + const result = currentStreamItem.value; + if (!(0, _isPromise.isPromise)(result) && result.errors !== undefined) { + break; + } + } + const itemPath = (0, _Path.addPath)(streamPath, currentIndex, undefined); + const value = iteration.value; + const currentExecutor = () => completeStreamItem(itemPath, value, exeContext, { + errors: undefined + }, fieldGroup, info, itemType); + currentStreamItem = enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(currentExecutor()) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(currentExecutor()); + streamItemQueue.push(currentStreamItem); + iteration = iterator.next(); + currentIndex = initialIndex + 1; + } + streamItemQueue.push(new _BoxedPromiseOrValue.BoxedPromiseOrValue({})); + return firstStreamItem.value; + }; + streamItemQueue.push(enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(Promise.resolve().then(firstExecutor)) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(firstExecutor())); + return streamItemQueue; +} +function buildAsyncStreamItemQueue(initialIndex, streamPath, asyncIterator, exeContext, fieldGroup, info, itemType) { + const streamItemQueue = []; + const executor = () => getNextAsyncStreamItemResult(streamItemQueue, streamPath, initialIndex, asyncIterator, exeContext, fieldGroup, info, itemType); + streamItemQueue.push(exeContext.enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor()) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor())); + return streamItemQueue; +} +async function getNextAsyncStreamItemResult(streamItemQueue, streamPath, index, asyncIterator, exeContext, fieldGroup, info, itemType) { + let iteration; + try { + iteration = await asyncIterator.next(); + } catch (error) { + return { + errors: [(0, _locatedError.locatedError)(error, toNodes(fieldGroup), (0, _Path.pathToArray)(streamPath))] + }; + } + if (iteration.done) { + return {}; + } + const itemPath = (0, _Path.addPath)(streamPath, index, undefined); + const result = completeStreamItem(itemPath, iteration.value, exeContext, { + errors: undefined + }, fieldGroup, info, itemType); + const executor = () => getNextAsyncStreamItemResult(streamItemQueue, streamPath, index + 1, asyncIterator, exeContext, fieldGroup, info, itemType); + streamItemQueue.push(exeContext.enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor()) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor())); + return result; +} +function completeStreamItem(itemPath, item, exeContext, incrementalContext, fieldGroup, info, itemType) { + if ((0, _isPromise.isPromise)(item)) { + return completePromisedValue(exeContext, itemType, fieldGroup, info, itemPath, item, incrementalContext, new Map()).then(resolvedItem => buildStreamItemResult(incrementalContext.errors, resolvedItem), error => ({ + errors: withError(incrementalContext.errors, error) + })); + } + let result; + try { + try { + result = completeValue(exeContext, itemType, fieldGroup, info, itemPath, item, incrementalContext, new Map()); + } catch (rawError) { + handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); + result = [null, undefined]; + } + } catch (error) { + return { + errors: withError(incrementalContext.errors, error) + }; + } + if ((0, _isPromise.isPromise)(result)) { + return result.then(undefined, rawError => { + handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); + return [null, undefined]; + }).then(resolvedItem => buildStreamItemResult(incrementalContext.errors, resolvedItem), error => ({ + errors: withError(incrementalContext.errors, error) + })); + } + return buildStreamItemResult(incrementalContext.errors, result); +} +function buildStreamItemResult(errors, result) { + return { + item: result[0], + errors, + incrementalDataRecords: result[1] + }; } /***/ }), @@ -23930,7 +25320,7 @@ Object.defineProperty(exports, "__esModule", ({ Object.defineProperty(exports, "createSourceEventStream", ({ enumerable: true, get: function () { - return _subscribe.createSourceEventStream; + return _execute.createSourceEventStream; } })); Object.defineProperty(exports, "defaultFieldResolver", ({ @@ -23957,6 +25347,12 @@ Object.defineProperty(exports, "executeSync", ({ return _execute.executeSync; } })); +Object.defineProperty(exports, "experimentalExecuteIncrementally", ({ + enumerable: true, + get: function () { + return _execute.experimentalExecuteIncrementally; + } +})); Object.defineProperty(exports, "getArgumentValues", ({ enumerable: true, get: function () { @@ -23984,19 +25380,18 @@ Object.defineProperty(exports, "responsePathAsArray", ({ Object.defineProperty(exports, "subscribe", ({ enumerable: true, get: function () { - return _subscribe.subscribe; + return _execute.subscribe; } })); var _Path = __webpack_require__(/*! ../jsutils/Path.mjs */ "../../../node_modules/graphql/jsutils/Path.mjs"); var _execute = __webpack_require__(/*! ./execute.mjs */ "../../../node_modules/graphql/execution/execute.mjs"); -var _subscribe = __webpack_require__(/*! ./subscribe.mjs */ "../../../node_modules/graphql/execution/subscribe.mjs"); var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/graphql/execution/values.mjs"); /***/ }), -/***/ "../../../node_modules/graphql/execution/mapAsyncIterator.mjs": +/***/ "../../../node_modules/graphql/execution/mapAsyncIterable.mjs": /*!********************************************************************!*\ - !*** ../../../node_modules/graphql/execution/mapAsyncIterator.mjs ***! + !*** ../../../node_modules/graphql/execution/mapAsyncIterable.mjs ***! \********************************************************************/ /***/ (function(__unused_webpack_module, exports) { @@ -24005,12 +25400,12 @@ var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/gra Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.mapAsyncIterator = mapAsyncIterator; +exports.mapAsyncIterable = mapAsyncIterable; /** * Given an AsyncIterable and a callback function, return an AsyncIterator * which produces values mapped via calling the callback function. */ -function mapAsyncIterator(iterable, callback) { +function mapAsyncIterable(iterable, callback) { const iterator = iterable[Symbol.asyncIterator](); async function mapResult(result) { if (result.done) { @@ -24035,7 +25430,6 @@ function mapAsyncIterator(iterable, callback) { /* c8 ignore stop */ } } - return { async next() { return mapResult(await iterator.next()); @@ -24061,205 +25455,50 @@ function mapAsyncIterator(iterable, callback) { /***/ }), -/***/ "../../../node_modules/graphql/execution/subscribe.mjs": -/*!*************************************************************!*\ - !*** ../../../node_modules/graphql/execution/subscribe.mjs ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ "../../../node_modules/graphql/execution/types.mjs": +/*!*********************************************************!*\ + !*** ../../../node_modules/graphql/execution/types.mjs ***! + \*********************************************************/ +/***/ (function(__unused_webpack_module, exports) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.createSourceEventStream = createSourceEventStream; -exports.subscribe = subscribe; -var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); -var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); -var _isAsyncIterable = __webpack_require__(/*! ../jsutils/isAsyncIterable.mjs */ "../../../node_modules/graphql/jsutils/isAsyncIterable.mjs"); -var _Path = __webpack_require__(/*! ../jsutils/Path.mjs */ "../../../node_modules/graphql/jsutils/Path.mjs"); -var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _locatedError = __webpack_require__(/*! ../error/locatedError.mjs */ "../../../node_modules/graphql/error/locatedError.mjs"); -var _collectFields = __webpack_require__(/*! ./collectFields.mjs */ "../../../node_modules/graphql/execution/collectFields.mjs"); -var _execute = __webpack_require__(/*! ./execute.mjs */ "../../../node_modules/graphql/execution/execute.mjs"); -var _mapAsyncIterator = __webpack_require__(/*! ./mapAsyncIterator.mjs */ "../../../node_modules/graphql/execution/mapAsyncIterator.mjs"); -var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/graphql/execution/values.mjs"); -/** - * Implements the "Subscribe" algorithm described in the GraphQL specification. - * - * Returns a Promise which resolves to either an AsyncIterator (if successful) - * or an ExecutionResult (error). The promise will be rejected if the schema or - * other arguments to this function are invalid, or if the resolved event stream - * is not an async iterable. - * - * If the client-provided arguments to this function do not result in a - * compliant subscription, a GraphQL Response (ExecutionResult) with - * descriptive errors and no data will be returned. - * - * If the source stream could not be created due to faulty subscription - * resolver logic or underlying systems, the promise will resolve to a single - * ExecutionResult containing `errors` and no `data`. - * - * If the operation succeeded, the promise resolves to an AsyncIterator, which - * yields a stream of ExecutionResults representing the response stream. - * - * Accepts either an object with named arguments, or individual arguments. - */ - -async function subscribe(args) { - // Temporary for v15 to v16 migration. Remove in v17 - arguments.length < 2 || (0, _devAssert.devAssert)(false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.'); - const resultOrStream = await createSourceEventStream(args); - if (!(0, _isAsyncIterable.isAsyncIterable)(resultOrStream)) { - return resultOrStream; - } // For each payload yielded from a subscription, map it over the normal - // GraphQL `execute` function, with `payload` as the rootValue. - // This implements the "MapSourceToResponseEvent" algorithm described in - // the GraphQL specification. The `execute` function provides the - // "ExecuteSubscriptionEvent" algorithm, as it is nearly identical to the - // "ExecuteQuery" algorithm, for which `execute` is also used. - - const mapSourceToResponse = payload => (0, _execute.execute)({ - ...args, - rootValue: payload - }); // Map every source value to a ExecutionResult value as described above. - - return (0, _mapAsyncIterator.mapAsyncIterator)(resultOrStream, mapSourceToResponse); +exports.DeferredFragmentRecord = void 0; +exports.isCancellableStreamRecord = isCancellableStreamRecord; +exports.isCompletedExecutionGroup = isCompletedExecutionGroup; +exports.isDeferredFragmentRecord = isDeferredFragmentRecord; +exports.isFailedExecutionGroup = isFailedExecutionGroup; +exports.isPendingExecutionGroup = isPendingExecutionGroup; +function isPendingExecutionGroup(incrementalDataRecord) { + return 'deferredFragmentRecords' in incrementalDataRecord; } -function toNormalizedArgs(args) { - const firstArg = args[0]; - if (firstArg && 'document' in firstArg) { - return firstArg; - } - return { - schema: firstArg, - // FIXME: when underlying TS bug fixed, see https://github.com/microsoft/TypeScript/issues/31613 - document: args[1], - rootValue: args[2], - contextValue: args[3], - variableValues: args[4], - operationName: args[5], - subscribeFieldResolver: args[6] - }; +function isCompletedExecutionGroup(subsequentResult) { + return 'pendingExecutionGroup' in subsequentResult; } -/** - * Implements the "CreateSourceEventStream" algorithm described in the - * GraphQL specification, resolving the subscription source event stream. - * - * Returns a Promise which resolves to either an AsyncIterable (if successful) - * or an ExecutionResult (error). The promise will be rejected if the schema or - * other arguments to this function are invalid, or if the resolved event stream - * is not an async iterable. - * - * If the client-provided arguments to this function do not result in a - * compliant subscription, a GraphQL Response (ExecutionResult) with - * descriptive errors and no data will be returned. - * - * If the the source stream could not be created due to faulty subscription - * resolver logic or underlying systems, the promise will resolve to a single - * ExecutionResult containing `errors` and no `data`. - * - * If the operation succeeded, the promise resolves to the AsyncIterable for the - * event stream returned by the resolver. - * - * A Source Event Stream represents a sequence of events, each of which triggers - * a GraphQL execution for that event. - * - * This may be useful when hosting the stateful subscription service in a - * different process or machine than the stateless GraphQL execution engine, - * or otherwise separating these two steps. For more on this, see the - * "Supporting Subscriptions at Scale" information in the GraphQL specification. - */ - -async function createSourceEventStream() { - for (var _len = arguments.length, rawArgs = new Array(_len), _key = 0; _key < _len; _key++) { - rawArgs[_key] = arguments[_key]; - } - const args = toNormalizedArgs(rawArgs); - const { - schema, - document, - variableValues - } = args; // If arguments are missing or incorrectly typed, this is an internal - // developer mistake which should throw an early error. - - (0, _execute.assertValidExecutionArguments)(schema, document, variableValues); // If a valid execution context cannot be created due to incorrect arguments, - // a "Response" with only errors is returned. - - const exeContext = (0, _execute.buildExecutionContext)(args); // Return early errors if execution context failed. - - if (!('schema' in exeContext)) { - return { - errors: exeContext - }; - } - try { - const eventStream = await executeSubscription(exeContext); // Assert field returned an event stream, otherwise yield an error. - - if (!(0, _isAsyncIterable.isAsyncIterable)(eventStream)) { - throw new Error('Subscription field must return Async Iterable. ' + `Received: ${(0, _inspect.inspect)(eventStream)}.`); - } - return eventStream; - } catch (error) { - // If it GraphQLError, report it as an ExecutionResult, containing only errors and no data. - // Otherwise treat the error as a system-class error and re-throw it. - if (error instanceof _GraphQLError.GraphQLError) { - return { - errors: [error] - }; - } - throw error; - } +function isFailedExecutionGroup(completedExecutionGroup) { + return completedExecutionGroup.errors !== undefined; } -async function executeSubscription(exeContext) { - const { - schema, - fragments, - operation, - variableValues, - rootValue - } = exeContext; - const rootType = schema.getSubscriptionType(); - if (rootType == null) { - throw new _GraphQLError.GraphQLError('Schema is not configured to execute subscription operation.', { - nodes: operation - }); - } - const rootFields = (0, _collectFields.collectFields)(schema, fragments, variableValues, rootType, operation.selectionSet); - const [responseName, fieldNodes] = [...rootFields.entries()][0]; - const fieldDef = (0, _execute.getFieldDef)(schema, rootType, fieldNodes[0]); - if (!fieldDef) { - const fieldName = fieldNodes[0].name.value; - throw new _GraphQLError.GraphQLError(`The subscription field "${fieldName}" is not defined.`, { - nodes: fieldNodes - }); - } - const path = (0, _Path.addPath)(undefined, responseName, rootType.name); - const info = (0, _execute.buildResolveInfo)(exeContext, fieldDef, fieldNodes, rootType, path); - try { - var _fieldDef$subscribe; - - // Implements the "ResolveFieldEventStream" algorithm from GraphQL specification. - // It differs from "ResolveFieldValue" due to providing a different `resolveFn`. - // Build a JS object of arguments from the field.arguments AST, using the - // variables scope to fulfill any variable references. - const args = (0, _values.getArgumentValues)(fieldDef, fieldNodes[0], variableValues); // The resolve function's optional third argument is a context value that - // is provided to every resolve function within an execution. It is commonly - // used to represent an authenticated user, or request-specific caches. - - const contextValue = exeContext.contextValue; // Call the `subscribe()` resolver or the default resolver to produce an - // AsyncIterable yielding raw payloads. - - const resolveFn = (_fieldDef$subscribe = fieldDef.subscribe) !== null && _fieldDef$subscribe !== void 0 ? _fieldDef$subscribe : exeContext.subscribeFieldResolver; - const eventStream = await resolveFn(rootValue, args, contextValue, info); - if (eventStream instanceof Error) { - throw eventStream; - } - return eventStream; - } catch (error) { - throw (0, _locatedError.locatedError)(error, fieldNodes, (0, _Path.pathToArray)(path)); +/** @internal */ +class DeferredFragmentRecord { + constructor(path, label, parent) { + this.path = path; + this.label = label; + this.parent = parent; + this.pendingExecutionGroups = new Set(); + this.successfulExecutionGroups = new Set(); + this.children = new Set(); } } +exports.DeferredFragmentRecord = DeferredFragmentRecord; +function isDeferredFragmentRecord(deliveryGroup) { + return deliveryGroup instanceof DeferredFragmentRecord; +} +function isCancellableStreamRecord(deliveryGroup) { + return 'earlyReturn' in deliveryGroup; +} /***/ }), @@ -24278,7 +25517,6 @@ exports.getArgumentValues = getArgumentValues; exports.getDirectiveValues = getDirectiveValues; exports.getVariableValues = getVariableValues; var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); -var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _printPathArray = __webpack_require__(/*! ../jsutils/printPathArray.mjs */ "../../../node_modules/graphql/jsutils/printPathArray.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); @@ -24332,7 +25570,7 @@ function coerceVariableValues(schema, varDefNodes, inputs, onError) { })); continue; } - if (!hasOwnProperty(inputs, varName)) { + if (!Object.hasOwn(inputs, varName)) { if (varDefNode.defaultValue) { coercedValues[varName] = (0, _valueFromAST.valueFromAST)(varDefNode.defaultValue, varType); } else if ((0, _definition.isNonNullType)(varType)) { @@ -24372,20 +25610,18 @@ function coerceVariableValues(schema, varDefNodes, inputs, onError) { * exposed to user code. Care should be taken to not pull values from the * Object prototype. */ - function getArgumentValues(def, node, variableValues) { var _node$arguments; - const coercedValues = {}; // FIXME: https://github.com/graphql/graphql-js/issues/2203 - + const coercedValues = {}; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ - const argumentNodes = (_node$arguments = node.arguments) !== null && _node$arguments !== void 0 ? _node$arguments : []; - const argNodeMap = (0, _keyMap.keyMap)(argumentNodes, arg => arg.name.value); + const argNodeMap = new Map(argumentNodes.map(arg => [arg.name.value, arg])); for (const argDef of def.args) { const name = argDef.name; const argType = argDef.type; - const argumentNode = argNodeMap[name]; - if (!argumentNode) { + const argumentNode = argNodeMap.get(name); + if (argumentNode == null) { if (argDef.defaultValue !== undefined) { coercedValues[name] = argDef.defaultValue; } else if ((0, _definition.isNonNullType)(argType)) { @@ -24399,7 +25635,7 @@ function getArgumentValues(def, node, variableValues) { let isNull = valueNode.kind === _kinds.Kind.NULL; if (valueNode.kind === _kinds.Kind.VARIABLE) { const variableName = valueNode.name.value; - if (variableValues == null || !hasOwnProperty(variableValues, variableName)) { + if (variableValues == null || !Object.hasOwn(variableValues, variableName)) { if (argDef.defaultValue !== undefined) { coercedValues[name] = argDef.defaultValue; } else if ((0, _definition.isNonNullType)(argType)) { @@ -24440,7 +25676,6 @@ function getArgumentValues(def, node, variableValues) { * exposed to user code. Care should be taken to not pull values from the * Object prototype. */ - function getDirectiveValues(directiveDef, node, variableValues) { var _node$directives; const directiveNode = (_node$directives = node.directives) === null || _node$directives === void 0 ? void 0 : _node$directives.find(directive => directive.name.value === directiveDef.name); @@ -24448,9 +25683,6 @@ function getDirectiveValues(directiveDef, node, variableValues) { return getArgumentValues(directiveDef, directiveNode, variableValues); } } -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} /***/ }), @@ -24467,52 +25699,11 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.graphql = graphql; exports.graphqlSync = graphqlSync; -var _devAssert = __webpack_require__(/*! ./jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _isPromise = __webpack_require__(/*! ./jsutils/isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); var _parser = __webpack_require__(/*! ./language/parser.mjs */ "../../../node_modules/graphql/language/parser.mjs"); var _validate = __webpack_require__(/*! ./type/validate.mjs */ "../../../node_modules/graphql/type/validate.mjs"); var _validate2 = __webpack_require__(/*! ./validation/validate.mjs */ "../../../node_modules/graphql/validation/validate.mjs"); var _execute = __webpack_require__(/*! ./execution/execute.mjs */ "../../../node_modules/graphql/execution/execute.mjs"); -/** - * This is the primary entry point function for fulfilling GraphQL operations - * by parsing, validating, and executing a GraphQL document along side a - * GraphQL schema. - * - * More sophisticated GraphQL servers, such as those which persist queries, - * may wish to separate the validation and execution phases to a static time - * tooling step, and a server runtime step. - * - * Accepts either an object with named arguments, or individual arguments: - * - * schema: - * The GraphQL type system to use when validating and executing a query. - * source: - * A GraphQL language formatted string representing the requested operation. - * rootValue: - * The value provided as the first argument to resolver functions on the top - * level type (e.g. the query object type). - * contextValue: - * The context value is provided as an argument to resolver functions after - * field arguments. It is used to pass shared information useful at any point - * during executing this query, for example the currently logged in user and - * connections to databases or other services. - * variableValues: - * A mapping of variable name to runtime value to use for all variables - * defined in the requestString. - * operationName: - * The name of the operation to use if requestString contains multiple - * possible operations. Can be omitted if requestString contains only - * one operation. - * fieldResolver: - * A resolver function to use when one is not provided by the schema. - * If not provided, the default field resolver is used (which looks for a - * value or method on the source value with the field's name). - * typeResolver: - * A type resolver function to use when none is provided by the schema. - * If not provided, the default type resolver is used (which looks for a - * `__typename` field or alternatively calls the `isTypeOf` method). - */ - function graphql(args) { // Always return a Promise for a consistent API. return new Promise(resolve => resolve(graphqlImpl(args))); @@ -24523,18 +25714,15 @@ function graphql(args) { * However, it guarantees to complete synchronously (or throw an error) assuming * that all field resolvers are also synchronous. */ - function graphqlSync(args) { - const result = graphqlImpl(args); // Assert that the execution was synchronous. - + const result = graphqlImpl(args); + // Assert that the execution was synchronous. if ((0, _isPromise.isPromise)(result)) { throw new Error('GraphQL execution failed to complete synchronously.'); } return result; } function graphqlImpl(args) { - // Temporary for v15 to v16 migration. Remove in v17 - arguments.length < 2 || (0, _devAssert.devAssert)(false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.'); const { schema, source, @@ -24544,15 +25732,15 @@ function graphqlImpl(args) { operationName, fieldResolver, typeResolver - } = args; // Validate Schema - + } = args; + // Validate Schema const schemaValidationErrors = (0, _validate.validateSchema)(schema); if (schemaValidationErrors.length > 0) { return { errors: schemaValidationErrors }; - } // Parse - + } + // Parse let document; try { document = (0, _parser.parse)(source); @@ -24560,15 +25748,15 @@ function graphqlImpl(args) { return { errors: [syntaxError] }; - } // Validate - + } + // Validate const validationErrors = (0, _validate2.validate)(schema, document); if (validationErrors.length > 0) { return { errors: validationErrors }; - } // Execute - + } + // Execute return (0, _execute.execute)({ schema, document, @@ -24660,6 +25848,12 @@ Object.defineProperty(exports, "GraphQLBoolean", ({ return _index.GraphQLBoolean; } })); +Object.defineProperty(exports, "GraphQLDeferDirective", ({ + enumerable: true, + get: function () { + return _index.GraphQLDeferDirective; + } +})); Object.defineProperty(exports, "GraphQLDeprecatedDirective", ({ enumerable: true, get: function () { @@ -24738,6 +25932,12 @@ Object.defineProperty(exports, "GraphQLObjectType", ({ return _index.GraphQLObjectType; } })); +Object.defineProperty(exports, "GraphQLOneOfDirective", ({ + enumerable: true, + get: function () { + return _index.GraphQLOneOfDirective; + } +})); Object.defineProperty(exports, "GraphQLScalarType", ({ enumerable: true, get: function () { @@ -24762,6 +25962,12 @@ Object.defineProperty(exports, "GraphQLSpecifiedByDirective", ({ return _index.GraphQLSpecifiedByDirective; } })); +Object.defineProperty(exports, "GraphQLStreamDirective", ({ + enumerable: true, + get: function () { + return _index.GraphQLStreamDirective; + } +})); Object.defineProperty(exports, "GraphQLString", ({ enumerable: true, get: function () { @@ -24828,6 +26034,12 @@ Object.defineProperty(exports, "LoneSchemaDefinitionRule", ({ return _index4.LoneSchemaDefinitionRule; } })); +Object.defineProperty(exports, "MaxIntrospectionDepthRule", ({ + enumerable: true, + get: function () { + return _index4.MaxIntrospectionDepthRule; + } +})); Object.defineProperty(exports, "NoDeprecatedCustomRule", ({ enumerable: true, get: function () { @@ -25218,12 +26430,6 @@ Object.defineProperty(exports, "assertUnionType", ({ return _index.assertUnionType; } })); -Object.defineProperty(exports, "assertValidName", ({ - enumerable: true, - get: function () { - return _index6.assertValidName; - } -})); Object.defineProperty(exports, "assertValidSchema", ({ enumerable: true, get: function () { @@ -25308,6 +26514,12 @@ Object.defineProperty(exports, "executeSync", ({ return _index3.executeSync; } })); +Object.defineProperty(exports, "experimentalExecuteIncrementally", ({ + enumerable: true, + get: function () { + return _index3.experimentalExecuteIncrementally; + } +})); Object.defineProperty(exports, "extendSchema", ({ enumerable: true, get: function () { @@ -25326,12 +26538,6 @@ Object.defineProperty(exports, "findDangerousChanges", ({ return _index6.findDangerousChanges; } })); -Object.defineProperty(exports, "formatError", ({ - enumerable: true, - get: function () { - return _index5.formatError; - } -})); Object.defineProperty(exports, "getArgumentValues", ({ enumerable: true, get: function () { @@ -25380,24 +26586,12 @@ Object.defineProperty(exports, "getOperationAST", ({ return _index6.getOperationAST; } })); -Object.defineProperty(exports, "getOperationRootType", ({ - enumerable: true, - get: function () { - return _index6.getOperationRootType; - } -})); Object.defineProperty(exports, "getVariableValues", ({ enumerable: true, get: function () { return _index3.getVariableValues; } })); -Object.defineProperty(exports, "getVisitFn", ({ - enumerable: true, - get: function () { - return _index2.getVisitFn; - } -})); Object.defineProperty(exports, "graphql", ({ enumerable: true, get: function () { @@ -25518,6 +26712,12 @@ Object.defineProperty(exports, "isNonNullType", ({ return _index.isNonNullType; } })); +Object.defineProperty(exports, "isNullabilityAssertionNode", ({ + enumerable: true, + get: function () { + return _index2.isNullabilityAssertionNode; + } +})); Object.defineProperty(exports, "isNullableType", ({ enumerable: true, get: function () { @@ -25626,12 +26826,6 @@ Object.defineProperty(exports, "isUnionType", ({ return _index.isUnionType; } })); -Object.defineProperty(exports, "isValidNameError", ({ - enumerable: true, - get: function () { - return _index6.isValidNameError; - } -})); Object.defineProperty(exports, "isValueNode", ({ enumerable: true, get: function () { @@ -25686,10 +26880,10 @@ Object.defineProperty(exports, "print", ({ return _index2.print; } })); -Object.defineProperty(exports, "printError", ({ +Object.defineProperty(exports, "printDirective", ({ enumerable: true, get: function () { - return _index5.printError; + return _index6.printDirective; } })); Object.defineProperty(exports, "printIntrospectionSchema", ({ @@ -25722,6 +26916,12 @@ Object.defineProperty(exports, "printType", ({ return _index6.printType; } })); +Object.defineProperty(exports, "recommendedRules", ({ + enumerable: true, + get: function () { + return _index4.recommendedRules; + } +})); Object.defineProperty(exports, "resolveObjMapThunk", ({ enumerable: true, get: function () { @@ -25853,6 +27053,76 @@ var _index6 = __webpack_require__(/*! ./utilities/index.mjs */ "../../../node_mo /***/ }), +/***/ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs": +/*!****************************************************************!*\ + !*** ../../../node_modules/graphql/jsutils/AccumulatorMap.mjs ***! + \****************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.AccumulatorMap = void 0; +/** + * ES6 Map with additional `add` method to accumulate items. + */ +class AccumulatorMap extends Map { + get [Symbol.toStringTag]() { + return 'AccumulatorMap'; + } + add(key, item) { + const group = this.get(key); + if (group === undefined) { + this.set(key, [item]); + } else { + group.push(item); + } + } +} +exports.AccumulatorMap = AccumulatorMap; + +/***/ }), + +/***/ "../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs": +/*!*********************************************************************!*\ + !*** ../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs ***! + \*********************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.BoxedPromiseOrValue = void 0; +var _isPromise = __webpack_require__(/*! ./isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); +/** + * A BoxedPromiseOrValue is a container for a value or promise where the value + * will be updated when the promise resolves. + * + * A BoxedPromiseOrValue may only be used with promises whose possible + * rejection has already been handled, otherwise this will lead to unhandled + * promise rejections. + * + * @internal + * */ +class BoxedPromiseOrValue { + constructor(value) { + this.value = value; + if ((0, _isPromise.isPromise)(value)) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + value.then(resolved => { + this.value = resolved; + }); + } + } +} +exports.BoxedPromiseOrValue = BoxedPromiseOrValue; + +/***/ }), + /***/ "../../../node_modules/graphql/jsutils/Path.mjs": /*!******************************************************!*\ !*** ../../../node_modules/graphql/jsutils/Path.mjs ***! @@ -25879,7 +27149,6 @@ function addPath(prev, key, typename) { /** * Given a Path, return an Array of the path keys. */ - function pathToArray(path) { const flattened = []; let curr = path; @@ -25892,6 +27161,27 @@ function pathToArray(path) { /***/ }), +/***/ "../../../node_modules/graphql/jsutils/capitalize.mjs": +/*!************************************************************!*\ + !*** ../../../node_modules/graphql/jsutils/capitalize.mjs ***! + \************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.capitalize = capitalize; +/** + * Converts the first character of string to upper case and the remaining to lower case. + */ +function capitalize(str) { + return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); +} + +/***/ }), + /***/ "../../../node_modules/graphql/jsutils/devAssert.mjs": /*!***********************************************************!*\ !*** ../../../node_modules/graphql/jsutils/devAssert.mjs ***! @@ -25905,8 +27195,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.devAssert = devAssert; function devAssert(condition, message) { - const booleanCondition = Boolean(condition); - if (!booleanCondition) { + if (!condition) { throw new Error(message); } } @@ -25917,7 +27206,7 @@ function devAssert(condition, message) { /*!************************************************************!*\ !*** ../../../node_modules/graphql/jsutils/didYouMean.mjs ***! \************************************************************/ -/***/ (function(__unused_webpack_module, exports) { +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { @@ -25925,29 +27214,84 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.didYouMean = didYouMean; +var _formatList = __webpack_require__(/*! ./formatList.mjs */ "../../../node_modules/graphql/jsutils/formatList.mjs"); const MAX_SUGGESTIONS = 5; -/** - * Given [ A, B, C ] return ' Did you mean A, B, or C?'. - */ - function didYouMean(firstArg, secondArg) { - const [subMessage, suggestionsArg] = secondArg ? [firstArg, secondArg] : [undefined, firstArg]; + const [subMessage, suggestions] = secondArg ? [firstArg, secondArg] : [undefined, firstArg]; + if (suggestions.length === 0) { + return ''; + } let message = ' Did you mean '; - if (subMessage) { + if (subMessage != null) { message += subMessage + ' '; } - const suggestions = suggestionsArg.map(x => `"${x}"`); - switch (suggestions.length) { - case 0: - return ''; + const suggestionList = (0, _formatList.orList)(suggestions.slice(0, MAX_SUGGESTIONS).map(x => `"${x}"`)); + return message + suggestionList + '?'; +} + +/***/ }), + +/***/ "../../../node_modules/graphql/jsutils/formatList.mjs": +/*!************************************************************!*\ + !*** ../../../node_modules/graphql/jsutils/formatList.mjs ***! + \************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.andList = andList; +exports.orList = orList; +var _invariant = __webpack_require__(/*! ./invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +/** + * Given [ A, B, C ] return 'A, B, or C'. + */ +function orList(items) { + return formatList('or', items); +} +/** + * Given [ A, B, C ] return 'A, B, and C'. + */ +function andList(items) { + return formatList('and', items); +} +function formatList(conjunction, items) { + items.length !== 0 || (0, _invariant.invariant)(false); + switch (items.length) { case 1: - return message + suggestions[0] + '?'; + return items[0]; case 2: - return message + suggestions[0] + ' or ' + suggestions[1] + '?'; + return items[0] + ' ' + conjunction + ' ' + items[1]; + } + const allButLast = items.slice(0, -1); + const lastItem = items.at(-1); + return allButLast.join(', ') + ', ' + conjunction + ' ' + lastItem; +} + +/***/ }), + +/***/ "../../../node_modules/graphql/jsutils/getBySet.mjs": +/*!**********************************************************!*\ + !*** ../../../node_modules/graphql/jsutils/getBySet.mjs ***! + \**********************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.getBySet = getBySet; +var _isSameSet = __webpack_require__(/*! ./isSameSet.mjs */ "../../../node_modules/graphql/jsutils/isSameSet.mjs"); +function getBySet(map, setToMatch) { + for (const set of map.keys()) { + if ((0, _isSameSet.isSameSet)(set, setToMatch)) { + return map.get(set); + } } - const selected = suggestions.slice(0, MAX_SUGGESTIONS); - const lastItem = selected.pop(); - return message + selected.join(', ') + ', or ' + lastItem + '?'; + return undefined; } /***/ }), @@ -25956,7 +27300,7 @@ function didYouMean(firstArg, secondArg) { /*!*********************************************************!*\ !*** ../../../node_modules/graphql/jsutils/groupBy.mjs ***! \*********************************************************/ -/***/ (function(__unused_webpack_module, exports) { +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { @@ -25964,19 +27308,14 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.groupBy = groupBy; +var _AccumulatorMap = __webpack_require__(/*! ./AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); /** * Groups array items into a Map, given a function to produce grouping key. */ function groupBy(list, keyFn) { - const result = new Map(); + const result = new _AccumulatorMap.AccumulatorMap(); for (const item of list) { - const key = keyFn(item); - const group = result.get(key); - if (group === undefined) { - result.set(key, [item]); - } else { - group.push(item); - } + result.add(keyFn(item), item); } return result; } @@ -26021,7 +27360,6 @@ const MAX_RECURSIVE_DEPTH = 2; /** * Used to print values in error messages. */ - function inspect(value) { return formatValue(value, []); } @@ -26046,8 +27384,8 @@ function formatObjectValue(value, previouslySeenValues) { } const seenValues = [...previouslySeenValues, value]; if (isJSONable(value)) { - const jsonValue = value.toJSON(); // check for infinite recursion - + const jsonValue = value.toJSON(); + // check for infinite recursion if (jsonValue !== value) { return typeof jsonValue === 'string' ? jsonValue : formatValue(jsonValue, seenValues); } @@ -26067,10 +27405,7 @@ function formatObject(object, seenValues) { if (seenValues.length > MAX_RECURSIVE_DEPTH) { return '[' + getObjectTag(object) + ']'; } - const properties = entries.map(_ref => { - let [key, value] = _ref; - return key + ': ' + formatValue(value, seenValues); - }); + const properties = entries.map(([key, value]) => key + ': ' + formatValue(value, seenValues)); return '{ ' + properties.join(', ') + ' }'; } function formatArray(array, seenValues) { @@ -26125,10 +27460,9 @@ var _inspect = __webpack_require__(/*! ./inspect.mjs */ "../../../node_modules/g * See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production * See: https://webpack.js.org/guides/production/ */ - -const instanceOf = /* c8 ignore next 6 */ +const instanceOf = exports.instanceOf = /* c8 ignore next 6 */ // FIXME: https://github.com/graphql/graphql-js/issues/2317 -globalThis.process && globalThis.process.env.NODE_ENV === 'production' ? function instanceOf(value, constructor) { +globalThis.process != null && globalThis.process.env.NODE_ENV === 'production' ? function instanceOf(value, constructor) { return value instanceof constructor; } : function instanceOf(value, constructor) { if (value instanceof constructor) { @@ -26136,13 +27470,11 @@ globalThis.process && globalThis.process.env.NODE_ENV === 'production' ? functio } if (typeof value === 'object' && value !== null) { var _value$constructor; - // Prefer Symbol.toStringTag since it is immune to minification. const className = constructor.prototype[Symbol.toStringTag]; const valueClassName = // We still need to support constructor's name to detect conflicts with older versions of this library. - Symbol.toStringTag in value // @ts-expect-error TS bug see, https://github.com/microsoft/TypeScript/issues/38009 - ? value[Symbol.toStringTag] : (_value$constructor = value.constructor) === null || _value$constructor === void 0 ? void 0 : _value$constructor.name; + Symbol.toStringTag in value ? value[Symbol.toStringTag] : (_value$constructor = value.constructor) === null || _value$constructor === void 0 ? void 0 : _value$constructor.name; if (className === valueClassName) { const stringifiedValue = (0, _inspect.inspect)(value); throw new Error(`Cannot use ${className} "${stringifiedValue}" from another module or realm. @@ -26161,7 +27493,6 @@ spurious results.`); } return false; }; -exports.instanceOf = instanceOf; /***/ }), @@ -26178,8 +27509,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.invariant = invariant; function invariant(condition, message) { - const booleanCondition = Boolean(condition); - if (!booleanCondition) { + if (!condition) { throw new Error(message != null ? message : 'Unexpected invariant triggered.'); } } @@ -26287,6 +27617,32 @@ function isPromise(value) { /***/ }), +/***/ "../../../node_modules/graphql/jsutils/isSameSet.mjs": +/*!***********************************************************!*\ + !*** ../../../node_modules/graphql/jsutils/isSameSet.mjs ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.isSameSet = isSameSet; +function isSameSet(setA, setB) { + if (setA.size !== setB.size) { + return false; + } + for (const item of setA) { + if (!setB.has(item)) { + return false; + } + } + return true; +} + +/***/ }), + /***/ "../../../node_modules/graphql/jsutils/keyMap.mjs": /*!********************************************************!*\ !*** ../../../node_modules/graphql/jsutils/keyMap.mjs ***! @@ -26548,14 +27904,15 @@ exports.promiseForObject = promiseForObject; * This is akin to bluebird's `Promise.props`, but implemented only using * `Promise.all` so it will work with any implementation of ES6 promises. */ -function promiseForObject(object) { - return Promise.all(Object.values(object)).then(resolvedValues => { - const resolvedObject = Object.create(null); - for (const [i, key] of Object.keys(object).entries()) { - resolvedObject[key] = resolvedValues[i]; - } - return resolvedObject; - }); +async function promiseForObject(object, callback) { + const keys = Object.keys(object); + const values = Object.values(object); + const resolvedValues = await Promise.all(values); + const resolvedObject = Object.create(null); + for (let i = 0; i < keys.length; ++i) { + resolvedObject[keys[i]] = resolvedValues[i]; + } + return callback(resolvedObject); } /***/ }), @@ -26590,6 +27947,39 @@ function promiseReduce(values, callbackFn, initialValue) { /***/ }), +/***/ "../../../node_modules/graphql/jsutils/promiseWithResolvers.mjs": +/*!**********************************************************************!*\ + !*** ../../../node_modules/graphql/jsutils/promiseWithResolvers.mjs ***! + \**********************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.promiseWithResolvers = promiseWithResolvers; +/** + * Based on Promise.withResolvers proposal + * https://github.com/tc39/proposal-promise-with-resolvers + */ +function promiseWithResolvers() { + // these are assigned synchronously within the Promise constructor + let resolve; + let reject; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + return { + promise, + resolve, + reject + }; +} + +/***/ }), + /***/ "../../../node_modules/graphql/jsutils/suggestionList.mjs": /*!****************************************************************!*\ !*** ../../../node_modules/graphql/jsutils/suggestionList.mjs ***! @@ -26607,7 +27997,6 @@ var _naturalCompare = __webpack_require__(/*! ./naturalCompare.mjs */ "../../../ * Given an invalid input string and a list of valid options, returns a filtered * list of valid options sorted based on their similarity with the input. */ - function suggestionList(input, options) { const optionsByDistance = Object.create(null); const lexicalDistance = new LexicalDistance(input); @@ -26637,7 +28026,6 @@ function suggestionList(input, options) { * * This distance can be useful for detecting typos in input or sorting */ - class LexicalDistance { constructor(input) { this._input = input; @@ -26649,8 +28037,8 @@ class LexicalDistance { if (this._input === option) { return 0; } - const optionLowerCase = option.toLowerCase(); // Any case change counts as a single edit - + const optionLowerCase = option.toLowerCase(); + // Any case change counts as a single edit if (this._inputLowerCase === optionLowerCase) { return 1; } @@ -26680,9 +28068,7 @@ class LexicalDistance { // delete currentRow[j - 1] + 1, // insert - upRow[j - 1] + cost // substitute - ); - + upRow[j - 1] + cost); if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) { // transposition const doubleDiagonalCell = rows[(i - 2) % 3][j - 2]; @@ -26692,8 +28078,8 @@ class LexicalDistance { smallestCell = currentCell; } currentRow[j] = currentCell; - } // Early exit, since distance can't go smaller than smallest element of the previous row. - + } + // Early exit, since distance can't go smaller than smallest element of the previous row. if (smallestCell > threshold) { return undefined; } @@ -26729,7 +28115,6 @@ var _inspect = __webpack_require__(/*! ./inspect.mjs */ "../../../node_modules/g /** * Sometimes a non-error is thrown, wrap it as an Error instance to ensure a consistent Error interface. */ - function toError(thrownValue) { return thrownValue instanceof Error ? thrownValue : new NonErrorThrown(thrownValue); } @@ -26789,25 +28174,6 @@ exports.isNode = isNode; * identify the region of the source from which the AST derived. */ class Location { - /** - * The character offset at which this Node begins. - */ - - /** - * The character offset at which this Node ends. - */ - - /** - * The Token at which this Node begins. - */ - - /** - * The Token at which this Node ends. - */ - - /** - * The Source document the AST represents. - */ constructor(startToken, endToken, source) { this.start = startToken.start; this.end = endToken.end; @@ -26831,45 +28197,14 @@ class Location { */ exports.Location = Location; class Token { - /** - * The kind of Token. - */ - - /** - * The character offset at which this Node begins. - */ - - /** - * The character offset at which this Node ends. - */ - - /** - * The 1-indexed line number on which this Token appears. - */ - - /** - * The 1-indexed column number at which this Token begins. - */ - - /** - * For non-punctuation tokens, represents the interpreted value of the token. - * - * Note: is undefined for punctuation tokens, but typed as string for - * convenience in the parser. - */ - - /** - * Tokens exist as nodes in a double-linked-list amongst all tokens - * including ignored tokens. is always the first node and - * the last. - */ + // eslint-disable-next-line max-params constructor(kind, start, end, line, column, value) { this.kind = kind; this.start = start; this.end = end; this.line = line; - this.column = column; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - + this.column = column; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.value = value; this.prev = null; this.next = null; @@ -26886,23 +28221,27 @@ class Token { }; } } -/** - * The list of all possible AST node types. - */ - /** * @internal */ exports.Token = Token; -const QueryDocumentKeys = { +const QueryDocumentKeys = exports.QueryDocumentKeys = { Name: [], Document: ['definitions'], OperationDefinition: ['name', 'variableDefinitions', 'directives', 'selectionSet'], VariableDefinition: ['variable', 'type', 'defaultValue', 'directives'], Variable: ['name'], SelectionSet: ['selections'], - Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet'], + Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet', + // Note: Client Controlled Nullability is experimental and may be changed + // or removed in the future. + 'nullabilityAssertion'], Argument: ['name', 'value'], + // Note: Client Controlled Nullability is experimental and may be changed + // or removed in the future. + ListNullabilityOperator: ['nullabilityAssertion'], + NonNullAssertion: ['nullabilityAssertion'], + ErrorBoundary: ['nullabilityAssertion'], FragmentSpread: ['name', 'directives'], InlineFragment: ['typeCondition', 'directives', 'selectionSet'], FragmentDefinition: ['name', @@ -26941,20 +28280,15 @@ const QueryDocumentKeys = { EnumTypeExtension: ['name', 'directives', 'values'], InputObjectTypeExtension: ['name', 'directives', 'fields'] }; -exports.QueryDocumentKeys = QueryDocumentKeys; const kindValues = new Set(Object.keys(QueryDocumentKeys)); /** * @internal */ - function isNode(maybeNode) { const maybeKind = maybeNode === null || maybeNode === void 0 ? void 0 : maybeNode.kind; return typeof maybeKind === 'string' && kindValues.has(maybeKind); } -/** Name */ - var OperationTypeNode; -exports.OperationTypeNode = OperationTypeNode; (function (OperationTypeNode) { OperationTypeNode['QUERY'] = 'query'; OperationTypeNode['MUTATION'] = 'mutation'; @@ -26986,29 +28320,28 @@ var _characterClasses = __webpack_require__(/*! ./characterClasses.mjs */ "../.. * * @internal */ - function dedentBlockStringLines(lines) { - var _firstNonEmptyLine2; + var _firstNonEmptyLine; let commonIndent = Number.MAX_SAFE_INTEGER; let firstNonEmptyLine = null; let lastNonEmptyLine = -1; for (let i = 0; i < lines.length; ++i) { - var _firstNonEmptyLine; const line = lines[i]; const indent = leadingWhitespace(line); if (indent === line.length) { continue; // skip empty lines } - - firstNonEmptyLine = (_firstNonEmptyLine = firstNonEmptyLine) !== null && _firstNonEmptyLine !== void 0 ? _firstNonEmptyLine : i; + firstNonEmptyLine ??= i; lastNonEmptyLine = i; if (i !== 0 && indent < commonIndent) { commonIndent = indent; } } - return lines // Remove common indentation from all lines but first. - .map((line, i) => i === 0 ? line : line.slice(commonIndent)) // Remove leading and trailing blank lines. - .slice((_firstNonEmptyLine2 = firstNonEmptyLine) !== null && _firstNonEmptyLine2 !== void 0 ? _firstNonEmptyLine2 : 0, lastNonEmptyLine + 1); + return lines + // Remove common indentation from all lines but first. + .map((line, i) => i === 0 ? line : line.slice(commonIndent)) + // Remove leading and trailing blank lines. + .slice((_firstNonEmptyLine = firstNonEmptyLine) !== null && _firstNonEmptyLine !== void 0 ? _firstNonEmptyLine : 0, lastNonEmptyLine + 1); } function leadingWhitespace(str) { let i = 0; @@ -27020,12 +28353,10 @@ function leadingWhitespace(str) { /** * @internal */ - function isPrintableAsBlockString(value) { if (value === '') { return true; // empty string is printable } - let isEmptyLine = true; let hasIndent = false; let hasCommonIndent = true; @@ -27047,41 +28378,35 @@ function isPrintableAsBlockString(value) { case 0x000f: return false; // Has non-printable characters - case 0x000d: // \r return false; // Has \r or \r\n which will be replaced as \n - case 10: // \n if (isEmptyLine && !seenNonEmptyLine) { return false; // Has leading new line } - seenNonEmptyLine = true; isEmptyLine = true; hasIndent = false; break; case 9: // \t - case 32: // - hasIndent || (hasIndent = isEmptyLine); + hasIndent ||= isEmptyLine; break; default: - hasCommonIndent && (hasCommonIndent = hasIndent); + hasCommonIndent &&= hasIndent; isEmptyLine = false; } } if (isEmptyLine) { return false; // Has trailing empty lines } - if (hasCommonIndent && seenNonEmptyLine) { return false; // Has internal indent } - return true; } /** @@ -27091,25 +28416,24 @@ function isPrintableAsBlockString(value) { * * @internal */ - function printBlockString(value, options) { - const escapedValue = value.replace(/"""/g, '\\"""'); // Expand a block string's raw value into independent lines. - + const escapedValue = value.replaceAll('"""', '\\"""'); + // Expand a block string's raw value into independent lines. const lines = escapedValue.split(/\r\n|[\n\r]/g); - const isSingleLine = lines.length === 1; // If common indentation is found we can fix some of those cases by adding leading new line - - const forceLeadingNewLine = lines.length > 1 && lines.slice(1).every(line => line.length === 0 || (0, _characterClasses.isWhiteSpace)(line.charCodeAt(0))); // Trailing triple quotes just looks confusing but doesn't force trailing new line - - const hasTrailingTripleQuotes = escapedValue.endsWith('\\"""'); // Trailing quote (single or double) or slash forces trailing new line - + const isSingleLine = lines.length === 1; + // If common indentation is found we can fix some of those cases by adding leading new line + const forceLeadingNewLine = lines.length > 1 && lines.slice(1).every(line => line.length === 0 || (0, _characterClasses.isWhiteSpace)(line.charCodeAt(0))); + // Trailing triple quotes just looks confusing but doesn't force trailing new line + const hasTrailingTripleQuotes = escapedValue.endsWith('\\"""'); + // Trailing quote (single or double) or slash forces trailing new line const hasTrailingQuote = value.endsWith('"') && !hasTrailingTripleQuotes; const hasTrailingSlash = value.endsWith('\\'); const forceTrailingNewline = hasTrailingQuote || hasTrailingSlash; const printAsMultipleLines = !(options !== null && options !== void 0 && options.minimize) && ( // add leading and trailing new lines only if it improves readability !isSingleLine || value.length > 70 || forceTrailingNewline || forceLeadingNewLine || hasTrailingTripleQuotes); - let result = ''; // Format a multi-line block quote to account for leading space. - + let result = ''; + // Format a multi-line block quote to account for leading space. const skipLeadingNewLine = isSingleLine && (0, _characterClasses.isWhiteSpace)(value.charCodeAt(0)); if (printAsMultipleLines && !skipLeadingNewLine || forceLeadingNewLine) { result += '\n'; @@ -27157,7 +28481,6 @@ function isWhiteSpace(code) { * ``` * @internal */ - function isDigit(code) { return code >= 0x0030 && code <= 0x0039; } @@ -27171,7 +28494,6 @@ function isDigit(code) { * ``` * @internal */ - function isLetter(code) { return code >= 0x0061 && code <= 0x007a || // A-Z @@ -27186,7 +28508,6 @@ function isLetter(code) { * ``` * @internal */ - function isNameStart(code) { return isLetter(code) || code === 0x005f; } @@ -27199,7 +28520,6 @@ function isNameStart(code) { * ``` * @internal */ - function isNameContinue(code) { return isLetter(code) || isDigit(code) || code === 0x005f; } @@ -27222,8 +28542,8 @@ exports.DirectiveLocation = void 0; * The set of allowed directive location values. */ var DirectiveLocation; -exports.DirectiveLocation = DirectiveLocation; (function (DirectiveLocation) { + /** Request Definitions */ DirectiveLocation['QUERY'] = 'QUERY'; DirectiveLocation['MUTATION'] = 'MUTATION'; DirectiveLocation['SUBSCRIPTION'] = 'SUBSCRIPTION'; @@ -27232,6 +28552,7 @@ exports.DirectiveLocation = DirectiveLocation; DirectiveLocation['FRAGMENT_SPREAD'] = 'FRAGMENT_SPREAD'; DirectiveLocation['INLINE_FRAGMENT'] = 'INLINE_FRAGMENT'; DirectiveLocation['VARIABLE_DEFINITION'] = 'VARIABLE_DEFINITION'; + /** Type System Definitions */ DirectiveLocation['SCHEMA'] = 'SCHEMA'; DirectiveLocation['SCALAR'] = 'SCALAR'; DirectiveLocation['OBJECT'] = 'OBJECT'; @@ -27245,12 +28566,6 @@ exports.DirectiveLocation = DirectiveLocation; DirectiveLocation['INPUT_FIELD_DEFINITION'] = 'INPUT_FIELD_DEFINITION'; })(DirectiveLocation || (exports.DirectiveLocation = DirectiveLocation = {})); -/** - * The enum type representing the directive location values. - * - * @deprecated Please use `DirectiveLocation`. Will be remove in v17. - */ - /***/ }), /***/ "../../../node_modules/graphql/language/index.mjs": @@ -27330,12 +28645,6 @@ Object.defineProperty(exports, "getLocation", ({ return _location.getLocation; } })); -Object.defineProperty(exports, "getVisitFn", ({ - enumerable: true, - get: function () { - return _visitor.getVisitFn; - } -})); Object.defineProperty(exports, "isConstValueNode", ({ enumerable: true, get: function () { @@ -27354,6 +28663,12 @@ Object.defineProperty(exports, "isExecutableDefinitionNode", ({ return _predicates.isExecutableDefinitionNode; } })); +Object.defineProperty(exports, "isNullabilityAssertionNode", ({ + enumerable: true, + get: function () { + return _predicates.isNullabilityAssertionNode; + } +})); Object.defineProperty(exports, "isSelectionNode", ({ enumerable: true, get: function () { @@ -27481,18 +28796,25 @@ exports.Kind = void 0; * The set of allowed kind values for AST nodes. */ var Kind; -exports.Kind = Kind; (function (Kind) { + /** Name */ Kind['NAME'] = 'Name'; + /** Document */ Kind['DOCUMENT'] = 'Document'; Kind['OPERATION_DEFINITION'] = 'OperationDefinition'; Kind['VARIABLE_DEFINITION'] = 'VariableDefinition'; Kind['SELECTION_SET'] = 'SelectionSet'; Kind['FIELD'] = 'Field'; Kind['ARGUMENT'] = 'Argument'; + /** Nullability Modifiers */ + Kind['LIST_NULLABILITY_OPERATOR'] = 'ListNullabilityOperator'; + Kind['NON_NULL_ASSERTION'] = 'NonNullAssertion'; + Kind['ERROR_BOUNDARY'] = 'ErrorBoundary'; + /** Fragments */ Kind['FRAGMENT_SPREAD'] = 'FragmentSpread'; Kind['INLINE_FRAGMENT'] = 'InlineFragment'; Kind['FRAGMENT_DEFINITION'] = 'FragmentDefinition'; + /** Values */ Kind['VARIABLE'] = 'Variable'; Kind['INT'] = 'IntValue'; Kind['FLOAT'] = 'FloatValue'; @@ -27503,12 +28825,16 @@ exports.Kind = Kind; Kind['LIST'] = 'ListValue'; Kind['OBJECT'] = 'ObjectValue'; Kind['OBJECT_FIELD'] = 'ObjectField'; + /** Directives */ Kind['DIRECTIVE'] = 'Directive'; + /** Types */ Kind['NAMED_TYPE'] = 'NamedType'; Kind['LIST_TYPE'] = 'ListType'; Kind['NON_NULL_TYPE'] = 'NonNullType'; + /** Type System Definitions */ Kind['SCHEMA_DEFINITION'] = 'SchemaDefinition'; Kind['OPERATION_TYPE_DEFINITION'] = 'OperationTypeDefinition'; + /** Type Definitions */ Kind['SCALAR_TYPE_DEFINITION'] = 'ScalarTypeDefinition'; Kind['OBJECT_TYPE_DEFINITION'] = 'ObjectTypeDefinition'; Kind['FIELD_DEFINITION'] = 'FieldDefinition'; @@ -27518,8 +28844,11 @@ exports.Kind = Kind; Kind['ENUM_TYPE_DEFINITION'] = 'EnumTypeDefinition'; Kind['ENUM_VALUE_DEFINITION'] = 'EnumValueDefinition'; Kind['INPUT_OBJECT_TYPE_DEFINITION'] = 'InputObjectTypeDefinition'; + /** Directive Definitions */ Kind['DIRECTIVE_DEFINITION'] = 'DirectiveDefinition'; + /** Type System Extensions */ Kind['SCHEMA_EXTENSION'] = 'SchemaExtension'; + /** Type Extensions */ Kind['SCALAR_TYPE_EXTENSION'] = 'ScalarTypeExtension'; Kind['OBJECT_TYPE_EXTENSION'] = 'ObjectTypeExtension'; Kind['INTERFACE_TYPE_EXTENSION'] = 'InterfaceTypeExtension'; @@ -27528,12 +28857,6 @@ exports.Kind = Kind; Kind['INPUT_OBJECT_TYPE_EXTENSION'] = 'InputObjectTypeExtension'; })(Kind || (exports.Kind = Kind = {})); -/** - * The enum type representing the possible kind values of AST nodes. - * - * @deprecated Please use `Kind`. Will be remove in v17. - */ - /***/ }), /***/ "../../../node_modules/graphql/language/lexer.mjs": @@ -27562,23 +28885,7 @@ var _tokenKind = __webpack_require__(/*! ./tokenKind.mjs */ "../../../node_modul * EOF, after which the lexer will repeatedly return the same EOF token * whenever called. */ - class Lexer { - /** - * The previously focused non-ignored token. - */ - - /** - * The currently focused non-ignored token. - */ - - /** - * The (1-indexed) line containing the current token. - */ - - /** - * The character offset at which the current line begins. - */ constructor(source) { const startOfFileToken = new _ast.Token(_tokenKind.TokenKind.SOF, 0, 0, 0, 0); this.source = source; @@ -27593,7 +28900,6 @@ class Lexer { /** * Advances the token stream to the next non-ignored token. */ - advance() { this.lastToken = this.token; const token = this.token = this.lookahead(); @@ -27603,7 +28909,6 @@ class Lexer { * Looks ahead and returns the next non-ignored token, but does not change * the state of Lexer. */ - lookahead() { let token = this.token; if (token.kind !== _tokenKind.TokenKind.EOF) { @@ -27612,10 +28917,10 @@ class Lexer { token = token.next; } else { // Read the next token and form a link in the token linked-list. - const nextToken = readNextToken(this, token.end); // @ts-expect-error next is only mutable during parsing. - - token.next = nextToken; // @ts-expect-error prev is only mutable during parsing. - + const nextToken = readNextToken(this, token.end); + // @ts-expect-error next is only mutable during parsing. + token.next = nextToken; + // @ts-expect-error prev is only mutable during parsing. nextToken.prev = token; token = nextToken; } @@ -27629,7 +28934,7 @@ class Lexer { */ exports.Lexer = Lexer; function isPunctuatorTokenKind(kind) { - return kind === _tokenKind.TokenKind.BANG || kind === _tokenKind.TokenKind.DOLLAR || kind === _tokenKind.TokenKind.AMP || kind === _tokenKind.TokenKind.PAREN_L || kind === _tokenKind.TokenKind.PAREN_R || kind === _tokenKind.TokenKind.SPREAD || kind === _tokenKind.TokenKind.COLON || kind === _tokenKind.TokenKind.EQUALS || kind === _tokenKind.TokenKind.AT || kind === _tokenKind.TokenKind.BRACKET_L || kind === _tokenKind.TokenKind.BRACKET_R || kind === _tokenKind.TokenKind.BRACE_L || kind === _tokenKind.TokenKind.PIPE || kind === _tokenKind.TokenKind.BRACE_R; + return kind === _tokenKind.TokenKind.BANG || kind === _tokenKind.TokenKind.QUESTION_MARK || kind === _tokenKind.TokenKind.DOLLAR || kind === _tokenKind.TokenKind.AMP || kind === _tokenKind.TokenKind.PAREN_L || kind === _tokenKind.TokenKind.PAREN_R || kind === _tokenKind.TokenKind.SPREAD || kind === _tokenKind.TokenKind.COLON || kind === _tokenKind.TokenKind.EQUALS || kind === _tokenKind.TokenKind.AT || kind === _tokenKind.TokenKind.BRACKET_L || kind === _tokenKind.TokenKind.BRACKET_R || kind === _tokenKind.TokenKind.BRACE_L || kind === _tokenKind.TokenKind.PIPE || kind === _tokenKind.TokenKind.BRACE_R; } /** * A Unicode scalar value is any Unicode code point except surrogate code @@ -27639,7 +28944,6 @@ function isPunctuatorTokenKind(kind) { * SourceCharacter :: * - "Any Unicode scalar value" */ - function isUnicodeScalarValue(code) { return code >= 0x0000 && code <= 0xd7ff || code >= 0xe000 && code <= 0x10ffff; } @@ -27651,7 +28955,6 @@ function isUnicodeScalarValue(code) { * encodes a supplementary code point (above U+FFFF), but unpaired surrogate * code points are not valid source characters. */ - function isSupplementaryCodePoint(body, location) { return isLeadingSurrogate(body.charCodeAt(location)) && isTrailingSurrogate(body.charCodeAt(location + 1)); } @@ -27668,7 +28971,6 @@ function isTrailingSurrogate(code) { * Printable ASCII is printed quoted, while other points are printed in Unicode * code point form (ie. U+1234). */ - function printCodePointAt(lexer, location) { const code = lexer.source.body.codePointAt(location); if (code === undefined) { @@ -27677,14 +28979,13 @@ function printCodePointAt(lexer, location) { // Printable ASCII const char = String.fromCodePoint(code); return char === '"' ? "'\"'" : `"${char}"`; - } // Unicode code point - + } + // Unicode code point return 'U+' + code.toString(16).toUpperCase().padStart(4, '0'); } /** * Create a token with line and column location information. */ - function createToken(lexer, kind, start, end, value) { const line = lexer.line; const col = 1 + start - lexer.lineStart; @@ -27697,14 +28998,13 @@ function createToken(lexer, kind, start, end, value) { * punctuators immediately or calls the appropriate helper function for more * complicated tokens. */ - function readNextToken(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; let position = start; while (position < bodyLength) { - const code = body.charCodeAt(position); // SourceCharacter - + const code = body.charCodeAt(position); + // SourceCharacter switch (code) { // Ignored :: // - UnicodeBOM @@ -27721,11 +29021,8 @@ function readNextToken(lexer, start) { // // Comma :: , case 0xfeff: // - case 0x0009: // \t - case 0x0020: // - case 0x002c: // , ++position; @@ -27734,7 +29031,6 @@ function readNextToken(lexer, start) { // - "New Line (U+000A)" // - "Carriage Return (U+000D)" [lookahead != "New Line (U+000A)"] // - "Carriage Return (U+000D)" "New Line (U+000A)" - case 0x000a: // \n ++position; @@ -27752,7 +29048,6 @@ function readNextToken(lexer, start) { lexer.lineStart = position; continue; // Comment - case 0x0023: // # return readComment(lexer, position); @@ -27764,7 +29059,6 @@ function readNextToken(lexer, start) { // - StringValue // // Punctuator :: one of ! $ & ( ) ... : = @ [ ] { | } - case 0x0021: // ! return createToken(lexer, _tokenKind.TokenKind.BANG, position, position + 1); @@ -27810,20 +29104,22 @@ function readNextToken(lexer, start) { case 0x007d: // } return createToken(lexer, _tokenKind.TokenKind.BRACE_R, position, position + 1); + case 0x003f: + // ? + return createToken(lexer, _tokenKind.TokenKind.QUESTION_MARK, position, position + 1); // StringValue - case 0x0022: // " if (body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022) { return readBlockString(lexer, position); } return readString(lexer, position); - } // IntValue | FloatValue (Digit | -) - + } + // IntValue | FloatValue (Digit | -) if ((0, _characterClasses.isDigit)(code) || code === 0x002d) { return readNumber(lexer, position, code); - } // Name - + } + // Name if ((0, _characterClasses.isNameStart)(code)) { return readName(lexer, position); } @@ -27840,18 +29136,17 @@ function readNextToken(lexer, start) { * CommentChar :: SourceCharacter but not LineTerminator * ``` */ - function readComment(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; let position = start + 1; while (position < bodyLength) { - const code = body.charCodeAt(position); // LineTerminator (\n | \r) - + const code = body.charCodeAt(position); + // LineTerminator (\n | \r) if (code === 0x000a || code === 0x000d) { break; - } // SourceCharacter - + } + // SourceCharacter if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { @@ -27891,17 +29186,16 @@ function readComment(lexer, start) { * Sign :: one of + - * ``` */ - function readNumber(lexer, start, firstCode) { const body = lexer.source.body; let position = start; let code = firstCode; - let isFloat = false; // NegativeSign (-) - + let isFloat = false; + // NegativeSign (-) if (code === 0x002d) { code = body.charCodeAt(++position); - } // Zero (0) - + } + // Zero (0) if (code === 0x0030) { code = body.charCodeAt(++position); if ((0, _characterClasses.isDigit)(code)) { @@ -27910,26 +29204,26 @@ function readNumber(lexer, start, firstCode) { } else { position = readDigits(lexer, position, code); code = body.charCodeAt(position); - } // Full stop (.) - + } + // Full stop (.) if (code === 0x002e) { isFloat = true; code = body.charCodeAt(++position); position = readDigits(lexer, position, code); code = body.charCodeAt(position); - } // E e - + } + // E e if (code === 0x0045 || code === 0x0065) { isFloat = true; - code = body.charCodeAt(++position); // + - - + code = body.charCodeAt(++position); + // + - if (code === 0x002b || code === 0x002d) { code = body.charCodeAt(++position); } position = readDigits(lexer, position, code); code = body.charCodeAt(position); - } // Numbers cannot be followed by . or NameStart - + } + // Numbers cannot be followed by . or NameStart if (code === 0x002e || (0, _characterClasses.isNameStart)(code)) { throw (0, _syntaxError.syntaxError)(lexer.source, position, `Invalid number, expected digit but got: ${printCodePointAt(lexer, position)}.`); } @@ -27938,14 +29232,12 @@ function readNumber(lexer, start, firstCode) { /** * Returns the new position in the source after reading one or more digits. */ - function readDigits(lexer, start, firstCode) { if (!(0, _characterClasses.isDigit)(firstCode)) { throw (0, _syntaxError.syntaxError)(lexer.source, start, `Invalid number, expected digit but got: ${printCodePointAt(lexer, start)}.`); } const body = lexer.source.body; let position = start + 1; // +1 to skip first firstCode - while ((0, _characterClasses.isDigit)(body.charCodeAt(position))) { ++position; } @@ -27971,7 +29263,6 @@ function readDigits(lexer, start, firstCode) { * EscapedCharacter :: one of `"` `\` `/` `b` `f` `n` `r` `t` * ``` */ - function readString(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; @@ -27979,13 +29270,13 @@ function readString(lexer, start) { let chunkStart = position; let value = ''; while (position < bodyLength) { - const code = body.charCodeAt(position); // Closing Quote (") - + const code = body.charCodeAt(position); + // Closing Quote (") if (code === 0x0022) { value += body.slice(chunkStart, position); return createToken(lexer, _tokenKind.TokenKind.STRING, start, position + 1, value); - } // Escape Sequence (\) - + } + // Escape Sequence (\) if (code === 0x005c) { value += body.slice(chunkStart, position); const escape = body.charCodeAt(position + 1) === 0x0075 // u @@ -27995,12 +29286,12 @@ function readString(lexer, start) { position += escape.size; chunkStart = position; continue; - } // LineTerminator (\n | \r) - + } + // LineTerminator (\n | \r) if (code === 0x000a || code === 0x000d) { break; - } // SourceCharacter - + } + // SourceCharacter if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { @@ -28010,16 +29301,15 @@ function readString(lexer, start) { } } throw (0, _syntaxError.syntaxError)(lexer.source, position, 'Unterminated string.'); -} // The string value and lexed size of an escape sequence. - +} function readEscapedUnicodeVariableWidth(lexer, position) { const body = lexer.source.body; let point = 0; - let size = 3; // Cannot be larger than 12 chars (\u{00000000}). - + let size = 3; + // Cannot be larger than 12 chars (\u{00000000}). while (size < 12) { - const code = body.charCodeAt(position + size++); // Closing Brace (}) - + const code = body.charCodeAt(position + size++); + // Closing Brace (}) if (code === 0x007d) { // Must be at least 5 chars (\u{0}) and encode a Unicode scalar value. if (size < 5 || !isUnicodeScalarValue(point)) { @@ -28029,8 +29319,8 @@ function readEscapedUnicodeVariableWidth(lexer, position) { value: String.fromCodePoint(point), size }; - } // Append this hex digit to the code point. - + } + // Append this hex digit to the code point. point = point << 4 | readHexDigit(code); if (point < 0) { break; @@ -28046,9 +29336,9 @@ function readEscapedUnicodeFixedWidth(lexer, position) { value: String.fromCodePoint(code), size: 6 }; - } // GraphQL allows JSON-style surrogate pair escape sequences, but only when + } + // GraphQL allows JSON-style surrogate pair escape sequences, but only when // a valid pair is formed. - if (isLeadingSurrogate(code)) { // \u if (body.charCodeAt(position + 6) === 0x005c && body.charCodeAt(position + 7) === 0x0075) { @@ -28076,7 +29366,6 @@ function readEscapedUnicodeFixedWidth(lexer, position) { * * Returns a negative number if any char was not a valid hexadecimal digit. */ - function read16BitHexCode(body, position) { // readHexDigit() returns -1 on error. ORing a negative value with any other // value always produces a negative value. @@ -28096,7 +29385,6 @@ function read16BitHexCode(body, position) { * - `A` `B` `C` `D` `E` `F` * - `a` `b` `c` `d` `e` `f` */ - function readHexDigit(code) { return code >= 0x0030 && code <= 0x0039 // 0-9 ? code - 0x0030 : code >= 0x0041 && code <= 0x0046 // A-F @@ -28115,7 +29403,6 @@ function readHexDigit(code) { * | `r` | U+000D | carriage return | * | `t` | U+0009 | horizontal tab | */ - function readEscapedCharacter(lexer, position) { const body = lexer.source.body; const code = body.charCodeAt(position + 1); @@ -28183,7 +29470,6 @@ function readEscapedCharacter(lexer, position) { * - `\"""` * ``` */ - function readBlockString(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; @@ -28193,8 +29479,8 @@ function readBlockString(lexer, start) { let currentLine = ''; const blockLines = []; while (position < bodyLength) { - const code = body.charCodeAt(position); // Closing Triple-Quote (""") - + const code = body.charCodeAt(position); + // Closing Triple-Quote (""") if (code === 0x0022 && body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022) { currentLine += body.slice(chunkStart, position); blockLines.push(currentLine); @@ -28204,16 +29490,15 @@ function readBlockString(lexer, start) { lexer.line += blockLines.length - 1; lexer.lineStart = lineStart; return token; - } // Escaped Triple-Quote (\""") - + } + // Escaped Triple-Quote (\""") if (code === 0x005c && body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022 && body.charCodeAt(position + 3) === 0x0022) { currentLine += body.slice(chunkStart, position); chunkStart = position + 1; // skip only slash - position += 4; continue; - } // LineTerminator - + } + // LineTerminator if (code === 0x000a || code === 0x000d) { currentLine += body.slice(chunkStart, position); blockLines.push(currentLine); @@ -28226,8 +29511,8 @@ function readBlockString(lexer, start) { chunkStart = position; lineStart = position; continue; - } // SourceCharacter - + } + // SourceCharacter if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { @@ -28246,7 +29531,6 @@ function readBlockString(lexer, start) { * - NameStart NameContinue* [lookahead != NameContinue] * ``` */ - function readName(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; @@ -28278,10 +29562,6 @@ Object.defineProperty(exports, "__esModule", ({ exports.getLocation = getLocation; var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); const LineRegExp = /\r\n|[\n\r]/g; -/** - * Represents a location in a Source. - */ - /** * Takes a Source and a UTF-8 character offset, and returns the corresponding * line and column as a SourceLocation. @@ -28328,10 +29608,6 @@ var _kinds = __webpack_require__(/*! ./kinds.mjs */ "../../../node_modules/graph var _lexer = __webpack_require__(/*! ./lexer.mjs */ "../../../node_modules/graphql/language/lexer.mjs"); var _source = __webpack_require__(/*! ./source.mjs */ "../../../node_modules/graphql/language/source.mjs"); var _tokenKind = __webpack_require__(/*! ./tokenKind.mjs */ "../../../node_modules/graphql/language/tokenKind.mjs"); -/** - * Configuration options to control parser behavior - */ - /** * Given a GraphQL source, parses it into a Document. * Throws GraphQLError if a syntax error is encountered. @@ -28350,7 +29626,6 @@ function parse(source, options) { * * Consider providing the results to the utility function: valueFromAST(). */ - function parseValue(source, options) { const parser = new Parser(source, options); parser.expectToken(_tokenKind.TokenKind.SOF); @@ -28362,7 +29637,6 @@ function parseValue(source, options) { * Similar to parseValue(), but raises a parse error if it encounters a * variable. The return type will be a constant value. */ - function parseConstValue(source, options) { const parser = new Parser(source, options); parser.expectToken(_tokenKind.TokenKind.SOF); @@ -28380,7 +29654,6 @@ function parseConstValue(source, options) { * * Consider providing the results to the utility function: typeFromAST(). */ - function parseType(source, options) { const parser = new Parser(source, options); parser.expectToken(_tokenKind.TokenKind.SOF); @@ -28399,10 +29672,8 @@ function parseType(source, options) { * * @internal */ - class Parser { - constructor(source) { - let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + constructor(source, options = {}) { const sourceObj = (0, _source.isSource)(source) ? source : new _source.Source(source); this._lexer = new _lexer.Lexer(sourceObj); this._options = options; @@ -28411,19 +29682,17 @@ class Parser { /** * Converts a name lex token into a name parse node. */ - parseName() { const token = this.expectToken(_tokenKind.TokenKind.NAME); return this.node(token, { kind: _kinds.Kind.NAME, value: token.value }); - } // Implements the parsing rules in the Document section. - + } + // Implements the parsing rules in the Document section. /** * Document : Definition+ */ - parseDocument() { return this.node(this._lexer.token, { kind: _kinds.Kind.DOCUMENT, @@ -28453,12 +29722,11 @@ class Parser { * - EnumTypeDefinition * - InputObjectTypeDefinition */ - parseDefinition() { if (this.peek(_tokenKind.TokenKind.BRACE_L)) { return this.parseOperationDefinition(); - } // Many definitions begin with a description and require a lookahead. - + } + // Many definitions begin with a description and require a lookahead. const hasDescription = this.peekDescription(); const keywordToken = hasDescription ? this._lexer.lookahead() : this._lexer.token; if (keywordToken.kind === _tokenKind.TokenKind.NAME) { @@ -28495,14 +29763,13 @@ class Parser { } } throw this.unexpected(keywordToken); - } // Implements the parsing rules in the Operations section. - + } + // Implements the parsing rules in the Operations section. /** * OperationDefinition : * - SelectionSet * - OperationType Name? VariableDefinitions? Directives? SelectionSet */ - parseOperationDefinition() { const start = this._lexer.token; if (this.peek(_tokenKind.TokenKind.BRACE_L)) { @@ -28532,7 +29799,6 @@ class Parser { /** * OperationType : one of query mutation subscription */ - parseOperationType() { const operationToken = this.expectToken(_tokenKind.TokenKind.NAME); switch (operationToken.value) { @@ -28548,14 +29814,12 @@ class Parser { /** * VariableDefinitions : ( VariableDefinition+ ) */ - parseVariableDefinitions() { return this.optionalMany(_tokenKind.TokenKind.PAREN_L, this.parseVariableDefinition, _tokenKind.TokenKind.PAREN_R); } /** * VariableDefinition : Variable : Type DefaultValue? Directives[Const]? */ - parseVariableDefinition() { return this.node(this._lexer.token, { kind: _kinds.Kind.VARIABLE_DEFINITION, @@ -28568,7 +29832,6 @@ class Parser { /** * Variable : $ Name */ - parseVariable() { const start = this._lexer.token; this.expectToken(_tokenKind.TokenKind.DOLLAR); @@ -28582,7 +29845,6 @@ class Parser { * SelectionSet : { Selection+ } * ``` */ - parseSelectionSet() { return this.node(this._lexer.token, { kind: _kinds.Kind.SELECTION_SET, @@ -28595,7 +29857,6 @@ class Parser { * - FragmentSpread * - InlineFragment */ - parseSelection() { return this.peek(_tokenKind.TokenKind.SPREAD) ? this.parseFragment() : this.parseField(); } @@ -28604,7 +29865,6 @@ class Parser { * * Alias : Name : */ - parseField() { const start = this._lexer.token; const nameOrAlias = this.parseName(); @@ -28621,24 +29881,48 @@ class Parser { alias, name, arguments: this.parseArguments(false), + // Experimental support for Client Controlled Nullability changes + // the grammar of Field: + nullabilityAssertion: this.parseNullabilityAssertion(), directives: this.parseDirectives(false), selectionSet: this.peek(_tokenKind.TokenKind.BRACE_L) ? this.parseSelectionSet() : undefined }); } - /** - * Arguments[Const] : ( Argument[?Const]+ ) - */ - + // TODO: add grammar comment after it finalizes + parseNullabilityAssertion() { + // Note: Client Controlled Nullability is experimental and may be changed or + // removed in the future. + if (this._options.experimentalClientControlledNullability !== true) { + return undefined; + } + const start = this._lexer.token; + let nullabilityAssertion; + if (this.expectOptionalToken(_tokenKind.TokenKind.BRACKET_L)) { + const innerModifier = this.parseNullabilityAssertion(); + this.expectToken(_tokenKind.TokenKind.BRACKET_R); + nullabilityAssertion = this.node(start, { + kind: _kinds.Kind.LIST_NULLABILITY_OPERATOR, + nullabilityAssertion: innerModifier + }); + } + if (this.expectOptionalToken(_tokenKind.TokenKind.BANG)) { + nullabilityAssertion = this.node(start, { + kind: _kinds.Kind.NON_NULL_ASSERTION, + nullabilityAssertion + }); + } else if (this.expectOptionalToken(_tokenKind.TokenKind.QUESTION_MARK)) { + nullabilityAssertion = this.node(start, { + kind: _kinds.Kind.ERROR_BOUNDARY, + nullabilityAssertion + }); + } + return nullabilityAssertion; + } parseArguments(isConst) { const item = isConst ? this.parseConstArgument : this.parseArgument; return this.optionalMany(_tokenKind.TokenKind.PAREN_L, item, _tokenKind.TokenKind.PAREN_R); } - /** - * Argument[Const] : Name : Value[?Const] - */ - - parseArgument() { - let isConst = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + parseArgument(isConst = false) { const start = this._lexer.token; const name = this.parseName(); this.expectToken(_tokenKind.TokenKind.COLON); @@ -28650,8 +29934,8 @@ class Parser { } parseConstArgument() { return this.parseArgument(true); - } // Implements the parsing rules in the Fragments section. - + } + // Implements the parsing rules in the Fragments section. /** * Corresponds to both FragmentSpread and InlineFragment in the spec. * @@ -28659,7 +29943,6 @@ class Parser { * * InlineFragment : ... TypeCondition? Directives? SelectionSet */ - parseFragment() { const start = this._lexer.token; this.expectToken(_tokenKind.TokenKind.SPREAD); @@ -28684,13 +29967,12 @@ class Parser { * * TypeCondition : NamedType */ - parseFragmentDefinition() { const start = this._lexer.token; - this.expectKeyword('fragment'); // Legacy support for defining variables within fragments changes + this.expectKeyword('fragment'); + // Legacy support for defining variables within fragments changes // the grammar of FragmentDefinition: // - fragment FragmentName VariableDefinitions? on TypeCondition Directives? SelectionSet - if (this._options.allowLegacyFragmentVariables === true) { return this.node(start, { kind: _kinds.Kind.FRAGMENT_DEFINITION, @@ -28712,33 +29994,12 @@ class Parser { /** * FragmentName : Name but not `on` */ - parseFragmentName() { if (this._lexer.token.value === 'on') { throw this.unexpected(); } return this.parseName(); - } // Implements the parsing rules in the Values section. - - /** - * Value[Const] : - * - [~Const] Variable - * - IntValue - * - FloatValue - * - StringValue - * - BooleanValue - * - NullValue - * - EnumValue - * - ListValue[?Const] - * - ObjectValue[?Const] - * - * BooleanValue : one of `true` `false` - * - * NullValue : `null` - * - * EnumValue : Name but not `true`, `false` or `null` - */ - + } parseValueLiteral(isConst) { const token = this._lexer.token; switch (token.kind) { @@ -28811,12 +30072,6 @@ class Parser { block: token.kind === _tokenKind.TokenKind.BLOCK_STRING }); } - /** - * ListValue[Const] : - * - [ ] - * - [ Value[?Const]+ ] - */ - parseList(isConst) { const item = () => this.parseValueLiteral(isConst); return this.node(this._lexer.token, { @@ -28824,14 +30079,6 @@ class Parser { values: this.any(_tokenKind.TokenKind.BRACKET_L, item, _tokenKind.TokenKind.BRACKET_R) }); } - /** - * ``` - * ObjectValue[Const] : - * - { } - * - { ObjectField[?Const]+ } - * ``` - */ - parseObject(isConst) { const item = () => this.parseObjectField(isConst); return this.node(this._lexer.token, { @@ -28839,10 +30086,6 @@ class Parser { fields: this.any(_tokenKind.TokenKind.BRACE_L, item, _tokenKind.TokenKind.BRACE_R) }); } - /** - * ObjectField[Const] : Name : Value[?Const] - */ - parseObjectField(isConst) { const start = this._lexer.token; const name = this.parseName(); @@ -28852,12 +30095,7 @@ class Parser { name, value: this.parseValueLiteral(isConst) }); - } // Implements the parsing rules in the Directives section. - - /** - * Directives[Const] : Directive[?Const]+ - */ - + } parseDirectives(isConst) { const directives = []; while (this.peek(_tokenKind.TokenKind.AT)) { @@ -28868,12 +30106,6 @@ class Parser { parseConstDirectives() { return this.parseDirectives(true); } - /** - * ``` - * Directive[Const] : @ Name Arguments[?Const]? - * ``` - */ - parseDirective(isConst) { const start = this._lexer.token; this.expectToken(_tokenKind.TokenKind.AT); @@ -28882,15 +30114,14 @@ class Parser { name: this.parseName(), arguments: this.parseArguments(isConst) }); - } // Implements the parsing rules in the Types section. - + } + // Implements the parsing rules in the Types section. /** * Type : * - NamedType * - ListType * - NonNullType */ - parseTypeReference() { const start = this._lexer.token; let type; @@ -28915,21 +30146,19 @@ class Parser { /** * NamedType : Name */ - parseNamedType() { return this.node(this._lexer.token, { kind: _kinds.Kind.NAMED_TYPE, name: this.parseName() }); - } // Implements the parsing rules in the Type Definition section. - + } + // Implements the parsing rules in the Type Definition section. peekDescription() { return this.peek(_tokenKind.TokenKind.STRING) || this.peek(_tokenKind.TokenKind.BLOCK_STRING); } /** * Description : StringValue */ - parseDescription() { if (this.peekDescription()) { return this.parseStringLiteral(); @@ -28940,7 +30169,6 @@ class Parser { * SchemaDefinition : Description? schema Directives[Const]? { OperationTypeDefinition+ } * ``` */ - parseSchemaDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -28957,7 +30185,6 @@ class Parser { /** * OperationTypeDefinition : OperationType : NamedType */ - parseOperationTypeDefinition() { const start = this._lexer.token; const operation = this.parseOperationType(); @@ -28972,7 +30199,6 @@ class Parser { /** * ScalarTypeDefinition : Description? scalar Name Directives[Const]? */ - parseScalarTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -28991,7 +30217,6 @@ class Parser { * Description? * type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition? */ - parseObjectTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -29014,7 +30239,6 @@ class Parser { * - implements `&`? NamedType * - ImplementsInterfaces & NamedType */ - parseImplementsInterfaces() { return this.expectOptionalKeyword('implements') ? this.delimitedMany(_tokenKind.TokenKind.AMP, this.parseNamedType) : []; } @@ -29023,7 +30247,6 @@ class Parser { * FieldsDefinition : { FieldDefinition+ } * ``` */ - parseFieldsDefinition() { return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseFieldDefinition, _tokenKind.TokenKind.BRACE_R); } @@ -29031,7 +30254,6 @@ class Parser { * FieldDefinition : * - Description? Name ArgumentsDefinition? : Type Directives[Const]? */ - parseFieldDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -29052,7 +30274,6 @@ class Parser { /** * ArgumentsDefinition : ( InputValueDefinition+ ) */ - parseArgumentDefs() { return this.optionalMany(_tokenKind.TokenKind.PAREN_L, this.parseInputValueDef, _tokenKind.TokenKind.PAREN_R); } @@ -29060,7 +30281,6 @@ class Parser { * InputValueDefinition : * - Description? Name : Type DefaultValue? Directives[Const]? */ - parseInputValueDef() { const start = this._lexer.token; const description = this.parseDescription(); @@ -29085,7 +30305,6 @@ class Parser { * InterfaceTypeDefinition : * - Description? interface Name Directives[Const]? FieldsDefinition? */ - parseInterfaceTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -29107,7 +30326,6 @@ class Parser { * UnionTypeDefinition : * - Description? union Name Directives[Const]? UnionMemberTypes? */ - parseUnionTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -29128,7 +30346,6 @@ class Parser { * - = `|`? NamedType * - UnionMemberTypes | NamedType */ - parseUnionMemberTypes() { return this.expectOptionalToken(_tokenKind.TokenKind.EQUALS) ? this.delimitedMany(_tokenKind.TokenKind.PIPE, this.parseNamedType) : []; } @@ -29136,7 +30353,6 @@ class Parser { * EnumTypeDefinition : * - Description? enum Name Directives[Const]? EnumValuesDefinition? */ - parseEnumTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -29157,14 +30373,12 @@ class Parser { * EnumValuesDefinition : { EnumValueDefinition+ } * ``` */ - parseEnumValuesDefinition() { return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseEnumValueDefinition, _tokenKind.TokenKind.BRACE_R); } /** * EnumValueDefinition : Description? EnumValue Directives[Const]? */ - parseEnumValueDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -29180,7 +30394,6 @@ class Parser { /** * EnumValue : Name but not `true`, `false` or `null` */ - parseEnumValueName() { if (this._lexer.token.value === 'true' || this._lexer.token.value === 'false' || this._lexer.token.value === 'null') { throw (0, _syntaxError.syntaxError)(this._lexer.source, this._lexer.token.start, `${getTokenDesc(this._lexer.token)} is reserved and cannot be used for an enum value.`); @@ -29191,7 +30404,6 @@ class Parser { * InputObjectTypeDefinition : * - Description? input Name Directives[Const]? InputFieldsDefinition? */ - parseInputObjectTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -29212,7 +30424,6 @@ class Parser { * InputFieldsDefinition : { InputValueDefinition+ } * ``` */ - parseInputFieldsDefinition() { return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseInputValueDef, _tokenKind.TokenKind.BRACE_R); } @@ -29229,7 +30440,6 @@ class Parser { * - EnumTypeExtension * - InputObjectTypeDefinition */ - parseTypeSystemExtension() { const keywordToken = this._lexer.lookahead(); if (keywordToken.kind === _tokenKind.TokenKind.NAME) { @@ -29259,7 +30469,6 @@ class Parser { * - extend schema Directives[Const] * ``` */ - parseSchemaExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -29279,7 +30488,6 @@ class Parser { * ScalarTypeExtension : * - extend scalar Name Directives[Const] */ - parseScalarTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -29301,7 +30509,6 @@ class Parser { * - extend type Name ImplementsInterfaces? Directives[Const] * - extend type Name ImplementsInterfaces */ - parseObjectTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -29327,7 +30534,6 @@ class Parser { * - extend interface Name ImplementsInterfaces? Directives[Const] * - extend interface Name ImplementsInterfaces */ - parseInterfaceTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -29352,7 +30558,6 @@ class Parser { * - extend union Name Directives[Const]? UnionMemberTypes * - extend union Name Directives[Const] */ - parseUnionTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -29375,7 +30580,6 @@ class Parser { * - extend enum Name Directives[Const]? EnumValuesDefinition * - extend enum Name Directives[Const] */ - parseEnumTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -29398,7 +30602,6 @@ class Parser { * - extend input Name Directives[Const]? InputFieldsDefinition * - extend input Name Directives[Const] */ - parseInputObjectTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -29422,7 +30625,6 @@ class Parser { * - Description? directive @ Name ArgumentsDefinition? `repeatable`? on DirectiveLocations * ``` */ - parseDirectiveDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -29447,7 +30649,6 @@ class Parser { * - `|`? DirectiveLocation * - DirectiveLocations | DirectiveLocation */ - parseDirectiveLocations() { return this.delimitedMany(_tokenKind.TokenKind.PIPE, this.parseDirectiveLocation); } @@ -29478,22 +30679,20 @@ class Parser { * `INPUT_OBJECT` * `INPUT_FIELD_DEFINITION` */ - parseDirectiveLocation() { const start = this._lexer.token; const name = this.parseName(); - if (Object.prototype.hasOwnProperty.call(_directiveLocation.DirectiveLocation, name.value)) { + if (Object.hasOwn(_directiveLocation.DirectiveLocation, name.value)) { return name; } throw this.unexpected(start); - } // Core parsing utility functions - + } + // Core parsing utility functions /** * Returns a node that, if configured to do so, sets a "loc" field as a * location object, used to identify the place in the source that created a * given parsed object. */ - node(startToken, node) { if (this._options.noLocation !== true) { node.loc = new _ast.Location(startToken, this._lexer.lastToken, this._lexer.source); @@ -29503,7 +30702,6 @@ class Parser { /** * Determines if the next token is of a given kind */ - peek(kind) { return this._lexer.token.kind === kind; } @@ -29511,7 +30709,6 @@ class Parser { * If the next token is of the given kind, return that token after advancing the lexer. * Otherwise, do not change the parser state and throw an error. */ - expectToken(kind) { const token = this._lexer.token; if (token.kind === kind) { @@ -29524,7 +30721,6 @@ class Parser { * If the next token is of the given kind, return "true" after advancing the lexer. * Otherwise, do not change the parser state and return "false". */ - expectOptionalToken(kind) { const token = this._lexer.token; if (token.kind === kind) { @@ -29537,7 +30733,6 @@ class Parser { * If the next token is a given keyword, advance the lexer. * Otherwise, do not change the parser state and throw an error. */ - expectKeyword(value) { const token = this._lexer.token; if (token.kind === _tokenKind.TokenKind.NAME && token.value === value) { @@ -29550,7 +30745,6 @@ class Parser { * If the next token is a given keyword, return "true" after advancing the lexer. * Otherwise, do not change the parser state and return "false". */ - expectOptionalKeyword(value) { const token = this._lexer.token; if (token.kind === _tokenKind.TokenKind.NAME && token.value === value) { @@ -29562,7 +30756,6 @@ class Parser { /** * Helper function for creating an error when an unexpected lexed token is encountered. */ - unexpected(atToken) { const token = atToken !== null && atToken !== void 0 ? atToken : this._lexer.token; return (0, _syntaxError.syntaxError)(this._lexer.source, token.start, `Unexpected ${getTokenDesc(token)}.`); @@ -29572,7 +30765,6 @@ class Parser { * This list begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ - any(openKind, parseFn, closeKind) { this.expectToken(openKind); const nodes = []; @@ -29587,7 +30779,6 @@ class Parser { * that begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ - optionalMany(openKind, parseFn, closeKind) { if (this.expectOptionalToken(openKind)) { const nodes = []; @@ -29603,7 +30794,6 @@ class Parser { * This list begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ - many(openKind, parseFn, closeKind) { this.expectToken(openKind); const nodes = []; @@ -29617,7 +30807,6 @@ class Parser { * This list may begin with a lex token of delimiterKind followed by items separated by lex tokens of tokenKind. * Advances the parser to the next lex token after last item in the list. */ - delimitedMany(delimiterKind, parseFn) { this.expectOptionalToken(delimiterKind); const nodes = []; @@ -29634,7 +30823,7 @@ class Parser { if (maxTokens !== undefined && token.kind !== _tokenKind.TokenKind.EOF) { ++this._tokenCounter; if (this._tokenCounter > maxTokens) { - throw (0, _syntaxError.syntaxError)(this._lexer.source, token.start, `Document contains more that ${maxTokens} tokens. Parsing aborted.`); + throw (0, _syntaxError.syntaxError)(this._lexer.source, token.start, `Document contains more than ${maxTokens} tokens. Parsing aborted.`); } } } @@ -29650,7 +30839,6 @@ function getTokenDesc(token) { /** * A helper function to describe a token kind as a string for debugging. */ - function getTokenKindDesc(kind) { return (0, _lexer.isPunctuatorTokenKind)(kind) ? `"${kind}"` : kind; } @@ -29671,6 +30859,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.isConstValueNode = isConstValueNode; exports.isDefinitionNode = isDefinitionNode; exports.isExecutableDefinitionNode = isExecutableDefinitionNode; +exports.isNullabilityAssertionNode = isNullabilityAssertionNode; exports.isSelectionNode = isSelectionNode; exports.isTypeDefinitionNode = isTypeDefinitionNode; exports.isTypeExtensionNode = isTypeExtensionNode; @@ -29688,6 +30877,9 @@ function isExecutableDefinitionNode(node) { function isSelectionNode(node) { return node.kind === _kinds.Kind.FIELD || node.kind === _kinds.Kind.FRAGMENT_SPREAD || node.kind === _kinds.Kind.INLINE_FRAGMENT; } +function isNullabilityAssertionNode(node) { + return node.kind === _kinds.Kind.LIST_NULLABILITY_OPERATOR || node.kind === _kinds.Kind.NON_NULL_ASSERTION || node.kind === _kinds.Kind.ERROR_BOUNDARY; +} function isValueNode(node) { return node.kind === _kinds.Kind.VARIABLE || node.kind === _kinds.Kind.INT || node.kind === _kinds.Kind.FLOAT || node.kind === _kinds.Kind.STRING || node.kind === _kinds.Kind.BOOLEAN || node.kind === _kinds.Kind.NULL || node.kind === _kinds.Kind.ENUM || node.kind === _kinds.Kind.LIST || node.kind === _kinds.Kind.OBJECT; } @@ -29735,7 +30927,6 @@ function printLocation(location) { /** * Render a helpful description of the location in the GraphQL Source document. */ - function printSourceLocation(source, sourceLocation) { const firstLineColumnOffset = source.locationOffset.column - 1; const body = ''.padStart(firstLineColumnOffset) + source.body; @@ -29746,8 +30937,8 @@ function printSourceLocation(source, sourceLocation) { const columnNum = sourceLocation.column + columnOffset; const locationStr = `${source.name}:${lineNum}:${columnNum}\n`; const lines = body.split(/\r\n|[\n\r]/g); - const locationLine = lines[lineIndex]; // Special case for minified documents - + const locationLine = lines[lineIndex]; + // Special case for minified documents if (locationLine.length > 120) { const subLineIndex = Math.floor(columnNum / 80); const subLineColumnNum = columnNum % 80; @@ -29762,18 +30953,9 @@ function printSourceLocation(source, sourceLocation) { [`${lineNum - 1} |`, lines[lineIndex - 1]], [`${lineNum} |`, locationLine], ['|', '^'.padStart(columnNum)], [`${lineNum + 1} |`, lines[lineIndex + 1]]]); } function printPrefixedLines(lines) { - const existingLines = lines.filter(_ref => { - let [_, line] = _ref; - return line !== undefined; - }); - const padLen = Math.max(...existingLines.map(_ref2 => { - let [prefix] = _ref2; - return prefix.length; - })); - return existingLines.map(_ref3 => { - let [prefix, line] = _ref3; - return prefix.padStart(padLen) + (line ? ' ' + line : ''); - }).join('\n'); + const existingLines = lines.filter(([_, line]) => line !== undefined); + const padLen = Math.max(...existingLines.map(([prefix]) => prefix.length)); + return existingLines.map(([prefix, line]) => prefix.padStart(padLen) + (line ? ' ' + line : '')).join('\n'); } /***/ }), @@ -29796,24 +30978,14 @@ exports.printString = printString; */ function printString(str) { return `"${str.replace(escapedRegExp, escapedReplacer)}"`; -} // eslint-disable-next-line no-control-regex - +} +// eslint-disable-next-line no-control-regex const escapedRegExp = /[\x00-\x1f\x22\x5c\x7f-\x9f]/g; function escapedReplacer(str) { return escapeSequences[str.charCodeAt(0)]; -} // prettier-ignore - -const escapeSequences = ['\\u0000', '\\u0001', '\\u0002', '\\u0003', '\\u0004', '\\u0005', '\\u0006', '\\u0007', '\\b', '\\t', '\\n', '\\u000B', '\\f', '\\r', '\\u000E', '\\u000F', '\\u0010', '\\u0011', '\\u0012', '\\u0013', '\\u0014', '\\u0015', '\\u0016', '\\u0017', '\\u0018', '\\u0019', '\\u001A', '\\u001B', '\\u001C', '\\u001D', '\\u001E', '\\u001F', '', '', '\\"', '', '', '', '', '', '', '', '', '', '', '', '', '', -// 2F -'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', -// 3F -'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', -// 4F -'', '', '', '', '', '', '', '', '', '', '', '', '\\\\', '', '', '', -// 5F -'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', -// 6F -'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\u007F', '\\u0080', '\\u0081', '\\u0082', '\\u0083', '\\u0084', '\\u0085', '\\u0086', '\\u0087', '\\u0088', '\\u0089', '\\u008A', '\\u008B', '\\u008C', '\\u008D', '\\u008E', '\\u008F', '\\u0090', '\\u0091', '\\u0092', '\\u0093', '\\u0094', '\\u0095', '\\u0096', '\\u0097', '\\u0098', '\\u0099', '\\u009A', '\\u009B', '\\u009C', '\\u009D', '\\u009E', '\\u009F']; +} +// prettier-ignore +const escapeSequences = ['\\u0000', '\\u0001', '\\u0002', '\\u0003', '\\u0004', '\\u0005', '\\u0006', '\\u0007', '\\b', '\\t', '\\n', '\\u000B', '\\f', '\\r', '\\u000E', '\\u000F', '\\u0010', '\\u0011', '\\u0012', '\\u0013', '\\u0014', '\\u0015', '\\u0016', '\\u0017', '\\u0018', '\\u0019', '\\u001A', '\\u001B', '\\u001C', '\\u001D', '\\u001E', '\\u001F', '', '', '\\"', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\\\', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\u007F', '\\u0080', '\\u0081', '\\u0082', '\\u0083', '\\u0084', '\\u0085', '\\u0086', '\\u0087', '\\u0088', '\\u0089', '\\u008A', '\\u008B', '\\u008C', '\\u008D', '\\u008E', '\\u008F', '\\u0090', '\\u0091', '\\u0092', '\\u0093', '\\u0094', '\\u0095', '\\u0096', '\\u0097', '\\u0098', '\\u0099', '\\u009A', '\\u009B', '\\u009C', '\\u009D', '\\u009E', '\\u009F']; /***/ }), @@ -29836,7 +31008,6 @@ var _visitor = __webpack_require__(/*! ./visitor.mjs */ "../../../node_modules/g * Converts an AST into a string, using one set of reasonable * formatting rules. */ - function print(ast) { return (0, _visitor.visit)(ast, printDocASTReducer); } @@ -29855,435 +31026,350 @@ const printDocASTReducer = { OperationDefinition: { leave(node) { const varDefs = wrap('(', join(node.variableDefinitions, ', '), ')'); - const prefix = join([node.operation, join([node.name, varDefs]), join(node.directives, ' ')], ' '); // Anonymous queries with no directives or variable definitions can use + const prefix = join([node.operation, join([node.name, varDefs]), join(node.directives, ' ')], ' '); + // Anonymous queries with no directives or variable definitions can use // the query short form. - return (prefix === 'query' ? '' : prefix + ' ') + node.selectionSet; } }, VariableDefinition: { - leave: _ref => { - let { - variable, - type, - defaultValue, - directives - } = _ref; - return variable + ': ' + type + wrap(' = ', defaultValue) + wrap(' ', join(directives, ' ')); - } + leave: ({ + variable, + type, + defaultValue, + directives + }) => variable + ': ' + type + wrap(' = ', defaultValue) + wrap(' ', join(directives, ' ')) }, SelectionSet: { - leave: _ref2 => { - let { - selections - } = _ref2; - return block(selections); - } + leave: ({ + selections + }) => block(selections) }, Field: { - leave(_ref3) { - let { - alias, - name, - arguments: args, - directives, - selectionSet - } = _ref3; - const prefix = wrap('', alias, ': ') + name; + leave({ + alias, + name, + arguments: args, + nullabilityAssertion, + directives, + selectionSet + }) { + const prefix = join([wrap('', alias, ': '), name], ''); let argsLine = prefix + wrap('(', join(args, ', '), ')'); if (argsLine.length > MAX_LINE_LENGTH) { argsLine = prefix + wrap('(\n', indent(join(args, '\n')), '\n)'); } - return join([argsLine, join(directives, ' '), selectionSet], ' '); + return join([argsLine, + // Note: Client Controlled Nullability is experimental and may be + // changed or removed in the future. + nullabilityAssertion, wrap(' ', join(directives, ' ')), wrap(' ', selectionSet)]); } }, Argument: { - leave: _ref4 => { - let { - name, - value - } = _ref4; - return name + ': ' + value; + leave: ({ + name, + value + }) => name + ': ' + value + }, + // Nullability Modifiers + ListNullabilityOperator: { + leave({ + nullabilityAssertion + }) { + return join(['[', nullabilityAssertion, ']']); + } + }, + NonNullAssertion: { + leave({ + nullabilityAssertion + }) { + return join([nullabilityAssertion, '!']); + } + }, + ErrorBoundary: { + leave({ + nullabilityAssertion + }) { + return join([nullabilityAssertion, '?']); } }, // Fragments FragmentSpread: { - leave: _ref5 => { - let { - name, - directives - } = _ref5; - return '...' + name + wrap(' ', join(directives, ' ')); - } + leave: ({ + name, + directives + }) => '...' + name + wrap(' ', join(directives, ' ')) }, InlineFragment: { - leave: _ref6 => { - let { - typeCondition, - directives, - selectionSet - } = _ref6; - return join(['...', wrap('on ', typeCondition), join(directives, ' '), selectionSet], ' '); - } + leave: ({ + typeCondition, + directives, + selectionSet + }) => join(['...', wrap('on ', typeCondition), join(directives, ' '), selectionSet], ' ') }, FragmentDefinition: { - leave: (_ref7 // Note: fragment variable definitions are experimental and may be changed - ) => { - let { - name, - typeCondition, - variableDefinitions, - directives, - selectionSet - } = _ref7; - return ( - // or removed in the future. - `fragment ${name}${wrap('(', join(variableDefinitions, ', '), ')')} ` + `on ${typeCondition} ${wrap('', join(directives, ' '), ' ')}` + selectionSet - ); - } + leave: ({ + name, + typeCondition, + variableDefinitions, + directives, + selectionSet + }) => + // Note: fragment variable definitions are experimental and may be changed + // or removed in the future. + `fragment ${name}${wrap('(', join(variableDefinitions, ', '), ')')} ` + `on ${typeCondition} ${wrap('', join(directives, ' '), ' ')}` + selectionSet }, // Value IntValue: { - leave: _ref8 => { - let { - value - } = _ref8; - return value; - } + leave: ({ + value + }) => value }, FloatValue: { - leave: _ref9 => { - let { - value - } = _ref9; - return value; - } + leave: ({ + value + }) => value }, StringValue: { - leave: _ref10 => { - let { - value, - block: isBlockString - } = _ref10; - return isBlockString ? (0, _blockString.printBlockString)(value) : (0, _printString.printString)(value); - } + leave: ({ + value, + block: isBlockString + }) => isBlockString === true ? (0, _blockString.printBlockString)(value) : (0, _printString.printString)(value) }, BooleanValue: { - leave: _ref11 => { - let { - value - } = _ref11; - return value ? 'true' : 'false'; - } + leave: ({ + value + }) => value ? 'true' : 'false' }, NullValue: { leave: () => 'null' }, EnumValue: { - leave: _ref12 => { - let { - value - } = _ref12; - return value; - } + leave: ({ + value + }) => value }, ListValue: { - leave: _ref13 => { - let { - values - } = _ref13; - return '[' + join(values, ', ') + ']'; + leave: ({ + values + }) => { + const valuesLine = '[' + join(values, ', ') + ']'; + if (valuesLine.length > MAX_LINE_LENGTH) { + return '[\n' + indent(join(values, '\n')) + '\n]'; + } + return valuesLine; } }, ObjectValue: { - leave: _ref14 => { - let { - fields - } = _ref14; - return '{' + join(fields, ', ') + '}'; + leave: ({ + fields + }) => { + const fieldsLine = '{ ' + join(fields, ', ') + ' }'; + return fieldsLine.length > MAX_LINE_LENGTH ? block(fields) : fieldsLine; } }, ObjectField: { - leave: _ref15 => { - let { - name, - value - } = _ref15; - return name + ': ' + value; - } + leave: ({ + name, + value + }) => name + ': ' + value }, // Directive Directive: { - leave: _ref16 => { - let { - name, - arguments: args - } = _ref16; - return '@' + name + wrap('(', join(args, ', '), ')'); - } + leave: ({ + name, + arguments: args + }) => '@' + name + wrap('(', join(args, ', '), ')') }, // Type NamedType: { - leave: _ref17 => { - let { - name - } = _ref17; - return name; - } + leave: ({ + name + }) => name }, ListType: { - leave: _ref18 => { - let { - type - } = _ref18; - return '[' + type + ']'; - } + leave: ({ + type + }) => '[' + type + ']' }, NonNullType: { - leave: _ref19 => { - let { - type - } = _ref19; - return type + '!'; - } + leave: ({ + type + }) => type + '!' }, // Type System Definitions SchemaDefinition: { - leave: _ref20 => { - let { - description, - directives, - operationTypes - } = _ref20; - return wrap('', description, '\n') + join(['schema', join(directives, ' '), block(operationTypes)], ' '); - } + leave: ({ + description, + directives, + operationTypes + }) => wrap('', description, '\n') + join(['schema', join(directives, ' '), block(operationTypes)], ' ') }, OperationTypeDefinition: { - leave: _ref21 => { - let { - operation, - type - } = _ref21; - return operation + ': ' + type; - } + leave: ({ + operation, + type + }) => operation + ': ' + type }, ScalarTypeDefinition: { - leave: _ref22 => { - let { - description, - name, - directives - } = _ref22; - return wrap('', description, '\n') + join(['scalar', name, join(directives, ' ')], ' '); - } + leave: ({ + description, + name, + directives + }) => wrap('', description, '\n') + join(['scalar', name, join(directives, ' ')], ' ') }, ObjectTypeDefinition: { - leave: _ref23 => { - let { - description, - name, - interfaces, - directives, - fields - } = _ref23; - return wrap('', description, '\n') + join(['type', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' '); - } + leave: ({ + description, + name, + interfaces, + directives, + fields + }) => wrap('', description, '\n') + join(['type', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ') }, FieldDefinition: { - leave: _ref24 => { - let { - description, - name, - arguments: args, - type, - directives - } = _ref24; - return wrap('', description, '\n') + name + (hasMultilineItems(args) ? wrap('(\n', indent(join(args, '\n')), '\n)') : wrap('(', join(args, ', '), ')')) + ': ' + type + wrap(' ', join(directives, ' ')); - } + leave: ({ + description, + name, + arguments: args, + type, + directives + }) => wrap('', description, '\n') + name + (hasMultilineItems(args) ? wrap('(\n', indent(join(args, '\n')), '\n)') : wrap('(', join(args, ', '), ')')) + ': ' + type + wrap(' ', join(directives, ' ')) }, InputValueDefinition: { - leave: _ref25 => { - let { - description, - name, - type, - defaultValue, - directives - } = _ref25; - return wrap('', description, '\n') + join([name + ': ' + type, wrap('= ', defaultValue), join(directives, ' ')], ' '); - } + leave: ({ + description, + name, + type, + defaultValue, + directives + }) => wrap('', description, '\n') + join([name + ': ' + type, wrap('= ', defaultValue), join(directives, ' ')], ' ') }, InterfaceTypeDefinition: { - leave: _ref26 => { - let { - description, - name, - interfaces, - directives, - fields - } = _ref26; - return wrap('', description, '\n') + join(['interface', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' '); - } + leave: ({ + description, + name, + interfaces, + directives, + fields + }) => wrap('', description, '\n') + join(['interface', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ') }, UnionTypeDefinition: { - leave: _ref27 => { - let { - description, - name, - directives, - types - } = _ref27; - return wrap('', description, '\n') + join(['union', name, join(directives, ' '), wrap('= ', join(types, ' | '))], ' '); - } + leave: ({ + description, + name, + directives, + types + }) => wrap('', description, '\n') + join(['union', name, join(directives, ' '), wrap('= ', join(types, ' | '))], ' ') }, EnumTypeDefinition: { - leave: _ref28 => { - let { - description, - name, - directives, - values - } = _ref28; - return wrap('', description, '\n') + join(['enum', name, join(directives, ' '), block(values)], ' '); - } + leave: ({ + description, + name, + directives, + values + }) => wrap('', description, '\n') + join(['enum', name, join(directives, ' '), block(values)], ' ') }, EnumValueDefinition: { - leave: _ref29 => { - let { - description, - name, - directives - } = _ref29; - return wrap('', description, '\n') + join([name, join(directives, ' ')], ' '); - } + leave: ({ + description, + name, + directives + }) => wrap('', description, '\n') + join([name, join(directives, ' ')], ' ') }, InputObjectTypeDefinition: { - leave: _ref30 => { - let { - description, - name, - directives, - fields - } = _ref30; - return wrap('', description, '\n') + join(['input', name, join(directives, ' '), block(fields)], ' '); - } + leave: ({ + description, + name, + directives, + fields + }) => wrap('', description, '\n') + join(['input', name, join(directives, ' '), block(fields)], ' ') }, DirectiveDefinition: { - leave: _ref31 => { - let { - description, - name, - arguments: args, - repeatable, - locations - } = _ref31; - return wrap('', description, '\n') + 'directive @' + name + (hasMultilineItems(args) ? wrap('(\n', indent(join(args, '\n')), '\n)') : wrap('(', join(args, ', '), ')')) + (repeatable ? ' repeatable' : '') + ' on ' + join(locations, ' | '); - } + leave: ({ + description, + name, + arguments: args, + repeatable, + locations + }) => wrap('', description, '\n') + 'directive @' + name + (hasMultilineItems(args) ? wrap('(\n', indent(join(args, '\n')), '\n)') : wrap('(', join(args, ', '), ')')) + (repeatable ? ' repeatable' : '') + ' on ' + join(locations, ' | ') }, SchemaExtension: { - leave: _ref32 => { - let { - directives, - operationTypes - } = _ref32; - return join(['extend schema', join(directives, ' '), block(operationTypes)], ' '); - } + leave: ({ + directives, + operationTypes + }) => join(['extend schema', join(directives, ' '), block(operationTypes)], ' ') }, ScalarTypeExtension: { - leave: _ref33 => { - let { - name, - directives - } = _ref33; - return join(['extend scalar', name, join(directives, ' ')], ' '); - } + leave: ({ + name, + directives + }) => join(['extend scalar', name, join(directives, ' ')], ' ') }, ObjectTypeExtension: { - leave: _ref34 => { - let { - name, - interfaces, - directives, - fields - } = _ref34; - return join(['extend type', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' '); - } + leave: ({ + name, + interfaces, + directives, + fields + }) => join(['extend type', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ') }, InterfaceTypeExtension: { - leave: _ref35 => { - let { - name, - interfaces, - directives, - fields - } = _ref35; - return join(['extend interface', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' '); - } + leave: ({ + name, + interfaces, + directives, + fields + }) => join(['extend interface', name, wrap('implements ', join(interfaces, ' & ')), join(directives, ' '), block(fields)], ' ') }, UnionTypeExtension: { - leave: _ref36 => { - let { - name, - directives, - types - } = _ref36; - return join(['extend union', name, join(directives, ' '), wrap('= ', join(types, ' | '))], ' '); - } + leave: ({ + name, + directives, + types + }) => join(['extend union', name, join(directives, ' '), wrap('= ', join(types, ' | '))], ' ') }, EnumTypeExtension: { - leave: _ref37 => { - let { - name, - directives, - values - } = _ref37; - return join(['extend enum', name, join(directives, ' '), block(values)], ' '); - } + leave: ({ + name, + directives, + values + }) => join(['extend enum', name, join(directives, ' '), block(values)], ' ') }, InputObjectTypeExtension: { - leave: _ref38 => { - let { - name, - directives, - fields - } = _ref38; - return join(['extend input', name, join(directives, ' '), block(fields)], ' '); - } + leave: ({ + name, + directives, + fields + }) => join(['extend input', name, join(directives, ' '), block(fields)], ' ') } }; /** * Given maybeArray, print an empty string if it is null or empty, otherwise * print all items together separated by separator if provided */ - -function join(maybeArray) { - let separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; +function join(maybeArray, separator = '') { var _maybeArray$filter$jo; return (_maybeArray$filter$jo = maybeArray === null || maybeArray === void 0 ? void 0 : maybeArray.filter(x => x).join(separator)) !== null && _maybeArray$filter$jo !== void 0 ? _maybeArray$filter$jo : ''; } /** * Given array, print each item on its own line, wrapped in an indented `{ }` block. */ - function block(array) { return wrap('{\n', indent(join(array, '\n')), '\n}'); } /** * If maybeString is not null or empty, then wrap with start and end, otherwise print an empty string. */ - -function wrap(start, maybeString) { - let end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; +function wrap(start, maybeString, end = '') { return maybeString != null && maybeString !== '' ? start + maybeString + end : ''; } function indent(str) { - return wrap(' ', str.replace(/\n/g, '\n ')); + return wrap(' ', str.replaceAll('\n', '\n ')); } function hasMultilineItems(maybeArray) { var _maybeArray$some; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 - /* c8 ignore next */ return (_maybeArray$some = maybeArray === null || maybeArray === void 0 ? void 0 : maybeArray.some(str => str.includes('\n'))) !== null && _maybeArray$some !== void 0 ? _maybeArray$some : false; } @@ -30304,7 +31390,6 @@ Object.defineProperty(exports, "__esModule", ({ exports.Source = void 0; exports.isSource = isSource; var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); -var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); /** * A representation of source input to GraphQL. The `name` and `locationOffset` parameters are @@ -30314,13 +31399,10 @@ var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../.. * The `line` and `column` properties in `locationOffset` are 1-indexed. */ class Source { - constructor(body) { - let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'GraphQL request'; - let locationOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : { - line: 1, - column: 1 - }; - typeof body === 'string' || (0, _devAssert.devAssert)(false, `Body must be a string. Received: ${(0, _inspect.inspect)(body)}.`); + constructor(body, name = 'GraphQL request', locationOffset = { + line: 1, + column: 1 + }) { this.body = body; this.name = name; this.locationOffset = locationOffset; @@ -30360,11 +31442,11 @@ exports.TokenKind = void 0; * lexer emits. */ var TokenKind; -exports.TokenKind = TokenKind; (function (TokenKind) { TokenKind['SOF'] = ''; TokenKind['EOF'] = ''; TokenKind['BANG'] = '!'; + TokenKind['QUESTION_MARK'] = '?'; TokenKind['DOLLAR'] = '$'; TokenKind['AMP'] = '&'; TokenKind['PAREN_L'] = '('; @@ -30386,12 +31468,6 @@ exports.TokenKind = TokenKind; TokenKind['COMMENT'] = 'Comment'; })(TokenKind || (exports.TokenKind = TokenKind = {})); -/** - * The enum type representing the token kinds values. - * - * @deprecated Please use `TokenKind`. Will be remove in v17. - */ - /***/ }), /***/ "../../../node_modules/graphql/language/visitor.mjs": @@ -30407,106 +31483,19 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.BREAK = void 0; exports.getEnterLeaveForKind = getEnterLeaveForKind; -exports.getVisitFn = getVisitFn; exports.visit = visit; exports.visitInParallel = visitInParallel; var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _ast = __webpack_require__(/*! ./ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _kinds = __webpack_require__(/*! ./kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); -/** - * A visitor is provided to visit, it contains the collection of - * relevant functions to be called during the visitor's traversal. - */ - -const BREAK = Object.freeze({}); -/** - * visit() will walk through an AST using a depth-first traversal, calling - * the visitor's enter function at each node in the traversal, and calling the - * leave function after visiting that node and all of its child nodes. - * - * By returning different values from the enter and leave functions, the - * behavior of the visitor can be altered, including skipping over a sub-tree of - * the AST (by returning false), editing the AST by returning a value or null - * to remove the value, or to stop the whole traversal by returning BREAK. - * - * When using visit() to edit an AST, the original AST will not be modified, and - * a new version of the AST with the changes applied will be returned from the - * visit function. - * - * ```ts - * const editedAST = visit(ast, { - * enter(node, key, parent, path, ancestors) { - * // @return - * // undefined: no action - * // false: skip visiting this node - * // visitor.BREAK: stop visiting altogether - * // null: delete this node - * // any value: replace this node with the returned value - * }, - * leave(node, key, parent, path, ancestors) { - * // @return - * // undefined: no action - * // false: no action - * // visitor.BREAK: stop visiting altogether - * // null: delete this node - * // any value: replace this node with the returned value - * } - * }); - * ``` - * - * Alternatively to providing enter() and leave() functions, a visitor can - * instead provide functions named the same as the kinds of AST nodes, or - * enter/leave visitors at a named key, leading to three permutations of the - * visitor API: - * - * 1) Named visitors triggered when entering a node of a specific kind. - * - * ```ts - * visit(ast, { - * Kind(node) { - * // enter the "Kind" node - * } - * }) - * ``` - * - * 2) Named visitors that trigger upon entering and leaving a node of a specific kind. - * - * ```ts - * visit(ast, { - * Kind: { - * enter(node) { - * // enter the "Kind" node - * } - * leave(node) { - * // leave the "Kind" node - * } - * } - * }) - * ``` - * - * 3) Generic visitors that trigger upon entering and leaving any node. - * - * ```ts - * visit(ast, { - * enter(node) { - * // enter any node - * }, - * leave(node) { - * // leave any node - * } - * }) - * ``` - */ -exports.BREAK = BREAK; -function visit(root, visitor) { - let visitorKeys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ast.QueryDocumentKeys; +const BREAK = exports.BREAK = Object.freeze({}); +function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { const enterLeaveMap = new Map(); for (const kind of Object.values(_kinds.Kind)) { enterLeaveMap.set(kind, getEnterLeaveForKind(visitor, kind)); } /* eslint-disable no-undef-init */ - let stack = undefined; let inArray = Array.isArray(root); let keys = [root]; @@ -30518,7 +31507,6 @@ function visit(root, visitor) { const path = []; const ancestors = []; /* eslint-enable no-undef-init */ - do { index++; const isLeaving = index === keys.length; @@ -30552,7 +31540,7 @@ function visit(root, visitor) { edits = stack.edits; inArray = stack.inArray; stack = stack.prev; - } else if (parent) { + } else if (parent != null) { key = inArray ? index : keys[index]; node = parent[key]; if (node === null || node === undefined) { @@ -30592,7 +31580,7 @@ function visit(root, visitor) { if (isLeaving) { path.pop(); } else { - var _node$kind; + var _visitorKeys$node$kin; stack = { inArray, index, @@ -30601,10 +31589,10 @@ function visit(root, visitor) { prev: stack }; inArray = Array.isArray(node); - keys = inArray ? node : (_node$kind = visitorKeys[node.kind]) !== null && _node$kind !== void 0 ? _node$kind : []; + keys = inArray ? node : (_visitorKeys$node$kin = visitorKeys[node.kind]) !== null && _visitorKeys$node$kin !== void 0 ? _visitorKeys$node$kin : []; index = -1; edits = []; - if (parent) { + if (parent != null) { ancestors.push(parent); } parent = node; @@ -30612,7 +31600,7 @@ function visit(root, visitor) { } while (stack !== undefined); if (edits.length !== 0) { // New root - return edits[edits.length - 1][1]; + return edits.at(-1)[1]; } return root; } @@ -30622,7 +31610,6 @@ function visit(root, visitor) { * * If a prior visitor edits a node, no following visitors will see that node. */ - function visitInParallel(visitors) { const skipping = new Array(visitors.length).fill(null); const mergedVisitor = Object.create(null); @@ -30635,7 +31622,7 @@ function visitInParallel(visitors) { enter, leave } = getEnterLeaveForKind(visitors[i], kind); - hasVisitor || (hasVisitor = enter != null || leave != null); + hasVisitor ||= enter != null || leave != null; enterList[i] = enter; leaveList[i] = leave; } @@ -30643,10 +31630,7 @@ function visitInParallel(visitors) { continue; } const mergedEnterLeave = { - enter() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } + enter(...args) { const node = args[0]; for (let i = 0; i < visitors.length; i++) { if (skipping[i] === null) { @@ -30662,10 +31646,7 @@ function visitInParallel(visitors) { } } }, - leave() { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } + leave(...args) { const node = args[0]; for (let i = 0; i < visitors.length; i++) { if (skipping[i] === null) { @@ -30689,7 +31670,6 @@ function visitInParallel(visitors) { /** * Given a visitor instance and a node kind, return EnterLeaveVisitor for that kind. */ - function getEnterLeaveForKind(visitor, kind) { const kindVisitor = visitor[kind]; if (typeof kindVisitor === 'object') { @@ -30701,29 +31681,13 @@ function getEnterLeaveForKind(visitor, kind) { enter: kindVisitor, leave: undefined }; - } // { enter() {}, leave() {} } - + } + // { enter() {}, leave() {} } return { enter: visitor.enter, leave: visitor.leave }; } -/** - * Given a visitor instance, if it is leaving or not, and a node kind, return - * the function the visitor runtime should call. - * - * @deprecated Please use `getEnterLeaveForKind` instead. Will be removed in v17 - */ - -/* c8 ignore next 8 */ - -function getVisitFn(visitor, kind, isLeaving) { - const { - enter, - leave - } = getEnterLeaveForKind(visitor, kind); - return isLeaving ? leave : enter; -} /***/ }), @@ -30740,16 +31704,12 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.assertEnumValueName = assertEnumValueName; exports.assertName = assertName; -var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _characterClasses = __webpack_require__(/*! ../language/characterClasses.mjs */ "../../../node_modules/graphql/language/characterClasses.mjs"); /** * Upholds the spec rules about naming. */ - function assertName(name) { - name != null || (0, _devAssert.devAssert)(false, 'Must provide name.'); - typeof name === 'string' || (0, _devAssert.devAssert)(false, 'Expected name to be a string.'); if (name.length === 0) { throw new _GraphQLError.GraphQLError('Expected name to be a non-empty string.'); } @@ -30768,7 +31728,6 @@ function assertName(name) { * * @internal */ - function assertEnumValueName(name) { if (name === 'true' || name === 'false' || name === 'null') { throw new _GraphQLError.GraphQLError(`Enum values cannot be named: ${name}`); @@ -30837,7 +31796,6 @@ var _didYouMean = __webpack_require__(/*! ../jsutils/didYouMean.mjs */ "../../.. var _identityFunc = __webpack_require__(/*! ../jsutils/identityFunc.mjs */ "../../../node_modules/graphql/jsutils/identityFunc.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); -var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _keyValMap = __webpack_require__(/*! ../jsutils/keyValMap.mjs */ "../../../node_modules/graphql/jsutils/keyValMap.mjs"); var _mapValue = __webpack_require__(/*! ../jsutils/mapValue.mjs */ "../../../node_modules/graphql/jsutils/mapValue.mjs"); @@ -30860,7 +31818,6 @@ function assertType(type) { /** * There are predicates for each kind of GraphQL type. */ - function isScalarType(type) { return (0, _instanceOf.instanceOf)(type, GraphQLScalarType); } @@ -30933,10 +31890,6 @@ function assertNonNullType(type) { } return type; } -/** - * These types may be used as input types for arguments and directives. - */ - function isInputType(type) { return isScalarType(type) || isEnumType(type) || isInputObjectType(type) || isWrappingType(type) && isInputType(type.ofType); } @@ -30946,10 +31899,6 @@ function assertInputType(type) { } return type; } -/** - * These types may be used as output types as the result of fields. - */ - function isOutputType(type) { return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isWrappingType(type) && isOutputType(type.ofType); } @@ -30959,10 +31908,6 @@ function assertOutputType(type) { } return type; } -/** - * These types may describe types which may be leaf values. - */ - function isLeafType(type) { return isScalarType(type) || isEnumType(type); } @@ -30972,10 +31917,6 @@ function assertLeafType(type) { } return type; } -/** - * These types may describe the parent context of a selection set. - */ - function isCompositeType(type) { return isObjectType(type) || isInterfaceType(type) || isUnionType(type); } @@ -30985,10 +31926,6 @@ function assertCompositeType(type) { } return type; } -/** - * These types may describe the parent context of a selection set. - */ - function isAbstractType(type) { return isInterfaceType(type) || isUnionType(type); } @@ -31017,10 +31954,8 @@ function assertAbstractType(type) { * }) * ``` */ - class GraphQLList { constructor(ofType) { - isType(ofType) || (0, _devAssert.devAssert)(false, `Expected ${(0, _inspect.inspect)(ofType)} to be a GraphQL type.`); this.ofType = ofType; } get [Symbol.toStringTag]() { @@ -31057,7 +31992,6 @@ class GraphQLList { exports.GraphQLList = GraphQLList; class GraphQLNonNull { constructor(ofType) { - isNullableType(ofType) || (0, _devAssert.devAssert)(false, `Expected ${(0, _inspect.inspect)(ofType)} to be a GraphQL nullable type.`); this.ofType = ofType; } get [Symbol.toStringTag]() { @@ -31070,9 +32004,6 @@ class GraphQLNonNull { return this.toString(); } } -/** - * These types wrap and modify other types - */ exports.GraphQLNonNull = GraphQLNonNull; function isWrappingType(type) { return isListType(type) || isNonNullType(type); @@ -31083,10 +32014,6 @@ function assertWrappingType(type) { } return type; } -/** - * These types can all accept null as a value. - */ - function isNullableType(type) { return isType(type) && !isNonNullType(type); } @@ -31101,10 +32028,6 @@ function getNullableType(type) { return isNonNullType(type) ? type.ofType : type; } } -/** - * These named types do not include modifiers like List or NonNull. - */ - function isNamedType(type) { return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isInputObjectType(type); } @@ -31123,27 +32046,12 @@ function getNamedType(type) { return unwrappedType; } } -/** - * Used while defining GraphQL types to allow for circular references in - * otherwise immutable type definitions. - */ - function resolveReadonlyArrayThunk(thunk) { return typeof thunk === 'function' ? thunk() : thunk; } function resolveObjMapThunk(thunk) { return typeof thunk === 'function' ? thunk() : thunk; } -/** - * Custom extensions - * - * @remarks - * Use a unique identifier name for your extension, for example the name of - * your library or project. Do not use a shortened identifier as this increases - * the risk of conflicts. We recommend you add at most one extension field, - * an object which can contain all the values you need. - */ - /** * Scalar Type Definition * @@ -31188,8 +32096,6 @@ class GraphQLScalarType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN = config.extensionASTNodes) !== null && _config$extensionASTN !== void 0 ? _config$extensionASTN : []; - config.specifiedByURL == null || typeof config.specifiedByURL === 'string' || (0, _devAssert.devAssert)(false, `${this.name} must provide "specifiedByURL" as a string, ` + `but got: ${(0, _inspect.inspect)(config.specifiedByURL)}.`); - config.serialize == null || typeof config.serialize === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "serialize" function. If this custom Scalar is also used as an input type, ensure "parseValue" and "parseLiteral" functions are also provided.`); if (config.parseLiteral) { typeof config.parseValue === 'function' && typeof config.parseLiteral === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide both "parseValue" and "parseLiteral" functions.`); } @@ -31217,7 +32123,6 @@ class GraphQLScalarType { return this.toString(); } } - /** * Object Type Definition * @@ -31268,9 +32173,10 @@ class GraphQLObjectType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN2 = config.extensionASTNodes) !== null && _config$extensionASTN2 !== void 0 ? _config$extensionASTN2 : []; - this._fields = () => defineFieldMap(config); - this._interfaces = () => defineInterfaces(config); - config.isTypeOf == null || typeof config.isTypeOf === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "isTypeOf" as a function, ` + `but got: ${(0, _inspect.inspect)(config.isTypeOf)}.`); + // prettier-ignore + // FIXME: blocked by https://github.com/prettier/prettier/issues/14625 + this._fields = defineFieldMap.bind(undefined, config.fields); + this._interfaces = defineInterfaces.bind(undefined, config.interfaces); } get [Symbol.toStringTag]() { return 'GraphQLObjectType'; @@ -31307,21 +32213,14 @@ class GraphQLObjectType { } } exports.GraphQLObjectType = GraphQLObjectType; -function defineInterfaces(config) { - var _config$interfaces; - const interfaces = resolveReadonlyArrayThunk((_config$interfaces = config.interfaces) !== null && _config$interfaces !== void 0 ? _config$interfaces : []); - Array.isArray(interfaces) || (0, _devAssert.devAssert)(false, `${config.name} interfaces must be an Array or a function which returns an Array.`); - return interfaces; -} -function defineFieldMap(config) { - const fieldMap = resolveObjMapThunk(config.fields); - isPlainObj(fieldMap) || (0, _devAssert.devAssert)(false, `${config.name} fields must be an object with field names as keys or a function which returns such an object.`); +function defineInterfaces(interfaces) { + return resolveReadonlyArrayThunk(interfaces !== null && interfaces !== void 0 ? interfaces : []); +} +function defineFieldMap(fields) { + const fieldMap = resolveObjMapThunk(fields); return (0, _mapValue.mapValue)(fieldMap, (fieldConfig, fieldName) => { var _fieldConfig$args; - isPlainObj(fieldConfig) || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} field config must be an object.`); - fieldConfig.resolve == null || typeof fieldConfig.resolve === 'function' || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} field resolver must be a function if ` + `provided, but got: ${(0, _inspect.inspect)(fieldConfig.resolve)}.`); const argsConfig = (_fieldConfig$args = fieldConfig.args) !== null && _fieldConfig$args !== void 0 ? _fieldConfig$args : {}; - isPlainObj(argsConfig) || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} args must be an object with argument names as keys.`); return { name: (0, _assertName.assertName)(fieldName), description: fieldConfig.description, @@ -31335,22 +32234,16 @@ function defineFieldMap(config) { }; }); } -function defineArguments(config) { - return Object.entries(config).map(_ref => { - let [argName, argConfig] = _ref; - return { - name: (0, _assertName.assertName)(argName), - description: argConfig.description, - type: argConfig.type, - defaultValue: argConfig.defaultValue, - deprecationReason: argConfig.deprecationReason, - extensions: (0, _toObjMap.toObjMap)(argConfig.extensions), - astNode: argConfig.astNode - }; - }); -} -function isPlainObj(obj) { - return (0, _isObjectLike.isObjectLike)(obj) && !Array.isArray(obj); +function defineArguments(args) { + return Object.entries(args).map(([argName, argConfig]) => ({ + name: (0, _assertName.assertName)(argName), + description: argConfig.description, + type: argConfig.type, + defaultValue: argConfig.defaultValue, + deprecationReason: argConfig.deprecationReason, + extensions: (0, _toObjMap.toObjMap)(argConfig.extensions), + astNode: argConfig.astNode + })); } function fieldsToFieldsConfig(fields) { return (0, _mapValue.mapValue)(fields, field => ({ @@ -31367,7 +32260,6 @@ function fieldsToFieldsConfig(fields) { /** * @internal */ - function argsToArgsConfig(args) { return (0, _keyValMap.keyValMap)(args, arg => arg.name, arg => ({ description: arg.description, @@ -31381,7 +32273,6 @@ function argsToArgsConfig(args) { function isRequiredArgument(arg) { return isNonNullType(arg.type) && arg.defaultValue === undefined; } - /** * Interface Type Definition * @@ -31410,9 +32301,10 @@ class GraphQLInterfaceType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN3 = config.extensionASTNodes) !== null && _config$extensionASTN3 !== void 0 ? _config$extensionASTN3 : []; - this._fields = defineFieldMap.bind(undefined, config); - this._interfaces = defineInterfaces.bind(undefined, config); - config.resolveType == null || typeof config.resolveType === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "resolveType" as a function, ` + `but got: ${(0, _inspect.inspect)(config.resolveType)}.`); + // prettier-ignore + // FIXME: blocked by https://github.com/prettier/prettier/issues/14625 + this._fields = defineFieldMap.bind(undefined, config.fields); + this._interfaces = defineInterfaces.bind(undefined, config.interfaces); } get [Symbol.toStringTag]() { return 'GraphQLInterfaceType'; @@ -31448,7 +32340,6 @@ class GraphQLInterfaceType { return this.toString(); } } - /** * Union Type Definition * @@ -31483,8 +32374,7 @@ class GraphQLUnionType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN4 = config.extensionASTNodes) !== null && _config$extensionASTN4 !== void 0 ? _config$extensionASTN4 : []; - this._types = defineTypes.bind(undefined, config); - config.resolveType == null || typeof config.resolveType === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "resolveType" as a function, ` + `but got: ${(0, _inspect.inspect)(config.resolveType)}.`); + this._types = defineTypes.bind(undefined, config.types); } get [Symbol.toStringTag]() { return 'GraphQLUnionType'; @@ -31514,12 +32404,19 @@ class GraphQLUnionType { } } exports.GraphQLUnionType = GraphQLUnionType; -function defineTypes(config) { - const types = resolveReadonlyArrayThunk(config.types); - Array.isArray(types) || (0, _devAssert.devAssert)(false, `Must provide Array of types or a function which returns such an array for Union ${config.name}.`); - return types; +function defineTypes(types) { + return resolveReadonlyArrayThunk(types); +} +function enumValuesFromConfig(values) { + return Object.entries(values).map(([valueName, valueConfig]) => ({ + name: (0, _assertName.assertEnumValueName)(valueName), + description: valueConfig.description, + value: valueConfig.value !== undefined ? valueConfig.value : valueName, + deprecationReason: valueConfig.deprecationReason, + extensions: (0, _toObjMap.toObjMap)(valueConfig.extensions), + astNode: valueConfig.astNode + })); } - /** * Enum Type Definition * @@ -31543,8 +32440,7 @@ function defineTypes(config) { * Note: If a value is not provided in a definition, the name of the enum value * will be used as its internal value. */ -class GraphQLEnumType { - /* */ +class GraphQLEnumType /* */ { constructor(config) { var _config$extensionASTN5; this.name = (0, _assertName.assertName)(config.name); @@ -31552,28 +32448,36 @@ class GraphQLEnumType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN5 = config.extensionASTNodes) !== null && _config$extensionASTN5 !== void 0 ? _config$extensionASTN5 : []; - this._values = defineEnumValues(this.name, config.values); - this._valueLookup = new Map(this._values.map(enumValue => [enumValue.value, enumValue])); - this._nameLookup = (0, _keyMap.keyMap)(this._values, value => value.name); + this._values = typeof config.values === 'function' ? config.values : enumValuesFromConfig(config.values); + this._valueLookup = null; + this._nameLookup = null; } get [Symbol.toStringTag]() { return 'GraphQLEnumType'; } getValues() { + if (typeof this._values === 'function') { + this._values = enumValuesFromConfig(this._values()); + } return this._values; } getValue(name) { + if (this._nameLookup === null) { + this._nameLookup = (0, _keyMap.keyMap)(this.getValues(), value => value.name); + } return this._nameLookup[name]; } - serialize(outputValue) { + serialize(outputValue /* T */) { + if (this._valueLookup === null) { + this._valueLookup = new Map(this.getValues().map(enumValue => [enumValue.value, enumValue])); + } const enumValue = this._valueLookup.get(outputValue); if (enumValue === undefined) { throw new _GraphQLError.GraphQLError(`Enum "${this.name}" cannot represent value: ${(0, _inspect.inspect)(outputValue)}`); } return enumValue.name; } - parseValue(inputValue) /* T */ - { + parseValue(inputValue) { if (typeof inputValue !== 'string') { const valueStr = (0, _inspect.inspect)(inputValue); throw new _GraphQLError.GraphQLError(`Enum "${this.name}" cannot represent non-string value: ${valueStr}.` + didYouMeanEnumValue(this, valueStr)); @@ -31584,8 +32488,7 @@ class GraphQLEnumType { } return enumValue.value; } - parseLiteral(valueNode, _variables) /* T */ - { + parseLiteral(valueNode, _variables) { // Note: variables will be resolved to a value before calling this function. if (valueNode.kind !== _kinds.Kind.ENUM) { const valueStr = (0, _printer.print)(valueNode); @@ -31632,22 +32535,6 @@ function didYouMeanEnumValue(enumType, unknownValueStr) { const suggestedValues = (0, _suggestionList.suggestionList)(unknownValueStr, allNames); return (0, _didYouMean.didYouMean)('the enum value', suggestedValues); } -function defineEnumValues(typeName, valueMap) { - isPlainObj(valueMap) || (0, _devAssert.devAssert)(false, `${typeName} values must be an object with value names as keys.`); - return Object.entries(valueMap).map(_ref2 => { - let [valueName, valueConfig] = _ref2; - isPlainObj(valueConfig) || (0, _devAssert.devAssert)(false, `${typeName}.${valueName} must refer to an object with a "value" key ` + `representing an internal value but got: ${(0, _inspect.inspect)(valueConfig)}.`); - return { - name: (0, _assertName.assertEnumValueName)(valueName), - description: valueConfig.description, - value: valueConfig.value !== undefined ? valueConfig.value : valueName, - deprecationReason: valueConfig.deprecationReason, - extensions: (0, _toObjMap.toObjMap)(valueConfig.extensions), - astNode: valueConfig.astNode - }; - }); -} - /** * Input Object Type Definition * @@ -31671,13 +32558,14 @@ function defineEnumValues(typeName, valueMap) { */ class GraphQLInputObjectType { constructor(config) { - var _config$extensionASTN6; + var _config$extensionASTN6, _config$isOneOf; this.name = (0, _assertName.assertName)(config.name); this.description = config.description; this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN6 = config.extensionASTNodes) !== null && _config$extensionASTN6 !== void 0 ? _config$extensionASTN6 : []; - this._fields = defineInputFieldMap.bind(undefined, config); + this.isOneOf = (_config$isOneOf = config.isOneOf) !== null && _config$isOneOf !== void 0 ? _config$isOneOf : false; + this._fields = defineInputFieldMap.bind(undefined, config.fields); } get [Symbol.toStringTag]() { return 'GraphQLInputObjectType'; @@ -31703,7 +32591,8 @@ class GraphQLInputObjectType { fields, extensions: this.extensions, astNode: this.astNode, - extensionASTNodes: this.extensionASTNodes + extensionASTNodes: this.extensionASTNodes, + isOneOf: this.isOneOf }; } toString() { @@ -31714,21 +32603,17 @@ class GraphQLInputObjectType { } } exports.GraphQLInputObjectType = GraphQLInputObjectType; -function defineInputFieldMap(config) { - const fieldMap = resolveObjMapThunk(config.fields); - isPlainObj(fieldMap) || (0, _devAssert.devAssert)(false, `${config.name} fields must be an object with field names as keys or a function which returns such an object.`); - return (0, _mapValue.mapValue)(fieldMap, (fieldConfig, fieldName) => { - !('resolve' in fieldConfig) || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} field has a resolve property, but Input Types cannot define resolvers.`); - return { - name: (0, _assertName.assertName)(fieldName), - description: fieldConfig.description, - type: fieldConfig.type, - defaultValue: fieldConfig.defaultValue, - deprecationReason: fieldConfig.deprecationReason, - extensions: (0, _toObjMap.toObjMap)(fieldConfig.extensions), - astNode: fieldConfig.astNode - }; - }); +function defineInputFieldMap(fields) { + const fieldMap = resolveObjMapThunk(fields); + return (0, _mapValue.mapValue)(fieldMap, (fieldConfig, fieldName) => ({ + name: (0, _assertName.assertName)(fieldName), + description: fieldConfig.description, + type: fieldConfig.type, + defaultValue: fieldConfig.defaultValue, + deprecationReason: fieldConfig.deprecationReason, + extensions: (0, _toObjMap.toObjMap)(fieldConfig.extensions), + astNode: fieldConfig.astNode + })); } function isRequiredInputField(field) { return isNonNullType(field.type) && field.defaultValue === undefined; @@ -31747,15 +32632,13 @@ function isRequiredInputField(field) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.GraphQLSpecifiedByDirective = exports.GraphQLSkipDirective = exports.GraphQLIncludeDirective = exports.GraphQLDirective = exports.GraphQLDeprecatedDirective = exports.DEFAULT_DEPRECATION_REASON = void 0; +exports.GraphQLStreamDirective = exports.GraphQLSpecifiedByDirective = exports.GraphQLSkipDirective = exports.GraphQLOneOfDirective = exports.GraphQLIncludeDirective = exports.GraphQLDirective = exports.GraphQLDeprecatedDirective = exports.GraphQLDeferDirective = exports.DEFAULT_DEPRECATION_REASON = void 0; exports.assertDirective = assertDirective; exports.isDirective = isDirective; exports.isSpecifiedDirective = isSpecifiedDirective; exports.specifiedDirectives = void 0; -var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); -var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _toObjMap = __webpack_require__(/*! ../jsutils/toObjMap.mjs */ "../../../node_modules/graphql/jsutils/toObjMap.mjs"); var _directiveLocation = __webpack_require__(/*! ../language/directiveLocation.mjs */ "../../../node_modules/graphql/language/directiveLocation.mjs"); var _assertName = __webpack_require__(/*! ./assertName.mjs */ "../../../node_modules/graphql/type/assertName.mjs"); @@ -31764,7 +32647,6 @@ var _scalars = __webpack_require__(/*! ./scalars.mjs */ "../../../node_modules/g /** * Test if the given value is a GraphQL directive. */ - function isDirective(directive) { return (0, _instanceOf.instanceOf)(directive, GraphQLDirective); } @@ -31774,16 +32656,6 @@ function assertDirective(directive) { } return directive; } -/** - * Custom extensions - * - * @remarks - * Use a unique identifier name for your extension, for example the name of - * your library or project. Do not use a shortened identifier as this increases - * the risk of conflicts. We recommend you add at most one extension field, - * an object which can contain all the values you need. - */ - /** * Directives are used by the GraphQL runtime as a way of modifying execution * behavior. Type system creators will usually not create these directly. @@ -31797,9 +32669,7 @@ class GraphQLDirective { this.isRepeatable = (_config$isRepeatable = config.isRepeatable) !== null && _config$isRepeatable !== void 0 ? _config$isRepeatable : false; this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; - Array.isArray(config.locations) || (0, _devAssert.devAssert)(false, `@${config.name} locations must be an Array.`); const args = (_config$args = config.args) !== null && _config$args !== void 0 ? _config$args : {}; - (0, _isObjectLike.isObjectLike)(args) && !Array.isArray(args) || (0, _devAssert.devAssert)(false, `@${config.name} args must be an object with argument names as keys.`); this.args = (0, _definition.defineArguments)(args); } get [Symbol.toStringTag]() { @@ -31823,12 +32693,11 @@ class GraphQLDirective { return this.toString(); } } - /** * Used to conditionally include fields or fragments. */ exports.GraphQLDirective = GraphQLDirective; -const GraphQLIncludeDirective = new GraphQLDirective({ +const GraphQLIncludeDirective = exports.GraphQLIncludeDirective = new GraphQLDirective({ name: 'include', description: 'Directs the executor to include this field or fragment only when the `if` argument is true.', locations: [_directiveLocation.DirectiveLocation.FIELD, _directiveLocation.DirectiveLocation.FRAGMENT_SPREAD, _directiveLocation.DirectiveLocation.INLINE_FRAGMENT], @@ -31842,8 +32711,7 @@ const GraphQLIncludeDirective = new GraphQLDirective({ /** * Used to conditionally skip (exclude) fields or fragments. */ -exports.GraphQLIncludeDirective = GraphQLIncludeDirective; -const GraphQLSkipDirective = new GraphQLDirective({ +const GraphQLSkipDirective = exports.GraphQLSkipDirective = new GraphQLDirective({ name: 'skip', description: 'Directs the executor to skip this field or fragment when the `if` argument is true.', locations: [_directiveLocation.DirectiveLocation.FIELD, _directiveLocation.DirectiveLocation.FRAGMENT_SPREAD, _directiveLocation.DirectiveLocation.INLINE_FRAGMENT], @@ -31854,16 +32722,57 @@ const GraphQLSkipDirective = new GraphQLDirective({ } } }); +/** + * Used to conditionally defer fragments. + */ +const GraphQLDeferDirective = exports.GraphQLDeferDirective = new GraphQLDirective({ + name: 'defer', + description: 'Directs the executor to defer this fragment when the `if` argument is true or undefined.', + locations: [_directiveLocation.DirectiveLocation.FRAGMENT_SPREAD, _directiveLocation.DirectiveLocation.INLINE_FRAGMENT], + args: { + if: { + type: new _definition.GraphQLNonNull(_scalars.GraphQLBoolean), + description: 'Deferred when true or undefined.', + defaultValue: true + }, + label: { + type: _scalars.GraphQLString, + description: 'Unique name' + } + } +}); +/** + * Used to conditionally stream list fields. + */ +const GraphQLStreamDirective = exports.GraphQLStreamDirective = new GraphQLDirective({ + name: 'stream', + description: 'Directs the executor to stream plural fields when the `if` argument is true or undefined.', + locations: [_directiveLocation.DirectiveLocation.FIELD], + args: { + if: { + type: new _definition.GraphQLNonNull(_scalars.GraphQLBoolean), + description: 'Stream when true or undefined.', + defaultValue: true + }, + label: { + type: _scalars.GraphQLString, + description: 'Unique name' + }, + initialCount: { + defaultValue: 0, + type: _scalars.GraphQLInt, + description: 'Number of items to return immediately' + } + } +}); /** * Constant string used for default reason for a deprecation. */ -exports.GraphQLSkipDirective = GraphQLSkipDirective; -const DEFAULT_DEPRECATION_REASON = 'No longer supported'; +const DEFAULT_DEPRECATION_REASON = exports.DEFAULT_DEPRECATION_REASON = 'No longer supported'; /** * Used to declare element of a GraphQL schema as deprecated. */ -exports.DEFAULT_DEPRECATION_REASON = DEFAULT_DEPRECATION_REASON; -const GraphQLDeprecatedDirective = new GraphQLDirective({ +const GraphQLDeprecatedDirective = exports.GraphQLDeprecatedDirective = new GraphQLDirective({ name: 'deprecated', description: 'Marks an element of a GraphQL schema as no longer supported.', locations: [_directiveLocation.DirectiveLocation.FIELD_DEFINITION, _directiveLocation.DirectiveLocation.ARGUMENT_DEFINITION, _directiveLocation.DirectiveLocation.INPUT_FIELD_DEFINITION, _directiveLocation.DirectiveLocation.ENUM_VALUE], @@ -31878,8 +32787,7 @@ const GraphQLDeprecatedDirective = new GraphQLDirective({ /** * Used to provide a URL for specifying the behavior of custom scalar definitions. */ -exports.GraphQLDeprecatedDirective = GraphQLDeprecatedDirective; -const GraphQLSpecifiedByDirective = new GraphQLDirective({ +const GraphQLSpecifiedByDirective = exports.GraphQLSpecifiedByDirective = new GraphQLDirective({ name: 'specifiedBy', description: 'Exposes a URL that specifies the behavior of this scalar.', locations: [_directiveLocation.DirectiveLocation.SCALAR], @@ -31890,19 +32798,23 @@ const GraphQLSpecifiedByDirective = new GraphQLDirective({ } } }); +/** + * Used to indicate an Input Object is a OneOf Input Object. + */ +const GraphQLOneOfDirective = exports.GraphQLOneOfDirective = new GraphQLDirective({ + name: 'oneOf', + description: 'Indicates exactly one field must be supplied and this field must not be `null`.', + locations: [_directiveLocation.DirectiveLocation.INPUT_OBJECT], + args: {} +}); /** * The full list of specified directives. */ -exports.GraphQLSpecifiedByDirective = GraphQLSpecifiedByDirective; -const specifiedDirectives = Object.freeze([GraphQLIncludeDirective, GraphQLSkipDirective, GraphQLDeprecatedDirective, GraphQLSpecifiedByDirective]); -exports.specifiedDirectives = specifiedDirectives; +const specifiedDirectives = exports.specifiedDirectives = Object.freeze([GraphQLIncludeDirective, GraphQLSkipDirective, GraphQLDeprecatedDirective, GraphQLSpecifiedByDirective, GraphQLOneOfDirective]); function isSpecifiedDirective(directive) { - return specifiedDirectives.some(_ref => { - let { - name - } = _ref; - return name === directive.name; - }); + return specifiedDirectives.some(({ + name + }) => name === directive.name); } /***/ }), @@ -31942,6 +32854,12 @@ Object.defineProperty(exports, "GraphQLBoolean", ({ return _scalars.GraphQLBoolean; } })); +Object.defineProperty(exports, "GraphQLDeferDirective", ({ + enumerable: true, + get: function () { + return _directives.GraphQLDeferDirective; + } +})); Object.defineProperty(exports, "GraphQLDeprecatedDirective", ({ enumerable: true, get: function () { @@ -32014,6 +32932,12 @@ Object.defineProperty(exports, "GraphQLObjectType", ({ return _definition.GraphQLObjectType; } })); +Object.defineProperty(exports, "GraphQLOneOfDirective", ({ + enumerable: true, + get: function () { + return _directives.GraphQLOneOfDirective; + } +})); Object.defineProperty(exports, "GraphQLScalarType", ({ enumerable: true, get: function () { @@ -32038,6 +32962,12 @@ Object.defineProperty(exports, "GraphQLSpecifiedByDirective", ({ return _directives.GraphQLSpecifiedByDirective; } })); +Object.defineProperty(exports, "GraphQLStreamDirective", ({ + enumerable: true, + get: function () { + return _directives.GraphQLStreamDirective; + } +})); Object.defineProperty(exports, "GraphQLString", ({ enumerable: true, get: function () { @@ -32476,7 +33406,7 @@ var _printer = __webpack_require__(/*! ../language/printer.mjs */ "../../../node var _astFromValue = __webpack_require__(/*! ../utilities/astFromValue.mjs */ "../../../node_modules/graphql/utilities/astFromValue.mjs"); var _definition = __webpack_require__(/*! ./definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _scalars = __webpack_require__(/*! ./scalars.mjs */ "../../../node_modules/graphql/type/scalars.mjs"); -const __Schema = new _definition.GraphQLObjectType({ +const __Schema = exports.__Schema = new _definition.GraphQLObjectType({ name: '__Schema', description: 'A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.', fields: () => ({ @@ -32513,8 +33443,7 @@ const __Schema = new _definition.GraphQLObjectType({ } }) }); -exports.__Schema = __Schema; -const __Directive = new _definition.GraphQLObjectType({ +const __Directive = exports.__Directive = new _definition.GraphQLObjectType({ name: '__Directive', description: "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.", fields: () => ({ @@ -32542,17 +33471,15 @@ const __Directive = new _definition.GraphQLObjectType({ defaultValue: false } }, - resolve(field, _ref) { - let { - includeDeprecated - } = _ref; - return includeDeprecated ? field.args : field.args.filter(arg => arg.deprecationReason == null); + resolve(field, { + includeDeprecated + }) { + return includeDeprecated === true ? field.args : field.args.filter(arg => arg.deprecationReason == null); } } }) }); -exports.__Directive = __Directive; -const __DirectiveLocation = new _definition.GraphQLEnumType({ +const __DirectiveLocation = exports.__DirectiveLocation = new _definition.GraphQLEnumType({ name: '__DirectiveLocation', description: 'A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.', values: { @@ -32634,8 +33561,7 @@ const __DirectiveLocation = new _definition.GraphQLEnumType({ } } }); -exports.__DirectiveLocation = __DirectiveLocation; -const __Type = new _definition.GraphQLObjectType({ +const __Type = exports.__Type = new _definition.GraphQLObjectType({ name: '__Type', description: 'The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional `specifiedByURL`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.', fields: () => ({ @@ -32668,7 +33594,6 @@ const __Type = new _definition.GraphQLObjectType({ } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered) - false || (0, _invariant.invariant)(false, `Unexpected type: "${(0, _inspect.inspect)(type)}".`); } }, @@ -32678,8 +33603,9 @@ const __Type = new _definition.GraphQLObjectType({ }, description: { type: _scalars.GraphQLString, - resolve: (type // FIXME: add test case - ) => /* c8 ignore next */ + resolve: type => + // FIXME: add test case + /* c8 ignore next */ 'description' in type ? type.description : undefined }, specifiedByURL: { @@ -32694,13 +33620,12 @@ const __Type = new _definition.GraphQLObjectType({ defaultValue: false } }, - resolve(type, _ref2) { - let { - includeDeprecated - } = _ref2; + resolve(type, { + includeDeprecated + }) { if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type)) { const fields = Object.values(type.getFields()); - return includeDeprecated ? fields : fields.filter(field => field.deprecationReason == null); + return includeDeprecated === true ? fields : fields.filter(field => field.deprecationReason == null); } } }, @@ -32714,10 +33639,9 @@ const __Type = new _definition.GraphQLObjectType({ }, possibleTypes: { type: new _definition.GraphQLList(new _definition.GraphQLNonNull(__Type)), - resolve(type, _args, _context, _ref3) { - let { - schema - } = _ref3; + resolve(type, _args, _context, { + schema + }) { if ((0, _definition.isAbstractType)(type)) { return schema.getPossibleTypes(type); } @@ -32731,13 +33655,12 @@ const __Type = new _definition.GraphQLObjectType({ defaultValue: false } }, - resolve(type, _ref4) { - let { - includeDeprecated - } = _ref4; + resolve(type, { + includeDeprecated + }) { if ((0, _definition.isEnumType)(type)) { const values = type.getValues(); - return includeDeprecated ? values : values.filter(field => field.deprecationReason == null); + return includeDeprecated === true ? values : values.filter(field => field.deprecationReason == null); } } }, @@ -32749,24 +33672,30 @@ const __Type = new _definition.GraphQLObjectType({ defaultValue: false } }, - resolve(type, _ref5) { - let { - includeDeprecated - } = _ref5; + resolve(type, { + includeDeprecated + }) { if ((0, _definition.isInputObjectType)(type)) { const values = Object.values(type.getFields()); - return includeDeprecated ? values : values.filter(field => field.deprecationReason == null); + return includeDeprecated === true ? values : values.filter(field => field.deprecationReason == null); } } }, ofType: { type: __Type, resolve: type => 'ofType' in type ? type.ofType : undefined + }, + isOneOf: { + type: _scalars.GraphQLBoolean, + resolve: type => { + if ((0, _definition.isInputObjectType)(type)) { + return type.isOneOf; + } + } } }) }); -exports.__Type = __Type; -const __Field = new _definition.GraphQLObjectType({ +const __Field = exports.__Field = new _definition.GraphQLObjectType({ name: '__Field', description: 'Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.', fields: () => ({ @@ -32786,11 +33715,10 @@ const __Field = new _definition.GraphQLObjectType({ defaultValue: false } }, - resolve(field, _ref6) { - let { - includeDeprecated - } = _ref6; - return includeDeprecated ? field.args : field.args.filter(arg => arg.deprecationReason == null); + resolve(field, { + includeDeprecated + }) { + return includeDeprecated === true ? field.args : field.args.filter(arg => arg.deprecationReason == null); } }, type: { @@ -32807,8 +33735,7 @@ const __Field = new _definition.GraphQLObjectType({ } }) }); -exports.__Field = __Field; -const __InputValue = new _definition.GraphQLObjectType({ +const __InputValue = exports.__InputValue = new _definition.GraphQLObjectType({ name: '__InputValue', description: 'Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.', fields: () => ({ @@ -32846,8 +33773,7 @@ const __InputValue = new _definition.GraphQLObjectType({ } }) }); -exports.__InputValue = __InputValue; -const __EnumValue = new _definition.GraphQLObjectType({ +const __EnumValue = exports.__EnumValue = new _definition.GraphQLObjectType({ name: '__EnumValue', description: 'One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.', fields: () => ({ @@ -32869,9 +33795,7 @@ const __EnumValue = new _definition.GraphQLObjectType({ } }) }); -exports.__EnumValue = __EnumValue; var TypeKind; -exports.TypeKind = TypeKind; (function (TypeKind) { TypeKind['SCALAR'] = 'SCALAR'; TypeKind['OBJECT'] = 'OBJECT'; @@ -32882,7 +33806,7 @@ exports.TypeKind = TypeKind; TypeKind['LIST'] = 'LIST'; TypeKind['NON_NULL'] = 'NON_NULL'; })(TypeKind || (exports.TypeKind = TypeKind = {})); -const __TypeKind = new _definition.GraphQLEnumType({ +const __TypeKind = exports.__TypeKind = new _definition.GraphQLEnumType({ name: '__TypeKind', description: 'An enum describing what kind of type a given `__Type` is.', values: { @@ -32924,24 +33848,19 @@ const __TypeKind = new _definition.GraphQLEnumType({ * Note that these are GraphQLField and not GraphQLFieldConfig, * so the format for args is different. */ -exports.__TypeKind = __TypeKind; -const SchemaMetaFieldDef = { +const SchemaMetaFieldDef = exports.SchemaMetaFieldDef = { name: '__schema', type: new _definition.GraphQLNonNull(__Schema), description: 'Access the current type schema of this server.', args: [], - resolve: (_source, _args, _context, _ref7) => { - let { - schema - } = _ref7; - return schema; - }, + resolve: (_source, _args, _context, { + schema + }) => schema, deprecationReason: undefined, extensions: Object.create(null), astNode: undefined }; -exports.SchemaMetaFieldDef = SchemaMetaFieldDef; -const TypeMetaFieldDef = { +const TypeMetaFieldDef = exports.TypeMetaFieldDef = { name: '__type', type: __Type, description: 'Request the type information of a single type.', @@ -32954,45 +33873,32 @@ const TypeMetaFieldDef = { extensions: Object.create(null), astNode: undefined }], - resolve: (_source, _ref8, _context, _ref9) => { - let { - name - } = _ref8; - let { - schema - } = _ref9; - return schema.getType(name); - }, + resolve: (_source, { + name + }, _context, { + schema + }) => schema.getType(name), deprecationReason: undefined, extensions: Object.create(null), astNode: undefined }; -exports.TypeMetaFieldDef = TypeMetaFieldDef; -const TypeNameMetaFieldDef = { +const TypeNameMetaFieldDef = exports.TypeNameMetaFieldDef = { name: '__typename', type: new _definition.GraphQLNonNull(_scalars.GraphQLString), description: 'The name of the current Object type at runtime.', args: [], - resolve: (_source, _args, _context, _ref10) => { - let { - parentType - } = _ref10; - return parentType.name; - }, + resolve: (_source, _args, _context, { + parentType + }) => parentType.name, deprecationReason: undefined, extensions: Object.create(null), astNode: undefined }; -exports.TypeNameMetaFieldDef = TypeNameMetaFieldDef; -const introspectionTypes = Object.freeze([__Schema, __Directive, __DirectiveLocation, __Type, __Field, __InputValue, __EnumValue, __TypeKind]); -exports.introspectionTypes = introspectionTypes; +const introspectionTypes = exports.introspectionTypes = Object.freeze([__Schema, __Directive, __DirectiveLocation, __Type, __Field, __InputValue, __EnumValue, __TypeKind]); function isIntrospectionType(type) { - return introspectionTypes.some(_ref11 => { - let { - name - } = _ref11; - return type.name === name; - }); + return introspectionTypes.some(({ + name + }) => type.name === name); } /***/ }), @@ -33021,16 +33927,13 @@ var _definition = __webpack_require__(/*! ./definition.mjs */ "../../../node_mod * Maximum possible Int value as per GraphQL Spec (32-bit signed integer). * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe up-to 2^53 - 1 * */ - -const GRAPHQL_MAX_INT = 2147483647; +const GRAPHQL_MAX_INT = exports.GRAPHQL_MAX_INT = 2147483647; /** * Minimum possible Int value as per GraphQL Spec (32-bit signed integer). * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe starting at -(2^53 - 1) * */ -exports.GRAPHQL_MAX_INT = GRAPHQL_MAX_INT; -const GRAPHQL_MIN_INT = -2147483648; -exports.GRAPHQL_MIN_INT = GRAPHQL_MIN_INT; -const GraphQLInt = new _definition.GraphQLScalarType({ +const GRAPHQL_MIN_INT = exports.GRAPHQL_MIN_INT = -2147483648; +const GraphQLInt = exports.GraphQLInt = new _definition.GraphQLScalarType({ name: 'Int', description: 'The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.', serialize(outputValue) { @@ -33074,8 +33977,7 @@ const GraphQLInt = new _definition.GraphQLScalarType({ return num; } }); -exports.GraphQLInt = GraphQLInt; -const GraphQLFloat = new _definition.GraphQLScalarType({ +const GraphQLFloat = exports.GraphQLFloat = new _definition.GraphQLScalarType({ name: 'Float', description: 'The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](https://en.wikipedia.org/wiki/IEEE_floating_point).', serialize(outputValue) { @@ -33100,19 +34002,20 @@ const GraphQLFloat = new _definition.GraphQLScalarType({ }, parseLiteral(valueNode) { if (valueNode.kind !== _kinds.Kind.FLOAT && valueNode.kind !== _kinds.Kind.INT) { - throw new _GraphQLError.GraphQLError(`Float cannot represent non numeric value: ${(0, _printer.print)(valueNode)}`, valueNode); + throw new _GraphQLError.GraphQLError(`Float cannot represent non numeric value: ${(0, _printer.print)(valueNode)}`, { + nodes: valueNode + }); } return parseFloat(valueNode.value); } }); -exports.GraphQLFloat = GraphQLFloat; -const GraphQLString = new _definition.GraphQLScalarType({ +const GraphQLString = exports.GraphQLString = new _definition.GraphQLScalarType({ name: 'String', description: 'The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.', serialize(outputValue) { - const coercedValue = serializeObject(outputValue); // Serialize string, boolean and number values to a string, but do not + const coercedValue = serializeObject(outputValue); + // Serialize string, boolean and number values to a string, but do not // attempt to coerce object, function, symbol, or other types as strings. - if (typeof coercedValue === 'string') { return coercedValue; } @@ -33139,8 +34042,7 @@ const GraphQLString = new _definition.GraphQLScalarType({ return valueNode.value; } }); -exports.GraphQLString = GraphQLString; -const GraphQLBoolean = new _definition.GraphQLScalarType({ +const GraphQLBoolean = exports.GraphQLBoolean = new _definition.GraphQLScalarType({ name: 'Boolean', description: 'The `Boolean` scalar type represents `true` or `false`.', serialize(outputValue) { @@ -33168,8 +34070,7 @@ const GraphQLBoolean = new _definition.GraphQLScalarType({ return valueNode.value; } }); -exports.GraphQLBoolean = GraphQLBoolean; -const GraphQLID = new _definition.GraphQLScalarType({ +const GraphQLID = exports.GraphQLID = new _definition.GraphQLScalarType({ name: 'ID', description: 'The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID.', serialize(outputValue) { @@ -33200,20 +34101,15 @@ const GraphQLID = new _definition.GraphQLScalarType({ return valueNode.value; } }); -exports.GraphQLID = GraphQLID; -const specifiedScalarTypes = Object.freeze([GraphQLString, GraphQLInt, GraphQLFloat, GraphQLBoolean, GraphQLID]); -exports.specifiedScalarTypes = specifiedScalarTypes; +const specifiedScalarTypes = exports.specifiedScalarTypes = Object.freeze([GraphQLString, GraphQLInt, GraphQLFloat, GraphQLBoolean, GraphQLID]); function isSpecifiedScalarType(type) { - return specifiedScalarTypes.some(_ref => { - let { - name - } = _ref; - return type.name === name; - }); -} // Support serializing objects with custom valueOf() or toJSON() functions - + return specifiedScalarTypes.some(({ + name + }) => type.name === name); +} +// Support serializing objects with custom valueOf() or toJSON() functions - // a common way to represent a complex value which can be represented as // a string (ex: MongoDB id objects). - function serializeObject(outputValue) { if ((0, _isObjectLike.isObjectLike)(outputValue)) { if (typeof outputValue.valueOf === 'function') { @@ -33245,10 +34141,8 @@ Object.defineProperty(exports, "__esModule", ({ exports.GraphQLSchema = void 0; exports.assertSchema = assertSchema; exports.isSchema = isSchema; -var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); -var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _toObjMap = __webpack_require__(/*! ../jsutils/toObjMap.mjs */ "../../../node_modules/graphql/jsutils/toObjMap.mjs"); var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _definition = __webpack_require__(/*! ./definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); @@ -33257,7 +34151,6 @@ var _introspection = __webpack_require__(/*! ./introspection.mjs */ "../../../no /** * Test if the given value is a GraphQL schema. */ - function isSchema(schema) { return (0, _instanceOf.instanceOf)(schema, GraphQLSchema); } @@ -33267,16 +34160,6 @@ function assertSchema(schema) { } return schema; } -/** - * Custom extensions - * - * @remarks - * Use a unique identifier name for your extension, for example the name of - * your library or project. Do not use a shortened identifier as this increases - * the risk of conflicts. We recommend you add at most one extension field, - * an object which can contain all the values you need. - */ - /** * Schema Definition * @@ -33346,28 +34229,22 @@ function assertSchema(schema) { * ``` */ class GraphQLSchema { - // Used as a cache for validateSchema(). constructor(config) { var _config$extensionASTN, _config$directives; - // If this schema was built from a source known to be valid, then it may be // marked with assumeValid to avoid an additional type system validation. - this.__validationErrors = config.assumeValid === true ? [] : undefined; // Check for common mistakes during construction to produce early errors. - - (0, _isObjectLike.isObjectLike)(config) || (0, _devAssert.devAssert)(false, 'Must provide configuration object.'); - !config.types || Array.isArray(config.types) || (0, _devAssert.devAssert)(false, `"types" must be Array if provided but got: ${(0, _inspect.inspect)(config.types)}.`); - !config.directives || Array.isArray(config.directives) || (0, _devAssert.devAssert)(false, '"directives" must be Array if provided but got: ' + `${(0, _inspect.inspect)(config.directives)}.`); + this.__validationErrors = config.assumeValid === true ? [] : undefined; this.description = config.description; this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN = config.extensionASTNodes) !== null && _config$extensionASTN !== void 0 ? _config$extensionASTN : []; this._queryType = config.query; this._mutationType = config.mutation; - this._subscriptionType = config.subscription; // Provide specified directives (e.g. @include and @skip) by default. - - this._directives = (_config$directives = config.directives) !== null && _config$directives !== void 0 ? _config$directives : _directives.specifiedDirectives; // To preserve order of user-provided types, we add first to add them to + this._subscriptionType = config.subscription; + // Provide specified directives (e.g. @include and @skip) by default. + this._directives = (_config$directives = config.directives) !== null && _config$directives !== void 0 ? _config$directives : _directives.specifiedDirectives; + // To preserve order of user-provided types, we add first to add them to // the set of "collected" types, so `collectReferencedTypes` ignore them. - const allReferencedTypes = new Set(config.types); if (config.types != null) { for (const type of config.types) { @@ -33394,18 +34271,17 @@ class GraphQLSchema { } } } - collectReferencedTypes(_introspection.__Schema, allReferencedTypes); // Storing the resulting map for reference by the schema. - + collectReferencedTypes(_introspection.__Schema, allReferencedTypes); + // Storing the resulting map for reference by the schema. this._typeMap = Object.create(null); - this._subTypeMap = Object.create(null); // Keep track of all implementations by interface name. - + this._subTypeMap = new Map(); + // Keep track of all implementations by interface name. this._implementationsMap = Object.create(null); for (const namedType of allReferencedTypes) { if (namedType == null) { continue; } const typeName = namedType.name; - typeName || (0, _devAssert.devAssert)(false, 'One of the provided types for building the Schema is missing a name.'); if (this._typeMap[typeName] !== undefined) { throw new Error(`Schema must contain uniquely named types but contains multiple types named "${typeName}".`); } @@ -33480,25 +34356,17 @@ class GraphQLSchema { }; } isSubType(abstractType, maybeSubType) { - let map = this._subTypeMap[abstractType.name]; - if (map === undefined) { - map = Object.create(null); + let set = this._subTypeMap.get(abstractType); + if (set === undefined) { if ((0, _definition.isUnionType)(abstractType)) { - for (const type of abstractType.getTypes()) { - map[type.name] = true; - } + set = new Set(abstractType.getTypes()); } else { const implementations = this.getImplementations(abstractType); - for (const type of implementations.objects) { - map[type.name] = true; - } - for (const type of implementations.interfaces) { - map[type.name] = true; - } + set = new Set([...implementations.objects, ...implementations.interfaces]); } - this._subTypeMap[abstractType.name] = map; + this._subTypeMap.set(abstractType, set); } - return map[maybeSubType.name] !== undefined; + return set.has(maybeSubType); } getDirectives() { return this._directives; @@ -33506,6 +34374,33 @@ class GraphQLSchema { getDirective(name) { return this.getDirectives().find(directive => directive.name === name); } + /** + * This method looks up the field on the given type definition. + * It has special casing for the three introspection fields, `__schema`, + * `__type` and `__typename`. + * + * `__typename` is special because it can always be queried as a field, even + * in situations where no other fields are allowed, like on a Union. + * + * `__schema` and `__type` could get automatically added to the query type, + * but that would require mutating type definitions, which would cause issues. + */ + getField(parentType, fieldName) { + switch (fieldName) { + case _introspection.SchemaMetaFieldDef.name: + return this.getQueryType() === parentType ? _introspection.SchemaMetaFieldDef : undefined; + case _introspection.TypeMetaFieldDef.name: + return this.getQueryType() === parentType ? _introspection.TypeMetaFieldDef : undefined; + case _introspection.TypeNameMetaFieldDef.name: + return _introspection.TypeNameMetaFieldDef; + } + // this function is part "hot" path inside executor and check presence + // of 'getFields' is faster than to use `!isUnionType` + if ('getFields' in parentType) { + return parentType.getFields()[fieldName]; + } + return undefined; + } toConfig() { return { description: this.description, @@ -33564,6 +34459,9 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.assertValidSchema = assertValidSchema; exports.validateSchema = validateSchema; +var _AccumulatorMap = __webpack_require__(/*! ../jsutils/AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); +var _capitalize = __webpack_require__(/*! ../jsutils/capitalize.mjs */ "../../../node_modules/graphql/jsutils/capitalize.mjs"); +var _formatList = __webpack_require__(/*! ../jsutils/formatList.mjs */ "../../../node_modules/graphql/jsutils/formatList.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); @@ -33579,21 +34477,20 @@ var _schema = __webpack_require__(/*! ./schema.mjs */ "../../../node_modules/gra * Validation runs synchronously, returning an array of encountered errors, or * an empty array if no errors were encountered and the Schema is valid. */ - function validateSchema(schema) { // First check to ensure the provided value is in fact a GraphQLSchema. - (0, _schema.assertSchema)(schema); // If this Schema has already been validated, return the previous results. - + (0, _schema.assertSchema)(schema); + // If this Schema has already been validated, return the previous results. if (schema.__validationErrors) { return schema.__validationErrors; - } // Validate the schema, producing a list of errors. - + } + // Validate the schema, producing a list of errors. const context = new SchemaValidationContext(schema); validateRootTypes(context); validateDirectives(context); - validateTypes(context); // Persist the results of validation before returning to ensure validation + validateTypes(context); + // Persist the results of validation before returning to ensure validation // does not run multiple times for this schema. - const errors = context.getErrors(); schema.__validationErrors = errors; return errors; @@ -33602,7 +34499,6 @@ function validateSchema(schema) { * Utility function which asserts a schema is valid by throwing an error if * it is invalid. */ - function assertValidSchema(schema) { const errors = validateSchema(schema); if (errors.length !== 0) { @@ -33626,22 +34522,28 @@ class SchemaValidationContext { } function validateRootTypes(context) { const schema = context.schema; - const queryType = schema.getQueryType(); - if (!queryType) { + if (schema.getQueryType() == null) { context.reportError('Query root type must be provided.', schema.astNode); - } else if (!(0, _definition.isObjectType)(queryType)) { - var _getOperationTypeNode; - context.reportError(`Query root type must be Object type, it cannot be ${(0, _inspect.inspect)(queryType)}.`, (_getOperationTypeNode = getOperationTypeNode(schema, _ast.OperationTypeNode.QUERY)) !== null && _getOperationTypeNode !== void 0 ? _getOperationTypeNode : queryType.astNode); } - const mutationType = schema.getMutationType(); - if (mutationType && !(0, _definition.isObjectType)(mutationType)) { - var _getOperationTypeNode2; - context.reportError('Mutation root type must be Object type if provided, it cannot be ' + `${(0, _inspect.inspect)(mutationType)}.`, (_getOperationTypeNode2 = getOperationTypeNode(schema, _ast.OperationTypeNode.MUTATION)) !== null && _getOperationTypeNode2 !== void 0 ? _getOperationTypeNode2 : mutationType.astNode); + const rootTypesMap = new _AccumulatorMap.AccumulatorMap(); + for (const operationType of Object.values(_ast.OperationTypeNode)) { + const rootType = schema.getRootType(operationType); + if (rootType != null) { + if (!(0, _definition.isObjectType)(rootType)) { + var _getOperationTypeNode; + const operationTypeStr = (0, _capitalize.capitalize)(operationType); + const rootTypeStr = (0, _inspect.inspect)(rootType); + context.reportError(operationType === _ast.OperationTypeNode.QUERY ? `${operationTypeStr} root type must be Object type, it cannot be ${rootTypeStr}.` : `${operationTypeStr} root type must be Object type if provided, it cannot be ${rootTypeStr}.`, (_getOperationTypeNode = getOperationTypeNode(schema, operationType)) !== null && _getOperationTypeNode !== void 0 ? _getOperationTypeNode : rootType.astNode); + } else { + rootTypesMap.add(rootType, operationType); + } + } } - const subscriptionType = schema.getSubscriptionType(); - if (subscriptionType && !(0, _definition.isObjectType)(subscriptionType)) { - var _getOperationTypeNode3; - context.reportError('Subscription root type must be Object type if provided, it cannot be ' + `${(0, _inspect.inspect)(subscriptionType)}.`, (_getOperationTypeNode3 = getOperationTypeNode(schema, _ast.OperationTypeNode.SUBSCRIPTION)) !== null && _getOperationTypeNode3 !== void 0 ? _getOperationTypeNode3 : subscriptionType.astNode); + for (const [rootType, operationTypes] of rootTypesMap) { + if (operationTypes.length > 1) { + const operationList = (0, _formatList.andList)(operationTypes); + context.reportError(`All root types must be different, "${rootType.name}" type is used as ${operationList} root types.`, operationTypes.map(operationType => getOperationTypeNode(schema, operationType))); + } } } function getOperationTypeNode(schema, operation) { @@ -33650,9 +34552,7 @@ function getOperationTypeNode(schema, operation) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 schemaNode => { var _schemaNode$operation; - return (/* c8 ignore next */ - (_schemaNode$operation = schemaNode === null || schemaNode === void 0 ? void 0 : schemaNode.operationTypes) !== null && _schemaNode$operation !== void 0 ? _schemaNode$operation : [] - ); + return /* c8 ignore next */(_schemaNode$operation = schemaNode === null || schemaNode === void 0 ? void 0 : schemaNode.operationTypes) !== null && _schemaNode$operation !== void 0 ? _schemaNode$operation : []; }).find(operationNode => operationNode.operation === operation)) === null || _flatMap$find === void 0 ? void 0 : _flatMap$find.type; } function validateDirectives(context) { @@ -33661,15 +34561,17 @@ function validateDirectives(context) { if (!(0, _directives.isDirective)(directive)) { context.reportError(`Expected directive but got: ${(0, _inspect.inspect)(directive)}.`, directive === null || directive === void 0 ? void 0 : directive.astNode); continue; - } // Ensure they are named correctly. - - validateName(context, directive); // TODO: Ensure proper locations. + } + // Ensure they are named correctly. + validateName(context, directive); + if (directive.locations.length === 0) { + context.reportError(`Directive @${directive.name} must include 1 or more locations.`, directive.astNode); + } // Ensure the arguments are valid. - for (const arg of directive.args) { // Ensure they are named correctly. - validateName(context, arg); // Ensure the type is an input type. - + validateName(context, arg); + // Ensure the type is an input type. if (!(0, _definition.isInputType)(arg.type)) { context.reportError(`The type of @${directive.name}(${arg.name}:) must be Input Type ` + `but got: ${(0, _inspect.inspect)(arg.type)}.`, arg.astNode); } @@ -33694,20 +34596,20 @@ function validateTypes(context) { if (!(0, _definition.isNamedType)(type)) { context.reportError(`Expected GraphQL named type but got: ${(0, _inspect.inspect)(type)}.`, type.astNode); continue; - } // Ensure it is named correctly (excluding introspection types). - + } + // Ensure it is named correctly (excluding introspection types). if (!(0, _introspection.isIntrospectionType)(type)) { validateName(context, type); } if ((0, _definition.isObjectType)(type)) { // Ensure fields are valid - validateFields(context, type); // Ensure objects implement the interfaces they claim to. - + validateFields(context, type); + // Ensure objects implement the interfaces they claim to. validateInterfaces(context, type); } else if ((0, _definition.isInterfaceType)(type)) { // Ensure fields are valid. - validateFields(context, type); // Ensure interfaces implement the interfaces they claim to. - + validateFields(context, type); + // Ensure interfaces implement the interfaces they claim to. validateInterfaces(context, type); } else if ((0, _definition.isUnionType)(type)) { // Ensure Unions include valid member types. @@ -33717,32 +34619,32 @@ function validateTypes(context) { validateEnumValues(context, type); } else if ((0, _definition.isInputObjectType)(type)) { // Ensure Input Object fields are valid. - validateInputFields(context, type); // Ensure Input Objects do not contain non-nullable circular references - + validateInputFields(context, type); + // Ensure Input Objects do not contain non-nullable circular references validateInputObjectCircularRefs(type); } } } function validateFields(context, type) { - const fields = Object.values(type.getFields()); // Objects and Interfaces both must define one or more fields. - + const fields = Object.values(type.getFields()); + // Objects and Interfaces both must define one or more fields. if (fields.length === 0) { context.reportError(`Type ${type.name} must define one or more fields.`, [type.astNode, ...type.extensionASTNodes]); } for (const field of fields) { // Ensure they are named correctly. - validateName(context, field); // Ensure the type is an output type - + validateName(context, field); + // Ensure the type is an output type if (!(0, _definition.isOutputType)(field.type)) { var _field$astNode; context.reportError(`The type of ${type.name}.${field.name} must be Output Type ` + `but got: ${(0, _inspect.inspect)(field.type)}.`, (_field$astNode = field.astNode) === null || _field$astNode === void 0 ? void 0 : _field$astNode.type); - } // Ensure the arguments are valid - + } + // Ensure the arguments are valid for (const arg of field.args) { - const argName = arg.name; // Ensure they are named correctly. - - validateName(context, arg); // Ensure the type is an input type - + const argName = arg.name; + // Ensure they are named correctly. + validateName(context, arg); + // Ensure the type is an input type if (!(0, _definition.isInputType)(arg.type)) { var _arg$astNode2; context.reportError(`The type of ${type.name}.${field.name}(${argName}:) must be Input ` + `Type but got: ${(0, _inspect.inspect)(arg.type)}.`, (_arg$astNode2 = arg.astNode) === null || _arg$astNode2 === void 0 ? void 0 : _arg$astNode2.type); @@ -33755,7 +34657,7 @@ function validateFields(context, type) { } } function validateInterfaces(context, type) { - const ifaceTypeNames = Object.create(null); + const ifaceTypeNames = new Set(); for (const iface of type.getInterfaces()) { if (!(0, _definition.isInterfaceType)(iface)) { context.reportError(`Type ${(0, _inspect.inspect)(type)} must only implement Interface types, ` + `it cannot implement ${(0, _inspect.inspect)(iface)}.`, getAllImplementsInterfaceNodes(type, iface)); @@ -33765,50 +34667,51 @@ function validateInterfaces(context, type) { context.reportError(`Type ${type.name} cannot implement itself because it would create a circular reference.`, getAllImplementsInterfaceNodes(type, iface)); continue; } - if (ifaceTypeNames[iface.name]) { + if (ifaceTypeNames.has(iface.name)) { context.reportError(`Type ${type.name} can only implement ${iface.name} once.`, getAllImplementsInterfaceNodes(type, iface)); continue; } - ifaceTypeNames[iface.name] = true; + ifaceTypeNames.add(iface.name); validateTypeImplementsAncestors(context, type, iface); validateTypeImplementsInterface(context, type, iface); } } function validateTypeImplementsInterface(context, type, iface) { - const typeFieldMap = type.getFields(); // Assert each interface field is implemented. - + const typeFieldMap = type.getFields(); + // Assert each interface field is implemented. for (const ifaceField of Object.values(iface.getFields())) { const fieldName = ifaceField.name; - const typeField = typeFieldMap[fieldName]; // Assert interface field exists on type. - - if (!typeField) { + const typeField = typeFieldMap[fieldName]; + // Assert interface field exists on type. + if (typeField == null) { context.reportError(`Interface field ${iface.name}.${fieldName} expected but ${type.name} does not provide it.`, [ifaceField.astNode, type.astNode, ...type.extensionASTNodes]); continue; - } // Assert interface field type is satisfied by type field type, by being + } + // Assert interface field type is satisfied by type field type, by being // a valid subtype. (covariant) - if (!(0, _typeComparators.isTypeSubTypeOf)(context.schema, typeField.type, ifaceField.type)) { var _ifaceField$astNode, _typeField$astNode; context.reportError(`Interface field ${iface.name}.${fieldName} expects type ` + `${(0, _inspect.inspect)(ifaceField.type)} but ${type.name}.${fieldName} ` + `is type ${(0, _inspect.inspect)(typeField.type)}.`, [(_ifaceField$astNode = ifaceField.astNode) === null || _ifaceField$astNode === void 0 ? void 0 : _ifaceField$astNode.type, (_typeField$astNode = typeField.astNode) === null || _typeField$astNode === void 0 ? void 0 : _typeField$astNode.type]); - } // Assert each interface field arg is implemented. - + } + // Assert each interface field arg is implemented. for (const ifaceArg of ifaceField.args) { const argName = ifaceArg.name; - const typeArg = typeField.args.find(arg => arg.name === argName); // Assert interface field arg exists on object field. - + const typeArg = typeField.args.find(arg => arg.name === argName); + // Assert interface field arg exists on object field. if (!typeArg) { context.reportError(`Interface field argument ${iface.name}.${fieldName}(${argName}:) expected but ${type.name}.${fieldName} does not provide it.`, [ifaceArg.astNode, typeField.astNode]); continue; - } // Assert interface field arg type matches object field arg type. + } + // Assert interface field arg type matches object field arg type. // (invariant) // TODO: change to contravariant? - if (!(0, _typeComparators.isEqualType)(ifaceArg.type, typeArg.type)) { var _ifaceArg$astNode, _typeArg$astNode; context.reportError(`Interface field argument ${iface.name}.${fieldName}(${argName}:) ` + `expects type ${(0, _inspect.inspect)(ifaceArg.type)} but ` + `${type.name}.${fieldName}(${argName}:) is type ` + `${(0, _inspect.inspect)(typeArg.type)}.`, [(_ifaceArg$astNode = ifaceArg.astNode) === null || _ifaceArg$astNode === void 0 ? void 0 : _ifaceArg$astNode.type, (_typeArg$astNode = typeArg.astNode) === null || _typeArg$astNode === void 0 ? void 0 : _typeArg$astNode.type]); - } // TODO: validate default values? - } // Assert additional arguments must not be required. - + } + // TODO: validate default values? + } + // Assert additional arguments must not be required. for (const typeArg of typeField.args) { const argName = typeArg.name; const ifaceArg = ifaceField.args.find(arg => arg.name === argName); @@ -33831,13 +34734,13 @@ function validateUnionMembers(context, union) { if (memberTypes.length === 0) { context.reportError(`Union type ${union.name} must define one or more member types.`, [union.astNode, ...union.extensionASTNodes]); } - const includedTypeNames = Object.create(null); + const includedTypeNames = new Set(); for (const memberType of memberTypes) { - if (includedTypeNames[memberType.name]) { + if (includedTypeNames.has(memberType.name)) { context.reportError(`Union type ${union.name} can only include type ${memberType.name} once.`, getUnionMemberTypeNodes(union, memberType.name)); continue; } - includedTypeNames[memberType.name] = true; + includedTypeNames.add(memberType.name); if (!(0, _definition.isObjectType)(memberType)) { context.reportError(`Union type ${union.name} can only include Object types, ` + `it cannot include ${(0, _inspect.inspect)(memberType)}.`, getUnionMemberTypeNodes(union, String(memberType))); } @@ -33857,12 +34760,12 @@ function validateInputFields(context, inputObj) { const fields = Object.values(inputObj.getFields()); if (fields.length === 0) { context.reportError(`Input Object type ${inputObj.name} must define one or more fields.`, [inputObj.astNode, ...inputObj.extensionASTNodes]); - } // Ensure the arguments are valid - + } + // Ensure the arguments are valid for (const field of fields) { // Ensure they are named correctly. - validateName(context, field); // Ensure the type is an input type - + validateName(context, field); + // Ensure the type is an input type if (!(0, _definition.isInputType)(field.type)) { var _field$astNode2; context.reportError(`The type of ${inputObj.name}.${field.name} must be Input Type ` + `but got: ${(0, _inspect.inspect)(field.type)}.`, (_field$astNode2 = field.astNode) === null || _field$astNode2 === void 0 ? void 0 : _field$astNode2.type); @@ -33871,26 +34774,38 @@ function validateInputFields(context, inputObj) { var _field$astNode3; context.reportError(`Required input field ${inputObj.name}.${field.name} cannot be deprecated.`, [getDeprecatedDirectiveNode(field.astNode), (_field$astNode3 = field.astNode) === null || _field$astNode3 === void 0 ? void 0 : _field$astNode3.type]); } + if (inputObj.isOneOf) { + validateOneOfInputObjectField(inputObj, field, context); + } + } +} +function validateOneOfInputObjectField(type, field, context) { + if ((0, _definition.isNonNullType)(field.type)) { + var _field$astNode4; + context.reportError(`OneOf input field ${type.name}.${field.name} must be nullable.`, (_field$astNode4 = field.astNode) === null || _field$astNode4 === void 0 ? void 0 : _field$astNode4.type); + } + if (field.defaultValue !== undefined) { + context.reportError(`OneOf input field ${type.name}.${field.name} cannot have a default value.`, field.astNode); } } function createInputObjectCircularRefsValidator(context) { // Modified copy of algorithm from 'src/validation/rules/NoFragmentCycles.js'. // Tracks already visited types to maintain O(N) and to ensure that cycles // are not redundantly reported. - const visitedTypes = Object.create(null); // Array of types nodes used to produce meaningful errors - - const fieldPath = []; // Position in the type path - + const visitedTypes = new Set(); + // Array of types nodes used to produce meaningful errors + const fieldPath = []; + // Position in the type path const fieldPathIndexByTypeName = Object.create(null); - return detectCycleRecursive; // This does a straight-forward DFS to find cycles. + return detectCycleRecursive; + // This does a straight-forward DFS to find cycles. // It does not terminate when a cycle was found but continues to explore // the graph to find all possible cycles. - function detectCycleRecursive(inputObj) { - if (visitedTypes[inputObj.name]) { + if (visitedTypes.has(inputObj)) { return; } - visitedTypes[inputObj.name] = true; + visitedTypes.add(inputObj); fieldPathIndexByTypeName[inputObj.name] = fieldPath.length; const fields = Object.values(inputObj.getFields()); for (const field of fields) { @@ -33916,13 +34831,11 @@ function getAllImplementsInterfaceNodes(type, iface) { astNode, extensionASTNodes } = type; - const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; // FIXME: https://github.com/graphql/graphql-js/issues/2203 - + const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 return nodes.flatMap(typeNode => { var _typeNode$interfaces; - return (/* c8 ignore next */ - (_typeNode$interfaces = typeNode.interfaces) !== null && _typeNode$interfaces !== void 0 ? _typeNode$interfaces : [] - ); + return /* c8 ignore next */(_typeNode$interfaces = typeNode.interfaces) !== null && _typeNode$interfaces !== void 0 ? _typeNode$interfaces : []; }).filter(ifaceNode => ifaceNode.name.value === iface.name); } function getUnionMemberTypeNodes(union, typeName) { @@ -33930,13 +34843,11 @@ function getUnionMemberTypeNodes(union, typeName) { astNode, extensionASTNodes } = union; - const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; // FIXME: https://github.com/graphql/graphql-js/issues/2203 - + const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 return nodes.flatMap(unionNode => { var _unionNode$types; - return (/* c8 ignore next */ - (_unionNode$types = unionNode.types) !== null && _unionNode$types !== void 0 ? _unionNode$types : [] - ); + return /* c8 ignore next */(_unionNode$types = unionNode.types) !== null && _unionNode$types !== void 0 ? _unionNode$types : []; }).filter(typeNode => typeNode.name.value === typeName); } function getDeprecatedDirectiveNode(definitionNode) { @@ -33963,14 +34874,12 @@ var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _visitor = __webpack_require__(/*! ../language/visitor.mjs */ "../../../node_modules/graphql/language/visitor.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); -var _introspection = __webpack_require__(/*! ../type/introspection.mjs */ "../../../node_modules/graphql/type/introspection.mjs"); var _typeFromAST = __webpack_require__(/*! ./typeFromAST.mjs */ "../../../node_modules/graphql/utilities/typeFromAST.mjs"); /** * TypeInfo is a utility class which, given a GraphQL schema, can keep track * of the current field and type definitions at any point in a GraphQL document * AST during a recursive descent by calling `enter(node)` and `leave(node)`. */ - class TypeInfo { constructor(schema, /** @@ -34005,34 +34914,22 @@ class TypeInfo { return 'TypeInfo'; } getType() { - if (this._typeStack.length > 0) { - return this._typeStack[this._typeStack.length - 1]; - } + return this._typeStack.at(-1); } getParentType() { - if (this._parentTypeStack.length > 0) { - return this._parentTypeStack[this._parentTypeStack.length - 1]; - } + return this._parentTypeStack.at(-1); } getInputType() { - if (this._inputTypeStack.length > 0) { - return this._inputTypeStack[this._inputTypeStack.length - 1]; - } + return this._inputTypeStack.at(-1); } getParentInputType() { - if (this._inputTypeStack.length > 1) { - return this._inputTypeStack[this._inputTypeStack.length - 2]; - } + return this._inputTypeStack.at(-2); } getFieldDef() { - if (this._fieldDefStack.length > 0) { - return this._fieldDefStack[this._fieldDefStack.length - 1]; - } + return this._fieldDefStack.at(-1); } getDefaultValue() { - if (this._defaultValueStack.length > 0) { - return this._defaultValueStack[this._defaultValueStack.length - 1]; - } + return this._defaultValueStack.at(-1); } getDirective() { return this._directive; @@ -34044,11 +34941,11 @@ class TypeInfo { return this._enumValue; } enter(node) { - const schema = this._schema; // Note: many of the types below are explicitly typed as "unknown" to drop + const schema = this._schema; + // Note: many of the types below are explicitly typed as "unknown" to drop // any assumptions of a valid schema to ensure runtime types are properly // checked before continuing since TypeInfo is used as part of validation // which occurs before guarantees of schema and document validity. - switch (node.kind) { case _kinds.Kind.SELECTION_SET: { @@ -34114,8 +35011,8 @@ class TypeInfo { case _kinds.Kind.LIST: { const listType = (0, _definition.getNullableType)(this.getInputType()); - const itemType = (0, _definition.isListType)(listType) ? listType.ofType : listType; // List positions never have a default value. - + const itemType = (0, _definition.isListType)(listType) ? listType.ofType : listType; + // List positions never have a default value. this._defaultValueStack.push(undefined); this._inputTypeStack.push((0, _definition.isInputType)(itemType) ? itemType : undefined); break; @@ -34127,7 +35024,7 @@ class TypeInfo { let inputField; if ((0, _definition.isInputObjectType)(objectType)) { inputField = objectType.getFields()[node.name.value]; - if (inputField) { + if (inputField != null) { inputFieldType = inputField.type; } } @@ -34145,10 +35042,10 @@ class TypeInfo { this._enumValue = enumValue; break; } - default: // Ignore other nodes + default: + // Ignore other nodes } } - leave(node) { switch (node.kind) { case _kinds.Kind.SELECTION_SET: @@ -34182,43 +35079,22 @@ class TypeInfo { case _kinds.Kind.ENUM: this._enumValue = null; break; - default: // Ignore other nodes + default: + // Ignore other nodes } } } - -/** - * Not exactly the same as the executor's definition of getFieldDef, in this - * statically evaluated environment we do not always have an Object type, - * and need to handle Interface and Union types. - */ exports.TypeInfo = TypeInfo; function getFieldDef(schema, parentType, fieldNode) { - const name = fieldNode.name.value; - if (name === _introspection.SchemaMetaFieldDef.name && schema.getQueryType() === parentType) { - return _introspection.SchemaMetaFieldDef; - } - if (name === _introspection.TypeMetaFieldDef.name && schema.getQueryType() === parentType) { - return _introspection.TypeMetaFieldDef; - } - if (name === _introspection.TypeNameMetaFieldDef.name && (0, _definition.isCompositeType)(parentType)) { - return _introspection.TypeNameMetaFieldDef; - } - if ((0, _definition.isObjectType)(parentType) || (0, _definition.isInterfaceType)(parentType)) { - return parentType.getFields()[name]; - } + return schema.getField(parentType, fieldNode.name.value); } /** * Creates a new visitor instance which maintains a provided TypeInfo instance * along with visiting visitor. */ - function visitWithTypeInfo(typeInfo, visitor) { return { - enter() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } + enter(...args) { const node = args[0]; typeInfo.enter(node); const fn = (0, _visitor.getEnterLeaveForKind)(visitor, node.kind).enter; @@ -34233,10 +35109,7 @@ function visitWithTypeInfo(typeInfo, visitor) { return result; } }, - leave() { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } + leave(...args) { const node = args[0]; const fn = (0, _visitor.getEnterLeaveForKind)(visitor, node.kind).leave; let result; @@ -34251,56 +35124,6 @@ function visitWithTypeInfo(typeInfo, visitor) { /***/ }), -/***/ "../../../node_modules/graphql/utilities/assertValidName.mjs": -/*!*******************************************************************!*\ - !*** ../../../node_modules/graphql/utilities/assertValidName.mjs ***! - \*******************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.assertValidName = assertValidName; -exports.isValidNameError = isValidNameError; -var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); -var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _assertName = __webpack_require__(/*! ../type/assertName.mjs */ "../../../node_modules/graphql/type/assertName.mjs"); -/* c8 ignore start */ - -/** - * Upholds the spec rules about naming. - * @deprecated Please use `assertName` instead. Will be removed in v17 - */ - -function assertValidName(name) { - const error = isValidNameError(name); - if (error) { - throw error; - } - return name; -} -/** - * Returns an Error if a name is invalid. - * @deprecated Please use `assertName` instead. Will be removed in v17 - */ - -function isValidNameError(name) { - typeof name === 'string' || (0, _devAssert.devAssert)(false, 'Expected name to be a string.'); - if (name.startsWith('__')) { - return new _GraphQLError.GraphQLError(`Name "${name}" must not begin with "__", which is reserved by GraphQL introspection.`); - } - try { - (0, _assertName.assertName)(name); - } catch (error) { - return error; - } -} -/* c8 ignore stop */ - -/***/ }), - /***/ "../../../node_modules/graphql/utilities/astFromValue.mjs": /*!****************************************************************!*\ !*** ../../../node_modules/graphql/utilities/astFromValue.mjs ***! @@ -34341,7 +35164,6 @@ var _scalars = __webpack_require__(/*! ../type/scalars.mjs */ "../../../node_mod * | null | NullValue | * */ - function astFromValue(value, type) { if ((0, _definition.isNonNullType)(type)) { const astValue = astFromValue(value, type.ofType); @@ -34349,19 +35171,19 @@ function astFromValue(value, type) { return null; } return astValue; - } // only explicit null, not undefined, NaN - + } + // only explicit null, not undefined, NaN if (value === null) { return { kind: _kinds.Kind.NULL }; - } // undefined - + } + // undefined if (value === undefined) { return null; - } // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but + } + // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but // the value is not an array, convert the value using the list's item type. - if ((0, _definition.isListType)(type)) { const itemType = type.ofType; if ((0, _isIterableObject.isIterableObject)(value)) { @@ -34378,9 +35200,9 @@ function astFromValue(value, type) { }; } return astFromValue(value, itemType); - } // Populate the fields of the input object by creating ASTs from each value + } + // Populate the fields of the input object by creating ASTs from each value // in the JavaScript object according to the fields in the input type. - if ((0, _definition.isInputObjectType)(type)) { if (!(0, _isObjectLike.isObjectLike)(value)) { return null; @@ -34410,15 +35232,15 @@ function astFromValue(value, type) { const serialized = type.serialize(value); if (serialized == null) { return null; - } // Others serialize based on their corresponding JavaScript scalar types. - + } + // Others serialize based on their corresponding JavaScript scalar types. if (typeof serialized === 'boolean') { return { kind: _kinds.Kind.BOOLEAN, value: serialized }; - } // JavaScript numbers can be Int or Float values. - + } + // JavaScript numbers can be Int or Float values. if (typeof serialized === 'number' && Number.isFinite(serialized)) { const stringNum = String(serialized); return integerStringRegExp.test(stringNum) ? { @@ -34436,8 +35258,8 @@ function astFromValue(value, type) { kind: _kinds.Kind.ENUM, value: serialized }; - } // ID types can use Int literals. - + } + // ID types can use Int literals. if (type === _scalars.GraphQLID && integerStringRegExp.test(serialized)) { return { kind: _kinds.Kind.INT, @@ -34453,7 +35275,6 @@ function astFromValue(value, type) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. - false || (0, _invariant.invariant)(false, 'Unexpected input type: ' + (0, _inspect.inspect)(type)); } /** @@ -34461,7 +35282,6 @@ function astFromValue(value, type) { * - NegativeSign? 0 * - NegativeSign? NonZeroDigit ( Digit+ )? */ - const integerStringRegExp = /^-?(?:0|[1-9][0-9]*)$/; /***/ }), @@ -34479,8 +35299,6 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.buildASTSchema = buildASTSchema; exports.buildSchema = buildSchema; -var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); -var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _parser = __webpack_require__(/*! ../language/parser.mjs */ "../../../node_modules/graphql/language/parser.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); var _schema = __webpack_require__(/*! ../type/schema.mjs */ "../../../node_modules/graphql/type/schema.mjs"); @@ -34497,7 +35315,6 @@ var _extendSchema = __webpack_require__(/*! ./extendSchema.mjs */ "../../../node * has no resolve methods, so execution will use default resolvers. */ function buildASTSchema(documentAST, options) { - documentAST != null && documentAST.kind === _kinds.Kind.DOCUMENT || (0, _devAssert.devAssert)(false, 'Must provide valid Document AST.'); if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) { (0, _validate.assertValidSDL)(documentAST); } @@ -34543,7 +35360,6 @@ function buildASTSchema(documentAST, options) { * A helper function to build a GraphQLSchema directly from a source * document. */ - function buildSchema(source, options) { const document = (0, _parser.parse)(source, { noLocation: options === null || options === void 0 ? void 0 : options.noLocation, @@ -34592,49 +35408,50 @@ var _valueFromAST = __webpack_require__(/*! ./valueFromAST.mjs */ "../../../node * This function expects a complete introspection result. Don't forget to check * the "errors" field of a server response before calling this function. */ - function buildClientSchema(introspection, options) { - (0, _isObjectLike.isObjectLike)(introspection) && (0, _isObjectLike.isObjectLike)(introspection.__schema) || (0, _devAssert.devAssert)(false, `Invalid or incomplete introspection result. Ensure that you are passing "data" property of introspection response and no "errors" was returned alongside: ${(0, _inspect.inspect)(introspection)}.`); // Get the schema from the introspection result. - - const schemaIntrospection = introspection.__schema; // Iterate through all types, getting the type definition for each. - - const typeMap = (0, _keyValMap.keyValMap)(schemaIntrospection.types, typeIntrospection => typeIntrospection.name, typeIntrospection => buildType(typeIntrospection)); // Include standard types only if they are used. - + // Even though the `introspection` argument is typed, in most cases it's received + // as an untyped value from the server, so we will do an additional check here. + (0, _isObjectLike.isObjectLike)(introspection) && (0, _isObjectLike.isObjectLike)(introspection.__schema) || (0, _devAssert.devAssert)(false, `Invalid or incomplete introspection result. Ensure that you are passing "data" property of introspection response and no "errors" was returned alongside: ${(0, _inspect.inspect)(introspection)}.`); + // Get the schema from the introspection result. + const schemaIntrospection = introspection.__schema; + // Iterate through all types, getting the type definition for each. + const typeMap = new Map(schemaIntrospection.types.map(typeIntrospection => [typeIntrospection.name, buildType(typeIntrospection)])); + // Include standard types only if they are used. for (const stdType of [..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes]) { - if (typeMap[stdType.name]) { - typeMap[stdType.name] = stdType; + if (typeMap.has(stdType.name)) { + typeMap.set(stdType.name, stdType); } - } // Get the root Query, Mutation, and Subscription types. - - const queryType = schemaIntrospection.queryType ? getObjectType(schemaIntrospection.queryType) : null; - const mutationType = schemaIntrospection.mutationType ? getObjectType(schemaIntrospection.mutationType) : null; - const subscriptionType = schemaIntrospection.subscriptionType ? getObjectType(schemaIntrospection.subscriptionType) : null; // Get the directives supported by Introspection, assuming empty-set if + } + // Get the root Query, Mutation, and Subscription types. + const queryType = schemaIntrospection.queryType != null ? getObjectType(schemaIntrospection.queryType) : null; + const mutationType = schemaIntrospection.mutationType != null ? getObjectType(schemaIntrospection.mutationType) : null; + const subscriptionType = schemaIntrospection.subscriptionType != null ? getObjectType(schemaIntrospection.subscriptionType) : null; + // Get the directives supported by Introspection, assuming empty-set if // directives were not queried for. - - const directives = schemaIntrospection.directives ? schemaIntrospection.directives.map(buildDirective) : []; // Then produce and return a Schema with these types. - + const directives = schemaIntrospection.directives != null ? schemaIntrospection.directives.map(buildDirective) : []; + // Then produce and return a Schema with these types. return new _schema.GraphQLSchema({ description: schemaIntrospection.description, query: queryType, mutation: mutationType, subscription: subscriptionType, - types: Object.values(typeMap), + types: [...typeMap.values()], directives, assumeValid: options === null || options === void 0 ? void 0 : options.assumeValid - }); // Given a type reference in introspection, return the GraphQLType instance. + }); + // Given a type reference in introspection, return the GraphQLType instance. // preferring cached instances before building new instances. - function getType(typeRef) { if (typeRef.kind === _introspection.TypeKind.LIST) { const itemRef = typeRef.ofType; - if (!itemRef) { + if (itemRef == null) { throw new Error('Decorated type deeper than introspection query.'); } return new _definition.GraphQLList(getType(itemRef)); } if (typeRef.kind === _introspection.TypeKind.NON_NULL) { const nullableRef = typeRef.ofType; - if (!nullableRef) { + if (nullableRef == null) { throw new Error('Decorated type deeper than introspection query.'); } const nullableType = getType(nullableRef); @@ -34647,8 +35464,8 @@ function buildClientSchema(introspection, options) { if (!typeName) { throw new Error(`Unknown type reference: ${(0, _inspect.inspect)(typeRef)}.`); } - const type = typeMap[typeName]; - if (!type) { + const type = typeMap.get(typeName); + if (type == null) { throw new Error(`Invalid or incomplete schema, unknown type: ${typeName}. Ensure that a full introspection query is used in order to build a client schema.`); } return type; @@ -34658,9 +35475,9 @@ function buildClientSchema(introspection, options) { } function getInterfaceType(typeRef) { return (0, _definition.assertInterfaceType)(getNamedType(typeRef)); - } // Given a type's introspection result, construct the correct + } + // Given a type's introspection result, construct the correct // GraphQLType instance. - function buildType(type) { // eslint-disable-next-line @typescript-eslint/prefer-optional-chain if (type != null && type.name != null && type.kind != null) { @@ -34697,7 +35514,7 @@ function buildClientSchema(introspection, options) { if (implementingIntrospection.interfaces === null && implementingIntrospection.kind === _introspection.TypeKind.INTERFACE) { return []; } - if (!implementingIntrospection.interfaces) { + if (implementingIntrospection.interfaces == null) { const implementingIntrospectionStr = (0, _inspect.inspect)(implementingIntrospection); throw new Error(`Introspection result missing interfaces: ${implementingIntrospectionStr}.`); } @@ -34720,7 +35537,7 @@ function buildClientSchema(introspection, options) { }); } function buildUnionDef(unionIntrospection) { - if (!unionIntrospection.possibleTypes) { + if (unionIntrospection.possibleTypes == null) { const unionIntrospectionStr = (0, _inspect.inspect)(unionIntrospection); throw new Error(`Introspection result missing possibleTypes: ${unionIntrospectionStr}.`); } @@ -34731,7 +35548,7 @@ function buildClientSchema(introspection, options) { }); } function buildEnumDef(enumIntrospection) { - if (!enumIntrospection.enumValues) { + if (enumIntrospection.enumValues == null) { const enumIntrospectionStr = (0, _inspect.inspect)(enumIntrospection); throw new Error(`Introspection result missing enumValues: ${enumIntrospectionStr}.`); } @@ -34745,18 +35562,19 @@ function buildClientSchema(introspection, options) { }); } function buildInputObjectDef(inputObjectIntrospection) { - if (!inputObjectIntrospection.inputFields) { + if (inputObjectIntrospection.inputFields == null) { const inputObjectIntrospectionStr = (0, _inspect.inspect)(inputObjectIntrospection); throw new Error(`Introspection result missing inputFields: ${inputObjectIntrospectionStr}.`); } return new _definition.GraphQLInputObjectType({ name: inputObjectIntrospection.name, description: inputObjectIntrospection.description, - fields: () => buildInputValueDefMap(inputObjectIntrospection.inputFields) + fields: () => buildInputValueDefMap(inputObjectIntrospection.inputFields), + isOneOf: inputObjectIntrospection.isOneOf }); } function buildFieldDefMap(typeIntrospection) { - if (!typeIntrospection.fields) { + if (typeIntrospection.fields == null) { throw new Error(`Introspection result missing fields: ${(0, _inspect.inspect)(typeIntrospection)}.`); } return (0, _keyValMap.keyValMap)(typeIntrospection.fields, fieldIntrospection => fieldIntrospection.name, buildField); @@ -34767,7 +35585,7 @@ function buildClientSchema(introspection, options) { const typeStr = (0, _inspect.inspect)(type); throw new Error(`Introspection must provide output type for fields, but received: ${typeStr}.`); } - if (!fieldIntrospection.args) { + if (fieldIntrospection.args == null) { const fieldIntrospectionStr = (0, _inspect.inspect)(fieldIntrospection); throw new Error(`Introspection result missing field args: ${fieldIntrospectionStr}.`); } @@ -34796,11 +35614,11 @@ function buildClientSchema(introspection, options) { }; } function buildDirective(directiveIntrospection) { - if (!directiveIntrospection.args) { + if (directiveIntrospection.args == null) { const directiveIntrospectionStr = (0, _inspect.inspect)(directiveIntrospection); throw new Error(`Introspection result missing directive args: ${directiveIntrospectionStr}.`); } - if (!directiveIntrospection.locations) { + if (directiveIntrospection.locations == null) { const directiveIntrospectionStr = (0, _inspect.inspect)(directiveIntrospection); throw new Error(`Introspection result missing directive locations: ${directiveIntrospectionStr}.`); } @@ -34841,8 +35659,7 @@ var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../no /** * Coerces a JavaScript value given a GraphQL Input Type. */ -function coerceInputValue(inputValue, type) { - let onError = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultOnError; +function coerceInputValue(inputValue, type, onError = defaultOnError) { return coerceInputValueImpl(inputValue, type, onError, undefined); } function defaultOnError(path, invalidValue, error) { @@ -34872,8 +35689,8 @@ function coerceInputValueImpl(inputValue, type, onError, path) { const itemPath = (0, _Path.addPath)(path, index, undefined); return coerceInputValueImpl(itemValue, itemType, onError, itemPath); }); - } // Lists accept a non-list value as a list of one. - + } + // Lists accept a non-list value as a list of one. return [coerceInputValueImpl(inputValue, itemType, onError, path)]; } if ((0, _definition.isInputObjectType)(type)) { @@ -34895,21 +35712,32 @@ function coerceInputValueImpl(inputValue, type, onError, path) { continue; } coercedValue[field.name] = coerceInputValueImpl(fieldValue, field.type, onError, (0, _Path.addPath)(path, field.name, type.name)); - } // Ensure every provided field is defined. - + } + // Ensure every provided field is defined. for (const fieldName of Object.keys(inputValue)) { - if (!fieldDefs[fieldName]) { + if (fieldDefs[fieldName] == null) { const suggestions = (0, _suggestionList.suggestionList)(fieldName, Object.keys(type.getFields())); onError((0, _Path.pathToArray)(path), inputValue, new _GraphQLError.GraphQLError(`Field "${fieldName}" is not defined by type "${type.name}".` + (0, _didYouMean.didYouMean)(suggestions))); } } + if (type.isOneOf) { + const keys = Object.keys(coercedValue); + if (keys.length !== 1) { + onError((0, _Path.pathToArray)(path), inputValue, new _GraphQLError.GraphQLError(`Exactly one key must be specified for OneOf type "${type.name}".`)); + } + const key = keys[0]; + const value = coercedValue[key]; + if (value === null) { + onError((0, _Path.pathToArray)(path).concat(key), value, new _GraphQLError.GraphQLError(`Field "${key}" must be non-null.`)); + } + } return coercedValue; } if ((0, _definition.isLeafType)(type)) { - let parseResult; // Scalars and Enums determine if a input value is valid via parseValue(), + let parseResult; + // Scalars and Enums determine if an input value is valid via parseValue(), // which can throw to indicate failure. If it throws, maintain a reference // to the original error. - try { parseResult = type.parseValue(inputValue); } catch (error) { @@ -34929,7 +35757,6 @@ function coerceInputValueImpl(inputValue, type, onError, path) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. - false || (0, _invariant.invariant)(false, 'Unexpected input type: ' + (0, _inspect.inspect)(type)); } @@ -34953,7 +35780,6 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * concatenate the ASTs together into batched AST, useful for validating many * GraphQL source files which together represent one conceptual application. */ - function concatAST(documents) { const definitions = []; for (const doc of documents) { @@ -34980,13 +35806,11 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.extendSchema = extendSchema; exports.extendSchemaImpl = extendSchemaImpl; -var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +var _AccumulatorMap = __webpack_require__(/*! ../jsutils/AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _mapValue = __webpack_require__(/*! ../jsutils/mapValue.mjs */ "../../../node_modules/graphql/jsutils/mapValue.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); -var _predicates = __webpack_require__(/*! ../language/predicates.mjs */ "../../../node_modules/graphql/language/predicates.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); var _introspection = __webpack_require__(/*! ../type/introspection.mjs */ "../../../node_modules/graphql/type/introspection.mjs"); @@ -35009,7 +35833,6 @@ var _valueFromAST = __webpack_require__(/*! ./valueFromAST.mjs */ "../../../node */ function extendSchema(schema, documentAST, options) { (0, _schema.assertSchema)(schema); - documentAST != null && documentAST.kind === _kinds.Kind.DOCUMENT || (0, _devAssert.devAssert)(false, 'Must provide valid Document AST.'); if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) { (0, _validate.assertValidSDLExtension)(documentAST, schema); } @@ -35020,47 +35843,77 @@ function extendSchema(schema, documentAST, options) { /** * @internal */ - function extendSchemaImpl(schemaConfig, documentAST, options) { - var _schemaDef, _schemaDef$descriptio, _schemaDef2, _options$assumeValid; - + var _schemaDef$descriptio, _schemaDef, _schemaDef$descriptio2, _schemaDef2, _options$assumeValid; // Collect the type definitions and extensions found in the document. const typeDefs = []; - const typeExtensionsMap = Object.create(null); // New directives and types are separate because a directives and types can + const scalarExtensions = new _AccumulatorMap.AccumulatorMap(); + const objectExtensions = new _AccumulatorMap.AccumulatorMap(); + const interfaceExtensions = new _AccumulatorMap.AccumulatorMap(); + const unionExtensions = new _AccumulatorMap.AccumulatorMap(); + const enumExtensions = new _AccumulatorMap.AccumulatorMap(); + const inputObjectExtensions = new _AccumulatorMap.AccumulatorMap(); + // New directives and types are separate because a directives and types can // have the same name. For example, a type named "skip". - const directiveDefs = []; - let schemaDef; // Schema extensions are collected which may add additional operation types. - + let schemaDef; + // Schema extensions are collected which may add additional operation types. const schemaExtensions = []; + let isSchemaChanged = false; for (const def of documentAST.definitions) { - if (def.kind === _kinds.Kind.SCHEMA_DEFINITION) { - schemaDef = def; - } else if (def.kind === _kinds.Kind.SCHEMA_EXTENSION) { - schemaExtensions.push(def); - } else if ((0, _predicates.isTypeDefinitionNode)(def)) { - typeDefs.push(def); - } else if ((0, _predicates.isTypeExtensionNode)(def)) { - const extendedTypeName = def.name.value; - const existingTypeExtensions = typeExtensionsMap[extendedTypeName]; - typeExtensionsMap[extendedTypeName] = existingTypeExtensions ? existingTypeExtensions.concat([def]) : [def]; - } else if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { - directiveDefs.push(def); - } - } // If this document contains no new types, extensions, or directives then + switch (def.kind) { + case _kinds.Kind.SCHEMA_DEFINITION: + schemaDef = def; + break; + case _kinds.Kind.SCHEMA_EXTENSION: + schemaExtensions.push(def); + break; + case _kinds.Kind.DIRECTIVE_DEFINITION: + directiveDefs.push(def); + break; + // Type Definitions + case _kinds.Kind.SCALAR_TYPE_DEFINITION: + case _kinds.Kind.OBJECT_TYPE_DEFINITION: + case _kinds.Kind.INTERFACE_TYPE_DEFINITION: + case _kinds.Kind.UNION_TYPE_DEFINITION: + case _kinds.Kind.ENUM_TYPE_DEFINITION: + case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION: + typeDefs.push(def); + break; + // Type System Extensions + case _kinds.Kind.SCALAR_TYPE_EXTENSION: + scalarExtensions.add(def.name.value, def); + break; + case _kinds.Kind.OBJECT_TYPE_EXTENSION: + objectExtensions.add(def.name.value, def); + break; + case _kinds.Kind.INTERFACE_TYPE_EXTENSION: + interfaceExtensions.add(def.name.value, def); + break; + case _kinds.Kind.UNION_TYPE_EXTENSION: + unionExtensions.add(def.name.value, def); + break; + case _kinds.Kind.ENUM_TYPE_EXTENSION: + enumExtensions.add(def.name.value, def); + break; + case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION: + inputObjectExtensions.add(def.name.value, def); + break; + default: + continue; + } + isSchemaChanged = true; + } + // If this document contains no new types, extensions, or directives then // return the same unmodified GraphQLSchema instance. - - if (Object.keys(typeExtensionsMap).length === 0 && typeDefs.length === 0 && directiveDefs.length === 0 && schemaExtensions.length === 0 && schemaDef == null) { + if (!isSchemaChanged) { return schemaConfig; } - const typeMap = Object.create(null); - for (const existingType of schemaConfig.types) { - typeMap[existingType.name] = extendNamedType(existingType); - } + const typeMap = new Map(schemaConfig.types.map(type => [type.name, extendNamedType(type)])); for (const typeNode of typeDefs) { - var _stdTypeMap$name; + var _stdTypeMap$get; const name = typeNode.name.value; - typeMap[name] = (_stdTypeMap$name = stdTypeMap[name]) !== null && _stdTypeMap$name !== void 0 ? _stdTypeMap$name : buildType(typeNode); + typeMap.set(name, (_stdTypeMap$get = stdTypeMap.get(name)) !== null && _stdTypeMap$get !== void 0 ? _stdTypeMap$get : buildType(typeNode)); } const operationTypes = { // Get the extended root operation types. @@ -35070,20 +35923,20 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { // Then, incorporate schema definition and all schema extensions. ...(schemaDef && getOperationTypes([schemaDef])), ...getOperationTypes(schemaExtensions) - }; // Then produce and return a Schema config with these types. - + }; + // Then produce and return a Schema config with these types. return { - description: (_schemaDef = schemaDef) === null || _schemaDef === void 0 ? void 0 : (_schemaDef$descriptio = _schemaDef.description) === null || _schemaDef$descriptio === void 0 ? void 0 : _schemaDef$descriptio.value, + description: (_schemaDef$descriptio = (_schemaDef = schemaDef) === null || _schemaDef === void 0 ? void 0 : (_schemaDef$descriptio2 = _schemaDef.description) === null || _schemaDef$descriptio2 === void 0 ? void 0 : _schemaDef$descriptio2.value) !== null && _schemaDef$descriptio !== void 0 ? _schemaDef$descriptio : schemaConfig.description, ...operationTypes, - types: Object.values(typeMap), + types: Array.from(typeMap.values()), directives: [...schemaConfig.directives.map(replaceDirective), ...directiveDefs.map(buildDirective)], - extensions: Object.create(null), + extensions: schemaConfig.extensions, astNode: (_schemaDef2 = schemaDef) !== null && _schemaDef2 !== void 0 ? _schemaDef2 : schemaConfig.astNode, extensionASTNodes: schemaConfig.extensionASTNodes.concat(schemaExtensions), assumeValid: (_options$assumeValid = options === null || options === void 0 ? void 0 : options.assumeValid) !== null && _options$assumeValid !== void 0 ? _options$assumeValid : false - }; // Below are functions used for producing this schema that have closed over + }; + // Below are functions used for producing this schema that have closed over // this scope and have access to the schema, cache, and newly defined types. - function replaceType(type) { if ((0, _definition.isListType)(type)) { // @ts-expect-error @@ -35092,17 +35945,21 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { if ((0, _definition.isNonNullType)(type)) { // @ts-expect-error return new _definition.GraphQLNonNull(replaceType(type.ofType)); - } // @ts-expect-error FIXME - + } + // @ts-expect-error FIXME return replaceNamedType(type); } function replaceNamedType(type) { // Note: While this could make early assertions to get the correctly // typed values, that would throw immediately while type system // validation with validateSchema() will produce more actionable results. - return typeMap[type.name]; + return typeMap.get(type.name); } function replaceDirective(directive) { + if ((0, _directives.isSpecifiedDirective)(directive)) { + // Builtin directives are not extended. + return directive; + } const config = directive.toConfig(); return new _directives.GraphQLDirective({ ...config, @@ -35134,13 +35991,12 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } /* c8 ignore next 3 */ // Not reachable, all possible type definition nodes have been considered. - false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function extendInputObjectType(type) { - var _typeExtensionsMap$co; + var _inputObjectExtension; const config = type.toConfig(); - const extensions = (_typeExtensionsMap$co = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co !== void 0 ? _typeExtensionsMap$co : []; + const extensions = (_inputObjectExtension = inputObjectExtensions.get(config.name)) !== null && _inputObjectExtension !== void 0 ? _inputObjectExtension : []; return new _definition.GraphQLInputObjectType({ ...config, fields: () => ({ @@ -35154,9 +36010,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendEnumType(type) { - var _typeExtensionsMap$ty; + var _enumExtensions$get; const config = type.toConfig(); - const extensions = (_typeExtensionsMap$ty = typeExtensionsMap[type.name]) !== null && _typeExtensionsMap$ty !== void 0 ? _typeExtensionsMap$ty : []; + const extensions = (_enumExtensions$get = enumExtensions.get(type.name)) !== null && _enumExtensions$get !== void 0 ? _enumExtensions$get : []; return new _definition.GraphQLEnumType({ ...config, values: { @@ -35167,9 +36023,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendScalarType(type) { - var _typeExtensionsMap$co2; + var _scalarExtensions$get; const config = type.toConfig(); - const extensions = (_typeExtensionsMap$co2 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co2 !== void 0 ? _typeExtensionsMap$co2 : []; + const extensions = (_scalarExtensions$get = scalarExtensions.get(config.name)) !== null && _scalarExtensions$get !== void 0 ? _scalarExtensions$get : []; let specifiedByURL = config.specifiedByURL; for (const extensionNode of extensions) { var _getSpecifiedByURL; @@ -35182,9 +36038,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendObjectType(type) { - var _typeExtensionsMap$co3; + var _objectExtensions$get; const config = type.toConfig(); - const extensions = (_typeExtensionsMap$co3 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co3 !== void 0 ? _typeExtensionsMap$co3 : []; + const extensions = (_objectExtensions$get = objectExtensions.get(config.name)) !== null && _objectExtensions$get !== void 0 ? _objectExtensions$get : []; return new _definition.GraphQLObjectType({ ...config, interfaces: () => [...type.getInterfaces().map(replaceNamedType), ...buildInterfaces(extensions)], @@ -35196,9 +36052,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendInterfaceType(type) { - var _typeExtensionsMap$co4; + var _interfaceExtensions$; const config = type.toConfig(); - const extensions = (_typeExtensionsMap$co4 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co4 !== void 0 ? _typeExtensionsMap$co4 : []; + const extensions = (_interfaceExtensions$ = interfaceExtensions.get(config.name)) !== null && _interfaceExtensions$ !== void 0 ? _interfaceExtensions$ : []; return new _definition.GraphQLInterfaceType({ ...config, interfaces: () => [...type.getInterfaces().map(replaceNamedType), ...buildInterfaces(extensions)], @@ -35210,9 +36066,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendUnionType(type) { - var _typeExtensionsMap$co5; + var _unionExtensions$get; const config = type.toConfig(); - const extensions = (_typeExtensionsMap$co5 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co5 !== void 0 ? _typeExtensionsMap$co5 : []; + const extensions = (_unionExtensions$get = unionExtensions.get(config.name)) !== null && _unionExtensions$get !== void 0 ? _unionExtensions$get : []; return new _definition.GraphQLUnionType({ ...config, types: () => [...type.getTypes().map(replaceNamedType), ...buildUnionTypes(extensions)], @@ -35236,10 +36092,8 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const opTypes = {}; for (const node of nodes) { var _node$operationTypes; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const operationTypesNodes = /* c8 ignore next */ - (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; + const operationTypesNodes = /* c8 ignore next */(_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; for (const operationType of operationTypesNodes) { // Note: While this could make early assertions to get the correctly // typed values below, that would throw immediately while type system @@ -35251,9 +36105,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { return opTypes; } function getNamedType(node) { - var _stdTypeMap$name2; + var _stdTypeMap$get2; const name = node.name.value; - const type = (_stdTypeMap$name2 = stdTypeMap[name]) !== null && _stdTypeMap$name2 !== void 0 ? _stdTypeMap$name2 : typeMap[name]; + const type = (_stdTypeMap$get2 = stdTypeMap.get(name)) !== null && _stdTypeMap$get2 !== void 0 ? _stdTypeMap$get2 : typeMap.get(name); if (type === undefined) { throw new Error(`Unknown type: "${name}".`); } @@ -35274,12 +36128,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { name: node.name.value, description: (_node$description = node.description) === null || _node$description === void 0 ? void 0 : _node$description.value, // @ts-expect-error - locations: node.locations.map(_ref => { - let { - value - } = _ref; - return value; - }), + locations: node.locations.map(({ + value + }) => value), isRepeatable: node.repeatable, args: buildArgumentMap(node.arguments), astNode: node @@ -35289,10 +36140,8 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const fieldConfigMap = Object.create(null); for (const node of nodes) { var _node$fields; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const nodeFields = /* c8 ignore next */ - (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; + const nodeFields = /* c8 ignore next */(_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; for (const field of nodeFields) { var _field$description; fieldConfigMap[field.name.value] = { @@ -35311,12 +36160,10 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } function buildArgumentMap(args) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const argsNodes = /* c8 ignore next */ - args !== null && args !== void 0 ? args : []; + const argsNodes = /* c8 ignore next */args !== null && args !== void 0 ? args : []; const argConfigMap = Object.create(null); for (const arg of argsNodes) { var _arg$description; - // Note: While this could make assertions to get the correctly typed // value, that would throw immediately while type system validation // with validateSchema() will produce more actionable results. @@ -35335,13 +36182,10 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const inputFieldMap = Object.create(null); for (const node of nodes) { var _node$fields2; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const fieldsNodes = /* c8 ignore next */ - (_node$fields2 = node.fields) !== null && _node$fields2 !== void 0 ? _node$fields2 : []; + const fieldsNodes = /* c8 ignore next */(_node$fields2 = node.fields) !== null && _node$fields2 !== void 0 ? _node$fields2 : []; for (const field of fieldsNodes) { var _field$description2; - // Note: While this could make assertions to get the correctly typed // value, that would throw immediately while type system validation // with validateSchema() will produce more actionable results. @@ -35361,10 +36205,8 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const enumValueMap = Object.create(null); for (const node of nodes) { var _node$values; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const valuesNodes = /* c8 ignore next */ - (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; + const valuesNodes = /* c8 ignore next */(_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; for (const value of valuesNodes) { var _value$description; enumValueMap[value.name.value] = { @@ -35385,9 +36227,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 node => { var _node$interfaces$map, _node$interfaces; - return (/* c8 ignore next */ - (_node$interfaces$map = (_node$interfaces = node.interfaces) === null || _node$interfaces === void 0 ? void 0 : _node$interfaces.map(getNamedType)) !== null && _node$interfaces$map !== void 0 ? _node$interfaces$map : [] - ); + return /* c8 ignore next */(_node$interfaces$map = (_node$interfaces = node.interfaces) === null || _node$interfaces === void 0 ? void 0 : _node$interfaces.map(getNamedType)) !== null && _node$interfaces$map !== void 0 ? _node$interfaces$map : []; }); } function buildUnionTypes(nodes) { @@ -35399,19 +36239,16 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 node => { var _node$types$map, _node$types; - return (/* c8 ignore next */ - (_node$types$map = (_node$types = node.types) === null || _node$types === void 0 ? void 0 : _node$types.map(getNamedType)) !== null && _node$types$map !== void 0 ? _node$types$map : [] - ); + return /* c8 ignore next */(_node$types$map = (_node$types = node.types) === null || _node$types === void 0 ? void 0 : _node$types.map(getNamedType)) !== null && _node$types$map !== void 0 ? _node$types$map : []; }); } function buildType(astNode) { - var _typeExtensionsMap$na; const name = astNode.name.value; - const extensionASTNodes = (_typeExtensionsMap$na = typeExtensionsMap[name]) !== null && _typeExtensionsMap$na !== void 0 ? _typeExtensionsMap$na : []; switch (astNode.kind) { case _kinds.Kind.OBJECT_TYPE_DEFINITION: { - var _astNode$description; + var _objectExtensions$get2, _astNode$description; + const extensionASTNodes = (_objectExtensions$get2 = objectExtensions.get(name)) !== null && _objectExtensions$get2 !== void 0 ? _objectExtensions$get2 : []; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLObjectType({ name, @@ -35424,7 +36261,8 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.INTERFACE_TYPE_DEFINITION: { - var _astNode$description2; + var _interfaceExtensions$2, _astNode$description2; + const extensionASTNodes = (_interfaceExtensions$2 = interfaceExtensions.get(name)) !== null && _interfaceExtensions$2 !== void 0 ? _interfaceExtensions$2 : []; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLInterfaceType({ name, @@ -35437,7 +36275,8 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.ENUM_TYPE_DEFINITION: { - var _astNode$description3; + var _enumExtensions$get2, _astNode$description3; + const extensionASTNodes = (_enumExtensions$get2 = enumExtensions.get(name)) !== null && _enumExtensions$get2 !== void 0 ? _enumExtensions$get2 : []; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLEnumType({ name, @@ -35449,7 +36288,8 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.UNION_TYPE_DEFINITION: { - var _astNode$description4; + var _unionExtensions$get2, _astNode$description4; + const extensionASTNodes = (_unionExtensions$get2 = unionExtensions.get(name)) !== null && _unionExtensions$get2 !== void 0 ? _unionExtensions$get2 : []; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLUnionType({ name, @@ -35461,7 +36301,8 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.SCALAR_TYPE_DEFINITION: { - var _astNode$description5; + var _scalarExtensions$get2, _astNode$description5; + const extensionASTNodes = (_scalarExtensions$get2 = scalarExtensions.get(name)) !== null && _scalarExtensions$get2 !== void 0 ? _scalarExtensions$get2 : []; return new _definition.GraphQLScalarType({ name, description: (_astNode$description5 = astNode.description) === null || _astNode$description5 === void 0 ? void 0 : _astNode$description5.value, @@ -35472,39 +36313,45 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION: { - var _astNode$description6; + var _inputObjectExtension2, _astNode$description6; + const extensionASTNodes = (_inputObjectExtension2 = inputObjectExtensions.get(name)) !== null && _inputObjectExtension2 !== void 0 ? _inputObjectExtension2 : []; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLInputObjectType({ name, description: (_astNode$description6 = astNode.description) === null || _astNode$description6 === void 0 ? void 0 : _astNode$description6.value, fields: () => buildInputFieldMap(allNodes), astNode, - extensionASTNodes + extensionASTNodes, + isOneOf: isOneOf(astNode) }); } } } } -const stdTypeMap = (0, _keyMap.keyMap)([..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes], type => type.name); +const stdTypeMap = new Map([..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes].map(type => [type.name, type])); /** * Given a field or enum value node, returns the string value for the * deprecation reason. */ - function getDeprecationReason(node) { - const deprecated = (0, _values.getDirectiveValues)(_directives.GraphQLDeprecatedDirective, node); // @ts-expect-error validated by `getDirectiveValues` - + const deprecated = (0, _values.getDirectiveValues)(_directives.GraphQLDeprecatedDirective, node); + // @ts-expect-error validated by `getDirectiveValues` return deprecated === null || deprecated === void 0 ? void 0 : deprecated.reason; } /** * Given a scalar node, returns the string value for the specifiedByURL. */ - function getSpecifiedByURL(node) { - const specifiedBy = (0, _values.getDirectiveValues)(_directives.GraphQLSpecifiedByDirective, node); // @ts-expect-error validated by `getDirectiveValues` - + const specifiedBy = (0, _values.getDirectiveValues)(_directives.GraphQLSpecifiedByDirective, node); + // @ts-expect-error validated by `getDirectiveValues` return specifiedBy === null || specifiedBy === void 0 ? void 0 : specifiedBy.url; } +/** + * Given an input object node, returns if the node should be OneOf. + */ +function isOneOf(node) { + return Boolean((0, _values.getDirectiveValues)(_directives.GraphQLOneOfDirective, node)); +} /***/ }), @@ -35531,7 +36378,6 @@ var _scalars = __webpack_require__(/*! ../type/scalars.mjs */ "../../../node_mod var _astFromValue = __webpack_require__(/*! ./astFromValue.mjs */ "../../../node_modules/graphql/utilities/astFromValue.mjs"); var _sortValueNode = __webpack_require__(/*! ./sortValueNode.mjs */ "../../../node_modules/graphql/utilities/sortValueNode.mjs"); var BreakingChangeType; -exports.BreakingChangeType = BreakingChangeType; (function (BreakingChangeType) { BreakingChangeType['TYPE_REMOVED'] = 'TYPE_REMOVED'; BreakingChangeType['TYPE_CHANGED_KIND'] = 'TYPE_CHANGED_KIND'; @@ -35551,7 +36397,6 @@ exports.BreakingChangeType = BreakingChangeType; BreakingChangeType['DIRECTIVE_LOCATION_REMOVED'] = 'DIRECTIVE_LOCATION_REMOVED'; })(BreakingChangeType || (exports.BreakingChangeType = BreakingChangeType = {})); var DangerousChangeType; -exports.DangerousChangeType = DangerousChangeType; (function (DangerousChangeType) { DangerousChangeType['VALUE_ADDED_TO_ENUM'] = 'VALUE_ADDED_TO_ENUM'; DangerousChangeType['TYPE_ADDED_TO_UNION'] = 'TYPE_ADDED_TO_UNION'; @@ -35572,7 +36417,6 @@ function findBreakingChanges(oldSchema, newSchema) { * Given two schemas, returns an Array containing descriptions of all the types * of potentially dangerous changes covered by the other functions down below. */ - function findDangerousChanges(oldSchema, newSchema) { // @ts-expect-error return findSchemaChanges(oldSchema, newSchema).filter(change => change.type in DangerousChangeType); @@ -35841,8 +36685,8 @@ function isChangeSafeForInputObjectFieldOrFieldArg(oldType, newType) { // moving from non-null to nullable of the same underlying type is safe !(0, _definition.isNonNullType)(newType) && isChangeSafeForInputObjectFieldOrFieldArg(oldType.ofType, newType) ); - } // if they're both named types, see if their names are equivalent - + } + // if they're both named types, see if their names are equivalent return (0, _definition.isNamedType)(newType) && oldType.name === newType.name; } function typeKindName(type) { @@ -35866,7 +36710,6 @@ function typeKindName(type) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. - false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function stringifyValue(value, type) { @@ -35878,18 +36721,12 @@ function diff(oldArray, newArray) { const added = []; const removed = []; const persisted = []; - const oldMap = (0, _keyMap.keyMap)(oldArray, _ref => { - let { - name - } = _ref; - return name; - }); - const newMap = (0, _keyMap.keyMap)(newArray, _ref2 => { - let { - name - } = _ref2; - return name; - }); + const oldMap = (0, _keyMap.keyMap)(oldArray, ({ + name + }) => name); + const newMap = (0, _keyMap.keyMap)(newArray, ({ + name + }) => name); for (const oldItem of oldArray) { const newItem = newMap[oldItem.name]; if (newItem === undefined) { @@ -35935,6 +36772,7 @@ function getIntrospectionQuery(options) { directiveIsRepeatable: false, schemaDescription: false, inputValueDeprecation: false, + oneOf: false, ...options }; const descriptions = optionsWithDefault.descriptions ? 'description' : ''; @@ -35944,6 +36782,7 @@ function getIntrospectionQuery(options) { function inputDeprecation(str) { return optionsWithDefault.inputValueDeprecation ? str : ''; } + const oneOf = optionsWithDefault.oneOf ? 'isOneOf' : ''; return ` query IntrospectionQuery { __schema { @@ -35971,6 +36810,7 @@ function getIntrospectionQuery(options) { name ${descriptions} ${specifiedByUrl} + ${oneOf} fields(includeDeprecated: true) { name ${descriptions} @@ -36072,7 +36912,6 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * name. If a name is not provided, an operation is only returned if only one is * provided in the document. */ - function getOperationAST(documentAST, operationName) { let operation = null; for (const definition of documentAST.definitions) { @@ -36096,59 +36935,6 @@ function getOperationAST(documentAST, operationName) { /***/ }), -/***/ "../../../node_modules/graphql/utilities/getOperationRootType.mjs": -/*!************************************************************************!*\ - !*** ../../../node_modules/graphql/utilities/getOperationRootType.mjs ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getOperationRootType = getOperationRootType; -var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -/** - * Extracts the root type of the operation from the schema. - * - * @deprecated Please use `GraphQLSchema.getRootType` instead. Will be removed in v17 - */ -function getOperationRootType(schema, operation) { - if (operation.operation === 'query') { - const queryType = schema.getQueryType(); - if (!queryType) { - throw new _GraphQLError.GraphQLError('Schema does not define the required query root type.', { - nodes: operation - }); - } - return queryType; - } - if (operation.operation === 'mutation') { - const mutationType = schema.getMutationType(); - if (!mutationType) { - throw new _GraphQLError.GraphQLError('Schema is not configured for mutations.', { - nodes: operation - }); - } - return mutationType; - } - if (operation.operation === 'subscription') { - const subscriptionType = schema.getSubscriptionType(); - if (!subscriptionType) { - throw new _GraphQLError.GraphQLError('Schema is not configured for subscriptions.', { - nodes: operation - }); - } - return subscriptionType; - } - throw new _GraphQLError.GraphQLError('Can only have query, mutation and subscription operations.', { - nodes: operation - }); -} - -/***/ }), - /***/ "../../../node_modules/graphql/utilities/index.mjs": /*!*********************************************************!*\ !*** ../../../node_modules/graphql/utilities/index.mjs ***! @@ -36178,12 +36964,6 @@ Object.defineProperty(exports, "TypeInfo", ({ return _TypeInfo.TypeInfo; } })); -Object.defineProperty(exports, "assertValidName", ({ - enumerable: true, - get: function () { - return _assertValidName.assertValidName; - } -})); Object.defineProperty(exports, "astFromValue", ({ enumerable: true, get: function () { @@ -36256,12 +37036,6 @@ Object.defineProperty(exports, "getOperationAST", ({ return _getOperationAST.getOperationAST; } })); -Object.defineProperty(exports, "getOperationRootType", ({ - enumerable: true, - get: function () { - return _getOperationRootType.getOperationRootType; - } -})); Object.defineProperty(exports, "introspectionFromSchema", ({ enumerable: true, get: function () { @@ -36280,16 +37054,16 @@ Object.defineProperty(exports, "isTypeSubTypeOf", ({ return _typeComparators.isTypeSubTypeOf; } })); -Object.defineProperty(exports, "isValidNameError", ({ +Object.defineProperty(exports, "lexicographicSortSchema", ({ enumerable: true, get: function () { - return _assertValidName.isValidNameError; + return _lexicographicSortSchema.lexicographicSortSchema; } })); -Object.defineProperty(exports, "lexicographicSortSchema", ({ +Object.defineProperty(exports, "printDirective", ({ enumerable: true, get: function () { - return _lexicographicSortSchema.lexicographicSortSchema; + return _printSchema.printDirective; } })); Object.defineProperty(exports, "printIntrospectionSchema", ({ @@ -36348,7 +37122,6 @@ Object.defineProperty(exports, "visitWithTypeInfo", ({ })); var _getIntrospectionQuery = __webpack_require__(/*! ./getIntrospectionQuery.mjs */ "../../../node_modules/graphql/utilities/getIntrospectionQuery.mjs"); var _getOperationAST = __webpack_require__(/*! ./getOperationAST.mjs */ "../../../node_modules/graphql/utilities/getOperationAST.mjs"); -var _getOperationRootType = __webpack_require__(/*! ./getOperationRootType.mjs */ "../../../node_modules/graphql/utilities/getOperationRootType.mjs"); var _introspectionFromSchema = __webpack_require__(/*! ./introspectionFromSchema.mjs */ "../../../node_modules/graphql/utilities/introspectionFromSchema.mjs"); var _buildClientSchema = __webpack_require__(/*! ./buildClientSchema.mjs */ "../../../node_modules/graphql/utilities/buildClientSchema.mjs"); var _buildASTSchema = __webpack_require__(/*! ./buildASTSchema.mjs */ "../../../node_modules/graphql/utilities/buildASTSchema.mjs"); @@ -36365,7 +37138,6 @@ var _concatAST = __webpack_require__(/*! ./concatAST.mjs */ "../../../node_modul var _separateOperations = __webpack_require__(/*! ./separateOperations.mjs */ "../../../node_modules/graphql/utilities/separateOperations.mjs"); var _stripIgnoredCharacters = __webpack_require__(/*! ./stripIgnoredCharacters.mjs */ "../../../node_modules/graphql/utilities/stripIgnoredCharacters.mjs"); var _typeComparators = __webpack_require__(/*! ./typeComparators.mjs */ "../../../node_modules/graphql/utilities/typeComparators.mjs"); -var _assertValidName = __webpack_require__(/*! ./assertValidName.mjs */ "../../../node_modules/graphql/utilities/assertValidName.mjs"); var _findBreakingChanges = __webpack_require__(/*! ./findBreakingChanges.mjs */ "../../../node_modules/graphql/utilities/findBreakingChanges.mjs"); /***/ }), @@ -36395,13 +37167,13 @@ var _getIntrospectionQuery = __webpack_require__(/*! ./getIntrospectionQuery.mjs * This is the inverse of buildClientSchema. The primary use case is outside * of the server context, for instance when doing schema comparisons. */ - function introspectionFromSchema(schema, options) { const optionsWithDefaults = { specifiedByUrl: true, directiveIsRepeatable: true, schemaDescription: true, inputValueDeprecation: true, + oneOf: true, ...options }; const document = (0, _parser.parse)((0, _getIntrospectionQuery.getIntrospectionQuery)(optionsWithDefaults)); @@ -36409,7 +37181,7 @@ function introspectionFromSchema(schema, options) { schema, document }); - !result.errors && result.data || (0, _invariant.invariant)(false); + result.errors == null && result.data != null || (0, _invariant.invariant)(false); return result.data; } @@ -36429,7 +37201,6 @@ Object.defineProperty(exports, "__esModule", ({ exports.lexicographicSortSchema = lexicographicSortSchema; var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _keyValMap = __webpack_require__(/*! ../jsutils/keyValMap.mjs */ "../../../node_modules/graphql/jsutils/keyValMap.mjs"); var _naturalCompare = __webpack_require__(/*! ../jsutils/naturalCompare.mjs */ "../../../node_modules/graphql/jsutils/naturalCompare.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); @@ -36440,13 +37211,12 @@ var _schema = __webpack_require__(/*! ../type/schema.mjs */ "../../../node_modul * * This function returns a sorted copy of the given GraphQLSchema. */ - function lexicographicSortSchema(schema) { const schemaConfig = schema.toConfig(); - const typeMap = (0, _keyValMap.keyValMap)(sortByName(schemaConfig.types), type => type.name, sortNamedType); + const typeMap = new Map(sortByName(schemaConfig.types).map(type => [type.name, sortNamedType(type)])); return new _schema.GraphQLSchema({ ...schemaConfig, - types: Object.values(typeMap), + types: Array.from(typeMap.values()), directives: sortByName(schemaConfig.directives).map(sortDirective), query: replaceMaybeType(schemaConfig.query), mutation: replaceMaybeType(schemaConfig.mutation), @@ -36459,12 +37229,12 @@ function lexicographicSortSchema(schema) { } else if ((0, _definition.isNonNullType)(type)) { // @ts-expect-error return new _definition.GraphQLNonNull(replaceType(type.ofType)); - } // @ts-expect-error FIXME: TS Conversion - + } + // @ts-expect-error FIXME: TS Conversion return replaceNamedType(type); } function replaceNamedType(type) { - return typeMap[type.name]; + return typeMap.get(type.name); } function replaceMaybeType(maybeType) { return maybeType && replaceNamedType(maybeType); @@ -36542,7 +37312,6 @@ function lexicographicSortSchema(schema) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. - false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } } @@ -36577,6 +37346,7 @@ function sortBy(array, mapToKey) { Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.printDirective = printDirective; exports.printIntrospectionSchema = printIntrospectionSchema; exports.printSchema = printSchema; exports.printType = printType; @@ -36605,23 +37375,19 @@ function printFilteredSchema(schema, directiveFilter, typeFilter) { return [printSchemaDefinition(schema), ...directives.map(directive => printDirective(directive)), ...types.map(type => printType(type))].filter(Boolean).join('\n\n'); } function printSchemaDefinition(schema) { - if (schema.description == null && isSchemaOfCommonNames(schema)) { - return; - } - const operationTypes = []; const queryType = schema.getQueryType(); - if (queryType) { - operationTypes.push(` query: ${queryType.name}`); - } const mutationType = schema.getMutationType(); - if (mutationType) { - operationTypes.push(` mutation: ${mutationType.name}`); - } const subscriptionType = schema.getSubscriptionType(); - if (subscriptionType) { - operationTypes.push(` subscription: ${subscriptionType.name}`); + // Special case: When a schema has no root operation types, no valid schema + // definition can be printed. + if (!queryType && !mutationType && !subscriptionType) { + return; + } + // Only print a schema definition if there is a description or if it should + // not be omitted because of having default type names. + if (schema.description != null || !hasDefaultRootOperationTypes(schema)) { + return printDescription(schema) + 'schema {\n' + (queryType ? ` query: ${queryType.name}\n` : '') + (mutationType ? ` mutation: ${mutationType.name}\n` : '') + (subscriptionType ? ` subscription: ${subscriptionType.name}\n` : '') + '}'; } - return printDescription(schema) + `schema {\n${operationTypes.join('\n')}\n}`; } /** * GraphQL schema define root types for each type of operation. These types are @@ -36636,23 +37402,16 @@ function printSchemaDefinition(schema) { * } * ``` * - * When using this naming convention, the schema description can be omitted. + * When using this naming convention, the schema description can be omitted so + * long as these names are only used for operation types. + * + * Note however that if any of these default names are used elsewhere in the + * schema but not as a root operation type, the schema definition must still + * be printed to avoid ambiguity. */ - -function isSchemaOfCommonNames(schema) { - const queryType = schema.getQueryType(); - if (queryType && queryType.name !== 'Query') { - return false; - } - const mutationType = schema.getMutationType(); - if (mutationType && mutationType.name !== 'Mutation') { - return false; - } - const subscriptionType = schema.getSubscriptionType(); - if (subscriptionType && subscriptionType.name !== 'Subscription') { - return false; - } - return true; +function hasDefaultRootOperationTypes(schema) { + /* eslint-disable eqeqeq */ + return schema.getQueryType() == schema.getType('Query') && schema.getMutationType() == schema.getType('Mutation') && schema.getSubscriptionType() == schema.getType('Subscription'); } function printType(type) { if ((0, _definition.isScalarType)(type)) { @@ -36675,7 +37434,6 @@ function printType(type) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. - false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function printScalar(type) { @@ -36702,7 +37460,7 @@ function printEnum(type) { } function printInputObject(type) { const fields = Object.values(type.getFields()).map((f, i) => printDescription(f, ' ', !i) + ' ' + printInputValue(f)); - return printDescription(type) + `input ${type.name}` + printBlock(fields); + return printDescription(type) + `input ${type.name}` + (type.isOneOf ? ' @oneOf' : '') + printBlock(fields); } function printFields(type) { const fields = Object.values(type.getFields()).map((f, i) => printDescription(f, ' ', !i) + ' ' + f.name + printArgs(f.args, ' ') + ': ' + String(f.type) + printDeprecated(f.deprecationReason)); @@ -36711,13 +37469,12 @@ function printFields(type) { function printBlock(items) { return items.length !== 0 ? ' {\n' + items.join('\n') + '\n}' : ''; } -function printArgs(args) { - let indentation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; +function printArgs(args, indentation = '') { if (args.length === 0) { return ''; - } // If every arg does not have a description, print them on one line. - - if (args.every(arg => !arg.description)) { + } + // If every arg does not have a description, print them on one line. + if (args.every(arg => arg.description == null)) { return '(' + args.map(printInputValue).join(', ') + ')'; } return '(\n' + args.map((arg, i) => printDescription(arg, ' ' + indentation, !i) + ' ' + indentation + printInputValue(arg)).join('\n') + '\n' + indentation + ')'; @@ -36756,9 +37513,7 @@ function printSpecifiedByURL(scalar) { }); return ` @specifiedBy(url: ${astValue})`; } -function printDescription(def) { - let indentation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - let firstInBlock = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; +function printDescription(def, indentation = '', firstInBlock = true) { const { description } = def; @@ -36771,7 +37526,7 @@ function printDescription(def) { block: (0, _blockString.isPrintableAsBlockString)(description) }); const prefix = indentation && !firstInBlock ? '\n' + indentation : indentation; - return prefix + blockString.replace(/\n/g, '\n' + indentation) + '\n'; + return prefix + blockString.replaceAll('\n', '\n' + indentation) + '\n'; } /***/ }), @@ -36796,11 +37551,10 @@ var _visitor = __webpack_require__(/*! ../language/visitor.mjs */ "../../../node * which contains a single operation as well the fragment definitions it * refers to. */ - function separateOperations(documentAST) { const operations = []; - const depGraph = Object.create(null); // Populate metadata and build a dependency graph. - + const depGraph = Object.create(null); + // Populate metadata and build a dependency graph. for (const definitionNode of documentAST.definitions) { switch (definitionNode.kind) { case _kinds.Kind.OPERATION_DEFINITION: @@ -36809,21 +37563,22 @@ function separateOperations(documentAST) { case _kinds.Kind.FRAGMENT_DEFINITION: depGraph[definitionNode.name.value] = collectDependencies(definitionNode.selectionSet); break; - default: // ignore non-executable definitions + default: + // ignore non-executable definitions } - } // For each operation, produce a new synthesized AST which includes only what + } + // For each operation, produce a new synthesized AST which includes only what // is necessary for completing that operation. - const separatedDocumentASTs = Object.create(null); for (const operation of operations) { const dependencies = new Set(); for (const fragmentName of collectDependencies(operation.selectionSet)) { collectTransitiveDependencies(dependencies, depGraph, fragmentName); - } // Provides the empty string for anonymous operations. - - const operationName = operation.name ? operation.name.value : ''; // The list of definition nodes to be included for this operation, sorted + } + // Provides the empty string for anonymous operations. + const operationName = operation.name ? operation.name.value : ''; + // The list of definition nodes to be included for this operation, sorted // to retain the same order as the original document. - separatedDocumentASTs[operationName] = { kind: _kinds.Kind.DOCUMENT, definitions: documentAST.definitions.filter(node => node === operation || node.kind === _kinds.Kind.FRAGMENT_DEFINITION && dependencies.has(node.name.value)) @@ -36831,7 +37586,6 @@ function separateOperations(documentAST) { } return separatedDocumentASTs; } - // From a dependency graph, collects a list of transitive dependencies by // recursing through a dependency graph. function collectTransitiveDependencies(collected, depGraph, fromName) { @@ -36878,7 +37632,6 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * * @internal */ - function sortValueNode(valueNode) { switch (valueNode.kind) { case _kinds.Kind.OBJECT: @@ -36986,7 +37739,6 @@ var _tokenKind = __webpack_require__(/*! ../language/tokenKind.mjs */ "../../../ * """Type description""" type Foo{"""Field description""" bar:String} * ``` */ - function stripIgnoredCharacters(source) { const sourceObj = (0, _source.isSource)(source) ? source : new _source.Source(source); const body = sourceObj.body; @@ -37001,7 +37753,6 @@ function stripIgnoredCharacters(source) { * Also prevent case of non-punctuator token following by spread resulting * in invalid token (e.g. `1...` is invalid Float token). */ - const isNonPunctuator = !(0, _lexer.isPunctuatorTokenKind)(currentToken.kind); if (wasLastAddedTokenNonPunctuator) { if (isNonPunctuator || currentToken.kind === _tokenKind.TokenKind.SPREAD) { @@ -37045,29 +37796,28 @@ function isEqualType(typeA, typeB) { // Equivalent types are equal. if (typeA === typeB) { return true; - } // If either type is non-null, the other must also be non-null. - + } + // If either type is non-null, the other must also be non-null. if ((0, _definition.isNonNullType)(typeA) && (0, _definition.isNonNullType)(typeB)) { return isEqualType(typeA.ofType, typeB.ofType); - } // If either type is a list, the other must also be a list. - + } + // If either type is a list, the other must also be a list. if ((0, _definition.isListType)(typeA) && (0, _definition.isListType)(typeB)) { return isEqualType(typeA.ofType, typeB.ofType); - } // Otherwise the types are not equal. - + } + // Otherwise the types are not equal. return false; } /** * Provided a type and a super type, return true if the first type is either * equal or a subset of the second super type (covariant). */ - function isTypeSubTypeOf(schema, maybeSubType, superType) { // Equivalent type is a valid subtype if (maybeSubType === superType) { return true; - } // If superType is non-null, maybeSubType must also be non-null. - + } + // If superType is non-null, maybeSubType must also be non-null. if ((0, _definition.isNonNullType)(superType)) { if ((0, _definition.isNonNullType)(maybeSubType)) { return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType); @@ -37077,8 +37827,8 @@ function isTypeSubTypeOf(schema, maybeSubType, superType) { if ((0, _definition.isNonNullType)(maybeSubType)) { // If superType is nullable, maybeSubType may be non-null or nullable. return isTypeSubTypeOf(schema, maybeSubType.ofType, superType); - } // If superType type is a list, maybeSubType type must also be a list. - + } + // If superType type is a list, maybeSubType type must also be a list. if ((0, _definition.isListType)(superType)) { if ((0, _definition.isListType)(maybeSubType)) { return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType); @@ -37088,9 +37838,9 @@ function isTypeSubTypeOf(schema, maybeSubType, superType) { if ((0, _definition.isListType)(maybeSubType)) { // If superType is not a list, maybeSubType must also be not a list. return false; - } // If superType type is an abstract type, check if it is super type of maybeSubType. + } + // If superType type is an abstract type, check if it is super type of maybeSubType. // Otherwise, the child type is not a valid subtype of the parent type. - return (0, _definition.isAbstractType)(superType) && ((0, _definition.isInterfaceType)(maybeSubType) || (0, _definition.isObjectType)(maybeSubType)) && schema.isSubType(superType, maybeSubType); } /** @@ -37102,7 +37852,6 @@ function isTypeSubTypeOf(schema, maybeSubType, superType) { * * This function is commutative. */ - function doTypesOverlap(schema, typeA, typeB) { // Equivalent types overlap if (typeA === typeB) { @@ -37113,15 +37862,15 @@ function doTypesOverlap(schema, typeA, typeB) { // If both types are abstract, then determine if there is any intersection // between possible concrete types of each. return schema.getPossibleTypes(typeA).some(type => schema.isSubType(typeB, type)); - } // Determine if the latter type is a possible concrete type of the former. - + } + // Determine if the latter type is a possible concrete type of the former. return schema.isSubType(typeA, typeB); } if ((0, _definition.isAbstractType)(typeB)) { // Determine if the former type is a possible concrete type of the latter. return schema.isSubType(typeB, typeA); - } // Otherwise the types do not overlap. - + } + // Otherwise the types do not overlap. return false; } @@ -37174,7 +37923,6 @@ Object.defineProperty(exports, "__esModule", ({ exports.valueFromAST = valueFromAST; var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); /** @@ -37197,7 +37945,6 @@ var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../no * | NullValue | null | * */ - function valueFromAST(valueNode, type, variables) { if (!valueNode) { // When there is no node, then there is also no value. @@ -37213,17 +37960,16 @@ function valueFromAST(valueNode, type, variables) { const variableValue = variables[variableName]; if (variableValue === null && (0, _definition.isNonNullType)(type)) { return; // Invalid: intentionally return no value. - } // Note: This does no further checking that this variable is correct. + } + // Note: This does no further checking that this variable is correct. // This assumes that this query has been validated and the variable // usage here is of the correct type. - return variableValue; } if ((0, _definition.isNonNullType)(type)) { if (valueNode.kind === _kinds.Kind.NULL) { return; // Invalid: intentionally return no value. } - return valueFromAST(valueNode, type.ofType, variables); } if (valueNode.kind === _kinds.Kind.NULL) { @@ -37241,14 +37987,12 @@ function valueFromAST(valueNode, type, variables) { if ((0, _definition.isNonNullType)(itemType)) { return; // Invalid: intentionally return no value. } - coercedValues.push(null); } else { const itemValue = valueFromAST(itemNode, itemType, variables); if (itemValue === undefined) { return; // Invalid: intentionally return no value. } - coercedValues.push(itemValue); } } @@ -37258,34 +38002,39 @@ function valueFromAST(valueNode, type, variables) { if (coercedValue === undefined) { return; // Invalid: intentionally return no value. } - return [coercedValue]; } if ((0, _definition.isInputObjectType)(type)) { if (valueNode.kind !== _kinds.Kind.OBJECT) { return; // Invalid: intentionally return no value. } - const coercedObj = Object.create(null); - const fieldNodes = (0, _keyMap.keyMap)(valueNode.fields, field => field.name.value); + const fieldNodes = new Map(valueNode.fields.map(field => [field.name.value, field])); for (const field of Object.values(type.getFields())) { - const fieldNode = fieldNodes[field.name]; - if (!fieldNode || isMissingVariable(fieldNode.value, variables)) { + const fieldNode = fieldNodes.get(field.name); + if (fieldNode == null || isMissingVariable(fieldNode.value, variables)) { if (field.defaultValue !== undefined) { coercedObj[field.name] = field.defaultValue; } else if ((0, _definition.isNonNullType)(field.type)) { return; // Invalid: intentionally return no value. } - continue; } const fieldValue = valueFromAST(fieldNode.value, field.type, variables); if (fieldValue === undefined) { return; // Invalid: intentionally return no value. } - coercedObj[field.name] = fieldValue; } + if (type.isOneOf) { + const keys = Object.keys(coercedObj); + if (keys.length !== 1) { + return; // Invalid: not exactly one key, intentionally return no value. + } + if (coercedObj[keys[0]] === null) { + return; // Invalid: value not non-null, intentionally return no value. + } + } return coercedObj; } if ((0, _definition.isLeafType)(type)) { @@ -37298,20 +38047,17 @@ function valueFromAST(valueNode, type, variables) { } catch (_error) { return; // Invalid: intentionally return no value. } - if (result === undefined) { return; // Invalid: intentionally return no value. } - return result; } /* c8 ignore next 3 */ // Not reachable, all possible input types have been considered. - false || (0, _invariant.invariant)(false, 'Unexpected input type: ' + (0, _inspect.inspect)(type)); -} // Returns true if the provided valueNode is a variable which is not defined +} +// Returns true if the provided valueNode is a variable which is not defined // in the set of variables. - function isMissingVariable(valueNode, variables) { return valueNode.kind === _kinds.Kind.VARIABLE && (variables == null || variables[valueNode.name.value] === undefined); } @@ -37348,7 +38094,6 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * | Null | null | * */ - function valueFromASTUntyped(valueNode, variables) { switch (valueNode.kind) { case _kinds.Kind.NULL: @@ -37447,14 +38192,14 @@ class ASTValidationContext { let fragments = this._recursivelyReferencedFragments.get(operation); if (!fragments) { fragments = []; - const collectedNames = Object.create(null); + const collectedNames = new Set(); const nodesToVisit = [operation.selectionSet]; let node; while (node = nodesToVisit.pop()) { for (const spread of this.getFragmentSpreads(node)) { const fragName = spread.name.value; - if (collectedNames[fragName] !== true) { - collectedNames[fragName] = true; + if (!collectedNames.has(fragName)) { + collectedNames.add(fragName); const fragment = this.getFragment(fragName); if (fragment) { fragments.push(fragment); @@ -37567,6 +38312,24 @@ exports.ValidationContext = ValidationContext; Object.defineProperty(exports, "__esModule", ({ value: true })); +Object.defineProperty(exports, "DeferStreamDirectiveLabelRule", ({ + enumerable: true, + get: function () { + return _DeferStreamDirectiveLabelRule.DeferStreamDirectiveLabelRule; + } +})); +Object.defineProperty(exports, "DeferStreamDirectiveOnRootFieldRule", ({ + enumerable: true, + get: function () { + return _DeferStreamDirectiveOnRootFieldRule.DeferStreamDirectiveOnRootFieldRule; + } +})); +Object.defineProperty(exports, "DeferStreamDirectiveOnValidOperationsRule", ({ + enumerable: true, + get: function () { + return _DeferStreamDirectiveOnValidOperationsRule.DeferStreamDirectiveOnValidOperationsRule; + } +})); Object.defineProperty(exports, "ExecutableDefinitionsRule", ({ enumerable: true, get: function () { @@ -37621,6 +38384,12 @@ Object.defineProperty(exports, "LoneSchemaDefinitionRule", ({ return _LoneSchemaDefinitionRule.LoneSchemaDefinitionRule; } })); +Object.defineProperty(exports, "MaxIntrospectionDepthRule", ({ + enumerable: true, + get: function () { + return _MaxIntrospectionDepthRule.MaxIntrospectionDepthRule; + } +})); Object.defineProperty(exports, "NoDeprecatedCustomRule", ({ enumerable: true, get: function () { @@ -37693,6 +38462,12 @@ Object.defineProperty(exports, "SingleFieldSubscriptionsRule", ({ return _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule; } })); +Object.defineProperty(exports, "StreamDirectiveOnListFieldRule", ({ + enumerable: true, + get: function () { + return _StreamDirectiveOnListFieldRule.StreamDirectiveOnListFieldRule; + } +})); Object.defineProperty(exports, "UniqueArgumentDefinitionNamesRule", ({ enumerable: true, get: function () { @@ -37789,6 +38564,12 @@ Object.defineProperty(exports, "VariablesInAllowedPositionRule", ({ return _VariablesInAllowedPositionRule.VariablesInAllowedPositionRule; } })); +Object.defineProperty(exports, "recommendedRules", ({ + enumerable: true, + get: function () { + return _specifiedRules.recommendedRules; + } +})); Object.defineProperty(exports, "specifiedRules", ({ enumerable: true, get: function () { @@ -37804,6 +38585,9 @@ Object.defineProperty(exports, "validate", ({ var _validate = __webpack_require__(/*! ./validate.mjs */ "../../../node_modules/graphql/validation/validate.mjs"); var _ValidationContext = __webpack_require__(/*! ./ValidationContext.mjs */ "../../../node_modules/graphql/validation/ValidationContext.mjs"); var _specifiedRules = __webpack_require__(/*! ./specifiedRules.mjs */ "../../../node_modules/graphql/validation/specifiedRules.mjs"); +var _DeferStreamDirectiveLabelRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveLabelRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs"); +var _DeferStreamDirectiveOnRootFieldRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnRootFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs"); +var _DeferStreamDirectiveOnValidOperationsRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnValidOperationsRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs"); var _ExecutableDefinitionsRule = __webpack_require__(/*! ./rules/ExecutableDefinitionsRule.mjs */ "../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs"); var _FieldsOnCorrectTypeRule = __webpack_require__(/*! ./rules/FieldsOnCorrectTypeRule.mjs */ "../../../node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.mjs"); var _FragmentsOnCompositeTypesRule = __webpack_require__(/*! ./rules/FragmentsOnCompositeTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.mjs"); @@ -37821,6 +38605,7 @@ var _PossibleFragmentSpreadsRule = __webpack_require__(/*! ./rules/PossibleFragm var _ProvidedRequiredArgumentsRule = __webpack_require__(/*! ./rules/ProvidedRequiredArgumentsRule.mjs */ "../../../node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.mjs"); var _ScalarLeafsRule = __webpack_require__(/*! ./rules/ScalarLeafsRule.mjs */ "../../../node_modules/graphql/validation/rules/ScalarLeafsRule.mjs"); var _SingleFieldSubscriptionsRule = __webpack_require__(/*! ./rules/SingleFieldSubscriptionsRule.mjs */ "../../../node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.mjs"); +var _StreamDirectiveOnListFieldRule = __webpack_require__(/*! ./rules/StreamDirectiveOnListFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs"); var _UniqueArgumentNamesRule = __webpack_require__(/*! ./rules/UniqueArgumentNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueArgumentNamesRule.mjs"); var _UniqueDirectivesPerLocationRule = __webpack_require__(/*! ./rules/UniqueDirectivesPerLocationRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.mjs"); var _UniqueFragmentNamesRule = __webpack_require__(/*! ./rules/UniqueFragmentNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueFragmentNamesRule.mjs"); @@ -37830,6 +38615,7 @@ var _UniqueVariableNamesRule = __webpack_require__(/*! ./rules/UniqueVariableNam var _ValuesOfCorrectTypeRule = __webpack_require__(/*! ./rules/ValuesOfCorrectTypeRule.mjs */ "../../../node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.mjs"); var _VariablesAreInputTypesRule = __webpack_require__(/*! ./rules/VariablesAreInputTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/VariablesAreInputTypesRule.mjs"); var _VariablesInAllowedPositionRule = __webpack_require__(/*! ./rules/VariablesInAllowedPositionRule.mjs */ "../../../node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.mjs"); +var _MaxIntrospectionDepthRule = __webpack_require__(/*! ./rules/MaxIntrospectionDepthRule.mjs */ "../../../node_modules/graphql/validation/rules/MaxIntrospectionDepthRule.mjs"); var _LoneSchemaDefinitionRule = __webpack_require__(/*! ./rules/LoneSchemaDefinitionRule.mjs */ "../../../node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.mjs"); var _UniqueOperationTypesRule = __webpack_require__(/*! ./rules/UniqueOperationTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueOperationTypesRule.mjs"); var _UniqueTypeNamesRule = __webpack_require__(/*! ./rules/UniqueTypeNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueTypeNamesRule.mjs"); @@ -37843,6 +38629,182 @@ var _NoSchemaIntrospectionCustomRule = __webpack_require__(/*! ./rules/custom/No /***/ }), +/***/ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs": +/*!****************************************************************************************!*\ + !*** ../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs ***! + \****************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.DeferStreamDirectiveLabelRule = DeferStreamDirectiveLabelRule; +var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); +var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); +/** + * Defer and stream directive labels are unique + * + * A GraphQL document is only valid if defer and stream directives' label argument is static and unique. + */ +function DeferStreamDirectiveLabelRule(context) { + const knownLabels = new Map(); + return { + Directive(node) { + if (node.name.value === _directives.GraphQLDeferDirective.name || node.name.value === _directives.GraphQLStreamDirective.name) { + var _node$arguments; + const labelArgument = (_node$arguments = node.arguments) === null || _node$arguments === void 0 ? void 0 : _node$arguments.find(arg => arg.name.value === 'label'); + const labelValue = labelArgument === null || labelArgument === void 0 ? void 0 : labelArgument.value; + if (!labelValue) { + return; + } + if (labelValue.kind !== _kinds.Kind.STRING) { + context.reportError(new _GraphQLError.GraphQLError(`Directive "${node.name.value}"'s label argument must be a static string.`, { + nodes: node + })); + return; + } + const knownLabel = knownLabels.get(labelValue.value); + if (knownLabel != null) { + context.reportError(new _GraphQLError.GraphQLError('Defer/Stream directive label argument must be unique.', { + nodes: [knownLabel, node] + })); + } else { + knownLabels.set(labelValue.value, node); + } + } + } + }; +} + +/***/ }), + +/***/ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs": +/*!**********************************************************************************************!*\ + !*** ../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs ***! + \**********************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.DeferStreamDirectiveOnRootFieldRule = DeferStreamDirectiveOnRootFieldRule; +var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); +/** + * Defer and stream directives are used on valid root field + * + * A GraphQL document is only valid if defer directives are not used on root mutation or subscription types. + */ +function DeferStreamDirectiveOnRootFieldRule(context) { + return { + Directive(node) { + const mutationType = context.getSchema().getMutationType(); + const subscriptionType = context.getSchema().getSubscriptionType(); + const parentType = context.getParentType(); + if (parentType && node.name.value === _directives.GraphQLDeferDirective.name) { + if (mutationType && parentType === mutationType) { + context.reportError(new _GraphQLError.GraphQLError(`Defer directive cannot be used on root mutation type "${parentType.name}".`, { + nodes: node + })); + } + if (subscriptionType && parentType === subscriptionType) { + context.reportError(new _GraphQLError.GraphQLError(`Defer directive cannot be used on root subscription type "${parentType.name}".`, { + nodes: node + })); + } + } + if (parentType && node.name.value === _directives.GraphQLStreamDirective.name) { + if (mutationType && parentType === mutationType) { + context.reportError(new _GraphQLError.GraphQLError(`Stream directive cannot be used on root mutation type "${parentType.name}".`, { + nodes: node + })); + } + if (subscriptionType && parentType === subscriptionType) { + context.reportError(new _GraphQLError.GraphQLError(`Stream directive cannot be used on root subscription type "${parentType.name}".`, { + nodes: node + })); + } + } + } + }; +} + +/***/ }), + +/***/ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs": +/*!****************************************************************************************************!*\ + !*** ../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs ***! + \****************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.DeferStreamDirectiveOnValidOperationsRule = DeferStreamDirectiveOnValidOperationsRule; +var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +var _ast = __webpack_require__(/*! ../../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); +var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); +var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); +function ifArgumentCanBeFalse(node) { + var _node$arguments; + const ifArgument = (_node$arguments = node.arguments) === null || _node$arguments === void 0 ? void 0 : _node$arguments.find(arg => arg.name.value === 'if'); + if (!ifArgument) { + return false; + } + if (ifArgument.value.kind === _kinds.Kind.BOOLEAN) { + if (ifArgument.value.value) { + return false; + } + } else if (ifArgument.value.kind !== _kinds.Kind.VARIABLE) { + return false; + } + return true; +} +/** + * Defer And Stream Directives Are Used On Valid Operations + * + * A GraphQL document is only valid if defer directives are not used on root mutation or subscription types. + */ +function DeferStreamDirectiveOnValidOperationsRule(context) { + const fragmentsUsedOnSubscriptions = new Set(); + return { + OperationDefinition(operation) { + if (operation.operation === _ast.OperationTypeNode.SUBSCRIPTION) { + for (const fragment of context.getRecursivelyReferencedFragments(operation)) { + fragmentsUsedOnSubscriptions.add(fragment.name.value); + } + } + }, + Directive(node, _key, _parent, _path, ancestors) { + const definitionNode = ancestors[2]; + if ('kind' in definitionNode && (definitionNode.kind === _kinds.Kind.FRAGMENT_DEFINITION && fragmentsUsedOnSubscriptions.has(definitionNode.name.value) || definitionNode.kind === _kinds.Kind.OPERATION_DEFINITION && definitionNode.operation === _ast.OperationTypeNode.SUBSCRIPTION)) { + if (node.name.value === _directives.GraphQLDeferDirective.name) { + if (!ifArgumentCanBeFalse(node)) { + context.reportError(new _GraphQLError.GraphQLError('Defer directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`.', { + nodes: node + })); + } + } else if (node.name.value === _directives.GraphQLStreamDirective.name) { + if (!ifArgumentCanBeFalse(node)) { + context.reportError(new _GraphQLError.GraphQLError('Stream directive not supported on subscription operations. Disable `@stream` by setting the `if` argument to `false`.', { + nodes: node + })); + } + } + } + } + }; +} + +/***/ }), + /***/ "../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs": /*!************************************************************************************!*\ !*** ../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs ***! @@ -37918,14 +38880,14 @@ function FieldsOnCorrectTypeRule(context) { if (!fieldDef) { // This field doesn't exist, lets look for suggestions. const schema = context.getSchema(); - const fieldName = node.name.value; // First determine if there are any suggested types to condition on. - - let suggestion = (0, _didYouMean.didYouMean)('to use an inline fragment on', getSuggestedTypeNames(schema, type, fieldName)); // If there are no suggested types, then perhaps this was a typo? - + const fieldName = node.name.value; + // First determine if there are any suggested types to condition on. + let suggestion = (0, _didYouMean.didYouMean)('to use an inline fragment on', getSuggestedTypeNames(schema, type, fieldName)); + // If there are no suggested types, then perhaps this was a typo? if (suggestion === '') { suggestion = (0, _didYouMean.didYouMean)(getSuggestedFieldNames(type, fieldName)); - } // Report an error, including helpful suggestions. - + } + // Report an error, including helpful suggestions. context.reportError(new _GraphQLError.GraphQLError(`Cannot query field "${fieldName}" on type "${type.name}".` + suggestion, { nodes: node })); @@ -37939,7 +38901,6 @@ function FieldsOnCorrectTypeRule(context) { * they implement. If any of those types include the provided field, suggest them, * sorted by how often the type is referenced. */ - function getSuggestedTypeNames(schema, type, fieldName) { if (!(0, _definition.isAbstractType)(type)) { // Must be an Object type, which does not have possible fields. @@ -37948,18 +38909,18 @@ function getSuggestedTypeNames(schema, type, fieldName) { const suggestedTypes = new Set(); const usageCount = Object.create(null); for (const possibleType of schema.getPossibleTypes(type)) { - if (!possibleType.getFields()[fieldName]) { + if (possibleType.getFields()[fieldName] == null) { continue; - } // This object type defines this field. - + } + // This object type defines this field. suggestedTypes.add(possibleType); usageCount[possibleType.name] = 1; for (const possibleInterface of possibleType.getInterfaces()) { var _usageCount$possibleI; - if (!possibleInterface.getFields()[fieldName]) { + if (possibleInterface.getFields()[fieldName] == null) { continue; - } // This interface type defines this field. - + } + // This interface type defines this field. suggestedTypes.add(possibleInterface); usageCount[possibleInterface.name] = ((_usageCount$possibleI = usageCount[possibleInterface.name]) !== null && _usageCount$possibleI !== void 0 ? _usageCount$possibleI : 0) + 1; } @@ -37969,8 +38930,8 @@ function getSuggestedTypeNames(schema, type, fieldName) { const usageCountDiff = usageCount[typeB.name] - usageCount[typeA.name]; if (usageCountDiff !== 0) { return usageCountDiff; - } // Suggest super types first followed by subtypes - + } + // Suggest super types first followed by subtypes if ((0, _definition.isInterfaceType)(typeA) && schema.isSubType(typeA, typeB)) { return -1; } @@ -37984,13 +38945,12 @@ function getSuggestedTypeNames(schema, type, fieldName) { * For the field name provided, determine if there are any similar field names * that may be the result of a typo. */ - function getSuggestedFieldNames(type, fieldName) { if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type)) { const possibleFieldNames = Object.keys(type.getFields()); return (0, _suggestionList.suggestionList)(fieldName, possibleFieldNames); - } // Otherwise, must be a Union type, which does not define fields. - + } + // Otherwise, must be a Union type, which does not define fields. return []; } @@ -38098,31 +39058,28 @@ function KnownArgumentNamesRule(context) { /** * @internal */ - function KnownArgumentNamesOnDirectivesRule(context) { - const directiveArgs = Object.create(null); + const directiveArgs = new Map(); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives; for (const directive of definedDirectives) { - directiveArgs[directive.name] = directive.args.map(arg => arg.name); + directiveArgs.set(directive.name, directive.args.map(arg => arg.name)); } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { var _def$arguments; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 - /* c8 ignore next */ const argsNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : []; - directiveArgs[def.name.value] = argsNodes.map(arg => arg.name.value); + directiveArgs.set(def.name.value, argsNodes.map(arg => arg.name.value)); } } return { Directive(directiveNode) { const directiveName = directiveNode.name.value; - const knownArgs = directiveArgs[directiveName]; - if (directiveNode.arguments && knownArgs) { + const knownArgs = directiveArgs.get(directiveName); + if (directiveNode.arguments != null && knownArgs != null) { for (const argNode of directiveNode.arguments) { const argName = argNode.name.value; if (!knownArgs.includes(argName)) { @@ -38168,30 +39125,30 @@ var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../.. * See https://spec.graphql.org/draft/#sec-Directives-Are-Defined */ function KnownDirectivesRule(context) { - const locationsMap = Object.create(null); + const locationsMap = new Map(); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives; for (const directive of definedDirectives) { - locationsMap[directive.name] = directive.locations; + locationsMap.set(directive.name, directive.locations); } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { - locationsMap[def.name.value] = def.locations.map(name => name.value); + locationsMap.set(def.name.value, def.locations.map(name => name.value)); } } return { Directive(node, _key, _parent, _path, ancestors) { const name = node.name.value; - const locations = locationsMap[name]; - if (!locations) { + const locations = locationsMap.get(name); + if (locations == null) { context.reportError(new _GraphQLError.GraphQLError(`Unknown directive "@${name}".`, { nodes: node })); return; } const candidateLocation = getDirectiveLocationForASTPath(ancestors); - if (candidateLocation && !locations.includes(candidateLocation)) { + if (candidateLocation != null && !locations.includes(candidateLocation)) { context.reportError(new _GraphQLError.GraphQLError(`Directive "@${name}" may not be used on ${candidateLocation}.`, { nodes: node })); @@ -38200,8 +39157,8 @@ function KnownDirectivesRule(context) { }; } function getDirectiveLocationForASTPath(ancestors) { - const appliedTo = ancestors[ancestors.length - 1]; - 'kind' in appliedTo || (0, _invariant.invariant)(false); + const appliedTo = ancestors.at(-1); + appliedTo != null && 'kind' in appliedTo || (0, _invariant.invariant)(false); switch (appliedTo.kind) { case _kinds.Kind.OPERATION_DEFINITION: return getDirectiveLocationForOperation(appliedTo.operation); @@ -38242,14 +39199,12 @@ function getDirectiveLocationForASTPath(ancestors) { return _directiveLocation.DirectiveLocation.INPUT_OBJECT; case _kinds.Kind.INPUT_VALUE_DEFINITION: { - const parentNode = ancestors[ancestors.length - 3]; - 'kind' in parentNode || (0, _invariant.invariant)(false); + const parentNode = ancestors.at(-3); + parentNode != null && 'kind' in parentNode || (0, _invariant.invariant)(false); return parentNode.kind === _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION ? _directiveLocation.DirectiveLocation.INPUT_FIELD_DEFINITION : _directiveLocation.DirectiveLocation.ARGUMENT_DEFINITION; } // Not reachable, all possible types have been considered. - - /* c8 ignore next */ - + /* c8 ignore next 2 */ default: false || (0, _invariant.invariant)(false, 'Unexpected kind: ' + (0, _inspect.inspect)(appliedTo.kind)); } @@ -38331,26 +39286,23 @@ var _scalars = __webpack_require__(/*! ../../type/scalars.mjs */ "../../../node_ * See https://spec.graphql.org/draft/#sec-Fragment-Spread-Type-Existence */ function KnownTypeNamesRule(context) { - const schema = context.getSchema(); - const existingTypesMap = schema ? schema.getTypeMap() : Object.create(null); - const definedTypes = Object.create(null); - for (const def of context.getDocument().definitions) { - if ((0, _predicates.isTypeDefinitionNode)(def)) { - definedTypes[def.name.value] = true; - } - } - const typeNames = [...Object.keys(existingTypesMap), ...Object.keys(definedTypes)]; + var _context$getSchema$ge, _context$getSchema; + const { + definitions + } = context.getDocument(); + const existingTypesMap = (_context$getSchema$ge = (_context$getSchema = context.getSchema()) === null || _context$getSchema === void 0 ? void 0 : _context$getSchema.getTypeMap()) !== null && _context$getSchema$ge !== void 0 ? _context$getSchema$ge : {}; + const typeNames = new Set([...Object.keys(existingTypesMap), ...definitions.filter(_predicates.isTypeDefinitionNode).map(def => def.name.value)]); return { NamedType(node, _1, parent, _2, ancestors) { const typeName = node.name.value; - if (!existingTypesMap[typeName] && !definedTypes[typeName]) { + if (!typeNames.has(typeName)) { var _ancestors$; const definitionNode = (_ancestors$ = ancestors[2]) !== null && _ancestors$ !== void 0 ? _ancestors$ : parent; const isSDL = definitionNode != null && isSDLNode(definitionNode); - if (isSDL && standardTypeNames.includes(typeName)) { + if (isSDL && standardTypeNames.has(typeName)) { return; } - const suggestedTypes = (0, _suggestionList.suggestionList)(typeName, isSDL ? standardTypeNames.concat(typeNames) : typeNames); + const suggestedTypes = (0, _suggestionList.suggestionList)(typeName, isSDL ? [...standardTypeNames, ...typeNames] : [...typeNames]); context.reportError(new _GraphQLError.GraphQLError(`Unknown type "${typeName}".` + (0, _didYouMean.didYouMean)(suggestedTypes), { nodes: node })); @@ -38358,7 +39310,7 @@ function KnownTypeNamesRule(context) { } }; } -const standardTypeNames = [..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes].map(type => type.name); +const standardTypeNames = new Set([..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes].map(type => type.name)); function isSDLNode(value) { return 'kind' in value && ((0, _predicates.isTypeSystemDefinitionNode)(value) || (0, _predicates.isTypeSystemExtensionNode)(value)); } @@ -38448,6 +39400,86 @@ function LoneSchemaDefinitionRule(context) { /***/ }), +/***/ "../../../node_modules/graphql/validation/rules/MaxIntrospectionDepthRule.mjs": +/*!************************************************************************************!*\ + !*** ../../../node_modules/graphql/validation/rules/MaxIntrospectionDepthRule.mjs ***! + \************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.MaxIntrospectionDepthRule = MaxIntrospectionDepthRule; +var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); +const MAX_LISTS_DEPTH = 3; +function MaxIntrospectionDepthRule(context) { + /** + * Counts the depth of list fields in "__Type" recursively and + * returns `true` if the limit has been reached. + */ + function checkDepth(node, visitedFragments = Object.create(null), depth = 0) { + if (node.kind === _kinds.Kind.FRAGMENT_SPREAD) { + const fragmentName = node.name.value; + if (visitedFragments[fragmentName] === true) { + // Fragment cycles are handled by `NoFragmentCyclesRule`. + return false; + } + const fragment = context.getFragment(fragmentName); + if (!fragment) { + // Missing fragments checks are handled by the `KnownFragmentNamesRule`. + return false; + } + // Rather than following an immutable programming pattern which has + // significant memory and garbage collection overhead, we've opted to + // take a mutable approach for efficiency's sake. Importantly visiting a + // fragment twice is fine, so long as you don't do one visit inside the + // other. + try { + visitedFragments[fragmentName] = true; + return checkDepth(fragment, visitedFragments, depth); + } finally { + visitedFragments[fragmentName] = undefined; + } + } + if (node.kind === _kinds.Kind.FIELD && ( + // check all introspection lists + // TODO: instead of relying on field names, check whether the type is a list + node.name.value === 'fields' || node.name.value === 'interfaces' || node.name.value === 'possibleTypes' || node.name.value === 'inputFields')) { + // eslint-disable-next-line no-param-reassign + depth++; + if (depth >= MAX_LISTS_DEPTH) { + return true; + } + } + // handles fields and inline fragments + if ('selectionSet' in node && node.selectionSet) { + for (const child of node.selectionSet.selections) { + if (checkDepth(child, visitedFragments, depth)) { + return true; + } + } + } + return false; + } + return { + Field(node) { + if (node.name.value === '__schema' || node.name.value === '__type') { + if (checkDepth(node)) { + context.reportError(new _GraphQLError.GraphQLError('Maximum introspection depth exceeded', { + nodes: [node] + })); + return false; + } + } + } + }; +} + +/***/ }), + /***/ "../../../node_modules/graphql/validation/rules/NoFragmentCyclesRule.mjs": /*!*******************************************************************************!*\ !*** ../../../node_modules/graphql/validation/rules/NoFragmentCyclesRule.mjs ***! @@ -38472,10 +39504,10 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ function NoFragmentCyclesRule(context) { // Tracks already visited fragments to maintain O(N) and to ensure that cycles // are not redundantly reported. - const visitedFrags = Object.create(null); // Array of AST nodes used to produce meaningful errors - - const spreadPath = []; // Position in the spread path - + const visitedFrags = new Set(); + // Array of AST nodes used to produce meaningful errors + const spreadPath = []; + // Position in the spread path const spreadPathIndexByName = Object.create(null); return { OperationDefinition: () => false, @@ -38483,16 +39515,16 @@ function NoFragmentCyclesRule(context) { detectCycleRecursive(node); return false; } - }; // This does a straight-forward DFS to find cycles. + }; + // This does a straight-forward DFS to find cycles. // It does not terminate when a cycle was found but continues to explore // the graph to find all possible cycles. - function detectCycleRecursive(fragment) { - if (visitedFrags[fragment.name.value]) { + if (visitedFrags.has(fragment.name.value)) { return; } const fragmentName = fragment.name.value; - visitedFrags[fragmentName] = true; + visitedFrags.add(fragmentName); const spreadNodes = context.getFragmentSpreads(fragment.selectionSet); if (spreadNodes.length === 0) { return; @@ -38544,28 +39576,21 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-All-Variable-Uses-Defined */ function NoUndefinedVariablesRule(context) { - let variableNameDefined = Object.create(null); return { - OperationDefinition: { - enter() { - variableNameDefined = Object.create(null); - }, - leave(operation) { - const usages = context.getRecursiveVariableUsages(operation); - for (const { - node - } of usages) { - const varName = node.name.value; - if (variableNameDefined[varName] !== true) { - context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${varName}" is not defined by operation "${operation.name.value}".` : `Variable "$${varName}" is not defined.`, { - nodes: [node, operation] - })); - } + OperationDefinition(operation) { + var _operation$variableDe; + const variableNameDefined = new Set((_operation$variableDe = operation.variableDefinitions) === null || _operation$variableDe === void 0 ? void 0 : _operation$variableDe.map(node => node.variable.name.value)); + const usages = context.getRecursiveVariableUsages(operation); + for (const { + node + } of usages) { + const varName = node.name.value; + if (!variableNameDefined.has(varName)) { + context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${varName}" is not defined by operation "${operation.name.value}".` : `Variable "$${varName}" is not defined.`, { + nodes: [node, operation] + })); } } - }, - VariableDefinition(node) { - variableNameDefined[node.variable.name.value] = true; } }; } @@ -38594,11 +39619,13 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-Fragments-Must-Be-Used */ function NoUnusedFragmentsRule(context) { - const operationDefs = []; + const fragmentNameUsed = new Set(); const fragmentDefs = []; return { - OperationDefinition(node) { - operationDefs.push(node); + OperationDefinition(operation) { + for (const fragment of context.getRecursivelyReferencedFragments(operation)) { + fragmentNameUsed.add(fragment.name.value); + } return false; }, FragmentDefinition(node) { @@ -38607,15 +39634,9 @@ function NoUnusedFragmentsRule(context) { }, Document: { leave() { - const fragmentNameUsed = Object.create(null); - for (const operation of operationDefs) { - for (const fragment of context.getRecursivelyReferencedFragments(operation)) { - fragmentNameUsed[fragment.name.value] = true; - } - } for (const fragmentDef of fragmentDefs) { const fragName = fragmentDef.name.value; - if (fragmentNameUsed[fragName] !== true) { + if (!fragmentNameUsed.has(fragName)) { context.reportError(new _GraphQLError.GraphQLError(`Fragment "${fragName}" is never used.`, { nodes: fragmentDef })); @@ -38650,32 +39671,24 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-All-Variables-Used */ function NoUnusedVariablesRule(context) { - let variableDefs = []; return { - OperationDefinition: { - enter() { - variableDefs = []; - }, - leave(operation) { - const variableNameUsed = Object.create(null); - const usages = context.getRecursiveVariableUsages(operation); - for (const { - node - } of usages) { - variableNameUsed[node.name.value] = true; - } - for (const variableDef of variableDefs) { - const variableName = variableDef.variable.name.value; - if (variableNameUsed[variableName] !== true) { - context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${variableName}" is never used in operation "${operation.name.value}".` : `Variable "$${variableName}" is never used.`, { - nodes: variableDef - })); - } + OperationDefinition(operation) { + var _operation$variableDe; + const usages = context.getRecursiveVariableUsages(operation); + const variableNameUsed = new Set(usages.map(({ + node + }) => node.name.value)); + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const variableDefinitions = (_operation$variableDe = operation.variableDefinitions) !== null && _operation$variableDe !== void 0 ? _operation$variableDe : []; + for (const variableDef of variableDefinitions) { + const variableName = variableDef.variable.name.value; + if (!variableNameUsed.has(variableName)) { + context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${variableName}" is never used in operation "${operation.name.value}".` : `Variable "$${variableName}" is never used.`, { + nodes: variableDef + })); } } - }, - VariableDefinition(def) { - variableDefs.push(def); } }; } @@ -38701,12 +39714,12 @@ var _printer = __webpack_require__(/*! ../../language/printer.mjs */ "../../../n var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _sortValueNode = __webpack_require__(/*! ../../utilities/sortValueNode.mjs */ "../../../node_modules/graphql/utilities/sortValueNode.mjs"); var _typeFromAST = __webpack_require__(/*! ../../utilities/typeFromAST.mjs */ "../../../node_modules/graphql/utilities/typeFromAST.mjs"); +/* eslint-disable max-params */ +// This file contains a lot of such errors but we plan to refactor it anyway +// so just disable it for entire file. function reasonMessage(reason) { if (Array.isArray(reason)) { - return reason.map(_ref => { - let [responseName, subReason] = _ref; - return `subfields "${responseName}" conflict because ` + reasonMessage(subReason); - }).join(' and '); + return reason.map(([responseName, subReason]) => `subfields "${responseName}" conflict because ` + reasonMessage(subReason)).join(' and '); } return reason; } @@ -38719,15 +39732,14 @@ function reasonMessage(reason) { * * See https://spec.graphql.org/draft/#sec-Field-Selection-Merging */ - function OverlappingFieldsCanBeMergedRule(context) { // A memoization for when two fragments are compared "between" each other for // conflicts. Two fragments may be compared many times, so memoizing this can // dramatically improve the performance of this validator. - const comparedFragmentPairs = new PairSet(); // A cache for the "field map" and list of fragment names found in any given + const comparedFragmentPairs = new PairSet(); + // A cache for the "field map" and list of fragment names found in any given // selection set. Selection sets may be asked for this information multiple // times, so this improves the performance of this validator. - const cachedFieldsAndFragmentNames = new Map(); return { SelectionSet(selectionSet) { @@ -38741,7 +39753,6 @@ function OverlappingFieldsCanBeMergedRule(context) { } }; } - /** * Algorithm: * @@ -38801,43 +39812,43 @@ function OverlappingFieldsCanBeMergedRule(context) { // GraphQL Document. function findConflictsWithinSelectionSet(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentType, selectionSet) { const conflicts = []; - const [fieldMap, fragmentNames] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet); // (A) Find find all conflicts "within" the fields of this selection set. + const [fieldMap, fragmentNames] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet); + // (A) Find find all conflicts "within" the fields of this selection set. // Note: this is the *only place* `collectConflictsWithin` is called. - collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap); if (fragmentNames.length !== 0) { // (B) Then collect conflicts between these fields and those represented by // each spread fragment name found. for (let i = 0; i < fragmentNames.length; i++) { - collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fieldMap, fragmentNames[i]); // (C) Then compare this fragment with all other fragments found in this + collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fieldMap, fragmentNames[i]); + // (C) Then compare this fragment with all other fragments found in this // selection set to collect conflicts between fragments spread together. // This compares each item in the list of fragment names to every other // item in that same list (except for itself). - for (let j = i + 1; j < fragmentNames.length; j++) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fragmentNames[i], fragmentNames[j]); } } } return conflicts; -} // Collect all conflicts found between a set of fields and a fragment reference +} +// Collect all conflicts found between a set of fields and a fragment reference // including via spreading in any nested fragments. - function collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fragmentName) { const fragment = context.getFragment(fragmentName); if (!fragment) { return; } - const [fieldMap2, referencedFragmentNames] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment); // Do not compare a fragment's fieldMap to itself. - + const [fieldMap2, referencedFragmentNames] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment); + // Do not compare a fragment's fieldMap to itself. if (fieldMap === fieldMap2) { return; - } // (D) First collect any conflicts between the provided collection of fields + } + // (D) First collect any conflicts between the provided collection of fields // and the collection of fields represented by the given fragment. - - collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fieldMap2); // (E) Then collect any conflicts between the provided collection of fields + collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fieldMap2); + // (E) Then collect any conflicts between the provided collection of fields // and any fragment names found in the given fragment. - for (const referencedFragmentName of referencedFragmentNames) { // Memoize so two fragments are not compared for conflicts more than once. if (comparedFragmentPairs.has(referencedFragmentName, fragmentName, areMutuallyExclusive)) { @@ -38846,15 +39857,15 @@ function collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFiel comparedFragmentPairs.add(referencedFragmentName, fragmentName, areMutuallyExclusive); collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, referencedFragmentName); } -} // Collect all conflicts found between two fragments, including via spreading in +} +// Collect all conflicts found between two fragments, including via spreading in // any nested fragments. - function collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentName2) { // No need to compare a fragment to itself. if (fragmentName1 === fragmentName2) { return; - } // Memoize so two fragments are not compared for conflicts more than once. - + } + // Memoize so two fragments are not compared for conflicts more than once. if (comparedFragmentPairs.has(fragmentName1, fragmentName2, areMutuallyExclusive)) { return; } @@ -38865,57 +39876,57 @@ function collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFra return; } const [fieldMap1, referencedFragmentNames1] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment1); - const [fieldMap2, referencedFragmentNames2] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment2); // (F) First, collect all conflicts between these two collections of fields + const [fieldMap2, referencedFragmentNames2] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment2); + // (F) First, collect all conflicts between these two collections of fields // (not including any nested fragments). - - collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (G) Then collect conflicts between the first fragment and any nested + collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); + // (G) Then collect conflicts between the first fragment and any nested // fragments spread in the second fragment. - for (const referencedFragmentName2 of referencedFragmentNames2) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, referencedFragmentName2); - } // (G) Then collect conflicts between the second fragment and any nested + } + // (G) Then collect conflicts between the second fragment and any nested // fragments spread in the first fragment. - for (const referencedFragmentName1 of referencedFragmentNames1) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, referencedFragmentName1, fragmentName2); } -} // Find all conflicts found between two selection sets, including those found +} +// Find all conflicts found between two selection sets, including those found // via spreading in fragments. Called when determining if conflicts exist // between the sub-fields of two overlapping fields. - function findConflictsBetweenSubSelectionSets(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, parentType1, selectionSet1, parentType2, selectionSet2) { const conflicts = []; const [fieldMap1, fragmentNames1] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType1, selectionSet1); - const [fieldMap2, fragmentNames2] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType2, selectionSet2); // (H) First, collect all conflicts between these two collections of field. - - collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (I) Then collect conflicts between the first collection of fields and + const [fieldMap2, fragmentNames2] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType2, selectionSet2); + // (H) First, collect all conflicts between these two collections of field. + collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); + // (I) Then collect conflicts between the first collection of fields and // those referenced by each fragment name associated with the second. - for (const fragmentName2 of fragmentNames2) { collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fragmentName2); - } // (I) Then collect conflicts between the second collection of fields and + } + // (I) Then collect conflicts between the second collection of fields and // those referenced by each fragment name associated with the first. - for (const fragmentName1 of fragmentNames1) { collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap2, fragmentName1); - } // (J) Also collect conflicts between any fragment names by the first and + } + // (J) Also collect conflicts between any fragment names by the first and // fragment names by the second. This compares each item in the first set of // names to each item in the second set of names. - for (const fragmentName1 of fragmentNames1) { for (const fragmentName2 of fragmentNames2) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentName2); } } return conflicts; -} // Collect all Conflicts "within" one collection of fields. - +} +// Collect all Conflicts "within" one collection of fields. function collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap) { // A field map is a keyed collection, where each key represents a response // name and the value at that key is a list of all fields which provide that // response name. For every response name, if there are multiple fields, they // must be compared to find a potential conflict. - for (const [responseName, fields] of Object.entries(fieldMap)) { + for (const [responseName, fields] of fieldMap.entries()) { // This compares every field in the list to every other field in this list // (except to itself). If the list only has one item, nothing needs to // be compared. @@ -38932,21 +39943,21 @@ function collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames } } } -} // Collect all Conflicts between two collections of fields. This is similar to, +} +// Collect all Conflicts between two collections of fields. This is similar to, // but different from the `collectConflictsWithin` function above. This check // assumes that `collectConflictsWithin` has already been called on each // provided collection of fields. This is true because this validator traverses // each individual selection set. - function collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, fieldMap1, fieldMap2) { // A field map is a keyed collection, where each key represents a response // name and the value at that key is a list of all fields which provide that // response name. For any response name which appears in both provided field // maps, each field from the first field map must be compared to every field // in the second field map to find potential conflicts. - for (const [responseName, fields1] of Object.entries(fieldMap1)) { - const fields2 = fieldMap2[responseName]; - if (fields2) { + for (const [responseName, fields1] of fieldMap1.entries()) { + const fields2 = fieldMap2.get(responseName); + if (fields2 != null) { for (const field1 of fields1) { for (const field2 of fields2) { const conflict = findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, field1, field2); @@ -38957,12 +39968,14 @@ function collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentName } } } -} // Determines if there is a conflict between two particular fields, including +} +// Determines if there is a conflict between two particular fields, including // comparing their sub-fields. - function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, field1, field2) { + var _node1$directives, _node2$directives; const [parentType1, node1, def1] = field1; - const [parentType2, node2, def2] = field2; // If it is known that two fields could not possibly apply at the same + const [parentType2, node2, def2] = field2; + // If it is known that two fields could not possibly apply at the same // time, due to the parent types, then it is safe to permit them to diverge // in aliased field or arguments used as they will not present any ambiguity // by differing. @@ -38970,7 +39983,6 @@ function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPai // different Object types. Interface or Union types might overlap - if not // in the current state of the schema, then perhaps in some future version, // thus may not safely diverge. - const areMutuallyExclusive = parentFieldsAreMutuallyExclusive || parentType1 !== parentType2 && (0, _definition.isObjectType)(parentType1) && (0, _definition.isObjectType)(parentType2); if (!areMutuallyExclusive) { // Two aliases must refer to the same field. @@ -38978,21 +39990,27 @@ function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPai const name2 = node2.name.value; if (name1 !== name2) { return [[responseName, `"${name1}" and "${name2}" are different fields`], [node1], [node2]]; - } // Two field calls must have the same arguments. - + } + // Two field calls must have the same arguments. if (!sameArguments(node1, node2)) { return [[responseName, 'they have differing arguments'], [node1], [node2]]; } - } // The return type for each field. - + } + // FIXME https://github.com/graphql/graphql-js/issues/2203 + const directives1 = /* c8 ignore next */(_node1$directives = node1.directives) !== null && _node1$directives !== void 0 ? _node1$directives : []; + const directives2 = /* c8 ignore next */(_node2$directives = node2.directives) !== null && _node2$directives !== void 0 ? _node2$directives : []; + if (!sameStreams(directives1, directives2)) { + return [[responseName, 'they have differing stream directives'], [node1], [node2]]; + } + // The return type for each field. const type1 = def1 === null || def1 === void 0 ? void 0 : def1.type; const type2 = def2 === null || def2 === void 0 ? void 0 : def2.type; if (type1 && type2 && doTypesConflict(type1, type2)) { return [[responseName, `they return conflicting types "${(0, _inspect.inspect)(type1)}" and "${(0, _inspect.inspect)(type2)}"`], [node1], [node2]]; - } // Collect and compare sub-fields. Use the same "visited fragment names" list + } + // Collect and compare sub-fields. Use the same "visited fragment names" list // for both collections so fields in a fragment reference are never // compared to themselves. - const selectionSet1 = node1.selectionSet; const selectionSet2 = node2.selectionSet; if (selectionSet1 && selectionSet2) { @@ -39009,21 +40027,13 @@ function sameArguments(node1, node2) { if (args2 === undefined || args2.length === 0) { return false; } - /* c8 ignore next */ - if (args1.length !== args2.length) { - /* c8 ignore next */ return false; - /* c8 ignore next */ } - - const values2 = new Map(args2.map(_ref2 => { - let { - name, - value - } = _ref2; - return [name.value, value]; - })); + const values2 = new Map(args2.map(({ + name, + value + }) => [name.value, value])); return args1.every(arg1 => { const value1 = arg1.value; const value2 = values2.get(arg1.name.value); @@ -39035,10 +40045,26 @@ function sameArguments(node1, node2) { } function stringifyValue(value) { return (0, _printer.print)((0, _sortValueNode.sortValueNode)(value)); -} // Two types conflict if both types could not apply to a value simultaneously. +} +function getStreamDirective(directives) { + return directives.find(directive => directive.name.value === 'stream'); +} +function sameStreams(directives1, directives2) { + const stream1 = getStreamDirective(directives1); + const stream2 = getStreamDirective(directives2); + if (!stream1 && !stream2) { + // both fields do not have streams + return true; + } else if (stream1 && stream2) { + // check if both fields have equivalent streams + return sameArguments(stream1, stream2); + } + // fields have a mix of stream and no stream + return false; +} +// Two types conflict if both types could not apply to a value simultaneously. // Composite types are ignored as their individual field types will be compared // later recursively. However List and Non-Null types must match. - function doTypesConflict(type1, type2) { if ((0, _definition.isListType)(type1)) { return (0, _definition.isListType)(type2) ? doTypesConflict(type1.ofType, type2.ofType) : true; @@ -39056,24 +40082,24 @@ function doTypesConflict(type1, type2) { return type1 !== type2; } return false; -} // Given a selection set, return the collection of fields (a mapping of response +} +// Given a selection set, return the collection of fields (a mapping of response // name to field nodes and definitions) as well as a list of fragment names // referenced via fragment spreads. - function getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet) { const cached = cachedFieldsAndFragmentNames.get(selectionSet); if (cached) { return cached; } - const nodeAndDefs = Object.create(null); - const fragmentNames = Object.create(null); + const nodeAndDefs = new Map(); + const fragmentNames = new Set(); _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeAndDefs, fragmentNames); - const result = [nodeAndDefs, Object.keys(fragmentNames)]; + const result = [nodeAndDefs, [...fragmentNames]]; cachedFieldsAndFragmentNames.set(selectionSet, result); return result; -} // Given a reference to a fragment, return the represented collection of fields +} +// Given a reference to a fragment, return the represented collection of fields // as well as a list of nested fragment names referenced via fragment spreads. - function getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment) { // Short-circuit building a type from the node if possible. const cached = cachedFieldsAndFragmentNames.get(fragment.selectionSet); @@ -39094,14 +40120,16 @@ function _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeA fieldDef = parentType.getFields()[fieldName]; } const responseName = selection.alias ? selection.alias.value : fieldName; - if (!nodeAndDefs[responseName]) { - nodeAndDefs[responseName] = []; + let nodeAndDefsList = nodeAndDefs.get(responseName); + if (nodeAndDefsList == null) { + nodeAndDefsList = []; + nodeAndDefs.set(responseName, nodeAndDefsList); } - nodeAndDefs[responseName].push([parentType, selection, fieldDef]); + nodeAndDefsList.push([parentType, selection, fieldDef]); break; } case _kinds.Kind.FRAGMENT_SPREAD: - fragmentNames[selection.name.value] = true; + fragmentNames.add(selection.name.value); break; case _kinds.Kind.INLINE_FRAGMENT: { @@ -39112,27 +40140,17 @@ function _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeA } } } -} // Given a series of Conflicts which occurred between two sub-fields, generate +} +// Given a series of Conflicts which occurred between two sub-fields, generate // a single Conflict. - function subfieldConflicts(conflicts, responseName, node1, node2) { if (conflicts.length > 0) { - return [[responseName, conflicts.map(_ref3 => { - let [reason] = _ref3; - return reason; - })], [node1, ...conflicts.map(_ref4 => { - let [, fields1] = _ref4; - return fields1; - }).flat()], [node2, ...conflicts.map(_ref5 => { - let [,, fields2] = _ref5; - return fields2; - }).flat()]]; + return [[responseName, conflicts.map(([reason]) => reason)], [node1, ...conflicts.map(([, fields1]) => fields1).flat()], [node2, ...conflicts.map(([,, fields2]) => fields2).flat()]]; } } /** * A way to keep track of pairs of things when the ordering of the pair does not matter. */ - class PairSet { constructor() { this._data = new Map(); @@ -39143,10 +40161,10 @@ class PairSet { const result = (_this$_data$get = this._data.get(key1)) === null || _this$_data$get === void 0 ? void 0 : _this$_data$get.get(key2); if (result === undefined) { return false; - } // areMutuallyExclusive being false is a superset of being true, hence if + } + // areMutuallyExclusive being false is a superset of being true, hence if // we want to know if this PairSet "has" these two with no exclusivity, // we have to ensure it was added as such. - return areMutuallyExclusive ? true : areMutuallyExclusive === result; } add(a, b, areMutuallyExclusive) { @@ -39252,10 +40270,10 @@ var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../.. */ function PossibleTypeExtensionsRule(context) { const schema = context.getSchema(); - const definedTypes = Object.create(null); + const definedTypes = new Map(); for (const def of context.getDocument().definitions) { if ((0, _predicates.isTypeDefinitionNode)(def)) { - definedTypes[def.name.value] = def; + definedTypes.set(def.name.value, def); } } return { @@ -39268,15 +40286,15 @@ function PossibleTypeExtensionsRule(context) { }; function checkExtension(node) { const typeName = node.name.value; - const defNode = definedTypes[typeName]; + const defNode = definedTypes.get(typeName); const existingType = schema === null || schema === void 0 ? void 0 : schema.getType(typeName); let expectedKind; - if (defNode) { + if (defNode != null) { expectedKind = defKindToExtKind[defNode.kind]; } else if (existingType) { expectedKind = typeToExtKind(existingType); } - if (expectedKind) { + if (expectedKind != null) { if (expectedKind !== node.kind) { const kindStr = extensionKindToTypeName(node.kind); context.reportError(new _GraphQLError.GraphQLError(`Cannot extend non-${kindStr} type "${typeName}".`, { @@ -39284,10 +40302,8 @@ function PossibleTypeExtensionsRule(context) { })); } } else { - const allTypeNames = Object.keys({ - ...definedTypes, - ...(schema === null || schema === void 0 ? void 0 : schema.getTypeMap()) - }); + var _schema$getTypeMap; + const allTypeNames = [...definedTypes.keys(), ...Object.keys((_schema$getTypeMap = schema === null || schema === void 0 ? void 0 : schema.getTypeMap()) !== null && _schema$getTypeMap !== void 0 ? _schema$getTypeMap : {})]; const suggestedTypes = (0, _suggestionList.suggestionList)(typeName, allTypeNames); context.reportError(new _GraphQLError.GraphQLError(`Cannot extend type "${typeName}" because it is not defined.` + (0, _didYouMean.didYouMean)(suggestedTypes), { nodes: node.name @@ -39324,7 +40340,6 @@ function typeToExtKind(type) { } /* c8 ignore next 3 */ // Not reachable. All possible types have been considered - false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function extensionKindToTypeName(kind) { @@ -39342,9 +40357,7 @@ function extensionKindToTypeName(kind) { case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION: return 'input object'; // Not reachable. All possible types have been considered - - /* c8 ignore next */ - + /* c8 ignore next 2 */ default: false || (0, _invariant.invariant)(false, 'Unexpected kind: ' + (0, _inspect.inspect)(kind)); } @@ -39366,7 +40379,6 @@ Object.defineProperty(exports, "__esModule", ({ exports.ProvidedRequiredArgumentsOnDirectivesRule = ProvidedRequiredArgumentsOnDirectivesRule; exports.ProvidedRequiredArgumentsRule = ProvidedRequiredArgumentsRule; var _inspect = __webpack_require__(/*! ../../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); -var _keyMap = __webpack_require__(/*! ../../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _printer = __webpack_require__(/*! ../../language/printer.mjs */ "../../../node_modules/graphql/language/printer.mjs"); @@ -39390,8 +40402,7 @@ function ProvidedRequiredArgumentsRule(context) { if (!fieldDef) { return false; } - const providedArgs = new Set( - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const providedArgs = new Set( // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ (_fieldNode$arguments = fieldNode.arguments) === null || _fieldNode$arguments === void 0 ? void 0 : _fieldNode$arguments.map(arg => arg.name.value)); for (const argDef of fieldDef.args) { @@ -39409,25 +40420,22 @@ function ProvidedRequiredArgumentsRule(context) { /** * @internal */ - function ProvidedRequiredArgumentsOnDirectivesRule(context) { var _schema$getDirectives; - const requiredArgsMap = Object.create(null); + const requiredArgsMap = new Map(); const schema = context.getSchema(); const definedDirectives = (_schema$getDirectives = schema === null || schema === void 0 ? void 0 : schema.getDirectives()) !== null && _schema$getDirectives !== void 0 ? _schema$getDirectives : _directives.specifiedDirectives; for (const directive of definedDirectives) { - requiredArgsMap[directive.name] = (0, _keyMap.keyMap)(directive.args.filter(_definition.isRequiredArgument), arg => arg.name); + requiredArgsMap.set(directive.name, new Map(directive.args.filter(_definition.isRequiredArgument).map(arg => [arg.name, arg]))); } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { var _def$arguments; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 - /* c8 ignore next */ const argNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : []; - requiredArgsMap[def.name.value] = (0, _keyMap.keyMap)(argNodes.filter(isRequiredArgumentNode), arg => arg.name.value); + requiredArgsMap.set(def.name.value, new Map(argNodes.filter(isRequiredArgumentNode).map(arg => [arg.name.value, arg]))); } } return { @@ -39435,16 +40443,14 @@ function ProvidedRequiredArgumentsOnDirectivesRule(context) { // Validate on leave to allow for deeper errors to appear first. leave(directiveNode) { const directiveName = directiveNode.name.value; - const requiredArgs = requiredArgsMap[directiveName]; - if (requiredArgs) { + const requiredArgs = requiredArgsMap.get(directiveName); + if (requiredArgs != null) { var _directiveNode$argume; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 - /* c8 ignore next */ const argNodes = (_directiveNode$argume = directiveNode.arguments) !== null && _directiveNode$argume !== void 0 ? _directiveNode$argume : []; const argNodeMap = new Set(argNodes.map(arg => arg.name.value)); - for (const [argName, argDef] of Object.entries(requiredArgs)) { + for (const [argName, argDef] of requiredArgs.entries()) { if (!argNodeMap.has(argName)) { const argType = (0, _definition.isType)(argDef.type) ? (0, _inspect.inspect)(argDef.type) : (0, _printer.print)(argDef.type); context.reportError(new _GraphQLError.GraphQLError(`Directive "@${directiveName}" argument "${argName}" of type "${argType}" is required, but it was not provided.`, { @@ -39527,6 +40533,9 @@ exports.SingleFieldSubscriptionsRule = SingleFieldSubscriptionsRule; var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _collectFields = __webpack_require__(/*! ../../execution/collectFields.mjs */ "../../../node_modules/graphql/execution/collectFields.mjs"); +function toNodes(fieldGroup) { + return fieldGroup.map(fieldDetails => fieldDetails.node); +} /** * Subscriptions must only include a non-introspection field. * @@ -39551,21 +40560,22 @@ function SingleFieldSubscriptionsRule(context) { fragments[definition.name.value] = definition; } } - const fields = (0, _collectFields.collectFields)(schema, fragments, variableValues, subscriptionType, node.selectionSet); - if (fields.size > 1) { - const fieldSelectionLists = [...fields.values()]; - const extraFieldSelectionLists = fieldSelectionLists.slice(1); - const extraFieldSelections = extraFieldSelectionLists.flat(); + const { + groupedFieldSet + } = (0, _collectFields.collectFields)(schema, fragments, variableValues, subscriptionType, node); + if (groupedFieldSet.size > 1) { + const fieldGroups = [...groupedFieldSet.values()]; + const extraFieldGroups = fieldGroups.slice(1); + const extraFieldSelections = extraFieldGroups.flatMap(fieldGroup => toNodes(fieldGroup)); context.reportError(new _GraphQLError.GraphQLError(operationName != null ? `Subscription "${operationName}" must select only one top level field.` : 'Anonymous Subscription must select only one top level field.', { nodes: extraFieldSelections })); } - for (const fieldNodes of fields.values()) { - const field = fieldNodes[0]; - const fieldName = field.name.value; + for (const fieldGroup of groupedFieldSet.values()) { + const fieldName = toNodes(fieldGroup)[0].name.value; if (fieldName.startsWith('__')) { context.reportError(new _GraphQLError.GraphQLError(operationName != null ? `Subscription "${operationName}" must not select an introspection top level field.` : 'Anonymous Subscription must not select an introspection top level field.', { - nodes: fieldNodes + nodes: toNodes(fieldGroup) })); } } @@ -39577,6 +40587,42 @@ function SingleFieldSubscriptionsRule(context) { /***/ }), +/***/ "../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs": +/*!*****************************************************************************************!*\ + !*** ../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs ***! + \*****************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.StreamDirectiveOnListFieldRule = StreamDirectiveOnListFieldRule; +var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); +var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); +/** + * Stream directives are used on list fields + * + * A GraphQL document is only valid if stream directives are used on list fields. + */ +function StreamDirectiveOnListFieldRule(context) { + return { + Directive(node) { + const fieldDef = context.getFieldDef(); + const parentType = context.getParentType(); + if (fieldDef && parentType && node.name.value === _directives.GraphQLStreamDirective.name && !((0, _definition.isListType)(fieldDef.type) || (0, _definition.isWrappingType)(fieldDef.type) && (0, _definition.isListType)(fieldDef.type.ofType))) { + context.reportError(new _GraphQLError.GraphQLError(`Stream directive cannot be used on non-list field "${fieldDef.name}" on type "${parentType.name}".`, { + nodes: node + })); + } + } + }; +} + +/***/ }), + /***/ "../../../node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.mjs": /*!********************************************************************************************!*\ !*** ../../../node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.mjs ***! @@ -39601,9 +40647,7 @@ function UniqueArgumentDefinitionNamesRule(context) { return { DirectiveDefinition(directiveNode) { var _directiveNode$argume; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 - /* c8 ignore next */ const argumentNodes = (_directiveNode$argume = directiveNode.arguments) !== null && _directiveNode$argume !== void 0 ? _directiveNode$argume : []; return checkArgUniqueness(`@${directiveNode.name.value}`, argumentNodes); @@ -39615,17 +40659,15 @@ function UniqueArgumentDefinitionNamesRule(context) { }; function checkArgUniquenessPerField(typeNode) { var _typeNode$fields; - const typeName = typeNode.name.value; // FIXME: https://github.com/graphql/graphql-js/issues/2203 - + const typeName = typeNode.name.value; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ - const fieldNodes = (_typeNode$fields = typeNode.fields) !== null && _typeNode$fields !== void 0 ? _typeNode$fields : []; for (const fieldDef of fieldNodes) { var _fieldDef$arguments; - const fieldName = fieldDef.name.value; // FIXME: https://github.com/graphql/graphql-js/issues/2203 - + const fieldName = fieldDef.name.value; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ - const argumentNodes = (_fieldDef$arguments = fieldDef.arguments) !== null && _fieldDef$arguments !== void 0 ? _fieldDef$arguments : []; checkArgUniqueness(`${typeName}.${fieldName}`, argumentNodes); } @@ -39675,9 +40717,7 @@ function UniqueArgumentNamesRule(context) { }; function checkArgUniqueness(parentNode) { var _parentNode$arguments; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 - /* c8 ignore next */ const argumentNodes = (_parentNode$arguments = parentNode.arguments) !== null && _parentNode$arguments !== void 0 ? _parentNode$arguments : []; const seenArgs = (0, _groupBy.groupBy)(argumentNodes, arg => arg.name.value); @@ -39712,7 +40752,7 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * A GraphQL document is only valid if all defined directives have unique names. */ function UniqueDirectiveNamesRule(context) { - const knownDirectiveNames = Object.create(null); + const knownDirectiveNames = new Map(); const schema = context.getSchema(); return { DirectiveDefinition(node) { @@ -39723,12 +40763,13 @@ function UniqueDirectiveNamesRule(context) { })); return; } - if (knownDirectiveNames[directiveName]) { + const knownName = knownDirectiveNames.get(directiveName); + if (knownName) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one directive named "@${directiveName}".`, { - nodes: [knownDirectiveNames[directiveName], node.name] + nodes: [knownName, node.name] })); } else { - knownDirectiveNames[directiveName] = node.name; + knownDirectiveNames.set(directiveName, node.name); } return false; } @@ -39762,20 +40803,20 @@ var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../.. * See https://spec.graphql.org/draft/#sec-Directives-Are-Unique-Per-Location */ function UniqueDirectivesPerLocationRule(context) { - const uniqueDirectiveMap = Object.create(null); + const uniqueDirectiveMap = new Map(); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives; for (const directive of definedDirectives) { - uniqueDirectiveMap[directive.name] = !directive.isRepeatable; + uniqueDirectiveMap.set(directive.name, !directive.isRepeatable); } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { - uniqueDirectiveMap[def.name.value] = !def.repeatable; + uniqueDirectiveMap.set(def.name.value, !def.repeatable); } } - const schemaDirectives = Object.create(null); - const typeDirectivesMap = Object.create(null); + const schemaDirectives = new Map(); + const typeDirectivesMap = new Map(); return { // Many different AST nodes may contain directives. Rather than listing // them all, just listen for entering any node, and check to see if it @@ -39789,22 +40830,24 @@ function UniqueDirectivesPerLocationRule(context) { seenDirectives = schemaDirectives; } else if ((0, _predicates.isTypeDefinitionNode)(node) || (0, _predicates.isTypeExtensionNode)(node)) { const typeName = node.name.value; - seenDirectives = typeDirectivesMap[typeName]; + seenDirectives = typeDirectivesMap.get(typeName); if (seenDirectives === undefined) { - typeDirectivesMap[typeName] = seenDirectives = Object.create(null); + seenDirectives = new Map(); + typeDirectivesMap.set(typeName, seenDirectives); } } else { - seenDirectives = Object.create(null); + seenDirectives = new Map(); } for (const directive of node.directives) { const directiveName = directive.name.value; - if (uniqueDirectiveMap[directiveName]) { - if (seenDirectives[directiveName]) { + if (uniqueDirectiveMap.get(directiveName) === true) { + const seenDirective = seenDirectives.get(directiveName); + if (seenDirective != null) { context.reportError(new _GraphQLError.GraphQLError(`The directive "@${directiveName}" can only be used once at this location.`, { - nodes: [seenDirectives[directiveName], directive] + nodes: [seenDirective, directive] })); } else { - seenDirectives[directiveName] = directive; + seenDirectives.set(directiveName, directive); } } } @@ -39836,7 +40879,7 @@ var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../.. function UniqueEnumValueNamesRule(context) { const schema = context.getSchema(); const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); - const knownValueNames = Object.create(null); + const knownValueNames = new Map(); return { EnumTypeDefinition: checkValueUniqueness, EnumTypeExtension: checkValueUniqueness @@ -39844,14 +40887,14 @@ function UniqueEnumValueNamesRule(context) { function checkValueUniqueness(node) { var _node$values; const typeName = node.name.value; - if (!knownValueNames[typeName]) { - knownValueNames[typeName] = Object.create(null); - } // FIXME: https://github.com/graphql/graphql-js/issues/2203 - + let valueNames = knownValueNames.get(typeName); + if (valueNames == null) { + valueNames = new Map(); + knownValueNames.set(typeName, valueNames); + } + // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ - const valueNodes = (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; - const valueNames = knownValueNames[typeName]; for (const valueDef of valueNodes) { const valueName = valueDef.name.value; const existingType = existingTypeMap[typeName]; @@ -39859,12 +40902,15 @@ function UniqueEnumValueNamesRule(context) { context.reportError(new _GraphQLError.GraphQLError(`Enum value "${typeName}.${valueName}" already exists in the schema. It cannot also be defined in this type extension.`, { nodes: valueDef.name })); - } else if (valueNames[valueName]) { + continue; + } + const knownValueName = valueNames.get(valueName); + if (knownValueName != null) { context.reportError(new _GraphQLError.GraphQLError(`Enum value "${typeName}.${valueName}" can only be defined once.`, { - nodes: [valueNames[valueName], valueDef.name] + nodes: [knownValueName, valueDef.name] })); } else { - valueNames[valueName] = valueDef.name; + valueNames.set(valueName, valueDef.name); } } return false; @@ -39895,7 +40941,7 @@ var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../.. function UniqueFieldDefinitionNamesRule(context) { const schema = context.getSchema(); const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); - const knownFieldNames = Object.create(null); + const knownFieldNames = new Map(); return { InputObjectTypeDefinition: checkFieldUniqueness, InputObjectTypeExtension: checkFieldUniqueness, @@ -39907,26 +40953,29 @@ function UniqueFieldDefinitionNamesRule(context) { function checkFieldUniqueness(node) { var _node$fields; const typeName = node.name.value; - if (!knownFieldNames[typeName]) { - knownFieldNames[typeName] = Object.create(null); - } // FIXME: https://github.com/graphql/graphql-js/issues/2203 - + let fieldNames = knownFieldNames.get(typeName); + if (fieldNames == null) { + fieldNames = new Map(); + knownFieldNames.set(typeName, fieldNames); + } + // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ - const fieldNodes = (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; - const fieldNames = knownFieldNames[typeName]; for (const fieldDef of fieldNodes) { const fieldName = fieldDef.name.value; if (hasField(existingTypeMap[typeName], fieldName)) { context.reportError(new _GraphQLError.GraphQLError(`Field "${typeName}.${fieldName}" already exists in the schema. It cannot also be defined in this type extension.`, { nodes: fieldDef.name })); - } else if (fieldNames[fieldName]) { + continue; + } + const knownFieldName = fieldNames.get(fieldName); + if (knownFieldName != null) { context.reportError(new _GraphQLError.GraphQLError(`Field "${typeName}.${fieldName}" can only be defined once.`, { - nodes: [fieldNames[fieldName], fieldDef.name] + nodes: [knownFieldName, fieldDef.name] })); } else { - fieldNames[fieldName] = fieldDef.name; + fieldNames.set(fieldName, fieldDef.name); } } return false; @@ -39962,17 +41011,18 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-Fragment-Name-Uniqueness */ function UniqueFragmentNamesRule(context) { - const knownFragmentNames = Object.create(null); + const knownFragmentNames = new Map(); return { OperationDefinition: () => false, FragmentDefinition(node) { const fragmentName = node.name.value; - if (knownFragmentNames[fragmentName]) { + const knownFragmentName = knownFragmentNames.get(fragmentName); + if (knownFragmentName != null) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one fragment named "${fragmentName}".`, { - nodes: [knownFragmentNames[fragmentName], node.name] + nodes: [knownFragmentName, node.name] })); } else { - knownFragmentNames[fragmentName] = node.name; + knownFragmentNames.set(fragmentName, node.name); } return false; } @@ -40005,27 +41055,28 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ */ function UniqueInputFieldNamesRule(context) { const knownNameStack = []; - let knownNames = Object.create(null); + let knownNames = new Map(); return { ObjectValue: { enter() { knownNameStack.push(knownNames); - knownNames = Object.create(null); + knownNames = new Map(); }, leave() { const prevKnownNames = knownNameStack.pop(); - prevKnownNames || (0, _invariant.invariant)(false); + prevKnownNames != null || (0, _invariant.invariant)(false); knownNames = prevKnownNames; } }, ObjectField(node) { const fieldName = node.name.value; - if (knownNames[fieldName]) { + const knownName = knownNames.get(fieldName); + if (knownName != null) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one input field named "${fieldName}".`, { - nodes: [knownNames[fieldName], node.name] + nodes: [knownName, node.name] })); } else { - knownNames[fieldName] = node.name; + knownNames.set(fieldName, node.name); } } }; @@ -40054,17 +41105,18 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-Operation-Name-Uniqueness */ function UniqueOperationNamesRule(context) { - const knownOperationNames = Object.create(null); + const knownOperationNames = new Map(); return { OperationDefinition(node) { const operationName = node.name; - if (operationName) { - if (knownOperationNames[operationName.value]) { + if (operationName != null) { + const knownOperationName = knownOperationNames.get(operationName.value); + if (knownOperationName != null) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one operation named "${operationName.value}".`, { - nodes: [knownOperationNames[operationName.value], operationName] + nodes: [knownOperationName, operationName] })); } else { - knownOperationNames[operationName.value] = operationName; + knownOperationNames.set(operationName.value, operationName); } } return false; @@ -40095,7 +41147,7 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ */ function UniqueOperationTypesRule(context) { const schema = context.getSchema(); - const definedOperationTypes = Object.create(null); + const definedOperationTypes = new Map(); const existingOperationTypes = schema ? { query: schema.getQueryType(), mutation: schema.getMutationType(), @@ -40107,14 +41159,12 @@ function UniqueOperationTypesRule(context) { }; function checkOperationTypes(node) { var _node$operationTypes; - // See: https://github.com/graphql/graphql-js/issues/2203 - /* c8 ignore next */ const operationTypesNodes = (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; for (const operationType of operationTypesNodes) { const operation = operationType.operation; - const alreadyDefinedOperationType = definedOperationTypes[operation]; + const alreadyDefinedOperationType = definedOperationTypes.get(operation); if (existingOperationTypes[operation]) { context.reportError(new _GraphQLError.GraphQLError(`Type for ${operation} already defined in the schema. It cannot be redefined.`, { nodes: operationType @@ -40124,7 +41174,7 @@ function UniqueOperationTypesRule(context) { nodes: [alreadyDefinedOperationType, operationType] })); } else { - definedOperationTypes[operation] = operationType; + definedOperationTypes.set(operation, operationType); } } return false; @@ -40152,7 +41202,7 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * A GraphQL document is only valid if all defined types have unique names. */ function UniqueTypeNamesRule(context) { - const knownTypeNames = Object.create(null); + const knownTypeNames = new Map(); const schema = context.getSchema(); return { ScalarTypeDefinition: checkTypeName, @@ -40170,12 +41220,13 @@ function UniqueTypeNamesRule(context) { })); return; } - if (knownTypeNames[typeName]) { + const knownNameNode = knownTypeNames.get(typeName); + if (knownNameNode != null) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one type named "${typeName}".`, { - nodes: [knownTypeNames[typeName], node.name] + nodes: [knownNameNode, node.name] })); } else { - knownTypeNames[typeName] = node.name; + knownTypeNames.set(typeName, node.name); } return false; } @@ -40206,9 +41257,7 @@ function UniqueVariableNamesRule(context) { return { OperationDefinition(operationNode) { var _operationNode$variab; - // See: https://github.com/graphql/graphql-js/issues/2203 - /* c8 ignore next */ const variableDefinitions = (_operationNode$variab = operationNode.variableDefinitions) !== null && _operationNode$variab !== void 0 ? _operationNode$variab : []; const seenVariableDefinitions = (0, _groupBy.groupBy)(variableDefinitions, node => node.variable.name.value); @@ -40239,9 +41288,9 @@ Object.defineProperty(exports, "__esModule", ({ exports.ValuesOfCorrectTypeRule = ValuesOfCorrectTypeRule; var _didYouMean = __webpack_require__(/*! ../../jsutils/didYouMean.mjs */ "../../../node_modules/graphql/jsutils/didYouMean.mjs"); var _inspect = __webpack_require__(/*! ../../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); -var _keyMap = __webpack_require__(/*! ../../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _suggestionList = __webpack_require__(/*! ../../jsutils/suggestionList.mjs */ "../../../node_modules/graphql/jsutils/suggestionList.mjs"); var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _printer = __webpack_require__(/*! ../../language/printer.mjs */ "../../../node_modules/graphql/language/printer.mjs"); var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); /** @@ -40253,7 +41302,16 @@ var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../.. * See https://spec.graphql.org/draft/#sec-Values-of-Correct-Type */ function ValuesOfCorrectTypeRule(context) { + let variableDefinitions = {}; return { + OperationDefinition: { + enter() { + variableDefinitions = {}; + } + }, + VariableDefinition(definition) { + variableDefinitions[definition.variable.name.value] = definition; + }, ListValue(node) { // Note: TypeInfo will traverse into a list's item type, so look to the // parent input type to check if it is a list. @@ -40263,17 +41321,16 @@ function ValuesOfCorrectTypeRule(context) { return false; // Don't traverse further. } }, - ObjectValue(node) { const type = (0, _definition.getNamedType)(context.getInputType()); if (!(0, _definition.isInputObjectType)(type)) { isValidValueNode(context, node); return false; // Don't traverse further. - } // Ensure every required field exists. - - const fieldNodeMap = (0, _keyMap.keyMap)(node.fields, field => field.name.value); + } + // Ensure every required field exists. + const fieldNodeMap = new Map(node.fields.map(field => [field.name.value, field])); for (const fieldDef of Object.values(type.getFields())) { - const fieldNode = fieldNodeMap[fieldDef.name]; + const fieldNode = fieldNodeMap.get(fieldDef.name); if (!fieldNode && (0, _definition.isRequiredInputField)(fieldDef)) { const typeStr = (0, _inspect.inspect)(fieldDef.type); context.reportError(new _GraphQLError.GraphQLError(`Field "${type.name}.${fieldDef.name}" of required type "${typeStr}" was not provided.`, { @@ -40281,6 +41338,9 @@ function ValuesOfCorrectTypeRule(context) { })); } } + if (type.isOneOf) { + validateOneOfInputObject(context, node, type, fieldNodeMap, variableDefinitions); + } }, ObjectField(node) { const parentType = (0, _definition.getNamedType)(context.getParentInputType()); @@ -40311,7 +41371,6 @@ function ValuesOfCorrectTypeRule(context) { * Any value literal may be a valid representation of a Scalar, depending on * that scalar type. */ - function isValidValueNode(context, node) { // Report any error at the full type expected by the location. const locationType = context.getInputType(); @@ -40325,13 +41384,11 @@ function isValidValueNode(context, node) { nodes: node })); return; - } // Scalars and Enums determine if a literal value is valid via parseLiteral(), + } + // Scalars and Enums determine if a literal value is valid via parseLiteral(), // which may throw or return an invalid value to indicate failure. - try { - const parseResult = type.parseLiteral(node, undefined - /* variables */); - + const parseResult = type.parseLiteral(node, undefined /* variables */); if (parseResult === undefined) { const typeStr = (0, _inspect.inspect)(locationType); context.reportError(new _GraphQLError.GraphQLError(`Expected value of type "${typeStr}", found ${(0, _printer.print)(node)}.`, { @@ -40350,6 +41407,36 @@ function isValidValueNode(context, node) { } } } +function validateOneOfInputObject(context, node, type, fieldNodeMap, variableDefinitions) { + var _fieldNodeMap$get; + const keys = Array.from(fieldNodeMap.keys()); + const isNotExactlyOneField = keys.length !== 1; + if (isNotExactlyOneField) { + context.reportError(new _GraphQLError.GraphQLError(`OneOf Input Object "${type.name}" must specify exactly one key.`, { + nodes: [node] + })); + return; + } + const value = (_fieldNodeMap$get = fieldNodeMap.get(keys[0])) === null || _fieldNodeMap$get === void 0 ? void 0 : _fieldNodeMap$get.value; + const isNullLiteral = !value || value.kind === _kinds.Kind.NULL; + const isVariable = (value === null || value === void 0 ? void 0 : value.kind) === _kinds.Kind.VARIABLE; + if (isNullLiteral) { + context.reportError(new _GraphQLError.GraphQLError(`Field "${type.name}.${keys[0]}" must be non-null.`, { + nodes: [node] + })); + return; + } + if (isVariable) { + const variableName = value.name.value; + const definition = variableDefinitions[variableName]; + const isNullableVariable = definition.type.kind !== _kinds.Kind.NON_NULL_TYPE; + if (isNullableVariable) { + context.reportError(new _GraphQLError.GraphQLError(`Variable "${variableName}" must be non-nullable to be used for OneOf Input Object "${type.name}".`, { + nodes: [node] + })); + } + } +} /***/ }), @@ -40420,11 +41507,11 @@ var _typeFromAST = __webpack_require__(/*! ../../utilities/typeFromAST.mjs */ ". * See https://spec.graphql.org/draft/#sec-All-Variable-Usages-are-Allowed */ function VariablesInAllowedPositionRule(context) { - let varDefMap = Object.create(null); + let varDefMap; return { OperationDefinition: { enter() { - varDefMap = Object.create(null); + varDefMap = new Map(); }, leave(operation) { const usages = context.getRecursiveVariableUsages(operation); @@ -40434,7 +41521,7 @@ function VariablesInAllowedPositionRule(context) { defaultValue } of usages) { const varName = node.name.value; - const varDef = varDefMap[varName]; + const varDef = varDefMap.get(varName); if (varDef && type) { // A var type is allowed if it is the same or more strict (e.g. is // a subtype of) than the expected type. It can be more strict if @@ -40455,7 +41542,7 @@ function VariablesInAllowedPositionRule(context) { } }, VariableDefinition(node) { - varDefMap[node.variable.name.value] = node; + varDefMap.set(node.variable.name.value, node); } }; } @@ -40464,7 +41551,6 @@ function VariablesInAllowedPositionRule(context) { * which includes considering if default values exist for either the variable * or the location at which it is located. */ - function allowedVariableUsage(schema, varType, varDefaultValue, locationType, locationDefaultValue) { if ((0, _definition.isNonNullType)(locationType) && !(0, _definition.isNonNullType)(varType)) { const hasNonNullVariableDefaultValue = varDefaultValue != null && varDefaultValue.kind !== _kinds.Kind.NULL; @@ -40616,7 +41702,10 @@ function NoSchemaIntrospectionCustomRule(context) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.specifiedSDLRules = exports.specifiedRules = void 0; +exports.specifiedSDLRules = exports.specifiedRules = exports.recommendedRules = void 0; +var _DeferStreamDirectiveLabelRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveLabelRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs"); +var _DeferStreamDirectiveOnRootFieldRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnRootFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs"); +var _DeferStreamDirectiveOnValidOperationsRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnValidOperationsRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs"); var _ExecutableDefinitionsRule = __webpack_require__(/*! ./rules/ExecutableDefinitionsRule.mjs */ "../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs"); var _FieldsOnCorrectTypeRule = __webpack_require__(/*! ./rules/FieldsOnCorrectTypeRule.mjs */ "../../../node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.mjs"); var _FragmentsOnCompositeTypesRule = __webpack_require__(/*! ./rules/FragmentsOnCompositeTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.mjs"); @@ -40626,6 +41715,7 @@ var _KnownFragmentNamesRule = __webpack_require__(/*! ./rules/KnownFragmentNames var _KnownTypeNamesRule = __webpack_require__(/*! ./rules/KnownTypeNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/KnownTypeNamesRule.mjs"); var _LoneAnonymousOperationRule = __webpack_require__(/*! ./rules/LoneAnonymousOperationRule.mjs */ "../../../node_modules/graphql/validation/rules/LoneAnonymousOperationRule.mjs"); var _LoneSchemaDefinitionRule = __webpack_require__(/*! ./rules/LoneSchemaDefinitionRule.mjs */ "../../../node_modules/graphql/validation/rules/LoneSchemaDefinitionRule.mjs"); +var _MaxIntrospectionDepthRule = __webpack_require__(/*! ./rules/MaxIntrospectionDepthRule.mjs */ "../../../node_modules/graphql/validation/rules/MaxIntrospectionDepthRule.mjs"); var _NoFragmentCyclesRule = __webpack_require__(/*! ./rules/NoFragmentCyclesRule.mjs */ "../../../node_modules/graphql/validation/rules/NoFragmentCyclesRule.mjs"); var _NoUndefinedVariablesRule = __webpack_require__(/*! ./rules/NoUndefinedVariablesRule.mjs */ "../../../node_modules/graphql/validation/rules/NoUndefinedVariablesRule.mjs"); var _NoUnusedFragmentsRule = __webpack_require__(/*! ./rules/NoUnusedFragmentsRule.mjs */ "../../../node_modules/graphql/validation/rules/NoUnusedFragmentsRule.mjs"); @@ -40636,6 +41726,7 @@ var _PossibleTypeExtensionsRule = __webpack_require__(/*! ./rules/PossibleTypeEx var _ProvidedRequiredArgumentsRule = __webpack_require__(/*! ./rules/ProvidedRequiredArgumentsRule.mjs */ "../../../node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.mjs"); var _ScalarLeafsRule = __webpack_require__(/*! ./rules/ScalarLeafsRule.mjs */ "../../../node_modules/graphql/validation/rules/ScalarLeafsRule.mjs"); var _SingleFieldSubscriptionsRule = __webpack_require__(/*! ./rules/SingleFieldSubscriptionsRule.mjs */ "../../../node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.mjs"); +var _StreamDirectiveOnListFieldRule = __webpack_require__(/*! ./rules/StreamDirectiveOnListFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs"); var _UniqueArgumentDefinitionNamesRule = __webpack_require__(/*! ./rules/UniqueArgumentDefinitionNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.mjs"); var _UniqueArgumentNamesRule = __webpack_require__(/*! ./rules/UniqueArgumentNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueArgumentNamesRule.mjs"); var _UniqueDirectiveNamesRule = __webpack_require__(/*! ./rules/UniqueDirectiveNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.mjs"); @@ -40651,7 +41742,14 @@ var _UniqueVariableNamesRule = __webpack_require__(/*! ./rules/UniqueVariableNam var _ValuesOfCorrectTypeRule = __webpack_require__(/*! ./rules/ValuesOfCorrectTypeRule.mjs */ "../../../node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.mjs"); var _VariablesAreInputTypesRule = __webpack_require__(/*! ./rules/VariablesAreInputTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/VariablesAreInputTypesRule.mjs"); var _VariablesInAllowedPositionRule = __webpack_require__(/*! ./rules/VariablesInAllowedPositionRule.mjs */ "../../../node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.mjs"); +// Spec Section: "Defer And Stream Directive Labels Are Unique" + +// Spec Section: "Defer And Stream Directives Are Used On Valid Root Field" + +// Spec Section: "Defer And Stream Directives Are Used On Valid Operations" + // Spec Section: "Executable Definitions" + // Spec Section: "Field Selections on Objects, Interfaces, and Unions Types" // Spec Section: "Fragments on Composite Types" @@ -40668,6 +41766,8 @@ var _VariablesInAllowedPositionRule = __webpack_require__(/*! ./rules/VariablesI // SDL-specific validation rules +// TODO: Spec Section + // Spec Section: "Fragments must not form cycles" // Spec Section: "All Variable Used Defined" @@ -40686,6 +41786,8 @@ var _VariablesInAllowedPositionRule = __webpack_require__(/*! ./rules/VariablesI // Spec Section: "Subscriptions with Single Root Field" +// Spec Section: "Stream Directives Are Used On List Fields" + // Spec Section: "Argument Uniqueness" // Spec Section: "Directives Are Unique Per Location" @@ -40704,19 +41806,22 @@ var _VariablesInAllowedPositionRule = __webpack_require__(/*! ./rules/VariablesI // Spec Section: "All Variable Usages Are Allowed" +/** + * Technically these aren't part of the spec but they are strongly encouraged + * validation rules. + */ +const recommendedRules = exports.recommendedRules = Object.freeze([_MaxIntrospectionDepthRule.MaxIntrospectionDepthRule]); /** * This set includes all validation rules defined by the GraphQL spec. * * The order of the rules in this list has been adjusted to lead to the * most clear output when encountering multiple validation errors. */ -const specifiedRules = Object.freeze([_ExecutableDefinitionsRule.ExecutableDefinitionsRule, _UniqueOperationNamesRule.UniqueOperationNamesRule, _LoneAnonymousOperationRule.LoneAnonymousOperationRule, _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule, _KnownTypeNamesRule.KnownTypeNamesRule, _FragmentsOnCompositeTypesRule.FragmentsOnCompositeTypesRule, _VariablesAreInputTypesRule.VariablesAreInputTypesRule, _ScalarLeafsRule.ScalarLeafsRule, _FieldsOnCorrectTypeRule.FieldsOnCorrectTypeRule, _UniqueFragmentNamesRule.UniqueFragmentNamesRule, _KnownFragmentNamesRule.KnownFragmentNamesRule, _NoUnusedFragmentsRule.NoUnusedFragmentsRule, _PossibleFragmentSpreadsRule.PossibleFragmentSpreadsRule, _NoFragmentCyclesRule.NoFragmentCyclesRule, _UniqueVariableNamesRule.UniqueVariableNamesRule, _NoUndefinedVariablesRule.NoUndefinedVariablesRule, _NoUnusedVariablesRule.NoUnusedVariablesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _KnownArgumentNamesRule.KnownArgumentNamesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _ValuesOfCorrectTypeRule.ValuesOfCorrectTypeRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsRule, _VariablesInAllowedPositionRule.VariablesInAllowedPositionRule, _OverlappingFieldsCanBeMergedRule.OverlappingFieldsCanBeMergedRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule]); +const specifiedRules = exports.specifiedRules = Object.freeze([_ExecutableDefinitionsRule.ExecutableDefinitionsRule, _UniqueOperationNamesRule.UniqueOperationNamesRule, _LoneAnonymousOperationRule.LoneAnonymousOperationRule, _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule, _KnownTypeNamesRule.KnownTypeNamesRule, _FragmentsOnCompositeTypesRule.FragmentsOnCompositeTypesRule, _VariablesAreInputTypesRule.VariablesAreInputTypesRule, _ScalarLeafsRule.ScalarLeafsRule, _FieldsOnCorrectTypeRule.FieldsOnCorrectTypeRule, _UniqueFragmentNamesRule.UniqueFragmentNamesRule, _KnownFragmentNamesRule.KnownFragmentNamesRule, _NoUnusedFragmentsRule.NoUnusedFragmentsRule, _PossibleFragmentSpreadsRule.PossibleFragmentSpreadsRule, _NoFragmentCyclesRule.NoFragmentCyclesRule, _UniqueVariableNamesRule.UniqueVariableNamesRule, _NoUndefinedVariablesRule.NoUndefinedVariablesRule, _NoUnusedVariablesRule.NoUnusedVariablesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _DeferStreamDirectiveOnRootFieldRule.DeferStreamDirectiveOnRootFieldRule, _DeferStreamDirectiveOnValidOperationsRule.DeferStreamDirectiveOnValidOperationsRule, _DeferStreamDirectiveLabelRule.DeferStreamDirectiveLabelRule, _StreamDirectiveOnListFieldRule.StreamDirectiveOnListFieldRule, _KnownArgumentNamesRule.KnownArgumentNamesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _ValuesOfCorrectTypeRule.ValuesOfCorrectTypeRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsRule, _VariablesInAllowedPositionRule.VariablesInAllowedPositionRule, _OverlappingFieldsCanBeMergedRule.OverlappingFieldsCanBeMergedRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule, ...recommendedRules]); /** * @internal */ -exports.specifiedRules = specifiedRules; -const specifiedSDLRules = Object.freeze([_LoneSchemaDefinitionRule.LoneSchemaDefinitionRule, _UniqueOperationTypesRule.UniqueOperationTypesRule, _UniqueTypeNamesRule.UniqueTypeNamesRule, _UniqueEnumValueNamesRule.UniqueEnumValueNamesRule, _UniqueFieldDefinitionNamesRule.UniqueFieldDefinitionNamesRule, _UniqueArgumentDefinitionNamesRule.UniqueArgumentDefinitionNamesRule, _UniqueDirectiveNamesRule.UniqueDirectiveNamesRule, _KnownTypeNamesRule.KnownTypeNamesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _PossibleTypeExtensionsRule.PossibleTypeExtensionsRule, _KnownArgumentNamesRule.KnownArgumentNamesOnDirectivesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsOnDirectivesRule]); -exports.specifiedSDLRules = specifiedSDLRules; +const specifiedSDLRules = exports.specifiedSDLRules = Object.freeze([_LoneSchemaDefinitionRule.LoneSchemaDefinitionRule, _UniqueOperationTypesRule.UniqueOperationTypesRule, _UniqueTypeNamesRule.UniqueTypeNamesRule, _UniqueEnumValueNamesRule.UniqueEnumValueNamesRule, _UniqueFieldDefinitionNamesRule.UniqueFieldDefinitionNamesRule, _UniqueArgumentDefinitionNamesRule.UniqueArgumentDefinitionNamesRule, _UniqueDirectiveNamesRule.UniqueDirectiveNamesRule, _KnownTypeNamesRule.KnownTypeNamesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _PossibleTypeExtensionsRule.PossibleTypeExtensionsRule, _KnownArgumentNamesRule.KnownArgumentNamesOnDirectivesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsOnDirectivesRule]); /***/ }), @@ -40735,7 +41840,6 @@ exports.assertValidSDL = assertValidSDL; exports.assertValidSDLExtension = assertValidSDLExtension; exports.validate = validate; exports.validateSDL = validateSDL; -var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _visitor = __webpack_require__(/*! ../language/visitor.mjs */ "../../../node_modules/graphql/language/visitor.mjs"); var _validate = __webpack_require__(/*! ../type/validate.mjs */ "../../../node_modules/graphql/type/validate.mjs"); @@ -40762,34 +41866,30 @@ var _ValidationContext = __webpack_require__(/*! ./ValidationContext.mjs */ "../ * Optionally a custom TypeInfo instance may be provided. If not provided, one * will be created from the provided schema. */ - -function validate(schema, documentAST) { - let rules = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _specifiedRules.specifiedRules; - let options = arguments.length > 3 ? arguments[3] : undefined; - let typeInfo = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : new _TypeInfo.TypeInfo(schema); +function validate(schema, documentAST, rules = _specifiedRules.specifiedRules, options, /** @deprecated will be removed in 17.0.0 */ +typeInfo = new _TypeInfo.TypeInfo(schema)) { var _options$maxErrors; const maxErrors = (_options$maxErrors = options === null || options === void 0 ? void 0 : options.maxErrors) !== null && _options$maxErrors !== void 0 ? _options$maxErrors : 100; - documentAST || (0, _devAssert.devAssert)(false, 'Must provide document.'); // If the schema used for validation is invalid, throw an error. - + // If the schema used for validation is invalid, throw an error. (0, _validate.assertValidSchema)(schema); - const abortObj = Object.freeze({}); + const abortError = new _GraphQLError.GraphQLError('Too many validation errors, error limit reached. Validation aborted.'); const errors = []; const context = new _ValidationContext.ValidationContext(schema, documentAST, typeInfo, error => { if (errors.length >= maxErrors) { - errors.push(new _GraphQLError.GraphQLError('Too many validation errors, error limit reached. Validation aborted.')); // eslint-disable-next-line @typescript-eslint/no-throw-literal - - throw abortObj; + throw abortError; } errors.push(error); - }); // This uses a specialized visitor which runs multiple visitors in parallel, + }); + // This uses a specialized visitor which runs multiple visitors in parallel, // while maintaining the visitor skip and break API. - - const visitor = (0, _visitor.visitInParallel)(rules.map(rule => rule(context))); // Visit the whole document with each instance of all provided rules. - + const visitor = (0, _visitor.visitInParallel)(rules.map(rule => rule(context))); + // Visit the whole document with each instance of all provided rules. try { (0, _visitor.visit)(documentAST, (0, _TypeInfo.visitWithTypeInfo)(typeInfo, visitor)); } catch (e) { - if (e !== abortObj) { + if (e === abortError) { + errors.push(abortError); + } else { throw e; } } @@ -40798,9 +41898,7 @@ function validate(schema, documentAST) { /** * @internal */ - -function validateSDL(documentAST, schemaToExtend) { - let rules = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _specifiedRules.specifiedSDLRules; +function validateSDL(documentAST, schemaToExtend, rules = _specifiedRules.specifiedSDLRules) { const errors = []; const context = new _ValidationContext.SDLValidationContext(documentAST, schemaToExtend, error => { errors.push(error); @@ -40815,7 +41913,6 @@ function validateSDL(documentAST, schemaToExtend) { * * @internal */ - function assertValidSDL(documentAST) { const errors = validateSDL(documentAST); if (errors.length !== 0) { @@ -40828,7 +41925,6 @@ function assertValidSDL(documentAST) { * * @internal */ - function assertValidSDLExtension(documentAST, schema) { const errors = validateSDL(documentAST, schema); if (errors.length !== 0) { @@ -40852,22 +41948,19 @@ Object.defineProperty(exports, "__esModule", ({ exports.versionInfo = exports.version = void 0; // Note: This file is autogenerated using "resources/gen-version.js" script and // automatically updated by "npm version" command. - /** * A string containing the version of the GraphQL.js library */ -const version = '16.8.1'; +const version = exports.version = '17.0.0-alpha.7'; /** * An object containing the components of the GraphQL.js version string */ -exports.version = version; -const versionInfo = Object.freeze({ - major: 16, - minor: 8, - patch: 1, - preReleaseTag: null +const versionInfo = exports.versionInfo = Object.freeze({ + major: 17, + minor: 0, + patch: 0, + preReleaseTag: 'alpha.7' }); -exports.versionInfo = versionInfo; /***/ }), @@ -41005,31895 +42098,37997 @@ module.exports = function isObject(val) { /***/ }), -/***/ "../../../node_modules/meros/browser/index.mjs": -/*!*****************************************************!*\ - !*** ../../../node_modules/meros/browser/index.mjs ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports) { +/***/ "../../../node_modules/linkify-it/build/index.cjs.js": +/*!***********************************************************!*\ + !*** ../../../node_modules/linkify-it/build/index.cjs.js ***! + \***********************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.meros = meros; -const separator = '\r\n\r\n'; -const decoder = new TextDecoder(); -async function* generate(stream, boundary, options) { - const reader = stream.getReader(), - is_eager = !options || !options.multiple; - let buffer = '', - is_preamble = true, - payloads = []; - try { - let result; - outer: while (!(result = await reader.read()).done) { - const chunk = decoder.decode(result.value); - const idx_chunk = chunk.indexOf(boundary); - let idx_boundary = buffer.length; - buffer += chunk; - if (!!~idx_chunk) { - // chunk itself had `boundary` marker - idx_boundary += idx_chunk; - } else { - // search combined (boundary can be across chunks) - idx_boundary = buffer.indexOf(boundary); - } - payloads = []; - while (!!~idx_boundary) { - const current = buffer.substring(0, idx_boundary); - const next = buffer.substring(idx_boundary + boundary.length); - if (is_preamble) { - is_preamble = false; - } else { - const headers = {}; - const idx_headers = current.indexOf(separator); - const arr_headers = buffer.slice(0, idx_headers).toString().trim().split(/\r\n/); - // parse headers - let tmp; - while (tmp = arr_headers.shift()) { - tmp = tmp.split(': '); - headers[tmp.shift().toLowerCase()] = tmp.join(': '); - } - let body = current.substring(idx_headers + separator.length, current.lastIndexOf('\r\n')); - let is_json = false; - tmp = headers['content-type']; - if (tmp && !!~tmp.indexOf('application/json')) { - try { - body = JSON.parse(body); - is_json = true; - } catch (_) {} - } - tmp = { - headers, - body, - json: is_json - }; - is_eager ? yield tmp : payloads.push(tmp); - // hit a tail boundary, break - if (next.substring(0, 2) === '--') break outer; - } - buffer = next; - idx_boundary = buffer.indexOf(boundary); - } - if (payloads.length) yield payloads; - } - } finally { - if (payloads.length) yield payloads; - reader.releaseLock(); - } -} +var uc_micro = __webpack_require__(/*! uc.micro */ "../../../node_modules/uc.micro/build/index.cjs.js"); +function reFactory(opts) { + const re = {}; + opts = opts || {}; + re.src_Any = uc_micro.Any.source; + re.src_Cc = uc_micro.Cc.source; + re.src_Z = uc_micro.Z.source; + re.src_P = uc_micro.P.source; -/** - * Yield immediately for every part made available on the response. If the `content-type` of the response isn't a - * multipart body, then we'll resolve with {@link Response}. - * - * @example - * - * ```js - * const parts = await fetch('/fetch-multipart') - * .then(meros); - * - * for await (const part of parts) { - * // do something with this part - * } - * ``` - */ -async function meros(response, options) { - if (!response.ok || !response.body || response.bodyUsed) return response; - const ctype = response.headers.get('content-type'); - if (!ctype || !~ctype.indexOf('multipart/mixed')) return response; - const idx_boundary = ctype.indexOf('boundary='); - return generate(response.body, `--${!!~idx_boundary ? - // +9 for 'boundary='.length - ctype.substring(idx_boundary + 9).trim().replace(/['"]/g, '') : '-'}`, options); -} + // \p{\Z\P\Cc\CF} (white spaces + control + format + punctuation) + re.src_ZPCc = [re.src_Z, re.src_P, re.src_Cc].join('|'); -/***/ }), + // \p{\Z\Cc} (white spaces + control) + re.src_ZCc = [re.src_Z, re.src_Cc].join('|'); -/***/ "../../../node_modules/nullthrows/nullthrows.js": -/*!******************************************************!*\ - !*** ../../../node_modules/nullthrows/nullthrows.js ***! - \******************************************************/ -/***/ (function(module) { + // Experimental. List of chars, completely prohibited in links + // because can separate it from other part of text + const text_separators = '[><\uff5c]'; + // All possible word characters (everything without punctuation, spaces & controls) + // Defined via punctuation & spaces to save space + // Should be something like \p{\L\N\S\M} (\w but without `_`) + re.src_pseudo_letter = '(?:(?!' + text_separators + '|' + re.src_ZPCc + ')' + re.src_Any + ')'; + // The same as abothe but without [0-9] + // var src_pseudo_letter_non_d = '(?:(?![0-9]|' + src_ZPCc + ')' + src_Any + ')'; + re.src_ip4 = '(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'; -function nullthrows(x, message) { - if (x != null) { - return x; - } - var error = new Error(message !== undefined ? message : 'Got unexpected ' + x); - error.framesToPop = 1; // Skip nullthrows's own stack frame. - throw error; -} -module.exports = nullthrows; -module.exports["default"] = nullthrows; -Object.defineProperty(module.exports, "__esModule", ({ - value: true -})); + // Prohibit any of "@/[]()" in user/pass to avoid wrong domain fetch. + re.src_auth = '(?:(?:(?!' + re.src_ZCc + '|[@/\\[\\]()]).)+@)?'; + re.src_port = '(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?'; + re.src_host_terminator = '(?=$|' + text_separators + '|' + re.src_ZPCc + ')' + '(?!' + (opts['---'] ? '-(?!--)|' : '-|') + '_|:\\d|\\.-|\\.(?!$|' + re.src_ZPCc + '))'; + re.src_path = '(?:' + '[/?#]' + '(?:' + '(?!' + re.src_ZCc + '|' + text_separators + '|[()[\\]{}.,"\'?!\\-;]).|' + '\\[(?:(?!' + re.src_ZCc + '|\\]).)*\\]|' + '\\((?:(?!' + re.src_ZCc + '|[)]).)*\\)|' + '\\{(?:(?!' + re.src_ZCc + '|[}]).)*\\}|' + '\\"(?:(?!' + re.src_ZCc + '|["]).)+\\"|' + "\\'(?:(?!" + re.src_ZCc + "|[']).)+\\'|" + + // allow `I'm_king` if no pair found + "\\'(?=" + re.src_pseudo_letter + '|[-])|' + + // google has many dots in "google search" links (#66, #81). + // github has ... in commit range links, + // Restrict to + // - english + // - percent-encoded + // - parts of file path + // - params separator + // until more examples found. + '\\.{2,}[a-zA-Z0-9%/&]|' + '\\.(?!' + re.src_ZCc + '|[.]|$)|' + (opts['---'] ? '\\-(?!--(?:[^-]|$))(?:-*)|' // `---` => long dash, terminate + : '\\-+|') + + // allow `,,,` in paths + ',(?!' + re.src_ZCc + '|$)|' + + // allow `;` if not followed by space-like char + ';(?!' + re.src_ZCc + '|$)|' + + // allow `!!!` in paths, but not at the end + '\\!+(?!' + re.src_ZCc + '|[!]|$)|' + '\\?(?!' + re.src_ZCc + '|[?]|$)' + ')+' + '|\\/' + ')?'; -/***/ }), + // Allow anything in markdown spec, forbid quote (") at the first position + // because emails enclosed in quotes are far more common + re.src_email_name = '[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*'; + re.src_xn = 'xn--[a-z0-9\\-]{1,59}'; -/***/ "../../../node_modules/popmotion/dist/popmotion.cjs.js": -/*!*************************************************************!*\ - !*** ../../../node_modules/popmotion/dist/popmotion.cjs.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + // More to read about domain names + // http://serverfault.com/questions/638260/ + re.src_domain_root = + // Allow letters & digits (http://test1) + '(?:' + re.src_xn + '|' + re.src_pseudo_letter + '{1,63}' + ')'; + re.src_domain = '(?:' + re.src_xn + '|' + '(?:' + re.src_pseudo_letter + ')' + '|' + '(?:' + re.src_pseudo_letter + '(?:-|' + re.src_pseudo_letter + '){0,61}' + re.src_pseudo_letter + ')' + ')'; + re.src_host = '(?:' + + // Don't need IP check, because digits are already allowed in normal domain names + // src_ip4 + + // '|' + + '(?:(?:(?:' + re.src_domain + ')\\.)*' + re.src_domain /* _root */ + ')' + ')'; + re.tpl_host_fuzzy = '(?:' + re.src_ip4 + '|' + '(?:(?:(?:' + re.src_domain + ')\\.)+(?:%TLDS%))' + ')'; + re.tpl_host_no_ip_fuzzy = '(?:(?:(?:' + re.src_domain + ')\\.)+(?:%TLDS%))'; + re.src_host_strict = re.src_host + re.src_host_terminator; + re.tpl_host_fuzzy_strict = re.tpl_host_fuzzy + re.src_host_terminator; + re.src_host_port_strict = re.src_host + re.src_port + re.src_host_terminator; + re.tpl_host_port_fuzzy_strict = re.tpl_host_fuzzy + re.src_port + re.src_host_terminator; + re.tpl_host_port_no_ip_fuzzy_strict = re.tpl_host_no_ip_fuzzy + re.src_port + re.src_host_terminator; + // + // Main rules + // -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); -var heyListen = __webpack_require__(/*! hey-listen */ "../../../node_modules/hey-listen/dist/hey-listen.es.js"); -var styleValueTypes = __webpack_require__(/*! style-value-types */ "../../../node_modules/style-value-types/dist/valueTypes.cjs.js"); -var sync = __webpack_require__(/*! framesync */ "../../../node_modules/framesync/dist/framesync.cjs.js"); -function _interopDefaultLegacy(e) { - return e && typeof e === 'object' && 'default' in e ? e : { - 'default': e - }; + // Rude test fuzzy links by host, for quick deny + re.tpl_host_fuzzy_test = 'localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:' + re.src_ZPCc + '|>|$))'; + re.tpl_email_fuzzy = '(^|' + text_separators + '|"|\\(|' + re.src_ZCc + ')' + '(' + re.src_email_name + '@' + re.tpl_host_fuzzy_strict + ')'; + re.tpl_link_fuzzy = + // Fuzzy link can't be prepended with .:/\- and non punctuation. + // but can start with > (markdown blockquote) + '(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|' + re.src_ZPCc + '))' + '((?![$+<=>^`|\uff5c])' + re.tpl_host_port_fuzzy_strict + re.src_path + ')'; + re.tpl_link_no_ip_fuzzy = + // Fuzzy link can't be prepended with .:/\- and non punctuation. + // but can start with > (markdown blockquote) + '(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|' + re.src_ZPCc + '))' + '((?![$+<=>^`|\uff5c])' + re.tpl_host_port_no_ip_fuzzy_strict + re.src_path + ')'; + return re; } -var sync__default = /*#__PURE__*/_interopDefaultLegacy(sync); -const clamp = (min, max, v) => Math.min(Math.max(v, min), max); -const safeMin = 0.001; -const minDuration = 0.01; -const maxDuration = 10.0; -const minDamping = 0.05; -const maxDamping = 1; -function findSpring(_ref) { - let { - duration = 800, - bounce = 0.25, - velocity = 0, - mass = 1 - } = _ref; - let envelope; - let derivative; - heyListen.warning(duration <= maxDuration * 1000, "Spring duration must be 10 seconds or less"); - let dampingRatio = 1 - bounce; - dampingRatio = clamp(minDamping, maxDamping, dampingRatio); - duration = clamp(minDuration, maxDuration, duration / 1000); - if (dampingRatio < 1) { - envelope = undampedFreq => { - const exponentialDecay = undampedFreq * dampingRatio; - const delta = exponentialDecay * duration; - const a = exponentialDecay - velocity; - const b = calcAngularFreq(undampedFreq, dampingRatio); - const c = Math.exp(-delta); - return safeMin - a / b * c; - }; - derivative = undampedFreq => { - const exponentialDecay = undampedFreq * dampingRatio; - const delta = exponentialDecay * duration; - const d = delta * velocity + velocity; - const e = Math.pow(dampingRatio, 2) * Math.pow(undampedFreq, 2) * duration; - const f = Math.exp(-delta); - const g = calcAngularFreq(Math.pow(undampedFreq, 2), dampingRatio); - const factor = -envelope(undampedFreq) + safeMin > 0 ? -1 : 1; - return factor * ((d - e) * f) / g; - }; - } else { - envelope = undampedFreq => { - const a = Math.exp(-undampedFreq * duration); - const b = (undampedFreq - velocity) * duration + 1; - return -safeMin + a * b; - }; - derivative = undampedFreq => { - const a = Math.exp(-undampedFreq * duration); - const b = (velocity - undampedFreq) * (duration * duration); - return a * b; - }; - } - const initialGuess = 5 / duration; - const undampedFreq = approximateRoot(envelope, derivative, initialGuess); - duration = duration * 1000; - if (isNaN(undampedFreq)) { - return { - stiffness: 100, - damping: 10, - duration - }; - } else { - const stiffness = Math.pow(undampedFreq, 2) * mass; - return { - stiffness, - damping: dampingRatio * 2 * Math.sqrt(mass * stiffness), - duration - }; - } + +// +// Helpers +// + +// Merge objects +// +function assign(obj /* from1, from2, from3, ... */) { + const sources = Array.prototype.slice.call(arguments, 1); + sources.forEach(function (source) { + if (!source) { + return; + } + Object.keys(source).forEach(function (key) { + obj[key] = source[key]; + }); + }); + return obj; } -const rootIterations = 12; -function approximateRoot(envelope, derivative, initialGuess) { - let result = initialGuess; - for (let i = 1; i < rootIterations; i++) { - result = result - envelope(result) / derivative(result); - } - return result; +function _class(obj) { + return Object.prototype.toString.call(obj); } -function calcAngularFreq(undampedFreq, dampingRatio) { - return undampedFreq * Math.sqrt(1 - dampingRatio * dampingRatio); +function isString(obj) { + return _class(obj) === '[object String]'; } -const durationKeys = ["duration", "bounce"]; -const physicsKeys = ["stiffness", "damping", "mass"]; -function isSpringType(options, keys) { - return keys.some(key => options[key] !== undefined); +function isObject(obj) { + return _class(obj) === '[object Object]'; } -function getSpringOptions(options) { - let springOptions = Object.assign({ - velocity: 0.0, - stiffness: 100, - damping: 10, - mass: 1.0, - isResolvedFromDuration: false - }, options); - if (!isSpringType(options, physicsKeys) && isSpringType(options, durationKeys)) { - const derived = findSpring(options); - springOptions = Object.assign(Object.assign(Object.assign({}, springOptions), derived), { - velocity: 0.0, - mass: 1.0 - }); - springOptions.isResolvedFromDuration = true; - } - return springOptions; +function isRegExp(obj) { + return _class(obj) === '[object RegExp]'; } -function spring(_a) { - var { - from = 0.0, - to = 1.0, - restSpeed = 2, - restDelta - } = _a, - options = tslib.__rest(_a, ["from", "to", "restSpeed", "restDelta"]); - const state = { - done: false, - value: from - }; - let { - stiffness, - damping, - mass, - velocity, - duration, - isResolvedFromDuration - } = getSpringOptions(options); - let resolveSpring = zero; - let resolveVelocity = zero; - function createSpring() { - const initialVelocity = velocity ? -(velocity / 1000) : 0.0; - const initialDelta = to - from; - const dampingRatio = damping / (2 * Math.sqrt(stiffness * mass)); - const undampedAngularFreq = Math.sqrt(stiffness / mass) / 1000; - if (restDelta === undefined) { - restDelta = Math.min(Math.abs(to - from) / 100, 0.4); - } - if (dampingRatio < 1) { - const angularFreq = calcAngularFreq(undampedAngularFreq, dampingRatio); - resolveSpring = t => { - const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t); - return to - envelope * ((initialVelocity + dampingRatio * undampedAngularFreq * initialDelta) / angularFreq * Math.sin(angularFreq * t) + initialDelta * Math.cos(angularFreq * t)); - }; - resolveVelocity = t => { - const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t); - return dampingRatio * undampedAngularFreq * envelope * (Math.sin(angularFreq * t) * (initialVelocity + dampingRatio * undampedAngularFreq * initialDelta) / angularFreq + initialDelta * Math.cos(angularFreq * t)) - envelope * (Math.cos(angularFreq * t) * (initialVelocity + dampingRatio * undampedAngularFreq * initialDelta) - angularFreq * initialDelta * Math.sin(angularFreq * t)); - }; - } else if (dampingRatio === 1) { - resolveSpring = t => to - Math.exp(-undampedAngularFreq * t) * (initialDelta + (initialVelocity + undampedAngularFreq * initialDelta) * t); - } else { - const dampedAngularFreq = undampedAngularFreq * Math.sqrt(dampingRatio * dampingRatio - 1); - resolveSpring = t => { - const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t); - const freqForT = Math.min(dampedAngularFreq * t, 300); - return to - envelope * ((initialVelocity + dampingRatio * undampedAngularFreq * initialDelta) * Math.sinh(freqForT) + dampedAngularFreq * initialDelta * Math.cosh(freqForT)) / dampedAngularFreq; - }; - } - } - createSpring(); - return { - next: t => { - const current = resolveSpring(t); - if (!isResolvedFromDuration) { - const currentVelocity = resolveVelocity(t) * 1000; - const isBelowVelocityThreshold = Math.abs(currentVelocity) <= restSpeed; - const isBelowDisplacementThreshold = Math.abs(to - current) <= restDelta; - state.done = isBelowVelocityThreshold && isBelowDisplacementThreshold; - } else { - state.done = t >= duration; - } - state.value = state.done ? to : current; - return state; - }, - flipTarget: () => { - velocity = -velocity; - [from, to] = [to, from]; - createSpring(); - } - }; -} -spring.needsInterpolation = (a, b) => typeof a === "string" || typeof b === "string"; -const zero = _t => 0; -const progress = (from, to, value) => { - const toFromDifference = to - from; - return toFromDifference === 0 ? 1 : (value - from) / toFromDifference; -}; -const mix = (from, to, progress) => -progress * from + progress * to + from; -function hueToRgb(p, q, t) { - if (t < 0) t += 1; - if (t > 1) t -= 1; - if (t < 1 / 6) return p + (q - p) * 6 * t; - if (t < 1 / 2) return q; - if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; - return p; +function isFunction(obj) { + return _class(obj) === '[object Function]'; } -function hslaToRgba(_ref2) { - let { - hue, - saturation, - lightness, - alpha - } = _ref2; - hue /= 360; - saturation /= 100; - lightness /= 100; - let red = 0; - let green = 0; - let blue = 0; - if (!saturation) { - red = green = blue = lightness; - } else { - const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation; - const p = 2 * lightness - q; - red = hueToRgb(p, q, hue + 1 / 3); - green = hueToRgb(p, q, hue); - blue = hueToRgb(p, q, hue - 1 / 3); - } - return { - red: Math.round(red * 255), - green: Math.round(green * 255), - blue: Math.round(blue * 255), - alpha - }; +function escapeRE(str) { + return str.replace(/[.?*+^$[\]\\(){}|-]/g, '\\$&'); } -const mixLinearColor = (from, to, v) => { - const fromExpo = from * from; - const toExpo = to * to; - return Math.sqrt(Math.max(0, v * (toExpo - fromExpo) + fromExpo)); + +// + +const defaultOptions = { + fuzzyLink: true, + fuzzyEmail: true, + fuzzyIP: false }; -const colorTypes = [styleValueTypes.hex, styleValueTypes.rgba, styleValueTypes.hsla]; -const getColorType = v => colorTypes.find(type => type.test(v)); -const notAnimatable = color => `'${color}' is not an animatable color. Use the equivalent color code instead.`; -const mixColor = (from, to) => { - let fromColorType = getColorType(from); - let toColorType = getColorType(to); - heyListen.invariant(!!fromColorType, notAnimatable(from)); - heyListen.invariant(!!toColorType, notAnimatable(to)); - let fromColor = fromColorType.parse(from); - let toColor = toColorType.parse(to); - if (fromColorType === styleValueTypes.hsla) { - fromColor = hslaToRgba(fromColor); - fromColorType = styleValueTypes.rgba; - } - if (toColorType === styleValueTypes.hsla) { - toColor = hslaToRgba(toColor); - toColorType = styleValueTypes.rgba; - } - const blended = Object.assign({}, fromColor); - return v => { - for (const key in blended) { - if (key !== "alpha") { - blended[key] = mixLinearColor(fromColor[key], toColor[key], v); +function isOptionsObj(obj) { + return Object.keys(obj || {}).reduce(function (acc, k) { + /* eslint-disable-next-line no-prototype-builtins */ + return acc || defaultOptions.hasOwnProperty(k); + }, false); +} +const defaultSchemas = { + 'http:': { + validate: function (text, pos, self) { + const tail = text.slice(pos); + if (!self.re.http) { + // compile lazily, because "host"-containing variables can change on tlds update. + self.re.http = new RegExp('^\\/\\/' + self.re.src_auth + self.re.src_host_port_strict + self.re.src_path, 'i'); } + if (self.re.http.test(tail)) { + return tail.match(self.re.http)[0].length; + } + return 0; } - blended.alpha = mix(fromColor.alpha, toColor.alpha, v); - return fromColorType.transform(blended); - }; -}; -const zeroPoint = { - x: 0, - y: 0, - z: 0 -}; -const isNum = v => typeof v === 'number'; -const combineFunctions = (a, b) => v => b(a(v)); -const pipe = function () { - for (var _len = arguments.length, transformers = new Array(_len), _key = 0; _key < _len; _key++) { - transformers[_key] = arguments[_key]; - } - return transformers.reduce(combineFunctions); -}; -function getMixer(origin, target) { - if (isNum(origin)) { - return v => mix(origin, target, v); - } else if (styleValueTypes.color.test(origin)) { - return mixColor(origin, target); - } else { - return mixComplex(origin, target); - } -} -const mixArray = (from, to) => { - const output = [...from]; - const numValues = output.length; - const blendValue = from.map((fromThis, i) => getMixer(fromThis, to[i])); - return v => { - for (let i = 0; i < numValues; i++) { - output[i] = blendValue[i](v); + }, + 'https:': 'http:', + 'ftp:': 'http:', + '//': { + validate: function (text, pos, self) { + const tail = text.slice(pos); + if (!self.re.no_http) { + // compile lazily, because "host"-containing variables can change on tlds update. + self.re.no_http = new RegExp('^' + self.re.src_auth + + // Don't allow single-level domains, because of false positives like '//test' + // with code comments + '(?:localhost|(?:(?:' + self.re.src_domain + ')\\.)+' + self.re.src_domain_root + ')' + self.re.src_port + self.re.src_host_terminator + self.re.src_path, 'i'); + } + if (self.re.no_http.test(tail)) { + // should not be `://` & `///`, that protects from errors in protocol name + if (pos >= 3 && text[pos - 3] === ':') { + return 0; + } + if (pos >= 3 && text[pos - 3] === '/') { + return 0; + } + return tail.match(self.re.no_http)[0].length; + } + return 0; } - return output; - }; -}; -const mixObject = (origin, target) => { - const output = Object.assign(Object.assign({}, origin), target); - const blendValue = {}; - for (const key in output) { - if (origin[key] !== undefined && target[key] !== undefined) { - blendValue[key] = getMixer(origin[key], target[key]); + }, + 'mailto:': { + validate: function (text, pos, self) { + const tail = text.slice(pos); + if (!self.re.mailto) { + self.re.mailto = new RegExp('^' + self.re.src_email_name + '@' + self.re.src_host_strict, 'i'); + } + if (self.re.mailto.test(tail)) { + return tail.match(self.re.mailto)[0].length; + } + return 0; } } - return v => { - for (const key in blendValue) { - output[key] = blendValue[key](v); - } - return output; - }; }; -function analyse(value) { - const parsed = styleValueTypes.complex.parse(value); - const numValues = parsed.length; - let numNumbers = 0; - let numRGB = 0; - let numHSL = 0; - for (let i = 0; i < numValues; i++) { - if (numNumbers || typeof parsed[i] === "number") { - numNumbers++; - } else { - if (parsed[i].hue !== undefined) { - numHSL++; - } else { - numRGB++; - } + +// RE pattern for 2-character tlds (autogenerated by ./support/tlds_2char_gen.js) +/* eslint-disable-next-line max-len */ +const tlds_2ch_src_re = 'a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]'; + +// DON'T try to make PRs with changes. Extend TLDs with LinkifyIt.tlds() instead +const tlds_default = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|'); +function resetScanCache(self) { + self.__index__ = -1; + self.__text_cache__ = ''; +} +function createValidator(re) { + return function (text, pos) { + const tail = text.slice(pos); + if (re.test(tail)) { + return tail.match(re)[0].length; } - } - return { - parsed, - numNumbers, - numRGB, - numHSL + return 0; }; } -const mixComplex = (origin, target) => { - const template = styleValueTypes.complex.createTransformer(target); - const originStats = analyse(origin); - const targetStats = analyse(target); - const canInterpolate = originStats.numHSL === targetStats.numHSL && originStats.numRGB === targetStats.numRGB && originStats.numNumbers >= targetStats.numNumbers; - if (canInterpolate) { - return pipe(mixArray(originStats.parsed, targetStats.parsed), template); - } else { - heyListen.warning(true, `Complex values '${origin}' and '${target}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`); - return p => `${p > 0 ? target : origin}`; +function createNormalizer() { + return function (match, self) { + self.normalize(match); + }; +} + +// Schemas compiler. Build regexps. +// +function compile(self) { + // Load & clone RE patterns. + const re = self.re = reFactory(self.__opts__); + + // Define dynamic patterns + const tlds = self.__tlds__.slice(); + self.onCompile(); + if (!self.__tlds_replaced__) { + tlds.push(tlds_2ch_src_re); } -}; -const mixNumber = (from, to) => p => mix(from, to, p); -function detectMixerFactory(v) { - if (typeof v === 'number') { - return mixNumber; - } else if (typeof v === 'string') { - if (styleValueTypes.color.test(v)) { - return mixColor; - } else { - return mixComplex; - } - } else if (Array.isArray(v)) { - return mixArray; - } else if (typeof v === 'object') { - return mixObject; + tlds.push(re.src_xn); + re.src_tlds = tlds.join('|'); + function untpl(tpl) { + return tpl.replace('%TLDS%', re.src_tlds); } -} -function createMixers(output, ease, customMixer) { - const mixers = []; - const mixerFactory = customMixer || detectMixerFactory(output[0]); - const numMixers = output.length - 1; - for (let i = 0; i < numMixers; i++) { - let mixer = mixerFactory(output[i], output[i + 1]); - if (ease) { - const easingFunction = Array.isArray(ease) ? ease[i] : ease; - mixer = pipe(easingFunction, mixer); - } - mixers.push(mixer); + re.email_fuzzy = RegExp(untpl(re.tpl_email_fuzzy), 'i'); + re.link_fuzzy = RegExp(untpl(re.tpl_link_fuzzy), 'i'); + re.link_no_ip_fuzzy = RegExp(untpl(re.tpl_link_no_ip_fuzzy), 'i'); + re.host_fuzzy_test = RegExp(untpl(re.tpl_host_fuzzy_test), 'i'); + + // + // Compile each schema + // + + const aliases = []; + self.__compiled__ = {}; // Reset compiled data + + function schemaError(name, val) { + throw new Error('(LinkifyIt) Invalid schema "' + name + '": ' + val); } - return mixers; -} -function fastInterpolate(_ref3, _ref4) { - let [from, to] = _ref3; - let [mixer] = _ref4; - return v => mixer(progress(from, to, v)); -} -function slowInterpolate(input, mixers) { - const inputLength = input.length; - const lastInputIndex = inputLength - 1; - return v => { - let mixerIndex = 0; - let foundMixerIndex = false; - if (v <= input[0]) { - foundMixerIndex = true; - } else if (v >= input[lastInputIndex]) { - mixerIndex = lastInputIndex - 1; - foundMixerIndex = true; + Object.keys(self.__schemas__).forEach(function (name) { + const val = self.__schemas__[name]; + + // skip disabled methods + if (val === null) { + return; } - if (!foundMixerIndex) { - let i = 1; - for (; i < inputLength; i++) { - if (input[i] > v || i === lastInputIndex) { - break; - } + const compiled = { + validate: null, + link: null + }; + self.__compiled__[name] = compiled; + if (isObject(val)) { + if (isRegExp(val.validate)) { + compiled.validate = createValidator(val.validate); + } else if (isFunction(val.validate)) { + compiled.validate = val.validate; + } else { + schemaError(name, val); } - mixerIndex = i - 1; + if (isFunction(val.normalize)) { + compiled.normalize = val.normalize; + } else if (!val.normalize) { + compiled.normalize = createNormalizer(); + } else { + schemaError(name, val); + } + return; } - const progressInRange = progress(input[mixerIndex], input[mixerIndex + 1], v); - return mixers[mixerIndex](progressInRange); - }; -} -function interpolate(input, output) { - let { - clamp: isClamp = true, - ease, - mixer - } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - const inputLength = input.length; - heyListen.invariant(inputLength === output.length, 'Both input and output ranges must be the same length'); - heyListen.invariant(!ease || !Array.isArray(ease) || ease.length === inputLength - 1, 'Array of easing functions must be of length `input.length - 1`, as it applies to the transitions **between** the defined values.'); - if (input[0] > input[inputLength - 1]) { - input = [].concat(input); - output = [].concat(output); - input.reverse(); - output.reverse(); - } - const mixers = createMixers(output, ease, mixer); - const interpolator = inputLength === 2 ? fastInterpolate(input, mixers) : slowInterpolate(input, mixers); - return isClamp ? v => interpolator(clamp(input[0], input[inputLength - 1], v)) : interpolator; -} -const reverseEasing = easing => p => 1 - easing(1 - p); -const mirrorEasing = easing => p => p <= 0.5 ? easing(2 * p) / 2 : (2 - easing(2 * (1 - p))) / 2; -const createExpoIn = power => p => Math.pow(p, power); -const createBackIn = power => p => p * p * ((power + 1) * p - power); -const createAnticipate = power => { - const backEasing = createBackIn(power); - return p => (p *= 2) < 1 ? 0.5 * backEasing(p) : 0.5 * (2 - Math.pow(2, -10 * (p - 1))); -}; -const DEFAULT_OVERSHOOT_STRENGTH = 1.525; -const BOUNCE_FIRST_THRESHOLD = 4.0 / 11.0; -const BOUNCE_SECOND_THRESHOLD = 8.0 / 11.0; -const BOUNCE_THIRD_THRESHOLD = 9.0 / 10.0; -const linear = p => p; -const easeIn = createExpoIn(2); -const easeOut = reverseEasing(easeIn); -const easeInOut = mirrorEasing(easeIn); -const circIn = p => 1 - Math.sin(Math.acos(p)); -const circOut = reverseEasing(circIn); -const circInOut = mirrorEasing(circOut); -const backIn = createBackIn(DEFAULT_OVERSHOOT_STRENGTH); -const backOut = reverseEasing(backIn); -const backInOut = mirrorEasing(backIn); -const anticipate = createAnticipate(DEFAULT_OVERSHOOT_STRENGTH); -const ca = 4356.0 / 361.0; -const cb = 35442.0 / 1805.0; -const cc = 16061.0 / 1805.0; -const bounceOut = p => { - if (p === 1 || p === 0) return p; - const p2 = p * p; - return p < BOUNCE_FIRST_THRESHOLD ? 7.5625 * p2 : p < BOUNCE_SECOND_THRESHOLD ? 9.075 * p2 - 9.9 * p + 3.4 : p < BOUNCE_THIRD_THRESHOLD ? ca * p2 - cb * p + cc : 10.8 * p * p - 20.52 * p + 10.72; -}; -const bounceIn = reverseEasing(bounceOut); -const bounceInOut = p => p < 0.5 ? 0.5 * (1.0 - bounceOut(1.0 - p * 2.0)) : 0.5 * bounceOut(p * 2.0 - 1.0) + 0.5; -function defaultEasing(values, easing) { - return values.map(() => easing || easeInOut).splice(0, values.length - 1); -} -function defaultOffset(values) { - const numValues = values.length; - return values.map((_value, i) => i !== 0 ? i / (numValues - 1) : 0); -} -function convertOffsetToTimes(offset, duration) { - return offset.map(o => o * duration); -} -function keyframes(_ref5) { - let { - from = 0, - to = 1, - ease, - offset, - duration = 300 - } = _ref5; - const state = { - done: false, - value: from - }; - const values = Array.isArray(to) ? to : [from, to]; - const times = convertOffsetToTimes(offset && offset.length === values.length ? offset : defaultOffset(values), duration); - function createInterpolator() { - return interpolate(times, values, { - ease: Array.isArray(ease) ? ease : defaultEasing(values, ease) - }); - } - let interpolator = createInterpolator(); - return { - next: t => { - state.value = interpolator(t); - state.done = t >= duration; - return state; - }, - flipTarget: () => { - values.reverse(); - interpolator = createInterpolator(); + if (isString(val)) { + aliases.push(name); + return; + } + schemaError(name, val); + }); + + // + // Compile postponed aliases + // + + aliases.forEach(function (alias) { + if (!self.__compiled__[self.__schemas__[alias]]) { + // Silently fail on missed schemas to avoid errons on disable. + // schemaError(alias, self.__schemas__[alias]); + return; } + self.__compiled__[alias].validate = self.__compiled__[self.__schemas__[alias]].validate; + self.__compiled__[alias].normalize = self.__compiled__[self.__schemas__[alias]].normalize; + }); + + // + // Fake record for guessed links + // + self.__compiled__[''] = { + validate: null, + normalize: createNormalizer() }; + + // + // Build schema condition + // + const slist = Object.keys(self.__compiled__).filter(function (name) { + // Filter disabled & fake schemas + return name.length > 0 && self.__compiled__[name]; + }).map(escapeRE).join('|'); + // (?!_) cause 1.5x slowdown + self.re.schema_test = RegExp('(^|(?!_)(?:[><\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'i'); + self.re.schema_search = RegExp('(^|(?!_)(?:[><\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'ig'); + self.re.schema_at_start = RegExp('^' + self.re.schema_search.source, 'i'); + self.re.pretest = RegExp('(' + self.re.schema_test.source + ')|(' + self.re.host_fuzzy_test.source + ')|@', 'i'); + + // + // Cleanup + // + + resetScanCache(self); } -function decay(_ref6) { - let { - velocity = 0, - from = 0, - power = 0.8, - timeConstant = 350, - restDelta = 0.5, - modifyTarget - } = _ref6; - const state = { - done: false, - value: from - }; - let amplitude = power * velocity; - const ideal = from + amplitude; - const target = modifyTarget === undefined ? ideal : modifyTarget(ideal); - if (target !== ideal) amplitude = target - from; - return { - next: t => { - const delta = -amplitude * Math.exp(-t / timeConstant); - state.done = !(delta > restDelta || delta < -restDelta); - state.value = state.done ? target : target + delta; - return state; - }, - flipTarget: () => {} - }; + +/** + * class Match + * + * Match result. Single element of array, returned by [[LinkifyIt#match]] + **/ +function Match(self, shift) { + const start = self.__index__; + const end = self.__last_index__; + const text = self.__text_cache__.slice(start, end); + + /** + * Match#schema -> String + * + * Prefix (protocol) for matched string. + **/ + this.schema = self.__schema__.toLowerCase(); + /** + * Match#index -> Number + * + * First position of matched string. + **/ + this.index = start + shift; + /** + * Match#lastIndex -> Number + * + * Next position after matched string. + **/ + this.lastIndex = end + shift; + /** + * Match#raw -> String + * + * Matched string. + **/ + this.raw = text; + /** + * Match#text -> String + * + * Notmalized text of matched string. + **/ + this.text = text; + /** + * Match#url -> String + * + * Normalized url of matched string. + **/ + this.url = text; } -const types = { - keyframes, - spring, - decay -}; -function detectAnimationFromOptions(config) { - if (Array.isArray(config.to)) { - return keyframes; - } else if (types[config.type]) { - return types[config.type]; +function createMatch(self, shift) { + const match = new Match(self, shift); + self.__compiled__[match.schema].normalize(match, self); + return match; +} + +/** + * class LinkifyIt + **/ + +/** + * new LinkifyIt(schemas, options) + * - schemas (Object): Optional. Additional schemas to validate (prefix/validator) + * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false } + * + * Creates new linkifier instance with optional additional schemas. + * Can be called without `new` keyword for convenience. + * + * By default understands: + * + * - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links + * - "fuzzy" links and emails (example.com, foo@bar.com). + * + * `schemas` is an object, where each key/value describes protocol/rule: + * + * - __key__ - link prefix (usually, protocol name with `:` at the end, `skype:` + * for example). `linkify-it` makes shure that prefix is not preceeded with + * alphanumeric char and symbols. Only whitespaces and punctuation allowed. + * - __value__ - rule to check tail after link prefix + * - _String_ - just alias to existing rule + * - _Object_ + * - _validate_ - validator function (should return matched length on success), + * or `RegExp`. + * - _normalize_ - optional function to normalize text & url of matched result + * (for example, for @twitter mentions). + * + * `options`: + * + * - __fuzzyLink__ - recognige URL-s without `http(s):` prefix. Default `true`. + * - __fuzzyIP__ - allow IPs in fuzzy links above. Can conflict with some texts + * like version numbers. Default `false`. + * - __fuzzyEmail__ - recognize emails without `mailto:` prefix. + * + **/ +function LinkifyIt(schemas, options) { + if (!(this instanceof LinkifyIt)) { + return new LinkifyIt(schemas, options); } - const keys = new Set(Object.keys(config)); - if (keys.has("ease") || keys.has("duration") && !keys.has("dampingRatio")) { - return keyframes; - } else if (keys.has("dampingRatio") || keys.has("stiffness") || keys.has("mass") || keys.has("damping") || keys.has("restSpeed") || keys.has("restDelta")) { - return spring; + if (!options) { + if (isOptionsObj(schemas)) { + options = schemas; + schemas = {}; + } } - return keyframes; -} -function loopElapsed(elapsed, duration) { - let delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; - return elapsed - duration - delay; -} -function reverseElapsed(elapsed, duration) { - let delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; - let isForwardPlayback = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; - return isForwardPlayback ? loopElapsed(duration + -elapsed, duration, delay) : duration - (elapsed - duration) + delay; -} -function hasRepeatDelayElapsed(elapsed, duration, delay, isForwardPlayback) { - return isForwardPlayback ? elapsed >= duration + delay : elapsed <= -delay; + this.__opts__ = assign({}, defaultOptions, options); + + // Cache last tested result. Used to skip repeating steps on next `match` call. + this.__index__ = -1; + this.__last_index__ = -1; // Next scan position + this.__schema__ = ''; + this.__text_cache__ = ''; + this.__schemas__ = assign({}, defaultSchemas, schemas); + this.__compiled__ = {}; + this.__tlds__ = tlds_default; + this.__tlds_replaced__ = false; + this.re = {}; + compile(this); } -const framesync = update => { - const passTimestamp = _ref7 => { - let { - delta - } = _ref7; - return update(delta); - }; - return { - start: () => sync__default["default"].update(passTimestamp, true), - stop: () => sync.cancelSync.update(passTimestamp) - }; + +/** chainable + * LinkifyIt#add(schema, definition) + * - schema (String): rule name (fixed pattern prefix) + * - definition (String|RegExp|Object): schema definition + * + * Add new rule definition. See constructor description for details. + **/ +LinkifyIt.prototype.add = function add(schema, definition) { + this.__schemas__[schema] = definition; + compile(this); + return this; }; -function animate(_a) { - var _b, _c; - var { - from, - autoplay = true, - driver = framesync, - elapsed = 0, - repeat: repeatMax = 0, - repeatType = "loop", - repeatDelay = 0, - onPlay, - onStop, - onComplete, - onRepeat, - onUpdate - } = _a, - options = tslib.__rest(_a, ["from", "autoplay", "driver", "elapsed", "repeat", "repeatType", "repeatDelay", "onPlay", "onStop", "onComplete", "onRepeat", "onUpdate"]); - let { - to - } = options; - let driverControls; - let repeatCount = 0; - let computedDuration = options.duration; - let latest; - let isComplete = false; - let isForwardPlayback = true; - let interpolateFromNumber; - const animator = detectAnimationFromOptions(options); - if ((_c = (_b = animator).needsInterpolation) === null || _c === void 0 ? void 0 : _c.call(_b, from, to)) { - interpolateFromNumber = interpolate([0, 100], [from, to], { - clamp: false - }); - from = 0; - to = 100; + +/** chainable + * LinkifyIt#set(options) + * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false } + * + * Set recognition options for links without schema. + **/ +LinkifyIt.prototype.set = function set(options) { + this.__opts__ = assign(this.__opts__, options); + return this; +}; + +/** + * LinkifyIt#test(text) -> Boolean + * + * Searches linkifiable pattern and returns `true` on success or `false` on fail. + **/ +LinkifyIt.prototype.test = function test(text) { + // Reset scan cache + this.__text_cache__ = text; + this.__index__ = -1; + if (!text.length) { + return false; } - const animation = animator(Object.assign(Object.assign({}, options), { - from, - to - })); - function repeat() { - repeatCount++; - if (repeatType === "reverse") { - isForwardPlayback = repeatCount % 2 === 0; - elapsed = reverseElapsed(elapsed, computedDuration, repeatDelay, isForwardPlayback); - } else { - elapsed = loopElapsed(elapsed, computedDuration, repeatDelay); - if (repeatType === "mirror") animation.flipTarget(); + let m, ml, me, len, shift, next, re, tld_pos, at_pos; + + // try to scan for link with schema - that's the most simple rule + if (this.re.schema_test.test(text)) { + re = this.re.schema_search; + re.lastIndex = 0; + while ((m = re.exec(text)) !== null) { + len = this.testSchemaAt(text, m[2], re.lastIndex); + if (len) { + this.__schema__ = m[2]; + this.__index__ = m.index + m[1].length; + this.__last_index__ = m.index + m[0].length + len; + break; + } } - isComplete = false; - onRepeat && onRepeat(); - } - function complete() { - driverControls.stop(); - onComplete && onComplete(); } - function update(delta) { - if (!isForwardPlayback) delta = -delta; - elapsed += delta; - if (!isComplete) { - const state = animation.next(Math.max(0, elapsed)); - latest = state.value; - if (interpolateFromNumber) latest = interpolateFromNumber(latest); - isComplete = isForwardPlayback ? state.done : elapsed <= 0; - } - onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(latest); - if (isComplete) { - if (repeatCount === 0) computedDuration !== null && computedDuration !== void 0 ? computedDuration : computedDuration = elapsed; - if (repeatCount < repeatMax) { - hasRepeatDelayElapsed(elapsed, computedDuration, repeatDelay, isForwardPlayback) && repeat(); - } else { - complete(); + if (this.__opts__.fuzzyLink && this.__compiled__['http:']) { + // guess schemaless links + tld_pos = text.search(this.re.host_fuzzy_test); + if (tld_pos >= 0) { + // if tld is located after found link - no need to check fuzzy pattern + if (this.__index__ < 0 || tld_pos < this.__index__) { + if ((ml = text.match(this.__opts__.fuzzyIP ? this.re.link_fuzzy : this.re.link_no_ip_fuzzy)) !== null) { + shift = ml.index + ml[1].length; + if (this.__index__ < 0 || shift < this.__index__) { + this.__schema__ = ''; + this.__index__ = shift; + this.__last_index__ = ml.index + ml[0].length; + } + } } } } - function play() { - onPlay === null || onPlay === void 0 ? void 0 : onPlay(); - driverControls = driver(update); - driverControls.start(); - } - autoplay && play(); - return { - stop: () => { - onStop === null || onStop === void 0 ? void 0 : onStop(); - driverControls.stop(); + if (this.__opts__.fuzzyEmail && this.__compiled__['mailto:']) { + // guess schemaless emails + at_pos = text.indexOf('@'); + if (at_pos >= 0) { + // We can't skip this check, because this cases are possible: + // 192.168.1.1@gmail.com, my.in@example.com + if ((me = text.match(this.re.email_fuzzy)) !== null) { + shift = me.index + me[1].length; + next = me.index + me[0].length; + if (this.__index__ < 0 || shift < this.__index__ || shift === this.__index__ && next > this.__last_index__) { + this.__schema__ = 'mailto:'; + this.__index__ = shift; + this.__last_index__ = next; + } + } } - }; -} -function velocityPerSecond(velocity, frameDuration) { - return frameDuration ? velocity * (1000 / frameDuration) : 0; -} -function inertia(_ref8) { - let { - from = 0, - velocity = 0, - min, - max, - power = 0.8, - timeConstant = 750, - bounceStiffness = 500, - bounceDamping = 10, - restDelta = 1, - modifyTarget, - driver, - onUpdate, - onComplete, - onStop - } = _ref8; - let currentAnimation; - function isOutOfBounds(v) { - return min !== undefined && v < min || max !== undefined && v > max; } - function boundaryNearest(v) { - if (min === undefined) return max; - if (max === undefined) return min; - return Math.abs(min - v) < Math.abs(max - v) ? min : max; + return this.__index__ >= 0; +}; + +/** + * LinkifyIt#pretest(text) -> Boolean + * + * Very quick check, that can give false positives. Returns true if link MAY BE + * can exists. Can be used for speed optimization, when you need to check that + * link NOT exists. + **/ +LinkifyIt.prototype.pretest = function pretest(text) { + return this.re.pretest.test(text); +}; + +/** + * LinkifyIt#testSchemaAt(text, name, position) -> Number + * - text (String): text to scan + * - name (String): rule (schema) name + * - position (Number): text offset to check from + * + * Similar to [[LinkifyIt#test]] but checks only specific protocol tail exactly + * at given position. Returns length of found pattern (0 on fail). + **/ +LinkifyIt.prototype.testSchemaAt = function testSchemaAt(text, schema, pos) { + // If not supported schema check requested - terminate + if (!this.__compiled__[schema.toLowerCase()]) { + return 0; } - function startAnimation(options) { - currentAnimation === null || currentAnimation === void 0 ? void 0 : currentAnimation.stop(); - currentAnimation = animate(Object.assign(Object.assign({}, options), { - driver, - onUpdate: v => { - var _a; - onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(v); - (_a = options.onUpdate) === null || _a === void 0 ? void 0 : _a.call(options, v); - }, - onComplete, - onStop - })); + return this.__compiled__[schema.toLowerCase()].validate(text, pos, this); +}; + +/** + * LinkifyIt#match(text) -> Array|null + * + * Returns array of found link descriptions or `null` on fail. We strongly + * recommend to use [[LinkifyIt#test]] first, for best speed. + * + * ##### Result match description + * + * - __schema__ - link schema, can be empty for fuzzy links, or `//` for + * protocol-neutral links. + * - __index__ - offset of matched text + * - __lastIndex__ - index of next char after mathch end + * - __raw__ - matched text + * - __text__ - normalized text + * - __url__ - link, generated from matched text + **/ +LinkifyIt.prototype.match = function match(text) { + const result = []; + let shift = 0; + + // Try to take previous element from cache, if .test() called before + if (this.__index__ >= 0 && this.__text_cache__ === text) { + result.push(createMatch(this, shift)); + shift = this.__last_index__; } - function startSpring(options) { - startAnimation(Object.assign({ - type: "spring", - stiffness: bounceStiffness, - damping: bounceDamping, - restDelta - }, options)); + + // Cut head if cache was used + let tail = shift ? text.slice(shift) : text; + + // Scan string until end reached + while (this.test(tail)) { + result.push(createMatch(this, shift)); + tail = tail.slice(this.__last_index__); + shift += this.__last_index__; } - if (isOutOfBounds(from)) { - startSpring({ - from, - velocity, - to: boundaryNearest(from) - }); - } else { - let target = power * velocity + from; - if (typeof modifyTarget !== "undefined") target = modifyTarget(target); - const boundary = boundaryNearest(target); - const heading = boundary === min ? -1 : 1; - let prev; - let current; - const checkBoundary = v => { - prev = current; - current = v; - velocity = velocityPerSecond(v - prev, sync.getFrameData().delta); - if (heading === 1 && v > boundary || heading === -1 && v < boundary) { - startSpring({ - from: v, - to: boundary, - velocity - }); - } - }; - startAnimation({ - type: "decay", - from, - velocity, - timeConstant, - power, - restDelta, - modifyTarget, - onUpdate: isOutOfBounds(target) ? checkBoundary : undefined - }); + if (result.length) { + return result; } - return { - stop: () => currentAnimation === null || currentAnimation === void 0 ? void 0 : currentAnimation.stop() - }; -} -const radiansToDegrees = radians => radians * 180 / Math.PI; -const angle = function (a) { - let b = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : zeroPoint; - return radiansToDegrees(Math.atan2(b.y - a.y, b.x - a.x)); + return null; }; -const applyOffset = (from, to) => { - let hasReceivedFrom = true; - if (to === undefined) { - to = from; - hasReceivedFrom = false; - } - return v => { - if (hasReceivedFrom) { - return v - from + to; - } else { - from = v; - hasReceivedFrom = true; - return to; - } - }; + +/** + * LinkifyIt#matchAtStart(text) -> Match|null + * + * Returns fully-formed (not fuzzy) link if it starts at the beginning + * of the string, and null otherwise. + **/ +LinkifyIt.prototype.matchAtStart = function matchAtStart(text) { + // Reset scan cache + this.__text_cache__ = text; + this.__index__ = -1; + if (!text.length) return null; + const m = this.re.schema_at_start.exec(text); + if (!m) return null; + const len = this.testSchemaAt(text, m[2], m[0].length); + if (!len) return null; + this.__schema__ = m[2]; + this.__index__ = m.index + m[1].length; + this.__last_index__ = m.index + m[0].length + len; + return createMatch(this, 0); }; -const identity = v => v; -const createAttractor = function () { - let alterDisplacement = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : identity; - return (constant, origin, v) => { - const displacement = origin - v; - const springModifiedDisplacement = -(0 - constant + 1) * (0 - alterDisplacement(Math.abs(displacement))); - return displacement <= 0 ? origin + springModifiedDisplacement : origin - springModifiedDisplacement; - }; + +/** chainable + * LinkifyIt#tlds(list [, keepOld]) -> this + * - list (Array): list of tlds + * - keepOld (Boolean): merge with current list if `true` (`false` by default) + * + * Load (or merge) new tlds list. Those are user for fuzzy links (without prefix) + * to avoid false positives. By default this algorythm used: + * + * - hostname with any 2-letter root zones are ok. + * - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф + * are ok. + * - encoded (`xn--...`) root zones are ok. + * + * If list is replaced, then exact match for 2-chars root zones will be checked. + **/ +LinkifyIt.prototype.tlds = function tlds(list, keepOld) { + list = Array.isArray(list) ? list : [list]; + if (!keepOld) { + this.__tlds__ = list.slice(); + this.__tlds_replaced__ = true; + compile(this); + return this; + } + this.__tlds__ = this.__tlds__.concat(list).sort().filter(function (el, idx, arr) { + return el !== arr[idx - 1]; + }).reverse(); + compile(this); + return this; }; -const attract = createAttractor(); -const attractExpo = createAttractor(Math.sqrt); -const degreesToRadians = degrees => degrees * Math.PI / 180; -const isPoint = point => point.hasOwnProperty('x') && point.hasOwnProperty('y'); -const isPoint3D = point => isPoint(point) && point.hasOwnProperty('z'); -const distance1D = (a, b) => Math.abs(a - b); -function distance(a, b) { - if (isNum(a) && isNum(b)) { - return distance1D(a, b); - } else if (isPoint(a) && isPoint(b)) { - const xDelta = distance1D(a.x, b.x); - const yDelta = distance1D(a.y, b.y); - const zDelta = isPoint3D(a) && isPoint3D(b) ? distance1D(a.z, b.z) : 0; - return Math.sqrt(Math.pow(xDelta, 2) + Math.pow(yDelta, 2) + Math.pow(zDelta, 2)); - } -} -const pointFromVector = (origin, angle, distance) => { - angle = degreesToRadians(angle); - return { - x: distance * Math.cos(angle) + origin.x, - y: distance * Math.sin(angle) + origin.y - }; -}; -const toDecimal = function (num) { - let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2; - precision = Math.pow(10, precision); - return Math.round(num * precision) / precision; -}; -const smoothFrame = function (prevValue, nextValue, duration) { - let smoothing = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; - return toDecimal(prevValue + duration * (nextValue - prevValue) / Math.max(smoothing, duration)); -}; -const smooth = function () { - let strength = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 50; - let previousValue = 0; - let lastUpdated = 0; - return v => { - const currentFramestamp = sync.getFrameData().timestamp; - const timeDelta = currentFramestamp !== lastUpdated ? currentFramestamp - lastUpdated : 0; - const newValue = timeDelta ? smoothFrame(previousValue, v, timeDelta, strength) : previousValue; - lastUpdated = currentFramestamp; - previousValue = newValue; - return newValue; - }; -}; -const snap = points => { - if (typeof points === 'number') { - return v => Math.round(v / points) * points; - } else { - let i = 0; - const numPoints = points.length; - return v => { - let lastDistance = Math.abs(points[0] - v); - for (i = 1; i < numPoints; i++) { - const point = points[i]; - const distance = Math.abs(point - v); - if (distance === 0) return point; - if (distance > lastDistance) return points[i - 1]; - if (i === numPoints - 1) return point; - lastDistance = distance; - } - }; - } -}; -function velocityPerFrame(xps, frameDuration) { - return xps / (1000 / frameDuration); -} -const wrap = (min, max, v) => { - const rangeSize = max - min; - return ((v - min) % rangeSize + rangeSize) % rangeSize + min; -}; -const a = (a1, a2) => 1.0 - 3.0 * a2 + 3.0 * a1; -const b = (a1, a2) => 3.0 * a2 - 6.0 * a1; -const c = a1 => 3.0 * a1; -const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t; -const getSlope = (t, a1, a2) => 3.0 * a(a1, a2) * t * t + 2.0 * b(a1, a2) * t + c(a1); -const subdivisionPrecision = 0.0000001; -const subdivisionMaxIterations = 10; -function binarySubdivide(aX, aA, aB, mX1, mX2) { - let currentX; - let currentT; - let i = 0; - do { - currentT = aA + (aB - aA) / 2.0; - currentX = calcBezier(currentT, mX1, mX2) - aX; - if (currentX > 0.0) { - aB = currentT; - } else { - aA = currentT; - } - } while (Math.abs(currentX) > subdivisionPrecision && ++i < subdivisionMaxIterations); - return currentT; -} -const newtonIterations = 8; -const newtonMinSlope = 0.001; -function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) { - for (let i = 0; i < newtonIterations; ++i) { - const currentSlope = getSlope(aGuessT, mX1, mX2); - if (currentSlope === 0.0) { - return aGuessT; - } - const currentX = calcBezier(aGuessT, mX1, mX2) - aX; - aGuessT -= currentX / currentSlope; - } - return aGuessT; -} -const kSplineTableSize = 11; -const kSampleStepSize = 1.0 / (kSplineTableSize - 1.0); -function cubicBezier(mX1, mY1, mX2, mY2) { - if (mX1 === mY1 && mX2 === mY2) return linear; - const sampleValues = new Float32Array(kSplineTableSize); - for (let i = 0; i < kSplineTableSize; ++i) { - sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2); + +/** + * LinkifyIt#normalize(match) + * + * Default normalizer (if schema does not define it's own). + **/ +LinkifyIt.prototype.normalize = function normalize(match) { + // Do minimal possible changes by default. Need to collect feedback prior + // to move forward https://github.com/markdown-it/linkify-it/issues/1 + + if (!match.schema) { + match.url = 'http://' + match.url; } - function getTForX(aX) { - let intervalStart = 0.0; - let currentSample = 1; - const lastSample = kSplineTableSize - 1; - for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) { - intervalStart += kSampleStepSize; - } - --currentSample; - const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]); - const guessForT = intervalStart + dist * kSampleStepSize; - const initialSlope = getSlope(guessForT, mX1, mX2); - if (initialSlope >= newtonMinSlope) { - return newtonRaphsonIterate(aX, guessForT, mX1, mX2); - } else if (initialSlope === 0.0) { - return guessForT; - } else { - return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2); - } + if (match.schema === 'mailto:' && !/^mailto:/i.test(match.url)) { + match.url = 'mailto:' + match.url; } - return t => t === 0 || t === 1 ? t : calcBezier(getTForX(t), mY1, mY2); -} -const steps = function (steps) { - let direction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'end'; - return progress => { - progress = direction === 'end' ? Math.min(progress, 0.999) : Math.max(progress, 0.001); - const expanded = progress * steps; - const rounded = direction === 'end' ? Math.floor(expanded) : Math.ceil(expanded); - return clamp(0, 1, rounded / steps); - }; }; -exports.angle = angle; -exports.animate = animate; -exports.anticipate = anticipate; -exports.applyOffset = applyOffset; -exports.attract = attract; -exports.attractExpo = attractExpo; -exports.backIn = backIn; -exports.backInOut = backInOut; -exports.backOut = backOut; -exports.bounceIn = bounceIn; -exports.bounceInOut = bounceInOut; -exports.bounceOut = bounceOut; -exports.circIn = circIn; -exports.circInOut = circInOut; -exports.circOut = circOut; -exports.clamp = clamp; -exports.createAnticipate = createAnticipate; -exports.createAttractor = createAttractor; -exports.createBackIn = createBackIn; -exports.createExpoIn = createExpoIn; -exports.cubicBezier = cubicBezier; -exports.decay = decay; -exports.degreesToRadians = degreesToRadians; -exports.distance = distance; -exports.easeIn = easeIn; -exports.easeInOut = easeInOut; -exports.easeOut = easeOut; -exports.inertia = inertia; -exports.interpolate = interpolate; -exports.isPoint = isPoint; -exports.isPoint3D = isPoint3D; -exports.keyframes = keyframes; -exports.linear = linear; -exports.mirrorEasing = mirrorEasing; -exports.mix = mix; -exports.mixColor = mixColor; -exports.mixComplex = mixComplex; -exports.pipe = pipe; -exports.pointFromVector = pointFromVector; -exports.progress = progress; -exports.radiansToDegrees = radiansToDegrees; -exports.reverseEasing = reverseEasing; -exports.smooth = smooth; -exports.smoothFrame = smoothFrame; -exports.snap = snap; -exports.spring = spring; -exports.steps = steps; -exports.toDecimal = toDecimal; -exports.velocityPerFrame = velocityPerFrame; -exports.velocityPerSecond = velocityPerSecond; -exports.wrap = wrap; - -/***/ }), - -/***/ "../../../node_modules/punycode.js/punycode.es6.js": -/*!*********************************************************!*\ - !*** ../../../node_modules/punycode.js/punycode.es6.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack_module, exports) { +/** + * LinkifyIt#onCompile() + * + * Override to modify basic RegExp-s. + **/ +LinkifyIt.prototype.onCompile = function onCompile() {}; +module.exports = LinkifyIt; +/***/ }), -/** Highest positive signed 32-bit float value */ -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.toUnicode = exports.toASCII = exports.encode = exports["default"] = exports.decode = void 0; -exports.ucs2decode = ucs2decode; -exports.ucs2encode = void 0; -const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 +/***/ "../../../node_modules/markdown-it/dist/index.cjs.js": +/*!***********************************************************!*\ + !*** ../../../node_modules/markdown-it/dist/index.cjs.js ***! + \***********************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -/** Bootstring parameters */ -const base = 36; -const tMin = 1; -const tMax = 26; -const skew = 38; -const damp = 700; -const initialBias = 72; -const initialN = 128; // 0x80 -const delimiter = '-'; // '\x2D' -/** Regular expressions */ -const regexPunycode = /^xn--/; -const regexNonASCII = /[^\0-\x7F]/; // Note: U+007F DEL is excluded too. -const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators -/** Error messages */ -const errors = { - 'overflow': 'Overflow: input needs wider integers to process', - 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', - 'invalid-input': 'Invalid input' -}; +var mdurl = __webpack_require__(/*! mdurl */ "../../../node_modules/mdurl/build/index.cjs.js"); +var ucmicro = __webpack_require__(/*! uc.micro */ "../../../node_modules/uc.micro/build/index.cjs.js"); +var entities = __webpack_require__(/*! entities */ "../../../node_modules/entities/lib/index.js"); +var LinkifyIt = __webpack_require__(/*! linkify-it */ "../../../node_modules/linkify-it/build/index.cjs.js"); +var punycode = __webpack_require__(/*! punycode.js */ "../../../node_modules/punycode.js/punycode.es6.js"); +function _interopNamespaceDefault(e) { + var n = Object.create(null); + if (e) { + Object.keys(e).forEach(function (k) { + if (k !== 'default') { + var d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { + return e[k]; + } + }); + } + }); + } + n.default = e; + return Object.freeze(n); +} +var mdurl__namespace = /*#__PURE__*/_interopNamespaceDefault(mdurl); +var ucmicro__namespace = /*#__PURE__*/_interopNamespaceDefault(ucmicro); -/** Convenience shortcuts */ -const baseMinusTMin = base - tMin; -const floor = Math.floor; -const stringFromCharCode = String.fromCharCode; +// Utilities +// -/*--------------------------------------------------------------------------*/ +function _class(obj) { + return Object.prototype.toString.call(obj); +} +function isString(obj) { + return _class(obj) === '[object String]'; +} +const _hasOwnProperty = Object.prototype.hasOwnProperty; +function has(object, key) { + return _hasOwnProperty.call(object, key); +} -/** - * A generic error utility function. - * @private - * @param {String} type The error type. - * @returns {Error} Throws a `RangeError` with the applicable error message. - */ -function error(type) { - throw new RangeError(errors[type]); +// Merge objects +// +function assign(obj /* from1, from2, from3, ... */) { + const sources = Array.prototype.slice.call(arguments, 1); + sources.forEach(function (source) { + if (!source) { + return; + } + if (typeof source !== 'object') { + throw new TypeError(source + 'must be object'); + } + Object.keys(source).forEach(function (key) { + obj[key] = source[key]; + }); + }); + return obj; } -/** - * A generic `Array#map` utility function. - * @private - * @param {Array} array The array to iterate over. - * @param {Function} callback The function that gets called for every array - * item. - * @returns {Array} A new array of values returned by the callback function. - */ -function map(array, callback) { - const result = []; - let length = array.length; - while (length--) { - result[length] = callback(array[length]); +// Remove element from array and put another array at those position. +// Useful for some operations with tokens +function arrayReplaceAt(src, pos, newElements) { + return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1)); +} +function isValidEntityCode(c) { + /* eslint no-bitwise:0 */ + // broken sequence + if (c >= 0xD800 && c <= 0xDFFF) { + return false; } - return result; + // never used + if (c >= 0xFDD0 && c <= 0xFDEF) { + return false; + } + if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { + return false; + } + // control codes + if (c >= 0x00 && c <= 0x08) { + return false; + } + if (c === 0x0B) { + return false; + } + if (c >= 0x0E && c <= 0x1F) { + return false; + } + if (c >= 0x7F && c <= 0x9F) { + return false; + } + // out of range + if (c > 0x10FFFF) { + return false; + } + return true; } - -/** - * A simple `Array#map`-like wrapper to work with domain name strings or email - * addresses. - * @private - * @param {String} domain The domain name or email address. - * @param {Function} callback The function that gets called for every - * character. - * @returns {String} A new string of characters returned by the callback - * function. - */ -function mapDomain(domain, callback) { - const parts = domain.split('@'); - let result = ''; - if (parts.length > 1) { - // In email addresses, only the domain name should be punycoded. Leave - // the local part (i.e. everything up to `@`) intact. - result = parts[0] + '@'; - domain = parts[1]; +function fromCodePoint(c) { + /* eslint no-bitwise:0 */ + if (c > 0xffff) { + c -= 0x10000; + const surrogate1 = 0xd800 + (c >> 10); + const surrogate2 = 0xdc00 + (c & 0x3ff); + return String.fromCharCode(surrogate1, surrogate2); } - // Avoid `split(regex)` for IE8 compatibility. See #17. - domain = domain.replace(regexSeparators, '\x2E'); - const labels = domain.split('.'); - const encoded = map(labels, callback).join('.'); - return result + encoded; + return String.fromCharCode(c); } - -/** - * Creates an array containing the numeric code points of each Unicode - * character in the string. While JavaScript uses UCS-2 internally, - * this function will convert a pair of surrogate halves (each of which - * UCS-2 exposes as separate characters) into a single code point, - * matching UTF-16. - * @see `punycode.ucs2.encode` - * @see - * @memberOf punycode.ucs2 - * @name decode - * @param {String} string The Unicode input string (UCS-2). - * @returns {Array} The new array of code points. - */ -function ucs2decode(string) { - const output = []; - let counter = 0; - const length = string.length; - while (counter < length) { - const value = string.charCodeAt(counter++); - if (value >= 0xD800 && value <= 0xDBFF && counter < length) { - // It's a high surrogate, and there is a next character. - const extra = string.charCodeAt(counter++); - if ((extra & 0xFC00) == 0xDC00) { - // Low surrogate. - output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); - } else { - // It's an unmatched surrogate; only append this code unit, in case the - // next code unit is the high surrogate of a surrogate pair. - output.push(value); - counter--; - } - } else { - output.push(value); +const UNESCAPE_MD_RE = /\\([!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])/g; +const ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi; +const UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi'); +const DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i; +function replaceEntityPattern(match, name) { + if (name.charCodeAt(0) === 0x23 /* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) { + const code = name[1].toLowerCase() === 'x' ? parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10); + if (isValidEntityCode(code)) { + return fromCodePoint(code); } + return match; } - return output; + const decoded = entities.decodeHTML(match); + if (decoded !== match) { + return decoded; + } + return match; } -/** - * Creates a string based on an array of numeric code points. - * @see `punycode.ucs2.decode` - * @memberOf punycode.ucs2 - * @name encode - * @param {Array} codePoints The array of numeric code points. - * @returns {String} The new Unicode string (UCS-2). - */ -const ucs2encode = codePoints => String.fromCodePoint(...codePoints); +/* function replaceEntities(str) { + if (str.indexOf('&') < 0) { return str; } -/** - * Converts a basic code point into a digit/integer. - * @see `digitToBasic()` - * @private - * @param {Number} codePoint The basic numeric code point value. - * @returns {Number} The numeric value of a basic code point (for use in - * representing integers) in the range `0` to `base - 1`, or `base` if - * the code point does not represent a value. - */ -exports.ucs2encode = ucs2encode; -const basicToDigit = function (codePoint) { - if (codePoint >= 0x30 && codePoint < 0x3A) { - return 26 + (codePoint - 0x30); - } - if (codePoint >= 0x41 && codePoint < 0x5B) { - return codePoint - 0x41; + return str.replace(ENTITY_RE, replaceEntityPattern); +} */ + +function unescapeMd(str) { + if (str.indexOf('\\') < 0) { + return str; } - if (codePoint >= 0x61 && codePoint < 0x7B) { - return codePoint - 0x61; + return str.replace(UNESCAPE_MD_RE, '$1'); +} +function unescapeAll(str) { + if (str.indexOf('\\') < 0 && str.indexOf('&') < 0) { + return str; } - return base; + return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) { + if (escaped) { + return escaped; + } + return replaceEntityPattern(match, entity); + }); +} +const HTML_ESCAPE_TEST_RE = /[&<>"]/; +const HTML_ESCAPE_REPLACE_RE = /[&<>"]/g; +const HTML_REPLACEMENTS = { + '&': '&', + '<': '<', + '>': '>', + '"': '"' }; +function replaceUnsafeChar(ch) { + return HTML_REPLACEMENTS[ch]; +} +function escapeHtml(str) { + if (HTML_ESCAPE_TEST_RE.test(str)) { + return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar); + } + return str; +} +const REGEXP_ESCAPE_RE = /[.?*+^$[\]\\(){}|-]/g; +function escapeRE(str) { + return str.replace(REGEXP_ESCAPE_RE, '\\$&'); +} +function isSpace(code) { + switch (code) { + case 0x09: + case 0x20: + return true; + } + return false; +} -/** - * Converts a digit/integer into a basic code point. - * @see `basicToDigit()` - * @private - * @param {Number} digit The numeric value of a basic code point. - * @returns {Number} The basic code point whose value (when used for - * representing integers) is `digit`, which needs to be in the range - * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is - * used; else, the lowercase form is used. The behavior is undefined - * if `flag` is non-zero and `digit` has no uppercase form. - */ -const digitToBasic = function (digit, flag) { - // 0..25 map to ASCII a..z or A..Z - // 26..35 map to ASCII 0..9 - return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); -}; - -/** - * Bias adaptation function as per section 3.4 of RFC 3492. - * https://tools.ietf.org/html/rfc3492#section-3.4 - * @private - */ -const adapt = function (delta, numPoints, firstTime) { - let k = 0; - delta = firstTime ? floor(delta / damp) : delta >> 1; - delta += floor(delta / numPoints); - for /* no initialization */ - (; delta > baseMinusTMin * tMax >> 1; k += base) { - delta = floor(delta / baseMinusTMin); +// Zs (unicode class) || [\t\f\v\r\n] +function isWhiteSpace(code) { + if (code >= 0x2000 && code <= 0x200A) { + return true; } - return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); -}; + switch (code) { + case 0x09: // \t + case 0x0A: // \n + case 0x0B: // \v + case 0x0C: // \f + case 0x0D: // \r + case 0x20: + case 0xA0: + case 0x1680: + case 0x202F: + case 0x205F: + case 0x3000: + return true; + } + return false; +} -/** - * Converts a Punycode string of ASCII-only symbols to a string of Unicode - * symbols. - * @memberOf punycode - * @param {String} input The Punycode string of ASCII-only symbols. - * @returns {String} The resulting string of Unicode symbols. - */ -const decode = function (input) { - // Don't use UCS-2. - const output = []; - const inputLength = input.length; - let i = 0; - let n = initialN; - let bias = initialBias; +/* eslint-disable max-len */ - // Handle the basic code points: let `basic` be the number of input code - // points before the last delimiter, or `0` if there is none, then copy - // the first basic code points to the output. +// Currently without astral characters support. +function isPunctChar(ch) { + return ucmicro__namespace.P.test(ch) || ucmicro__namespace.S.test(ch); +} - let basic = input.lastIndexOf(delimiter); - if (basic < 0) { - basic = 0; +// Markdown ASCII punctuation characters. +// +// !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \, ], ^, _, `, {, |, }, or ~ +// http://spec.commonmark.org/0.15/#ascii-punctuation-character +// +// Don't confuse with unicode punctuation !!! It lacks some chars in ascii range. +// +function isMdAsciiPunct(ch) { + switch (ch) { + case 0x21 /* ! */: + case 0x22 /* " */: + case 0x23 /* # */: + case 0x24 /* $ */: + case 0x25 /* % */: + case 0x26 /* & */: + case 0x27 /* ' */: + case 0x28 /* ( */: + case 0x29 /* ) */: + case 0x2A /* * */: + case 0x2B /* + */: + case 0x2C /* , */: + case 0x2D /* - */: + case 0x2E /* . */: + case 0x2F /* / */: + case 0x3A /* : */: + case 0x3B /* ; */: + case 0x3C /* < */: + case 0x3D /* = */: + case 0x3E /* > */: + case 0x3F /* ? */: + case 0x40 /* @ */: + case 0x5B /* [ */: + case 0x5C /* \ */: + case 0x5D /* ] */: + case 0x5E /* ^ */: + case 0x5F /* _ */: + case 0x60 /* ` */: + case 0x7B /* { */: + case 0x7C /* | */: + case 0x7D /* } */: + case 0x7E /* ~ */: + return true; + default: + return false; } - for (let j = 0; j < basic; ++j) { - // if it's not a basic code point - if (input.charCodeAt(j) >= 0x80) { - error('not-basic'); - } - output.push(input.charCodeAt(j)); +} + +// Hepler to unify [reference labels]. +// +function normalizeReference(str) { + // Trim and collapse whitespace + // + str = str.trim().replace(/\s+/g, ' '); + + // In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug + // fixed in v12 (couldn't find any details). + // + // So treat this one as a special case + // (remove this when node v10 is no longer supported). + // + if ('ẞ'.toLowerCase() === 'Ṿ') { + str = str.replace(/ẞ/g, 'ß'); } - // Main decoding loop: start just after the last delimiter if any basic code - // points were copied; start at the beginning otherwise. + // .toLowerCase().toUpperCase() should get rid of all differences + // between letter variants. + // + // Simple .toLowerCase() doesn't normalize 125 code points correctly, + // and .toUpperCase doesn't normalize 6 of them (list of exceptions: + // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently + // uppercased versions). + // + // Here's an example showing how it happens. Lets take greek letter omega: + // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ) + // + // Unicode entries: + // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; + // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 + // 03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 + // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8; + // + // Case-insensitive comparison should treat all of them as equivalent. + // + // But .toLowerCase() doesn't change ϑ (it's already lowercase), + // and .toUpperCase() doesn't change ϴ (already uppercase). + // + // Applying first lower then upper case normalizes any character: + // '\u0398\u03f4\u03b8\u03d1'.toLowerCase().toUpperCase() === '\u0398\u0398\u0398\u0398' + // + // Note: this is equivalent to unicode case folding; unicode normalization + // is a different step that is not required here. + // + // Final result should be uppercased, because it's later stored in an object + // (this avoid a conflict with Object.prototype members, + // most notably, `__proto__`) + // + return str.toLowerCase().toUpperCase(); +} - for /* no final expression */ - (let index = basic > 0 ? basic + 1 : 0; index < inputLength;) { - // `index` is the index of the next character to be consumed. - // Decode a generalized variable-length integer into `delta`, - // which gets added to `i`. The overflow checking is easier - // if we increase `i` as we go, then subtract off its starting - // value at the end to obtain `delta`. - const oldi = i; - for /* no condition */ - (let w = 1, k = base;; k += base) { - if (index >= inputLength) { - error('invalid-input'); - } - const digit = basicToDigit(input.charCodeAt(index++)); - if (digit >= base) { - error('invalid-input'); - } - if (digit > floor((maxInt - i) / w)) { - error('overflow'); - } - i += digit * w; - const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; - if (digit < t) { +// Re-export libraries commonly used in both markdown-it and its plugins, +// so plugins won't have to depend on them explicitly, which reduces their +// bundled size (e.g. a browser build). +// +const lib = { + mdurl: mdurl__namespace, + ucmicro: ucmicro__namespace +}; +var utils = /*#__PURE__*/Object.freeze({ + __proto__: null, + arrayReplaceAt: arrayReplaceAt, + assign: assign, + escapeHtml: escapeHtml, + escapeRE: escapeRE, + fromCodePoint: fromCodePoint, + has: has, + isMdAsciiPunct: isMdAsciiPunct, + isPunctChar: isPunctChar, + isSpace: isSpace, + isString: isString, + isValidEntityCode: isValidEntityCode, + isWhiteSpace: isWhiteSpace, + lib: lib, + normalizeReference: normalizeReference, + unescapeAll: unescapeAll, + unescapeMd: unescapeMd +}); + +// Parse link label +// +// this function assumes that first character ("[") already matches; +// returns the end of the label +// + +function parseLinkLabel(state, start, disableNested) { + let level, found, marker, prevPos; + const max = state.posMax; + const oldPos = state.pos; + state.pos = start + 1; + level = 1; + while (state.pos < max) { + marker = state.src.charCodeAt(state.pos); + if (marker === 0x5D /* ] */) { + level--; + if (level === 0) { + found = true; break; } - const baseMinusT = base - t; - if (w > floor(maxInt / baseMinusT)) { - error('overflow'); - } - w *= baseMinusT; } - const out = output.length + 1; - bias = adapt(i - oldi, out, oldi == 0); - - // `i` was supposed to wrap around from `out` to `0`, - // incrementing `n` each time, so we'll fix that now: - if (floor(i / out) > maxInt - n) { - error('overflow'); + prevPos = state.pos; + state.md.inline.skipToken(state); + if (marker === 0x5B /* [ */) { + if (prevPos === state.pos - 1) { + // increase level if we find text `[`, which is not a part of any token + level++; + } else if (disableNested) { + state.pos = oldPos; + return -1; + } } - n += floor(i / out); - i %= out; - - // Insert `n` at position `i` of the output. - output.splice(i++, 0, n); } - return String.fromCodePoint(...output); -}; - -/** - * Converts a string of Unicode symbols (e.g. a domain name label) to a - * Punycode string of ASCII-only symbols. - * @memberOf punycode - * @param {String} input The string of Unicode symbols. - * @returns {String} The resulting Punycode string of ASCII-only symbols. - */ -exports.decode = decode; -const encode = function (input) { - const output = []; - - // Convert the input in UCS-2 to an array of Unicode code points. - input = ucs2decode(input); + let labelEnd = -1; + if (found) { + labelEnd = state.pos; + } - // Cache the length. - const inputLength = input.length; + // restore old state + state.pos = oldPos; + return labelEnd; +} - // Initialize the state. - let n = initialN; - let delta = 0; - let bias = initialBias; +// Parse link destination +// - // Handle the basic code points. - for (const currentValue of input) { - if (currentValue < 0x80) { - output.push(stringFromCharCode(currentValue)); +function parseLinkDestination(str, start, max) { + let code; + let pos = start; + const result = { + ok: false, + pos: 0, + str: '' + }; + if (str.charCodeAt(pos) === 0x3C /* < */) { + pos++; + while (pos < max) { + code = str.charCodeAt(pos); + if (code === 0x0A /* \n */) { + return result; + } + if (code === 0x3C /* < */) { + return result; + } + if (code === 0x3E /* > */) { + result.pos = pos + 1; + result.str = unescapeAll(str.slice(start + 1, pos)); + result.ok = true; + return result; + } + if (code === 0x5C /* \ */ && pos + 1 < max) { + pos += 2; + continue; + } + pos++; } - } - const basicLength = output.length; - let handledCPCount = basicLength; - - // `handledCPCount` is the number of code points that have been handled; - // `basicLength` is the number of basic code points. - // Finish the basic string with a delimiter unless it's empty. - if (basicLength) { - output.push(delimiter); + // no closing '>' + return result; } - // Main encoding loop: - while (handledCPCount < inputLength) { - // All non-basic code points < n have been handled already. Find the next - // larger one: - let m = maxInt; - for (const currentValue of input) { - if (currentValue >= n && currentValue < m) { - m = currentValue; - } + // this should be ... } else { ... branch + + let level = 0; + while (pos < max) { + code = str.charCodeAt(pos); + if (code === 0x20) { + break; } - // Increase `delta` enough to advance the decoder's state to , - // but guard against overflow. - const handledCPCountPlusOne = handledCPCount + 1; - if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { - error('overflow'); + // ascii control characters + if (code < 0x20 || code === 0x7F) { + break; } - delta += (m - n) * handledCPCountPlusOne; - n = m; - for (const currentValue of input) { - if (currentValue < n && ++delta > maxInt) { - error('overflow'); + if (code === 0x5C /* \ */ && pos + 1 < max) { + if (str.charCodeAt(pos + 1) === 0x20) { + break; } - if (currentValue === n) { - // Represent delta as a generalized variable-length integer. - let q = delta; - for /* no condition */ - (let k = base;; k += base) { - const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; - if (q < t) { - break; - } - const qMinusT = q - t; - const baseMinusT = base - t; - output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))); - q = floor(qMinusT / baseMinusT); - } - output.push(stringFromCharCode(digitToBasic(q, 0))); - bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength); - delta = 0; - ++handledCPCount; + pos += 2; + continue; + } + if (code === 0x28 /* ( */) { + level++; + if (level > 32) { + return result; } } - ++delta; - ++n; + if (code === 0x29 /* ) */) { + if (level === 0) { + break; + } + level--; + } + pos++; } - return output.join(''); -}; + if (start === pos) { + return result; + } + if (level !== 0) { + return result; + } + result.str = unescapeAll(str.slice(start, pos)); + result.pos = pos; + result.ok = true; + return result; +} -/** - * Converts a Punycode string representing a domain name or an email address - * to Unicode. Only the Punycoded parts of the input will be converted, i.e. - * it doesn't matter if you call it on a string that has already been - * converted to Unicode. - * @memberOf punycode - * @param {String} input The Punycoded domain name or email address to - * convert to Unicode. - * @returns {String} The Unicode representation of the given Punycode - * string. - */ -exports.encode = encode; -const toUnicode = function (input) { - return mapDomain(input, function (string) { - return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string; - }); -}; +// Parse link title +// -/** - * Converts a Unicode string representing a domain name or an email address to - * Punycode. Only the non-ASCII parts of the domain name will be converted, - * i.e. it doesn't matter if you call it with a domain that's already in - * ASCII. - * @memberOf punycode - * @param {String} input The domain name or email address to convert, as a - * Unicode string. - * @returns {String} The Punycode representation of the given domain name or - * email address. - */ -exports.toUnicode = toUnicode; -const toASCII = function (input) { - return mapDomain(input, function (string) { - return regexNonASCII.test(string) ? 'xn--' + encode(string) : string; - }); -}; +// Parse link title within `str` in [start, max] range, +// or continue previous parsing if `prev_state` is defined (equal to result of last execution). +// +function parseLinkTitle(str, start, max, prev_state) { + let code; + let pos = start; + const state = { + // if `true`, this is a valid link title + ok: false, + // if `true`, this link can be continued on the next line + can_continue: false, + // if `ok`, it's the position of the first character after the closing marker + pos: 0, + // if `ok`, it's the unescaped title + str: '', + // expected closing marker character code + marker: 0 + }; + if (prev_state) { + // this is a continuation of a previous parseLinkTitle call on the next line, + // used in reference links only + state.str = prev_state.str; + state.marker = prev_state.marker; + } else { + if (pos >= max) { + return state; + } + let marker = str.charCodeAt(pos); + if (marker !== 0x22 /* " */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { + return state; + } + start++; + pos++; -/*--------------------------------------------------------------------------*/ + // if opening marker is "(", switch it to closing marker ")" + if (marker === 0x28) { + marker = 0x29; + } + state.marker = marker; + } + while (pos < max) { + code = str.charCodeAt(pos); + if (code === state.marker) { + state.pos = pos + 1; + state.str += unescapeAll(str.slice(start, pos)); + state.ok = true; + return state; + } else if (code === 0x28 /* ( */ && state.marker === 0x29 /* ) */) { + return state; + } else if (code === 0x5C /* \ */ && pos + 1 < max) { + pos++; + } + pos++; + } -/** Define the public API */ -exports.toASCII = toASCII; -const punycode = { - /** - * A string representing the current Punycode.js version number. - * @memberOf punycode - * @type String - */ - 'version': '2.3.1', - /** - * An object of methods to convert from JavaScript's internal character - * representation (UCS-2) to Unicode code points, and back. - * @see - * @memberOf punycode - * @type Object - */ - 'ucs2': { - 'decode': ucs2decode, - 'encode': ucs2encode - }, - 'decode': decode, - 'encode': encode, - 'toASCII': toASCII, - 'toUnicode': toUnicode -}; -var _default = punycode; -exports["default"] = _default; - -/***/ }), + // no closing marker found, but this link title may continue on the next line (for references) + state.can_continue = true; + state.str += unescapeAll(str.slice(start, pos)); + return state; +} -/***/ "../../../node_modules/react-remove-scroll-bar/dist/es2015/component.js": -/*!******************************************************************************!*\ - !*** ../../../node_modules/react-remove-scroll-bar/dist/es2015/component.js ***! - \******************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +// Just a shortcut for bulk export +var helpers = /*#__PURE__*/Object.freeze({ + __proto__: null, + parseLinkDestination: parseLinkDestination, + parseLinkLabel: parseLinkLabel, + parseLinkTitle: parseLinkTitle +}); +/** + * class Renderer + * + * Generates HTML from parsed token stream. Each instance has independent + * copy of rules. Those can be rewritten with ease. Also, you can add new + * rules if you create plugin and adds new token types. + **/ -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.RemoveScrollBar = void 0; -var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); -var _reactStyleSingleton = __webpack_require__(/*! react-style-singleton */ "../../../node_modules/react-style-singleton/dist/es2015/index.js"); -var _constants = __webpack_require__(/*! ./constants */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/constants.js"); -var _utils = __webpack_require__(/*! ./utils */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/utils.js"); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -var Style = (0, _reactStyleSingleton.styleSingleton)(); -// important tip - once we measure scrollBar width and remove them -// we could not repeat this operation -// thus we are using style-singleton - only the first "yet correct" style will be applied. -var getStyles = function (_a, allowRelative, gapMode, important) { - var left = _a.left, - top = _a.top, - right = _a.right, - gap = _a.gap; - if (gapMode === void 0) { - gapMode = 'margin'; - } - return "\n .".concat(_constants.noScrollbarsClassName, " {\n overflow: hidden ").concat(important, ";\n padding-right: ").concat(gap, "px ").concat(important, ";\n }\n body {\n overflow: hidden ").concat(important, ";\n overscroll-behavior: contain;\n ").concat([allowRelative && "position: relative ".concat(important, ";"), gapMode === 'margin' && "\n padding-left: ".concat(left, "px;\n padding-top: ").concat(top, "px;\n padding-right: ").concat(right, "px;\n margin-left:0;\n margin-top:0;\n margin-right: ").concat(gap, "px ").concat(important, ";\n "), gapMode === 'padding' && "padding-right: ".concat(gap, "px ").concat(important, ";")].filter(Boolean).join(''), "\n }\n \n .").concat(_constants.zeroRightClassName, " {\n right: ").concat(gap, "px ").concat(important, ";\n }\n \n .").concat(_constants.fullWidthClassName, " {\n margin-right: ").concat(gap, "px ").concat(important, ";\n }\n \n .").concat(_constants.zeroRightClassName, " .").concat(_constants.zeroRightClassName, " {\n right: 0 ").concat(important, ";\n }\n \n .").concat(_constants.fullWidthClassName, " .").concat(_constants.fullWidthClassName, " {\n margin-right: 0 ").concat(important, ";\n }\n \n body {\n ").concat(_constants.removedBarSizeVariable, ": ").concat(gap, "px;\n }\n"); +const default_rules = {}; +default_rules.code_inline = function (tokens, idx, options, env, slf) { + const token = tokens[idx]; + return '' + escapeHtml(token.content) + ''; }; -/** - * Removes page scrollbar and blocks page scroll when mounted - */ -var RemoveScrollBar = function (props) { - var noRelative = props.noRelative, - noImportant = props.noImportant, - _a = props.gapMode, - gapMode = _a === void 0 ? 'margin' : _a; - var gap = React.useMemo(function () { - return (0, _utils.getGapWidth)(gapMode); - }, [gapMode]); - return /*#__PURE__*/React.createElement(Style, { - styles: getStyles(gap, !noRelative, gapMode, !noImportant ? '!important' : '') - }); +default_rules.code_block = function (tokens, idx, options, env, slf) { + const token = tokens[idx]; + return '' + escapeHtml(tokens[idx].content) + '\n'; }; -exports.RemoveScrollBar = RemoveScrollBar; +default_rules.fence = function (tokens, idx, options, env, slf) { + const token = tokens[idx]; + const info = token.info ? unescapeAll(token.info).trim() : ''; + let langName = ''; + let langAttrs = ''; + if (info) { + const arr = info.split(/(\s+)/g); + langName = arr[0]; + langAttrs = arr.slice(2).join(''); + } + let highlighted; + if (options.highlight) { + highlighted = options.highlight(token.content, langName, langAttrs) || escapeHtml(token.content); + } else { + highlighted = escapeHtml(token.content); + } + if (highlighted.indexOf('${highlighted}\n`; + } + return `
${highlighted}
\n`; +}; +default_rules.image = function (tokens, idx, options, env, slf) { + const token = tokens[idx]; + // "alt" attr MUST be set, even if empty. Because it's mandatory and + // should be placed on proper position for tests. + // + // Replace content with actual value + token.attrs[token.attrIndex('alt')][1] = slf.renderInlineAsText(token.children, options, env); + return slf.renderToken(tokens, idx, options); +}; +default_rules.hardbreak = function (tokens, idx, options /*, env */) { + return options.xhtmlOut ? '
\n' : '
\n'; +}; +default_rules.softbreak = function (tokens, idx, options /*, env */) { + return options.breaks ? options.xhtmlOut ? '
\n' : '
\n' : '\n'; +}; +default_rules.text = function (tokens, idx /*, options, env */) { + return escapeHtml(tokens[idx].content); +}; +default_rules.html_block = function (tokens, idx /*, options, env */) { + return tokens[idx].content; +}; +default_rules.html_inline = function (tokens, idx /*, options, env */) { + return tokens[idx].content; +}; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.zeroRightClassName = exports.removedBarSizeVariable = exports.noScrollbarsClassName = exports.fullWidthClassName = void 0; -var zeroRightClassName = 'right-scroll-bar-position'; -exports.zeroRightClassName = zeroRightClassName; -var fullWidthClassName = 'width-before-scroll-bar'; -exports.fullWidthClassName = fullWidthClassName; -var noScrollbarsClassName = 'with-scroll-bars-hidden'; /** - * Name of a CSS variable containing the amount of "hidden" scrollbar - * ! might be undefined ! use will fallback! - */ -exports.noScrollbarsClassName = noScrollbarsClassName; -var removedBarSizeVariable = '--removed-body-scroll-bar-size'; -exports.removedBarSizeVariable = removedBarSizeVariable; - -/***/ }), - -/***/ "../../../node_modules/react-remove-scroll-bar/dist/es2015/index.js": -/*!**************************************************************************!*\ - !*** ../../../node_modules/react-remove-scroll-bar/dist/es2015/index.js ***! - \**************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - + * new Renderer() + * + * Creates new [[Renderer]] instance and fill [[Renderer#rules]] with defaults. + **/ +function Renderer() { + /** + * Renderer#rules -> Object + * + * Contains render rules for tokens. Can be updated and extended. + * + * ##### Example + * + * ```javascript + * var md = require('markdown-it')(); + * + * md.renderer.rules.strong_open = function () { return ''; }; + * md.renderer.rules.strong_close = function () { return ''; }; + * + * var result = md.renderInline(...); + * ``` + * + * Each rule is called as independent static function with fixed signature: + * + * ```javascript + * function my_token_render(tokens, idx, options, env, renderer) { + * // ... + * return renderedHTML; + * } + * ``` + * + * See [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.mjs) + * for more details and examples. + **/ + this.rules = assign({}, default_rules); +} -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "RemoveScrollBar", ({ - enumerable: true, - get: function () { - return _component.RemoveScrollBar; - } -})); -Object.defineProperty(exports, "fullWidthClassName", ({ - enumerable: true, - get: function () { - return _constants.fullWidthClassName; - } -})); -Object.defineProperty(exports, "getGapWidth", ({ - enumerable: true, - get: function () { - return _utils.getGapWidth; - } -})); -Object.defineProperty(exports, "noScrollbarsClassName", ({ - enumerable: true, - get: function () { - return _constants.noScrollbarsClassName; +/** + * Renderer.renderAttrs(token) -> String + * + * Render token attributes to string. + **/ +Renderer.prototype.renderAttrs = function renderAttrs(token) { + let i, l, result; + if (!token.attrs) { + return ''; } -})); -Object.defineProperty(exports, "removedBarSizeVariable", ({ - enumerable: true, - get: function () { - return _constants.removedBarSizeVariable; + result = ''; + for (i = 0, l = token.attrs.length; i < l; i++) { + result += ' ' + escapeHtml(token.attrs[i][0]) + '="' + escapeHtml(token.attrs[i][1]) + '"'; } -})); -Object.defineProperty(exports, "zeroRightClassName", ({ - enumerable: true, - get: function () { - return _constants.zeroRightClassName; + return result; +}; + +/** + * Renderer.renderToken(tokens, idx, options) -> String + * - tokens (Array): list of tokens + * - idx (Numbed): token index to render + * - options (Object): params of parser instance + * + * Default token renderer. Can be overriden by custom function + * in [[Renderer#rules]]. + **/ +Renderer.prototype.renderToken = function renderToken(tokens, idx, options) { + const token = tokens[idx]; + let result = ''; + + // Tight list paragraphs + if (token.hidden) { + return ''; } -})); -var _component = __webpack_require__(/*! ./component */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/component.js"); -var _constants = __webpack_require__(/*! ./constants */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/constants.js"); -var _utils = __webpack_require__(/*! ./utils */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/utils.js"); -/***/ }), + // Insert a newline between hidden paragraph and subsequent opening + // block-level tag. + // + // For example, here we should insert a newline before blockquote: + // - a + // > + // + if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden) { + result += '\n'; + } -/***/ "../../../node_modules/react-remove-scroll-bar/dist/es2015/utils.js": -/*!**************************************************************************!*\ - !*** ../../../node_modules/react-remove-scroll-bar/dist/es2015/utils.js ***! - \**************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { + // Add token name, e.g. ``. + // + needLf = false; + } + } } } - var left = cs[gapMode === 'padding' ? 'paddingLeft' : 'marginLeft']; - var top = cs[gapMode === 'padding' ? 'paddingTop' : 'marginTop']; - var right = cs[gapMode === 'padding' ? 'paddingRight' : 'marginRight']; - return [parse(left), parse(top), parse(right)]; + result += needLf ? '>\n' : '>'; + return result; }; -var getGapWidth = function (gapMode) { - if (gapMode === void 0) { - gapMode = 'margin'; + +/** + * Renderer.renderInline(tokens, options, env) -> String + * - tokens (Array): list on block tokens to render + * - options (Object): params of parser instance + * - env (Object): additional data from parsed input (references, for example) + * + * The same as [[Renderer.render]], but for single token of `inline` type. + **/ +Renderer.prototype.renderInline = function (tokens, options, env) { + let result = ''; + const rules = this.rules; + for (let i = 0, len = tokens.length; i < len; i++) { + const type = tokens[i].type; + if (typeof rules[type] !== 'undefined') { + result += rules[type](tokens, i, options, env, this); + } else { + result += this.renderToken(tokens, i, options); + } } - if (typeof window === 'undefined') { - return zeroGap; + return result; +}; + +/** internal + * Renderer.renderInlineAsText(tokens, options, env) -> String + * - tokens (Array): list on block tokens to render + * - options (Object): params of parser instance + * - env (Object): additional data from parsed input (references, for example) + * + * Special kludge for image `alt` attributes to conform CommonMark spec. + * Don't try to use it! Spec requires to show `alt` content with stripped markup, + * instead of simple escaping. + **/ +Renderer.prototype.renderInlineAsText = function (tokens, options, env) { + let result = ''; + for (let i = 0, len = tokens.length; i < len; i++) { + switch (tokens[i].type) { + case 'text': + result += tokens[i].content; + break; + case 'image': + result += this.renderInlineAsText(tokens[i].children, options, env); + break; + case 'html_inline': + case 'html_block': + result += tokens[i].content; + break; + case 'softbreak': + case 'hardbreak': + result += '\n'; + break; + // all other tokens are skipped + } } - var offsets = getOffset(gapMode); - var documentWidth = document.documentElement.clientWidth; - var windowWidth = window.innerWidth; - return { - left: offsets[0], - top: offsets[1], - right: offsets[2], - gap: Math.max(0, windowWidth - documentWidth + offsets[2] - offsets[0]) - }; + return result; }; -exports.getGapWidth = getGapWidth; -/***/ }), +/** + * Renderer.render(tokens, options, env) -> String + * - tokens (Array): list on block tokens to render + * - options (Object): params of parser instance + * - env (Object): additional data from parsed input (references, for example) + * + * Takes token stream and generates HTML. Probably, you will never need to call + * this method directly. + **/ +Renderer.prototype.render = function (tokens, options, env) { + let result = ''; + const rules = this.rules; + for (let i = 0, len = tokens.length; i < len; i++) { + const type = tokens[i].type; + if (type === 'inline') { + result += this.renderInline(tokens[i].children, options, env); + } else if (typeof rules[type] !== 'undefined') { + result += rules[type](tokens, i, options, env, this); + } else { + result += this.renderToken(tokens, i, options, env); + } + } + return result; +}; -/***/ "../../../node_modules/react-remove-scroll/dist/es2015/Combination.js": -/*!****************************************************************************!*\ - !*** ../../../node_modules/react-remove-scroll/dist/es2015/Combination.js ***! - \****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/** + * class Ruler + * + * Helper class, used by [[MarkdownIt#core]], [[MarkdownIt#block]] and + * [[MarkdownIt#inline]] to manage sequences of functions (rules): + * + * - keep rules in defined order + * - assign the name to each rule + * - enable/disable rules + * - add/replace rules + * - allow assign rules to additional named chains (in the same) + * - cacheing lists of active rules + * + * You will not need use this class directly until write plugins. For simple + * rules control use [[MarkdownIt.disable]], [[MarkdownIt.enable]] and + * [[MarkdownIt.use]]. + **/ +/** + * new Ruler() + **/ +function Ruler() { + // List of added rules. Each element is: + // + // { + // name: XXX, + // enabled: Boolean, + // fn: Function(), + // alt: [ name2, name3 ] + // } + // + this.__rules__ = []; + // Cached rule chains. + // + // First level - chain name, '' for default. + // Second level - diginal anchor for fast filtering by charcodes. + // + this.__cache__ = null; +} -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); -var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); -var _UI = __webpack_require__(/*! ./UI */ "../../../node_modules/react-remove-scroll/dist/es2015/UI.js"); -var _sidecar = _interopRequireDefault(__webpack_require__(/*! ./sidecar */ "../../../node_modules/react-remove-scroll/dist/es2015/sidecar.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -var ReactRemoveScroll = /*#__PURE__*/React.forwardRef(function (props, ref) { - return /*#__PURE__*/React.createElement(_UI.RemoveScroll, (0, _tslib.__assign)({}, props, { - ref: ref, - sideCar: _sidecar.default - })); -}); -ReactRemoveScroll.classNames = _UI.RemoveScroll.classNames; -var _default = ReactRemoveScroll; -exports["default"] = _default; +// Helper methods, should not be used directly -/***/ }), +// Find rule index by name +// +Ruler.prototype.__find__ = function (name) { + for (let i = 0; i < this.__rules__.length; i++) { + if (this.__rules__[i].name === name) { + return i; + } + } + return -1; +}; -/***/ "../../../node_modules/react-remove-scroll/dist/es2015/SideEffect.js": -/*!***************************************************************************!*\ - !*** ../../../node_modules/react-remove-scroll/dist/es2015/SideEffect.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.RemoveScrollSideCar = RemoveScrollSideCar; -exports.getTouchXY = exports.getDeltaXY = void 0; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); -var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); -var _reactRemoveScrollBar = __webpack_require__(/*! react-remove-scroll-bar */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/index.js"); -var _reactStyleSingleton = __webpack_require__(/*! react-style-singleton */ "../../../node_modules/react-style-singleton/dist/es2015/index.js"); -var _aggresiveCapture = __webpack_require__(/*! ./aggresiveCapture */ "../../../node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js"); -var _handleScroll = __webpack_require__(/*! ./handleScroll */ "../../../node_modules/react-remove-scroll/dist/es2015/handleScroll.js"); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -var getTouchXY = function (event) { - return 'changedTouches' in event ? [event.changedTouches[0].clientX, event.changedTouches[0].clientY] : [0, 0]; -}; -exports.getTouchXY = getTouchXY; -var getDeltaXY = function (event) { - return [event.deltaX, event.deltaY]; -}; -exports.getDeltaXY = getDeltaXY; -var extractRef = function (ref) { - return ref && 'current' in ref ? ref.current : ref; -}; -var deltaCompare = function (x, y) { - return x[0] === y[0] && x[1] === y[1]; -}; -var generateStyle = function (id) { - return "\n .block-interactivity-".concat(id, " {pointer-events: none;}\n .allow-interactivity-").concat(id, " {pointer-events: all;}\n"); -}; -var idCounter = 0; -var lockStack = []; -function RemoveScrollSideCar(props) { - var shouldPreventQueue = React.useRef([]); - var touchStartRef = React.useRef([0, 0]); - var activeAxis = React.useRef(); - var id = React.useState(idCounter++)[0]; - var Style = React.useState(function () { - return (0, _reactStyleSingleton.styleSingleton)(); - })[0]; - var lastProps = React.useRef(props); - React.useEffect(function () { - lastProps.current = props; - }, [props]); - React.useEffect(function () { - if (props.inert) { - document.body.classList.add("block-interactivity-".concat(id)); - var allow_1 = (0, _tslib.__spreadArray)([props.lockRef.current], (props.shards || []).map(extractRef), true).filter(Boolean); - allow_1.forEach(function (el) { - return el.classList.add("allow-interactivity-".concat(id)); - }); - return function () { - document.body.classList.remove("block-interactivity-".concat(id)); - allow_1.forEach(function (el) { - return el.classList.remove("allow-interactivity-".concat(id)); - }); - }; - } - return; - }, [props.inert, props.lockRef.current, props.shards]); - var shouldCancelEvent = React.useCallback(function (event, parent) { - if ('touches' in event && event.touches.length === 2) { - return !lastProps.current.allowPinchZoom; - } - var touch = getTouchXY(event); - var touchStart = touchStartRef.current; - var deltaX = 'deltaX' in event ? event.deltaX : touchStart[0] - touch[0]; - var deltaY = 'deltaY' in event ? event.deltaY : touchStart[1] - touch[1]; - var currentAxis; - var target = event.target; - var moveDirection = Math.abs(deltaX) > Math.abs(deltaY) ? 'h' : 'v'; - // allow horizontal touch move on Range inputs. They will not cause any scroll - if ('touches' in event && moveDirection === 'h' && target.type === 'range') { - return false; - } - var canBeScrolledInMainDirection = (0, _handleScroll.locationCouldBeScrolled)(moveDirection, target); - if (!canBeScrolledInMainDirection) { - return true; - } - if (canBeScrolledInMainDirection) { - currentAxis = moveDirection; - } else { - currentAxis = moveDirection === 'v' ? 'h' : 'v'; - canBeScrolledInMainDirection = (0, _handleScroll.locationCouldBeScrolled)(moveDirection, target); - // other axis might be not scrollable - } +// Build rules lookup cache +// +Ruler.prototype.__compile__ = function () { + const self = this; + const chains = ['']; - if (!canBeScrolledInMainDirection) { - return false; - } - if (!activeAxis.current && 'changedTouches' in event && (deltaX || deltaY)) { - activeAxis.current = currentAxis; - } - if (!currentAxis) { - return true; - } - var cancelingAxis = activeAxis.current || currentAxis; - return (0, _handleScroll.handleScroll)(cancelingAxis, parent, event, cancelingAxis === 'h' ? deltaX : deltaY, true); - }, []); - var shouldPrevent = React.useCallback(function (_event) { - var event = _event; - if (!lockStack.length || lockStack[lockStack.length - 1] !== Style) { - // not the last active + // collect unique names + self.__rules__.forEach(function (rule) { + if (!rule.enabled) { return; } - var delta = 'deltaY' in event ? getDeltaXY(event) : getTouchXY(event); - var sourceEvent = shouldPreventQueue.current.filter(function (e) { - return e.name === event.type && e.target === event.target && deltaCompare(e.delta, delta); - })[0]; - // self event, and should be canceled - if (sourceEvent && sourceEvent.should) { - if (event.cancelable) { - event.preventDefault(); + rule.alt.forEach(function (altName) { + if (chains.indexOf(altName) < 0) { + chains.push(altName); } - return; - } - // outside or shard event - if (!sourceEvent) { - var shardNodes = (lastProps.current.shards || []).map(extractRef).filter(Boolean).filter(function (node) { - return node.contains(event.target); - }); - var shouldStop = shardNodes.length > 0 ? shouldCancelEvent(event, shardNodes[0]) : !lastProps.current.noIsolation; - if (shouldStop) { - if (event.cancelable) { - event.preventDefault(); - } + }); + }); + self.__cache__ = {}; + chains.forEach(function (chain) { + self.__cache__[chain] = []; + self.__rules__.forEach(function (rule) { + if (!rule.enabled) { + return; } - } - }, []); - var shouldCancel = React.useCallback(function (name, delta, target, should) { - var event = { - name: name, - delta: delta, - target: target, - should: should - }; - shouldPreventQueue.current.push(event); - setTimeout(function () { - shouldPreventQueue.current = shouldPreventQueue.current.filter(function (e) { - return e !== event; - }); - }, 1); - }, []); - var scrollTouchStart = React.useCallback(function (event) { - touchStartRef.current = getTouchXY(event); - activeAxis.current = undefined; - }, []); - var scrollWheel = React.useCallback(function (event) { - shouldCancel(event.type, getDeltaXY(event), event.target, shouldCancelEvent(event, props.lockRef.current)); - }, []); - var scrollTouchMove = React.useCallback(function (event) { - shouldCancel(event.type, getTouchXY(event), event.target, shouldCancelEvent(event, props.lockRef.current)); - }, []); - React.useEffect(function () { - lockStack.push(Style); - props.setCallbacks({ - onScrollCapture: scrollWheel, - onWheelCapture: scrollWheel, - onTouchMoveCapture: scrollTouchMove + if (chain && rule.alt.indexOf(chain) < 0) { + return; + } + self.__cache__[chain].push(rule.fn); }); - document.addEventListener('wheel', shouldPrevent, _aggresiveCapture.nonPassive); - document.addEventListener('touchmove', shouldPrevent, _aggresiveCapture.nonPassive); - document.addEventListener('touchstart', scrollTouchStart, _aggresiveCapture.nonPassive); - return function () { - lockStack = lockStack.filter(function (inst) { - return inst !== Style; - }); - document.removeEventListener('wheel', shouldPrevent, _aggresiveCapture.nonPassive); - document.removeEventListener('touchmove', shouldPrevent, _aggresiveCapture.nonPassive); - document.removeEventListener('touchstart', scrollTouchStart, _aggresiveCapture.nonPassive); - }; - }, []); - var removeScrollBar = props.removeScrollBar, - inert = props.inert; - return /*#__PURE__*/React.createElement(React.Fragment, null, inert ? /*#__PURE__*/React.createElement(Style, { - styles: generateStyle(id) - }) : null, removeScrollBar ? /*#__PURE__*/React.createElement(_reactRemoveScrollBar.RemoveScrollBar, { - gapMode: "margin" - }) : null); -} - -/***/ }), - -/***/ "../../../node_modules/react-remove-scroll/dist/es2015/UI.js": -/*!*******************************************************************!*\ - !*** ../../../node_modules/react-remove-scroll/dist/es2015/UI.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.RemoveScroll = void 0; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); -var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); -var _constants = __webpack_require__(/*! react-remove-scroll-bar/constants */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/constants.js"); -var _useCallbackRef = __webpack_require__(/*! use-callback-ref */ "../../../node_modules/use-callback-ref/dist/es2015/index.js"); -var _medium = __webpack_require__(/*! ./medium */ "../../../node_modules/react-remove-scroll/dist/es2015/medium.js"); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -var nothing = function () { - return; + }); }; + /** - * Removes scrollbar from the page and contain the scroll within the Lock - */ -var RemoveScroll = /*#__PURE__*/React.forwardRef(function (props, parentRef) { - var ref = React.useRef(null); - var _a = React.useState({ - onScrollCapture: nothing, - onWheelCapture: nothing, - onTouchMoveCapture: nothing - }), - callbacks = _a[0], - setCallbacks = _a[1]; - var forwardProps = props.forwardProps, - children = props.children, - className = props.className, - removeScrollBar = props.removeScrollBar, - enabled = props.enabled, - shards = props.shards, - sideCar = props.sideCar, - noIsolation = props.noIsolation, - inert = props.inert, - allowPinchZoom = props.allowPinchZoom, - _b = props.as, - Container = _b === void 0 ? 'div' : _b, - rest = (0, _tslib.__rest)(props, ["forwardProps", "children", "className", "removeScrollBar", "enabled", "shards", "sideCar", "noIsolation", "inert", "allowPinchZoom", "as"]); - var SideCar = sideCar; - var containerRef = (0, _useCallbackRef.useMergeRefs)([ref, parentRef]); - var containerProps = (0, _tslib.__assign)((0, _tslib.__assign)({}, rest), callbacks); - return /*#__PURE__*/React.createElement(React.Fragment, null, enabled && /*#__PURE__*/React.createElement(SideCar, { - sideCar: _medium.effectCar, - removeScrollBar: removeScrollBar, - shards: shards, - noIsolation: noIsolation, - inert: inert, - setCallbacks: setCallbacks, - allowPinchZoom: !!allowPinchZoom, - lockRef: ref - }), forwardProps ? /*#__PURE__*/React.cloneElement(React.Children.only(children), (0, _tslib.__assign)((0, _tslib.__assign)({}, containerProps), { - ref: containerRef - })) : /*#__PURE__*/React.createElement(Container, (0, _tslib.__assign)({}, containerProps, { - className: className, - ref: containerRef - }), children)); -}); -exports.RemoveScroll = RemoveScroll; -RemoveScroll.defaultProps = { - enabled: true, - removeScrollBar: true, - inert: false -}; -RemoveScroll.classNames = { - fullWidth: _constants.fullWidthClassName, - zeroRight: _constants.zeroRightClassName + * Ruler.at(name, fn [, options]) + * - name (String): rule name to replace. + * - fn (Function): new rule function. + * - options (Object): new rule options (not mandatory). + * + * Replace rule by name with new function & options. Throws error if name not + * found. + * + * ##### Options: + * + * - __alt__ - array with names of "alternate" chains. + * + * ##### Example + * + * Replace existing typographer replacement rule with new one: + * + * ```javascript + * var md = require('markdown-it')(); + * + * md.core.ruler.at('replacements', function replace(state) { + * //... + * }); + * ``` + **/ +Ruler.prototype.at = function (name, fn, options) { + const index = this.__find__(name); + const opt = options || {}; + if (index === -1) { + throw new Error('Parser rule not found: ' + name); + } + this.__rules__[index].fn = fn; + this.__rules__[index].alt = opt.alt || []; + this.__cache__ = null; }; -/***/ }), +/** + * Ruler.before(beforeName, ruleName, fn [, options]) + * - beforeName (String): new rule will be added before this one. + * - ruleName (String): name of added rule. + * - fn (Function): rule function. + * - options (Object): rule options (not mandatory). + * + * Add new rule to chain before one with given name. See also + * [[Ruler.after]], [[Ruler.push]]. + * + * ##### Options: + * + * - __alt__ - array with names of "alternate" chains. + * + * ##### Example + * + * ```javascript + * var md = require('markdown-it')(); + * + * md.block.ruler.before('paragraph', 'my_rule', function replace(state) { + * //... + * }); + * ``` + **/ +Ruler.prototype.before = function (beforeName, ruleName, fn, options) { + const index = this.__find__(beforeName); + const opt = options || {}; + if (index === -1) { + throw new Error('Parser rule not found: ' + beforeName); + } + this.__rules__.splice(index, 0, { + name: ruleName, + enabled: true, + fn, + alt: opt.alt || [] + }); + this.__cache__ = null; +}; -/***/ "../../../node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js": -/*!*********************************************************************************!*\ - !*** ../../../node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js ***! - \*********************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { +/** + * Ruler.after(afterName, ruleName, fn [, options]) + * - afterName (String): new rule will be added after this one. + * - ruleName (String): name of added rule. + * - fn (Function): rule function. + * - options (Object): rule options (not mandatory). + * + * Add new rule to chain after one with given name. See also + * [[Ruler.before]], [[Ruler.push]]. + * + * ##### Options: + * + * - __alt__ - array with names of "alternate" chains. + * + * ##### Example + * + * ```javascript + * var md = require('markdown-it')(); + * + * md.inline.ruler.after('text', 'my_rule', function replace(state) { + * //... + * }); + * ``` + **/ +Ruler.prototype.after = function (afterName, ruleName, fn, options) { + const index = this.__find__(afterName); + const opt = options || {}; + if (index === -1) { + throw new Error('Parser rule not found: ' + afterName); + } + this.__rules__.splice(index + 1, 0, { + name: ruleName, + enabled: true, + fn, + alt: opt.alt || [] + }); + this.__cache__ = null; +}; +/** + * Ruler.push(ruleName, fn [, options]) + * - ruleName (String): name of added rule. + * - fn (Function): rule function. + * - options (Object): rule options (not mandatory). + * + * Push new rule to the end of chain. See also + * [[Ruler.before]], [[Ruler.after]]. + * + * ##### Options: + * + * - __alt__ - array with names of "alternate" chains. + * + * ##### Example + * + * ```javascript + * var md = require('markdown-it')(); + * + * md.core.ruler.push('my_rule', function replace(state) { + * //... + * }); + * ``` + **/ +Ruler.prototype.push = function (ruleName, fn, options) { + const opt = options || {}; + this.__rules__.push({ + name: ruleName, + enabled: true, + fn, + alt: opt.alt || [] + }); + this.__cache__ = null; +}; +/** + * Ruler.enable(list [, ignoreInvalid]) -> Array + * - list (String|Array): list of rule names to enable. + * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found. + * + * Enable rules with given names. If any rule name not found - throw Error. + * Errors can be disabled by second param. + * + * Returns list of found rule names (if no exception happened). + * + * See also [[Ruler.disable]], [[Ruler.enableOnly]]. + **/ +Ruler.prototype.enable = function (list, ignoreInvalid) { + if (!Array.isArray(list)) { + list = [list]; + } + const result = []; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.nonPassive = void 0; -var passiveSupported = false; -if (typeof window !== 'undefined') { - try { - var options = Object.defineProperty({}, 'passive', { - get: function () { - passiveSupported = true; - return true; + // Search by name and enable + list.forEach(function (name) { + const idx = this.__find__(name); + if (idx < 0) { + if (ignoreInvalid) { + return; } - }); - // @ts-ignore - window.addEventListener('test', options, options); - // @ts-ignore - window.removeEventListener('test', options, options); - } catch (err) { - passiveSupported = false; + throw new Error('Rules manager: invalid rule name ' + name); + } + this.__rules__[idx].enabled = true; + result.push(name); + }, this); + this.__cache__ = null; + return result; +}; + +/** + * Ruler.enableOnly(list [, ignoreInvalid]) + * - list (String|Array): list of rule names to enable (whitelist). + * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found. + * + * Enable rules with given names, and disable everything else. If any rule name + * not found - throw Error. Errors can be disabled by second param. + * + * See also [[Ruler.disable]], [[Ruler.enable]]. + **/ +Ruler.prototype.enableOnly = function (list, ignoreInvalid) { + if (!Array.isArray(list)) { + list = [list]; } -} -var nonPassive = passiveSupported ? { - passive: false -} : false; -exports.nonPassive = nonPassive; + this.__rules__.forEach(function (rule) { + rule.enabled = false; + }); + this.enable(list, ignoreInvalid); +}; -/***/ }), +/** + * Ruler.disable(list [, ignoreInvalid]) -> Array + * - list (String|Array): list of rule names to disable. + * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found. + * + * Disable rules with given names. If any rule name not found - throw Error. + * Errors can be disabled by second param. + * + * Returns list of found rule names (if no exception happened). + * + * See also [[Ruler.enable]], [[Ruler.enableOnly]]. + **/ +Ruler.prototype.disable = function (list, ignoreInvalid) { + if (!Array.isArray(list)) { + list = [list]; + } + const result = []; -/***/ "../../../node_modules/react-remove-scroll/dist/es2015/handleScroll.js": -/*!*****************************************************************************!*\ - !*** ../../../node_modules/react-remove-scroll/dist/es2015/handleScroll.js ***! - \*****************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.locationCouldBeScrolled = exports.handleScroll = void 0; -var alwaysContainsScroll = function (node) { - // textarea will always _contain_ scroll inside self. It only can be hidden - return node.tagName === 'TEXTAREA'; -}; -var elementCanBeScrolled = function (node, overflow) { - var styles = window.getComputedStyle(node); - return ( - // not-not-scrollable - styles[overflow] !== 'hidden' && - // contains scroll inside self - !(styles.overflowY === styles.overflowX && !alwaysContainsScroll(node) && styles[overflow] === 'visible') - ); -}; -var elementCouldBeVScrolled = function (node) { - return elementCanBeScrolled(node, 'overflowY'); -}; -var elementCouldBeHScrolled = function (node) { - return elementCanBeScrolled(node, 'overflowX'); -}; -var locationCouldBeScrolled = function (axis, node) { - var current = node; - do { - // Skip over shadow root - if (typeof ShadowRoot !== 'undefined' && current instanceof ShadowRoot) { - current = current.host; - } - var isScrollable = elementCouldBeScrolled(axis, current); - if (isScrollable) { - var _a = getScrollVariables(axis, current), - s = _a[1], - d = _a[2]; - if (s > d) { - return true; - } - } - current = current.parentNode; - } while (current && current !== document.body); - return false; -}; -exports.locationCouldBeScrolled = locationCouldBeScrolled; -var getVScrollVariables = function (_a) { - var scrollTop = _a.scrollTop, - scrollHeight = _a.scrollHeight, - clientHeight = _a.clientHeight; - return [scrollTop, scrollHeight, clientHeight]; -}; -var getHScrollVariables = function (_a) { - var scrollLeft = _a.scrollLeft, - scrollWidth = _a.scrollWidth, - clientWidth = _a.clientWidth; - return [scrollLeft, scrollWidth, clientWidth]; -}; -var elementCouldBeScrolled = function (axis, node) { - return axis === 'v' ? elementCouldBeVScrolled(node) : elementCouldBeHScrolled(node); -}; -var getScrollVariables = function (axis, node) { - return axis === 'v' ? getVScrollVariables(node) : getHScrollVariables(node); -}; -var getDirectionFactor = function (axis, direction) { - /** - * If the element's direction is rtl (right-to-left), then scrollLeft is 0 when the scrollbar is at its rightmost position, - * and then increasingly negative as you scroll towards the end of the content. - * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeft - */ - return axis === 'h' && direction === 'rtl' ? -1 : 1; -}; -var handleScroll = function (axis, endTarget, event, sourceDelta, noOverscroll) { - var directionFactor = getDirectionFactor(axis, window.getComputedStyle(endTarget).direction); - var delta = directionFactor * sourceDelta; - // find scrollable target - var target = event.target; - var targetInLock = endTarget.contains(target); - var shouldCancelScroll = false; - var isDeltaPositive = delta > 0; - var availableScroll = 0; - var availableScrollTop = 0; - do { - var _a = getScrollVariables(axis, target), - position = _a[0], - scroll_1 = _a[1], - capacity = _a[2]; - var elementScroll = scroll_1 - capacity - directionFactor * position; - if (position || elementScroll) { - if (elementCouldBeScrolled(axis, target)) { - availableScroll += elementScroll; - availableScrollTop += position; + // Search by name and disable + list.forEach(function (name) { + const idx = this.__find__(name); + if (idx < 0) { + if (ignoreInvalid) { + return; } + throw new Error('Rules manager: invalid rule name ' + name); } - target = target.parentNode; - } while ( - // portaled content - !targetInLock && target !== document.body || - // self content - targetInLock && (endTarget.contains(target) || endTarget === target)); - if (isDeltaPositive && (noOverscroll && availableScroll === 0 || !noOverscroll && delta > availableScroll)) { - shouldCancelScroll = true; - } else if (!isDeltaPositive && (noOverscroll && availableScrollTop === 0 || !noOverscroll && -delta > availableScrollTop)) { - shouldCancelScroll = true; - } - return shouldCancelScroll; + this.__rules__[idx].enabled = false; + result.push(name); + }, this); + this.__cache__ = null; + return result; }; -exports.handleScroll = handleScroll; - -/***/ }), - -/***/ "../../../node_modules/react-remove-scroll/dist/es2015/index.js": -/*!**********************************************************************!*\ - !*** ../../../node_modules/react-remove-scroll/dist/es2015/index.js ***! - \**********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/** + * Ruler.getRules(chainName) -> Array + * + * Return array of active functions (rules) for given chain name. It analyzes + * rules configuration, compiles caches if not exists and returns result. + * + * Default chain name is `''` (empty string). It can't be skipped. That's + * done intentionally, to keep signature monomorphic for high speed. + **/ +Ruler.prototype.getRules = function (chainName) { + if (this.__cache__ === null) { + this.__compile__(); + } + // Chain can be empty, if rules disabled. But we still have to return Array. + return this.__cache__[chainName] || []; +}; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "RemoveScroll", ({ - enumerable: true, - get: function () { - return _Combination.default; - } -})); -var _Combination = _interopRequireDefault(__webpack_require__(/*! ./Combination */ "../../../node_modules/react-remove-scroll/dist/es2015/Combination.js")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +// Token class -/***/ }), +/** + * class Token + **/ -/***/ "../../../node_modules/react-remove-scroll/dist/es2015/medium.js": -/*!***********************************************************************!*\ - !*** ../../../node_modules/react-remove-scroll/dist/es2015/medium.js ***! - \***********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/** + * new Token(type, tag, nesting) + * + * Create new token and fill passed properties. + **/ +function Token(type, tag, nesting) { + /** + * Token#type -> String + * + * Type of the token (string, e.g. "paragraph_open") + **/ + this.type = type; + /** + * Token#tag -> String + * + * html tag name, e.g. "p" + **/ + this.tag = tag; + /** + * Token#attrs -> Array + * + * Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]` + **/ + this.attrs = null; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.effectCar = void 0; -var _useSidecar = __webpack_require__(/*! use-sidecar */ "../../../node_modules/use-sidecar/dist/es2015/index.js"); -var effectCar = (0, _useSidecar.createSidecarMedium)(); -exports.effectCar = effectCar; + /** + * Token#map -> Array + * + * Source map info. Format: `[ line_begin, line_end ]` + **/ + this.map = null; -/***/ }), + /** + * Token#nesting -> Number + * + * Level change (number in {-1, 0, 1} set), where: + * + * - `1` means the tag is opening + * - `0` means the tag is self-closing + * - `-1` means the tag is closing + **/ + this.nesting = nesting; -/***/ "../../../node_modules/react-remove-scroll/dist/es2015/sidecar.js": -/*!************************************************************************!*\ - !*** ../../../node_modules/react-remove-scroll/dist/es2015/sidecar.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + /** + * Token#level -> Number + * + * nesting level, the same as `state.level` + **/ + this.level = 0; + /** + * Token#children -> Array + * + * An array of child nodes (inline and img tokens) + **/ + this.children = null; + /** + * Token#content -> String + * + * In a case of self-closing tag (code, html, fence, etc.), + * it has contents of this tag. + **/ + this.content = ''; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; -var _useSidecar = __webpack_require__(/*! use-sidecar */ "../../../node_modules/use-sidecar/dist/es2015/index.js"); -var _SideEffect = __webpack_require__(/*! ./SideEffect */ "../../../node_modules/react-remove-scroll/dist/es2015/SideEffect.js"); -var _medium = __webpack_require__(/*! ./medium */ "../../../node_modules/react-remove-scroll/dist/es2015/medium.js"); -var _default = (0, _useSidecar.exportSidecar)(_medium.effectCar, _SideEffect.RemoveScrollSideCar); -exports["default"] = _default; + /** + * Token#markup -> String + * + * '*' or '_' for emphasis, fence string for fence, etc. + **/ + this.markup = ''; -/***/ }), + /** + * Token#info -> String + * + * Additional information: + * + * - Info string for "fence" tokens + * - The value "auto" for autolink "link_open" and "link_close" tokens + * - The string value of the item marker for ordered-list "list_item_open" tokens + **/ + this.info = ''; -/***/ "../../../node_modules/react-style-singleton/dist/es2015/component.js": -/*!****************************************************************************!*\ - !*** ../../../node_modules/react-style-singleton/dist/es2015/component.js ***! - \****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + /** + * Token#meta -> Object + * + * A place for plugins to store an arbitrary data + **/ + this.meta = null; + /** + * Token#block -> Boolean + * + * True for block-level tokens, false for inline tokens. + * Used in renderer to calculate line breaks + **/ + this.block = false; + /** + * Token#hidden -> Boolean + * + * If it's true, ignore this element when rendering. Used for tight lists + * to hide paragraphs. + **/ + this.hidden = false; +} -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.styleSingleton = void 0; -var _hook = __webpack_require__(/*! ./hook */ "../../../node_modules/react-style-singleton/dist/es2015/hook.js"); /** - * create a Component to add styles on demand - * - styles are added when first instance is mounted - * - styles are removed when the last instance is unmounted - * - changing styles in runtime does nothing unless dynamic is set. But with multiple components that can lead to the undefined behavior - */ -var styleSingleton = function () { - var useStyle = (0, _hook.styleHookSingleton)(); - var Sheet = function (_a) { - var styles = _a.styles, - dynamic = _a.dynamic; - useStyle(styles, dynamic); - return null; - }; - return Sheet; + * Token.attrIndex(name) -> Number + * + * Search attribute index by name. + **/ +Token.prototype.attrIndex = function attrIndex(name) { + if (!this.attrs) { + return -1; + } + const attrs = this.attrs; + for (let i = 0, len = attrs.length; i < len; i++) { + if (attrs[i][0] === name) { + return i; + } + } + return -1; }; -exports.styleSingleton = styleSingleton; - -/***/ }), - -/***/ "../../../node_modules/react-style-singleton/dist/es2015/hook.js": -/*!***********************************************************************!*\ - !*** ../../../node_modules/react-style-singleton/dist/es2015/hook.js ***! - \***********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.styleHookSingleton = void 0; -var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); -var _singleton = __webpack_require__(/*! ./singleton */ "../../../node_modules/react-style-singleton/dist/es2015/singleton.js"); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } /** - * creates a hook to control style singleton - * @see {@link styleSingleton} for a safer component version - * @example - * ```tsx - * const useStyle = styleHookSingleton(); - * /// - * useStyle('body { overflow: hidden}'); - */ -var styleHookSingleton = function () { - var sheet = (0, _singleton.stylesheetSingleton)(); - return function (styles, isDynamic) { - React.useEffect(function () { - sheet.add(styles); - return function () { - sheet.remove(); - }; - }, [styles && isDynamic]); - }; + * Token.attrPush(attrData) + * + * Add `[ name, value ]` attribute to list. Init attrs if necessary + **/ +Token.prototype.attrPush = function attrPush(attrData) { + if (this.attrs) { + this.attrs.push(attrData); + } else { + this.attrs = [attrData]; + } }; -exports.styleHookSingleton = styleHookSingleton; -/***/ }), +/** + * Token.attrSet(name, value) + * + * Set `name` attribute to `value`. Override old value if exists. + **/ +Token.prototype.attrSet = function attrSet(name, value) { + const idx = this.attrIndex(name); + const attrData = [name, value]; + if (idx < 0) { + this.attrPush(attrData); + } else { + this.attrs[idx] = attrData; + } +}; -/***/ "../../../node_modules/react-style-singleton/dist/es2015/index.js": -/*!************************************************************************!*\ - !*** ../../../node_modules/react-style-singleton/dist/es2015/index.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/** + * Token.attrGet(name) + * + * Get the value of attribute `name`, or null if it does not exist. + **/ +Token.prototype.attrGet = function attrGet(name) { + const idx = this.attrIndex(name); + let value = null; + if (idx >= 0) { + value = this.attrs[idx][1]; + } + return value; +}; +/** + * Token.attrJoin(name, value) + * + * Join value to existing attribute via space. Or create new attribute if not + * exists. Useful to operate with token classes. + **/ +Token.prototype.attrJoin = function attrJoin(name, value) { + const idx = this.attrIndex(name); + if (idx < 0) { + this.attrPush([name, value]); + } else { + this.attrs[idx][1] = this.attrs[idx][1] + ' ' + value; + } +}; +// Core state object +// -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "styleHookSingleton", ({ - enumerable: true, - get: function () { - return _hook.styleHookSingleton; - } -})); -Object.defineProperty(exports, "styleSingleton", ({ - enumerable: true, - get: function () { - return _component.styleSingleton; - } -})); -Object.defineProperty(exports, "stylesheetSingleton", ({ - enumerable: true, - get: function () { - return _singleton.stylesheetSingleton; - } -})); -var _component = __webpack_require__(/*! ./component */ "../../../node_modules/react-style-singleton/dist/es2015/component.js"); -var _singleton = __webpack_require__(/*! ./singleton */ "../../../node_modules/react-style-singleton/dist/es2015/singleton.js"); -var _hook = __webpack_require__(/*! ./hook */ "../../../node_modules/react-style-singleton/dist/es2015/hook.js"); +function StateCore(src, md, env) { + this.src = src; + this.env = env; + this.tokens = []; + this.inlineMode = false; + this.md = md; // link to parser instance +} -/***/ }), +// re-export Token class to use in core rules +StateCore.prototype.Token = Token; -/***/ "../../../node_modules/react-style-singleton/dist/es2015/singleton.js": -/*!****************************************************************************!*\ - !*** ../../../node_modules/react-style-singleton/dist/es2015/singleton.js ***! - \****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +// Normalize input string +// https://spec.commonmark.org/0.29/#line-ending +const NEWLINES_RE = /\r\n?|\n/g; +const NULL_RE = /\0/g; +function normalize(state) { + let str; + // Normalize newlines + str = state.src.replace(NEWLINES_RE, '\n'); -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.stylesheetSingleton = void 0; -var _getNonce = __webpack_require__(/*! get-nonce */ "../../../node_modules/get-nonce/dist/es2015/index.js"); -function makeStyleTag() { - if (!document) return null; - var tag = document.createElement('style'); - tag.type = 'text/css'; - var nonce = (0, _getNonce.getNonce)(); - if (nonce) { - tag.setAttribute('nonce', nonce); - } - return tag; + // Replace NULL characters + str = str.replace(NULL_RE, '\uFFFD'); + state.src = str; } -function injectStyles(tag, css) { - // @ts-ignore - if (tag.styleSheet) { - // @ts-ignore - tag.styleSheet.cssText = css; +function block(state) { + let token; + if (state.inlineMode) { + token = new state.Token('inline', '', 0); + token.content = state.src; + token.map = [0, 1]; + token.children = []; + state.tokens.push(token); } else { - tag.appendChild(document.createTextNode(css)); + state.md.block.parse(state.src, state.md, state.env, state.tokens); } } -function insertStyleTag(tag) { - var head = document.head || document.getElementsByTagName('head')[0]; - head.appendChild(tag); +function inline(state) { + const tokens = state.tokens; + + // Parse inlines + for (let i = 0, l = tokens.length; i < l; i++) { + const tok = tokens[i]; + if (tok.type === 'inline') { + state.md.inline.parse(tok.content, state.md, state.env, tok.children); + } + } } -var stylesheetSingleton = function () { - var counter = 0; - var stylesheet = null; - return { - add: function (style) { - if (counter == 0) { - if (stylesheet = makeStyleTag()) { - injectStyles(stylesheet, style); - insertStyleTag(stylesheet); - } - } - counter++; - }, - remove: function () { - counter--; - if (!counter && stylesheet) { - stylesheet.parentNode && stylesheet.parentNode.removeChild(stylesheet); - stylesheet = null; - } - } - }; -}; -exports.stylesheetSingleton = stylesheetSingleton; -/***/ }), +// Replace link-like texts with link nodes. +// +// Currently restricted by `md.validateLink()` to http/https/ftp +// -/***/ "../../../node_modules/react/cjs/react-jsx-runtime.development.js": -/*!************************************************************************!*\ - !*** ../../../node_modules/react/cjs/react-jsx-runtime.development.js ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +function isLinkOpen$1(str) { + return /^\s]/i.test(str); +} +function isLinkClose$1(str) { + return /^<\/a\s*>/i.test(str); +} +function linkify$1(state) { + const blockTokens = state.tokens; + if (!state.md.options.linkify) { + return; + } + for (let j = 0, l = blockTokens.length; j < l; j++) { + if (blockTokens[j].type !== 'inline' || !state.md.linkify.pretest(blockTokens[j].content)) { + continue; + } + let tokens = blockTokens[j].children; + let htmlLinkLevel = 0; -/** - * @license React - * react-jsx-runtime.development.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ + // We scan from the end, to keep position when new tags added. + // Use reversed logic in links start/end match + for (let i = tokens.length - 1; i >= 0; i--) { + const currentToken = tokens[i]; + // Skip content of markdown links + if (currentToken.type === 'link_close') { + i--; + while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') { + i--; + } + continue; + } + // Skip content of html tag links + if (currentToken.type === 'html_inline') { + if (isLinkOpen$1(currentToken.content) && htmlLinkLevel > 0) { + htmlLinkLevel--; + } + if (isLinkClose$1(currentToken.content)) { + htmlLinkLevel++; + } + } + if (htmlLinkLevel > 0) { + continue; + } + if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) { + const text = currentToken.content; + let links = state.md.linkify.match(text); -if (true) { - (function () { - 'use strict'; + // Now split string to nodes + const nodes = []; + let level = currentToken.level; + let lastPos = 0; - var React = __webpack_require__(/*! react */ "react"); + // forbid escape sequence at the start of the string, + // this avoids http\://example.com/ from being linkified as + // http://example.com/ + if (links.length > 0 && links[0].index === 0 && i > 0 && tokens[i - 1].type === 'text_special') { + links = links.slice(1); + } + for (let ln = 0; ln < links.length; ln++) { + const url = links[ln].url; + const fullUrl = state.md.normalizeLink(url); + if (!state.md.validateLink(fullUrl)) { + continue; + } + let urlText = links[ln].text; - // ATTENTION - // When adding new symbols to this file, - // Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' - // The Symbol used to tag the ReactElement-like types. - var REACT_ELEMENT_TYPE = Symbol.for('react.element'); - var REACT_PORTAL_TYPE = Symbol.for('react.portal'); - var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment'); - var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode'); - var REACT_PROFILER_TYPE = Symbol.for('react.profiler'); - var REACT_PROVIDER_TYPE = Symbol.for('react.provider'); - var REACT_CONTEXT_TYPE = Symbol.for('react.context'); - var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref'); - var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense'); - var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list'); - var REACT_MEMO_TYPE = Symbol.for('react.memo'); - var REACT_LAZY_TYPE = Symbol.for('react.lazy'); - var REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen'); - var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; - var FAUX_ITERATOR_SYMBOL = '@@iterator'; - function getIteratorFn(maybeIterable) { - if (maybeIterable === null || typeof maybeIterable !== 'object') { - return null; - } - var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; - if (typeof maybeIterator === 'function') { - return maybeIterator; - } - return null; - } - var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; - function error(format) { - { - { - for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; + // Linkifier might send raw hostnames like "example.com", where url + // starts with domain name. So we prepend http:// in those cases, + // and remove it afterwards. + // + if (!links[ln].schema) { + urlText = state.md.normalizeLinkText('http://' + urlText).replace(/^http:\/\//, ''); + } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) { + urlText = state.md.normalizeLinkText('mailto:' + urlText).replace(/^mailto:/, ''); + } else { + urlText = state.md.normalizeLinkText(urlText); } - printWarning('error', format, args); + const pos = links[ln].index; + if (pos > lastPos) { + const token = new state.Token('text', '', 0); + token.content = text.slice(lastPos, pos); + token.level = level; + nodes.push(token); + } + const token_o = new state.Token('link_open', 'a', 1); + token_o.attrs = [['href', fullUrl]]; + token_o.level = level++; + token_o.markup = 'linkify'; + token_o.info = 'auto'; + nodes.push(token_o); + const token_t = new state.Token('text', '', 0); + token_t.content = urlText; + token_t.level = level; + nodes.push(token_t); + const token_c = new state.Token('link_close', 'a', -1); + token_c.level = --level; + token_c.markup = 'linkify'; + token_c.info = 'auto'; + nodes.push(token_c); + lastPos = links[ln].lastIndex; + } + if (lastPos < text.length) { + const token = new state.Token('text', '', 0); + token.content = text.slice(lastPos); + token.level = level; + nodes.push(token); } + + // replace current node + blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, nodes); } } - function printWarning(level, format, args) { - // When changing this logic, you might want to also - // update consoleWithStackDev.www.js as well. - { - var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - var stack = ReactDebugCurrentFrame.getStackAddendum(); - if (stack !== '') { - format += '%s'; - args = args.concat([stack]); - } // eslint-disable-next-line react-internal/safe-string-coercion + } +} - var argsWithFormat = args.map(function (item) { - return String(item); - }); // Careful: RN currently depends on this prefix +// Simple typographic replacements +// +// (c) (C) → © +// (tm) (TM) → ™ +// (r) (R) → ® +// +- → ± +// ... → … (also ?.... → ?.., !.... → !..) +// ???????? → ???, !!!!! → !!!, `,,` → `,` +// -- → –, --- → — +// - argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it - // breaks IE9: https://github.com/facebook/react/issues/13610 - // eslint-disable-next-line react-internal/no-production-logging +// TODO: +// - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾ +// - multiplications 2 x 4 -> 2 × 4 - Function.prototype.apply.call(console[level], console, argsWithFormat); +const RARE_RE = /\+-|\.\.|\?\?\?\?|!!!!|,,|--/; + +// Workaround for phantomjs - need regex without /g flag, +// or root check will fail every second time +const SCOPED_ABBR_TEST_RE = /\((c|tm|r)\)/i; +const SCOPED_ABBR_RE = /\((c|tm|r)\)/ig; +const SCOPED_ABBR = { + c: '©', + r: '®', + tm: '™' +}; +function replaceFn(match, name) { + return SCOPED_ABBR[name.toLowerCase()]; +} +function replace_scoped(inlineTokens) { + let inside_autolink = 0; + for (let i = inlineTokens.length - 1; i >= 0; i--) { + const token = inlineTokens[i]; + if (token.type === 'text' && !inside_autolink) { + token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn); + } + if (token.type === 'link_open' && token.info === 'auto') { + inside_autolink--; + } + if (token.type === 'link_close' && token.info === 'auto') { + inside_autolink++; + } + } +} +function replace_rare(inlineTokens) { + let inside_autolink = 0; + for (let i = inlineTokens.length - 1; i >= 0; i--) { + const token = inlineTokens[i]; + if (token.type === 'text' && !inside_autolink) { + if (RARE_RE.test(token.content)) { + token.content = token.content.replace(/\+-/g, '±') + // .., ..., ....... -> … + // but ?..... & !..... -> ?.. & !.. + .replace(/\.{2,}/g, '…').replace(/([?!])…/g, '$1..').replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',') + // em-dash + .replace(/(^|[^-])---(?=[^-]|$)/mg, '$1\u2014') + // en-dash + .replace(/(^|\s)--(?=\s|$)/mg, '$1\u2013').replace(/(^|[^-\s])--(?=[^-\s]|$)/mg, '$1\u2013'); } } + if (token.type === 'link_open' && token.info === 'auto') { + inside_autolink--; + } + if (token.type === 'link_close' && token.info === 'auto') { + inside_autolink++; + } + } +} +function replace(state) { + let blkIdx; + if (!state.md.options.typographer) { + return; + } + for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) { + if (state.tokens[blkIdx].type !== 'inline') { + continue; + } + if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) { + replace_scoped(state.tokens[blkIdx].children); + } + if (RARE_RE.test(state.tokens[blkIdx].content)) { + replace_rare(state.tokens[blkIdx].children); + } + } +} - // ----------------------------------------------------------------------------- - - var enableScopeAPI = false; // Experimental Create Event Handle API. - var enableCacheElement = false; - var enableTransitionTracing = false; // No known bugs, but needs performance testing - - var enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber - // stuff. Intended to enable React core members to more easily debug scheduling - // issues in DEV builds. +// Convert straight quotation marks to typographic ones +// - var enableDebugTracing = false; // Track which Fiber(s) schedule render work. +const QUOTE_TEST_RE = /['"]/; +const QUOTE_RE = /['"]/g; +const APOSTROPHE = '\u2019'; /* ’ */ - var REACT_MODULE_REFERENCE; - { - REACT_MODULE_REFERENCE = Symbol.for('react.module.reference'); +function replaceAt(str, index, ch) { + return str.slice(0, index) + ch + str.slice(index + 1); +} +function process_inlines(tokens, state) { + let j; + const stack = []; + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i]; + const thisLevel = tokens[i].level; + for (j = stack.length - 1; j >= 0; j--) { + if (stack[j].level <= thisLevel) { + break; + } } - function isValidElementType(type) { - if (typeof type === 'string' || typeof type === 'function') { - return true; - } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + stack.length = j + 1; + if (token.type !== 'text') { + continue; + } + let text = token.content; + let pos = 0; + let max = text.length; - if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing) { - return true; + /* eslint no-labels:0,block-scoped-var:0 */ + OUTER: while (pos < max) { + QUOTE_RE.lastIndex = pos; + const t = QUOTE_RE.exec(text); + if (!t) { + break; } - if (typeof type === 'object' && type !== null) { - if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || - // This needs to include all possible module reference object - // types supported by any Flight configuration anywhere since - // we don't know which Flight build this will end up being used - // with. - type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) { - return true; + let canOpen = true; + let canClose = true; + pos = t.index + 1; + const isSingle = t[0] === "'"; + + // Find previous character, + // default to space if it's the beginning of the line + // + let lastChar = 0x20; + if (t.index - 1 >= 0) { + lastChar = text.charCodeAt(t.index - 1); + } else { + for (j = i - 1; j >= 0; j--) { + if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // lastChar defaults to 0x20 + if (!tokens[j].content) continue; // should skip all tokens except 'text', 'html_inline' or 'code_inline' + + lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1); + break; } } - return false; - } - function getWrappedName(outerType, innerType, wrapperName) { - var displayName = outerType.displayName; - if (displayName) { - return displayName; - } - var functionName = innerType.displayName || innerType.name || ''; - return functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName; - } // Keep in sync with react-reconciler/getComponentNameFromFiber - function getContextName(type) { - return type.displayName || 'Context'; - } // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead. + // Find next character, + // default to space if it's the end of the line + // + let nextChar = 0x20; + if (pos < max) { + nextChar = text.charCodeAt(pos); + } else { + for (j = i + 1; j < tokens.length; j++) { + if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // nextChar defaults to 0x20 + if (!tokens[j].content) continue; // should skip all tokens except 'text', 'html_inline' or 'code_inline' - function getComponentNameFromType(type) { - if (type == null) { - // Host root, text node or just invalid type. - return null; + nextChar = tokens[j].content.charCodeAt(0); + break; + } } - { - if (typeof type.tag === 'number') { - error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.'); + const isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar)); + const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar)); + const isLastWhiteSpace = isWhiteSpace(lastChar); + const isNextWhiteSpace = isWhiteSpace(nextChar); + if (isNextWhiteSpace) { + canOpen = false; + } else if (isNextPunctChar) { + if (!(isLastWhiteSpace || isLastPunctChar)) { + canOpen = false; } } - if (typeof type === 'function') { - return type.displayName || type.name || null; + if (isLastWhiteSpace) { + canClose = false; + } else if (isLastPunctChar) { + if (!(isNextWhiteSpace || isNextPunctChar)) { + canClose = false; + } } - if (typeof type === 'string') { - return type; + if (nextChar === 0x22 /* " */ && t[0] === '"') { + if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) { + // special case: 1"" - count first quote as an inch + canClose = canOpen = false; + } } - switch (type) { - case REACT_FRAGMENT_TYPE: - return 'Fragment'; - case REACT_PORTAL_TYPE: - return 'Portal'; - case REACT_PROFILER_TYPE: - return 'Profiler'; - case REACT_STRICT_MODE_TYPE: - return 'StrictMode'; - case REACT_SUSPENSE_TYPE: - return 'Suspense'; - case REACT_SUSPENSE_LIST_TYPE: - return 'SuspenseList'; + if (canOpen && canClose) { + // Replace quotes in the middle of punctuation sequence, but not + // in the middle of the words, i.e.: + // + // 1. foo " bar " baz - not replaced + // 2. foo-"-bar-"-baz - replaced + // 3. foo"bar"baz - not replaced + // + canOpen = isLastPunctChar; + canClose = isNextPunctChar; } - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_CONTEXT_TYPE: - var context = type; - return getContextName(context) + '.Consumer'; - case REACT_PROVIDER_TYPE: - var provider = type; - return getContextName(provider._context) + '.Provider'; - case REACT_FORWARD_REF_TYPE: - return getWrappedName(type, type.render, 'ForwardRef'); - case REACT_MEMO_TYPE: - var outerName = type.displayName || null; - if (outerName !== null) { - return outerName; - } - return getComponentNameFromType(type.type) || 'Memo'; - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - try { - return getComponentNameFromType(init(payload)); - } catch (x) { - return null; - } + if (!canOpen && !canClose) { + // middle of word + if (isSingle) { + token.content = replaceAt(token.content, t.index, APOSTROPHE); + } + continue; + } + if (canClose) { + // this could be a closing quote, rewind the stack to get a match + for (j = stack.length - 1; j >= 0; j--) { + let item = stack[j]; + if (stack[j].level < thisLevel) { + break; + } + if (item.single === isSingle && stack[j].level === thisLevel) { + item = stack[j]; + let openQuote; + let closeQuote; + if (isSingle) { + openQuote = state.md.options.quotes[2]; + closeQuote = state.md.options.quotes[3]; + } else { + openQuote = state.md.options.quotes[0]; + closeQuote = state.md.options.quotes[1]; } - // eslint-disable-next-line no-fallthrough + // replace token.content *before* tokens[item.token].content, + // because, if they are pointing at the same token, replaceAt + // could mess up indices when quote length != 1 + token.content = replaceAt(token.content, t.index, closeQuote); + tokens[item.token].content = replaceAt(tokens[item.token].content, item.pos, openQuote); + pos += closeQuote.length - 1; + if (item.token === i) { + pos += openQuote.length - 1; + } + text = token.content; + max = text.length; + stack.length = j; + continue OUTER; + } } } - - return null; + if (canOpen) { + stack.push({ + token: i, + pos: t.index, + single: isSingle, + level: thisLevel + }); + } else if (canClose && isSingle) { + token.content = replaceAt(token.content, t.index, APOSTROPHE); + } } - var assign = Object.assign; - - // Helpers to patch console.logs to avoid logging during side-effect free - // replaying on render function. This currently only patches the object - // lazily which won't cover if the log function was extracted eagerly. - // We could also eagerly patch the method. - var disabledDepth = 0; - var prevLog; - var prevInfo; - var prevWarn; - var prevError; - var prevGroup; - var prevGroupCollapsed; - var prevGroupEnd; - function disabledLog() {} - disabledLog.__reactDisabledLog = true; - function disableLogs() { - { - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - prevLog = console.log; - prevInfo = console.info; - prevWarn = console.warn; - prevError = console.error; - prevGroup = console.group; - prevGroupCollapsed = console.groupCollapsed; - prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 - - var props = { - configurable: true, - enumerable: true, - value: disabledLog, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. - - Object.defineProperties(console, { - info: props, - log: props, - warn: props, - error: props, - group: props, - groupCollapsed: props, - groupEnd: props - }); - /* eslint-enable react-internal/no-production-logging */ - } - - disabledDepth++; - } + } +} +function smartquotes(state) { + /* eslint max-depth:0 */ + if (!state.md.options.typographer) { + return; + } + for (let blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) { + if (state.tokens[blkIdx].type !== 'inline' || !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) { + continue; } - function reenableLogs() { - { - disabledDepth--; - if (disabledDepth === 0) { - /* eslint-disable react-internal/no-production-logging */ - var props = { - configurable: true, - enumerable: true, - writable: true - }; // $FlowFixMe Flow thinks console is immutable. + process_inlines(state.tokens[blkIdx].children, state); + } +} - Object.defineProperties(console, { - log: assign({}, props, { - value: prevLog - }), - info: assign({}, props, { - value: prevInfo - }), - warn: assign({}, props, { - value: prevWarn - }), - error: assign({}, props, { - value: prevError - }), - group: assign({}, props, { - value: prevGroup - }), - groupCollapsed: assign({}, props, { - value: prevGroupCollapsed - }), - groupEnd: assign({}, props, { - value: prevGroupEnd - }) - }); - /* eslint-enable react-internal/no-production-logging */ - } +// Join raw text tokens with the rest of the text +// +// This is set as a separate rule to provide an opportunity for plugins +// to run text replacements after text join, but before escape join. +// +// For example, `\:)` shouldn't be replaced with an emoji. +// - if (disabledDepth < 0) { - error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); - } +function text_join(state) { + let curr, last; + const blockTokens = state.tokens; + const l = blockTokens.length; + for (let j = 0; j < l; j++) { + if (blockTokens[j].type !== 'inline') continue; + const tokens = blockTokens[j].children; + const max = tokens.length; + for (curr = 0; curr < max; curr++) { + if (tokens[curr].type === 'text_special') { + tokens[curr].type = 'text'; } } - var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; - var prefix; - function describeBuiltInComponentFrame(name, source, ownerFn) { - { - if (prefix === undefined) { - // Extract the VM specific prefix used by each line. - try { - throw Error(); - } catch (x) { - var match = x.stack.trim().match(/\n( *(at )?)/); - prefix = match && match[1] || ''; - } - } // We use the prefix to ensure our stacks line up with native stack frames. - - return '\n' + prefix + name; + for (curr = last = 0; curr < max; curr++) { + if (tokens[curr].type === 'text' && curr + 1 < max && tokens[curr + 1].type === 'text') { + // collapse two adjacent text nodes + tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content; + } else { + if (curr !== last) { + tokens[last] = tokens[curr]; + } + last++; } } - var reentry = false; - var componentFrameCache; - { - var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; - componentFrameCache = new PossiblyWeakMap(); + if (curr !== last) { + tokens.length = last; } - function describeNativeComponentFrame(fn, construct) { - // If something asked for a stack inside a fake render, it should get ignored. - if (!fn || reentry) { - return ''; - } - { - var frame = componentFrameCache.get(fn); - if (frame !== undefined) { - return frame; - } - } - var control; - reentry = true; - var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. + } +} - Error.prepareStackTrace = undefined; - var previousDispatcher; - { - previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function - // for warnings. +/** internal + * class Core + * + * Top-level rules executor. Glues block/inline parsers and does intermediate + * transformations. + **/ - ReactCurrentDispatcher.current = null; - disableLogs(); - } - try { - // This should throw. - if (construct) { - // Something should be setting the props in the constructor. - var Fake = function () { - throw Error(); - }; // $FlowFixMe +const _rules$2 = [['normalize', normalize], ['block', block], ['inline', inline], ['linkify', linkify$1], ['replacements', replace], ['smartquotes', smartquotes], +// `text_join` finds `text_special` tokens (for escape sequences) +// and joins them with the rest of the text +['text_join', text_join]]; - Object.defineProperty(Fake.prototype, 'props', { - set: function () { - // We use a throwing setter instead of frozen or non-writable props - // because that won't throw in a non-strict mode function. - throw Error(); - } - }); - if (typeof Reflect === 'object' && Reflect.construct) { - // We construct a different control for this case to include any extra - // frames added by the construct call. - try { - Reflect.construct(Fake, []); - } catch (x) { - control = x; - } - Reflect.construct(fn, [], Fake); - } else { - try { - Fake.call(); - } catch (x) { - control = x; - } - fn.call(Fake.prototype); - } - } else { - try { - throw Error(); - } catch (x) { - control = x; - } - fn(); - } - } catch (sample) { - // This is inlined manually because closure doesn't do it for us. - if (sample && control && typeof sample.stack === 'string') { - // This extracts the first frame from the sample that isn't also in the control. - // Skipping one frame that we assume is the frame that calls the two. - var sampleLines = sample.stack.split('\n'); - var controlLines = control.stack.split('\n'); - var s = sampleLines.length - 1; - var c = controlLines.length - 1; - while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { - // We expect at least one stack frame to be shared. - // Typically this will be the root most one. However, stack frames may be - // cut off due to maximum stack limits. In this case, one maybe cut off - // earlier than the other. We assume that the sample is longer or the same - // and there for cut off earlier. So we should find the root most frame in - // the sample somewhere in the control. - c--; - } - for (; s >= 1 && c >= 0; s--, c--) { - // Next we find the first one that isn't the same which should be the - // frame that called our sample function and the control. - if (sampleLines[s] !== controlLines[c]) { - // In V8, the first line is describing the message but other VMs don't. - // If we're about to return the first line, and the control is also on the same - // line, that's a pretty good indicator that our sample threw at same line as - // the control. I.e. before we entered the sample frame. So we ignore this result. - // This can happen if you passed a class to function component, or non-function. - if (s !== 1 || c !== 1) { - do { - s--; - c--; // We may still have similar intermediate frames from the construct call. - // The next one that isn't the same should be our match though. +/** + * new Core() + **/ +function Core() { + /** + * Core#ruler -> Ruler + * + * [[Ruler]] instance. Keep configuration of core rules. + **/ + this.ruler = new Ruler(); + for (let i = 0; i < _rules$2.length; i++) { + this.ruler.push(_rules$2[i][0], _rules$2[i][1]); + } +} - if (c < 0 || sampleLines[s] !== controlLines[c]) { - // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. - var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled "" - // but we have a user-provided "displayName" - // splice it in to make the stack more readable. +/** + * Core.process(state) + * + * Executes core chain rules. + **/ +Core.prototype.process = function (state) { + const rules = this.ruler.getRules(''); + for (let i = 0, l = rules.length; i < l; i++) { + rules[i](state); + } +}; +Core.prototype.State = StateCore; - if (fn.displayName && _frame.includes('')) { - _frame = _frame.replace('', fn.displayName); - } - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, _frame); - } - } // Return the line we found. +// Parser state class - return _frame; - } - } while (s >= 1 && c >= 0); - } - break; - } - } - } - } finally { - reentry = false; - { - ReactCurrentDispatcher.current = previousDispatcher; - reenableLogs(); - } - Error.prepareStackTrace = previousPrepareStackTrace; - } // Fallback to just using the name if we couldn't make it throw. +function StateBlock(src, md, env, tokens) { + this.src = src; - var name = fn ? fn.displayName || fn.name : ''; - var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; - { - if (typeof fn === 'function') { - componentFrameCache.set(fn, syntheticFrame); + // link to parser instance + this.md = md; + this.env = env; + + // + // Internal state vartiables + // + + this.tokens = tokens; + this.bMarks = []; // line begin offsets for fast jumps + this.eMarks = []; // line end offsets for fast jumps + this.tShift = []; // offsets of the first non-space characters (tabs not expanded) + this.sCount = []; // indents for each line (tabs expanded) + + // An amount of virtual spaces (tabs expanded) between beginning + // of each line (bMarks) and real beginning of that line. + // + // It exists only as a hack because blockquotes override bMarks + // losing information in the process. + // + // It's used only when expanding tabs, you can think about it as + // an initial tab length, e.g. bsCount=21 applied to string `\t123` + // means first tab should be expanded to 4-21%4 === 3 spaces. + // + this.bsCount = []; + + // block parser variables + + // required block content indent (for example, if we are + // inside a list, it would be positioned after list marker) + this.blkIndent = 0; + this.line = 0; // line index in src + this.lineMax = 0; // lines count + this.tight = false; // loose/tight mode for lists + this.ddIndent = -1; // indent of the current dd block (-1 if there isn't any) + this.listIndent = -1; // indent of the current list block (-1 if there isn't any) + + // can be 'blockquote', 'list', 'root', 'paragraph' or 'reference' + // used in lists to determine if they interrupt a paragraph + this.parentType = 'root'; + this.level = 0; + + // Create caches + // Generate markers. + const s = this.src; + for (let start = 0, pos = 0, indent = 0, offset = 0, len = s.length, indent_found = false; pos < len; pos++) { + const ch = s.charCodeAt(pos); + if (!indent_found) { + if (isSpace(ch)) { + indent++; + if (ch === 0x09) { + offset += 4 - offset % 4; + } else { + offset++; } + continue; + } else { + indent_found = true; } - return syntheticFrame; } - function describeFunctionComponentFrame(fn, source, ownerFn) { - { - return describeNativeComponentFrame(fn, false); + if (ch === 0x0A || pos === len - 1) { + if (ch !== 0x0A) { + pos++; } + this.bMarks.push(start); + this.eMarks.push(pos); + this.tShift.push(indent); + this.sCount.push(offset); + this.bsCount.push(0); + indent_found = false; + indent = 0; + offset = 0; + start = pos + 1; } - function shouldConstruct(Component) { - var prototype = Component.prototype; - return !!(prototype && prototype.isReactComponent); + } + + // Push fake entry to simplify cache bounds checks + this.bMarks.push(s.length); + this.eMarks.push(s.length); + this.tShift.push(0); + this.sCount.push(0); + this.bsCount.push(0); + this.lineMax = this.bMarks.length - 1; // don't count last fake line +} + +// Push new token to "stream". +// +StateBlock.prototype.push = function (type, tag, nesting) { + const token = new Token(type, tag, nesting); + token.block = true; + if (nesting < 0) this.level--; // closing tag + token.level = this.level; + if (nesting > 0) this.level++; // opening tag + + this.tokens.push(token); + return token; +}; +StateBlock.prototype.isEmpty = function isEmpty(line) { + return this.bMarks[line] + this.tShift[line] >= this.eMarks[line]; +}; +StateBlock.prototype.skipEmptyLines = function skipEmptyLines(from) { + for (let max = this.lineMax; from < max; from++) { + if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) { + break; } - function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { - if (type == null) { - return ''; - } - if (typeof type === 'function') { - { - return describeNativeComponentFrame(type, shouldConstruct(type)); - } - } - if (typeof type === 'string') { - return describeBuiltInComponentFrame(type); - } - switch (type) { - case REACT_SUSPENSE_TYPE: - return describeBuiltInComponentFrame('Suspense'); - case REACT_SUSPENSE_LIST_TYPE: - return describeBuiltInComponentFrame('SuspenseList'); - } - if (typeof type === 'object') { - switch (type.$$typeof) { - case REACT_FORWARD_REF_TYPE: - return describeFunctionComponentFrame(type.render); - case REACT_MEMO_TYPE: - // Memo may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); - case REACT_LAZY_TYPE: - { - var lazyComponent = type; - var payload = lazyComponent._payload; - var init = lazyComponent._init; - try { - // Lazy may contain any component type so we recursively resolve it. - return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); - } catch (x) {} - } - } - } - return ''; + } + return from; +}; + +// Skip spaces from given position. +StateBlock.prototype.skipSpaces = function skipSpaces(pos) { + for (let max = this.src.length; pos < max; pos++) { + const ch = this.src.charCodeAt(pos); + if (!isSpace(ch)) { + break; } - var hasOwnProperty = Object.prototype.hasOwnProperty; - var loggedTypeFailures = {}; - var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; - function setCurrentlyValidatingElement(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - ReactDebugCurrentFrame.setExtraStackFrame(stack); - } else { - ReactDebugCurrentFrame.setExtraStackFrame(null); - } - } + } + return pos; +}; + +// Skip spaces from given position in reverse. +StateBlock.prototype.skipSpacesBack = function skipSpacesBack(pos, min) { + if (pos <= min) { + return pos; + } + while (pos > min) { + if (!isSpace(this.src.charCodeAt(--pos))) { + return pos + 1; } - function checkPropTypes(typeSpecs, values, location, componentName, element) { - { - // $FlowFixMe This is okay but Flow doesn't know it. - var has = Function.call.bind(hasOwnProperty); - for (var typeSpecName in typeSpecs) { - if (has(typeSpecs, typeSpecName)) { - var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. + } + return pos; +}; - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - if (typeof typeSpecs[typeSpecName] !== 'function') { - // eslint-disable-next-line react-internal/prod-error-codes - var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); - err.name = 'Invariant Violation'; - throw err; - } - error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); - } catch (ex) { - error$1 = ex; - } - if (error$1 && !(error$1 instanceof Error)) { - setCurrentlyValidatingElement(element); - error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); - setCurrentlyValidatingElement(null); - } - if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error$1.message] = true; - setCurrentlyValidatingElement(element); - error('Failed %s type: %s', location, error$1.message); - setCurrentlyValidatingElement(null); - } - } - } - } +// Skip char codes from given position +StateBlock.prototype.skipChars = function skipChars(pos, code) { + for (let max = this.src.length; pos < max; pos++) { + if (this.src.charCodeAt(pos) !== code) { + break; } - var isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare + } + return pos; +}; - function isArray(a) { - return isArrayImpl(a); +// Skip char codes reverse from given position - 1 +StateBlock.prototype.skipCharsBack = function skipCharsBack(pos, code, min) { + if (pos <= min) { + return pos; + } + while (pos > min) { + if (code !== this.src.charCodeAt(--pos)) { + return pos + 1; } + } + return pos; +}; - /* - * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol - * and Temporal.* types. See https://github.com/facebook/react/pull/22064. - * - * The functions in this module will throw an easier-to-understand, - * easier-to-debug exception with a clear errors message message explaining the - * problem. (Instead of a confusing exception thrown inside the implementation - * of the `value` object). - */ - // $FlowFixMe only called in DEV, so void return is not possible. - function typeName(value) { - { - // toStringTag is needed for namespaced types like Temporal.Instant - var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag; - var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object'; - return type; - } - } // $FlowFixMe only called in DEV, so void return is not possible. - - function willCoercionThrow(value) { - { - try { - testStringCoercion(value); - return false; - } catch (e) { - return true; +// cut lines range from source. +StateBlock.prototype.getLines = function getLines(begin, end, indent, keepLastLF) { + if (begin >= end) { + return ''; + } + const queue = new Array(end - begin); + for (let i = 0, line = begin; line < end; line++, i++) { + let lineIndent = 0; + const lineStart = this.bMarks[line]; + let first = lineStart; + let last; + if (line + 1 < end || keepLastLF) { + // No need for bounds check because we have fake entry on tail. + last = this.eMarks[line] + 1; + } else { + last = this.eMarks[line]; + } + while (first < last && lineIndent < indent) { + const ch = this.src.charCodeAt(first); + if (isSpace(ch)) { + if (ch === 0x09) { + lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4; + } else { + lineIndent++; } + } else if (first - lineStart < this.tShift[line]) { + // patched tShift masked characters to look like spaces (blockquotes, list markers) + lineIndent++; + } else { + break; } + first++; } - function testStringCoercion(value) { - // If you ended up here by following an exception call stack, here's what's - // happened: you supplied an object or symbol value to React (as a prop, key, - // DOM attribute, CSS property, string ref, etc.) and when React tried to - // coerce it to a string using `'' + value`, an exception was thrown. - // - // The most common types that will cause this exception are `Symbol` instances - // and Temporal objects like `Temporal.Instant`. But any object that has a - // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this - // exception. (Library authors do this to prevent users from using built-in - // numeric operators like `+` or comparison operators like `>=` because custom - // methods are needed to perform accurate arithmetic or comparison.) - // - // To fix the problem, coerce this object or symbol value to a string before - // passing it to React. The most reliable way is usually `String(value)`. - // - // To find which value is throwing, check the browser or debugger console. - // Before this exception was thrown, there should be `console.error` output - // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the - // problem and how that type was used: key, atrribute, input value prop, etc. - // In most cases, this console output also shows the component and its - // ancestor components where the exception happened. - // - // eslint-disable-next-line react-internal/safe-string-coercion - return '' + value; + if (lineIndent > indent) { + // partially expanding tabs in code blocks, e.g '\t\tfoobar' + // with indent=2 becomes ' \tfoobar' + queue[i] = new Array(lineIndent - indent + 1).join(' ') + this.src.slice(first, last); + } else { + queue[i] = this.src.slice(first, last); } - function checkKeyStringCoercion(value) { - { - if (willCoercionThrow(value)) { - error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value)); - return testStringCoercion(value); // throw (to help callers find troubleshooting comments) - } + } + return queue.join(''); +}; + +// re-export Token class to use in block rules +StateBlock.prototype.Token = Token; + +// GFM table, https://github.github.com/gfm/#tables-extension- + +// Limit the amount of empty autocompleted cells in a table, +// see https://github.com/markdown-it/markdown-it/issues/1000, +// +// Both pulldown-cmark and commonmark-hs limit the number of cells this way to ~200k. +// We set it to 65k, which can expand user input by a factor of x370 +// (256x256 square is 1.8kB expanded into 650kB). +const MAX_AUTOCOMPLETED_CELLS = 0x10000; +function getLine(state, line) { + const pos = state.bMarks[line] + state.tShift[line]; + const max = state.eMarks[line]; + return state.src.slice(pos, max); +} +function escapedSplit(str) { + const result = []; + const max = str.length; + let pos = 0; + let ch = str.charCodeAt(pos); + let isEscaped = false; + let lastPos = 0; + let current = ''; + while (pos < max) { + if (ch === 0x7c /* | */) { + if (!isEscaped) { + // pipe separating cells, '|' + result.push(current + str.substring(lastPos, pos)); + current = ''; + lastPos = pos + 1; + } else { + // escaped pipe, '\|' + current += str.substring(lastPos, pos - 1); + lastPos = pos; } } + isEscaped = ch === 0x5c /* \ */; + pos++; + ch = str.charCodeAt(pos); + } + result.push(current + str.substring(lastPos)); + return result; +} +function table(state, startLine, endLine, silent) { + // should have at least two lines + if (startLine + 2 > endLine) { + return false; + } + let nextLine = startLine + 1; + if (state.sCount[nextLine] < state.blkIndent) { + return false; + } - var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner; - var RESERVED_PROPS = { - key: true, - ref: true, - __self: true, - __source: true - }; - var specialPropKeyWarningShown; - var specialPropRefWarningShown; - var didWarnAboutStringRefs; - { - didWarnAboutStringRefs = {}; + // if it's indented more than 3 spaces, it should be a code block + if (state.sCount[nextLine] - state.blkIndent >= 4) { + return false; + } + + // first character of the second line should be '|', '-', ':', + // and no other characters are allowed but spaces; + // basically, this is the equivalent of /^[-:|][-:|\s]*$/ regexp + + let pos = state.bMarks[nextLine] + state.tShift[nextLine]; + if (pos >= state.eMarks[nextLine]) { + return false; + } + const firstCh = state.src.charCodeAt(pos++); + if (firstCh !== 0x7C /* | */ && firstCh !== 0x2D /* - */ && firstCh !== 0x3A /* : */) { + return false; + } + if (pos >= state.eMarks[nextLine]) { + return false; + } + const secondCh = state.src.charCodeAt(pos++); + if (secondCh !== 0x7C /* | */ && secondCh !== 0x2D /* - */ && secondCh !== 0x3A /* : */ && !isSpace(secondCh)) { + return false; + } + + // if first character is '-', then second character must not be a space + // (due to parsing ambiguity with list) + if (firstCh === 0x2D /* - */ && isSpace(secondCh)) { + return false; + } + while (pos < state.eMarks[nextLine]) { + const ch = state.src.charCodeAt(pos); + if (ch !== 0x7C /* | */ && ch !== 0x2D /* - */ && ch !== 0x3A /* : */ && !isSpace(ch)) { + return false; } - function hasValidRef(config) { - { - if (hasOwnProperty.call(config, 'ref')) { - var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; - if (getter && getter.isReactWarning) { - return false; - } - } + pos++; + } + let lineText = getLine(state, startLine + 1); + let columns = lineText.split('|'); + const aligns = []; + for (let i = 0; i < columns.length; i++) { + const t = columns[i].trim(); + if (!t) { + // allow empty columns before and after table, but not in between columns; + // e.g. allow ` |---| `, disallow ` ---||--- ` + if (i === 0 || i === columns.length - 1) { + continue; + } else { + return false; } - return config.ref !== undefined; } - function hasValidKey(config) { - { - if (hasOwnProperty.call(config, 'key')) { - var getter = Object.getOwnPropertyDescriptor(config, 'key').get; - if (getter && getter.isReactWarning) { - return false; - } - } - } - return config.key !== undefined; + if (!/^:?-+:?$/.test(t)) { + return false; } - function warnIfStringRefCannotBeAutoConverted(config, self) { - { - if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) { - var componentName = getComponentNameFromType(ReactCurrentOwner.current.type); - if (!didWarnAboutStringRefs[componentName]) { - error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref); - didWarnAboutStringRefs[componentName] = true; - } - } - } + if (t.charCodeAt(t.length - 1) === 0x3A /* : */) { + aligns.push(t.charCodeAt(0) === 0x3A /* : */ ? 'center' : 'right'); + } else if (t.charCodeAt(0) === 0x3A /* : */) { + aligns.push('left'); + } else { + aligns.push(''); } - function defineKeyPropWarningGetter(props, displayName) { - { - var warnAboutAccessingKey = function () { - if (!specialPropKeyWarningShown) { - specialPropKeyWarningShown = true; - error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); - } - }; - warnAboutAccessingKey.isReactWarning = true; - Object.defineProperty(props, 'key', { - get: warnAboutAccessingKey, - configurable: true - }); + } + lineText = getLine(state, startLine).trim(); + if (lineText.indexOf('|') === -1) { + return false; + } + if (state.sCount[startLine] - state.blkIndent >= 4) { + return false; + } + columns = escapedSplit(lineText); + if (columns.length && columns[0] === '') columns.shift(); + if (columns.length && columns[columns.length - 1] === '') columns.pop(); + + // header row will define an amount of columns in the entire table, + // and align row should be exactly the same (the rest of the rows can differ) + const columnCount = columns.length; + if (columnCount === 0 || columnCount !== aligns.length) { + return false; + } + if (silent) { + return true; + } + const oldParentType = state.parentType; + state.parentType = 'table'; + + // use 'blockquote' lists for termination because it's + // the most similar to tables + const terminatorRules = state.md.block.ruler.getRules('blockquote'); + const token_to = state.push('table_open', 'table', 1); + const tableLines = [startLine, 0]; + token_to.map = tableLines; + const token_tho = state.push('thead_open', 'thead', 1); + token_tho.map = [startLine, startLine + 1]; + const token_htro = state.push('tr_open', 'tr', 1); + token_htro.map = [startLine, startLine + 1]; + for (let i = 0; i < columns.length; i++) { + const token_ho = state.push('th_open', 'th', 1); + if (aligns[i]) { + token_ho.attrs = [['style', 'text-align:' + aligns[i]]]; + } + const token_il = state.push('inline', '', 0); + token_il.content = columns[i].trim(); + token_il.children = []; + state.push('th_close', 'th', -1); + } + state.push('tr_close', 'tr', -1); + state.push('thead_close', 'thead', -1); + let tbodyLines; + let autocompletedCells = 0; + for (nextLine = startLine + 2; nextLine < endLine; nextLine++) { + if (state.sCount[nextLine] < state.blkIndent) { + break; + } + let terminate = false; + for (let i = 0, l = terminatorRules.length; i < l; i++) { + if (terminatorRules[i](state, nextLine, endLine, true)) { + terminate = true; + break; } } - function defineRefPropWarningGetter(props, displayName) { - { - var warnAboutAccessingRef = function () { - if (!specialPropRefWarningShown) { - specialPropRefWarningShown = true; - error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); - } - }; - warnAboutAccessingRef.isReactWarning = true; - Object.defineProperty(props, 'ref', { - get: warnAboutAccessingRef, - configurable: true - }); + if (terminate) { + break; + } + lineText = getLine(state, nextLine).trim(); + if (!lineText) { + break; + } + if (state.sCount[nextLine] - state.blkIndent >= 4) { + break; + } + columns = escapedSplit(lineText); + if (columns.length && columns[0] === '') columns.shift(); + if (columns.length && columns[columns.length - 1] === '') columns.pop(); + + // note: autocomplete count can be negative if user specifies more columns than header, + // but that does not affect intended use (which is limiting expansion) + autocompletedCells += columnCount - columns.length; + if (autocompletedCells > MAX_AUTOCOMPLETED_CELLS) { + break; + } + if (nextLine === startLine + 2) { + const token_tbo = state.push('tbody_open', 'tbody', 1); + token_tbo.map = tbodyLines = [startLine + 2, 0]; + } + const token_tro = state.push('tr_open', 'tr', 1); + token_tro.map = [nextLine, nextLine + 1]; + for (let i = 0; i < columnCount; i++) { + const token_tdo = state.push('td_open', 'td', 1); + if (aligns[i]) { + token_tdo.attrs = [['style', 'text-align:' + aligns[i]]]; } + const token_il = state.push('inline', '', 0); + token_il.content = columns[i] ? columns[i].trim() : ''; + token_il.children = []; + state.push('td_close', 'td', -1); } - /** - * Factory method to create a new React element. This no longer adheres to - * the class pattern, so do not use new to call it. Also, instanceof check - * will not work. Instead test $$typeof field against Symbol.for('react.element') to check - * if something is a React Element. - * - * @param {*} type - * @param {*} props - * @param {*} key - * @param {string|object} ref - * @param {*} owner - * @param {*} self A *temporary* helper to detect places where `this` is - * different from the `owner` when React.createElement is called, so that we - * can warn. We want to get rid of owner and replace string `ref`s with arrow - * functions, and as long as `this` and owner are the same, there will be no - * change in behavior. - * @param {*} source An annotation object (added by a transpiler or otherwise) - * indicating filename, line number, and/or other information. - * @internal - */ + state.push('tr_close', 'tr', -1); + } + if (tbodyLines) { + state.push('tbody_close', 'tbody', -1); + tbodyLines[1] = nextLine; + } + state.push('table_close', 'table', -1); + tableLines[1] = nextLine; + state.parentType = oldParentType; + state.line = nextLine; + return true; +} - var ReactElement = function (type, key, ref, self, source, owner, props) { - var element = { - // This tag allows us to uniquely identify this as a React Element - $$typeof: REACT_ELEMENT_TYPE, - // Built-in properties that belong on the element - type: type, - key: key, - ref: ref, - props: props, - // Record the component responsible for creating this element. - _owner: owner - }; - { - // The validation flag is currently mutative. We put it on - // an external backing store so that we can freeze the whole object. - // This can be replaced with a WeakMap once they are implemented in - // commonly used development environments. - element._store = {}; // To make comparing ReactElements easier for testing purposes, we make - // the validation flag non-enumerable (where possible, which should - // include every environment we run tests in), so the test framework - // ignores it. +// Code block (4 spaces padded) - Object.defineProperty(element._store, 'validated', { - configurable: false, - enumerable: false, - writable: true, - value: false - }); // self and source are DEV only properties. +function code(state, startLine, endLine /*, silent */) { + if (state.sCount[startLine] - state.blkIndent < 4) { + return false; + } + let nextLine = startLine + 1; + let last = nextLine; + while (nextLine < endLine) { + if (state.isEmpty(nextLine)) { + nextLine++; + continue; + } + if (state.sCount[nextLine] - state.blkIndent >= 4) { + nextLine++; + last = nextLine; + continue; + } + break; + } + state.line = last; + const token = state.push('code_block', 'code', 0); + token.content = state.getLines(startLine, last, 4 + state.blkIndent, false) + '\n'; + token.map = [startLine, state.line]; + return true; +} - Object.defineProperty(element, '_self', { - configurable: false, - enumerable: false, - writable: false, - value: self - }); // Two elements created in two different places should be considered - // equal for testing purposes and therefore we hide it from enumeration. +// fences (``` lang, ~~~ lang) - Object.defineProperty(element, '_source', { - configurable: false, - enumerable: false, - writable: false, - value: source - }); - if (Object.freeze) { - Object.freeze(element.props); - Object.freeze(element); - } - } - return element; - }; - /** - * https://github.com/reactjs/rfcs/pull/107 - * @param {*} type - * @param {object} props - * @param {string} key - */ - - function jsxDEV(type, config, maybeKey, source, self) { - { - var propName; // Reserved names are extracted +function fence(state, startLine, endLine, silent) { + let pos = state.bMarks[startLine] + state.tShift[startLine]; + let max = state.eMarks[startLine]; - var props = {}; - var key = null; - var ref = null; // Currently, key can be spread in as a prop. This causes a potential - // issue if key is also explicitly declared (ie.
- // or
). We want to deprecate key spread, - // but as an intermediary step, we will use jsxDEV for everything except - //
, because we aren't currently able to tell if - // key is explicitly declared to be undefined or not. + // if it's indented more than 3 spaces, it should be a code block + if (state.sCount[startLine] - state.blkIndent >= 4) { + return false; + } + if (pos + 3 > max) { + return false; + } + const marker = state.src.charCodeAt(pos); + if (marker !== 0x7E /* ~ */ && marker !== 0x60 /* ` */) { + return false; + } - if (maybeKey !== undefined) { - { - checkKeyStringCoercion(maybeKey); - } - key = '' + maybeKey; - } - if (hasValidKey(config)) { - { - checkKeyStringCoercion(config.key); - } - key = '' + config.key; - } - if (hasValidRef(config)) { - ref = config.ref; - warnIfStringRefCannotBeAutoConverted(config, self); - } // Remaining properties are added to a new props object + // scan marker length + let mem = pos; + pos = state.skipChars(pos, marker); + let len = pos - mem; + if (len < 3) { + return false; + } + const markup = state.src.slice(mem, pos); + const params = state.src.slice(pos, max); + if (marker === 0x60 /* ` */) { + if (params.indexOf(String.fromCharCode(marker)) >= 0) { + return false; + } + } - for (propName in config) { - if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - props[propName] = config[propName]; - } - } // Resolve default props + // Since start is found, we can report success here in validation mode + if (silent) { + return true; + } - if (type && type.defaultProps) { - var defaultProps = type.defaultProps; - for (propName in defaultProps) { - if (props[propName] === undefined) { - props[propName] = defaultProps[propName]; - } - } - } - if (key || ref) { - var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; - if (key) { - defineKeyPropWarningGetter(props, displayName); - } - if (ref) { - defineRefPropWarningGetter(props, displayName); - } - } - return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); - } - } - var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner; - var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; - function setCurrentlyValidatingElement$1(element) { - { - if (element) { - var owner = element._owner; - var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); - ReactDebugCurrentFrame$1.setExtraStackFrame(stack); - } else { - ReactDebugCurrentFrame$1.setExtraStackFrame(null); - } - } + // search end of block + let nextLine = startLine; + let haveEndMarker = false; + for (;;) { + nextLine++; + if (nextLine >= endLine) { + // unclosed block should be autoclosed by end of document. + // also block seems to be autoclosed by end of parent + break; } - var propTypesMisspellWarningShown; - { - propTypesMisspellWarningShown = false; + pos = mem = state.bMarks[nextLine] + state.tShift[nextLine]; + max = state.eMarks[nextLine]; + if (pos < max && state.sCount[nextLine] < state.blkIndent) { + // non-empty line with negative indent should stop the list: + // - ``` + // test + break; } - /** - * Verifies the object is a ReactElement. - * See https://reactjs.org/docs/react-api.html#isvalidelement - * @param {?object} object - * @return {boolean} True if `object` is a ReactElement. - * @final - */ - - function isValidElement(object) { - { - return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; - } + if (state.src.charCodeAt(pos) !== marker) { + continue; } - function getDeclarationErrorAddendum() { - { - if (ReactCurrentOwner$1.current) { - var name = getComponentNameFromType(ReactCurrentOwner$1.current.type); - if (name) { - return '\n\nCheck the render method of `' + name + '`.'; - } - } - return ''; - } + if (state.sCount[nextLine] - state.blkIndent >= 4) { + // closing fence should be indented less than 4 spaces + continue; } - function getSourceInfoErrorAddendum(source) { - { - if (source !== undefined) { - var fileName = source.fileName.replace(/^.*[\\\/]/, ''); - var lineNumber = source.lineNumber; - return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; - } - return ''; - } + pos = state.skipChars(pos, marker); + + // closing code fence must be at least as long as the opening one + if (pos - mem < len) { + continue; } - /** - * Warn if there's no key explicitly set on dynamic arrays of children or - * object keys are not valid. This allows us to keep track of children between - * updates. - */ - var ownerHasKeyUseWarning = {}; - function getCurrentComponentErrorInfo(parentType) { - { - var info = getDeclarationErrorAddendum(); - if (!info) { - var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; - if (parentName) { - info = "\n\nCheck the top-level render call using <" + parentName + ">."; - } - } - return info; - } + // make sure tail has spaces only + pos = state.skipSpaces(pos); + if (pos < max) { + continue; } - /** - * Warn if the element doesn't have an explicit key assigned to it. - * This element is in an array. The array could grow and shrink or be - * reordered. All children that haven't already been validated are required to - * have a "key" property assigned to it. Error statuses are cached so a warning - * will only be shown once. - * - * @internal - * @param {ReactElement} element Element that requires a key. - * @param {*} parentType element's parent's type. - */ + haveEndMarker = true; + // found! + break; + } - function validateExplicitKey(element, parentType) { - { - if (!element._store || element._store.validated || element.key != null) { - return; - } - element._store.validated = true; - var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); - if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { - return; - } - ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a - // property, it may be the creator of the child that's responsible for - // assigning it a key. + // If a fence has heading spaces, they should be removed from its inner block + len = state.sCount[startLine]; + state.line = nextLine + (haveEndMarker ? 1 : 0); + const token = state.push('fence', 'code', 0); + token.info = params; + token.content = state.getLines(startLine + 1, nextLine, len, true); + token.markup = markup; + token.map = [startLine, state.line]; + return true; +} - var childOwner = ''; - if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) { - // Give the component that originally created this child. - childOwner = " It was passed a child from " + getComponentNameFromType(element._owner.type) + "."; - } - setCurrentlyValidatingElement$1(element); - error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); - setCurrentlyValidatingElement$1(null); - } +// Block quotes + +function blockquote(state, startLine, endLine, silent) { + let pos = state.bMarks[startLine] + state.tShift[startLine]; + let max = state.eMarks[startLine]; + const oldLineMax = state.lineMax; + + // if it's indented more than 3 spaces, it should be a code block + if (state.sCount[startLine] - state.blkIndent >= 4) { + return false; + } + + // check the block quote marker + if (state.src.charCodeAt(pos) !== 0x3E /* > */) { + return false; + } + + // we know that it's going to be a valid blockquote, + // so no point trying to find the end of it in silent mode + if (silent) { + return true; + } + const oldBMarks = []; + const oldBSCount = []; + const oldSCount = []; + const oldTShift = []; + const terminatorRules = state.md.block.ruler.getRules('blockquote'); + const oldParentType = state.parentType; + state.parentType = 'blockquote'; + let lastLineEmpty = false; + let nextLine; + + // Search the end of the block + // + // Block ends with either: + // 1. an empty line outside: + // ``` + // > test + // + // ``` + // 2. an empty line inside: + // ``` + // > + // test + // ``` + // 3. another tag: + // ``` + // > test + // - - - + // ``` + for (nextLine = startLine; nextLine < endLine; nextLine++) { + // check if it's outdented, i.e. it's inside list item and indented + // less than said list item: + // + // ``` + // 1. anything + // > current blockquote + // 2. checking this line + // ``` + const isOutdented = state.sCount[nextLine] < state.blkIndent; + pos = state.bMarks[nextLine] + state.tShift[nextLine]; + max = state.eMarks[nextLine]; + if (pos >= max) { + // Case 1: line is not inside the blockquote, and this line is empty. + break; } - /** - * Ensure that every element either is passed in a static location, in an - * array with an explicit keys property defined, or in an object literal - * with valid key property. - * - * @internal - * @param {ReactNode} node Statically passed child of any type. - * @param {*} parentType node's parent's type. - */ + if (state.src.charCodeAt(pos++) === 0x3E /* > */ && !isOutdented) { + // This line is inside the blockquote. - function validateChildKeys(node, parentType) { - { - if (typeof node !== 'object') { - return; + // set offset past spaces and ">" + let initial = state.sCount[nextLine] + 1; + let spaceAfterMarker; + let adjustTab; + + // skip one optional space after '>' + if (state.src.charCodeAt(pos) === 0x20 /* space */) { + // ' > test ' + // ^ -- position start of line here: + pos++; + initial++; + adjustTab = false; + spaceAfterMarker = true; + } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) { + spaceAfterMarker = true; + if ((state.bsCount[nextLine] + initial) % 4 === 3) { + // ' >\t test ' + // ^ -- position start of line here (tab has width===1) + pos++; + initial++; + adjustTab = false; + } else { + // ' >\t test ' + // ^ -- position start of line here + shift bsCount slightly + // to make extra space appear + adjustTab = true; } - if (isArray(node)) { - for (var i = 0; i < node.length; i++) { - var child = node[i]; - if (isValidElement(child)) { - validateExplicitKey(child, parentType); - } - } - } else if (isValidElement(node)) { - // This element was passed in a valid location. - if (node._store) { - node._store.validated = true; - } - } else if (node) { - var iteratorFn = getIteratorFn(node); - if (typeof iteratorFn === 'function') { - // Entry iterators used to provide implicit keys, - // but now we print a separate warning for them later. - if (iteratorFn !== node.entries) { - var iterator = iteratorFn.call(node); - var step; - while (!(step = iterator.next()).done) { - if (isValidElement(step.value)) { - validateExplicitKey(step.value, parentType); - } - } - } + } else { + spaceAfterMarker = false; + } + let offset = initial; + oldBMarks.push(state.bMarks[nextLine]); + state.bMarks[nextLine] = pos; + while (pos < max) { + const ch = state.src.charCodeAt(pos); + if (isSpace(ch)) { + if (ch === 0x09) { + offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4; + } else { + offset++; } + } else { + break; } + pos++; } + lastLineEmpty = pos >= max; + oldBSCount.push(state.bsCount[nextLine]); + state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0); + oldSCount.push(state.sCount[nextLine]); + state.sCount[nextLine] = offset - initial; + oldTShift.push(state.tShift[nextLine]); + state.tShift[nextLine] = pos - state.bMarks[nextLine]; + continue; } - /** - * Given an element, validate that its props follow the propTypes definition, - * provided by the type. - * - * @param {ReactElement} element - */ - function validatePropTypes(element) { - { - var type = element.type; - if (type === null || type === undefined || typeof type === 'string') { - return; - } - var propTypes; - if (typeof type === 'function') { - propTypes = type.propTypes; - } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || - // Note: Memo only checks outer props here. - // Inner props are checked in the reconciler. - type.$$typeof === REACT_MEMO_TYPE)) { - propTypes = type.propTypes; - } else { - return; - } - if (propTypes) { - // Intentionally inside to avoid triggering lazy initializers: - var name = getComponentNameFromType(type); - checkPropTypes(propTypes, element.props, 'prop', name, element); - } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { - propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: + // Case 2: line is not inside the blockquote, and the last line was empty. + if (lastLineEmpty) { + break; + } - var _name = getComponentNameFromType(type); - error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); - } - if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { - error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); - } + // Case 3: another tag found. + let terminate = false; + for (let i = 0, l = terminatorRules.length; i < l; i++) { + if (terminatorRules[i](state, nextLine, endLine, true)) { + terminate = true; + break; } } - /** - * Given a fragment, validate that it can only be provided with fragment props - * @param {ReactElement} fragment - */ - - function validateFragmentProps(fragment) { - { - var keys = Object.keys(fragment.props); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (key !== 'children' && key !== 'key') { - setCurrentlyValidatingElement$1(fragment); - error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); - setCurrentlyValidatingElement$1(null); - break; - } - } - if (fragment.ref !== null) { - setCurrentlyValidatingElement$1(fragment); - error('Invalid attribute `ref` supplied to `React.Fragment`.'); - setCurrentlyValidatingElement$1(null); - } + if (terminate) { + // Quirk to enforce "hard termination mode" for paragraphs; + // normally if you call `tokenize(state, startLine, nextLine)`, + // paragraphs will look below nextLine for paragraph continuation, + // but if blockquote is terminated by another tag, they shouldn't + state.lineMax = nextLine; + if (state.blkIndent !== 0) { + // state.blkIndent was non-zero, we now set it to zero, + // so we need to re-calculate all offsets to appear as + // if indent wasn't changed + oldBMarks.push(state.bMarks[nextLine]); + oldBSCount.push(state.bsCount[nextLine]); + oldTShift.push(state.tShift[nextLine]); + oldSCount.push(state.sCount[nextLine]); + state.sCount[nextLine] -= state.blkIndent; } + break; } - function jsxWithValidation(type, props, key, isStaticChildren, source, self) { - { - var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to - // succeed and there will likely be errors in render. - - if (!validType) { - var info = ''; - if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { - info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; - } - var sourceInfo = getSourceInfoErrorAddendum(source); - if (sourceInfo) { - info += sourceInfo; - } else { - info += getDeclarationErrorAddendum(); - } - var typeString; - if (type === null) { - typeString = 'null'; - } else if (isArray(type)) { - typeString = 'array'; - } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { - typeString = "<" + (getComponentNameFromType(type.type) || 'Unknown') + " />"; - info = ' Did you accidentally export a JSX literal instead of a component?'; - } else { - typeString = typeof type; - } - error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); - } - var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used. - // TODO: Drop this when these are no longer allowed as the type argument. + oldBMarks.push(state.bMarks[nextLine]); + oldBSCount.push(state.bsCount[nextLine]); + oldTShift.push(state.tShift[nextLine]); + oldSCount.push(state.sCount[nextLine]); - if (element == null) { - return element; - } // Skip key warning if the type isn't valid since our key validation logic - // doesn't expect a non-string/function type and can throw confusing errors. - // We don't want exception behavior to differ between dev and prod. - // (Rendering will throw with a helpful message and as soon as the type is - // fixed, the key warnings will appear.) + // A negative indentation means that this is a paragraph continuation + // + state.sCount[nextLine] = -1; + } + const oldIndent = state.blkIndent; + state.blkIndent = 0; + const token_o = state.push('blockquote_open', 'blockquote', 1); + token_o.markup = '>'; + const lines = [startLine, 0]; + token_o.map = lines; + state.md.block.tokenize(state, startLine, nextLine); + const token_c = state.push('blockquote_close', 'blockquote', -1); + token_c.markup = '>'; + state.lineMax = oldLineMax; + state.parentType = oldParentType; + lines[1] = state.line; - if (validType) { - var children = props.children; - if (children !== undefined) { - if (isStaticChildren) { - if (isArray(children)) { - for (var i = 0; i < children.length; i++) { - validateChildKeys(children[i], type); - } - if (Object.freeze) { - Object.freeze(children); - } - } else { - error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.'); - } - } else { - validateChildKeys(children, type); - } - } - } - if (type === REACT_FRAGMENT_TYPE) { - validateFragmentProps(element); - } else { - validatePropTypes(element); - } - return element; - } - } // These two functions exist to still get child warnings in dev - // even with the prod transform. This means that jsxDEV is purely - // opt-in behavior for better messages but that we won't stop - // giving you warnings if you use production apis. + // Restore original tShift; this might not be necessary since the parser + // has already been here, but just to make sure we can do that. + for (let i = 0; i < oldTShift.length; i++) { + state.bMarks[i + startLine] = oldBMarks[i]; + state.tShift[i + startLine] = oldTShift[i]; + state.sCount[i + startLine] = oldSCount[i]; + state.bsCount[i + startLine] = oldBSCount[i]; + } + state.blkIndent = oldIndent; + return true; +} - function jsxWithValidationStatic(type, props, key) { - { - return jsxWithValidation(type, props, key, true); - } +// Horizontal rule + +function hr(state, startLine, endLine, silent) { + const max = state.eMarks[startLine]; + // if it's indented more than 3 spaces, it should be a code block + if (state.sCount[startLine] - state.blkIndent >= 4) { + return false; + } + let pos = state.bMarks[startLine] + state.tShift[startLine]; + const marker = state.src.charCodeAt(pos++); + + // Check hr marker + if (marker !== 0x2A /* * */ && marker !== 0x2D /* - */ && marker !== 0x5F /* _ */) { + return false; + } + + // markers can be mixed with spaces, but there should be at least 3 of them + + let cnt = 1; + while (pos < max) { + const ch = state.src.charCodeAt(pos++); + if (ch !== marker && !isSpace(ch)) { + return false; } - function jsxWithValidationDynamic(type, props, key) { - { - return jsxWithValidation(type, props, key, false); - } + if (ch === marker) { + cnt++; } - var jsx = jsxWithValidationDynamic; // we may want to special case jsxs internally to take advantage of static children. - // for now we can ship identical prod functions - - var jsxs = jsxWithValidationStatic; - exports.Fragment = REACT_FRAGMENT_TYPE; - exports.jsx = jsx; - exports.jsxs = jsxs; - })(); + } + if (cnt < 3) { + return false; + } + if (silent) { + return true; + } + state.line = startLine + 1; + const token = state.push('hr', 'hr', 0); + token.map = [startLine, state.line]; + token.markup = Array(cnt + 1).join(String.fromCharCode(marker)); + return true; } -/***/ }), +// Lists -/***/ "../../../node_modules/react/jsx-runtime.js": -/*!**************************************************!*\ - !*** ../../../node_modules/react/jsx-runtime.js ***! - \**************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +// Search `[-+*][\n ]`, returns next pos after marker on success +// or -1 on fail. +function skipBulletListMarker(state, startLine) { + const max = state.eMarks[startLine]; + let pos = state.bMarks[startLine] + state.tShift[startLine]; + const marker = state.src.charCodeAt(pos++); + // Check bullet + if (marker !== 0x2A /* * */ && marker !== 0x2D /* - */ && marker !== 0x2B /* + */) { + return -1; + } + if (pos < max) { + const ch = state.src.charCodeAt(pos); + if (!isSpace(ch)) { + // " -test " - is not a list item + return -1; + } + } + return pos; +} +// Search `\d+[.)][\n ]`, returns next pos after marker on success +// or -1 on fail. +function skipOrderedListMarker(state, startLine) { + const start = state.bMarks[startLine] + state.tShift[startLine]; + const max = state.eMarks[startLine]; + let pos = start; + // List marker should have at least 2 chars (digit + dot) + if (pos + 1 >= max) { + return -1; + } + let ch = state.src.charCodeAt(pos++); + if (ch < 0x30 /* 0 */ || ch > 0x39 /* 9 */) { + return -1; + } + for (;;) { + // EOL -> fail + if (pos >= max) { + return -1; + } + ch = state.src.charCodeAt(pos++); + if (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) { + // List marker should have no more than 9 digits + // (prevents integer overflow in browsers) + if (pos - start >= 10) { + return -1; + } + continue; + } -if (false) {} else { - module.exports = __webpack_require__(/*! ./cjs/react-jsx-runtime.development.js */ "../../../node_modules/react/cjs/react-jsx-runtime.development.js"); + // found valid marker + if (ch === 0x29 /* ) */ || ch === 0x2e /* . */) { + break; + } + return -1; + } + if (pos < max) { + ch = state.src.charCodeAt(pos); + if (!isSpace(ch)) { + // " 1.test " - is not a list item + return -1; + } + } + return pos; +} +function markTightParagraphs(state, idx) { + const level = state.level + 2; + for (let i = idx + 2, l = state.tokens.length - 2; i < l; i++) { + if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') { + state.tokens[i + 2].hidden = true; + state.tokens[i].hidden = true; + i += 2; + } + } } +function list(state, startLine, endLine, silent) { + let max, pos, start, token; + let nextLine = startLine; + let tight = true; -/***/ }), + // if it's indented more than 3 spaces, it should be a code block + if (state.sCount[nextLine] - state.blkIndent >= 4) { + return false; + } -/***/ "../../../node_modules/set-value/index.js": -/*!************************************************!*\ - !*** ../../../node_modules/set-value/index.js ***! - \************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + // Special case: + // - item 1 + // - item 2 + // - item 3 + // - item 4 + // - this one is a paragraph continuation + if (state.listIndent >= 0 && state.sCount[nextLine] - state.listIndent >= 4 && state.sCount[nextLine] < state.blkIndent) { + return false; + } + let isTerminatingParagraph = false; -/*! - * set-value - * - * Copyright (c) Jon Schlinkert (https://github.com/jonschlinkert). - * Released under the MIT License. - */ + // limit conditions when list can interrupt + // a paragraph (validation mode only) + if (silent && state.parentType === 'paragraph') { + // Next list item should still terminate previous list item; + // + // This code can fail if plugins use blkIndent as well as lists, + // but I hope the spec gets fixed long before that happens. + // + if (state.sCount[nextLine] >= state.blkIndent) { + isTerminatingParagraph = true; + } + } + // Detect list type and position after marker + let isOrdered; + let markerValue; + let posAfterMarker; + if ((posAfterMarker = skipOrderedListMarker(state, nextLine)) >= 0) { + isOrdered = true; + start = state.bMarks[nextLine] + state.tShift[nextLine]; + markerValue = Number(state.src.slice(start, posAfterMarker - 1)); + // If we're starting a new ordered list right after + // a paragraph, it should start with 1. + if (isTerminatingParagraph && markerValue !== 1) return false; + } else if ((posAfterMarker = skipBulletListMarker(state, nextLine)) >= 0) { + isOrdered = false; + } else { + return false; + } -const { - deleteProperty -} = Reflect; -const isPrimitive = __webpack_require__(/*! is-primitive */ "../../../node_modules/is-primitive/index.js"); -const isPlainObject = __webpack_require__(/*! is-plain-object */ "../../../node_modules/is-plain-object/index.js"); -const isObject = value => { - return typeof value === 'object' && value !== null || typeof value === 'function'; -}; -const isUnsafeKey = key => { - return key === '__proto__' || key === 'constructor' || key === 'prototype'; -}; -const validateKey = key => { - if (!isPrimitive(key)) { - throw new TypeError('Object keys must be strings or symbols'); + // If we're starting a new unordered list right after + // a paragraph, first line should not be empty. + if (isTerminatingParagraph) { + if (state.skipSpaces(posAfterMarker) >= state.eMarks[nextLine]) return false; } - if (isUnsafeKey(key)) { - throw new Error(`Cannot set unsafe key: "${key}"`); + + // For validation mode we can terminate immediately + if (silent) { + return true; } -}; -const toStringKey = input => { - return Array.isArray(input) ? input.flat().map(String).join(',') : input; -}; -const createMemoKey = (input, options) => { - if (typeof input !== 'string' || !options) return input; - let key = input + ';'; - if (options.arrays !== undefined) key += `arrays=${options.arrays};`; - if (options.separator !== undefined) key += `separator=${options.separator};`; - if (options.split !== undefined) key += `split=${options.split};`; - if (options.merge !== undefined) key += `merge=${options.merge};`; - if (options.preservePaths !== undefined) key += `preservePaths=${options.preservePaths};`; - return key; -}; -const memoize = (input, options, fn) => { - const key = toStringKey(options ? createMemoKey(input, options) : input); - validateKey(key); - const value = setValue.cache.get(key) || fn(); - setValue.cache.set(key, value); - return value; -}; -const splitString = function (input) { - let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - const sep = options.separator || '.'; - const preserve = sep === '/' ? false : options.preservePaths; - if (typeof input === 'string' && preserve !== false && /\//.test(input)) { - return [input]; + + // We should terminate list on style change. Remember first one to compare. + const markerCharCode = state.src.charCodeAt(posAfterMarker - 1); + + // Start list + const listTokIdx = state.tokens.length; + if (isOrdered) { + token = state.push('ordered_list_open', 'ol', 1); + if (markerValue !== 1) { + token.attrs = [['start', markerValue]]; + } + } else { + token = state.push('bullet_list_open', 'ul', 1); } - const parts = []; - let part = ''; - const push = part => { - let number; - if (part.trim() !== '' && Number.isInteger(number = Number(part))) { - parts.push(number); + const listLines = [nextLine, 0]; + token.map = listLines; + token.markup = String.fromCharCode(markerCharCode); + + // + // Iterate list items + // + + let prevEmptyEnd = false; + const terminatorRules = state.md.block.ruler.getRules('list'); + const oldParentType = state.parentType; + state.parentType = 'list'; + while (nextLine < endLine) { + pos = posAfterMarker; + max = state.eMarks[nextLine]; + const initial = state.sCount[nextLine] + posAfterMarker - (state.bMarks[nextLine] + state.tShift[nextLine]); + let offset = initial; + while (pos < max) { + const ch = state.src.charCodeAt(pos); + if (ch === 0x09) { + offset += 4 - (offset + state.bsCount[nextLine]) % 4; + } else if (ch === 0x20) { + offset++; + } else { + break; + } + pos++; + } + const contentStart = pos; + let indentAfterMarker; + if (contentStart >= max) { + // trimming space in "- \n 3" case, indent is 1 here + indentAfterMarker = 1; } else { - parts.push(part); + indentAfterMarker = offset - initial; } - }; - for (let i = 0; i < input.length; i++) { - const value = input[i]; - if (value === '\\') { - part += input[++i]; - continue; + + // If we have more than 4 spaces, the indent is 1 + // (the rest is just indented code block) + if (indentAfterMarker > 4) { + indentAfterMarker = 1; } - if (value === sep) { - push(part); - part = ''; - continue; + + // " - test" + // ^^^^^ - calculating total length of this thing + const indent = initial + indentAfterMarker; + + // Run subparser & write tokens + token = state.push('list_item_open', 'li', 1); + token.markup = String.fromCharCode(markerCharCode); + const itemLines = [nextLine, 0]; + token.map = itemLines; + if (isOrdered) { + token.info = state.src.slice(start, posAfterMarker - 1); } - part += value; - } - if (part) { - push(part); - } - return parts; -}; -const split = (input, options) => { - if (options && typeof options.split === 'function') return options.split(input); - if (typeof input === 'symbol') return [input]; - if (Array.isArray(input)) return input; - return memoize(input, options, () => splitString(input, options)); -}; -const assignProp = (obj, prop, value, options) => { - validateKey(prop); - // Delete property when "value" is undefined - if (value === undefined) { - deleteProperty(obj, prop); - } else if (options && options.merge) { - const merge = options.merge === 'function' ? options.merge : Object.assign; + // change current state, then restore it after parser subcall + const oldTight = state.tight; + const oldTShift = state.tShift[nextLine]; + const oldSCount = state.sCount[nextLine]; - // Only merge plain objects - if (merge && isPlainObject(obj[prop]) && isPlainObject(value)) { - obj[prop] = merge(obj[prop], value); + // - example list + // ^ listIndent position will be here + // ^ blkIndent position will be here + // + const oldListIndent = state.listIndent; + state.listIndent = state.blkIndent; + state.blkIndent = indent; + state.tight = true; + state.tShift[nextLine] = contentStart - state.bMarks[nextLine]; + state.sCount[nextLine] = offset; + if (contentStart >= max && state.isEmpty(nextLine + 1)) { + // workaround for this case + // (list item is empty, list terminates before "foo"): + // ~~~~~~~~ + // - + // + // foo + // ~~~~~~~~ + state.line = Math.min(state.line + 2, endLine); } else { - obj[prop] = value; - } - } else { - obj[prop] = value; - } - return obj; -}; -const setValue = (target, path, value, options) => { - if (!path || !isObject(target)) return target; - const keys = split(path, options); - let obj = target; - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - const next = keys[i + 1]; - validateKey(key); - if (next === undefined) { - assignProp(obj, key, value, options); - break; + state.md.block.tokenize(state, nextLine, endLine, true); } - if (typeof next === 'number' && !Array.isArray(obj[key])) { - obj = obj[key] = []; - continue; + + // If any of list item is tight, mark list as tight + if (!state.tight || prevEmptyEnd) { + tight = false; } - if (!isObject(obj[key])) { - obj[key] = {}; + // Item become loose if finish with empty line, + // but we should filter last element, because it means list finish + prevEmptyEnd = state.line - nextLine > 1 && state.isEmpty(state.line - 1); + state.blkIndent = state.listIndent; + state.listIndent = oldListIndent; + state.tShift[nextLine] = oldTShift; + state.sCount[nextLine] = oldSCount; + state.tight = oldTight; + token = state.push('list_item_close', 'li', -1); + token.markup = String.fromCharCode(markerCharCode); + nextLine = state.line; + itemLines[1] = nextLine; + if (nextLine >= endLine) { + break; } - obj = obj[key]; - } - return target; -}; -setValue.split = split; -setValue.cache = new Map(); -setValue.clear = () => { - setValue.cache = new Map(); -}; -module.exports = setValue; - -/***/ }), -/***/ "../../../node_modules/style-value-types/dist/valueTypes.cjs.js": -/*!**********************************************************************!*\ - !*** ../../../node_modules/style-value-types/dist/valueTypes.cjs.js ***! - \**********************************************************************/ -/***/ (function(__unused_webpack_module, exports) { + // + // Try to check if list is terminated or continued. + // + if (state.sCount[nextLine] < state.blkIndent) { + break; + } + // if it's indented more than 3 spaces, it should be a code block + if (state.sCount[nextLine] - state.blkIndent >= 4) { + break; + } + // fail if terminating block found + let terminate = false; + for (let i = 0, l = terminatorRules.length; i < l; i++) { + if (terminatorRules[i](state, nextLine, endLine, true)) { + terminate = true; + break; + } + } + if (terminate) { + break; + } -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -const clamp = (min, max) => v => Math.max(Math.min(v, max), min); -const sanitize = v => v % 1 ? Number(v.toFixed(5)) : v; -const floatRegex = /(-)?([\d]*\.?[\d])+/g; -const colorRegex = /(#[0-9a-f]{6}|#[0-9a-f]{3}|#(?:[0-9a-f]{2}){2,4}|(rgb|hsl)a?\((-?[\d\.]+%?[,\s]+){2,3}\s*\/*\s*[\d\.]+%?\))/gi; -const singleColorRegex = /^(#[0-9a-f]{3}|#(?:[0-9a-f]{2}){2,4}|(rgb|hsl)a?\((-?[\d\.]+%?[,\s]+){2,3}\s*\/*\s*[\d\.]+%?\))$/i; -function isString(v) { - return typeof v === 'string'; -} -const number = { - test: v => typeof v === 'number', - parse: parseFloat, - transform: v => v -}; -const alpha = Object.assign(Object.assign({}, number), { - transform: clamp(0, 1) -}); -const scale = Object.assign(Object.assign({}, number), { - default: 1 -}); -const createUnitType = unit => ({ - test: v => isString(v) && v.endsWith(unit) && v.split(' ').length === 1, - parse: parseFloat, - transform: v => `${v}${unit}` -}); -const degrees = createUnitType('deg'); -const percent = createUnitType('%'); -const px = createUnitType('px'); -const vh = createUnitType('vh'); -const vw = createUnitType('vw'); -const progressPercentage = Object.assign(Object.assign({}, percent), { - parse: v => percent.parse(v) / 100, - transform: v => percent.transform(v * 100) -}); -const isColorString = (type, testProp) => v => { - return Boolean(isString(v) && singleColorRegex.test(v) && v.startsWith(type) || testProp && Object.prototype.hasOwnProperty.call(v, testProp)); -}; -const splitColor = (aName, bName, cName) => v => { - if (!isString(v)) return v; - const [a, b, c, alpha] = v.match(floatRegex); - return { - [aName]: parseFloat(a), - [bName]: parseFloat(b), - [cName]: parseFloat(c), - alpha: alpha !== undefined ? parseFloat(alpha) : 1 - }; -}; -const hsla = { - test: isColorString('hsl', 'hue'), - parse: splitColor('hue', 'saturation', 'lightness'), - transform: _ref => { - let { - hue, - saturation, - lightness, - alpha: alpha$1 = 1 - } = _ref; - return 'hsla(' + Math.round(hue) + ', ' + percent.transform(sanitize(saturation)) + ', ' + percent.transform(sanitize(lightness)) + ', ' + sanitize(alpha.transform(alpha$1)) + ')'; - } -}; -const clampRgbUnit = clamp(0, 255); -const rgbUnit = Object.assign(Object.assign({}, number), { - transform: v => Math.round(clampRgbUnit(v)) -}); -const rgba = { - test: isColorString('rgb', 'red'), - parse: splitColor('red', 'green', 'blue'), - transform: _ref2 => { - let { - red, - green, - blue, - alpha: alpha$1 = 1 - } = _ref2; - return 'rgba(' + rgbUnit.transform(red) + ', ' + rgbUnit.transform(green) + ', ' + rgbUnit.transform(blue) + ', ' + sanitize(alpha.transform(alpha$1)) + ')'; + // fail if list has another type + if (isOrdered) { + posAfterMarker = skipOrderedListMarker(state, nextLine); + if (posAfterMarker < 0) { + break; + } + start = state.bMarks[nextLine] + state.tShift[nextLine]; + } else { + posAfterMarker = skipBulletListMarker(state, nextLine); + if (posAfterMarker < 0) { + break; + } + } + if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { + break; + } } -}; -function parseHex(v) { - let r = ''; - let g = ''; - let b = ''; - let a = ''; - if (v.length > 5) { - r = v.substr(1, 2); - g = v.substr(3, 2); - b = v.substr(5, 2); - a = v.substr(7, 2); + + // Finalize list + if (isOrdered) { + token = state.push('ordered_list_close', 'ol', -1); } else { - r = v.substr(1, 1); - g = v.substr(2, 1); - b = v.substr(3, 1); - a = v.substr(4, 1); - r += r; - g += g; - b += b; - a += a; + token = state.push('bullet_list_close', 'ul', -1); } - return { - red: parseInt(r, 16), - green: parseInt(g, 16), - blue: parseInt(b, 16), - alpha: a ? parseInt(a, 16) / 255 : 1 - }; -} -const hex = { - test: isColorString('#'), - parse: parseHex, - transform: rgba.transform -}; -const color = { - test: v => rgba.test(v) || hex.test(v) || hsla.test(v), - parse: v => { - if (rgba.test(v)) { - return rgba.parse(v); - } else if (hsla.test(v)) { - return hsla.parse(v); - } else { - return hex.parse(v); - } - }, - transform: v => { - return isString(v) ? v : v.hasOwnProperty('red') ? rgba.transform(v) : hsla.transform(v); + token.markup = String.fromCharCode(markerCharCode); + listLines[1] = nextLine; + state.line = nextLine; + state.parentType = oldParentType; + + // mark paragraphs tight if needed + if (tight) { + markTightParagraphs(state, listTokIdx); } -}; -const colorToken = '${c}'; -const numberToken = '${n}'; -function test(v) { - var _a, _b, _c, _d; - return isNaN(v) && isString(v) && ((_b = (_a = v.match(floatRegex)) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) + ((_d = (_c = v.match(colorRegex)) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0) > 0; + return true; } -function analyse(v) { - if (typeof v === 'number') v = `${v}`; - const values = []; - let numColors = 0; - const colors = v.match(colorRegex); - if (colors) { - numColors = colors.length; - v = v.replace(colorRegex, colorToken); - values.push(...colors.map(color.parse)); +function reference(state, startLine, _endLine, silent) { + let pos = state.bMarks[startLine] + state.tShift[startLine]; + let max = state.eMarks[startLine]; + let nextLine = startLine + 1; + + // if it's indented more than 3 spaces, it should be a code block + if (state.sCount[startLine] - state.blkIndent >= 4) { + return false; } - const numbers = v.match(floatRegex); - if (numbers) { - v = v.replace(floatRegex, numberToken); - values.push(...numbers.map(number.parse)); + if (state.src.charCodeAt(pos) !== 0x5B /* [ */) { + return false; } - return { - values, - numColors, - tokenised: v - }; -} -function parse(v) { - return analyse(v).values; -} -function createTransformer(v) { - const { - values, - numColors, - tokenised - } = analyse(v); - const numValues = values.length; - return v => { - let output = tokenised; - for (let i = 0; i < numValues; i++) { - output = output.replace(i < numColors ? colorToken : numberToken, i < numColors ? color.transform(v[i]) : sanitize(v[i])); + function getNextLine(nextLine) { + const endLine = state.lineMax; + if (nextLine >= endLine || state.isEmpty(nextLine)) { + // empty line or end of input + return null; } - return output; - }; -} -const convertNumbersToZero = v => typeof v === 'number' ? 0 : v; -function getAnimatableNone(v) { - const parsed = parse(v); - const transformer = createTransformer(v); - return transformer(parsed.map(convertNumbersToZero)); -} -const complex = { - test, - parse, - createTransformer, - getAnimatableNone -}; -const maxDefaults = new Set(['brightness', 'contrast', 'saturate', 'opacity']); -function applyDefaultFilter(v) { - let [name, value] = v.slice(0, -1).split('('); - if (name === 'drop-shadow') return v; - const [number] = value.match(floatRegex) || []; - if (!number) return v; - const unit = value.replace(number, ''); - let defaultValue = maxDefaults.has(name) ? 1 : 0; - if (number !== value) defaultValue *= 100; - return name + '(' + defaultValue + unit + ')'; -} -const functionRegex = /([a-z-]*)\(.*?\)/g; -const filter = Object.assign(Object.assign({}, complex), { - getAnimatableNone: v => { - const functions = v.match(functionRegex); - return functions ? functions.map(applyDefaultFilter).join(' ') : v; - } -}); -exports.alpha = alpha; -exports.color = color; -exports.complex = complex; -exports.degrees = degrees; -exports.filter = filter; -exports.hex = hex; -exports.hsla = hsla; -exports.number = number; -exports.percent = percent; -exports.progressPercentage = progressPercentage; -exports.px = px; -exports.rgbUnit = rgbUnit; -exports.rgba = rgba; -exports.scale = scale; -exports.vh = vh; -exports.vw = vw; - -/***/ }), + let isContinuation = false; -/***/ "../../../node_modules/toggle-selection/index.js": -/*!*******************************************************!*\ - !*** ../../../node_modules/toggle-selection/index.js ***! - \*******************************************************/ -/***/ (function(module) { + // this would be a code block normally, but after paragraph + // it's considered a lazy continuation regardless of what's there + if (state.sCount[nextLine] - state.blkIndent > 3) { + isContinuation = true; + } + // quirk for blockquotes, this line should already be checked by that rule + if (state.sCount[nextLine] < 0) { + isContinuation = true; + } + if (!isContinuation) { + const terminatorRules = state.md.block.ruler.getRules('reference'); + const oldParentType = state.parentType; + state.parentType = 'reference'; + // Some tags can terminate paragraph without empty line. + let terminate = false; + for (let i = 0, l = terminatorRules.length; i < l; i++) { + if (terminatorRules[i](state, nextLine, endLine, true)) { + terminate = true; + break; + } + } + state.parentType = oldParentType; + if (terminate) { + // terminated by another block + return null; + } + } + const pos = state.bMarks[nextLine] + state.tShift[nextLine]; + const max = state.eMarks[nextLine]; -module.exports = function () { - var selection = document.getSelection(); - if (!selection.rangeCount) { - return function () {}; - } - var active = document.activeElement; - var ranges = []; - for (var i = 0; i < selection.rangeCount; i++) { - ranges.push(selection.getRangeAt(i)); + // max + 1 explicitly includes the newline + return state.src.slice(pos, max + 1); } - switch (active.tagName.toUpperCase()) { - // .toUpperCase handles XHTML - case 'INPUT': - case 'TEXTAREA': - active.blur(); - break; - default: - active = null; + let str = state.src.slice(pos, max + 1); + max = str.length; + let labelEnd = -1; + for (pos = 1; pos < max; pos++) { + const ch = str.charCodeAt(pos); + if (ch === 0x5B /* [ */) { + return false; + } else if (ch === 0x5D /* ] */) { + labelEnd = pos; break; - } - selection.removeAllRanges(); - return function () { - selection.type === 'Caret' && selection.removeAllRanges(); - if (!selection.rangeCount) { - ranges.forEach(function (range) { - selection.addRange(range); - }); + } else if (ch === 0x0A /* \n */) { + const lineContent = getNextLine(nextLine); + if (lineContent !== null) { + str += lineContent; + max = str.length; + nextLine++; + } + } else if (ch === 0x5C /* \ */) { + pos++; + if (pos < max && str.charCodeAt(pos) === 0x0A) { + const lineContent = getNextLine(nextLine); + if (lineContent !== null) { + str += lineContent; + max = str.length; + nextLine++; + } + } } - active && active.focus(); - }; -}; + } + if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A /* : */) { + return false; + } -/***/ }), + // [label]: destination 'title' + // ^^^ skip optional whitespace here + for (pos = labelEnd + 2; pos < max; pos++) { + const ch = str.charCodeAt(pos); + if (ch === 0x0A) { + const lineContent = getNextLine(nextLine); + if (lineContent !== null) { + str += lineContent; + max = str.length; + nextLine++; + } + } else if (isSpace(ch)) ;else { + break; + } + } -/***/ "../../../node_modules/tslib/tslib.es6.js": -/*!************************************************!*\ - !*** ../../../node_modules/tslib/tslib.es6.js ***! - \************************************************/ -/***/ (function(__unused_webpack_module, exports) { + // [label]: destination 'title' + // ^^^^^^^^^^^ parse this + const destRes = state.md.helpers.parseLinkDestination(str, pos, max); + if (!destRes.ok) { + return false; + } + const href = state.md.normalizeLink(destRes.str); + if (!state.md.validateLink(href)) { + return false; + } + pos = destRes.pos; + // save cursor state, we could require to rollback later + const destEndPos = pos; + const destEndLineNo = nextLine; + // [label]: destination 'title' + // ^^^ skipping those spaces + const start = pos; + for (; pos < max; pos++) { + const ch = str.charCodeAt(pos); + if (ch === 0x0A) { + const lineContent = getNextLine(nextLine); + if (lineContent !== null) { + str += lineContent; + max = str.length; + nextLine++; + } + } else if (isSpace(ch)) ;else { + break; + } + } -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.__assign = void 0; -exports.__asyncDelegator = __asyncDelegator; -exports.__asyncGenerator = __asyncGenerator; -exports.__asyncValues = __asyncValues; -exports.__await = __await; -exports.__awaiter = __awaiter; -exports.__classPrivateFieldGet = __classPrivateFieldGet; -exports.__classPrivateFieldIn = __classPrivateFieldIn; -exports.__classPrivateFieldSet = __classPrivateFieldSet; -exports.__createBinding = void 0; -exports.__decorate = __decorate; -exports.__exportStar = __exportStar; -exports.__extends = __extends; -exports.__generator = __generator; -exports.__importDefault = __importDefault; -exports.__importStar = __importStar; -exports.__makeTemplateObject = __makeTemplateObject; -exports.__metadata = __metadata; -exports.__param = __param; -exports.__read = __read; -exports.__rest = __rest; -exports.__spread = __spread; -exports.__spreadArray = __spreadArray; -exports.__spreadArrays = __spreadArrays; -exports.__values = __values; -/****************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */ -/* global Reflect, Promise */ + // [label]: destination 'title' + // ^^^^^^^ parse this + let titleRes = state.md.helpers.parseLinkTitle(str, pos, max); + while (titleRes.can_continue) { + const lineContent = getNextLine(nextLine); + if (lineContent === null) break; + str += lineContent; + pos = max; + max = str.length; + nextLine++; + titleRes = state.md.helpers.parseLinkTitle(str, pos, max, titleRes); + } + let title; + if (pos < max && start !== pos && titleRes.ok) { + title = titleRes.str; + pos = titleRes.pos; + } else { + title = ''; + pos = destEndPos; + nextLine = destEndLineNo; + } -var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || { - __proto__: [] - } instanceof Array && function (d, b) { - d.__proto__ = b; - } || function (d, b) { - for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; - }; - return extendStatics(d, b); -}; -function __extends(d, b) { - if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { - this.constructor = d; + // skip trailing spaces until the rest of the line + while (pos < max) { + const ch = str.charCodeAt(pos); + if (!isSpace(ch)) { + break; + } + pos++; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} -var __assign = function () { - exports.__assign = __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + if (pos < max && str.charCodeAt(pos) !== 0x0A) { + if (title) { + // garbage at the end of the line after title, + // but it could still be a valid reference if we roll back + title = ''; + pos = destEndPos; + nextLine = destEndLineNo; + while (pos < max) { + const ch = str.charCodeAt(pos); + if (!isSpace(ch)) { + break; + } + pos++; + } } - return t; - }; - return __assign.apply(this, arguments); -}; -exports.__assign = __assign; -function __rest(s, e) { - var t = {}; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } - return t; -} -function __decorate(decorators, target, key, desc) { - var c = arguments.length, - r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, - d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -} -function __param(paramIndex, decorator) { - return function (target, key) { - decorator(target, key, paramIndex); - }; -} -function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); -} -function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function (resolve) { - resolve(value); - }); + if (pos < max && str.charCodeAt(pos) !== 0x0A) { + // garbage at the end of the line + return false; } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} -function __generator(thisArg, body) { - var _ = { - label: 0, - sent: function () { - if (t[0] & 1) throw t[1]; - return t[1]; - }, - trys: [], - ops: [] - }, - f, - y, - t, - g; - return g = { - next: verb(0), - "throw": verb(1), - "return": verb(2) - }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { - return this; - }), g; - function verb(n) { - return function (v) { - return step([n, v]); - }; + const label = normalizeReference(str.slice(1, labelEnd)); + if (!label) { + // CommonMark 0.20 disallows empty labels + return false; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: - case 1: - t = op; - break; - case 4: - _.label++; - return { - value: op[1], - done: false - }; - case 5: - _.label++; - y = op[1]; - op = [0]; - continue; - case 7: - op = _.ops.pop(); - _.trys.pop(); - continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { - _ = 0; - continue; - } - if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { - _.label = op[1]; - break; - } - if (op[0] === 6 && _.label < t[1]) { - _.label = t[1]; - t = op; - break; - } - if (t && _.label < t[2]) { - _.label = t[2]; - _.ops.push(op); - break; - } - if (t[2]) _.ops.pop(); - _.trys.pop(); - continue; - } - op = body.call(thisArg, _); - } catch (e) { - op = [6, e]; - y = 0; - } finally { - f = t = 0; - } - if (op[0] & 5) throw op[1]; - return { - value: op[0] ? op[1] : void 0, - done: true - }; + + // Reference can not terminate anything. This check is for safety only. + /* istanbul ignore if */ + if (silent) { + return true; } -} -var __createBinding = Object.create ? function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { - enumerable: true, - get: function () { - return m[k]; - } - }; + if (typeof state.env.references === 'undefined') { + state.env.references = {}; } - Object.defineProperty(o, k2, desc); -} : function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -}; -exports.__createBinding = __createBinding; -function __exportStar(m, o) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p); -} -function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, - m = s && o[s], - i = 0; - if (m) return m.call(o); - if (o && typeof o.length === "number") return { - next: function () { - if (o && i >= o.length) o = void 0; - return { - value: o && o[i++], - done: !o - }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} -function __read(o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), - r, - ar = [], - e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); - } catch (error) { - e = { - error: error + if (typeof state.env.references[label] === 'undefined') { + state.env.references[label] = { + title, + href }; - } finally { - try { - if (r && !r.done && (m = i["return"])) m.call(i); - } finally { - if (e) throw e.error; - } } - return ar; + state.line = nextLine; + return true; } -/** @deprecated */ -function __spread() { - for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); - return ar; -} +// List of valid html blocks names, according to commonmark spec +// https://spec.commonmark.org/0.30/#html-blocks -/** @deprecated */ -function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; - return r; -} -function __spreadArray(to, from, pack) { - if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; - } +var block_names = ['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', 'search', 'section', 'summary', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul']; + +// Regexps to match html elements + +const attr_name = '[a-zA-Z_:][a-zA-Z0-9:._-]*'; +const unquoted = '[^"\'=<>`\\x00-\\x20]+'; +const single_quoted = "'[^']*'"; +const double_quoted = '"[^"]*"'; +const attr_value = '(?:' + unquoted + '|' + single_quoted + '|' + double_quoted + ')'; +const attribute = '(?:\\s+' + attr_name + '(?:\\s*=\\s*' + attr_value + ')?)'; +const open_tag = '<[A-Za-z][A-Za-z0-9\\-]*' + attribute + '*\\s*\\/?>'; +const close_tag = '<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>'; +const comment = ''; +const processing = '<[?][\\s\\S]*?[?]>'; +const declaration = ']*>'; +const cdata = ''; +const HTML_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + '|' + comment + '|' + processing + '|' + declaration + '|' + cdata + ')'); +const HTML_OPEN_CLOSE_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + ')'); + +// HTML block + +// An array of opening and corresponding closing sequences for html tags, +// last argument defines whether it can terminate a paragraph or not +// +const HTML_SEQUENCES = [[/^<(script|pre|style|textarea)(?=(\s|>|$))/i, /<\/(script|pre|style|textarea)>/i, true], [/^/, true], [/^<\?/, /\?>/, true], [/^/, true], [/^/, true], [new RegExp('^|$))', 'i'), /^$/, true], [new RegExp(HTML_OPEN_CLOSE_TAG_RE.source + '\\s*$'), /^$/, false]]; +function html_block(state, startLine, endLine, silent) { + let pos = state.bMarks[startLine] + state.tShift[startLine]; + let max = state.eMarks[startLine]; + + // if it's indented more than 3 spaces, it should be a code block + if (state.sCount[startLine] - state.blkIndent >= 4) { + return false; } - return to.concat(ar || Array.prototype.slice.call(from)); -} -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), - i, - q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { - return this; - }, i; - function verb(n) { - if (g[n]) i[n] = function (v) { - return new Promise(function (a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; + if (!state.md.options.html) { + return false; } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } + if (state.src.charCodeAt(pos) !== 0x3C /* < */) { + return false; } - function step(r) { - r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); + let lineText = state.src.slice(pos, max); + let i = 0; + for (; i < HTML_SEQUENCES.length; i++) { + if (HTML_SEQUENCES[i][0].test(lineText)) { + break; + } } - function fulfill(value) { - resume("next", value); + if (i === HTML_SEQUENCES.length) { + return false; } - function reject(value) { - resume("throw", value); + if (silent) { + // true if this sequence can be a terminator, false otherwise + return HTML_SEQUENCES[i][2]; } - function settle(f, v) { - if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); + let nextLine = startLine + 1; + + // If we are here - we detected HTML block. + // Let's roll down till block end. + if (!HTML_SEQUENCES[i][1].test(lineText)) { + for (; nextLine < endLine; nextLine++) { + if (state.sCount[nextLine] < state.blkIndent) { + break; + } + pos = state.bMarks[nextLine] + state.tShift[nextLine]; + max = state.eMarks[nextLine]; + lineText = state.src.slice(pos, max); + if (HTML_SEQUENCES[i][1].test(lineText)) { + if (lineText.length !== 0) { + nextLine++; + } + break; + } + } } + state.line = nextLine; + const token = state.push('html_block', '', 0); + token.map = [startLine, nextLine]; + token.content = state.getLines(startLine, nextLine, state.blkIndent, true); + return true; } -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function (e) { - throw e; - }), verb("return"), i[Symbol.iterator] = function () { - return this; - }, i; - function verb(n, f) { - i[n] = o[n] ? function (v) { - return (p = !p) ? { - value: __await(o[n](v)), - done: n === "return" - } : f ? f(v) : v; - } : f; + +// heading (#, ##, ...) + +function heading(state, startLine, endLine, silent) { + let pos = state.bMarks[startLine] + state.tShift[startLine]; + let max = state.eMarks[startLine]; + + // if it's indented more than 3 spaces, it should be a code block + if (state.sCount[startLine] - state.blkIndent >= 4) { + return false; } -} -function __asyncValues(o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], - i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { - return this; - }, i); - function verb(n) { - i[n] = o[n] && function (v) { - return new Promise(function (resolve, reject) { - v = o[n](v), settle(resolve, reject, v.done, v.value); - }); - }; + let ch = state.src.charCodeAt(pos); + if (ch !== 0x23 /* # */ || pos >= max) { + return false; } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function (v) { - resolve({ - value: v, - done: d - }); - }, reject); + + // count heading level + let level = 1; + ch = state.src.charCodeAt(++pos); + while (ch === 0x23 /* # */ && pos < max && level <= 6) { + level++; + ch = state.src.charCodeAt(++pos); } -} -function __makeTemplateObject(cooked, raw) { - if (Object.defineProperty) { - Object.defineProperty(cooked, "raw", { - value: raw - }); - } else { - cooked.raw = raw; + if (level > 6 || pos < max && !isSpace(ch)) { + return false; + } + if (silent) { + return true; } - return cooked; -} -; -var __setModuleDefault = Object.create ? function (o, v) { - Object.defineProperty(o, "default", { - enumerable: true, - value: v - }); -} : function (o, v) { - o["default"] = v; -}; -function __importStar(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -} -function __importDefault(mod) { - return mod && mod.__esModule ? mod : { - default: mod - }; -} -function __classPrivateFieldGet(receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -} -function __classPrivateFieldSet(receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; -} -function __classPrivateFieldIn(state, receiver) { - if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") throw new TypeError("Cannot use 'in' operator on non-object"); - return typeof state === "function" ? receiver === state : state.has(receiver); -} - -/***/ }), - -/***/ "../../../node_modules/use-callback-ref/dist/es2015/assignRef.js": -/*!***********************************************************************!*\ - !*** ../../../node_modules/use-callback-ref/dist/es2015/assignRef.js ***! - \***********************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - + // Let's cut tails like ' ### ' from the end of string -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.assignRef = assignRef; -/** - * Assigns a value for a given ref, no matter of the ref format - * @param {RefObject} ref - a callback function or ref object - * @param value - a new value - * - * @see https://github.com/theKashey/use-callback-ref#assignref - * @example - * const refObject = useRef(); - * const refFn = (ref) => {....} - * - * assignRef(refObject, "refValue"); - * assignRef(refFn, "refValue"); - */ -function assignRef(ref, value) { - if (typeof ref === 'function') { - ref(value); - } else if (ref) { - ref.current = value; + max = state.skipSpacesBack(max, pos); + const tmp = state.skipCharsBack(max, 0x23, pos); // # + if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1))) { + max = tmp; } - return ref; + state.line = startLine + 1; + const token_o = state.push('heading_open', 'h' + String(level), 1); + token_o.markup = '########'.slice(0, level); + token_o.map = [startLine, state.line]; + const token_i = state.push('inline', '', 0); + token_i.content = state.src.slice(pos, max).trim(); + token_i.map = [startLine, state.line]; + token_i.children = []; + const token_c = state.push('heading_close', 'h' + String(level), -1); + token_c.markup = '########'.slice(0, level); + return true; } -/***/ }), - -/***/ "../../../node_modules/use-callback-ref/dist/es2015/createRef.js": -/*!***********************************************************************!*\ - !*** ../../../node_modules/use-callback-ref/dist/es2015/createRef.js ***! - \***********************************************************************/ -/***/ (function(__unused_webpack_module, exports) { +// lheading (---, ===) +function lheading(state, startLine, endLine /*, silent */) { + const terminatorRules = state.md.block.ruler.getRules('paragraph'); + // if it's indented more than 3 spaces, it should be a code block + if (state.sCount[startLine] - state.blkIndent >= 4) { + return false; + } + const oldParentType = state.parentType; + state.parentType = 'paragraph'; // use paragraph to match terminatorRules -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.createCallbackRef = createCallbackRef; -/** - * creates a Ref object with on change callback - * @param callback - * @returns {RefObject} - * - * @see {@link useCallbackRef} - * @see https://reactjs.org/docs/refs-and-the-dom.html#creating-refs - */ -function createCallbackRef(callback) { - var current = null; - return { - get current() { - return current; - }, - set current(value) { - var last = current; - if (last !== value) { - current = value; - callback(value, last); - } + // jump line-by-line until empty one or EOF + let level = 0; + let marker; + let nextLine = startLine + 1; + for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) { + // this would be a code block normally, but after paragraph + // it's considered a lazy continuation regardless of what's there + if (state.sCount[nextLine] - state.blkIndent > 3) { + continue; } - }; -} - -/***/ }), - -/***/ "../../../node_modules/use-callback-ref/dist/es2015/index.js": -/*!*******************************************************************!*\ - !*** ../../../node_modules/use-callback-ref/dist/es2015/index.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "assignRef", ({ - enumerable: true, - get: function () { - return _assignRef.assignRef; - } -})); -Object.defineProperty(exports, "createCallbackRef", ({ - enumerable: true, - get: function () { - return _createRef.createCallbackRef; - } -})); -Object.defineProperty(exports, "mergeRefs", ({ - enumerable: true, - get: function () { - return _mergeRef.mergeRefs; - } -})); -Object.defineProperty(exports, "refToCallback", ({ - enumerable: true, - get: function () { - return _refToCallback.refToCallback; - } -})); -Object.defineProperty(exports, "transformRef", ({ - enumerable: true, - get: function () { - return _transformRef.transformRef; - } -})); -Object.defineProperty(exports, "useCallbackRef", ({ - enumerable: true, - get: function () { - return _useRef.useCallbackRef; - } -})); -Object.defineProperty(exports, "useMergeRefs", ({ - enumerable: true, - get: function () { - return _useMergeRef.useMergeRefs; - } -})); -Object.defineProperty(exports, "useRefToCallback", ({ - enumerable: true, - get: function () { - return _refToCallback.useRefToCallback; + // + // Check for underline in setext header + // + if (state.sCount[nextLine] >= state.blkIndent) { + let pos = state.bMarks[nextLine] + state.tShift[nextLine]; + const max = state.eMarks[nextLine]; + if (pos < max) { + marker = state.src.charCodeAt(pos); + if (marker === 0x2D /* - */ || marker === 0x3D /* = */) { + pos = state.skipChars(pos, marker); + pos = state.skipSpaces(pos); + if (pos >= max) { + level = marker === 0x3D /* = */ ? 1 : 2; + break; + } + } + } + } + + // quirk for blockquotes, this line should already be checked by that rule + if (state.sCount[nextLine] < 0) { + continue; + } + + // Some tags can terminate paragraph without empty line. + let terminate = false; + for (let i = 0, l = terminatorRules.length; i < l; i++) { + if (terminatorRules[i](state, nextLine, endLine, true)) { + terminate = true; + break; + } + } + if (terminate) { + break; + } } -})); -Object.defineProperty(exports, "useTransformRef", ({ - enumerable: true, - get: function () { - return _useTransformRef.useTransformRef; + if (!level) { + // Didn't find valid underline + return false; } -})); -var _assignRef = __webpack_require__(/*! ./assignRef */ "../../../node_modules/use-callback-ref/dist/es2015/assignRef.js"); -var _useRef = __webpack_require__(/*! ./useRef */ "../../../node_modules/use-callback-ref/dist/es2015/useRef.js"); -var _createRef = __webpack_require__(/*! ./createRef */ "../../../node_modules/use-callback-ref/dist/es2015/createRef.js"); -var _mergeRef = __webpack_require__(/*! ./mergeRef */ "../../../node_modules/use-callback-ref/dist/es2015/mergeRef.js"); -var _useMergeRef = __webpack_require__(/*! ./useMergeRef */ "../../../node_modules/use-callback-ref/dist/es2015/useMergeRef.js"); -var _useTransformRef = __webpack_require__(/*! ./useTransformRef */ "../../../node_modules/use-callback-ref/dist/es2015/useTransformRef.js"); -var _transformRef = __webpack_require__(/*! ./transformRef */ "../../../node_modules/use-callback-ref/dist/es2015/transformRef.js"); -var _refToCallback = __webpack_require__(/*! ./refToCallback */ "../../../node_modules/use-callback-ref/dist/es2015/refToCallback.js"); + const content = state.getLines(startLine, nextLine, state.blkIndent, false).trim(); + state.line = nextLine + 1; + const token_o = state.push('heading_open', 'h' + String(level), 1); + token_o.markup = String.fromCharCode(marker); + token_o.map = [startLine, state.line]; + const token_i = state.push('inline', '', 0); + token_i.content = content; + token_i.map = [startLine, state.line - 1]; + token_i.children = []; + const token_c = state.push('heading_close', 'h' + String(level), -1); + token_c.markup = String.fromCharCode(marker); + state.parentType = oldParentType; + return true; +} -/***/ }), +// Paragraph -/***/ "../../../node_modules/use-callback-ref/dist/es2015/mergeRef.js": -/*!**********************************************************************!*\ - !*** ../../../node_modules/use-callback-ref/dist/es2015/mergeRef.js ***! - \**********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +function paragraph(state, startLine, endLine) { + const terminatorRules = state.md.block.ruler.getRules('paragraph'); + const oldParentType = state.parentType; + let nextLine = startLine + 1; + state.parentType = 'paragraph'; + + // jump line-by-line until empty one or EOF + for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) { + // this would be a code block normally, but after paragraph + // it's considered a lazy continuation regardless of what's there + if (state.sCount[nextLine] - state.blkIndent > 3) { + continue; + } + // quirk for blockquotes, this line should already be checked by that rule + if (state.sCount[nextLine] < 0) { + continue; + } + // Some tags can terminate paragraph without empty line. + let terminate = false; + for (let i = 0, l = terminatorRules.length; i < l; i++) { + if (terminatorRules[i](state, nextLine, endLine, true)) { + terminate = true; + break; + } + } + if (terminate) { + break; + } + } + const content = state.getLines(startLine, nextLine, state.blkIndent, false).trim(); + state.line = nextLine; + const token_o = state.push('paragraph_open', 'p', 1); + token_o.map = [startLine, state.line]; + const token_i = state.push('inline', '', 0); + token_i.content = content; + token_i.map = [startLine, state.line]; + token_i.children = []; + state.push('paragraph_close', 'p', -1); + state.parentType = oldParentType; + return true; +} -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.mergeRefs = mergeRefs; -var _assignRef = __webpack_require__(/*! ./assignRef */ "../../../node_modules/use-callback-ref/dist/es2015/assignRef.js"); -var _createRef = __webpack_require__(/*! ./createRef */ "../../../node_modules/use-callback-ref/dist/es2015/createRef.js"); -/** - * Merges two or more refs together providing a single interface to set their value - * @param {RefObject|Ref} refs - * @returns {MutableRefObject} - a new ref, which translates all changes to {refs} +/** internal + * class ParserBlock * - * @see {@link useMergeRefs} to be used in ReactComponents - * @example - * const Component = React.forwardRef((props, ref) => { - * const ownRef = useRef(); - * const domRef = mergeRefs([ref, ownRef]); // 👈 merge together - * return
...
- * } - */ -function mergeRefs(refs) { - return (0, _createRef.createCallbackRef)(function (newValue) { - return refs.forEach(function (ref) { - return (0, _assignRef.assignRef)(ref, newValue); + * Block-level tokenizer. + **/ + +const _rules$1 = [ +// First 2 params - rule name & source. Secondary array - list of rules, +// which can be terminated by this one. +['table', table, ['paragraph', 'reference']], ['code', code], ['fence', fence, ['paragraph', 'reference', 'blockquote', 'list']], ['blockquote', blockquote, ['paragraph', 'reference', 'blockquote', 'list']], ['hr', hr, ['paragraph', 'reference', 'blockquote', 'list']], ['list', list, ['paragraph', 'reference', 'blockquote']], ['reference', reference], ['html_block', html_block, ['paragraph', 'reference', 'blockquote']], ['heading', heading, ['paragraph', 'reference', 'blockquote']], ['lheading', lheading], ['paragraph', paragraph]]; + +/** + * new ParserBlock() + **/ +function ParserBlock() { + /** + * ParserBlock#ruler -> Ruler + * + * [[Ruler]] instance. Keep configuration of block rules. + **/ + this.ruler = new Ruler(); + for (let i = 0; i < _rules$1.length; i++) { + this.ruler.push(_rules$1[i][0], _rules$1[i][1], { + alt: (_rules$1[i][2] || []).slice() }); - }); + } } -/***/ }), +// Generate tokens for input range +// +ParserBlock.prototype.tokenize = function (state, startLine, endLine) { + const rules = this.ruler.getRules(''); + const len = rules.length; + const maxNesting = state.md.options.maxNesting; + let line = startLine; + let hasEmptyLines = false; + while (line < endLine) { + state.line = line = state.skipEmptyLines(line); + if (line >= endLine) { + break; + } -/***/ "../../../node_modules/use-callback-ref/dist/es2015/refToCallback.js": -/*!***************************************************************************!*\ - !*** ../../../node_modules/use-callback-ref/dist/es2015/refToCallback.js ***! - \***************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { + // Termination condition for nested calls. + // Nested calls currently used for blockquotes & lists + if (state.sCount[line] < state.blkIndent) { + break; + } + // If nesting level exceeded - skip tail to the end. That's not ordinary + // situation and we should not care about content. + if (state.level >= maxNesting) { + state.line = endLine; + break; + } + // Try all possible rules. + // On success, rule should: + // + // - update `state.line` + // - update `state.tokens` + // - return true + const prevLine = state.line; + let ok = false; + for (let i = 0; i < len; i++) { + ok = rules[i](state, line, endLine, false); + if (ok) { + if (prevLine >= state.line) { + throw new Error("block rule didn't increment state.line"); + } + break; + } + } -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.refToCallback = refToCallback; -exports.useRefToCallback = useRefToCallback; -/** - * Unmemoized version of {@link useRefToCallback} - * @see {@link useRefToCallback} - * @param ref - */ -function refToCallback(ref) { - return function (newValue) { - if (typeof ref === 'function') { - ref(newValue); - } else if (ref) { - ref.current = newValue; + // this can only happen if user disables paragraph rule + if (!ok) throw new Error('none of the block rules matched'); + + // set state.tight if we had an empty line before current tag + // i.e. latest empty line should not count + state.tight = !hasEmptyLines; + + // paragraph might "eat" one newline after it in nested lists + if (state.isEmpty(state.line - 1)) { + hasEmptyLines = true; + } + line = state.line; + if (line < endLine && state.isEmpty(line)) { + hasEmptyLines = true; + line++; + state.line = line; } - }; -} -var nullCallback = function () { - return null; -}; -// lets maintain a weak ref to, well, ref :) -// not using `kashe` to keep this package small -var weakMem = new WeakMap(); -var weakMemoize = function (ref) { - var usedRef = ref || nullCallback; - var storedRef = weakMem.get(usedRef); - if (storedRef) { - return storedRef; } - var cb = refToCallback(usedRef); - weakMem.set(usedRef, cb); - return cb; }; + /** - * Transforms a given `ref` into `callback`. - * - * To transform `callback` into ref use {@link useCallbackRef|useCallbackRef(undefined, callback)} - * - * @param {ReactRef} ref - * @returns {Function} - * - * @see https://github.com/theKashey/use-callback-ref#reftocallback + * ParserBlock.parse(str, md, env, outTokens) * - * @example - * const ref = useRef(0); - * const setRef = useRefToCallback(ref); - * 👉 setRef(10); - * ✅ ref.current === 10 - */ -function useRefToCallback(ref) { - return weakMemoize(ref); -} + * Process input string and push block tokens into `outTokens` + **/ +ParserBlock.prototype.parse = function (src, md, env, outTokens) { + if (!src) { + return; + } + const state = new this.State(src, md, env, outTokens); + this.tokenize(state, state.line, state.lineMax); +}; +ParserBlock.prototype.State = StateBlock; -/***/ }), +// Inline parser state -/***/ "../../../node_modules/use-callback-ref/dist/es2015/transformRef.js": -/*!**************************************************************************!*\ - !*** ../../../node_modules/use-callback-ref/dist/es2015/transformRef.js ***! - \**************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +function StateInline(src, md, env, outTokens) { + this.src = src; + this.env = env; + this.md = md; + this.tokens = outTokens; + this.tokens_meta = Array(outTokens.length); + this.pos = 0; + this.posMax = this.src.length; + this.level = 0; + this.pending = ''; + this.pendingLevel = 0; + + // Stores { start: end } pairs. Useful for backtrack + // optimization of pairs parse (emphasis, strikes). + this.cache = {}; + // List of emphasis-like delimiters for current tag + this.delimiters = []; + // Stack of delimiter lists for upper level tags + this._prev_delimiters = []; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.transformRef = transformRef; -var _assignRef = __webpack_require__(/*! ./assignRef */ "../../../node_modules/use-callback-ref/dist/es2015/assignRef.js"); -var _createRef = __webpack_require__(/*! ./createRef */ "../../../node_modules/use-callback-ref/dist/es2015/createRef.js"); -/** - * Transforms one ref to another - * @example - * ```tsx - * const ResizableWithRef = forwardRef((props, ref) => - * i ? i.resizable : null)}/> - * ); - * ``` - */ -function transformRef(ref, transformer) { - return (0, _createRef.createCallbackRef)(function (value) { - return (0, _assignRef.assignRef)(ref, transformer(value)); - }); + // backtick length => last seen position + this.backticks = {}; + this.backticksScanned = false; + + // Counter used to disable inline linkify-it execution + // inside and markdown links + this.linkLevel = 0; } -/***/ }), +// Flush pending text +// +StateInline.prototype.pushPending = function () { + const token = new Token('text', '', 0); + token.content = this.pending; + token.level = this.pendingLevel; + this.tokens.push(token); + this.pending = ''; + return token; +}; -/***/ "../../../node_modules/use-callback-ref/dist/es2015/useMergeRef.js": -/*!*************************************************************************!*\ - !*** ../../../node_modules/use-callback-ref/dist/es2015/useMergeRef.js ***! - \*************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +// Push new token to "stream". +// If pending text exists - flush it as text token +// +StateInline.prototype.push = function (type, tag, nesting) { + if (this.pending) { + this.pushPending(); + } + const token = new Token(type, tag, nesting); + let token_meta = null; + if (nesting < 0) { + // closing tag + this.level--; + this.delimiters = this._prev_delimiters.pop(); + } + token.level = this.level; + if (nesting > 0) { + // opening tag + this.level++; + this._prev_delimiters.push(this.delimiters); + this.delimiters = []; + token_meta = { + delimiters: this.delimiters + }; + } + this.pendingLevel = this.level; + this.tokens.push(token); + this.tokens_meta.push(token_meta); + return token; +}; +// Scan a sequence of emphasis-like markers, and determine whether +// it can start an emphasis sequence or end an emphasis sequence. +// +// - start - position to scan from (it should point at a valid marker); +// - canSplitWord - determine if these markers can be found inside a word +// +StateInline.prototype.scanDelims = function (start, canSplitWord) { + const max = this.posMax; + const marker = this.src.charCodeAt(start); + // treat beginning of the line as a whitespace + const lastChar = start > 0 ? this.src.charCodeAt(start - 1) : 0x20; + let pos = start; + while (pos < max && this.src.charCodeAt(pos) === marker) { + pos++; + } + const count = pos - start; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.useMergeRefs = useMergeRefs; -var _assignRef = __webpack_require__(/*! ./assignRef */ "../../../node_modules/use-callback-ref/dist/es2015/assignRef.js"); -var _useRef = __webpack_require__(/*! ./useRef */ "../../../node_modules/use-callback-ref/dist/es2015/useRef.js"); -/** - * Merges two or more refs together providing a single interface to set their value - * @param {RefObject|Ref} refs - * @returns {MutableRefObject} - a new ref, which translates all changes to {refs} - * - * @see {@link mergeRefs} a version without buit-in memoization - * @see https://github.com/theKashey/use-callback-ref#usemergerefs - * @example - * const Component = React.forwardRef((props, ref) => { - * const ownRef = useRef(); - * const domRef = useMergeRefs([ref, ownRef]); // 👈 merge together - * return
...
- * } - */ -function useMergeRefs(refs, defaultValue) { - return (0, _useRef.useCallbackRef)(defaultValue || null, function (newValue) { - return refs.forEach(function (ref) { - return (0, _assignRef.assignRef)(ref, newValue); - }); - }); -} + // treat end of the line as a whitespace + const nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20; + const isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar)); + const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar)); + const isLastWhiteSpace = isWhiteSpace(lastChar); + const isNextWhiteSpace = isWhiteSpace(nextChar); + const left_flanking = !isNextWhiteSpace && (!isNextPunctChar || isLastWhiteSpace || isLastPunctChar); + const right_flanking = !isLastWhiteSpace && (!isLastPunctChar || isNextWhiteSpace || isNextPunctChar); + const can_open = left_flanking && (canSplitWord || !right_flanking || isLastPunctChar); + const can_close = right_flanking && (canSplitWord || !left_flanking || isNextPunctChar); + return { + can_open, + can_close, + length: count + }; +}; -/***/ }), +// re-export Token class to use in block rules +StateInline.prototype.Token = Token; -/***/ "../../../node_modules/use-callback-ref/dist/es2015/useRef.js": -/*!********************************************************************!*\ - !*** ../../../node_modules/use-callback-ref/dist/es2015/useRef.js ***! - \********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +// Skip text characters for text token, place those to pending buffer +// and increment current pos +// Rule to skip pure text +// '{}$%@~+=:' reserved for extentions +// !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \, ], ^, _, `, {, |, }, or ~ -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.useCallbackRef = useCallbackRef; -var _react = __webpack_require__(/*! react */ "react"); -/** - * creates a MutableRef with ref change callback - * @param initialValue - initial ref value - * @param {Function} callback - a callback to run when value changes - * - * @example - * const ref = useCallbackRef(0, (newValue, oldValue) => console.log(oldValue, '->', newValue); - * ref.current = 1; - * // prints 0 -> 1 - * - * @see https://reactjs.org/docs/hooks-reference.html#useref - * @see https://github.com/theKashey/use-callback-ref#usecallbackref---to-replace-reactuseref - * @returns {MutableRefObject} - */ -function useCallbackRef(initialValue, callback) { - var ref = (0, _react.useState)(function () { - return { - // value - value: initialValue, - // last callback - callback: callback, - // "memoized" public interface - facade: { - get current() { - return ref.value; - }, - set current(value) { - var last = ref.value; - if (last !== value) { - ref.value = value; - ref.callback(value, last); - } - } - } - }; - })[0]; - // update callback - ref.callback = callback; - return ref.facade; +// !!!! Don't confuse with "Markdown ASCII Punctuation" chars +// http://spec.commonmark.org/0.15/#ascii-punctuation-character +function isTerminatorChar(ch) { + switch (ch) { + case 0x0A /* \n */: + case 0x21 /* ! */: + case 0x23 /* # */: + case 0x24 /* $ */: + case 0x25 /* % */: + case 0x26 /* & */: + case 0x2A /* * */: + case 0x2B /* + */: + case 0x2D /* - */: + case 0x3A /* : */: + case 0x3C /* < */: + case 0x3D /* = */: + case 0x3E /* > */: + case 0x40 /* @ */: + case 0x5B /* [ */: + case 0x5C /* \ */: + case 0x5D /* ] */: + case 0x5E /* ^ */: + case 0x5F /* _ */: + case 0x60 /* ` */: + case 0x7B /* { */: + case 0x7D /* } */: + case 0x7E /* ~ */: + return true; + default: + return false; + } } - -/***/ }), - -/***/ "../../../node_modules/use-callback-ref/dist/es2015/useTransformRef.js": -/*!*****************************************************************************!*\ - !*** ../../../node_modules/use-callback-ref/dist/es2015/useTransformRef.js ***! - \*****************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.useTransformRef = useTransformRef; -var _assignRef = __webpack_require__(/*! ./assignRef */ "../../../node_modules/use-callback-ref/dist/es2015/assignRef.js"); -var _useRef = __webpack_require__(/*! ./useRef */ "../../../node_modules/use-callback-ref/dist/es2015/useRef.js"); -/** - * Create a _lense_ on Ref, making it possible to transform ref value - * @param {ReactRef} ref - * @param {Function} transformer. 👉 Ref would be __NOT updated__ on `transformer` update. - * @returns {RefObject} - * - * @see https://github.com/theKashey/use-callback-ref#usetransformref-to-replace-reactuseimperativehandle - * @example - * - * const ResizableWithRef = forwardRef((props, ref) => - * i ? i.resizable : null)}/> - * ); - */ -function useTransformRef(ref, transformer) { - return (0, _useRef.useCallbackRef)(null, function (value) { - return (0, _assignRef.assignRef)(ref, transformer(value)); - }); +function text(state, silent) { + let pos = state.pos; + while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) { + pos++; + } + if (pos === state.pos) { + return false; + } + if (!silent) { + state.pending += state.src.slice(state.pos, pos); + } + state.pos = pos; + return true; } -/***/ }), +// Alternative implementation, for memory. +// +// It costs 10% of performance, but allows extend terminators list, if place it +// to `ParserInline` property. Probably, will switch to it sometime, such +// flexibility required. -/***/ "../../../node_modules/use-sidecar/dist/es2015/config.js": -/*!***************************************************************!*\ - !*** ../../../node_modules/use-sidecar/dist/es2015/config.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports) { +/* +var TERMINATOR_RE = /[\n!#$%&*+\-:<=>@[\\\]^_`{}~]/; +module.exports = function text(state, silent) { + var pos = state.pos, + idx = state.src.slice(pos).search(TERMINATOR_RE); + // first char is terminator -> empty text + if (idx === 0) { return false; } -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.setConfig = exports.config = void 0; -var config = { - onError: function (e) { - return console.error(e); + // no terminator -> text till end of string + if (idx < 0) { + if (!silent) { state.pending += state.src.slice(pos); } + state.pos = state.src.length; + return true; } -}; -exports.config = config; -var setConfig = function (conf) { - Object.assign(config, conf); -}; -exports.setConfig = setConfig; -/***/ }), + if (!silent) { state.pending += state.src.slice(pos, pos + idx); } -/***/ "../../../node_modules/use-sidecar/dist/es2015/env.js": -/*!************************************************************!*\ - !*** ../../../node_modules/use-sidecar/dist/es2015/env.js ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + state.pos += idx; + return true; +}; */ +// Process links like https://example.org/ -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.env = void 0; -var _detectNodeEs = __webpack_require__(/*! detect-node-es */ "../../../node_modules/detect-node-es/esm/browser.js"); -var env = { - isNode: _detectNodeEs.isNode, - forceCache: false -}; -exports.env = env; +// RFC3986: scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) +const SCHEME_RE = /(?:^|[^a-z0-9.+-])([a-z][a-z0-9.+-]*)$/i; +function linkify(state, silent) { + if (!state.md.options.linkify) return false; + if (state.linkLevel > 0) return false; + const pos = state.pos; + const max = state.posMax; + if (pos + 3 > max) return false; + if (state.src.charCodeAt(pos) !== 0x3A /* : */) return false; + if (state.src.charCodeAt(pos + 1) !== 0x2F /* / */) return false; + if (state.src.charCodeAt(pos + 2) !== 0x2F /* / */) return false; + const match = state.pending.match(SCHEME_RE); + if (!match) return false; + const proto = match[1]; + const link = state.md.linkify.matchAtStart(state.src.slice(pos - proto.length)); + if (!link) return false; + let url = link.url; -/***/ }), + // invalid link, but still detected by linkify somehow; + // need to check to prevent infinite loop below + if (url.length <= proto.length) return false; -/***/ "../../../node_modules/use-sidecar/dist/es2015/exports.js": -/*!****************************************************************!*\ - !*** ../../../node_modules/use-sidecar/dist/es2015/exports.js ***! - \****************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + // disallow '*' at the end of the link (conflicts with emphasis) + url = url.replace(/\*+$/, ''); + const fullUrl = state.md.normalizeLink(url); + if (!state.md.validateLink(fullUrl)) return false; + if (!silent) { + state.pending = state.pending.slice(0, -proto.length); + const token_o = state.push('link_open', 'a', 1); + token_o.attrs = [['href', fullUrl]]; + token_o.markup = 'linkify'; + token_o.info = 'auto'; + const token_t = state.push('text', '', 0); + token_t.content = state.md.normalizeLinkText(url); + const token_c = state.push('link_close', 'a', -1); + token_c.markup = 'linkify'; + token_c.info = 'auto'; + } + state.pos += url.length - proto.length; + return true; +} +// Proceess '\n' +function newline(state, silent) { + let pos = state.pos; + if (state.src.charCodeAt(pos) !== 0x0A /* \n */) { + return false; + } + const pmax = state.pending.length - 1; + const max = state.posMax; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.exportSidecar = exportSidecar; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); -var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -var SideCar = function (_a) { - var sideCar = _a.sideCar, - rest = (0, _tslib.__rest)(_a, ["sideCar"]); - if (!sideCar) { - throw new Error('Sidecar: please provide `sideCar` property to import the right car'); + // ' \n' -> hardbreak + // Lookup in pending chars is bad practice! Don't copy to other rules! + // Pending string is stored in concat mode, indexed lookups will cause + // convertion to flat mode. + if (!silent) { + if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) { + if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) { + // Find whitespaces tail of pending chars. + let ws = pmax - 1; + while (ws >= 1 && state.pending.charCodeAt(ws - 1) === 0x20) ws--; + state.pending = state.pending.slice(0, ws); + state.push('hardbreak', 'br', 0); + } else { + state.pending = state.pending.slice(0, -1); + state.push('softbreak', 'br', 0); + } + } else { + state.push('softbreak', 'br', 0); + } } - var Target = sideCar.read(); - if (!Target) { - throw new Error('Sidecar medium not found'); + pos++; + + // skip heading spaces for next line + while (pos < max && isSpace(state.src.charCodeAt(pos))) { + pos++; } - return /*#__PURE__*/React.createElement(Target, (0, _tslib.__assign)({}, rest)); -}; -SideCar.isSideCarExport = true; -function exportSidecar(medium, exported) { - medium.useMedium(exported); - return SideCar; + state.pos = pos; + return true; } -/***/ }), - -/***/ "../../../node_modules/use-sidecar/dist/es2015/hoc.js": -/*!************************************************************!*\ - !*** ../../../node_modules/use-sidecar/dist/es2015/hoc.js ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - +// Process escaped chars and hardbreaks +const ESCAPED = []; +for (let i = 0; i < 256; i++) { + ESCAPED.push(0); +} +'\\!"#$%&\'()*+,./:;<=>?@[]^_`{|}~-'.split('').forEach(function (ch) { + ESCAPED[ch.charCodeAt(0)] = 1; +}); +function escape(state, silent) { + let pos = state.pos; + const max = state.posMax; + if (state.src.charCodeAt(pos) !== 0x5C /* \ */) return false; + pos++; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.sidecar = sidecar; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); -var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); -var _hook = __webpack_require__(/*! ./hook */ "../../../node_modules/use-sidecar/dist/es2015/hook.js"); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -// eslint-disable-next-line @typescript-eslint/ban-types -function sidecar(importer, errorComponent) { - var ErrorCase = function () { - return errorComponent; - }; - return function Sidecar(props) { - var _a = (0, _hook.useSidecar)(importer, props.sideCar), - Car = _a[0], - error = _a[1]; - if (error && errorComponent) { - return ErrorCase; + // '\' at the end of the inline block + if (pos >= max) return false; + let ch1 = state.src.charCodeAt(pos); + if (ch1 === 0x0A) { + if (!silent) { + state.push('hardbreak', 'br', 0); } - // @ts-expect-error type shenanigans - return Car ? /*#__PURE__*/React.createElement(Car, (0, _tslib.__assign)({}, props)) : null; - }; + pos++; + // skip leading whitespaces from next line + while (pos < max) { + ch1 = state.src.charCodeAt(pos); + if (!isSpace(ch1)) break; + pos++; + } + state.pos = pos; + return true; + } + let escapedStr = state.src[pos]; + if (ch1 >= 0xD800 && ch1 <= 0xDBFF && pos + 1 < max) { + const ch2 = state.src.charCodeAt(pos + 1); + if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) { + escapedStr += state.src[pos + 1]; + pos++; + } + } + const origStr = '\\' + escapedStr; + if (!silent) { + const token = state.push('text_special', '', 0); + if (ch1 < 256 && ESCAPED[ch1] !== 0) { + token.content = escapedStr; + } else { + token.content = origStr; + } + token.markup = origStr; + token.info = 'escape'; + } + state.pos = pos + 1; + return true; } -/***/ }), +// Parse backticks -/***/ "../../../node_modules/use-sidecar/dist/es2015/hook.js": -/*!*************************************************************!*\ - !*** ../../../node_modules/use-sidecar/dist/es2015/hook.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +function backtick(state, silent) { + let pos = state.pos; + const ch = state.src.charCodeAt(pos); + if (ch !== 0x60 /* ` */) { + return false; + } + const start = pos; + pos++; + const max = state.posMax; + // scan marker length + while (pos < max && state.src.charCodeAt(pos) === 0x60 /* ` */) { + pos++; + } + const marker = state.src.slice(start, pos); + const openerLength = marker.length; + if (state.backticksScanned && (state.backticks[openerLength] || 0) <= start) { + if (!silent) state.pending += marker; + state.pos += openerLength; + return true; + } + let matchEnd = pos; + let matchStart; + // Nothing found in the cache, scan until the end of the line (or until marker is found) + while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) { + matchEnd = matchStart + 1; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.useSidecar = useSidecar; -var _react = __webpack_require__(/*! react */ "react"); -var _env = __webpack_require__(/*! ./env */ "../../../node_modules/use-sidecar/dist/es2015/env.js"); -var cache = new WeakMap(); -var NO_OPTIONS = {}; -function useSidecar(importer, effect) { - var options = effect && effect.options || NO_OPTIONS; - if (_env.env.isNode && !options.ssr) { - return [null, null]; - } - // eslint-disable-next-line react-hooks/rules-of-hooks - return useRealSidecar(importer, effect); -} -function useRealSidecar(importer, effect) { - var options = effect && effect.options || NO_OPTIONS; - var couldUseCache = _env.env.forceCache || _env.env.isNode && !!options.ssr || !options.async; - var _a = (0, _react.useState)(couldUseCache ? function () { - return cache.get(importer); - } : undefined), - Car = _a[0], - setCar = _a[1]; - var _b = (0, _react.useState)(null), - error = _b[0], - setError = _b[1]; - (0, _react.useEffect)(function () { - if (!Car) { - importer().then(function (car) { - var resolved = effect ? effect.read() : car.default || car; - if (!resolved) { - console.error('Sidecar error: with importer', importer); - var error_1; - if (effect) { - console.error('Sidecar error: with medium', effect); - error_1 = new Error('Sidecar medium was not found'); - } else { - error_1 = new Error('Sidecar was not found in exports'); - } - setError(function () { - return error_1; - }); - throw error_1; - } - cache.set(importer, resolved); - setCar(function () { - return resolved; - }); - }, function (e) { - return setError(function () { - return e; - }); - }); + // scan marker length + while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60 /* ` */) { + matchEnd++; + } + const closerLength = matchEnd - matchStart; + if (closerLength === openerLength) { + // Found matching closer length. + if (!silent) { + const token = state.push('code_inline', 'code', 0); + token.markup = marker; + token.content = state.src.slice(pos, matchStart).replace(/\n/g, ' ').replace(/^ (.+) $/, '$1'); + } + state.pos = matchEnd; + return true; } - }, []); - return [Car, error]; -} - -/***/ }), -/***/ "../../../node_modules/use-sidecar/dist/es2015/index.js": -/*!**************************************************************!*\ - !*** ../../../node_modules/use-sidecar/dist/es2015/index.js ***! - \**************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + // Some different length found, put it in cache as upper limit of where closer can be found + state.backticks[closerLength] = matchStart; + } + // Scanned through the end, didn't find anything + state.backticksScanned = true; + if (!silent) state.pending += marker; + state.pos += openerLength; + return true; +} +// ~~strike through~~ +// -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "createMedium", ({ - enumerable: true, - get: function () { - return _medium.createMedium; - } -})); -Object.defineProperty(exports, "createSidecarMedium", ({ - enumerable: true, - get: function () { - return _medium.createSidecarMedium; +// Insert each marker as a separate text token, and add it to delimiter list +// +function strikethrough_tokenize(state, silent) { + const start = state.pos; + const marker = state.src.charCodeAt(start); + if (silent) { + return false; } -})); -Object.defineProperty(exports, "exportSidecar", ({ - enumerable: true, - get: function () { - return _exports.exportSidecar; + if (marker !== 0x7E /* ~ */) { + return false; } -})); -Object.defineProperty(exports, "renderCar", ({ - enumerable: true, - get: function () { - return _renderProp.renderCar; + const scanned = state.scanDelims(state.pos, true); + let len = scanned.length; + const ch = String.fromCharCode(marker); + if (len < 2) { + return false; } -})); -Object.defineProperty(exports, "setConfig", ({ - enumerable: true, - get: function () { - return _config.setConfig; + let token; + if (len % 2) { + token = state.push('text', '', 0); + token.content = ch; + len--; } -})); -Object.defineProperty(exports, "sidecar", ({ - enumerable: true, - get: function () { - return _hoc.sidecar; + for (let i = 0; i < len; i += 2) { + token = state.push('text', '', 0); + token.content = ch + ch; + state.delimiters.push({ + marker, + length: 0, + // disable "rule of 3" length checks meant for emphasis + token: state.tokens.length - 1, + end: -1, + open: scanned.can_open, + close: scanned.can_close + }); } -})); -Object.defineProperty(exports, "useSidecar", ({ - enumerable: true, - get: function () { - return _hook.useSidecar; + state.pos += scanned.length; + return true; +} +function postProcess$1(state, delimiters) { + let token; + const loneMarkers = []; + const max = delimiters.length; + for (let i = 0; i < max; i++) { + const startDelim = delimiters[i]; + if (startDelim.marker !== 0x7E /* ~ */) { + continue; + } + if (startDelim.end === -1) { + continue; + } + const endDelim = delimiters[startDelim.end]; + token = state.tokens[startDelim.token]; + token.type = 's_open'; + token.tag = 's'; + token.nesting = 1; + token.markup = '~~'; + token.content = ''; + token = state.tokens[endDelim.token]; + token.type = 's_close'; + token.tag = 's'; + token.nesting = -1; + token.markup = '~~'; + token.content = ''; + if (state.tokens[endDelim.token - 1].type === 'text' && state.tokens[endDelim.token - 1].content === '~') { + loneMarkers.push(endDelim.token - 1); + } } -})); -var _hoc = __webpack_require__(/*! ./hoc */ "../../../node_modules/use-sidecar/dist/es2015/hoc.js"); -var _hook = __webpack_require__(/*! ./hook */ "../../../node_modules/use-sidecar/dist/es2015/hook.js"); -var _config = __webpack_require__(/*! ./config */ "../../../node_modules/use-sidecar/dist/es2015/config.js"); -var _medium = __webpack_require__(/*! ./medium */ "../../../node_modules/use-sidecar/dist/es2015/medium.js"); -var _renderProp = __webpack_require__(/*! ./renderProp */ "../../../node_modules/use-sidecar/dist/es2015/renderProp.js"); -var _exports = __webpack_require__(/*! ./exports */ "../../../node_modules/use-sidecar/dist/es2015/exports.js"); -/***/ }), - -/***/ "../../../node_modules/use-sidecar/dist/es2015/medium.js": -/*!***************************************************************!*\ - !*** ../../../node_modules/use-sidecar/dist/es2015/medium.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + // If a marker sequence has an odd number of characters, it's splitted + // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the + // start of the sequence. + // + // So, we have to move all those markers after subsequent s_close tags. + // + while (loneMarkers.length) { + const i = loneMarkers.pop(); + let j = i + 1; + while (j < state.tokens.length && state.tokens[j].type === 's_close') { + j++; + } + j--; + if (i !== j) { + token = state.tokens[j]; + state.tokens[j] = state.tokens[i]; + state.tokens[i] = token; + } + } +} +// Walk through delimiter list and replace text tokens with tags +// +function strikethrough_postProcess(state) { + const tokens_meta = state.tokens_meta; + const max = state.tokens_meta.length; + postProcess$1(state, state.delimiters); + for (let curr = 0; curr < max; curr++) { + if (tokens_meta[curr] && tokens_meta[curr].delimiters) { + postProcess$1(state, tokens_meta[curr].delimiters); + } + } +} +var r_strikethrough = { + tokenize: strikethrough_tokenize, + postProcess: strikethrough_postProcess +}; +// Process *this* and _that_ +// -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.createMedium = createMedium; -exports.createSidecarMedium = createSidecarMedium; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); -function ItoI(a) { - return a; -} -function innerCreateMedium(defaults, middleware) { - if (middleware === void 0) { - middleware = ItoI; +// Insert each marker as a separate text token, and add it to delimiter list +// +function emphasis_tokenize(state, silent) { + const start = state.pos; + const marker = state.src.charCodeAt(start); + if (silent) { + return false; } - var buffer = []; - var assigned = false; - var medium = { - read: function () { - if (assigned) { - throw new Error('Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.'); - } - if (buffer.length) { - return buffer[buffer.length - 1]; - } - return defaults; - }, - useMedium: function (data) { - var item = middleware(data, assigned); - buffer.push(item); - return function () { - buffer = buffer.filter(function (x) { - return x !== item; - }); - }; - }, - assignSyncMedium: function (cb) { - assigned = true; - while (buffer.length) { - var cbs = buffer; - buffer = []; - cbs.forEach(cb); - } - buffer = { - push: function (x) { - return cb(x); - }, - filter: function () { - return buffer; - } - }; - }, - assignMedium: function (cb) { - assigned = true; - var pendingQueue = []; - if (buffer.length) { - var cbs = buffer; - buffer = []; - cbs.forEach(cb); - pendingQueue = buffer; - } - var executeQueue = function () { - var cbs = pendingQueue; - pendingQueue = []; - cbs.forEach(cb); - }; - var cycle = function () { - return Promise.resolve().then(executeQueue); - }; - cycle(); - buffer = { - push: function (x) { - pendingQueue.push(x); - cycle(); - }, - filter: function (filter) { - pendingQueue = pendingQueue.filter(filter); - return buffer; - } - }; - } - }; - return medium; + if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { + return false; + } + const scanned = state.scanDelims(state.pos, marker === 0x2A); + for (let i = 0; i < scanned.length; i++) { + const token = state.push('text', '', 0); + token.content = String.fromCharCode(marker); + state.delimiters.push({ + // Char code of the starting marker (number). + // + marker, + // Total length of these series of delimiters. + // + length: scanned.length, + // A position of the token this delimiter corresponds to. + // + token: state.tokens.length - 1, + // If this delimiter is matched as a valid opener, `end` will be + // equal to its position, otherwise it's `-1`. + // + end: -1, + // Boolean flags that determine if this delimiter could open or close + // an emphasis. + // + open: scanned.can_open, + close: scanned.can_close + }); + } + state.pos += scanned.length; + return true; } -function createMedium(defaults, middleware) { - if (middleware === void 0) { - middleware = ItoI; +function postProcess(state, delimiters) { + const max = delimiters.length; + for (let i = max - 1; i >= 0; i--) { + const startDelim = delimiters[i]; + if (startDelim.marker !== 0x5F /* _ */ && startDelim.marker !== 0x2A /* * */) { + continue; + } + + // Process only opening markers + if (startDelim.end === -1) { + continue; + } + const endDelim = delimiters[startDelim.end]; + + // If the previous delimiter has the same marker and is adjacent to this one, + // merge those into one strong delimiter. + // + // `whatever` -> `whatever` + // + const isStrong = i > 0 && delimiters[i - 1].end === startDelim.end + 1 && + // check that first two markers match and adjacent + delimiters[i - 1].marker === startDelim.marker && delimiters[i - 1].token === startDelim.token - 1 && + // check that last two markers are adjacent (we can safely assume they match) + delimiters[startDelim.end + 1].token === endDelim.token + 1; + const ch = String.fromCharCode(startDelim.marker); + const token_o = state.tokens[startDelim.token]; + token_o.type = isStrong ? 'strong_open' : 'em_open'; + token_o.tag = isStrong ? 'strong' : 'em'; + token_o.nesting = 1; + token_o.markup = isStrong ? ch + ch : ch; + token_o.content = ''; + const token_c = state.tokens[endDelim.token]; + token_c.type = isStrong ? 'strong_close' : 'em_close'; + token_c.tag = isStrong ? 'strong' : 'em'; + token_c.nesting = -1; + token_c.markup = isStrong ? ch + ch : ch; + token_c.content = ''; + if (isStrong) { + state.tokens[delimiters[i - 1].token].content = ''; + state.tokens[delimiters[startDelim.end + 1].token].content = ''; + i--; + } } - return innerCreateMedium(defaults, middleware); } -// eslint-disable-next-line @typescript-eslint/ban-types -function createSidecarMedium(options) { - if (options === void 0) { - options = {}; + +// Walk through delimiter list and replace text tokens with tags +// +function emphasis_post_process(state) { + const tokens_meta = state.tokens_meta; + const max = state.tokens_meta.length; + postProcess(state, state.delimiters); + for (let curr = 0; curr < max; curr++) { + if (tokens_meta[curr] && tokens_meta[curr].delimiters) { + postProcess(state, tokens_meta[curr].delimiters); + } } - var medium = innerCreateMedium(null); - medium.options = (0, _tslib.__assign)({ - async: true, - ssr: false - }, options); - return medium; } +var r_emphasis = { + tokenize: emphasis_tokenize, + postProcess: emphasis_post_process +}; -/***/ }), +// Process [link]( "stuff") -/***/ "../../../node_modules/use-sidecar/dist/es2015/renderProp.js": -/*!*******************************************************************!*\ - !*** ../../../node_modules/use-sidecar/dist/es2015/renderProp.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +function link(state, silent) { + let code, label, res, ref; + let href = ''; + let title = ''; + let start = state.pos; + let parseReference = true; + if (state.src.charCodeAt(state.pos) !== 0x5B /* [ */) { + return false; + } + const oldPos = state.pos; + const max = state.posMax; + const labelStart = state.pos + 1; + const labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true); + // parser failed to find ']', so it's not a valid link + if (labelEnd < 0) { + return false; + } + let pos = labelEnd + 1; + if (pos < max && state.src.charCodeAt(pos) === 0x28 /* ( */) { + // + // Inline link + // + // might have found a valid shortcut link, disable reference parsing + parseReference = false; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.renderCar = renderCar; -var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.js"); -var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -function renderCar(WrappedComponent, defaults) { - function State(_a) { - var stateRef = _a.stateRef, - props = _a.props; - var renderTarget = (0, React.useCallback)(function SideTarget() { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; + // [link]( "title" ) + // ^^ skipping these spaces + pos++; + for (; pos < max; pos++) { + code = state.src.charCodeAt(pos); + if (!isSpace(code) && code !== 0x0A) { + break; } - (0, React.useLayoutEffect)(function () { - stateRef.current(args); - }); - return null; - }, []); - // @ts-ignore - return /*#__PURE__*/React.createElement(WrappedComponent, (0, _tslib.__assign)({}, props, { - children: renderTarget - })); - } - var Children = /*#__PURE__*/React.memo(function (_a) { - var stateRef = _a.stateRef, - defaultState = _a.defaultState, - children = _a.children; - var _b = (0, React.useState)(defaultState.current), - state = _b[0], - setState = _b[1]; - (0, React.useEffect)(function () { - stateRef.current = setState; - }, []); - return children.apply(void 0, state); - }, function () { - return true; - }); - return function Combiner(props) { - var defaultState = React.useRef(defaults(props)); - var ref = React.useRef(function (state) { - return defaultState.current = state; - }); - return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(State, { - stateRef: ref, - props: props - }), /*#__PURE__*/React.createElement(Children, { - stateRef: ref, - defaultState: defaultState, - children: props.children - })); - }; -} - -/***/ }), + } + if (pos >= max) { + return false; + } -/***/ "../../../node_modules/vscode-languageserver-types/lib/esm/main.js": -/*!*************************************************************************!*\ - !*** ../../../node_modules/vscode-languageserver-types/lib/esm/main.js ***! - \*************************************************************************/ -/***/ (function(__unused_webpack_module, exports) { + // [link]( "title" ) + // ^^^^^^ parsing link destination + start = pos; + res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax); + if (res.ok) { + href = state.md.normalizeLink(res.str); + if (state.md.validateLink(href)) { + pos = res.pos; + } else { + href = ''; + } -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - * ------------------------------------------------------------------------------------------ */ + // [link]( "title" ) + // ^^ skipping these spaces + start = pos; + for (; pos < max; pos++) { + code = state.src.charCodeAt(pos); + if (!isSpace(code) && code !== 0x0A) { + break; + } + } + // [link]( "title" ) + // ^^^^^^^ parsing link title + res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax); + if (pos < max && start !== pos && res.ok) { + title = res.str; + pos = res.pos; -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.uinteger = exports.integer = exports.WorkspaceSymbol = exports.WorkspaceFolder = exports.WorkspaceEdit = exports.WorkspaceChange = exports.VersionedTextDocumentIdentifier = exports.URI = exports.TextEdit = exports.TextDocumentItem = exports.TextDocumentIdentifier = exports.TextDocumentEdit = exports.TextDocument = exports.SymbolTag = exports.SymbolKind = exports.SymbolInformation = exports.SignatureInformation = exports.SemanticTokens = exports.SemanticTokenTypes = exports.SemanticTokenModifiers = exports.SelectionRange = exports.RenameFile = exports.Range = exports.Position = exports.ParameterInformation = exports.OptionalVersionedTextDocumentIdentifier = exports.MarkupKind = exports.MarkupContent = exports.MarkedString = exports.LocationLink = exports.Location = exports.InsertTextMode = exports.InsertTextFormat = exports.InsertReplaceEdit = exports.InlineValueVariableLookup = exports.InlineValueText = exports.InlineValueEvaluatableExpression = exports.InlineValueContext = exports.InlayHintLabelPart = exports.InlayHintKind = exports.InlayHint = exports.Hover = exports.FormattingOptions = exports.FoldingRangeKind = exports.FoldingRange = exports.EOL = exports.DocumentUri = exports.DocumentSymbol = exports.DocumentLink = exports.DocumentHighlightKind = exports.DocumentHighlight = exports.DiagnosticTag = exports.DiagnosticSeverity = exports.DiagnosticRelatedInformation = exports.Diagnostic = exports.DeleteFile = exports.CreateFile = exports.CompletionList = exports.CompletionItemTag = exports.CompletionItemLabelDetails = exports.CompletionItemKind = exports.CompletionItem = exports.Command = exports.ColorPresentation = exports.ColorInformation = exports.Color = exports.CodeLens = exports.CodeDescription = exports.CodeActionTriggerKind = exports.CodeActionKind = exports.CodeActionContext = exports.CodeAction = exports.ChangeAnnotationIdentifier = exports.ChangeAnnotation = exports.AnnotatedTextEdit = void 0; -var DocumentUri; -exports.DocumentUri = DocumentUri; -(function (DocumentUri) { - function is(value) { - return typeof value === 'string'; - } - DocumentUri.is = is; -})(DocumentUri || (exports.DocumentUri = DocumentUri = {})); -var URI; -exports.URI = URI; -(function (URI) { - function is(value) { - return typeof value === 'string'; - } - URI.is = is; -})(URI || (exports.URI = URI = {})); -var integer; -exports.integer = integer; -(function (integer) { - integer.MIN_VALUE = -2147483648; - integer.MAX_VALUE = 2147483647; - function is(value) { - return typeof value === 'number' && integer.MIN_VALUE <= value && value <= integer.MAX_VALUE; - } - integer.is = is; -})(integer || (exports.integer = integer = {})); -var uinteger; -exports.uinteger = uinteger; -(function (uinteger) { - uinteger.MIN_VALUE = 0; - uinteger.MAX_VALUE = 2147483647; - function is(value) { - return typeof value === 'number' && uinteger.MIN_VALUE <= value && value <= uinteger.MAX_VALUE; - } - uinteger.is = is; -})(uinteger || (exports.uinteger = uinteger = {})); -/** - * The Position namespace provides helper functions to work with - * [Position](#Position) literals. - */ -var Position; -exports.Position = Position; -(function (Position) { - /** - * Creates a new Position literal from the given line and character. - * @param line The position's line. - * @param character The position's character. - */ - function create(line, character) { - if (line === Number.MAX_VALUE) { - line = uinteger.MAX_VALUE; + // [link]( "title" ) + // ^^ skipping these spaces + for (; pos < max; pos++) { + code = state.src.charCodeAt(pos); + if (!isSpace(code) && code !== 0x0A) { + break; + } + } + } } - if (character === Number.MAX_VALUE) { - character = uinteger.MAX_VALUE; + if (pos >= max || state.src.charCodeAt(pos) !== 0x29 /* ) */) { + // parsing a valid shortcut link failed, fallback to reference + parseReference = true; } - return { - line: line, - character: character - }; - } - Position.create = create; - /** - * Checks whether the given literal conforms to the [Position](#Position) interface. - */ - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && Is.uinteger(candidate.line) && Is.uinteger(candidate.character); + pos++; } - Position.is = is; -})(Position || (exports.Position = Position = {})); -/** - * The Range namespace provides helper functions to work with - * [Range](#Range) literals. - */ -var Range; -exports.Range = Range; -(function (Range) { - function create(one, two, three, four) { - if (Is.uinteger(one) && Is.uinteger(two) && Is.uinteger(three) && Is.uinteger(four)) { - return { - start: Position.create(one, two), - end: Position.create(three, four) - }; - } else if (Position.is(one) && Position.is(two)) { - return { - start: one, - end: two - }; - } else { - throw new Error("Range#create called with invalid arguments[".concat(one, ", ").concat(two, ", ").concat(three, ", ").concat(four, "]")); + if (parseReference) { + // + // Link reference + // + if (typeof state.env.references === 'undefined') { + return false; } + if (pos < max && state.src.charCodeAt(pos) === 0x5B /* [ */) { + start = pos + 1; + pos = state.md.helpers.parseLinkLabel(state, pos); + if (pos >= 0) { + label = state.src.slice(start, pos++); + } else { + pos = labelEnd + 1; + } + } else { + pos = labelEnd + 1; + } + + // covers label === '' and label === undefined + // (collapsed reference link and shortcut reference link respectively) + if (!label) { + label = state.src.slice(labelStart, labelEnd); + } + ref = state.env.references[normalizeReference(label)]; + if (!ref) { + state.pos = oldPos; + return false; + } + href = ref.href; + title = ref.title; } - Range.create = create; - /** - * Checks whether the given literal conforms to the [Range](#Range) interface. - */ - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && Position.is(candidate.start) && Position.is(candidate.end); - } - Range.is = is; -})(Range || (exports.Range = Range = {})); -/** - * The Location namespace provides helper functions to work with - * [Location](#Location) literals. - */ -var Location; -exports.Location = Location; -(function (Location) { - /** - * Creates a Location literal. - * @param uri The location's uri. - * @param range The location's range. - */ - function create(uri, range) { - return { - uri: uri, - range: range - }; - } - Location.create = create; - /** - * Checks whether the given literal conforms to the [Location](#Location) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Range.is(candidate.range) && (Is.string(candidate.uri) || Is.undefined(candidate.uri)); - } - Location.is = is; -})(Location || (exports.Location = Location = {})); -/** - * The LocationLink namespace provides helper functions to work with - * [LocationLink](#LocationLink) literals. - */ -var LocationLink; -exports.LocationLink = LocationLink; -(function (LocationLink) { - /** - * Creates a LocationLink literal. - * @param targetUri The definition's uri. - * @param targetRange The full range of the definition. - * @param targetSelectionRange The span of the symbol definition at the target. - * @param originSelectionRange The span of the symbol being defined in the originating source file. - */ - function create(targetUri, targetRange, targetSelectionRange, originSelectionRange) { - return { - targetUri: targetUri, - targetRange: targetRange, - targetSelectionRange: targetSelectionRange, - originSelectionRange: originSelectionRange - }; - } - LocationLink.create = create; - /** - * Checks whether the given literal conforms to the [LocationLink](#LocationLink) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Range.is(candidate.targetRange) && Is.string(candidate.targetUri) && Range.is(candidate.targetSelectionRange) && (Range.is(candidate.originSelectionRange) || Is.undefined(candidate.originSelectionRange)); - } - LocationLink.is = is; -})(LocationLink || (exports.LocationLink = LocationLink = {})); -/** - * The Color namespace provides helper functions to work with - * [Color](#Color) literals. - */ -var Color; -exports.Color = Color; -(function (Color) { - /** - * Creates a new Color literal. - */ - function create(red, green, blue, alpha) { - return { - red: red, - green: green, - blue: blue, - alpha: alpha - }; - } - Color.create = create; - /** - * Checks whether the given literal conforms to the [Color](#Color) interface. - */ - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && Is.numberRange(candidate.red, 0, 1) && Is.numberRange(candidate.green, 0, 1) && Is.numberRange(candidate.blue, 0, 1) && Is.numberRange(candidate.alpha, 0, 1); - } - Color.is = is; -})(Color || (exports.Color = Color = {})); -/** - * The ColorInformation namespace provides helper functions to work with - * [ColorInformation](#ColorInformation) literals. - */ -var ColorInformation; -exports.ColorInformation = ColorInformation; -(function (ColorInformation) { - /** - * Creates a new ColorInformation literal. - */ - function create(range, color) { - return { - range: range, - color: color - }; + + // + // We found the end of the link, and know for a fact it's a valid link; + // so all that's left to do is to call tokenizer. + // + if (!silent) { + state.pos = labelStart; + state.posMax = labelEnd; + const token_o = state.push('link_open', 'a', 1); + const attrs = [['href', href]]; + token_o.attrs = attrs; + if (title) { + attrs.push(['title', title]); + } + state.linkLevel++; + state.md.inline.tokenize(state); + state.linkLevel--; + state.push('link_close', 'a', -1); } - ColorInformation.create = create; - /** - * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface. - */ - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && Range.is(candidate.range) && Color.is(candidate.color); + state.pos = pos; + state.posMax = max; + return true; +} + +// Process ![image]( "title") + +function image(state, silent) { + let code, content, label, pos, ref, res, title, start; + let href = ''; + const oldPos = state.pos; + const max = state.posMax; + if (state.src.charCodeAt(state.pos) !== 0x21 /* ! */) { + return false; } - ColorInformation.is = is; -})(ColorInformation || (exports.ColorInformation = ColorInformation = {})); -/** - * The Color namespace provides helper functions to work with - * [ColorPresentation](#ColorPresentation) literals. - */ -var ColorPresentation; -exports.ColorPresentation = ColorPresentation; -(function (ColorPresentation) { - /** - * Creates a new ColorInformation literal. - */ - function create(label, textEdit, additionalTextEdits) { - return { - label: label, - textEdit: textEdit, - additionalTextEdits: additionalTextEdits - }; + if (state.src.charCodeAt(state.pos + 1) !== 0x5B /* [ */) { + return false; } - ColorPresentation.create = create; - /** - * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface. - */ - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && Is.string(candidate.label) && (Is.undefined(candidate.textEdit) || TextEdit.is(candidate)) && (Is.undefined(candidate.additionalTextEdits) || Is.typedArray(candidate.additionalTextEdits, TextEdit.is)); + const labelStart = state.pos + 2; + const labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false); + + // parser failed to find ']', so it's not a valid link + if (labelEnd < 0) { + return false; } - ColorPresentation.is = is; -})(ColorPresentation || (exports.ColorPresentation = ColorPresentation = {})); -/** - * A set of predefined range kinds. - */ -var FoldingRangeKind; -exports.FoldingRangeKind = FoldingRangeKind; -(function (FoldingRangeKind) { - /** - * Folding range for a comment - */ - FoldingRangeKind.Comment = 'comment'; - /** - * Folding range for a imports or includes - */ - FoldingRangeKind.Imports = 'imports'; - /** - * Folding range for a region (e.g. `#region`) - */ - FoldingRangeKind.Region = 'region'; -})(FoldingRangeKind || (exports.FoldingRangeKind = FoldingRangeKind = {})); -/** - * The folding range namespace provides helper functions to work with - * [FoldingRange](#FoldingRange) literals. - */ -var FoldingRange; -exports.FoldingRange = FoldingRange; -(function (FoldingRange) { - /** - * Creates a new FoldingRange literal. - */ - function create(startLine, endLine, startCharacter, endCharacter, kind, collapsedText) { - var result = { - startLine: startLine, - endLine: endLine - }; - if (Is.defined(startCharacter)) { - result.startCharacter = startCharacter; + pos = labelEnd + 1; + if (pos < max && state.src.charCodeAt(pos) === 0x28 /* ( */) { + // + // Inline link + // + + // [link]( "title" ) + // ^^ skipping these spaces + pos++; + for (; pos < max; pos++) { + code = state.src.charCodeAt(pos); + if (!isSpace(code) && code !== 0x0A) { + break; + } } - if (Is.defined(endCharacter)) { - result.endCharacter = endCharacter; + if (pos >= max) { + return false; } - if (Is.defined(kind)) { - result.kind = kind; + + // [link]( "title" ) + // ^^^^^^ parsing link destination + start = pos; + res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax); + if (res.ok) { + href = state.md.normalizeLink(res.str); + if (state.md.validateLink(href)) { + pos = res.pos; + } else { + href = ''; + } } - if (Is.defined(collapsedText)) { - result.collapsedText = collapsedText; + + // [link]( "title" ) + // ^^ skipping these spaces + start = pos; + for (; pos < max; pos++) { + code = state.src.charCodeAt(pos); + if (!isSpace(code) && code !== 0x0A) { + break; + } } - return result; - } - FoldingRange.create = create; - /** - * Checks whether the given literal conforms to the [FoldingRange](#FoldingRange) interface. - */ - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && Is.uinteger(candidate.startLine) && Is.uinteger(candidate.startLine) && (Is.undefined(candidate.startCharacter) || Is.uinteger(candidate.startCharacter)) && (Is.undefined(candidate.endCharacter) || Is.uinteger(candidate.endCharacter)) && (Is.undefined(candidate.kind) || Is.string(candidate.kind)); + + // [link]( "title" ) + // ^^^^^^^ parsing link title + res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax); + if (pos < max && start !== pos && res.ok) { + title = res.str; + pos = res.pos; + + // [link]( "title" ) + // ^^ skipping these spaces + for (; pos < max; pos++) { + code = state.src.charCodeAt(pos); + if (!isSpace(code) && code !== 0x0A) { + break; + } + } + } else { + title = ''; + } + if (pos >= max || state.src.charCodeAt(pos) !== 0x29 /* ) */) { + state.pos = oldPos; + return false; + } + pos++; + } else { + // + // Link reference + // + if (typeof state.env.references === 'undefined') { + return false; + } + if (pos < max && state.src.charCodeAt(pos) === 0x5B /* [ */) { + start = pos + 1; + pos = state.md.helpers.parseLinkLabel(state, pos); + if (pos >= 0) { + label = state.src.slice(start, pos++); + } else { + pos = labelEnd + 1; + } + } else { + pos = labelEnd + 1; + } + + // covers label === '' and label === undefined + // (collapsed reference link and shortcut reference link respectively) + if (!label) { + label = state.src.slice(labelStart, labelEnd); + } + ref = state.env.references[normalizeReference(label)]; + if (!ref) { + state.pos = oldPos; + return false; + } + href = ref.href; + title = ref.title; } - FoldingRange.is = is; -})(FoldingRange || (exports.FoldingRange = FoldingRange = {})); -/** - * The DiagnosticRelatedInformation namespace provides helper functions to work with - * [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) literals. - */ -var DiagnosticRelatedInformation; -exports.DiagnosticRelatedInformation = DiagnosticRelatedInformation; -(function (DiagnosticRelatedInformation) { - /** - * Creates a new DiagnosticRelatedInformation literal. - */ - function create(location, message) { - return { - location: location, - message: message - }; + + // + // We found the end of the link, and know for a fact it's a valid link; + // so all that's left to do is to call tokenizer. + // + if (!silent) { + content = state.src.slice(labelStart, labelEnd); + const tokens = []; + state.md.inline.parse(content, state.md, state.env, tokens); + const token = state.push('image', 'img', 0); + const attrs = [['src', href], ['alt', '']]; + token.attrs = attrs; + token.children = tokens; + token.content = content; + if (title) { + attrs.push(['title', title]); + } } - DiagnosticRelatedInformation.create = create; - /** - * Checks whether the given literal conforms to the [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Location.is(candidate.location) && Is.string(candidate.message); + state.pos = pos; + state.posMax = max; + return true; +} + +// Process autolinks '' + +/* eslint max-len:0 */ +const EMAIL_RE = /^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/; +/* eslint-disable-next-line no-control-regex */ +const AUTOLINK_RE = /^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\x00-\x20]*)$/; +function autolink(state, silent) { + let pos = state.pos; + if (state.src.charCodeAt(pos) !== 0x3C /* < */) { + return false; } - DiagnosticRelatedInformation.is = is; -})(DiagnosticRelatedInformation || (exports.DiagnosticRelatedInformation = DiagnosticRelatedInformation = {})); -/** - * The diagnostic's severity. - */ -var DiagnosticSeverity; -exports.DiagnosticSeverity = DiagnosticSeverity; -(function (DiagnosticSeverity) { - /** - * Reports an error. - */ - DiagnosticSeverity.Error = 1; - /** - * Reports a warning. - */ - DiagnosticSeverity.Warning = 2; - /** - * Reports an information. - */ - DiagnosticSeverity.Information = 3; - /** - * Reports a hint. - */ - DiagnosticSeverity.Hint = 4; -})(DiagnosticSeverity || (exports.DiagnosticSeverity = DiagnosticSeverity = {})); -/** - * The diagnostic tags. - * - * @since 3.15.0 - */ -var DiagnosticTag; -exports.DiagnosticTag = DiagnosticTag; -(function (DiagnosticTag) { - /** - * Unused or unnecessary code. - * - * Clients are allowed to render diagnostics with this tag faded out instead of having - * an error squiggle. - */ - DiagnosticTag.Unnecessary = 1; - /** - * Deprecated or obsolete code. - * - * Clients are allowed to rendered diagnostics with this tag strike through. - */ - DiagnosticTag.Deprecated = 2; -})(DiagnosticTag || (exports.DiagnosticTag = DiagnosticTag = {})); -/** - * The CodeDescription namespace provides functions to deal with descriptions for diagnostic codes. - * - * @since 3.16.0 - */ -var CodeDescription; -exports.CodeDescription = CodeDescription; -(function (CodeDescription) { - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && Is.string(candidate.href); + const start = state.pos; + const max = state.posMax; + for (;;) { + if (++pos >= max) return false; + const ch = state.src.charCodeAt(pos); + if (ch === 0x3C /* < */) return false; + if (ch === 0x3E /* > */) break; } - CodeDescription.is = is; -})(CodeDescription || (exports.CodeDescription = CodeDescription = {})); -/** - * The Diagnostic namespace provides helper functions to work with - * [Diagnostic](#Diagnostic) literals. - */ -var Diagnostic; -exports.Diagnostic = Diagnostic; -(function (Diagnostic) { - /** - * Creates a new Diagnostic literal. - */ - function create(range, message, severity, code, source, relatedInformation) { - var result = { - range: range, - message: message - }; - if (Is.defined(severity)) { - result.severity = severity; + const url = state.src.slice(start + 1, pos); + if (AUTOLINK_RE.test(url)) { + const fullUrl = state.md.normalizeLink(url); + if (!state.md.validateLink(fullUrl)) { + return false; } - if (Is.defined(code)) { - result.code = code; + if (!silent) { + const token_o = state.push('link_open', 'a', 1); + token_o.attrs = [['href', fullUrl]]; + token_o.markup = 'autolink'; + token_o.info = 'auto'; + const token_t = state.push('text', '', 0); + token_t.content = state.md.normalizeLinkText(url); + const token_c = state.push('link_close', 'a', -1); + token_c.markup = 'autolink'; + token_c.info = 'auto'; } - if (Is.defined(source)) { - result.source = source; + state.pos += url.length + 2; + return true; + } + if (EMAIL_RE.test(url)) { + const fullUrl = state.md.normalizeLink('mailto:' + url); + if (!state.md.validateLink(fullUrl)) { + return false; } - if (Is.defined(relatedInformation)) { - result.relatedInformation = relatedInformation; + if (!silent) { + const token_o = state.push('link_open', 'a', 1); + token_o.attrs = [['href', fullUrl]]; + token_o.markup = 'autolink'; + token_o.info = 'auto'; + const token_t = state.push('text', '', 0); + token_t.content = state.md.normalizeLinkText(url); + const token_c = state.push('link_close', 'a', -1); + token_c.markup = 'autolink'; + token_c.info = 'auto'; } - return result; + state.pos += url.length + 2; + return true; } - Diagnostic.create = create; - /** - * Checks whether the given literal conforms to the [Diagnostic](#Diagnostic) interface. - */ - function is(value) { - var _a; - var candidate = value; - return Is.defined(candidate) && Range.is(candidate.range) && Is.string(candidate.message) && (Is.number(candidate.severity) || Is.undefined(candidate.severity)) && (Is.integer(candidate.code) || Is.string(candidate.code) || Is.undefined(candidate.code)) && (Is.undefined(candidate.codeDescription) || Is.string((_a = candidate.codeDescription) === null || _a === void 0 ? void 0 : _a.href)) && (Is.string(candidate.source) || Is.undefined(candidate.source)) && (Is.undefined(candidate.relatedInformation) || Is.typedArray(candidate.relatedInformation, DiagnosticRelatedInformation.is)); - } - Diagnostic.is = is; -})(Diagnostic || (exports.Diagnostic = Diagnostic = {})); -/** - * The Command namespace provides helper functions to work with - * [Command](#Command) literals. - */ -var Command; -exports.Command = Command; -(function (Command) { - /** - * Creates a new Command literal. - */ - function create(title, command) { - var args = []; - for (var _i = 2; _i < arguments.length; _i++) { - args[_i - 2] = arguments[_i]; - } - var result = { - title: title, - command: command - }; - if (Is.defined(args) && args.length > 0) { - result.arguments = args; - } - return result; + return false; +} + +// Process html tags + +function isLinkOpen(str) { + return /^\s]/i.test(str); +} +function isLinkClose(str) { + return /^<\/a\s*>/i.test(str); +} +function isLetter(ch) { + /* eslint no-bitwise:0 */ + const lc = ch | 0x20; // to lower case + return lc >= 0x61 /* a */ && lc <= 0x7a /* z */; +} +function html_inline(state, silent) { + if (!state.md.options.html) { + return false; } - Command.create = create; - /** - * Checks whether the given literal conforms to the [Command](#Command) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Is.string(candidate.title) && Is.string(candidate.command); + + // Check start + const max = state.posMax; + const pos = state.pos; + if (state.src.charCodeAt(pos) !== 0x3C /* < */ || pos + 2 >= max) { + return false; } - Command.is = is; -})(Command || (exports.Command = Command = {})); -/** - * The TextEdit namespace provides helper function to create replace, - * insert and delete edits more easily. - */ -var TextEdit; -exports.TextEdit = TextEdit; -(function (TextEdit) { - /** - * Creates a replace text edit. - * @param range The range of text to be replaced. - * @param newText The new text. - */ - function replace(range, newText) { - return { - range: range, - newText: newText - }; + + // Quick fail on second char + const ch = state.src.charCodeAt(pos + 1); + if (ch !== 0x21 /* ! */ && ch !== 0x3F /* ? */ && ch !== 0x2F /* / */ && !isLetter(ch)) { + return false; } - TextEdit.replace = replace; - /** - * Creates a insert text edit. - * @param position The position to insert the text at. - * @param newText The text to be inserted. - */ - function insert(position, newText) { - return { - range: { - start: position, - end: position - }, - newText: newText - }; + const match = state.src.slice(pos).match(HTML_TAG_RE); + if (!match) { + return false; } - TextEdit.insert = insert; - /** - * Creates a delete text edit. - * @param range The range of text to be deleted. - */ - function del(range) { - return { - range: range, - newText: '' - }; + if (!silent) { + const token = state.push('html_inline', '', 0); + token.content = match[0]; + if (isLinkOpen(token.content)) state.linkLevel++; + if (isLinkClose(token.content)) state.linkLevel--; } - TextEdit.del = del; - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && Is.string(candidate.newText) && Range.is(candidate.range); + state.pos += match[0].length; + return true; +} + +// Process html entity - {, ¯, ", ... + +const DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i; +const NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i; +function entity(state, silent) { + const pos = state.pos; + const max = state.posMax; + if (state.src.charCodeAt(pos) !== 0x26 /* & */) return false; + if (pos + 1 >= max) return false; + const ch = state.src.charCodeAt(pos + 1); + if (ch === 0x23 /* # */) { + const match = state.src.slice(pos).match(DIGITAL_RE); + if (match) { + if (!silent) { + const code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10); + const token = state.push('text_special', '', 0); + token.content = isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD); + token.markup = match[0]; + token.info = 'entity'; + } + state.pos += match[0].length; + return true; + } + } else { + const match = state.src.slice(pos).match(NAMED_RE); + if (match) { + const decoded = entities.decodeHTML(match[0]); + if (decoded !== match[0]) { + if (!silent) { + const token = state.push('text_special', '', 0); + token.content = decoded; + token.markup = match[0]; + token.info = 'entity'; + } + state.pos += match[0].length; + return true; + } + } } - TextEdit.is = is; -})(TextEdit || (exports.TextEdit = TextEdit = {})); -var ChangeAnnotation; -exports.ChangeAnnotation = ChangeAnnotation; -(function (ChangeAnnotation) { - function create(label, needsConfirmation, description) { - var result = { - label: label - }; - if (needsConfirmation !== undefined) { - result.needsConfirmation = needsConfirmation; + return false; +} + +// For each opening emphasis-like marker find a matching closing one +// + +function processDelimiters(delimiters) { + const openersBottom = {}; + const max = delimiters.length; + if (!max) return; + + // headerIdx is the first delimiter of the current (where closer is) delimiter run + let headerIdx = 0; + let lastTokenIdx = -2; // needs any value lower than -1 + const jumps = []; + for (let closerIdx = 0; closerIdx < max; closerIdx++) { + const closer = delimiters[closerIdx]; + jumps.push(0); + + // markers belong to same delimiter run if: + // - they have adjacent tokens + // - AND markers are the same + // + if (delimiters[headerIdx].marker !== closer.marker || lastTokenIdx !== closer.token - 1) { + headerIdx = closerIdx; } - if (description !== undefined) { - result.description = description; + lastTokenIdx = closer.token; + + // Length is only used for emphasis-specific "rule of 3", + // if it's not defined (in strikethrough or 3rd party plugins), + // we can default it to 0 to disable those checks. + // + closer.length = closer.length || 0; + if (!closer.close) continue; + + // Previously calculated lower bounds (previous fails) + // for each marker, each delimiter length modulo 3, + // and for whether this closer can be an opener; + // https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460 + /* eslint-disable-next-line no-prototype-builtins */ + if (!openersBottom.hasOwnProperty(closer.marker)) { + openersBottom[closer.marker] = [-1, -1, -1, -1, -1, -1]; + } + const minOpenerIdx = openersBottom[closer.marker][(closer.open ? 3 : 0) + closer.length % 3]; + let openerIdx = headerIdx - jumps[headerIdx] - 1; + let newMinOpenerIdx = openerIdx; + for (; openerIdx > minOpenerIdx; openerIdx -= jumps[openerIdx] + 1) { + const opener = delimiters[openerIdx]; + if (opener.marker !== closer.marker) continue; + if (opener.open && opener.end < 0) { + let isOddMatch = false; + + // from spec: + // + // If one of the delimiters can both open and close emphasis, then the + // sum of the lengths of the delimiter runs containing the opening and + // closing delimiters must not be a multiple of 3 unless both lengths + // are multiples of 3. + // + if (opener.close || closer.open) { + if ((opener.length + closer.length) % 3 === 0) { + if (opener.length % 3 !== 0 || closer.length % 3 !== 0) { + isOddMatch = true; + } + } + } + if (!isOddMatch) { + // If previous delimiter cannot be an opener, we can safely skip + // the entire sequence in future checks. This is required to make + // sure algorithm has linear complexity (see *_*_*_*_*_... case). + // + const lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open ? jumps[openerIdx - 1] + 1 : 0; + jumps[closerIdx] = closerIdx - openerIdx + lastJump; + jumps[openerIdx] = lastJump; + closer.open = false; + opener.end = closerIdx; + opener.close = false; + newMinOpenerIdx = -1; + // treat next token as start of run, + // it optimizes skips in **<...>**a**<...>** pathological case + lastTokenIdx = -2; + break; + } + } + } + if (newMinOpenerIdx !== -1) { + // If match for this delimiter run failed, we want to set lower bound for + // future lookups. This is required to make sure algorithm has linear + // complexity. + // + // See details here: + // https://github.com/commonmark/cmark/issues/178#issuecomment-270417442 + // + openersBottom[closer.marker][(closer.open ? 3 : 0) + (closer.length || 0) % 3] = newMinOpenerIdx; } - return result; } - ChangeAnnotation.create = create; - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && Is.string(candidate.label) && (Is.boolean(candidate.needsConfirmation) || candidate.needsConfirmation === undefined) && (Is.string(candidate.description) || candidate.description === undefined); +} +function link_pairs(state) { + const tokens_meta = state.tokens_meta; + const max = state.tokens_meta.length; + processDelimiters(state.delimiters); + for (let curr = 0; curr < max; curr++) { + if (tokens_meta[curr] && tokens_meta[curr].delimiters) { + processDelimiters(tokens_meta[curr].delimiters); + } } - ChangeAnnotation.is = is; -})(ChangeAnnotation || (exports.ChangeAnnotation = ChangeAnnotation = {})); -var ChangeAnnotationIdentifier; -exports.ChangeAnnotationIdentifier = ChangeAnnotationIdentifier; -(function (ChangeAnnotationIdentifier) { - function is(value) { - var candidate = value; - return Is.string(candidate); +} + +// Clean up tokens after emphasis and strikethrough postprocessing: +// merge adjacent text nodes into one and re-calculate all token levels +// +// This is necessary because initially emphasis delimiter markers (*, _, ~) +// are treated as their own separate text tokens. Then emphasis rule either +// leaves them as text (needed to merge with adjacent text) or turns them +// into opening/closing tags (which messes up levels inside). +// + +function fragments_join(state) { + let curr, last; + let level = 0; + const tokens = state.tokens; + const max = state.tokens.length; + for (curr = last = 0; curr < max; curr++) { + // re-calculate levels after emphasis/strikethrough turns some text nodes + // into opening/closing tags + if (tokens[curr].nesting < 0) level--; // closing tag + tokens[curr].level = level; + if (tokens[curr].nesting > 0) level++; // opening tag + + if (tokens[curr].type === 'text' && curr + 1 < max && tokens[curr + 1].type === 'text') { + // collapse two adjacent text nodes + tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content; + } else { + if (curr !== last) { + tokens[last] = tokens[curr]; + } + last++; + } } - ChangeAnnotationIdentifier.is = is; -})(ChangeAnnotationIdentifier || (exports.ChangeAnnotationIdentifier = ChangeAnnotationIdentifier = {})); -var AnnotatedTextEdit; -exports.AnnotatedTextEdit = AnnotatedTextEdit; -(function (AnnotatedTextEdit) { - /** - * Creates an annotated replace text edit. - * - * @param range The range of text to be replaced. - * @param newText The new text. - * @param annotation The annotation. - */ - function replace(range, newText, annotation) { - return { - range: range, - newText: newText, - annotationId: annotation - }; + if (curr !== last) { + tokens.length = last; } - AnnotatedTextEdit.replace = replace; +} + +/** internal + * class ParserInline + * + * Tokenizes paragraph content. + **/ + +// Parser rules + +const _rules = [['text', text], ['linkify', linkify], ['newline', newline], ['escape', escape], ['backticks', backtick], ['strikethrough', r_strikethrough.tokenize], ['emphasis', r_emphasis.tokenize], ['link', link], ['image', image], ['autolink', autolink], ['html_inline', html_inline], ['entity', entity]]; + +// `rule2` ruleset was created specifically for emphasis/strikethrough +// post-processing and may be changed in the future. +// +// Don't use this for anything except pairs (plugins working with `balance_pairs`). +// +const _rules2 = [['balance_pairs', link_pairs], ['strikethrough', r_strikethrough.postProcess], ['emphasis', r_emphasis.postProcess], +// rules for pairs separate '**' into its own text tokens, which may be left unused, +// rule below merges unused segments back with the rest of the text +['fragments_join', fragments_join]]; + +/** + * new ParserInline() + **/ +function ParserInline() { /** - * Creates an annotated insert text edit. + * ParserInline#ruler -> Ruler * - * @param position The position to insert the text at. - * @param newText The text to be inserted. - * @param annotation The annotation. - */ - function insert(position, newText, annotation) { - return { - range: { - start: position, - end: position - }, - newText: newText, - annotationId: annotation - }; + * [[Ruler]] instance. Keep configuration of inline rules. + **/ + this.ruler = new Ruler(); + for (let i = 0; i < _rules.length; i++) { + this.ruler.push(_rules[i][0], _rules[i][1]); } - AnnotatedTextEdit.insert = insert; + /** - * Creates an annotated delete text edit. + * ParserInline#ruler2 -> Ruler * - * @param range The range of text to be deleted. - * @param annotation The annotation. - */ - function del(range, annotation) { - return { - range: range, - newText: '', - annotationId: annotation - }; - } - AnnotatedTextEdit.del = del; - function is(value) { - var candidate = value; - return TextEdit.is(candidate) && (ChangeAnnotation.is(candidate.annotationId) || ChangeAnnotationIdentifier.is(candidate.annotationId)); - } - AnnotatedTextEdit.is = is; -})(AnnotatedTextEdit || (exports.AnnotatedTextEdit = AnnotatedTextEdit = {})); -/** - * The TextDocumentEdit namespace provides helper function to create - * an edit that manipulates a text document. - */ -var TextDocumentEdit; -exports.TextDocumentEdit = TextDocumentEdit; -(function (TextDocumentEdit) { - /** - * Creates a new `TextDocumentEdit` - */ - function create(textDocument, edits) { - return { - textDocument: textDocument, - edits: edits - }; + * [[Ruler]] instance. Second ruler used for post-processing + * (e.g. in emphasis-like rules). + **/ + this.ruler2 = new Ruler(); + for (let i = 0; i < _rules2.length; i++) { + this.ruler2.push(_rules2[i][0], _rules2[i][1]); } - TextDocumentEdit.create = create; - function is(value) { - var candidate = value; - return Is.defined(candidate) && OptionalVersionedTextDocumentIdentifier.is(candidate.textDocument) && Array.isArray(candidate.edits); +} + +// Skip single token by running all rules in validation mode; +// returns `true` if any rule reported success +// +ParserInline.prototype.skipToken = function (state) { + const pos = state.pos; + const rules = this.ruler.getRules(''); + const len = rules.length; + const maxNesting = state.md.options.maxNesting; + const cache = state.cache; + if (typeof cache[pos] !== 'undefined') { + state.pos = cache[pos]; + return; } - TextDocumentEdit.is = is; -})(TextDocumentEdit || (exports.TextDocumentEdit = TextDocumentEdit = {})); -var CreateFile; -exports.CreateFile = CreateFile; -(function (CreateFile) { - function create(uri, options, annotation) { - var result = { - kind: 'create', - uri: uri - }; - if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) { - result.options = options; - } - if (annotation !== undefined) { - result.annotationId = annotation; + let ok = false; + if (state.level < maxNesting) { + for (let i = 0; i < len; i++) { + // Increment state.level and decrement it later to limit recursion. + // It's harmless to do here, because no tokens are created. But ideally, + // we'd need a separate private state variable for this purpose. + // + state.level++; + ok = rules[i](state, true); + state.level--; + if (ok) { + if (pos >= state.pos) { + throw new Error("inline rule didn't increment state.pos"); + } + break; + } } - return result; - } - CreateFile.create = create; - function is(value) { - var candidate = value; - return candidate && candidate.kind === 'create' && Is.string(candidate.uri) && (candidate.options === undefined || (candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId)); + } else { + // Too much nesting, just skip until the end of the paragraph. + // + // NOTE: this will cause links to behave incorrectly in the following case, + // when an amount of `[` is exactly equal to `maxNesting + 1`: + // + // [[[[[[[[[[[[[[[[[[[[[foo]() + // + // TODO: remove this workaround when CM standard will allow nested links + // (we can replace it by preventing links from being parsed in + // validation mode) + // + state.pos = state.posMax; } - CreateFile.is = is; -})(CreateFile || (exports.CreateFile = CreateFile = {})); -var RenameFile; -exports.RenameFile = RenameFile; -(function (RenameFile) { - function create(oldUri, newUri, options, annotation) { - var result = { - kind: 'rename', - oldUri: oldUri, - newUri: newUri - }; - if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) { - result.options = options; - } - if (annotation !== undefined) { - result.annotationId = annotation; - } - return result; + if (!ok) { + state.pos++; } - RenameFile.create = create; - function is(value) { - var candidate = value; - return candidate && candidate.kind === 'rename' && Is.string(candidate.oldUri) && Is.string(candidate.newUri) && (candidate.options === undefined || (candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId)); - } - RenameFile.is = is; -})(RenameFile || (exports.RenameFile = RenameFile = {})); -var DeleteFile; -exports.DeleteFile = DeleteFile; -(function (DeleteFile) { - function create(uri, options, annotation) { - var result = { - kind: 'delete', - uri: uri - }; - if (options !== undefined && (options.recursive !== undefined || options.ignoreIfNotExists !== undefined)) { - result.options = options; - } - if (annotation !== undefined) { - result.annotationId = annotation; + cache[pos] = state.pos; +}; + +// Generate tokens for input range +// +ParserInline.prototype.tokenize = function (state) { + const rules = this.ruler.getRules(''); + const len = rules.length; + const end = state.posMax; + const maxNesting = state.md.options.maxNesting; + while (state.pos < end) { + // Try all possible rules. + // On success, rule should: + // + // - update `state.pos` + // - update `state.tokens` + // - return true + const prevPos = state.pos; + let ok = false; + if (state.level < maxNesting) { + for (let i = 0; i < len; i++) { + ok = rules[i](state, false); + if (ok) { + if (prevPos >= state.pos) { + throw new Error("inline rule didn't increment state.pos"); + } + break; + } + } } - return result; - } - DeleteFile.create = create; - function is(value) { - var candidate = value; - return candidate && candidate.kind === 'delete' && Is.string(candidate.uri) && (candidate.options === undefined || (candidate.options.recursive === undefined || Is.boolean(candidate.options.recursive)) && (candidate.options.ignoreIfNotExists === undefined || Is.boolean(candidate.options.ignoreIfNotExists))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId)); - } - DeleteFile.is = is; -})(DeleteFile || (exports.DeleteFile = DeleteFile = {})); -var WorkspaceEdit; -exports.WorkspaceEdit = WorkspaceEdit; -(function (WorkspaceEdit) { - function is(value) { - var candidate = value; - return candidate && (candidate.changes !== undefined || candidate.documentChanges !== undefined) && (candidate.documentChanges === undefined || candidate.documentChanges.every(function (change) { - if (Is.string(change.kind)) { - return CreateFile.is(change) || RenameFile.is(change) || DeleteFile.is(change); - } else { - return TextDocumentEdit.is(change); + if (ok) { + if (state.pos >= end) { + break; } - })); + continue; + } + state.pending += state.src[state.pos++]; } - WorkspaceEdit.is = is; -})(WorkspaceEdit || (exports.WorkspaceEdit = WorkspaceEdit = {})); -var TextEditChangeImpl = /** @class */function () { - function TextEditChangeImpl(edits, changeAnnotations) { - this.edits = edits; - this.changeAnnotations = changeAnnotations; + if (state.pending) { + state.pushPending(); } - TextEditChangeImpl.prototype.insert = function (position, newText, annotation) { - var edit; - var id; - if (annotation === undefined) { - edit = TextEdit.insert(position, newText); - } else if (ChangeAnnotationIdentifier.is(annotation)) { - id = annotation; - edit = AnnotatedTextEdit.insert(position, newText, annotation); - } else { - this.assertChangeAnnotations(this.changeAnnotations); - id = this.changeAnnotations.manage(annotation); - edit = AnnotatedTextEdit.insert(position, newText, id); - } - this.edits.push(edit); - if (id !== undefined) { - return id; - } - }; - TextEditChangeImpl.prototype.replace = function (range, newText, annotation) { - var edit; - var id; - if (annotation === undefined) { - edit = TextEdit.replace(range, newText); - } else if (ChangeAnnotationIdentifier.is(annotation)) { - id = annotation; - edit = AnnotatedTextEdit.replace(range, newText, annotation); - } else { - this.assertChangeAnnotations(this.changeAnnotations); - id = this.changeAnnotations.manage(annotation); - edit = AnnotatedTextEdit.replace(range, newText, id); - } - this.edits.push(edit); - if (id !== undefined) { - return id; - } - }; - TextEditChangeImpl.prototype.delete = function (range, annotation) { - var edit; - var id; - if (annotation === undefined) { - edit = TextEdit.del(range); - } else if (ChangeAnnotationIdentifier.is(annotation)) { - id = annotation; - edit = AnnotatedTextEdit.del(range, annotation); - } else { - this.assertChangeAnnotations(this.changeAnnotations); - id = this.changeAnnotations.manage(annotation); - edit = AnnotatedTextEdit.del(range, id); - } - this.edits.push(edit); - if (id !== undefined) { - return id; - } - }; - TextEditChangeImpl.prototype.add = function (edit) { - this.edits.push(edit); - }; - TextEditChangeImpl.prototype.all = function () { - return this.edits; - }; - TextEditChangeImpl.prototype.clear = function () { - this.edits.splice(0, this.edits.length); - }; - TextEditChangeImpl.prototype.assertChangeAnnotations = function (value) { - if (value === undefined) { - throw new Error("Text edit change is not configured to manage change annotations."); - } - }; - return TextEditChangeImpl; -}(); +}; + /** - * A helper class - */ -var ChangeAnnotations = /** @class */function () { - function ChangeAnnotations(annotations) { - this._annotations = annotations === undefined ? Object.create(null) : annotations; - this._counter = 0; - this._size = 0; + * ParserInline.parse(str, md, env, outTokens) + * + * Process input string and push inline tokens into `outTokens` + **/ +ParserInline.prototype.parse = function (str, md, env, outTokens) { + const state = new this.State(str, md, env, outTokens); + this.tokenize(state); + const rules = this.ruler2.getRules(''); + const len = rules.length; + for (let i = 0; i < len; i++) { + rules[i](state); } - ChangeAnnotations.prototype.all = function () { - return this._annotations; - }; - Object.defineProperty(ChangeAnnotations.prototype, "size", { - get: function () { - return this._size; +}; +ParserInline.prototype.State = StateInline; + +// markdown-it default options + +var cfg_default = { + options: { + // Enable HTML tags in source + html: false, + // Use '/' to close single tags (
) + xhtmlOut: false, + // Convert '\n' in paragraphs into
+ breaks: false, + // CSS language prefix for fenced blocks + langPrefix: 'language-', + // autoconvert URL-like texts to links + linkify: false, + // Enable some language-neutral replacements + quotes beautification + typographer: false, + // Double + single quotes replacement pairs, when typographer enabled, + // and smartquotes on. Could be either a String or an Array. + // + // For example, you can use '«»„“' for Russian, '„“‚‘' for German, + // and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp). + quotes: '\u201c\u201d\u2018\u2019', + /* “”‘’ */ + + // Highlighter function. Should return escaped HTML, + // or '' if the source string is not changed and should be escaped externaly. + // If result starts with ) + xhtmlOut: false, + // Convert '\n' in paragraphs into
+ breaks: false, + // CSS language prefix for fenced blocks + langPrefix: 'language-', + // autoconvert URL-like texts to links + linkify: false, + // Enable some language-neutral replacements + quotes beautification + typographer: false, + // Double + single quotes replacement pairs, when typographer enabled, + // and smartquotes on. Could be either a String or an Array. + // + // For example, you can use '«»„“' for Russian, '„“‚‘' for German, + // and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp). + quotes: '\u201c\u201d\u2018\u2019', + /* “”‘’ */ + + // Highlighter function. Should return escaped HTML, + // or '' if the source string is not changed and should be escaped externaly. + // If result starts with ) + xhtmlOut: true, + // Convert '\n' in paragraphs into
+ breaks: false, + // CSS language prefix for fenced blocks + langPrefix: 'language-', + // autoconvert URL-like texts to links + linkify: false, + // Enable some language-neutral replacements + quotes beautification + typographer: false, + // Double + single quotes replacement pairs, when typographer enabled, + // and smartquotes on. Could be either a String or an Array. + // + // For example, you can use '«»„“' for Russian, '„“‚‘' for German, + // and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp). + quotes: '\u201c\u201d\u2018\u2019', + /* “”‘’ */ + + // Highlighter function. Should return escaped HTML, + // or '' if the source string is not changed and should be escaped externaly. + // If result starts with = 0) { + try { + parsed.hostname = punycode.toASCII(parsed.hostname); + } catch (er) {/**/} } - }; - WorkspaceChange.prototype.renameFile = function (oldUri, newUri, optionsOrAnnotation, options) { - this.initDocumentChanges(); - if (this._workspaceEdit.documentChanges === undefined) { - throw new Error('Workspace edit is not configured for document changes.'); + } + return mdurl__namespace.encode(mdurl__namespace.format(parsed)); +} +function normalizeLinkText(url) { + const parsed = mdurl__namespace.parse(url, true); + if (parsed.hostname) { + // Encode hostnames in urls like: + // `http://host/`, `https://host/`, `mailto:user@host`, `//host/` + // + // We don't encode unknown schemas, because it's likely that we encode + // something we shouldn't (e.g. `skype:name` treated as `skype:host`) + // + if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) { + try { + parsed.hostname = punycode.toUnicode(parsed.hostname); + } catch (er) {/**/} } - var annotation; - if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) { - annotation = optionsOrAnnotation; - } else { - options = optionsOrAnnotation; - } - var operation; - var id; - if (annotation === undefined) { - operation = RenameFile.create(oldUri, newUri, options); - } else { - id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation); - operation = RenameFile.create(oldUri, newUri, options, id); - } - this._workspaceEdit.documentChanges.push(operation); - if (id !== undefined) { - return id; - } - }; - WorkspaceChange.prototype.deleteFile = function (uri, optionsOrAnnotation, options) { - this.initDocumentChanges(); - if (this._workspaceEdit.documentChanges === undefined) { - throw new Error('Workspace edit is not configured for document changes.'); - } - var annotation; - if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) { - annotation = optionsOrAnnotation; - } else { - options = optionsOrAnnotation; - } - var operation; - var id; - if (annotation === undefined) { - operation = DeleteFile.create(uri, options); - } else { - id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation); - operation = DeleteFile.create(uri, options, id); - } - this._workspaceEdit.documentChanges.push(operation); - if (id !== undefined) { - return id; - } - }; - return WorkspaceChange; -}(); -exports.WorkspaceChange = WorkspaceChange; -/** - * The TextDocumentIdentifier namespace provides helper functions to work with - * [TextDocumentIdentifier](#TextDocumentIdentifier) literals. - */ -var TextDocumentIdentifier; -exports.TextDocumentIdentifier = TextDocumentIdentifier; -(function (TextDocumentIdentifier) { - /** - * Creates a new TextDocumentIdentifier literal. - * @param uri The document's uri. - */ - function create(uri) { - return { - uri: uri - }; - } - TextDocumentIdentifier.create = create; - /** - * Checks whether the given literal conforms to the [TextDocumentIdentifier](#TextDocumentIdentifier) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Is.string(candidate.uri); - } - TextDocumentIdentifier.is = is; -})(TextDocumentIdentifier || (exports.TextDocumentIdentifier = TextDocumentIdentifier = {})); -/** - * The VersionedTextDocumentIdentifier namespace provides helper functions to work with - * [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) literals. - */ -var VersionedTextDocumentIdentifier; -exports.VersionedTextDocumentIdentifier = VersionedTextDocumentIdentifier; -(function (VersionedTextDocumentIdentifier) { - /** - * Creates a new VersionedTextDocumentIdentifier literal. - * @param uri The document's uri. - * @param version The document's version. - */ - function create(uri, version) { - return { - uri: uri, - version: version - }; - } - VersionedTextDocumentIdentifier.create = create; - /** - * Checks whether the given literal conforms to the [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Is.string(candidate.uri) && Is.integer(candidate.version); } - VersionedTextDocumentIdentifier.is = is; -})(VersionedTextDocumentIdentifier || (exports.VersionedTextDocumentIdentifier = VersionedTextDocumentIdentifier = {})); + + // add '%' to exclude list because of https://github.com/markdown-it/markdown-it/issues/720 + return mdurl__namespace.decode(mdurl__namespace.format(parsed), mdurl__namespace.decode.defaultChars + '%'); +} + /** - * The OptionalVersionedTextDocumentIdentifier namespace provides helper functions to work with - * [OptionalVersionedTextDocumentIdentifier](#OptionalVersionedTextDocumentIdentifier) literals. - */ -var OptionalVersionedTextDocumentIdentifier; -exports.OptionalVersionedTextDocumentIdentifier = OptionalVersionedTextDocumentIdentifier; -(function (OptionalVersionedTextDocumentIdentifier) { - /** - * Creates a new OptionalVersionedTextDocumentIdentifier literal. - * @param uri The document's uri. - * @param version The document's version. - */ - function create(uri, version) { - return { - uri: uri, - version: version - }; - } - OptionalVersionedTextDocumentIdentifier.create = create; - /** - * Checks whether the given literal conforms to the [OptionalVersionedTextDocumentIdentifier](#OptionalVersionedTextDocumentIdentifier) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Is.string(candidate.uri) && (candidate.version === null || Is.integer(candidate.version)); - } - OptionalVersionedTextDocumentIdentifier.is = is; -})(OptionalVersionedTextDocumentIdentifier || (exports.OptionalVersionedTextDocumentIdentifier = OptionalVersionedTextDocumentIdentifier = {})); + * class MarkdownIt + * + * Main parser/renderer class. + * + * ##### Usage + * + * ```javascript + * // node.js, "classic" way: + * var MarkdownIt = require('markdown-it'), + * md = new MarkdownIt(); + * var result = md.render('# markdown-it rulezz!'); + * + * // node.js, the same, but with sugar: + * var md = require('markdown-it')(); + * var result = md.render('# markdown-it rulezz!'); + * + * // browser without AMD, added to "window" on script load + * // Note, there are no dash. + * var md = window.markdownit(); + * var result = md.render('# markdown-it rulezz!'); + * ``` + * + * Single line rendering, without paragraph wrap: + * + * ```javascript + * var md = require('markdown-it')(); + * var result = md.renderInline('__markdown-it__ rulezz!'); + * ``` + **/ + /** - * The TextDocumentItem namespace provides helper functions to work with - * [TextDocumentItem](#TextDocumentItem) literals. - */ -var TextDocumentItem; -exports.TextDocumentItem = TextDocumentItem; -(function (TextDocumentItem) { - /** - * Creates a new TextDocumentItem literal. - * @param uri The document's uri. - * @param languageId The document's language identifier. - * @param version The document's version number. - * @param text The document's text. - */ - function create(uri, languageId, version, text) { - return { - uri: uri, - languageId: languageId, - version: version, - text: text - }; + * new MarkdownIt([presetName, options]) + * - presetName (String): optional, `commonmark` / `zero` + * - options (Object) + * + * Creates parser instanse with given config. Can be called without `new`. + * + * ##### presetName + * + * MarkdownIt provides named presets as a convenience to quickly + * enable/disable active syntax rules and options for common use cases. + * + * - ["commonmark"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/commonmark.mjs) - + * configures parser to strict [CommonMark](http://commonmark.org/) mode. + * - [default](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/default.mjs) - + * similar to GFM, used when no preset name given. Enables all available rules, + * but still without html, typographer & autolinker. + * - ["zero"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.mjs) - + * all rules disabled. Useful to quickly setup your config via `.enable()`. + * For example, when you need only `bold` and `italic` markup and nothing else. + * + * ##### options: + * + * - __html__ - `false`. Set `true` to enable HTML tags in source. Be careful! + * That's not safe! You may need external sanitizer to protect output from XSS. + * It's better to extend features via plugins, instead of enabling HTML. + * - __xhtmlOut__ - `false`. Set `true` to add '/' when closing single tags + * (`
`). This is needed only for full CommonMark compatibility. In real + * world you will need HTML output. + * - __breaks__ - `false`. Set `true` to convert `\n` in paragraphs into `
`. + * - __langPrefix__ - `language-`. CSS language class prefix for fenced blocks. + * Can be useful for external highlighters. + * - __linkify__ - `false`. Set `true` to autoconvert URL-like text to links. + * - __typographer__ - `false`. Set `true` to enable [some language-neutral + * replacement](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.mjs) + + * quotes beautification (smartquotes). + * - __quotes__ - `“”‘’`, String or Array. Double + single quotes replacement + * pairs, when typographer enabled and smartquotes on. For example, you can + * use `'«»„“'` for Russian, `'„“‚‘'` for German, and + * `['«\xA0', '\xA0»', '‹\xA0', '\xA0›']` for French (including nbsp). + * - __highlight__ - `null`. Highlighter function for fenced code blocks. + * Highlighter `function (str, lang)` should return escaped HTML. It can also + * return empty string if the source was not changed and should be escaped + * externaly. If result starts with ` or ``): + * + * ```javascript + * var hljs = require('highlight.js') // https://highlightjs.org/ + * + * // Actual default values + * var md = require('markdown-it')({ + * highlight: function (str, lang) { + * if (lang && hljs.getLanguage(lang)) { + * try { + * return '
' +
+ *                hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +
+ *                '
'; + * } catch (__) {} + * } + * + * return '
' + md.utils.escapeHtml(str) + '
'; + * } + * }); + * ``` + * + **/ +function MarkdownIt(presetName, options) { + if (!(this instanceof MarkdownIt)) { + return new MarkdownIt(presetName, options); } - TextDocumentItem.create = create; - /** - * Checks whether the given literal conforms to the [TextDocumentItem](#TextDocumentItem) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Is.string(candidate.uri) && Is.string(candidate.languageId) && Is.integer(candidate.version) && Is.string(candidate.text); + if (!options) { + if (!isString(presetName)) { + options = presetName || {}; + presetName = 'default'; + } } - TextDocumentItem.is = is; -})(TextDocumentItem || (exports.TextDocumentItem = TextDocumentItem = {})); -/** - * Describes the content type that a client supports in various - * result literals like `Hover`, `ParameterInfo` or `CompletionItem`. - * - * Please note that `MarkupKinds` must not start with a `$`. This kinds - * are reserved for internal usage. - */ -var MarkupKind; -exports.MarkupKind = MarkupKind; -(function (MarkupKind) { + /** - * Plain text is supported as a content format - */ - MarkupKind.PlainText = 'plaintext'; + * MarkdownIt#inline -> ParserInline + * + * Instance of [[ParserInline]]. You may need it to add new rules when + * writing plugins. For simple rules control use [[MarkdownIt.disable]] and + * [[MarkdownIt.enable]]. + **/ + this.inline = new ParserInline(); + /** - * Markdown is supported as a content format - */ - MarkupKind.Markdown = 'markdown'; + * MarkdownIt#block -> ParserBlock + * + * Instance of [[ParserBlock]]. You may need it to add new rules when + * writing plugins. For simple rules control use [[MarkdownIt.disable]] and + * [[MarkdownIt.enable]]. + **/ + this.block = new ParserBlock(); + /** - * Checks whether the given value is a value of the [MarkupKind](#MarkupKind) type. - */ - function is(value) { - var candidate = value; - return candidate === MarkupKind.PlainText || candidate === MarkupKind.Markdown; - } - MarkupKind.is = is; -})(MarkupKind || (exports.MarkupKind = MarkupKind = {})); -var MarkupContent; -exports.MarkupContent = MarkupContent; -(function (MarkupContent) { + * MarkdownIt#core -> Core + * + * Instance of [[Core]] chain executor. You may need it to add new rules when + * writing plugins. For simple rules control use [[MarkdownIt.disable]] and + * [[MarkdownIt.enable]]. + **/ + this.core = new Core(); + /** - * Checks whether the given value conforms to the [MarkupContent](#MarkupContent) interface. - */ - function is(value) { - var candidate = value; - return Is.objectLiteral(value) && MarkupKind.is(candidate.kind) && Is.string(candidate.value); - } - MarkupContent.is = is; -})(MarkupContent || (exports.MarkupContent = MarkupContent = {})); -/** - * The kind of a completion entry. - */ -var CompletionItemKind; -exports.CompletionItemKind = CompletionItemKind; -(function (CompletionItemKind) { - CompletionItemKind.Text = 1; - CompletionItemKind.Method = 2; - CompletionItemKind.Function = 3; - CompletionItemKind.Constructor = 4; - CompletionItemKind.Field = 5; - CompletionItemKind.Variable = 6; - CompletionItemKind.Class = 7; - CompletionItemKind.Interface = 8; - CompletionItemKind.Module = 9; - CompletionItemKind.Property = 10; - CompletionItemKind.Unit = 11; - CompletionItemKind.Value = 12; - CompletionItemKind.Enum = 13; - CompletionItemKind.Keyword = 14; - CompletionItemKind.Snippet = 15; - CompletionItemKind.Color = 16; - CompletionItemKind.File = 17; - CompletionItemKind.Reference = 18; - CompletionItemKind.Folder = 19; - CompletionItemKind.EnumMember = 20; - CompletionItemKind.Constant = 21; - CompletionItemKind.Struct = 22; - CompletionItemKind.Event = 23; - CompletionItemKind.Operator = 24; - CompletionItemKind.TypeParameter = 25; -})(CompletionItemKind || (exports.CompletionItemKind = CompletionItemKind = {})); -/** - * Defines whether the insert text in a completion item should be interpreted as - * plain text or a snippet. - */ -var InsertTextFormat; -exports.InsertTextFormat = InsertTextFormat; -(function (InsertTextFormat) { + * MarkdownIt#renderer -> Renderer + * + * Instance of [[Renderer]]. Use it to modify output look. Or to add rendering + * rules for new token types, generated by plugins. + * + * ##### Example + * + * ```javascript + * var md = require('markdown-it')(); + * + * function myToken(tokens, idx, options, env, self) { + * //... + * return result; + * }; + * + * md.renderer.rules['my_token'] = myToken + * ``` + * + * See [[Renderer]] docs and [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.mjs). + **/ + this.renderer = new Renderer(); + /** - * The primary text to be inserted is treated as a plain string. - */ - InsertTextFormat.PlainText = 1; + * MarkdownIt#linkify -> LinkifyIt + * + * [linkify-it](https://github.com/markdown-it/linkify-it) instance. + * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/linkify.mjs) + * rule. + **/ + this.linkify = new LinkifyIt(); + /** - * The primary text to be inserted is treated as a snippet. + * MarkdownIt#validateLink(url) -> Boolean * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Placeholders with equal identifiers are linked, - * that is typing in one will update others too. + * Link validation function. CommonMark allows too much in links. By default + * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas + * except some embedded image types. * - * See also: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#snippet_syntax - */ - InsertTextFormat.Snippet = 2; -})(InsertTextFormat || (exports.InsertTextFormat = InsertTextFormat = {})); -/** - * Completion item tags are extra annotations that tweak the rendering of a completion - * item. - * - * @since 3.15.0 - */ -var CompletionItemTag; -exports.CompletionItemTag = CompletionItemTag; -(function (CompletionItemTag) { - /** - * Render a completion as obsolete, usually using a strike-out. - */ - CompletionItemTag.Deprecated = 1; -})(CompletionItemTag || (exports.CompletionItemTag = CompletionItemTag = {})); -/** - * The InsertReplaceEdit namespace provides functions to deal with insert / replace edits. - * - * @since 3.16.0 - */ -var InsertReplaceEdit; -exports.InsertReplaceEdit = InsertReplaceEdit; -(function (InsertReplaceEdit) { + * You can change this behaviour: + * + * ```javascript + * var md = require('markdown-it')(); + * // enable everything + * md.validateLink = function () { return true; } + * ``` + **/ + this.validateLink = validateLink; + /** - * Creates a new insert / replace edit - */ - function create(newText, insert, replace) { - return { - newText: newText, - insert: insert, - replace: replace - }; - } - InsertReplaceEdit.create = create; + * MarkdownIt#normalizeLink(url) -> String + * + * Function used to encode link url to a machine-readable format, + * which includes url-encoding, punycode, etc. + **/ + this.normalizeLink = normalizeLink; + /** - * Checks whether the given literal conforms to the [InsertReplaceEdit](#InsertReplaceEdit) interface. - */ - function is(value) { - var candidate = value; - return candidate && Is.string(candidate.newText) && Range.is(candidate.insert) && Range.is(candidate.replace); - } - InsertReplaceEdit.is = is; -})(InsertReplaceEdit || (exports.InsertReplaceEdit = InsertReplaceEdit = {})); -/** - * How whitespace and indentation is handled during completion - * item insertion. - * - * @since 3.16.0 - */ -var InsertTextMode; -exports.InsertTextMode = InsertTextMode; -(function (InsertTextMode) { + * MarkdownIt#normalizeLinkText(url) -> String + * + * Function used to decode link url to a human-readable format` + **/ + this.normalizeLinkText = normalizeLinkText; + + // Expose utils & helpers for easy acces from plugins + /** - * The insertion or replace strings is taken as it is. If the - * value is multi line the lines below the cursor will be - * inserted using the indentation defined in the string value. - * The client will not apply any kind of adjustments to the - * string. - */ - InsertTextMode.asIs = 1; + * MarkdownIt#utils -> utils + * + * Assorted utility functions, useful to write plugins. See details + * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/common/utils.mjs). + **/ + this.utils = utils; + /** - * The editor adjusts leading whitespace of new lines so that - * they match the indentation up to the cursor of the line for - * which the item is accepted. + * MarkdownIt#helpers -> helpers * - * Consider a line like this: <2tabs><3tabs>foo. Accepting a - * multi line completion item is indented using 2 tabs and all - * following lines inserted will be indented using 2 tabs as well. - */ - InsertTextMode.adjustIndentation = 2; -})(InsertTextMode || (exports.InsertTextMode = InsertTextMode = {})); -var CompletionItemLabelDetails; -exports.CompletionItemLabelDetails = CompletionItemLabelDetails; -(function (CompletionItemLabelDetails) { - function is(value) { - var candidate = value; - return candidate && (Is.string(candidate.detail) || candidate.detail === undefined) && (Is.string(candidate.description) || candidate.description === undefined); + * Link components parser functions, useful to write plugins. See details + * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/helpers). + **/ + this.helpers = assign({}, helpers); + this.options = {}; + this.configure(presetName); + if (options) { + this.set(options); } - CompletionItemLabelDetails.is = is; -})(CompletionItemLabelDetails || (exports.CompletionItemLabelDetails = CompletionItemLabelDetails = {})); -/** - * The CompletionItem namespace provides functions to deal with - * completion items. - */ -var CompletionItem; -exports.CompletionItem = CompletionItem; -(function (CompletionItem) { - /** - * Create a completion item and seed it with a label. - * @param label The completion item's label - */ - function create(label) { - return { - label: label - }; +} + +/** chainable + * MarkdownIt.set(options) + * + * Set parser options (in the same format as in constructor). Probably, you + * will never need it, but you can change options after constructor call. + * + * ##### Example + * + * ```javascript + * var md = require('markdown-it')() + * .set({ html: true, breaks: true }) + * .set({ typographer, true }); + * ``` + * + * __Note:__ To achieve the best possible performance, don't modify a + * `markdown-it` instance options on the fly. If you need multiple configurations + * it's best to create multiple instances and initialize each with separate + * config. + **/ +MarkdownIt.prototype.set = function (options) { + assign(this.options, options); + return this; +}; + +/** chainable, internal + * MarkdownIt.configure(presets) + * + * Batch load of all options and compenent settings. This is internal method, + * and you probably will not need it. But if you will - see available presets + * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets) + * + * We strongly recommend to use presets instead of direct config loads. That + * will give better compatibility with next versions. + **/ +MarkdownIt.prototype.configure = function (presets) { + const self = this; + if (isString(presets)) { + const presetName = presets; + presets = config[presetName]; + if (!presets) { + throw new Error('Wrong `markdown-it` preset "' + presetName + '", check name'); + } } - CompletionItem.create = create; -})(CompletionItem || (exports.CompletionItem = CompletionItem = {})); -/** - * The CompletionList namespace provides functions to deal with - * completion lists. - */ -var CompletionList; -exports.CompletionList = CompletionList; -(function (CompletionList) { - /** - * Creates a new completion list. - * - * @param items The completion items. - * @param isIncomplete The list is not complete. - */ - function create(items, isIncomplete) { - return { - items: items ? items : [], - isIncomplete: !!isIncomplete - }; + if (!presets) { + throw new Error('Wrong `markdown-it` preset, can\'t be empty'); } - CompletionList.create = create; -})(CompletionList || (exports.CompletionList = CompletionList = {})); -var MarkedString; -exports.MarkedString = MarkedString; -(function (MarkedString) { - /** - * Creates a marked string from plain text. - * - * @param plainText The plain text. - */ - function fromPlainText(plainText) { - return plainText.replace(/[\\`*_{}[\]()#+\-.!]/g, '\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash + if (presets.options) { + self.set(presets.options); } + if (presets.components) { + Object.keys(presets.components).forEach(function (name) { + if (presets.components[name].rules) { + self[name].ruler.enableOnly(presets.components[name].rules); + } + if (presets.components[name].rules2) { + self[name].ruler2.enableOnly(presets.components[name].rules2); + } + }); + } + return this; +}; - MarkedString.fromPlainText = fromPlainText; - /** - * Checks whether the given value conforms to the [MarkedString](#MarkedString) type. - */ - function is(value) { - var candidate = value; - return Is.string(candidate) || Is.objectLiteral(candidate) && Is.string(candidate.language) && Is.string(candidate.value); +/** chainable + * MarkdownIt.enable(list, ignoreInvalid) + * - list (String|Array): rule name or list of rule names to enable + * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found. + * + * Enable list or rules. It will automatically find appropriate components, + * containing rules with given names. If rule not found, and `ignoreInvalid` + * not set - throws exception. + * + * ##### Example + * + * ```javascript + * var md = require('markdown-it')() + * .enable(['sub', 'sup']) + * .disable('smartquotes'); + * ``` + **/ +MarkdownIt.prototype.enable = function (list, ignoreInvalid) { + let result = []; + if (!Array.isArray(list)) { + list = [list]; } - MarkedString.is = is; -})(MarkedString || (exports.MarkedString = MarkedString = {})); -var Hover; -exports.Hover = Hover; -(function (Hover) { - /** - * Checks whether the given value conforms to the [Hover](#Hover) interface. - */ - function is(value) { - var candidate = value; - return !!candidate && Is.objectLiteral(candidate) && (MarkupContent.is(candidate.contents) || MarkedString.is(candidate.contents) || Is.typedArray(candidate.contents, MarkedString.is)) && (value.range === undefined || Range.is(value.range)); + ['core', 'block', 'inline'].forEach(function (chain) { + result = result.concat(this[chain].ruler.enable(list, true)); + }, this); + result = result.concat(this.inline.ruler2.enable(list, true)); + const missed = list.filter(function (name) { + return result.indexOf(name) < 0; + }); + if (missed.length && !ignoreInvalid) { + throw new Error('MarkdownIt. Failed to enable unknown rule(s): ' + missed); } - Hover.is = is; -})(Hover || (exports.Hover = Hover = {})); -/** - * The ParameterInformation namespace provides helper functions to work with - * [ParameterInformation](#ParameterInformation) literals. - */ -var ParameterInformation; -exports.ParameterInformation = ParameterInformation; -(function (ParameterInformation) { - /** - * Creates a new parameter information literal. - * - * @param label A label string. - * @param documentation A doc string. - */ - function create(label, documentation) { - return documentation ? { - label: label, - documentation: documentation - } : { - label: label - }; + return this; +}; + +/** chainable + * MarkdownIt.disable(list, ignoreInvalid) + * - list (String|Array): rule name or list of rule names to disable. + * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found. + * + * The same as [[MarkdownIt.enable]], but turn specified rules off. + **/ +MarkdownIt.prototype.disable = function (list, ignoreInvalid) { + let result = []; + if (!Array.isArray(list)) { + list = [list]; } - ParameterInformation.create = create; -})(ParameterInformation || (exports.ParameterInformation = ParameterInformation = {})); -/** - * The SignatureInformation namespace provides helper functions to work with - * [SignatureInformation](#SignatureInformation) literals. - */ -var SignatureInformation; -exports.SignatureInformation = SignatureInformation; -(function (SignatureInformation) { - function create(label, documentation) { - var parameters = []; - for (var _i = 2; _i < arguments.length; _i++) { - parameters[_i - 2] = arguments[_i]; - } - var result = { - label: label - }; - if (Is.defined(documentation)) { - result.documentation = documentation; - } - if (Is.defined(parameters)) { - result.parameters = parameters; - } else { - result.parameters = []; - } - return result; + ['core', 'block', 'inline'].forEach(function (chain) { + result = result.concat(this[chain].ruler.disable(list, true)); + }, this); + result = result.concat(this.inline.ruler2.disable(list, true)); + const missed = list.filter(function (name) { + return result.indexOf(name) < 0; + }); + if (missed.length && !ignoreInvalid) { + throw new Error('MarkdownIt. Failed to disable unknown rule(s): ' + missed); } - SignatureInformation.create = create; -})(SignatureInformation || (exports.SignatureInformation = SignatureInformation = {})); -/** - * A document highlight kind. - */ -var DocumentHighlightKind; -exports.DocumentHighlightKind = DocumentHighlightKind; -(function (DocumentHighlightKind) { - /** - * A textual occurrence. - */ - DocumentHighlightKind.Text = 1; - /** - * Read-access of a symbol, like reading a variable. - */ - DocumentHighlightKind.Read = 2; - /** - * Write-access of a symbol, like writing to a variable. - */ - DocumentHighlightKind.Write = 3; -})(DocumentHighlightKind || (exports.DocumentHighlightKind = DocumentHighlightKind = {})); -/** - * DocumentHighlight namespace to provide helper functions to work with - * [DocumentHighlight](#DocumentHighlight) literals. - */ -var DocumentHighlight; -exports.DocumentHighlight = DocumentHighlight; -(function (DocumentHighlight) { - /** - * Create a DocumentHighlight object. - * @param range The range the highlight applies to. - * @param kind The highlight kind - */ - function create(range, kind) { - var result = { - range: range - }; - if (Is.number(kind)) { - result.kind = kind; - } - return result; + return this; +}; + +/** chainable + * MarkdownIt.use(plugin, params) + * + * Load specified plugin with given params into current parser instance. + * It's just a sugar to call `plugin(md, params)` with curring. + * + * ##### Example + * + * ```javascript + * var iterator = require('markdown-it-for-inline'); + * var md = require('markdown-it')() + * .use(iterator, 'foo_replace', 'text', function (tokens, idx) { + * tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar'); + * }); + * ``` + **/ +MarkdownIt.prototype.use = function (plugin /*, params, ... */) { + const args = [this].concat(Array.prototype.slice.call(arguments, 1)); + plugin.apply(plugin, args); + return this; +}; + +/** internal + * MarkdownIt.parse(src, env) -> Array + * - src (String): source string + * - env (Object): environment sandbox + * + * Parse input string and return list of block tokens (special token type + * "inline" will contain list of inline tokens). You should not call this + * method directly, until you write custom renderer (for example, to produce + * AST). + * + * `env` is used to pass data between "distributed" rules and return additional + * metadata like reference info, needed for the renderer. It also can be used to + * inject data in specific cases. Usually, you will be ok to pass `{}`, + * and then pass updated object to renderer. + **/ +MarkdownIt.prototype.parse = function (src, env) { + if (typeof src !== 'string') { + throw new Error('Input data should be a String'); } - DocumentHighlight.create = create; -})(DocumentHighlight || (exports.DocumentHighlight = DocumentHighlight = {})); + const state = new this.core.State(src, this, env); + this.core.process(state); + return state.tokens; +}; + /** - * A symbol kind. - */ -var SymbolKind; -exports.SymbolKind = SymbolKind; -(function (SymbolKind) { - SymbolKind.File = 1; - SymbolKind.Module = 2; - SymbolKind.Namespace = 3; - SymbolKind.Package = 4; - SymbolKind.Class = 5; - SymbolKind.Method = 6; - SymbolKind.Property = 7; - SymbolKind.Field = 8; - SymbolKind.Constructor = 9; - SymbolKind.Enum = 10; - SymbolKind.Interface = 11; - SymbolKind.Function = 12; - SymbolKind.Variable = 13; - SymbolKind.Constant = 14; - SymbolKind.String = 15; - SymbolKind.Number = 16; - SymbolKind.Boolean = 17; - SymbolKind.Array = 18; - SymbolKind.Object = 19; - SymbolKind.Key = 20; - SymbolKind.Null = 21; - SymbolKind.EnumMember = 22; - SymbolKind.Struct = 23; - SymbolKind.Event = 24; - SymbolKind.Operator = 25; - SymbolKind.TypeParameter = 26; -})(SymbolKind || (exports.SymbolKind = SymbolKind = {})); + * MarkdownIt.render(src [, env]) -> String + * - src (String): source string + * - env (Object): environment sandbox + * + * Render markdown string into html. It does all magic for you :). + * + * `env` can be used to inject additional metadata (`{}` by default). + * But you will not need it with high probability. See also comment + * in [[MarkdownIt.parse]]. + **/ +MarkdownIt.prototype.render = function (src, env) { + env = env || {}; + return this.renderer.render(this.parse(src, env), this.options, env); +}; + +/** internal + * MarkdownIt.parseInline(src, env) -> Array + * - src (String): source string + * - env (Object): environment sandbox + * + * The same as [[MarkdownIt.parse]] but skip all block rules. It returns the + * block tokens list with the single `inline` element, containing parsed inline + * tokens in `children` property. Also updates `env` object. + **/ +MarkdownIt.prototype.parseInline = function (src, env) { + const state = new this.core.State(src, this, env); + state.inlineMode = true; + this.core.process(state); + return state.tokens; +}; + /** - * Symbol tags are extra annotations that tweak the rendering of a symbol. - * @since 3.16 - */ -var SymbolTag; -exports.SymbolTag = SymbolTag; -(function (SymbolTag) { - /** - * Render a symbol as obsolete, usually using a strike-out. - */ - SymbolTag.Deprecated = 1; -})(SymbolTag || (exports.SymbolTag = SymbolTag = {})); -var SymbolInformation; -exports.SymbolInformation = SymbolInformation; -(function (SymbolInformation) { - /** - * Creates a new symbol information literal. - * - * @param name The name of the symbol. - * @param kind The kind of the symbol. - * @param range The range of the location of the symbol. - * @param uri The resource of the location of symbol. - * @param containerName The name of the symbol containing the symbol. - */ - function create(name, kind, range, uri, containerName) { - var result = { - name: name, - kind: kind, - location: { - uri: uri, - range: range - } - }; - if (containerName) { - result.containerName = containerName; - } - return result; + * MarkdownIt.renderInline(src [, env]) -> String + * - src (String): source string + * - env (Object): environment sandbox + * + * Similar to [[MarkdownIt.render]] but for single paragraph content. Result + * will NOT be wrapped into `

` tags. + **/ +MarkdownIt.prototype.renderInline = function (src, env) { + env = env || {}; + return this.renderer.render(this.parseInline(src, env), this.options, env); +}; +module.exports = MarkdownIt; + +/***/ }), + +/***/ "../../../node_modules/mdurl/build/index.cjs.js": +/*!******************************************************!*\ + !*** ../../../node_modules/mdurl/build/index.cjs.js ***! + \******************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + + +/* eslint-disable no-bitwise */ +const decodeCache = {}; +function getDecodeCache(exclude) { + let cache = decodeCache[exclude]; + if (cache) { + return cache; } - SymbolInformation.create = create; -})(SymbolInformation || (exports.SymbolInformation = SymbolInformation = {})); -var WorkspaceSymbol; -exports.WorkspaceSymbol = WorkspaceSymbol; -(function (WorkspaceSymbol) { - /** - * Create a new workspace symbol. - * - * @param name The name of the symbol. - * @param kind The kind of the symbol. - * @param uri The resource of the location of the symbol. - * @param range An options range of the location. - * @returns A WorkspaceSymbol. - */ - function create(name, kind, uri, range) { - return range !== undefined ? { - name: name, - kind: kind, - location: { - uri: uri, - range: range - } - } : { - name: name, - kind: kind, - location: { - uri: uri - } - }; + cache = decodeCache[exclude] = []; + for (let i = 0; i < 128; i++) { + const ch = String.fromCharCode(i); + cache.push(ch); } - WorkspaceSymbol.create = create; -})(WorkspaceSymbol || (exports.WorkspaceSymbol = WorkspaceSymbol = {})); -var DocumentSymbol; -exports.DocumentSymbol = DocumentSymbol; -(function (DocumentSymbol) { - /** - * Creates a new symbol information literal. - * - * @param name The name of the symbol. - * @param detail The detail of the symbol. - * @param kind The kind of the symbol. - * @param range The range of the symbol. - * @param selectionRange The selectionRange of the symbol. - * @param children Children of the symbol. - */ - function create(name, detail, kind, range, selectionRange, children) { - var result = { - name: name, - detail: detail, - kind: kind, - range: range, - selectionRange: selectionRange - }; - if (children !== undefined) { - result.children = children; - } - return result; + for (let i = 0; i < exclude.length; i++) { + const ch = exclude.charCodeAt(i); + cache[ch] = '%' + ('0' + ch.toString(16).toUpperCase()).slice(-2); } - DocumentSymbol.create = create; - /** - * Checks whether the given literal conforms to the [DocumentSymbol](#DocumentSymbol) interface. - */ - function is(value) { - var candidate = value; - return candidate && Is.string(candidate.name) && Is.number(candidate.kind) && Range.is(candidate.range) && Range.is(candidate.selectionRange) && (candidate.detail === undefined || Is.string(candidate.detail)) && (candidate.deprecated === undefined || Is.boolean(candidate.deprecated)) && (candidate.children === undefined || Array.isArray(candidate.children)) && (candidate.tags === undefined || Array.isArray(candidate.tags)); + return cache; +} + +// Decode percent-encoded string. +// +function decode(string, exclude) { + if (typeof exclude !== 'string') { + exclude = decode.defaultChars; } - DocumentSymbol.is = is; -})(DocumentSymbol || (exports.DocumentSymbol = DocumentSymbol = {})); -/** - * A set of predefined code action kinds - */ -var CodeActionKind; -exports.CodeActionKind = CodeActionKind; -(function (CodeActionKind) { - /** - * Empty kind. - */ - CodeActionKind.Empty = ''; - /** - * Base kind for quickfix actions: 'quickfix' - */ - CodeActionKind.QuickFix = 'quickfix'; - /** - * Base kind for refactoring actions: 'refactor' - */ - CodeActionKind.Refactor = 'refactor'; - /** - * Base kind for refactoring extraction actions: 'refactor.extract' - * - * Example extract actions: - * - * - Extract method - * - Extract function - * - Extract variable - * - Extract interface from class - * - ... - */ - CodeActionKind.RefactorExtract = 'refactor.extract'; - /** - * Base kind for refactoring inline actions: 'refactor.inline' - * - * Example inline actions: - * - * - Inline function - * - Inline variable - * - Inline constant - * - ... - */ - CodeActionKind.RefactorInline = 'refactor.inline'; - /** - * Base kind for refactoring rewrite actions: 'refactor.rewrite' - * - * Example rewrite actions: - * - * - Convert JavaScript function to class - * - Add or remove parameter - * - Encapsulate field - * - Make method static - * - Move method to base class - * - ... - */ - CodeActionKind.RefactorRewrite = 'refactor.rewrite'; - /** - * Base kind for source actions: `source` - * - * Source code actions apply to the entire file. - */ - CodeActionKind.Source = 'source'; - /** - * Base kind for an organize imports source action: `source.organizeImports` - */ - CodeActionKind.SourceOrganizeImports = 'source.organizeImports'; - /** - * Base kind for auto-fix source actions: `source.fixAll`. - * - * Fix all actions automatically fix errors that have a clear fix that do not require user input. - * They should not suppress errors or perform unsafe fixes such as generating new types or classes. - * - * @since 3.15.0 - */ - CodeActionKind.SourceFixAll = 'source.fixAll'; -})(CodeActionKind || (exports.CodeActionKind = CodeActionKind = {})); -/** - * The reason why code actions were requested. - * - * @since 3.17.0 - */ -var CodeActionTriggerKind; -exports.CodeActionTriggerKind = CodeActionTriggerKind; -(function (CodeActionTriggerKind) { - /** - * Code actions were explicitly requested by the user or by an extension. - */ - CodeActionTriggerKind.Invoked = 1; - /** - * Code actions were requested automatically. - * - * This typically happens when current selection in a file changes, but can - * also be triggered when file content changes. - */ - CodeActionTriggerKind.Automatic = 2; -})(CodeActionTriggerKind || (exports.CodeActionTriggerKind = CodeActionTriggerKind = {})); -/** - * The CodeActionContext namespace provides helper functions to work with - * [CodeActionContext](#CodeActionContext) literals. - */ -var CodeActionContext; -exports.CodeActionContext = CodeActionContext; -(function (CodeActionContext) { - /** - * Creates a new CodeActionContext literal. - */ - function create(diagnostics, only, triggerKind) { - var result = { - diagnostics: diagnostics - }; - if (only !== undefined && only !== null) { - result.only = only; - } - if (triggerKind !== undefined && triggerKind !== null) { - result.triggerKind = triggerKind; + const cache = getDecodeCache(exclude); + return string.replace(/(%[a-f0-9]{2})+/gi, function (seq) { + let result = ''; + for (let i = 0, l = seq.length; i < l; i += 3) { + const b1 = parseInt(seq.slice(i + 1, i + 3), 16); + if (b1 < 0x80) { + result += cache[b1]; + continue; + } + if ((b1 & 0xE0) === 0xC0 && i + 3 < l) { + // 110xxxxx 10xxxxxx + const b2 = parseInt(seq.slice(i + 4, i + 6), 16); + if ((b2 & 0xC0) === 0x80) { + const chr = b1 << 6 & 0x7C0 | b2 & 0x3F; + if (chr < 0x80) { + result += '\ufffd\ufffd'; + } else { + result += String.fromCharCode(chr); + } + i += 3; + continue; + } + } + if ((b1 & 0xF0) === 0xE0 && i + 6 < l) { + // 1110xxxx 10xxxxxx 10xxxxxx + const b2 = parseInt(seq.slice(i + 4, i + 6), 16); + const b3 = parseInt(seq.slice(i + 7, i + 9), 16); + if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) { + const chr = b1 << 12 & 0xF000 | b2 << 6 & 0xFC0 | b3 & 0x3F; + if (chr < 0x800 || chr >= 0xD800 && chr <= 0xDFFF) { + result += '\ufffd\ufffd\ufffd'; + } else { + result += String.fromCharCode(chr); + } + i += 6; + continue; + } + } + if ((b1 & 0xF8) === 0xF0 && i + 9 < l) { + // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx + const b2 = parseInt(seq.slice(i + 4, i + 6), 16); + const b3 = parseInt(seq.slice(i + 7, i + 9), 16); + const b4 = parseInt(seq.slice(i + 10, i + 12), 16); + if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80 && (b4 & 0xC0) === 0x80) { + let chr = b1 << 18 & 0x1C0000 | b2 << 12 & 0x3F000 | b3 << 6 & 0xFC0 | b4 & 0x3F; + if (chr < 0x10000 || chr > 0x10FFFF) { + result += '\ufffd\ufffd\ufffd\ufffd'; + } else { + chr -= 0x10000; + result += String.fromCharCode(0xD800 + (chr >> 10), 0xDC00 + (chr & 0x3FF)); + } + i += 9; + continue; + } + } + result += '\ufffd'; } return result; + }); +} +decode.defaultChars = ';/?:@&=+$,#'; +decode.componentChars = ''; +const encodeCache = {}; + +// Create a lookup array where anything but characters in `chars` string +// and alphanumeric chars is percent-encoded. +// +function getEncodeCache(exclude) { + let cache = encodeCache[exclude]; + if (cache) { + return cache; } - CodeActionContext.create = create; - /** - * Checks whether the given literal conforms to the [CodeActionContext](#CodeActionContext) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Is.typedArray(candidate.diagnostics, Diagnostic.is) && (candidate.only === undefined || Is.typedArray(candidate.only, Is.string)) && (candidate.triggerKind === undefined || candidate.triggerKind === CodeActionTriggerKind.Invoked || candidate.triggerKind === CodeActionTriggerKind.Automatic); - } - CodeActionContext.is = is; -})(CodeActionContext || (exports.CodeActionContext = CodeActionContext = {})); -var CodeAction; -exports.CodeAction = CodeAction; -(function (CodeAction) { - function create(title, kindOrCommandOrEdit, kind) { - var result = { - title: title - }; - var checkKind = true; - if (typeof kindOrCommandOrEdit === 'string') { - checkKind = false; - result.kind = kindOrCommandOrEdit; - } else if (Command.is(kindOrCommandOrEdit)) { - result.command = kindOrCommandOrEdit; + cache = encodeCache[exclude] = []; + for (let i = 0; i < 128; i++) { + const ch = String.fromCharCode(i); + if (/^[0-9a-z]$/i.test(ch)) { + // always allow unencoded alphanumeric characters + cache.push(ch); } else { - result.edit = kindOrCommandOrEdit; - } - if (checkKind && kind !== undefined) { - result.kind = kind; + cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2)); } - return result; - } - CodeAction.create = create; - function is(value) { - var candidate = value; - return candidate && Is.string(candidate.title) && (candidate.diagnostics === undefined || Is.typedArray(candidate.diagnostics, Diagnostic.is)) && (candidate.kind === undefined || Is.string(candidate.kind)) && (candidate.edit !== undefined || candidate.command !== undefined) && (candidate.command === undefined || Command.is(candidate.command)) && (candidate.isPreferred === undefined || Is.boolean(candidate.isPreferred)) && (candidate.edit === undefined || WorkspaceEdit.is(candidate.edit)); } - CodeAction.is = is; -})(CodeAction || (exports.CodeAction = CodeAction = {})); -/** - * The CodeLens namespace provides helper functions to work with - * [CodeLens](#CodeLens) literals. - */ -var CodeLens; -exports.CodeLens = CodeLens; -(function (CodeLens) { - /** - * Creates a new CodeLens literal. - */ - function create(range, data) { - var result = { - range: range - }; - if (Is.defined(data)) { - result.data = data; - } - return result; + for (let i = 0; i < exclude.length; i++) { + cache[exclude.charCodeAt(i)] = exclude[i]; } - CodeLens.create = create; - /** - * Checks whether the given literal conforms to the [CodeLens](#CodeLens) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.command) || Command.is(candidate.command)); + return cache; +} + +// Encode unsafe characters with percent-encoding, skipping already +// encoded sequences. +// +// - string - string to encode +// - exclude - list of characters to ignore (in addition to a-zA-Z0-9) +// - keepEscaped - don't encode '%' in a correct escape sequence (default: true) +// +function encode(string, exclude, keepEscaped) { + if (typeof exclude !== 'string') { + // encode(string, keepEscaped) + keepEscaped = exclude; + exclude = encode.defaultChars; } - CodeLens.is = is; -})(CodeLens || (exports.CodeLens = CodeLens = {})); -/** - * The FormattingOptions namespace provides helper functions to work with - * [FormattingOptions](#FormattingOptions) literals. - */ -var FormattingOptions; -exports.FormattingOptions = FormattingOptions; -(function (FormattingOptions) { - /** - * Creates a new FormattingOptions literal. - */ - function create(tabSize, insertSpaces) { - return { - tabSize: tabSize, - insertSpaces: insertSpaces - }; + if (typeof keepEscaped === 'undefined') { + keepEscaped = true; } - FormattingOptions.create = create; - /** - * Checks whether the given literal conforms to the [FormattingOptions](#FormattingOptions) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Is.uinteger(candidate.tabSize) && Is.boolean(candidate.insertSpaces); + const cache = getEncodeCache(exclude); + let result = ''; + for (let i = 0, l = string.length; i < l; i++) { + const code = string.charCodeAt(i); + if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) { + if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) { + result += string.slice(i, i + 3); + i += 2; + continue; + } + } + if (code < 128) { + result += cache[code]; + continue; + } + if (code >= 0xD800 && code <= 0xDFFF) { + if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) { + const nextCode = string.charCodeAt(i + 1); + if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) { + result += encodeURIComponent(string[i] + string[i + 1]); + i++; + continue; + } + } + result += '%EF%BF%BD'; + continue; + } + result += encodeURIComponent(string[i]); } - FormattingOptions.is = is; -})(FormattingOptions || (exports.FormattingOptions = FormattingOptions = {})); -/** - * The DocumentLink namespace provides helper functions to work with - * [DocumentLink](#DocumentLink) literals. - */ -var DocumentLink; -exports.DocumentLink = DocumentLink; -(function (DocumentLink) { - /** - * Creates a new DocumentLink literal. - */ - function create(range, target, data) { - return { - range: range, - target: target, - data: data - }; + return result; +} +encode.defaultChars = ";/?:@&=+$,-_.!~*'()#"; +encode.componentChars = "-_.!~*'()"; +function format(url) { + let result = ''; + result += url.protocol || ''; + result += url.slashes ? '//' : ''; + result += url.auth ? url.auth + '@' : ''; + if (url.hostname && url.hostname.indexOf(':') !== -1) { + // ipv6 address + result += '[' + url.hostname + ']'; + } else { + result += url.hostname || ''; } - DocumentLink.create = create; - /** - * Checks whether the given literal conforms to the [DocumentLink](#DocumentLink) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.target) || Is.string(candidate.target)); + result += url.port ? ':' + url.port : ''; + result += url.pathname || ''; + result += url.search || ''; + result += url.hash || ''; + return result; +} + +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// +// Changes from joyent/node: +// +// 1. No leading slash in paths, +// e.g. in `url.parse('http://foo?bar')` pathname is ``, not `/` +// +// 2. Backslashes are not replaced with slashes, +// so `http:\\example.org\` is treated like a relative path +// +// 3. Trailing colon is treated like a part of the path, +// i.e. in `http://example.org:foo` pathname is `:foo` +// +// 4. Nothing is URL-encoded in the resulting object, +// (in joyent/node some chars in auth and paths are encoded) +// +// 5. `url.parse()` does not have `parseQueryString` argument +// +// 6. Removed extraneous result properties: `host`, `path`, `query`, etc., +// which can be constructed using other parts of the url. +// + +function Url() { + this.protocol = null; + this.slashes = null; + this.auth = null; + this.port = null; + this.hostname = null; + this.hash = null; + this.search = null; + this.pathname = null; +} + +// Reference: RFC 3986, RFC 1808, RFC 2396 + +// define these here so at least they only have to be +// compiled once on the first module load. +const protocolPattern = /^([a-z0-9.+-]+:)/i; +const portPattern = /:[0-9]*$/; + +// Special case for a simple path URL +/* eslint-disable-next-line no-useless-escape */ +const simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/; + +// RFC 2396: characters reserved for delimiting URLs. +// We actually just auto-escape these. +const delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t']; + +// RFC 2396: characters not allowed for various reasons. +const unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims); + +// Allowed by RFCs, but cause of XSS attacks. Always escape these. +const autoEscape = ['\''].concat(unwise); +// Characters that are never ever allowed in a hostname. +// Note that any invalid chars are also handled, but these +// are the ones that are *expected* to be seen, so we fast-path +// them. +const nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape); +const hostEndingChars = ['/', '?', '#']; +const hostnameMaxLen = 255; +const hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/; +const hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/; +// protocols that can allow "unsafe" and "unwise" chars. +// protocols that never have a hostname. +const hostlessProtocol = { + javascript: true, + 'javascript:': true +}; +// protocols that always contain a // bit. +const slashedProtocol = { + http: true, + https: true, + ftp: true, + gopher: true, + file: true, + 'http:': true, + 'https:': true, + 'ftp:': true, + 'gopher:': true, + 'file:': true +}; +function urlParse(url, slashesDenoteHost) { + if (url && url instanceof Url) return url; + const u = new Url(); + u.parse(url, slashesDenoteHost); + return u; +} +Url.prototype.parse = function (url, slashesDenoteHost) { + let lowerProto, hec, slashes; + let rest = url; + + // trim before proceeding. + // This is to support parse stuff like " http://foo.com \n" + rest = rest.trim(); + if (!slashesDenoteHost && url.split('#').length === 1) { + // Try fast path regexp + const simplePath = simplePathPattern.exec(rest); + if (simplePath) { + this.pathname = simplePath[1]; + if (simplePath[2]) { + this.search = simplePath[2]; + } + return this; + } } - DocumentLink.is = is; -})(DocumentLink || (exports.DocumentLink = DocumentLink = {})); -/** - * The SelectionRange namespace provides helper function to work with - * SelectionRange literals. - */ -var SelectionRange; -exports.SelectionRange = SelectionRange; -(function (SelectionRange) { - /** - * Creates a new SelectionRange - * @param range the range. - * @param parent an optional parent. - */ - function create(range, parent) { - return { - range: range, - parent: parent - }; + let proto = protocolPattern.exec(rest); + if (proto) { + proto = proto[0]; + lowerProto = proto.toLowerCase(); + this.protocol = proto; + rest = rest.substr(proto.length); } - SelectionRange.create = create; - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && Range.is(candidate.range) && (candidate.parent === undefined || SelectionRange.is(candidate.parent)); + + // figure out if it's got a host + // user@server is *always* interpreted as a hostname, and url + // resolution will treat //foo/bar as host=foo,path=bar because that's + // how the browser resolves relative URLs. + /* eslint-disable-next-line no-useless-escape */ + if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) { + slashes = rest.substr(0, 2) === '//'; + if (slashes && !(proto && hostlessProtocol[proto])) { + rest = rest.substr(2); + this.slashes = true; + } } - SelectionRange.is = is; -})(SelectionRange || (exports.SelectionRange = SelectionRange = {})); -/** - * A set of predefined token types. This set is not fixed - * an clients can specify additional token types via the - * corresponding client capabilities. - * - * @since 3.16.0 - */ -var SemanticTokenTypes; -exports.SemanticTokenTypes = SemanticTokenTypes; -(function (SemanticTokenTypes) { - SemanticTokenTypes["namespace"] = "namespace"; - /** - * Represents a generic type. Acts as a fallback for types which can't be mapped to - * a specific type like class or enum. - */ - SemanticTokenTypes["type"] = "type"; - SemanticTokenTypes["class"] = "class"; - SemanticTokenTypes["enum"] = "enum"; - SemanticTokenTypes["interface"] = "interface"; - SemanticTokenTypes["struct"] = "struct"; - SemanticTokenTypes["typeParameter"] = "typeParameter"; - SemanticTokenTypes["parameter"] = "parameter"; - SemanticTokenTypes["variable"] = "variable"; - SemanticTokenTypes["property"] = "property"; - SemanticTokenTypes["enumMember"] = "enumMember"; - SemanticTokenTypes["event"] = "event"; - SemanticTokenTypes["function"] = "function"; - SemanticTokenTypes["method"] = "method"; - SemanticTokenTypes["macro"] = "macro"; - SemanticTokenTypes["keyword"] = "keyword"; - SemanticTokenTypes["modifier"] = "modifier"; - SemanticTokenTypes["comment"] = "comment"; - SemanticTokenTypes["string"] = "string"; - SemanticTokenTypes["number"] = "number"; - SemanticTokenTypes["regexp"] = "regexp"; - SemanticTokenTypes["operator"] = "operator"; - /** - * @since 3.17.0 - */ - SemanticTokenTypes["decorator"] = "decorator"; -})(SemanticTokenTypes || (exports.SemanticTokenTypes = SemanticTokenTypes = {})); -/** - * A set of predefined token modifiers. This set is not fixed - * an clients can specify additional token types via the - * corresponding client capabilities. - * - * @since 3.16.0 - */ -var SemanticTokenModifiers; -exports.SemanticTokenModifiers = SemanticTokenModifiers; -(function (SemanticTokenModifiers) { - SemanticTokenModifiers["declaration"] = "declaration"; - SemanticTokenModifiers["definition"] = "definition"; - SemanticTokenModifiers["readonly"] = "readonly"; - SemanticTokenModifiers["static"] = "static"; - SemanticTokenModifiers["deprecated"] = "deprecated"; - SemanticTokenModifiers["abstract"] = "abstract"; - SemanticTokenModifiers["async"] = "async"; - SemanticTokenModifiers["modification"] = "modification"; - SemanticTokenModifiers["documentation"] = "documentation"; - SemanticTokenModifiers["defaultLibrary"] = "defaultLibrary"; -})(SemanticTokenModifiers || (exports.SemanticTokenModifiers = SemanticTokenModifiers = {})); -/** - * @since 3.16.0 - */ -var SemanticTokens; -exports.SemanticTokens = SemanticTokens; -(function (SemanticTokens) { - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && (candidate.resultId === undefined || typeof candidate.resultId === 'string') && Array.isArray(candidate.data) && (candidate.data.length === 0 || typeof candidate.data[0] === 'number'); + if (!hostlessProtocol[proto] && (slashes || proto && !slashedProtocol[proto])) { + // there's a hostname. + // the first instance of /, ?, ;, or # ends the host. + // + // If there is an @ in the hostname, then non-host chars *are* allowed + // to the left of the last @ sign, unless some host-ending character + // comes *before* the @-sign. + // URLs are obnoxious. + // + // ex: + // http://a@b@c/ => user:a@b host:c + // http://a@b?@c => user:a host:c path:/?@c + + // v0.12 TODO(isaacs): This is not quite how Chrome does things. + // Review our test case against browsers more comprehensively. + + // find the first instance of any hostEndingChars + let hostEnd = -1; + for (let i = 0; i < hostEndingChars.length; i++) { + hec = rest.indexOf(hostEndingChars[i]); + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) { + hostEnd = hec; + } + } + + // at this point, either we have an explicit point where the + // auth portion cannot go past, or the last @ char is the decider. + let auth, atSign; + if (hostEnd === -1) { + // atSign can be anywhere. + atSign = rest.lastIndexOf('@'); + } else { + // atSign must be in auth portion. + // http://a@b/c@d => host:b auth:a path:/c@d + atSign = rest.lastIndexOf('@', hostEnd); + } + + // Now we have a portion which is definitely the auth. + // Pull that off. + if (atSign !== -1) { + auth = rest.slice(0, atSign); + rest = rest.slice(atSign + 1); + this.auth = auth; + } + + // the host is the remaining to the left of the first non-host char + hostEnd = -1; + for (let i = 0; i < nonHostChars.length; i++) { + hec = rest.indexOf(nonHostChars[i]); + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) { + hostEnd = hec; + } + } + // if we still have not hit it, then the entire thing is a host. + if (hostEnd === -1) { + hostEnd = rest.length; + } + if (rest[hostEnd - 1] === ':') { + hostEnd--; + } + const host = rest.slice(0, hostEnd); + rest = rest.slice(hostEnd); + + // pull out port. + this.parseHost(host); + + // we've indicated that there is a hostname, + // so even if it's empty, it has to be present. + this.hostname = this.hostname || ''; + + // if hostname begins with [ and ends with ] + // assume that it's an IPv6 address. + const ipv6Hostname = this.hostname[0] === '[' && this.hostname[this.hostname.length - 1] === ']'; + + // validate a little. + if (!ipv6Hostname) { + const hostparts = this.hostname.split(/\./); + for (let i = 0, l = hostparts.length; i < l; i++) { + const part = hostparts[i]; + if (!part) { + continue; + } + if (!part.match(hostnamePartPattern)) { + let newpart = ''; + for (let j = 0, k = part.length; j < k; j++) { + if (part.charCodeAt(j) > 127) { + // we replace non-ASCII char with a temporary placeholder + // we need this to make sure size of hostname is not + // broken by replacing non-ASCII by nothing + newpart += 'x'; + } else { + newpart += part[j]; + } + } + // we test again with ASCII char only + if (!newpart.match(hostnamePartPattern)) { + const validParts = hostparts.slice(0, i); + const notHost = hostparts.slice(i + 1); + const bit = part.match(hostnamePartStart); + if (bit) { + validParts.push(bit[1]); + notHost.unshift(bit[2]); + } + if (notHost.length) { + rest = notHost.join('.') + rest; + } + this.hostname = validParts.join('.'); + break; + } + } + } + } + if (this.hostname.length > hostnameMaxLen) { + this.hostname = ''; + } + + // strip [ and ] from the hostname + // the host field still retains them, though + if (ipv6Hostname) { + this.hostname = this.hostname.substr(1, this.hostname.length - 2); + } } - SemanticTokens.is = is; -})(SemanticTokens || (exports.SemanticTokens = SemanticTokens = {})); -/** - * The InlineValueText namespace provides functions to deal with InlineValueTexts. - * - * @since 3.17.0 - */ -var InlineValueText; -exports.InlineValueText = InlineValueText; -(function (InlineValueText) { - /** - * Creates a new InlineValueText literal. - */ - function create(range, text) { - return { - range: range, - text: text - }; + + // chop off from the tail first. + const hash = rest.indexOf('#'); + if (hash !== -1) { + // got a fragment string. + this.hash = rest.substr(hash); + rest = rest.slice(0, hash); } - InlineValueText.create = create; - function is(value) { - var candidate = value; - return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.string(candidate.text); + const qm = rest.indexOf('?'); + if (qm !== -1) { + this.search = rest.substr(qm); + rest = rest.slice(0, qm); } - InlineValueText.is = is; -})(InlineValueText || (exports.InlineValueText = InlineValueText = {})); -/** - * The InlineValueVariableLookup namespace provides functions to deal with InlineValueVariableLookups. - * - * @since 3.17.0 - */ -var InlineValueVariableLookup; -exports.InlineValueVariableLookup = InlineValueVariableLookup; -(function (InlineValueVariableLookup) { - /** - * Creates a new InlineValueText literal. - */ - function create(range, variableName, caseSensitiveLookup) { - return { - range: range, - variableName: variableName, - caseSensitiveLookup: caseSensitiveLookup - }; + if (rest) { + this.pathname = rest; } - InlineValueVariableLookup.create = create; - function is(value) { - var candidate = value; - return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.boolean(candidate.caseSensitiveLookup) && (Is.string(candidate.variableName) || candidate.variableName === undefined); + if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) { + this.pathname = ''; } - InlineValueVariableLookup.is = is; -})(InlineValueVariableLookup || (exports.InlineValueVariableLookup = InlineValueVariableLookup = {})); -/** - * The InlineValueEvaluatableExpression namespace provides functions to deal with InlineValueEvaluatableExpression. - * - * @since 3.17.0 - */ -var InlineValueEvaluatableExpression; -exports.InlineValueEvaluatableExpression = InlineValueEvaluatableExpression; -(function (InlineValueEvaluatableExpression) { - /** - * Creates a new InlineValueEvaluatableExpression literal. - */ - function create(range, expression) { - return { - range: range, - expression: expression - }; + return this; +}; +Url.prototype.parseHost = function (host) { + let port = portPattern.exec(host); + if (port) { + port = port[0]; + if (port !== ':') { + this.port = port.substr(1); + } + host = host.substr(0, host.length - port.length); } - InlineValueEvaluatableExpression.create = create; - function is(value) { - var candidate = value; - return candidate !== undefined && candidate !== null && Range.is(candidate.range) && (Is.string(candidate.expression) || candidate.expression === undefined); + if (host) { + this.hostname = host; } - InlineValueEvaluatableExpression.is = is; -})(InlineValueEvaluatableExpression || (exports.InlineValueEvaluatableExpression = InlineValueEvaluatableExpression = {})); -/** - * The InlineValueContext namespace provides helper functions to work with - * [InlineValueContext](#InlineValueContext) literals. - * - * @since 3.17.0 - */ -var InlineValueContext; -exports.InlineValueContext = InlineValueContext; -(function (InlineValueContext) { - /** - * Creates a new InlineValueContext literal. - */ - function create(frameId, stoppedLocation) { - return { - frameId: frameId, - stoppedLocation: stoppedLocation - }; +}; +exports.decode = decode; +exports.encode = encode; +exports.format = format; +exports.parse = urlParse; + +/***/ }), + +/***/ "../../../node_modules/meros/browser/index.js": +/*!****************************************************!*\ + !*** ../../../node_modules/meros/browser/index.js ***! + \****************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + + +var e = new TextDecoder(); +async function t(t, n) { + if (!t.ok || !t.body || t.bodyUsed) return t; + let i = t.headers.get("content-type"); + if (!i || !~i.indexOf("multipart/")) return t; + let l = i.indexOf("boundary="), + r = "-"; + if (~l) { + let e = l + 9, + t = i.indexOf(";", e); + r = i.slice(e, t > -1 ? t : void 0).trim().replace(/"/g, ""); } - InlineValueContext.create = create; - /** - * Checks whether the given literal conforms to the [InlineValueContext](#InlineValueContext) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Range.is(value.stoppedLocation); + return async function* (t, n, i) { + let l, + r, + d, + o = t.getReader(), + a = !i || !i.multiple, + f = n.length, + s = "", + c = []; + try { + let t; + e: for (; !(t = await o.read()).done;) { + let i = e.decode(t.value); + l = s.length, s += i; + let o = i.indexOf(n); + for (~o ? l += o : l = s.indexOf(n), c = []; ~l;) { + let e = s.slice(0, l), + t = s.slice(l + f); + if (r) { + let n = e.indexOf("\r\n\r\n") + 4, + i = e.lastIndexOf("\r\n", n), + l = !1, + r = e.slice(n, i > -1 ? void 0 : i), + o = String(e.slice(0, n)).trim().split("\r\n"), + f = {}, + s = o.length; + for (; d = o[--s]; d = d.split(": "), f[d.shift().toLowerCase()] = d.join(": ")); + if (d = f["content-type"], d && ~d.indexOf("application/json")) try { + r = JSON.parse(r), l = !0; + } catch (e) {} + if (d = { + headers: f, + body: r, + json: l + }, a ? yield d : c.push(d), "--" === t.slice(0, 2)) break e; + } else n = "\r\n" + n, r = f += 2; + s = t, l = s.indexOf(n); + } + c.length && (yield c); + } + } finally { + c.length && (yield c), await o.cancel(); + } + }(t.body, `--${r}`, n); +} +exports.meros = t; + +/***/ }), + +/***/ "../../../node_modules/nullthrows/nullthrows.js": +/*!******************************************************!*\ + !*** ../../../node_modules/nullthrows/nullthrows.js ***! + \******************************************************/ +/***/ (function(module) { + + + +function nullthrows(x, message) { + if (x != null) { + return x; } - InlineValueContext.is = is; -})(InlineValueContext || (exports.InlineValueContext = InlineValueContext = {})); -/** - * Inlay hint kinds. - * - * @since 3.17.0 - */ -var InlayHintKind; -exports.InlayHintKind = InlayHintKind; -(function (InlayHintKind) { - /** - * An inlay hint that for a type annotation. - */ - InlayHintKind.Type = 1; - /** - * An inlay hint that is for a parameter. - */ - InlayHintKind.Parameter = 2; - function is(value) { - return value === 1 || value === 2; + var error = new Error(message !== undefined ? message : 'Got unexpected ' + x); + error.framesToPop = 1; // Skip nullthrows's own stack frame. + throw error; +} +module.exports = nullthrows; +module.exports["default"] = nullthrows; +Object.defineProperty(module.exports, "__esModule", ({ + value: true +})); + +/***/ }), + +/***/ "../../../node_modules/popmotion/dist/popmotion.cjs.js": +/*!*************************************************************!*\ + !*** ../../../node_modules/popmotion/dist/popmotion.cjs.js ***! + \*************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +var tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.mjs"); +var heyListen = __webpack_require__(/*! hey-listen */ "../../../node_modules/hey-listen/dist/hey-listen.es.js"); +var styleValueTypes = __webpack_require__(/*! style-value-types */ "../../../node_modules/style-value-types/dist/valueTypes.cjs.js"); +var sync = __webpack_require__(/*! framesync */ "../../../node_modules/framesync/dist/framesync.cjs.js"); +function _interopDefaultLegacy(e) { + return e && typeof e === 'object' && 'default' in e ? e : { + 'default': e + }; +} +var sync__default = /*#__PURE__*/_interopDefaultLegacy(sync); +const clamp = (min, max, v) => Math.min(Math.max(v, min), max); +const safeMin = 0.001; +const minDuration = 0.01; +const maxDuration = 10.0; +const minDamping = 0.05; +const maxDamping = 1; +function findSpring({ + duration = 800, + bounce = 0.25, + velocity = 0, + mass = 1 +}) { + let envelope; + let derivative; + heyListen.warning(duration <= maxDuration * 1000, "Spring duration must be 10 seconds or less"); + let dampingRatio = 1 - bounce; + dampingRatio = clamp(minDamping, maxDamping, dampingRatio); + duration = clamp(minDuration, maxDuration, duration / 1000); + if (dampingRatio < 1) { + envelope = undampedFreq => { + const exponentialDecay = undampedFreq * dampingRatio; + const delta = exponentialDecay * duration; + const a = exponentialDecay - velocity; + const b = calcAngularFreq(undampedFreq, dampingRatio); + const c = Math.exp(-delta); + return safeMin - a / b * c; + }; + derivative = undampedFreq => { + const exponentialDecay = undampedFreq * dampingRatio; + const delta = exponentialDecay * duration; + const d = delta * velocity + velocity; + const e = Math.pow(dampingRatio, 2) * Math.pow(undampedFreq, 2) * duration; + const f = Math.exp(-delta); + const g = calcAngularFreq(Math.pow(undampedFreq, 2), dampingRatio); + const factor = -envelope(undampedFreq) + safeMin > 0 ? -1 : 1; + return factor * ((d - e) * f) / g; + }; + } else { + envelope = undampedFreq => { + const a = Math.exp(-undampedFreq * duration); + const b = (undampedFreq - velocity) * duration + 1; + return -safeMin + a * b; + }; + derivative = undampedFreq => { + const a = Math.exp(-undampedFreq * duration); + const b = (velocity - undampedFreq) * (duration * duration); + return a * b; + }; } - InlayHintKind.is = is; -})(InlayHintKind || (exports.InlayHintKind = InlayHintKind = {})); -var InlayHintLabelPart; -exports.InlayHintLabelPart = InlayHintLabelPart; -(function (InlayHintLabelPart) { - function create(value) { + const initialGuess = 5 / duration; + const undampedFreq = approximateRoot(envelope, derivative, initialGuess); + duration = duration * 1000; + if (isNaN(undampedFreq)) { return { - value: value + stiffness: 100, + damping: 10, + duration }; - } - InlayHintLabelPart.create = create; - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && (candidate.tooltip === undefined || Is.string(candidate.tooltip) || MarkupContent.is(candidate.tooltip)) && (candidate.location === undefined || Location.is(candidate.location)) && (candidate.command === undefined || Command.is(candidate.command)); - } - InlayHintLabelPart.is = is; -})(InlayHintLabelPart || (exports.InlayHintLabelPart = InlayHintLabelPart = {})); -var InlayHint; -exports.InlayHint = InlayHint; -(function (InlayHint) { - function create(position, label, kind) { - var result = { - position: position, - label: label + } else { + const stiffness = Math.pow(undampedFreq, 2) * mass; + return { + stiffness, + damping: dampingRatio * 2 * Math.sqrt(mass * stiffness), + duration }; - if (kind !== undefined) { - result.kind = kind; - } - return result; - } - InlayHint.create = create; - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && Position.is(candidate.position) && (Is.string(candidate.label) || Is.typedArray(candidate.label, InlayHintLabelPart.is)) && (candidate.kind === undefined || InlayHintKind.is(candidate.kind)) && candidate.textEdits === undefined || Is.typedArray(candidate.textEdits, TextEdit.is) && (candidate.tooltip === undefined || Is.string(candidate.tooltip) || MarkupContent.is(candidate.tooltip)) && (candidate.paddingLeft === undefined || Is.boolean(candidate.paddingLeft)) && (candidate.paddingRight === undefined || Is.boolean(candidate.paddingRight)); } - InlayHint.is = is; -})(InlayHint || (exports.InlayHint = InlayHint = {})); -var WorkspaceFolder; -exports.WorkspaceFolder = WorkspaceFolder; -(function (WorkspaceFolder) { - function is(value) { - var candidate = value; - return Is.objectLiteral(candidate) && URI.is(candidate.uri) && Is.string(candidate.name); +} +const rootIterations = 12; +function approximateRoot(envelope, derivative, initialGuess) { + let result = initialGuess; + for (let i = 1; i < rootIterations; i++) { + result = result - envelope(result) / derivative(result); } - WorkspaceFolder.is = is; -})(WorkspaceFolder || (exports.WorkspaceFolder = WorkspaceFolder = {})); -var EOL = ['\n', '\r\n', '\r']; -/** - * @deprecated Use the text document from the new vscode-languageserver-textdocument package. - */ -exports.EOL = EOL; -var TextDocument; -exports.TextDocument = TextDocument; -(function (TextDocument) { - /** - * Creates a new ITextDocument literal from the given uri and content. - * @param uri The document's uri. - * @param languageId The document's language Id. - * @param version The document's version. - * @param content The document's content. - */ - function create(uri, languageId, version, content) { - return new FullTextDocument(uri, languageId, version, content); - } - TextDocument.create = create; - /** - * Checks whether the given literal conforms to the [ITextDocument](#ITextDocument) interface. - */ - function is(value) { - var candidate = value; - return Is.defined(candidate) && Is.string(candidate.uri) && (Is.undefined(candidate.languageId) || Is.string(candidate.languageId)) && Is.uinteger(candidate.lineCount) && Is.func(candidate.getText) && Is.func(candidate.positionAt) && Is.func(candidate.offsetAt) ? true : false; - } - TextDocument.is = is; - function applyEdits(document, edits) { - var text = document.getText(); - var sortedEdits = mergeSort(edits, function (a, b) { - var diff = a.range.start.line - b.range.start.line; - if (diff === 0) { - return a.range.start.character - b.range.start.character; - } - return diff; + return result; +} +function calcAngularFreq(undampedFreq, dampingRatio) { + return undampedFreq * Math.sqrt(1 - dampingRatio * dampingRatio); +} +const durationKeys = ["duration", "bounce"]; +const physicsKeys = ["stiffness", "damping", "mass"]; +function isSpringType(options, keys) { + return keys.some(key => options[key] !== undefined); +} +function getSpringOptions(options) { + let springOptions = Object.assign({ + velocity: 0.0, + stiffness: 100, + damping: 10, + mass: 1.0, + isResolvedFromDuration: false + }, options); + if (!isSpringType(options, physicsKeys) && isSpringType(options, durationKeys)) { + const derived = findSpring(options); + springOptions = Object.assign(Object.assign(Object.assign({}, springOptions), derived), { + velocity: 0.0, + mass: 1.0 }); - var lastModifiedOffset = text.length; - for (var i = sortedEdits.length - 1; i >= 0; i--) { - var e = sortedEdits[i]; - var startOffset = document.offsetAt(e.range.start); - var endOffset = document.offsetAt(e.range.end); - if (endOffset <= lastModifiedOffset) { - text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length); - } else { - throw new Error('Overlapping edit'); - } - lastModifiedOffset = startOffset; - } - return text; - } - TextDocument.applyEdits = applyEdits; - function mergeSort(data, compare) { - if (data.length <= 1) { - // sorted - return data; - } - var p = data.length / 2 | 0; - var left = data.slice(0, p); - var right = data.slice(p); - mergeSort(left, compare); - mergeSort(right, compare); - var leftIdx = 0; - var rightIdx = 0; - var i = 0; - while (leftIdx < left.length && rightIdx < right.length) { - var ret = compare(left[leftIdx], right[rightIdx]); - if (ret <= 0) { - // smaller_equal -> take left to preserve order - data[i++] = left[leftIdx++]; - } else { - // greater -> take right - data[i++] = right[rightIdx++]; - } - } - while (leftIdx < left.length) { - data[i++] = left[leftIdx++]; - } - while (rightIdx < right.length) { - data[i++] = right[rightIdx++]; - } - return data; - } -})(TextDocument || (exports.TextDocument = TextDocument = {})); -/** - * @deprecated Use the text document from the new vscode-languageserver-textdocument package. - */ -var FullTextDocument = /** @class */function () { - function FullTextDocument(uri, languageId, version, content) { - this._uri = uri; - this._languageId = languageId; - this._version = version; - this._content = content; - this._lineOffsets = undefined; + springOptions.isResolvedFromDuration = true; } - Object.defineProperty(FullTextDocument.prototype, "uri", { - get: function () { - return this._uri; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(FullTextDocument.prototype, "languageId", { - get: function () { - return this._languageId; - }, - enumerable: false, - configurable: true - }); - Object.defineProperty(FullTextDocument.prototype, "version", { - get: function () { - return this._version; - }, - enumerable: false, - configurable: true - }); - FullTextDocument.prototype.getText = function (range) { - if (range) { - var start = this.offsetAt(range.start); - var end = this.offsetAt(range.end); - return this._content.substring(start, end); - } - return this._content; - }; - FullTextDocument.prototype.update = function (event, version) { - this._content = event.text; - this._version = version; - this._lineOffsets = undefined; + return springOptions; +} +function spring(_a) { + var { + from = 0.0, + to = 1.0, + restSpeed = 2, + restDelta + } = _a, + options = tslib.__rest(_a, ["from", "to", "restSpeed", "restDelta"]); + const state = { + done: false, + value: from }; - FullTextDocument.prototype.getLineOffsets = function () { - if (this._lineOffsets === undefined) { - var lineOffsets = []; - var text = this._content; - var isLineStart = true; - for (var i = 0; i < text.length; i++) { - if (isLineStart) { - lineOffsets.push(i); - isLineStart = false; - } - var ch = text.charAt(i); - isLineStart = ch === '\r' || ch === '\n'; - if (ch === '\r' && i + 1 < text.length && text.charAt(i + 1) === '\n') { - i++; - } - } - if (isLineStart && text.length > 0) { - lineOffsets.push(text.length); - } - this._lineOffsets = lineOffsets; + let { + stiffness, + damping, + mass, + velocity, + duration, + isResolvedFromDuration + } = getSpringOptions(options); + let resolveSpring = zero; + let resolveVelocity = zero; + function createSpring() { + const initialVelocity = velocity ? -(velocity / 1000) : 0.0; + const initialDelta = to - from; + const dampingRatio = damping / (2 * Math.sqrt(stiffness * mass)); + const undampedAngularFreq = Math.sqrt(stiffness / mass) / 1000; + if (restDelta === undefined) { + restDelta = Math.min(Math.abs(to - from) / 100, 0.4); } - return this._lineOffsets; - }; - FullTextDocument.prototype.positionAt = function (offset) { - offset = Math.max(Math.min(offset, this._content.length), 0); - var lineOffsets = this.getLineOffsets(); - var low = 0, - high = lineOffsets.length; - if (high === 0) { - return Position.create(0, offset); + if (dampingRatio < 1) { + const angularFreq = calcAngularFreq(undampedAngularFreq, dampingRatio); + resolveSpring = t => { + const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t); + return to - envelope * ((initialVelocity + dampingRatio * undampedAngularFreq * initialDelta) / angularFreq * Math.sin(angularFreq * t) + initialDelta * Math.cos(angularFreq * t)); + }; + resolveVelocity = t => { + const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t); + return dampingRatio * undampedAngularFreq * envelope * (Math.sin(angularFreq * t) * (initialVelocity + dampingRatio * undampedAngularFreq * initialDelta) / angularFreq + initialDelta * Math.cos(angularFreq * t)) - envelope * (Math.cos(angularFreq * t) * (initialVelocity + dampingRatio * undampedAngularFreq * initialDelta) - angularFreq * initialDelta * Math.sin(angularFreq * t)); + }; + } else if (dampingRatio === 1) { + resolveSpring = t => to - Math.exp(-undampedAngularFreq * t) * (initialDelta + (initialVelocity + undampedAngularFreq * initialDelta) * t); + } else { + const dampedAngularFreq = undampedAngularFreq * Math.sqrt(dampingRatio * dampingRatio - 1); + resolveSpring = t => { + const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t); + const freqForT = Math.min(dampedAngularFreq * t, 300); + return to - envelope * ((initialVelocity + dampingRatio * undampedAngularFreq * initialDelta) * Math.sinh(freqForT) + dampedAngularFreq * initialDelta * Math.cosh(freqForT)) / dampedAngularFreq; + }; } - while (low < high) { - var mid = Math.floor((low + high) / 2); - if (lineOffsets[mid] > offset) { - high = mid; + } + createSpring(); + return { + next: t => { + const current = resolveSpring(t); + if (!isResolvedFromDuration) { + const currentVelocity = resolveVelocity(t) * 1000; + const isBelowVelocityThreshold = Math.abs(currentVelocity) <= restSpeed; + const isBelowDisplacementThreshold = Math.abs(to - current) <= restDelta; + state.done = isBelowVelocityThreshold && isBelowDisplacementThreshold; } else { - low = mid + 1; + state.done = t >= duration; } - } - // low is the least x for which the line offset is larger than the current offset - // or array.length if no line offset is larger than the current offset - var line = low - 1; - return Position.create(line, offset - lineOffsets[line]); - }; - FullTextDocument.prototype.offsetAt = function (position) { - var lineOffsets = this.getLineOffsets(); - if (position.line >= lineOffsets.length) { - return this._content.length; - } else if (position.line < 0) { - return 0; - } - var lineOffset = lineOffsets[position.line]; - var nextLineOffset = position.line + 1 < lineOffsets.length ? lineOffsets[position.line + 1] : this._content.length; - return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset); - }; - Object.defineProperty(FullTextDocument.prototype, "lineCount", { - get: function () { - return this.getLineOffsets().length; + state.value = state.done ? to : current; + return state; }, - enumerable: false, - configurable: true - }); - return FullTextDocument; -}(); -var Is; -(function (Is) { - var toString = Object.prototype.toString; - function defined(value) { - return typeof value !== 'undefined'; - } - Is.defined = defined; - function undefined(value) { - return typeof value === 'undefined'; - } - Is.undefined = undefined; - function boolean(value) { - return value === true || value === false; - } - Is.boolean = boolean; - function string(value) { - return toString.call(value) === '[object String]'; - } - Is.string = string; - function number(value) { - return toString.call(value) === '[object Number]'; - } - Is.number = number; - function numberRange(value, min, max) { - return toString.call(value) === '[object Number]' && min <= value && value <= max; - } - Is.numberRange = numberRange; - function integer(value) { - return toString.call(value) === '[object Number]' && -2147483648 <= value && value <= 2147483647; - } - Is.integer = integer; - function uinteger(value) { - return toString.call(value) === '[object Number]' && 0 <= value && value <= 2147483647; - } - Is.uinteger = uinteger; - function func(value) { - return toString.call(value) === '[object Function]'; - } - Is.func = func; - function objectLiteral(value) { - // Strictly speaking class instances pass this check as well. Since the LSP - // doesn't use classes we ignore this for now. If we do we need to add something - // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null` - return value !== null && typeof value === 'object'; - } - Is.objectLiteral = objectLiteral; - function typedArray(value, check) { - return Array.isArray(value) && value.every(check); - } - Is.typedArray = typedArray; -})(Is || (Is = {})); - -/***/ }), - -/***/ "../../graphiql-react/dist/SchemaReference.cjs.js": -/*!********************************************************!*\ - !*** ../../graphiql-react/dist/SchemaReference.cjs.js ***! - \********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var m = Object.defineProperty; -var l = (n, r) => m(n, "name", { - value: r, - configurable: !0 -}); -const t = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"), - s = __webpack_require__(/*! ./forEachState.cjs.js */ "../../graphiql-react/dist/forEachState.cjs.js"); -function o(n, r) { - const e = { - schema: n, - type: null, - parentType: null, - inputType: null, - directiveDef: null, - fieldDef: null, - argDef: null, - argDefs: null, - objectFieldDefs: null - }; - return s.forEachState(r, i => { - var a, c; - switch (i.kind) { - case "Query": - case "ShortQuery": - e.type = n.getQueryType(); - break; - case "Mutation": - e.type = n.getMutationType(); - break; - case "Subscription": - e.type = n.getSubscriptionType(); - break; - case "InlineFragment": - case "FragmentDefinition": - i.type && (e.type = n.getType(i.type)); - break; - case "Field": - case "AliasedField": - e.fieldDef = e.type && i.name ? T(n, e.parentType, i.name) : null, e.type = (a = e.fieldDef) === null || a === void 0 ? void 0 : a.type; - break; - case "SelectionSet": - e.parentType = e.type ? t.getNamedType(e.type) : null; - break; - case "Directive": - e.directiveDef = i.name ? n.getDirective(i.name) : null; - break; - case "Arguments": - const f = i.prevState ? i.prevState.kind === "Field" ? e.fieldDef : i.prevState.kind === "Directive" ? e.directiveDef : i.prevState.kind === "AliasedField" ? i.prevState.name && T(n, e.parentType, i.prevState.name) : null : null; - e.argDefs = f ? f.args : null; - break; - case "Argument": - if (e.argDef = null, e.argDefs) { - for (let u = 0; u < e.argDefs.length; u++) if (e.argDefs[u].name === i.name) { - e.argDef = e.argDefs[u]; - break; - } - } - e.inputType = (c = e.argDef) === null || c === void 0 ? void 0 : c.type; - break; - case "EnumValue": - const d = e.inputType ? t.getNamedType(e.inputType) : null; - e.enumValue = d instanceof t.GraphQLEnumType ? b(d.getValues(), u => u.value === i.name) : null; - break; - case "ListValue": - const g = e.inputType ? t.getNullableType(e.inputType) : null; - e.inputType = g instanceof t.GraphQLList ? g.ofType : null; - break; - case "ObjectValue": - const y = e.inputType ? t.getNamedType(e.inputType) : null; - e.objectFieldDefs = y instanceof t.GraphQLInputObjectType ? y.getFields() : null; - break; - case "ObjectField": - const p = i.name && e.objectFieldDefs ? e.objectFieldDefs[i.name] : null; - e.inputType = p == null ? void 0 : p.type; - break; - case "NamedType": - e.type = i.name ? n.getType(i.name) : null; - break; + flipTarget: () => { + velocity = -velocity; + [from, to] = [to, from]; + createSpring(); } - }), e; -} -l(o, "getTypeInfo"); -function T(n, r, e) { - if (e === t.SchemaMetaFieldDef.name && n.getQueryType() === r) return t.SchemaMetaFieldDef; - if (e === t.TypeMetaFieldDef.name && n.getQueryType() === r) return t.TypeMetaFieldDef; - if (e === t.TypeNameMetaFieldDef.name && t.isCompositeType(r)) return t.TypeNameMetaFieldDef; - if (r && r.getFields) return r.getFields()[e]; + }; } -l(T, "getFieldDef"); -function b(n, r) { - for (let e = 0; e < n.length; e++) if (r(n[e])) return n[e]; +spring.needsInterpolation = (a, b) => typeof a === "string" || typeof b === "string"; +const zero = _t => 0; +const progress = (from, to, value) => { + const toFromDifference = to - from; + return toFromDifference === 0 ? 1 : (value - from) / toFromDifference; +}; +const mix = (from, to, progress) => -progress * from + progress * to + from; +function hueToRgb(p, q, t) { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; } -l(b, "find"); -function v(n) { +function hslaToRgba({ + hue, + saturation, + lightness, + alpha +}) { + hue /= 360; + saturation /= 100; + lightness /= 100; + let red = 0; + let green = 0; + let blue = 0; + if (!saturation) { + red = green = blue = lightness; + } else { + const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation; + const p = 2 * lightness - q; + red = hueToRgb(p, q, hue + 1 / 3); + green = hueToRgb(p, q, hue); + blue = hueToRgb(p, q, hue - 1 / 3); + } return { - kind: "Field", - schema: n.schema, - field: n.fieldDef, - type: D(n.fieldDef) ? null : n.parentType + red: Math.round(red * 255), + green: Math.round(green * 255), + blue: Math.round(blue * 255), + alpha }; } -l(v, "getFieldReference"); -function F(n) { - return { - kind: "Directive", - schema: n.schema, - directive: n.directiveDef +const mixLinearColor = (from, to, v) => { + const fromExpo = from * from; + const toExpo = to * to; + return Math.sqrt(Math.max(0, v * (toExpo - fromExpo) + fromExpo)); +}; +const colorTypes = [styleValueTypes.hex, styleValueTypes.rgba, styleValueTypes.hsla]; +const getColorType = v => colorTypes.find(type => type.test(v)); +const notAnimatable = color => `'${color}' is not an animatable color. Use the equivalent color code instead.`; +const mixColor = (from, to) => { + let fromColorType = getColorType(from); + let toColorType = getColorType(to); + heyListen.invariant(!!fromColorType, notAnimatable(from)); + heyListen.invariant(!!toColorType, notAnimatable(to)); + let fromColor = fromColorType.parse(from); + let toColor = toColorType.parse(to); + if (fromColorType === styleValueTypes.hsla) { + fromColor = hslaToRgba(fromColor); + fromColorType = styleValueTypes.rgba; + } + if (toColorType === styleValueTypes.hsla) { + toColor = hslaToRgba(toColor); + toColorType = styleValueTypes.rgba; + } + const blended = Object.assign({}, fromColor); + return v => { + for (const key in blended) { + if (key !== "alpha") { + blended[key] = mixLinearColor(fromColor[key], toColor[key], v); + } + } + blended.alpha = mix(fromColor.alpha, toColor.alpha, v); + return fromColorType.transform(blended); }; +}; +const zeroPoint = { + x: 0, + y: 0, + z: 0 +}; +const isNum = v => typeof v === 'number'; +const combineFunctions = (a, b) => v => b(a(v)); +const pipe = (...transformers) => transformers.reduce(combineFunctions); +function getMixer(origin, target) { + if (isNum(origin)) { + return v => mix(origin, target, v); + } else if (styleValueTypes.color.test(origin)) { + return mixColor(origin, target); + } else { + return mixComplex(origin, target); + } } -l(F, "getDirectiveReference"); -function k(n) { - return n.directiveDef ? { - kind: "Argument", - schema: n.schema, - argument: n.argDef, - directive: n.directiveDef - } : { - kind: "Argument", - schema: n.schema, - argument: n.argDef, - field: n.fieldDef, - type: D(n.fieldDef) ? null : n.parentType +const mixArray = (from, to) => { + const output = [...from]; + const numValues = output.length; + const blendValue = from.map((fromThis, i) => getMixer(fromThis, to[i])); + return v => { + for (let i = 0; i < numValues; i++) { + output[i] = blendValue[i](v); + } + return output; }; -} -l(k, "getArgumentReference"); -function S(n) { - return { - kind: "EnumValue", - value: n.enumValue || void 0, - type: n.inputType ? t.getNamedType(n.inputType) : void 0 +}; +const mixObject = (origin, target) => { + const output = Object.assign(Object.assign({}, origin), target); + const blendValue = {}; + for (const key in output) { + if (origin[key] !== undefined && target[key] !== undefined) { + blendValue[key] = getMixer(origin[key], target[key]); + } + } + return v => { + for (const key in blendValue) { + output[key] = blendValue[key](v); + } + return output; }; -} -l(S, "getEnumValueReference"); -function h(n, r) { +}; +function analyse(value) { + const parsed = styleValueTypes.complex.parse(value); + const numValues = parsed.length; + let numNumbers = 0; + let numRGB = 0; + let numHSL = 0; + for (let i = 0; i < numValues; i++) { + if (numNumbers || typeof parsed[i] === "number") { + numNumbers++; + } else { + if (parsed[i].hue !== undefined) { + numHSL++; + } else { + numRGB++; + } + } + } return { - kind: "Type", - schema: n.schema, - type: r || n.type + parsed, + numNumbers, + numRGB, + numHSL }; } -l(h, "getTypeReference"); -function D(n) { - return n.name.slice(0, 2) === "__"; -} -l(D, "isMetaField"); -exports.getArgumentReference = k; -exports.getDirectiveReference = F; -exports.getEnumValueReference = S; -exports.getFieldReference = v; -exports.getTypeInfo = o; -exports.getTypeReference = h; - -/***/ }), - -/***/ "../../graphiql-react/dist/brace-fold.cjs.js": -/*!***************************************************!*\ - !*** ../../graphiql-react/dist/brace-fold.cjs.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var S = Object.defineProperty; -var y = (d, L) => S(d, "name", { - value: L, - configurable: !0 -}); -const _ = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function m(d, L) { - for (var e = 0; e < L.length; e++) { - const g = L[e]; - if (typeof g != "string" && !Array.isArray(g)) { - for (const t in g) if (t !== "default" && !(t in d)) { - const a = Object.getOwnPropertyDescriptor(g, t); - a && Object.defineProperty(d, t, a.get ? a : { - enumerable: !0, - get: () => g[t] - }); - } +const mixComplex = (origin, target) => { + const template = styleValueTypes.complex.createTransformer(target); + const originStats = analyse(origin); + const targetStats = analyse(target); + const canInterpolate = originStats.numHSL === targetStats.numHSL && originStats.numRGB === targetStats.numRGB && originStats.numNumbers >= targetStats.numNumbers; + if (canInterpolate) { + return pipe(mixArray(originStats.parsed, targetStats.parsed), template); + } else { + heyListen.warning(true, `Complex values '${origin}' and '${target}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`); + return p => `${p > 0 ? target : origin}`; + } +}; +const mixNumber = (from, to) => p => mix(from, to, p); +function detectMixerFactory(v) { + if (typeof v === 'number') { + return mixNumber; + } else if (typeof v === 'string') { + if (styleValueTypes.color.test(v)) { + return mixColor; + } else { + return mixComplex; } + } else if (Array.isArray(v)) { + return mixArray; + } else if (typeof v === 'object') { + return mixObject; } - return Object.freeze(Object.defineProperty(d, Symbol.toStringTag, { - value: "Module" - })); } -y(m, "_mergeNamespaces"); -var I = { - exports: {} -}; -(function (d, L) { - (function (e) { - e(_.requireCodemirror()); - })(function (e) { - function g(t) { - return function (a, f) { - var n = f.line, - o = a.getLine(n); - function v(l) { - for (var u, c = f.ch, h = 0;;) { - var b = c <= 0 ? -1 : o.lastIndexOf(l[0], c - 1); - if (b == -1) { - if (h == 1) break; - h = 1, c = o.length; - continue; - } - if (h == 1 && b < f.ch) break; - if (u = a.getTokenTypeAt(e.Pos(n, b + 1)), !/^(comment|string)/.test(u)) return { - ch: b + 1, - tokenType: u, - pair: l - }; - c = b - 1; - } - } - y(v, "findOpening"); - function k(l) { - var u = 1, - c = a.lastLine(), - h, - b = l.ch, - j; - e: for (var T = n; T <= c; ++T) for (var A = a.getLine(T), p = T == n ? b : 0;;) { - var F = A.indexOf(l.pair[0], p), - O = A.indexOf(l.pair[1], p); - if (F < 0 && (F = A.length), O < 0 && (O = A.length), p = Math.min(F, O), p == A.length) break; - if (a.getTokenTypeAt(e.Pos(T, p + 1)) == l.tokenType) { - if (p == F) ++u;else if (! --u) { - h = T, j = p; - break e; - } - } - ++p; - } - return h == null || n == h ? null : { - from: e.Pos(n, b), - to: e.Pos(h, j) - }; - } - y(k, "findRange"); - for (var i = [], r = 0; r < t.length; r++) { - var s = v(t[r]); - s && i.push(s); - } - i.sort(function (l, u) { - return l.ch - u.ch; - }); - for (var r = 0; r < i.length; r++) { - var P = k(i[r]); - if (P) return P; - } - return null; - }; +function createMixers(output, ease, customMixer) { + const mixers = []; + const mixerFactory = customMixer || detectMixerFactory(output[0]); + const numMixers = output.length - 1; + for (let i = 0; i < numMixers; i++) { + let mixer = mixerFactory(output[i], output[i + 1]); + if (ease) { + const easingFunction = Array.isArray(ease) ? ease[i] : ease; + mixer = pipe(easingFunction, mixer); } - y(g, "bracketFolding"), e.registerHelper("fold", "brace", g([["{", "}"], ["[", "]"]])), e.registerHelper("fold", "brace-paren", g([["{", "}"], ["[", "]"], ["(", ")"]])), e.registerHelper("fold", "import", function (t, a) { - function f(r) { - if (r < t.firstLine() || r > t.lastLine()) return null; - var s = t.getTokenAt(e.Pos(r, 1)); - if (/\S/.test(s.string) || (s = t.getTokenAt(e.Pos(r, s.end + 1))), s.type != "keyword" || s.string != "import") return null; - for (var P = r, l = Math.min(t.lastLine(), r + 10); P <= l; ++P) { - var u = t.getLine(P), - c = u.indexOf(";"); - if (c != -1) return { - startCh: s.end, - end: e.Pos(P, c) - }; + mixers.push(mixer); + } + return mixers; +} +function fastInterpolate([from, to], [mixer]) { + return v => mixer(progress(from, to, v)); +} +function slowInterpolate(input, mixers) { + const inputLength = input.length; + const lastInputIndex = inputLength - 1; + return v => { + let mixerIndex = 0; + let foundMixerIndex = false; + if (v <= input[0]) { + foundMixerIndex = true; + } else if (v >= input[lastInputIndex]) { + mixerIndex = lastInputIndex - 1; + foundMixerIndex = true; + } + if (!foundMixerIndex) { + let i = 1; + for (; i < inputLength; i++) { + if (input[i] > v || i === lastInputIndex) { + break; } } - y(f, "hasImport"); - var n = a.line, - o = f(n), - v; - if (!o || f(n - 1) || (v = f(n - 2)) && v.end.line == n - 1) return null; - for (var k = o.end;;) { - var i = f(k.line + 1); - if (i == null) break; - k = i.end; - } - return { - from: t.clipPos(e.Pos(n, o.startCh + 1)), - to: k - }; - }), e.registerHelper("fold", "include", function (t, a) { - function f(i) { - if (i < t.firstLine() || i > t.lastLine()) return null; - var r = t.getTokenAt(e.Pos(i, 1)); - if (/\S/.test(r.string) || (r = t.getTokenAt(e.Pos(i, r.end + 1))), r.type == "meta" && r.string.slice(0, 8) == "#include") return r.start + 8; - } - y(f, "hasInclude"); - var n = a.line, - o = f(n); - if (o == null || f(n - 1) != null) return null; - for (var v = n;;) { - var k = f(v + 1); - if (k == null) break; - ++v; - } - return { - from: e.Pos(n, o + 1), - to: t.clipPos(e.Pos(v)) - }; - }); - }); -})(); -var H = I.exports; -const q = _.getDefaultExportFromCjs(H), - w = m({ - __proto__: null, - default: q - }, [H]); -exports.braceFold = w; - -/***/ }), - -/***/ "../../graphiql-react/dist/closebrackets.cjs.js": -/*!******************************************************!*\ - !*** ../../graphiql-react/dist/closebrackets.cjs.js ***! - \******************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var G = Object.defineProperty; -var f = (S, P) => G(S, "name", { - value: P, - configurable: !0 -}); -const q = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function H(S, P) { - for (var a = 0; a < P.length; a++) { - const c = P[a]; - if (typeof c != "string" && !Array.isArray(c)) { - for (const i in c) if (i !== "default" && !(i in S)) { - const v = Object.getOwnPropertyDescriptor(c, i); - v && Object.defineProperty(S, i, v.get ? v : { - enumerable: !0, - get: () => c[i] - }); - } + mixerIndex = i - 1; } + const progressInRange = progress(input[mixerIndex], input[mixerIndex + 1], v); + return mixers[mixerIndex](progressInRange); + }; +} +function interpolate(input, output, { + clamp: isClamp = true, + ease, + mixer +} = {}) { + const inputLength = input.length; + heyListen.invariant(inputLength === output.length, 'Both input and output ranges must be the same length'); + heyListen.invariant(!ease || !Array.isArray(ease) || ease.length === inputLength - 1, 'Array of easing functions must be of length `input.length - 1`, as it applies to the transitions **between** the defined values.'); + if (input[0] > input[inputLength - 1]) { + input = [].concat(input); + output = [].concat(output); + input.reverse(); + output.reverse(); } - return Object.freeze(Object.defineProperty(S, Symbol.toStringTag, { - value: "Module" - })); + const mixers = createMixers(output, ease, mixer); + const interpolator = inputLength === 2 ? fastInterpolate(input, mixers) : slowInterpolate(input, mixers); + return isClamp ? v => interpolator(clamp(input[0], input[inputLength - 1], v)) : interpolator; } -f(H, "_mergeNamespaces"); -var J = { - exports: {} +const reverseEasing = easing => p => 1 - easing(1 - p); +const mirrorEasing = easing => p => p <= 0.5 ? easing(2 * p) / 2 : (2 - easing(2 * (1 - p))) / 2; +const createExpoIn = power => p => Math.pow(p, power); +const createBackIn = power => p => p * p * ((power + 1) * p - power); +const createAnticipate = power => { + const backEasing = createBackIn(power); + return p => (p *= 2) < 1 ? 0.5 * backEasing(p) : 0.5 * (2 - Math.pow(2, -10 * (p - 1))); }; -(function (S, P) { - (function (a) { - a(q.requireCodemirror()); - })(function (a) { - var c = { - pairs: `()[]{}''""`, - closeBefore: `)]}'":;>`, - triples: "", - explode: "[]{}" - }, - i = a.Pos; - a.defineOption("autoCloseBrackets", !1, function (e, t, n) { - n && n != a.Init && (e.removeKeyMap(B), e.state.closeBrackets = null), t && (_(v(t, "pairs")), e.state.closeBrackets = t, e.addKeyMap(B)); +const DEFAULT_OVERSHOOT_STRENGTH = 1.525; +const BOUNCE_FIRST_THRESHOLD = 4.0 / 11.0; +const BOUNCE_SECOND_THRESHOLD = 8.0 / 11.0; +const BOUNCE_THIRD_THRESHOLD = 9.0 / 10.0; +const linear = p => p; +const easeIn = createExpoIn(2); +const easeOut = reverseEasing(easeIn); +const easeInOut = mirrorEasing(easeIn); +const circIn = p => 1 - Math.sin(Math.acos(p)); +const circOut = reverseEasing(circIn); +const circInOut = mirrorEasing(circOut); +const backIn = createBackIn(DEFAULT_OVERSHOOT_STRENGTH); +const backOut = reverseEasing(backIn); +const backInOut = mirrorEasing(backIn); +const anticipate = createAnticipate(DEFAULT_OVERSHOOT_STRENGTH); +const ca = 4356.0 / 361.0; +const cb = 35442.0 / 1805.0; +const cc = 16061.0 / 1805.0; +const bounceOut = p => { + if (p === 1 || p === 0) return p; + const p2 = p * p; + return p < BOUNCE_FIRST_THRESHOLD ? 7.5625 * p2 : p < BOUNCE_SECOND_THRESHOLD ? 9.075 * p2 - 9.9 * p + 3.4 : p < BOUNCE_THIRD_THRESHOLD ? ca * p2 - cb * p + cc : 10.8 * p * p - 20.52 * p + 10.72; +}; +const bounceIn = reverseEasing(bounceOut); +const bounceInOut = p => p < 0.5 ? 0.5 * (1.0 - bounceOut(1.0 - p * 2.0)) : 0.5 * bounceOut(p * 2.0 - 1.0) + 0.5; +function defaultEasing(values, easing) { + return values.map(() => easing || easeInOut).splice(0, values.length - 1); +} +function defaultOffset(values) { + const numValues = values.length; + return values.map((_value, i) => i !== 0 ? i / (numValues - 1) : 0); +} +function convertOffsetToTimes(offset, duration) { + return offset.map(o => o * duration); +} +function keyframes({ + from = 0, + to = 1, + ease, + offset, + duration = 300 +}) { + const state = { + done: false, + value: from + }; + const values = Array.isArray(to) ? to : [from, to]; + const times = convertOffsetToTimes(offset && offset.length === values.length ? offset : defaultOffset(values), duration); + function createInterpolator() { + return interpolate(times, values, { + ease: Array.isArray(ease) ? ease : defaultEasing(values, ease) }); - function v(e, t) { - return t == "pairs" && typeof e == "string" ? e : typeof e == "object" && e[t] != null ? e[t] : c[t]; - } - f(v, "getOption"); - var B = { - Backspace: L, - Enter: W - }; - function _(e) { - for (var t = 0; t < e.length; t++) { - var n = e.charAt(t), - s = "'" + n + "'"; - B[s] || (B[s] = K(n)); - } + } + let interpolator = createInterpolator(); + return { + next: t => { + state.value = interpolator(t); + state.done = t >= duration; + return state; + }, + flipTarget: () => { + values.reverse(); + interpolator = createInterpolator(); } - f(_, "ensureBound"), _(c.pairs + "`"); - function K(e) { - return function (t) { - return z(t, e); - }; + }; +} +function decay({ + velocity = 0, + from = 0, + power = 0.8, + timeConstant = 350, + restDelta = 0.5, + modifyTarget +}) { + const state = { + done: false, + value: from + }; + let amplitude = power * velocity; + const ideal = from + amplitude; + const target = modifyTarget === undefined ? ideal : modifyTarget(ideal); + if (target !== ideal) amplitude = target - from; + return { + next: t => { + const delta = -amplitude * Math.exp(-t / timeConstant); + state.done = !(delta > restDelta || delta < -restDelta); + state.value = state.done ? target : target + delta; + return state; + }, + flipTarget: () => {} + }; +} +const types = { + keyframes, + spring, + decay +}; +function detectAnimationFromOptions(config) { + if (Array.isArray(config.to)) { + return keyframes; + } else if (types[config.type]) { + return types[config.type]; + } + const keys = new Set(Object.keys(config)); + if (keys.has("ease") || keys.has("duration") && !keys.has("dampingRatio")) { + return keyframes; + } else if (keys.has("dampingRatio") || keys.has("stiffness") || keys.has("mass") || keys.has("damping") || keys.has("restSpeed") || keys.has("restDelta")) { + return spring; + } + return keyframes; +} +function loopElapsed(elapsed, duration, delay = 0) { + return elapsed - duration - delay; +} +function reverseElapsed(elapsed, duration, delay = 0, isForwardPlayback = true) { + return isForwardPlayback ? loopElapsed(duration + -elapsed, duration, delay) : duration - (elapsed - duration) + delay; +} +function hasRepeatDelayElapsed(elapsed, duration, delay, isForwardPlayback) { + return isForwardPlayback ? elapsed >= duration + delay : elapsed <= -delay; +} +const framesync = update => { + const passTimestamp = ({ + delta + }) => update(delta); + return { + start: () => sync__default["default"].update(passTimestamp, true), + stop: () => sync.cancelSync.update(passTimestamp) + }; +}; +function animate(_a) { + var _b, _c; + var { + from, + autoplay = true, + driver = framesync, + elapsed = 0, + repeat: repeatMax = 0, + repeatType = "loop", + repeatDelay = 0, + onPlay, + onStop, + onComplete, + onRepeat, + onUpdate + } = _a, + options = tslib.__rest(_a, ["from", "autoplay", "driver", "elapsed", "repeat", "repeatType", "repeatDelay", "onPlay", "onStop", "onComplete", "onRepeat", "onUpdate"]); + let { + to + } = options; + let driverControls; + let repeatCount = 0; + let computedDuration = options.duration; + let latest; + let isComplete = false; + let isForwardPlayback = true; + let interpolateFromNumber; + const animator = detectAnimationFromOptions(options); + if ((_c = (_b = animator).needsInterpolation) === null || _c === void 0 ? void 0 : _c.call(_b, from, to)) { + interpolateFromNumber = interpolate([0, 100], [from, to], { + clamp: false + }); + from = 0; + to = 100; + } + const animation = animator(Object.assign(Object.assign({}, options), { + from, + to + })); + function repeat() { + repeatCount++; + if (repeatType === "reverse") { + isForwardPlayback = repeatCount % 2 === 0; + elapsed = reverseElapsed(elapsed, computedDuration, repeatDelay, isForwardPlayback); + } else { + elapsed = loopElapsed(elapsed, computedDuration, repeatDelay); + if (repeatType === "mirror") animation.flipTarget(); } - f(K, "handler"); - function x(e) { - var t = e.state.closeBrackets; - if (!t || t.override) return t; - var n = e.getModeAt(e.getCursor()); - return n.closeBrackets || t; - } - f(x, "getConfig"); - function L(e) { - var t = x(e); - if (!t || e.getOption("disableInput")) return a.Pass; - for (var n = v(t, "pairs"), s = e.listSelections(), r = 0; r < s.length; r++) { - if (!s[r].empty()) return a.Pass; - var h = w(e, s[r].head); - if (!h || n.indexOf(h) % 2 != 0) return a.Pass; - } - for (var r = s.length - 1; r >= 0; r--) { - var o = s[r].head; - e.replaceRange("", i(o.line, o.ch - 1), i(o.line, o.ch + 1), "+delete"); - } - } - f(L, "handleBackspace"); - function W(e) { - var t = x(e), - n = t && v(t, "explode"); - if (!n || e.getOption("disableInput")) return a.Pass; - for (var s = e.listSelections(), r = 0; r < s.length; r++) { - if (!s[r].empty()) return a.Pass; - var h = w(e, s[r].head); - if (!h || n.indexOf(h) % 2 != 0) return a.Pass; - } - e.operation(function () { - var o = e.lineSeparator() || ` -`; - e.replaceSelection(o + o, null), O(e, -1), s = e.listSelections(); - for (var g = 0; g < s.length; g++) { - var A = s[g].head.line; - e.indentLine(A, null, !0), e.indentLine(A + 1, null, !0); - } - }); + isComplete = false; + onRepeat && onRepeat(); + } + function complete() { + driverControls.stop(); + onComplete && onComplete(); + } + function update(delta) { + if (!isForwardPlayback) delta = -delta; + elapsed += delta; + if (!isComplete) { + const state = animation.next(Math.max(0, elapsed)); + latest = state.value; + if (interpolateFromNumber) latest = interpolateFromNumber(latest); + isComplete = isForwardPlayback ? state.done : elapsed <= 0; } - f(W, "handleEnter"); - function O(e, t) { - for (var n = [], s = e.listSelections(), r = 0, h = 0; h < s.length; h++) { - var o = s[h]; - o.head == e.getCursor() && (r = h); - var g = o.head.ch || t > 0 ? { - line: o.head.line, - ch: o.head.ch + t - } : { - line: o.head.line - 1 - }; - n.push({ - anchor: g, - head: g - }); + onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(latest); + if (isComplete) { + if (repeatCount === 0) computedDuration !== null && computedDuration !== void 0 ? computedDuration : computedDuration = elapsed; + if (repeatCount < repeatMax) { + hasRepeatDelayElapsed(elapsed, computedDuration, repeatDelay, isForwardPlayback) && repeat(); + } else { + complete(); } - e.setSelections(n, r); - } - f(O, "moveSel"); - function $(e) { - var t = a.cmpPos(e.anchor, e.head) > 0; - return { - anchor: new i(e.anchor.line, e.anchor.ch + (t ? -1 : 1)), - head: new i(e.head.line, e.head.ch + (t ? 1 : -1)) - }; - } - f($, "contractSelection"); - function z(e, t) { - var n = x(e); - if (!n || e.getOption("disableInput")) return a.Pass; - var s = v(n, "pairs"), - r = s.indexOf(t); - if (r == -1) return a.Pass; - for (var h = v(n, "closeBefore"), o = v(n, "triples"), g = s.charAt(r + 1) == t, A = e.listSelections(), R = r % 2 == 0, b, j = 0; j < A.length; j++) { - var I = A[j], - l = I.head, - u, - y = e.getRange(l, i(l.line, l.ch + 1)); - if (R && !I.empty()) u = "surround";else if ((g || !R) && y == t) g && N(e, l) ? u = "both" : o.indexOf(t) >= 0 && e.getRange(l, i(l.line, l.ch + 3)) == t + t + t ? u = "skipThree" : u = "skip";else if (g && l.ch > 1 && o.indexOf(t) >= 0 && e.getRange(i(l.line, l.ch - 2), l) == t + t) { - if (l.ch > 2 && /\bstring/.test(e.getTokenTypeAt(i(l.line, l.ch - 2)))) return a.Pass; - u = "addFour"; - } else if (g) { - var F = l.ch == 0 ? " " : e.getRange(i(l.line, l.ch - 1), l); - if (!a.isWordChar(y) && F != t && !a.isWordChar(F)) u = "both";else return a.Pass; - } else if (R && (y.length === 0 || /\s/.test(y) || h.indexOf(y) > -1)) u = "both";else return a.Pass; - if (!b) b = u;else if (b != u) return a.Pass; - } - var k = r % 2 ? s.charAt(r - 1) : t, - E = r % 2 ? t : s.charAt(r + 1); - e.operation(function () { - if (b == "skip") O(e, 1);else if (b == "skipThree") O(e, 3);else if (b == "surround") { - for (var p = e.getSelections(), d = 0; d < p.length; d++) p[d] = k + p[d] + E; - e.replaceSelections(p, "around"), p = e.listSelections().slice(); - for (var d = 0; d < p.length; d++) p[d] = $(p[d]); - e.setSelections(p); - } else b == "both" ? (e.replaceSelection(k + E, null), e.triggerElectric(k + E), O(e, -1)) : b == "addFour" && (e.replaceSelection(k + k + k + k, "before"), O(e, 1)); - }); } - f(z, "handleChar"); - function w(e, t) { - var n = e.getRange(i(t.line, t.ch - 1), i(t.line, t.ch + 1)); - return n.length == 2 ? n : null; - } - f(w, "charsAround"); - function N(e, t) { - var n = e.getTokenAt(i(t.line, t.ch + 1)); - return /\bstring/.test(n.type) && n.start == t.ch && (t.ch == 0 || !/\bstring/.test(e.getTokenTypeAt(t))); + } + function play() { + onPlay === null || onPlay === void 0 ? void 0 : onPlay(); + driverControls = driver(update); + driverControls.start(); + } + autoplay && play(); + return { + stop: () => { + onStop === null || onStop === void 0 ? void 0 : onStop(); + driverControls.stop(); } - f(N, "stringStartsAfter"); - }); -})(); -var D = J.exports; -const Q = q.getDefaultExportFromCjs(D), - T = H({ - __proto__: null, - default: Q - }, [D]); -exports.closebrackets = T; - -/***/ }), - -/***/ "../../graphiql-react/dist/codemirror.cjs.js": -/*!***************************************************!*\ - !*** ../../graphiql-react/dist/codemirror.cjs.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var u = Object.defineProperty; -var n = (r, t) => u(r, "name", { - value: t, - configurable: !0 -}); -const s = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function a(r, t) { - for (var i = 0; i < t.length; i++) { - const e = t[i]; - if (typeof e != "string" && !Array.isArray(e)) { - for (const o in e) if (o !== "default" && !(o in r)) { - const c = Object.getOwnPropertyDescriptor(e, o); - c && Object.defineProperty(r, o, c.get ? c : { - enumerable: !0, - get: () => e[o] + }; +} +function velocityPerSecond(velocity, frameDuration) { + return frameDuration ? velocity * (1000 / frameDuration) : 0; +} +function inertia({ + from = 0, + velocity = 0, + min, + max, + power = 0.8, + timeConstant = 750, + bounceStiffness = 500, + bounceDamping = 10, + restDelta = 1, + modifyTarget, + driver, + onUpdate, + onComplete, + onStop +}) { + let currentAnimation; + function isOutOfBounds(v) { + return min !== undefined && v < min || max !== undefined && v > max; + } + function boundaryNearest(v) { + if (min === undefined) return max; + if (max === undefined) return min; + return Math.abs(min - v) < Math.abs(max - v) ? min : max; + } + function startAnimation(options) { + currentAnimation === null || currentAnimation === void 0 ? void 0 : currentAnimation.stop(); + currentAnimation = animate(Object.assign(Object.assign({}, options), { + driver, + onUpdate: v => { + var _a; + onUpdate === null || onUpdate === void 0 ? void 0 : onUpdate(v); + (_a = options.onUpdate) === null || _a === void 0 ? void 0 : _a.call(options, v); + }, + onComplete, + onStop + })); + } + function startSpring(options) { + startAnimation(Object.assign({ + type: "spring", + stiffness: bounceStiffness, + damping: bounceDamping, + restDelta + }, options)); + } + if (isOutOfBounds(from)) { + startSpring({ + from, + velocity, + to: boundaryNearest(from) + }); + } else { + let target = power * velocity + from; + if (typeof modifyTarget !== "undefined") target = modifyTarget(target); + const boundary = boundaryNearest(target); + const heading = boundary === min ? -1 : 1; + let prev; + let current; + const checkBoundary = v => { + prev = current; + current = v; + velocity = velocityPerSecond(v - prev, sync.getFrameData().delta); + if (heading === 1 && v > boundary || heading === -1 && v < boundary) { + startSpring({ + from: v, + to: boundary, + velocity }); } - } + }; + startAnimation({ + type: "decay", + from, + velocity, + timeConstant, + power, + restDelta, + modifyTarget, + onUpdate: isOutOfBounds(target) ? checkBoundary : undefined + }); } - return Object.freeze(Object.defineProperty(r, Symbol.toStringTag, { - value: "Module" - })); + return { + stop: () => currentAnimation === null || currentAnimation === void 0 ? void 0 : currentAnimation.stop() + }; } -n(a, "_mergeNamespaces"); -var d = s.requireCodemirror(); -const f = s.getDefaultExportFromCjs(d), - l = a({ - __proto__: null, - default: f - }, [d]); -exports.CodeMirror = f; -exports.codemirror = l; - -/***/ }), - -/***/ "../../graphiql-react/dist/codemirror.cjs2.js": -/*!****************************************************!*\ - !*** ../../graphiql-react/dist/codemirror.cjs2.js ***! - \****************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var su = Object.defineProperty; -var u = (He, Dn) => su(He, "name", { - value: Dn, - configurable: !0 -}); -var uu = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof __webpack_require__.g < "u" ? __webpack_require__.g : typeof self < "u" ? self : {}; -function fu(He) { - return He && He.__esModule && Object.prototype.hasOwnProperty.call(He, "default") ? He.default : He; +const radiansToDegrees = radians => radians * 180 / Math.PI; +const angle = (a, b = zeroPoint) => radiansToDegrees(Math.atan2(b.y - a.y, b.x - a.x)); +const applyOffset = (from, to) => { + let hasReceivedFrom = true; + if (to === undefined) { + to = from; + hasReceivedFrom = false; + } + return v => { + if (hasReceivedFrom) { + return v - from + to; + } else { + from = v; + hasReceivedFrom = true; + return to; + } + }; +}; +const identity = v => v; +const createAttractor = (alterDisplacement = identity) => (constant, origin, v) => { + const displacement = origin - v; + const springModifiedDisplacement = -(0 - constant + 1) * (0 - alterDisplacement(Math.abs(displacement))); + return displacement <= 0 ? origin + springModifiedDisplacement : origin - springModifiedDisplacement; +}; +const attract = createAttractor(); +const attractExpo = createAttractor(Math.sqrt); +const degreesToRadians = degrees => degrees * Math.PI / 180; +const isPoint = point => point.hasOwnProperty('x') && point.hasOwnProperty('y'); +const isPoint3D = point => isPoint(point) && point.hasOwnProperty('z'); +const distance1D = (a, b) => Math.abs(a - b); +function distance(a, b) { + if (isNum(a) && isNum(b)) { + return distance1D(a, b); + } else if (isPoint(a) && isPoint(b)) { + const xDelta = distance1D(a.x, b.x); + const yDelta = distance1D(a.y, b.y); + const zDelta = isPoint3D(a) && isPoint3D(b) ? distance1D(a.z, b.z) : 0; + return Math.sqrt(Math.pow(xDelta, 2) + Math.pow(yDelta, 2) + Math.pow(zDelta, 2)); + } } -u(fu, "getDefaultExportFromCjs"); -var Mn = { - exports: {} - }, - Ko; -function hu() { - return Ko || (Ko = 1, function (He, Dn) { - (function (ie, Lr) { - He.exports = Lr(); - })(uu, function () { - var ie = navigator.userAgent, - Lr = navigator.platform, - Fe = /gecko\/\d/i.test(ie), - Nn = /MSIE \d/.test(ie), - An = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(ie), - kr = /Edge\/(\d+)/.exec(ie), - O = Nn || An || kr, - I = O && (Nn ? document.documentMode || 6 : +(kr || An)[1]), - ne = !kr && /WebKit\//.test(ie), - _o = ne && /Qt\/\d+\.\d+/.test(ie), - Tr = !kr && /Chrome\//.test(ie), - we = /Opera\//.test(ie), - Mr = /Apple Computer/.test(navigator.vendor), - Xo = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(ie), - Yo = /PhantomJS/.test(ie), - Ut = Mr && (/Mobile\/\w+/.test(ie) || navigator.maxTouchPoints > 2), - Dr = /Android/.test(ie), - Kt = Ut || Dr || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(ie), - me = Ut || /Mac/.test(Lr), - qo = /\bCrOS\b/.test(ie), - Zo = /win/i.test(Lr), - et = we && ie.match(/Version\/(\d*\.\d*)/); - et && (et = Number(et[1])), et && et >= 15 && (we = !1, ne = !0); - var On = me && (_o || we && (et == null || et < 12.11)), - ci = Fe || O && I >= 9; - function mt(e) { - return new RegExp("(^|\\s)" + e + "(?:$|\\s)\\s*"); - } - u(mt, "classTest"); - var tt = u(function (e, t) { - var i = e.className, - r = mt(t).exec(i); - if (r) { - var n = i.slice(r.index + r[0].length); - e.className = i.slice(0, r.index) + (n ? r[1] + n : ""); - } - }, "rmClass"); - function Ue(e) { - for (var t = e.childNodes.length; t > 0; --t) e.removeChild(e.firstChild); - return e; - } - u(Ue, "removeChildren"); - function ve(e, t) { - return Ue(e).appendChild(t); - } - u(ve, "removeChildrenAndAdd"); - function T(e, t, i, r) { - var n = document.createElement(e); - if (i && (n.className = i), r && (n.style.cssText = r), typeof t == "string") n.appendChild(document.createTextNode(t));else if (t) for (var l = 0; l < t.length; ++l) n.appendChild(t[l]); - return n; - } - u(T, "elt"); - function bt(e, t, i, r) { - var n = T(e, t, i, r); - return n.setAttribute("role", "presentation"), n; - } - u(bt, "eltP"); - var rt; - document.createRange ? rt = u(function (e, t, i, r) { - var n = document.createRange(); - return n.setEnd(r || e, i), n.setStart(e, t), n; - }, "range") : rt = u(function (e, t, i) { - var r = document.body.createTextRange(); - try { - r.moveToElementText(e.parentNode); - } catch { - return r; - } - return r.collapse(!0), r.moveEnd("character", i), r.moveStart("character", t), r; - }, "range"); - function Ke(e, t) { - if (t.nodeType == 3 && (t = t.parentNode), e.contains) return e.contains(t); - do if (t.nodeType == 11 && (t = t.host), t == e) return !0; while (t = t.parentNode); - } - u(Ke, "contains"); - function be() { - var e; - try { - e = document.activeElement; - } catch { - e = document.body || null; - } - for (; e && e.shadowRoot && e.shadowRoot.activeElement;) e = e.shadowRoot.activeElement; - return e; - } - u(be, "activeElt"); - function it(e, t) { - var i = e.className; - mt(t).test(i) || (e.className += (i ? " " : "") + t); - } - u(it, "addClass"); - function di(e, t) { - for (var i = e.split(" "), r = 0; r < i.length; r++) i[r] && !mt(i[r]).test(t) && (t += " " + i[r]); - return t; - } - u(di, "joinClasses"); - var _t = u(function (e) { - e.select(); - }, "selectInput"); - Ut ? _t = u(function (e) { - e.selectionStart = 0, e.selectionEnd = e.value.length; - }, "selectInput") : O && (_t = u(function (e) { - try { - e.select(); - } catch {} - }, "selectInput")); - function pi(e) { - var t = Array.prototype.slice.call(arguments, 1); - return function () { - return e.apply(null, t); - }; - } - u(pi, "bind"); - function nt(e, t, i) { - t || (t = {}); - for (var r in e) e.hasOwnProperty(r) && (i !== !1 || !t.hasOwnProperty(r)) && (t[r] = e[r]); - return t; - } - u(nt, "copyObj"); - function xe(e, t, i, r, n) { - t == null && (t = e.search(/[^\s\u00a0]/), t == -1 && (t = e.length)); - for (var l = r || 0, o = n || 0;;) { - var a = e.indexOf(" ", l); - if (a < 0 || a >= t) return o + (t - l); - o += a - l, o += i - o % i, l = a + 1; - } - } - u(xe, "countColumn"); - var _e = u(function () { - this.id = null, this.f = null, this.time = 0, this.handler = pi(this.onTimeout, this); - }, "Delayed"); - _e.prototype.onTimeout = function (e) { - e.id = 0, e.time <= +new Date() ? e.f() : setTimeout(e.handler, e.time - +new Date()); - }, _e.prototype.set = function (e, t) { - this.f = t; - var i = +new Date() + e; - (!this.id || i < this.time) && (clearTimeout(this.id), this.id = setTimeout(this.handler, e), this.time = i); - }; - function ee(e, t) { - for (var i = 0; i < e.length; ++i) if (e[i] == t) return i; - return -1; - } - u(ee, "indexOf"); - var Wn = 50, - Nr = { - toString: function () { - return "CodeMirror.Pass"; - } - }, - Me = { - scroll: !1 - }, - vi = { - origin: "*mouse" - }, - Xt = { - origin: "+move" - }; - function gi(e, t, i) { - for (var r = 0, n = 0;;) { - var l = e.indexOf(" ", r); - l == -1 && (l = e.length); - var o = l - r; - if (l == e.length || n + o >= t) return r + Math.min(o, t - n); - if (n += l - r, n += i - n % i, r = l + 1, n >= t) return r; - } - } - u(gi, "findColumn"); - var Ar = [""]; - function yi(e) { - for (; Ar.length <= e;) Ar.push(H(Ar) + " "); - return Ar[e]; - } - u(yi, "spaceStr"); - function H(e) { - return e[e.length - 1]; - } - u(H, "lst"); - function Or(e, t) { - for (var i = [], r = 0; r < e.length; r++) i[r] = t(e[r], r); - return i; - } - u(Or, "map"); - function Qo(e, t, i) { - for (var r = 0, n = i(t); r < e.length && i(e[r]) <= n;) r++; - e.splice(r, 0, t); - } - u(Qo, "insertSorted"); - function Hn() {} - u(Hn, "nothing"); - function Fn(e, t) { - var i; - return Object.create ? i = Object.create(e) : (Hn.prototype = e, i = new Hn()), t && nt(t, i), i; - } - u(Fn, "createObj"); - var Jo = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; - function mi(e) { - return /\w/.test(e) || e > "€" && (e.toUpperCase() != e.toLowerCase() || Jo.test(e)); - } - u(mi, "isWordCharBasic"); - function Wr(e, t) { - return t ? t.source.indexOf("\\w") > -1 && mi(e) ? !0 : t.test(e) : mi(e); - } - u(Wr, "isWordChar"); - function Pn(e) { - for (var t in e) if (e.hasOwnProperty(t) && e[t]) return !1; - return !0; - } - u(Pn, "isEmpty"); - var jo = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; - function bi(e) { - return e.charCodeAt(0) >= 768 && jo.test(e); - } - u(bi, "isExtendingChar"); - function En(e, t, i) { - for (; (i < 0 ? t > 0 : t < e.length) && bi(e.charAt(t));) t += i; - return t; - } - u(En, "skipExtendingChars"); - function Yt(e, t, i) { - for (var r = t > i ? -1 : 1;;) { - if (t == i) return t; - var n = (t + i) / 2, - l = r < 0 ? Math.ceil(n) : Math.floor(n); - if (l == t) return e(l) ? t : i; - e(l) ? i = l : t = l + r; - } - } - u(Yt, "findFirst"); - function Vo(e, t, i, r) { - if (!e) return r(t, i, "ltr", 0); - for (var n = !1, l = 0; l < e.length; ++l) { - var o = e[l]; - (o.from < i && o.to > t || t == i && o.to == t) && (r(Math.max(o.from, t), Math.min(o.to, i), o.level == 1 ? "rtl" : "ltr", l), n = !0); - } - n || r(t, i, "ltr"); - } - u(Vo, "iterateBidiSections"); - var qt = null; - function Zt(e, t, i) { - var _r2; - var r; - qt = null; - for (var n = 0; n < e.length; ++n) { - var l = e[n]; - if (l.from < t && l.to > t) return n; - l.to == t && (l.from != l.to && i == "before" ? r = n : qt = n), l.from == t && (l.from != l.to && i != "before" ? r = n : qt = n); - } - return (_r2 = r) !== null && _r2 !== void 0 ? _r2 : qt; - } - u(Zt, "getBidiPartAt"); - var $o = function () { - var e = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN", - t = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; - function i(f) { - return f <= 247 ? e.charAt(f) : 1424 <= f && f <= 1524 ? "R" : 1536 <= f && f <= 1785 ? t.charAt(f - 1536) : 1774 <= f && f <= 2220 ? "r" : 8192 <= f && f <= 8203 ? "w" : f == 8204 ? "b" : "L"; - } - u(i, "charType"); - var r = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/, - n = /[stwN]/, - l = /[LRr]/, - o = /[Lb1n]/, - a = /[1n]/; - function s(f, h, c) { - this.level = f, this.from = h, this.to = c; - } - return u(s, "BidiSpan"), function (f, h) { - var c = h == "ltr" ? "L" : "R"; - if (f.length == 0 || h == "ltr" && !r.test(f)) return !1; - for (var p = f.length, d = [], v = 0; v < p; ++v) d.push(i(f.charCodeAt(v))); - for (var g = 0, m = c; g < p; ++g) { - var b = d[g]; - b == "m" ? d[g] = m : m = b; - } - for (var C = 0, x = c; C < p; ++C) { - var w = d[C]; - w == "1" && x == "r" ? d[C] = "n" : l.test(w) && (x = w, w == "r" && (d[C] = "R")); - } - for (var k = 1, L = d[0]; k < p - 1; ++k) { - var A = d[k]; - A == "+" && L == "1" && d[k + 1] == "1" ? d[k] = "1" : A == "," && L == d[k + 1] && (L == "1" || L == "n") && (d[k] = L), L = A; - } - for (var E = 0; E < p; ++E) { - var j = d[E]; - if (j == ",") d[E] = "N";else if (j == "%") { - var B = void 0; - for (B = E + 1; B < p && d[B] == "%"; ++B); - for (var pe = E && d[E - 1] == "!" || B < p && d[B] == "1" ? "1" : "N", fe = E; fe < B; ++fe) d[fe] = pe; - E = B - 1; - } - } - for (var _ = 0, he = c; _ < p; ++_) { - var $ = d[_]; - he == "L" && $ == "1" ? d[_] = "L" : l.test($) && (he = $); - } - for (var Y = 0; Y < p; ++Y) if (n.test(d[Y])) { - var X = void 0; - for (X = Y + 1; X < p && n.test(d[X]); ++X); - for (var z = (Y ? d[Y - 1] : c) == "L", ce = (X < p ? d[X] : c) == "L", zt = z == ce ? z ? "L" : "R" : c, $e = Y; $e < X; ++$e) d[$e] = zt; - Y = X - 1; - } - for (var re = [], We, V = 0; V < p;) if (o.test(d[V])) { - var kn = V; - for (++V; V < p && o.test(d[V]); ++V); - re.push(new s(0, kn, V)); - } else { - var Ge = V, - gt = re.length, - yt = h == "rtl" ? 1 : 0; - for (++V; V < p && d[V] != "L"; ++V); - for (var oe = Ge; oe < V;) if (a.test(d[oe])) { - Ge < oe && (re.splice(gt, 0, new s(1, Ge, oe)), gt += yt); - var Gt = oe; - for (++oe; oe < V && a.test(d[oe]); ++oe); - re.splice(gt, 0, new s(2, Gt, oe)), gt += yt, Ge = oe; - } else ++oe; - Ge < V && re.splice(gt, 0, new s(1, Ge, V)); - } - return h == "ltr" && (re[0].level == 1 && (We = f.match(/^\s+/)) && (re[0].from = We[0].length, re.unshift(new s(0, 0, We[0].length))), H(re).level == 1 && (We = f.match(/\s+$/)) && (H(re).to -= We[0].length, re.push(new s(0, p - We[0].length, p)))), h == "rtl" ? re.reverse() : re; - }; - }(); - function Pe(e, t) { - var i = e.order; - return i == null && (i = e.order = $o(e.text, t)), i; - } - u(Pe, "getOrder"); - var In = [], - M = u(function (e, t, i) { - if (e.addEventListener) e.addEventListener(t, i, !1);else if (e.attachEvent) e.attachEvent("on" + t, i);else { - var r = e._handlers || (e._handlers = {}); - r[t] = (r[t] || In).concat(i); - } - }, "on"); - function xi(e, t) { - return e._handlers && e._handlers[t] || In; - } - u(xi, "getHandlers"); - function ge(e, t, i) { - if (e.removeEventListener) e.removeEventListener(t, i, !1);else if (e.detachEvent) e.detachEvent("on" + t, i);else { - var r = e._handlers, - n = r && r[t]; - if (n) { - var l = ee(n, i); - l > -1 && (r[t] = n.slice(0, l).concat(n.slice(l + 1))); - } - } - } - u(ge, "off"); - function U(e, t) { - var i = xi(e, t); - if (i.length) for (var r = Array.prototype.slice.call(arguments, 2), n = 0; n < i.length; ++n) i[n].apply(null, r); - } - u(U, "signal"); - function q(e, t, i) { - return typeof t == "string" && (t = { - type: t, - preventDefault: function () { - this.defaultPrevented = !0; - } - }), U(e, i || t.type, e, t), Ci(t) || t.codemirrorIgnore; - } - u(q, "signalDOMEvent"); - function Rn(e) { - var t = e._handlers && e._handlers.cursorActivity; - if (t) for (var i = e.curOp.cursorActivityHandlers || (e.curOp.cursorActivityHandlers = []), r = 0; r < t.length; ++r) ee(i, t[r]) == -1 && i.push(t[r]); - } - u(Rn, "signalCursorActivity"); - function Ce(e, t) { - return xi(e, t).length > 0; - } - u(Ce, "hasHandler"); - function xt(e) { - e.prototype.on = function (t, i) { - M(this, t, i); - }, e.prototype.off = function (t, i) { - ge(this, t, i); - }; - } - u(xt, "eventMixin"); - function ae(e) { - e.preventDefault ? e.preventDefault() : e.returnValue = !1; - } - u(ae, "e_preventDefault"); - function Bn(e) { - e.stopPropagation ? e.stopPropagation() : e.cancelBubble = !0; +const pointFromVector = (origin, angle, distance) => { + angle = degreesToRadians(angle); + return { + x: distance * Math.cos(angle) + origin.x, + y: distance * Math.sin(angle) + origin.y + }; +}; +const toDecimal = (num, precision = 2) => { + precision = Math.pow(10, precision); + return Math.round(num * precision) / precision; +}; +const smoothFrame = (prevValue, nextValue, duration, smoothing = 0) => toDecimal(prevValue + duration * (nextValue - prevValue) / Math.max(smoothing, duration)); +const smooth = (strength = 50) => { + let previousValue = 0; + let lastUpdated = 0; + return v => { + const currentFramestamp = sync.getFrameData().timestamp; + const timeDelta = currentFramestamp !== lastUpdated ? currentFramestamp - lastUpdated : 0; + const newValue = timeDelta ? smoothFrame(previousValue, v, timeDelta, strength) : previousValue; + lastUpdated = currentFramestamp; + previousValue = newValue; + return newValue; + }; +}; +const snap = points => { + if (typeof points === 'number') { + return v => Math.round(v / points) * points; + } else { + let i = 0; + const numPoints = points.length; + return v => { + let lastDistance = Math.abs(points[0] - v); + for (i = 1; i < numPoints; i++) { + const point = points[i]; + const distance = Math.abs(point - v); + if (distance === 0) return point; + if (distance > lastDistance) return points[i - 1]; + if (i === numPoints - 1) return point; + lastDistance = distance; } - u(Bn, "e_stopPropagation"); - function Ci(e) { - return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == !1; + }; + } +}; +function velocityPerFrame(xps, frameDuration) { + return xps / (1000 / frameDuration); +} +const wrap = (min, max, v) => { + const rangeSize = max - min; + return ((v - min) % rangeSize + rangeSize) % rangeSize + min; +}; +const a = (a1, a2) => 1.0 - 3.0 * a2 + 3.0 * a1; +const b = (a1, a2) => 3.0 * a2 - 6.0 * a1; +const c = a1 => 3.0 * a1; +const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t; +const getSlope = (t, a1, a2) => 3.0 * a(a1, a2) * t * t + 2.0 * b(a1, a2) * t + c(a1); +const subdivisionPrecision = 0.0000001; +const subdivisionMaxIterations = 10; +function binarySubdivide(aX, aA, aB, mX1, mX2) { + let currentX; + let currentT; + let i = 0; + do { + currentT = aA + (aB - aA) / 2.0; + currentX = calcBezier(currentT, mX1, mX2) - aX; + if (currentX > 0.0) { + aB = currentT; + } else { + aA = currentT; + } + } while (Math.abs(currentX) > subdivisionPrecision && ++i < subdivisionMaxIterations); + return currentT; +} +const newtonIterations = 8; +const newtonMinSlope = 0.001; +function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) { + for (let i = 0; i < newtonIterations; ++i) { + const currentSlope = getSlope(aGuessT, mX1, mX2); + if (currentSlope === 0.0) { + return aGuessT; + } + const currentX = calcBezier(aGuessT, mX1, mX2) - aX; + aGuessT -= currentX / currentSlope; + } + return aGuessT; +} +const kSplineTableSize = 11; +const kSampleStepSize = 1.0 / (kSplineTableSize - 1.0); +function cubicBezier(mX1, mY1, mX2, mY2) { + if (mX1 === mY1 && mX2 === mY2) return linear; + const sampleValues = new Float32Array(kSplineTableSize); + for (let i = 0; i < kSplineTableSize; ++i) { + sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2); + } + function getTForX(aX) { + let intervalStart = 0.0; + let currentSample = 1; + const lastSample = kSplineTableSize - 1; + for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) { + intervalStart += kSampleStepSize; + } + --currentSample; + const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]); + const guessForT = intervalStart + dist * kSampleStepSize; + const initialSlope = getSlope(guessForT, mX1, mX2); + if (initialSlope >= newtonMinSlope) { + return newtonRaphsonIterate(aX, guessForT, mX1, mX2); + } else if (initialSlope === 0.0) { + return guessForT; + } else { + return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2); + } + } + return t => t === 0 || t === 1 ? t : calcBezier(getTForX(t), mY1, mY2); +} +const steps = (steps, direction = 'end') => progress => { + progress = direction === 'end' ? Math.min(progress, 0.999) : Math.max(progress, 0.001); + const expanded = progress * steps; + const rounded = direction === 'end' ? Math.floor(expanded) : Math.ceil(expanded); + return clamp(0, 1, rounded / steps); +}; +exports.angle = angle; +exports.animate = animate; +exports.anticipate = anticipate; +exports.applyOffset = applyOffset; +exports.attract = attract; +exports.attractExpo = attractExpo; +exports.backIn = backIn; +exports.backInOut = backInOut; +exports.backOut = backOut; +exports.bounceIn = bounceIn; +exports.bounceInOut = bounceInOut; +exports.bounceOut = bounceOut; +exports.circIn = circIn; +exports.circInOut = circInOut; +exports.circOut = circOut; +exports.clamp = clamp; +exports.createAnticipate = createAnticipate; +exports.createAttractor = createAttractor; +exports.createBackIn = createBackIn; +exports.createExpoIn = createExpoIn; +exports.cubicBezier = cubicBezier; +exports.decay = decay; +exports.degreesToRadians = degreesToRadians; +exports.distance = distance; +exports.easeIn = easeIn; +exports.easeInOut = easeInOut; +exports.easeOut = easeOut; +exports.inertia = inertia; +exports.interpolate = interpolate; +exports.isPoint = isPoint; +exports.isPoint3D = isPoint3D; +exports.keyframes = keyframes; +exports.linear = linear; +exports.mirrorEasing = mirrorEasing; +exports.mix = mix; +exports.mixColor = mixColor; +exports.mixComplex = mixComplex; +exports.pipe = pipe; +exports.pointFromVector = pointFromVector; +exports.progress = progress; +exports.radiansToDegrees = radiansToDegrees; +exports.reverseEasing = reverseEasing; +exports.smooth = smooth; +exports.smoothFrame = smoothFrame; +exports.snap = snap; +exports.spring = spring; +exports.steps = steps; +exports.toDecimal = toDecimal; +exports.velocityPerFrame = velocityPerFrame; +exports.velocityPerSecond = velocityPerSecond; +exports.wrap = wrap; + +/***/ }), + +/***/ "../../../node_modules/punycode.js/punycode.es6.js": +/*!*********************************************************!*\ + !*** ../../../node_modules/punycode.js/punycode.es6.js ***! + \*********************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + + +/** Highest positive signed 32-bit float value */ +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.toUnicode = exports.toASCII = exports.encode = exports["default"] = exports.decode = void 0; +exports.ucs2decode = ucs2decode; +exports.ucs2encode = void 0; +const maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + +/** Bootstring parameters */ +const base = 36; +const tMin = 1; +const tMax = 26; +const skew = 38; +const damp = 700; +const initialBias = 72; +const initialN = 128; // 0x80 +const delimiter = '-'; // '\x2D' + +/** Regular expressions */ +const regexPunycode = /^xn--/; +const regexNonASCII = /[^\0-\x7F]/; // Note: U+007F DEL is excluded too. +const regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + +/** Error messages */ +const errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' +}; + +/** Convenience shortcuts */ +const baseMinusTMin = base - tMin; +const floor = Math.floor; +const stringFromCharCode = String.fromCharCode; + +/*--------------------------------------------------------------------------*/ + +/** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ +function error(type) { + throw new RangeError(errors[type]); +} + +/** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ +function map(array, callback) { + const result = []; + let length = array.length; + while (length--) { + result[length] = callback(array[length]); + } + return result; +} + +/** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {String} A new string of characters returned by the callback + * function. + */ +function mapDomain(domain, callback) { + const parts = domain.split('@'); + let result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + domain = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + domain = domain.replace(regexSeparators, '\x2E'); + const labels = domain.split('.'); + const encoded = map(labels, callback).join('.'); + return result + encoded; +} + +/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ +function ucs2decode(string) { + const output = []; + let counter = 0; + const length = string.length; + while (counter < length) { + const value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // It's a high surrogate, and there is a next character. + const extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { + // Low surrogate. + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // It's an unmatched surrogate; only append this code unit, in case the + // next code unit is the high surrogate of a surrogate pair. + output.push(value); + counter--; } - u(Ci, "e_defaultPrevented"); - function Qt(e) { - ae(e), Bn(e); + } else { + output.push(value); + } + } + return output; +} + +/** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ +const ucs2encode = codePoints => String.fromCodePoint(...codePoints); + +/** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ +exports.ucs2encode = ucs2encode; +const basicToDigit = function (codePoint) { + if (codePoint >= 0x30 && codePoint < 0x3A) { + return 26 + (codePoint - 0x30); + } + if (codePoint >= 0x41 && codePoint < 0x5B) { + return codePoint - 0x41; + } + if (codePoint >= 0x61 && codePoint < 0x7B) { + return codePoint - 0x61; + } + return base; +}; + +/** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ +const digitToBasic = function (digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); +}; + +/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ +const adapt = function (delta, numPoints, firstTime) { + let k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for /* no initialization */ + (; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); +}; + +/** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ +const decode = function (input) { + // Don't use UCS-2. + const output = []; + const inputLength = input.length; + let i = 0; + let n = initialN; + let bias = initialBias; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + let basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + for (let j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for /* no final expression */ + (let index = basic > 0 ? basic + 1 : 0; index < inputLength;) { + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + const oldi = i; + for /* no condition */ + (let w = 1, k = base;; k += base) { + if (index >= inputLength) { + error('invalid-input'); } - u(Qt, "e_stop"); - function wi(e) { - return e.target || e.srcElement; + const digit = basicToDigit(input.charCodeAt(index++)); + if (digit >= base) { + error('invalid-input'); } - u(wi, "e_target"); - function zn(e) { - var t = e.which; - return t == null && (e.button & 1 ? t = 1 : e.button & 2 ? t = 3 : e.button & 4 && (t = 2)), me && e.ctrlKey && t == 1 && (t = 3), t; - } - u(zn, "e_button"); - var ea = function () { - if (O && I < 9) return !1; - var e = T("div"); - return "draggable" in e || "dragDrop" in e; - }(), - Si; - function ta(e) { - if (Si == null) { - var t = T("span", "​"); - ve(e, T("span", [t, document.createTextNode("x")])), e.firstChild.offsetHeight != 0 && (Si = t.offsetWidth <= 1 && t.offsetHeight > 2 && !(O && I < 8)); - } - var i = Si ? T("span", "​") : T("span", " ", null, "display: inline-block; width: 1px; margin-right: -1px"); - return i.setAttribute("cm-text", ""), i; - } - u(ta, "zeroWidthElement"); - var Li; - function ra(e) { - if (Li != null) return Li; - var t = ve(e, document.createTextNode("AخA")), - i = rt(t, 0, 1).getBoundingClientRect(), - r = rt(t, 1, 2).getBoundingClientRect(); - return Ue(e), !i || i.left == i.right ? !1 : Li = r.right - i.right < 3; - } - u(ra, "hasBadBidiRects"); - var ki = ` - -b`.split(/\n/).length != 3 ? function (e) { - for (var t = 0, i = [], r = e.length; t <= r;) { - var n = e.indexOf(` -`, t); - n == -1 && (n = e.length); - var l = e.slice(t, e.charAt(n - 1) == "\r" ? n - 1 : n), - o = l.indexOf("\r"); - o != -1 ? (i.push(l.slice(0, o)), t += o + 1) : (i.push(l), t = n + 1); - } - return i; - } : function (e) { - return e.split(/\r\n?|\n/); - }, - ia = window.getSelection ? function (e) { - try { - return e.selectionStart != e.selectionEnd; - } catch { - return !1; - } - } : function (e) { - var t; - try { - t = e.ownerDocument.selection.createRange(); - } catch {} - return !t || t.parentElement() != e ? !1 : t.compareEndPoints("StartToEnd", t) != 0; - }, - na = function () { - var e = T("div"); - return "oncopy" in e ? !0 : (e.setAttribute("oncopy", "return;"), typeof e.oncopy == "function"); - }(), - Ti = null; - function la(e) { - if (Ti != null) return Ti; - var t = ve(e, T("span", "x")), - i = t.getBoundingClientRect(), - r = rt(t, 0, 1).getBoundingClientRect(); - return Ti = Math.abs(i.left - r.left) > 1; - } - u(la, "hasBadZoomedRects"); - var Mi = {}, - Ct = {}; - function oa(e, t) { - arguments.length > 2 && (t.dependencies = Array.prototype.slice.call(arguments, 2)), Mi[e] = t; - } - u(oa, "defineMode"); - function aa(e, t) { - Ct[e] = t; - } - u(aa, "defineMIME"); - function Hr(e) { - if (typeof e == "string" && Ct.hasOwnProperty(e)) e = Ct[e];else if (e && typeof e.name == "string" && Ct.hasOwnProperty(e.name)) { - var t = Ct[e.name]; - typeof t == "string" && (t = { - name: t - }), e = Fn(t, e), e.name = t.name; - } else { - if (typeof e == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(e)) return Hr("application/xml"); - if (typeof e == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(e)) return Hr("application/json"); - } - return typeof e == "string" ? { - name: e - } : e || { - name: "null" - }; + if (digit > floor((maxInt - i) / w)) { + error('overflow'); } - u(Hr, "resolveMode"); - function Di(e, t) { - t = Hr(t); - var i = Mi[t.name]; - if (!i) return Di(e, "text/plain"); - var r = i(e, t); - if (wt.hasOwnProperty(t.name)) { - var n = wt[t.name]; - for (var l in n) n.hasOwnProperty(l) && (r.hasOwnProperty(l) && (r["_" + l] = r[l]), r[l] = n[l]); - } - if (r.name = t.name, t.helperType && (r.helperType = t.helperType), t.modeProps) for (var o in t.modeProps) r[o] = t.modeProps[o]; - return r; + i += digit * w; + const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + if (digit < t) { + break; } - u(Di, "getMode"); - var wt = {}; - function sa(e, t) { - var i = wt.hasOwnProperty(e) ? wt[e] : wt[e] = {}; - nt(t, i); - } - u(sa, "extendMode"); - function lt(e, t) { - if (t === !0) return t; - if (e.copyState) return e.copyState(t); - var i = {}; - for (var r in t) { - var n = t[r]; - n instanceof Array && (n = n.concat([])), i[r] = n; - } - return i; - } - u(lt, "copyState"); - function Ni(e, t) { - for (var i; e.innerMode && (i = e.innerMode(t), !(!i || i.mode == e));) t = i.state, e = i.mode; - return i || { - mode: e, - state: t - }; + const baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); } - u(Ni, "innerMode"); - function Gn(e, t, i) { - return e.startState ? e.startState(t, i) : !0; + w *= baseMinusT; + } + const out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output. + output.splice(i++, 0, n); + } + return String.fromCodePoint(...output); +}; + +/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ +exports.decode = decode; +const encode = function (input) { + const output = []; + + // Convert the input in UCS-2 to an array of Unicode code points. + input = ucs2decode(input); + + // Cache the length. + const inputLength = input.length; + + // Initialize the state. + let n = initialN; + let delta = 0; + let bias = initialBias; + + // Handle the basic code points. + for (const currentValue of input) { + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + const basicLength = output.length; + let handledCPCount = basicLength; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string with a delimiter unless it's empty. + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + // All non-basic code points < n have been handled already. Find the next + // larger one: + let m = maxInt; + for (const currentValue of input) { + if (currentValue >= n && currentValue < m) { + m = currentValue; } - u(Gn, "startState"); - var K = u(function (e, t, i) { - this.pos = this.start = 0, this.string = e, this.tabSize = t || 8, this.lastColumnPos = this.lastColumnValue = 0, this.lineStart = 0, this.lineOracle = i; - }, "StringStream"); - K.prototype.eol = function () { - return this.pos >= this.string.length; - }, K.prototype.sol = function () { - return this.pos == this.lineStart; - }, K.prototype.peek = function () { - return this.string.charAt(this.pos) || void 0; - }, K.prototype.next = function () { - if (this.pos < this.string.length) return this.string.charAt(this.pos++); - }, K.prototype.eat = function (e) { - var t = this.string.charAt(this.pos), - i; - if (typeof e == "string" ? i = t == e : i = t && (e.test ? e.test(t) : e(t)), i) return ++this.pos, t; - }, K.prototype.eatWhile = function (e) { - for (var t = this.pos; this.eat(e);); - return this.pos > t; - }, K.prototype.eatSpace = function () { - for (var e = this.pos; /[\s\u00a0]/.test(this.string.charAt(this.pos));) ++this.pos; - return this.pos > e; - }, K.prototype.skipToEnd = function () { - this.pos = this.string.length; - }, K.prototype.skipTo = function (e) { - var t = this.string.indexOf(e, this.pos); - if (t > -1) return this.pos = t, !0; - }, K.prototype.backUp = function (e) { - this.pos -= e; - }, K.prototype.column = function () { - return this.lastColumnPos < this.start && (this.lastColumnValue = xe(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue), this.lastColumnPos = this.start), this.lastColumnValue - (this.lineStart ? xe(this.string, this.lineStart, this.tabSize) : 0); - }, K.prototype.indentation = function () { - return xe(this.string, null, this.tabSize) - (this.lineStart ? xe(this.string, this.lineStart, this.tabSize) : 0); - }, K.prototype.match = function (e, t, i) { - if (typeof e == "string") { - var r = u(function (o) { - return i ? o.toLowerCase() : o; - }, "cased"), - n = this.string.substr(this.pos, e.length); - if (r(n) == r(e)) return t !== !1 && (this.pos += e.length), !0; - } else { - var l = this.string.slice(this.pos).match(e); - return l && l.index > 0 ? null : (l && t !== !1 && (this.pos += l[0].length), l); - } - }, K.prototype.current = function () { - return this.string.slice(this.start, this.pos); - }, K.prototype.hideFirstChars = function (e, t) { - this.lineStart += e; - try { - return t(); - } finally { - this.lineStart -= e; - } - }, K.prototype.lookAhead = function (e) { - var t = this.lineOracle; - return t && t.lookAhead(e); - }, K.prototype.baseToken = function () { - var e = this.lineOracle; - return e && e.baseToken(this.pos); - }; - function S(e, t) { - if (t -= e.first, t < 0 || t >= e.size) throw new Error("There is no line " + (t + e.first) + " in the document."); - for (var i = e; !i.lines;) for (var r = 0;; ++r) { - var n = i.children[r], - l = n.chunkSize(); - if (t < l) { - i = n; - break; - } - t -= l; - } - return i.lines[t]; - } - u(S, "getLine"); - function ot(e, t, i) { - var r = [], - n = t.line; - return e.iter(t.line, i.line + 1, function (l) { - var o = l.text; - n == i.line && (o = o.slice(0, i.ch)), n == t.line && (o = o.slice(t.ch)), r.push(o), ++n; - }), r; - } - u(ot, "getBetween"); - function Ai(e, t, i) { - var r = []; - return e.iter(t, i, function (n) { - r.push(n.text); - }), r; - } - u(Ai, "getLines"); - function De(e, t) { - var i = t - e.height; - if (i) for (var r = e; r; r = r.parent) r.height += i; - } - u(De, "updateLineHeight"); - function F(e) { - if (e.parent == null) return null; - for (var t = e.parent, i = ee(t.lines, e), r = t.parent; r; t = r, r = r.parent) for (var n = 0; r.children[n] != t; ++n) i += r.children[n].chunkSize(); - return i + t.first; - } - u(F, "lineNo"); - function at(e, t) { - var i = e.first; - e: do { - for (var r = 0; r < e.children.length; ++r) { - var n = e.children[r], - l = n.height; - if (t < l) { - e = n; - continue e; - } - t -= l, i += n.chunkSize(); - } - return i; - } while (!e.lines); - for (var o = 0; o < e.lines.length; ++o) { - var a = e.lines[o], - s = a.height; - if (t < s) break; - t -= s; - } - return i + o; - } - u(at, "lineAtHeight"); - function Jt(e, t) { - return t >= e.first && t < e.first + e.size; - } - u(Jt, "isLine"); - function Oi(e, t) { - return String(e.lineNumberFormatter(t + e.firstLineNumber)); - } - u(Oi, "lineNumberFor"); - function y(e, t, i) { - if (i === void 0 && (i = null), !(this instanceof y)) return new y(e, t, i); - this.line = e, this.ch = t, this.sticky = i; - } - u(y, "Pos"); - function D(e, t) { - return e.line - t.line || e.ch - t.ch; - } - u(D, "cmp"); - function Wi(e, t) { - return e.sticky == t.sticky && D(e, t) == 0; - } - u(Wi, "equalCursorPos"); - function Hi(e) { - return y(e.line, e.ch); - } - u(Hi, "copyPos"); - function Fr(e, t) { - return D(e, t) < 0 ? t : e; - } - u(Fr, "maxPos"); - function Pr(e, t) { - return D(e, t) < 0 ? e : t; - } - u(Pr, "minPos"); - function Un(e, t) { - return Math.max(e.first, Math.min(t, e.first + e.size - 1)); - } - u(Un, "clipLine"); - function N(e, t) { - if (t.line < e.first) return y(e.first, 0); - var i = e.first + e.size - 1; - return t.line > i ? y(i, S(e, i).text.length) : ua(t, S(e, t.line).text.length); - } - u(N, "clipPos"); - function ua(e, t) { - var i = e.ch; - return i == null || i > t ? y(e.line, t) : i < 0 ? y(e.line, 0) : e; - } - u(ua, "clipToLen"); - function Kn(e, t) { - for (var i = [], r = 0; r < t.length; r++) i[r] = N(e, t[r]); - return i; - } - u(Kn, "clipPosArray"); - var Er = u(function (e, t) { - this.state = e, this.lookAhead = t; - }, "SavedContext"), - Ne = u(function (e, t, i, r) { - this.state = t, this.doc = e, this.line = i, this.maxLookAhead = r || 0, this.baseTokens = null, this.baseTokenPos = 1; - }, "Context"); - Ne.prototype.lookAhead = function (e) { - var t = this.doc.getLine(this.line + e); - return t != null && e > this.maxLookAhead && (this.maxLookAhead = e), t; - }, Ne.prototype.baseToken = function (e) { - if (!this.baseTokens) return null; - for (; this.baseTokens[this.baseTokenPos] <= e;) this.baseTokenPos += 2; - var t = this.baseTokens[this.baseTokenPos + 1]; - return { - type: t && t.replace(/( |^)overlay .*/, ""), - size: this.baseTokens[this.baseTokenPos] - e - }; - }, Ne.prototype.nextLine = function () { - this.line++, this.maxLookAhead > 0 && this.maxLookAhead--; - }, Ne.fromSaved = function (e, t, i) { - return t instanceof Er ? new Ne(e, lt(e.mode, t.state), i, t.lookAhead) : new Ne(e, lt(e.mode, t), i); - }, Ne.prototype.save = function (e) { - var t = e !== !1 ? lt(this.doc.mode, this.state) : this.state; - return this.maxLookAhead > 0 ? new Er(t, this.maxLookAhead) : t; - }; - function _n(e, t, i, r) { - var n = [e.state.modeGen], - l = {}; - Jn(e, t.text, e.doc.mode, i, function (f, h) { - return n.push(f, h); - }, l, r); - for (var o = i.state, a = u(function (f) { - i.baseTokens = n; - var h = e.state.overlays[f], - c = 1, - p = 0; - i.state = !0, Jn(e, t.text, h.mode, i, function (d, v) { - for (var g = c; p < d;) { - var m = n[c]; - m > d && n.splice(c, 1, d, n[c + 1], m), c += 2, p = Math.min(d, m); - } - if (v) if (h.opaque) n.splice(g, c - g, d, "overlay " + v), c = g + 2;else for (; g < c; g += 2) { - var b = n[g + 1]; - n[g + 1] = (b ? b + " " : "") + "overlay " + v; - } - }, l), i.state = o, i.baseTokens = null, i.baseTokenPos = 1; - }, "loop"), s = 0; s < e.state.overlays.length; ++s) a(s); - return { - styles: n, - classes: l.bgClass || l.textClass ? l : null - }; - } - u(_n, "highlightLine"); - function Xn(e, t, i) { - if (!t.styles || t.styles[0] != e.state.modeGen) { - var r = jt(e, F(t)), - n = t.text.length > e.options.maxHighlightLength && lt(e.doc.mode, r.state), - l = _n(e, t, r); - n && (r.state = n), t.stateAfter = r.save(!n), t.styles = l.styles, l.classes ? t.styleClasses = l.classes : t.styleClasses && (t.styleClasses = null), i === e.doc.highlightFrontier && (e.doc.modeFrontier = Math.max(e.doc.modeFrontier, ++e.doc.highlightFrontier)); - } - return t.styles; - } - u(Xn, "getLineStyles"); - function jt(e, t, i) { - var r = e.doc, - n = e.display; - if (!r.mode.startState) return new Ne(r, !0, t); - var l = fa(e, t, i), - o = l > r.first && S(r, l - 1).stateAfter, - a = o ? Ne.fromSaved(r, o, l) : new Ne(r, Gn(r.mode), l); - return r.iter(l, t, function (s) { - Fi(e, s.text, a); - var f = a.line; - s.stateAfter = f == t - 1 || f % 5 == 0 || f >= n.viewFrom && f < n.viewTo ? a.save() : null, a.nextLine(); - }), i && (r.modeFrontier = a.line), a; - } - u(jt, "getContextBefore"); - function Fi(e, t, i, r) { - var n = e.doc.mode, - l = new K(t, e.options.tabSize, i); - for (l.start = l.pos = r || 0, t == "" && Yn(n, i.state); !l.eol();) Pi(n, l, i.state), l.start = l.pos; - } - u(Fi, "processLine"); - function Yn(e, t) { - if (e.blankLine) return e.blankLine(t); - if (e.innerMode) { - var i = Ni(e, t); - if (i.mode.blankLine) return i.mode.blankLine(i.state); - } - } - u(Yn, "callBlankLine"); - function Pi(e, t, i, r) { - for (var n = 0; n < 10; n++) { - r && (r[0] = Ni(e, i).mode); - var l = e.token(t, i); - if (t.pos > t.start) return l; - } - throw new Error("Mode " + e.name + " failed to advance stream."); - } - u(Pi, "readToken"); - var qn = u(function (e, t, i) { - this.start = e.start, this.end = e.pos, this.string = e.current(), this.type = t || null, this.state = i; - }, "Token"); - function Zn(e, t, i, r) { - var n = e.doc, - l = n.mode, - o; - t = N(n, t); - var a = S(n, t.line), - s = jt(e, t.line, i), - f = new K(a.text, e.options.tabSize, s), - h; - for (r && (h = []); (r || f.pos < t.ch) && !f.eol();) f.start = f.pos, o = Pi(l, f, s.state), r && h.push(new qn(f, o, lt(n.mode, s.state))); - return r ? h : new qn(f, o, s.state); - } - u(Zn, "takeToken"); - function Qn(e, t) { - if (e) for (;;) { - var i = e.match(/(?:^|\s+)line-(background-)?(\S+)/); - if (!i) break; - e = e.slice(0, i.index) + e.slice(i.index + i[0].length); - var r = i[1] ? "bgClass" : "textClass"; - t[r] == null ? t[r] = i[2] : new RegExp("(?:^|\\s)" + i[2] + "(?:$|\\s)").test(t[r]) || (t[r] += " " + i[2]); - } - return e; - } - u(Qn, "extractLineClasses"); - function Jn(e, t, i, r, n, l, o) { - var a = i.flattenSpans; - a == null && (a = e.options.flattenSpans); - var s = 0, - f = null, - h = new K(t, e.options.tabSize, r), - c, - p = e.options.addModeClass && [null]; - for (t == "" && Qn(Yn(i, r.state), l); !h.eol();) { - if (h.pos > e.options.maxHighlightLength ? (a = !1, o && Fi(e, t, r, h.pos), h.pos = t.length, c = null) : c = Qn(Pi(i, h, r.state, p), l), p) { - var d = p[0].name; - d && (c = "m-" + (c ? d + " " + c : d)); - } - if (!a || f != c) { - for (; s < h.start;) s = Math.min(h.start, s + 5e3), n(s, f); - f = c; - } - h.start = h.pos; - } - for (; s < h.pos;) { - var v = Math.min(h.pos, s + 5e3); - n(v, f), s = v; - } - } - u(Jn, "runMode"); - function fa(e, t, i) { - for (var r, n, l = e.doc, o = i ? -1 : t - (e.doc.mode.innerMode ? 1e3 : 100), a = t; a > o; --a) { - if (a <= l.first) return l.first; - var s = S(l, a - 1), - f = s.stateAfter; - if (f && (!i || a + (f instanceof Er ? f.lookAhead : 0) <= l.modeFrontier)) return a; - var h = xe(s.text, null, e.options.tabSize); - (n == null || r > h) && (n = a - 1, r = h); - } - return n; - } - u(fa, "findStartLine"); - function ha(e, t) { - if (e.modeFrontier = Math.min(e.modeFrontier, t), !(e.highlightFrontier < t - 10)) { - for (var i = e.first, r = t - 1; r > i; r--) { - var n = S(e, r).stateAfter; - if (n && (!(n instanceof Er) || r + n.lookAhead < t)) { - i = r + 1; - break; - } - } - e.highlightFrontier = Math.min(e.highlightFrontier, i); - } - } - u(ha, "retreatFrontier"); - var jn = !1, - Ee = !1; - function ca() { - jn = !0; - } - u(ca, "seeReadOnlySpans"); - function da() { - Ee = !0; - } - u(da, "seeCollapsedSpans"); - function Ir(e, t, i) { - this.marker = e, this.from = t, this.to = i; - } - u(Ir, "MarkedSpan"); - function Vt(e, t) { - if (e) for (var i = 0; i < e.length; ++i) { - var r = e[i]; - if (r.marker == t) return r; - } - } - u(Vt, "getMarkedSpanFor"); - function pa(e, t) { - for (var i, r = 0; r < e.length; ++r) e[r] != t && (i || (i = [])).push(e[r]); - return i; - } - u(pa, "removeMarkedSpan"); - function va(e, t, i) { - var r = i && window.WeakSet && (i.markedSpans || (i.markedSpans = new WeakSet())); - r && e.markedSpans && r.has(e.markedSpans) ? e.markedSpans.push(t) : (e.markedSpans = e.markedSpans ? e.markedSpans.concat([t]) : [t], r && r.add(e.markedSpans)), t.marker.attachLine(e); - } - u(va, "addMarkedSpan"); - function ga(e, t, i) { - var r; - if (e) for (var n = 0; n < e.length; ++n) { - var l = e[n], - o = l.marker, - a = l.from == null || (o.inclusiveLeft ? l.from <= t : l.from < t); - if (a || l.from == t && o.type == "bookmark" && (!i || !l.marker.insertLeft)) { - var s = l.to == null || (o.inclusiveRight ? l.to >= t : l.to > t); - (r || (r = [])).push(new Ir(o, l.from, s ? null : l.to)); - } - } - return r; - } - u(ga, "markedSpansBefore"); - function ya(e, t, i) { - var r; - if (e) for (var n = 0; n < e.length; ++n) { - var l = e[n], - o = l.marker, - a = l.to == null || (o.inclusiveRight ? l.to >= t : l.to > t); - if (a || l.from == t && o.type == "bookmark" && (!i || l.marker.insertLeft)) { - var s = l.from == null || (o.inclusiveLeft ? l.from <= t : l.from < t); - (r || (r = [])).push(new Ir(o, s ? null : l.from - t, l.to == null ? null : l.to - t)); - } - } - return r; - } - u(ya, "markedSpansAfter"); - function Ei(e, t) { - if (t.full) return null; - var i = Jt(e, t.from.line) && S(e, t.from.line).markedSpans, - r = Jt(e, t.to.line) && S(e, t.to.line).markedSpans; - if (!i && !r) return null; - var n = t.from.ch, - l = t.to.ch, - o = D(t.from, t.to) == 0, - a = ga(i, n, o), - s = ya(r, l, o), - f = t.text.length == 1, - h = H(t.text).length + (f ? n : 0); - if (a) for (var c = 0; c < a.length; ++c) { - var p = a[c]; - if (p.to == null) { - var d = Vt(s, p.marker); - d ? f && (p.to = d.to == null ? null : d.to + h) : p.to = n; - } - } - if (s) for (var v = 0; v < s.length; ++v) { - var g = s[v]; - if (g.to != null && (g.to += h), g.from == null) { - var m = Vt(a, g.marker); - m || (g.from = h, f && (a || (a = [])).push(g)); - } else g.from += h, f && (a || (a = [])).push(g); - } - a && (a = Vn(a)), s && s != a && (s = Vn(s)); - var b = [a]; - if (!f) { - var C = t.text.length - 2, - x; - if (C > 0 && a) for (var w = 0; w < a.length; ++w) a[w].to == null && (x || (x = [])).push(new Ir(a[w].marker, null, null)); - for (var k = 0; k < C; ++k) b.push(x); - b.push(s); - } - return b; - } - u(Ei, "stretchSpansOverChange"); - function Vn(e) { - for (var t = 0; t < e.length; ++t) { - var i = e[t]; - i.from != null && i.from == i.to && i.marker.clearWhenEmpty !== !1 && e.splice(t--, 1); - } - return e.length ? e : null; - } - u(Vn, "clearEmptySpans"); - function ma(e, t, i) { - var r = null; - if (e.iter(t.line, i.line + 1, function (d) { - if (d.markedSpans) for (var v = 0; v < d.markedSpans.length; ++v) { - var g = d.markedSpans[v].marker; - g.readOnly && (!r || ee(r, g) == -1) && (r || (r = [])).push(g); - } - }), !r) return null; - for (var n = [{ - from: t, - to: i - }], l = 0; l < r.length; ++l) for (var o = r[l], a = o.find(0), s = 0; s < n.length; ++s) { - var f = n[s]; - if (!(D(f.to, a.from) < 0 || D(f.from, a.to) > 0)) { - var h = [s, 1], - c = D(f.from, a.from), - p = D(f.to, a.to); - (c < 0 || !o.inclusiveLeft && !c) && h.push({ - from: f.from, - to: a.from - }), (p > 0 || !o.inclusiveRight && !p) && h.push({ - from: a.to, - to: f.to - }), n.splice.apply(n, h), s += h.length - 3; - } - } - return n; - } - u(ma, "removeReadOnlyRanges"); - function $n(e) { - var t = e.markedSpans; - if (t) { - for (var i = 0; i < t.length; ++i) t[i].marker.detachLine(e); - e.markedSpans = null; - } - } - u($n, "detachMarkedSpans"); - function el(e, t) { - if (t) { - for (var i = 0; i < t.length; ++i) t[i].marker.attachLine(e); - e.markedSpans = t; - } - } - u(el, "attachMarkedSpans"); - function Rr(e) { - return e.inclusiveLeft ? -1 : 0; - } - u(Rr, "extraLeft"); - function Br(e) { - return e.inclusiveRight ? 1 : 0; - } - u(Br, "extraRight"); - function Ii(e, t) { - var i = e.lines.length - t.lines.length; - if (i != 0) return i; - var r = e.find(), - n = t.find(), - l = D(r.from, n.from) || Rr(e) - Rr(t); - if (l) return -l; - var o = D(r.to, n.to) || Br(e) - Br(t); - return o || t.id - e.id; - } - u(Ii, "compareCollapsedMarkers"); - function tl(e, t) { - var i = Ee && e.markedSpans, - r; - if (i) for (var n = void 0, l = 0; l < i.length; ++l) n = i[l], n.marker.collapsed && (t ? n.from : n.to) == null && (!r || Ii(r, n.marker) < 0) && (r = n.marker); - return r; - } - u(tl, "collapsedSpanAtSide"); - function rl(e) { - return tl(e, !0); - } - u(rl, "collapsedSpanAtStart"); - function zr(e) { - return tl(e, !1); - } - u(zr, "collapsedSpanAtEnd"); - function ba(e, t) { - var i = Ee && e.markedSpans, - r; - if (i) for (var n = 0; n < i.length; ++n) { - var l = i[n]; - l.marker.collapsed && (l.from == null || l.from < t) && (l.to == null || l.to > t) && (!r || Ii(r, l.marker) < 0) && (r = l.marker); - } - return r; + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow. + const handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + delta += (m - n) * handledCPCountPlusOne; + n = m; + for (const currentValue of input) { + if (currentValue < n && ++delta > maxInt) { + error('overflow'); } - u(ba, "collapsedSpanAround"); - function il(e, t, i, r, n) { - var l = S(e, t), - o = Ee && l.markedSpans; - if (o) for (var a = 0; a < o.length; ++a) { - var s = o[a]; - if (s.marker.collapsed) { - var f = s.marker.find(0), - h = D(f.from, i) || Rr(s.marker) - Rr(n), - c = D(f.to, r) || Br(s.marker) - Br(n); - if (!(h >= 0 && c <= 0 || h <= 0 && c >= 0) && (h <= 0 && (s.marker.inclusiveRight && n.inclusiveLeft ? D(f.to, i) >= 0 : D(f.to, i) > 0) || h >= 0 && (s.marker.inclusiveRight && n.inclusiveLeft ? D(f.from, r) <= 0 : D(f.from, r) < 0))) return !0; + if (currentValue === n) { + // Represent delta as a generalized variable-length integer. + let q = delta; + for /* no condition */ + (let k = base;; k += base) { + const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + if (q < t) { + break; } + const qMinusT = q - t; + const baseMinusT = base - t; + output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))); + q = floor(qMinusT / baseMinusT); } + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength); + delta = 0; + ++handledCPCount; } - u(il, "conflictingCollapsedRange"); - function Se(e) { - for (var t; t = rl(e);) e = t.find(-1, !0).line; - return e; - } - u(Se, "visualLine"); - function xa(e) { - for (var t; t = zr(e);) e = t.find(1, !0).line; - return e; - } - u(xa, "visualLineEnd"); - function Ca(e) { - for (var t, i; t = zr(e);) e = t.find(1, !0).line, (i || (i = [])).push(e); - return i; - } - u(Ca, "visualLineContinued"); - function Ri(e, t) { - var i = S(e, t), - r = Se(i); - return i == r ? t : F(r); - } - u(Ri, "visualLineNo"); - function nl(e, t) { - if (t > e.lastLine()) return t; - var i = S(e, t), - r; - if (!Xe(e, i)) return t; - for (; r = zr(i);) i = r.find(1, !0).line; - return F(i) + 1; - } - u(nl, "visualLineEndNo"); - function Xe(e, t) { - var i = Ee && t.markedSpans; - if (i) { - for (var r = void 0, n = 0; n < i.length; ++n) if (r = i[n], !!r.marker.collapsed) { - if (r.from == null) return !0; - if (!r.marker.widgetNode && r.from == 0 && r.marker.inclusiveLeft && Bi(e, t, r)) return !0; - } - } - } - u(Xe, "lineIsHidden"); - function Bi(e, t, i) { - if (i.to == null) { - var r = i.marker.find(1, !0); - return Bi(e, r.line, Vt(r.line.markedSpans, i.marker)); - } - if (i.marker.inclusiveRight && i.to == t.text.length) return !0; - for (var n = void 0, l = 0; l < t.markedSpans.length; ++l) if (n = t.markedSpans[l], n.marker.collapsed && !n.marker.widgetNode && n.from == i.to && (n.to == null || n.to != i.from) && (n.marker.inclusiveLeft || i.marker.inclusiveRight) && Bi(e, t, n)) return !0; - } - u(Bi, "lineIsHiddenInner"); - function Ie(e) { - e = Se(e); - for (var t = 0, i = e.parent, r = 0; r < i.lines.length; ++r) { - var n = i.lines[r]; - if (n == e) break; - t += n.height; - } - for (var l = i.parent; l; i = l, l = i.parent) for (var o = 0; o < l.children.length; ++o) { - var a = l.children[o]; - if (a == i) break; - t += a.height; - } - return t; - } - u(Ie, "heightAtLine"); - function Gr(e) { - if (e.height == 0) return 0; - for (var t = e.text.length, i, r = e; i = rl(r);) { - var n = i.find(0, !0); - r = n.from.line, t += n.from.ch - n.to.ch; - } - for (r = e; i = zr(r);) { - var l = i.find(0, !0); - t -= r.text.length - l.from.ch, r = l.to.line, t += r.text.length - l.to.ch; - } - return t; - } - u(Gr, "lineLength"); - function zi(e) { - var t = e.display, - i = e.doc; - t.maxLine = S(i, i.first), t.maxLineLength = Gr(t.maxLine), t.maxLineChanged = !0, i.iter(function (r) { - var n = Gr(r); - n > t.maxLineLength && (t.maxLineLength = n, t.maxLine = r); + } + ++delta; + ++n; + } + return output.join(''); +}; + +/** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ +exports.encode = encode; +const toUnicode = function (input) { + return mapDomain(input, function (string) { + return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string; + }); +}; + +/** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ +exports.toUnicode = toUnicode; +const toASCII = function (input) { + return mapDomain(input, function (string) { + return regexNonASCII.test(string) ? 'xn--' + encode(string) : string; + }); +}; + +/*--------------------------------------------------------------------------*/ + +/** Define the public API */ +exports.toASCII = toASCII; +const punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '2.3.1', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode +}; +var _default = exports["default"] = punycode; + +/***/ }), + +/***/ "../../../node_modules/react-remove-scroll-bar/dist/es2015/component.js": +/*!******************************************************************************!*\ + !*** ../../../node_modules/react-remove-scroll-bar/dist/es2015/component.js ***! + \******************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.RemoveScrollBar = void 0; +var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +var _reactStyleSingleton = __webpack_require__(/*! react-style-singleton */ "../../../node_modules/react-style-singleton/dist/es2015/index.js"); +var _constants = __webpack_require__(/*! ./constants */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/constants.js"); +var _utils = __webpack_require__(/*! ./utils */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/utils.js"); +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +var Style = (0, _reactStyleSingleton.styleSingleton)(); +// important tip - once we measure scrollBar width and remove them +// we could not repeat this operation +// thus we are using style-singleton - only the first "yet correct" style will be applied. +var getStyles = function (_a, allowRelative, gapMode, important) { + var left = _a.left, + top = _a.top, + right = _a.right, + gap = _a.gap; + if (gapMode === void 0) { + gapMode = 'margin'; + } + return "\n .".concat(_constants.noScrollbarsClassName, " {\n overflow: hidden ").concat(important, ";\n padding-right: ").concat(gap, "px ").concat(important, ";\n }\n body {\n overflow: hidden ").concat(important, ";\n overscroll-behavior: contain;\n ").concat([allowRelative && "position: relative ".concat(important, ";"), gapMode === 'margin' && "\n padding-left: ".concat(left, "px;\n padding-top: ").concat(top, "px;\n padding-right: ").concat(right, "px;\n margin-left:0;\n margin-top:0;\n margin-right: ").concat(gap, "px ").concat(important, ";\n "), gapMode === 'padding' && "padding-right: ".concat(gap, "px ").concat(important, ";")].filter(Boolean).join(''), "\n }\n \n .").concat(_constants.zeroRightClassName, " {\n right: ").concat(gap, "px ").concat(important, ";\n }\n \n .").concat(_constants.fullWidthClassName, " {\n margin-right: ").concat(gap, "px ").concat(important, ";\n }\n \n .").concat(_constants.zeroRightClassName, " .").concat(_constants.zeroRightClassName, " {\n right: 0 ").concat(important, ";\n }\n \n .").concat(_constants.fullWidthClassName, " .").concat(_constants.fullWidthClassName, " {\n margin-right: 0 ").concat(important, ";\n }\n \n body {\n ").concat(_constants.removedBarSizeVariable, ": ").concat(gap, "px;\n }\n"); +}; +/** + * Removes page scrollbar and blocks page scroll when mounted + */ +var RemoveScrollBar = function (props) { + var noRelative = props.noRelative, + noImportant = props.noImportant, + _a = props.gapMode, + gapMode = _a === void 0 ? 'margin' : _a; + var gap = React.useMemo(function () { + return (0, _utils.getGapWidth)(gapMode); + }, [gapMode]); + return /*#__PURE__*/React.createElement(Style, { + styles: getStyles(gap, !noRelative, gapMode, !noImportant ? '!important' : '') + }); +}; +exports.RemoveScrollBar = RemoveScrollBar; + +/***/ }), + +/***/ "../../../node_modules/react-remove-scroll-bar/dist/es2015/constants.js": +/*!******************************************************************************!*\ + !*** ../../../node_modules/react-remove-scroll-bar/dist/es2015/constants.js ***! + \******************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.zeroRightClassName = exports.removedBarSizeVariable = exports.noScrollbarsClassName = exports.fullWidthClassName = void 0; +var zeroRightClassName = exports.zeroRightClassName = 'right-scroll-bar-position'; +var fullWidthClassName = exports.fullWidthClassName = 'width-before-scroll-bar'; +var noScrollbarsClassName = exports.noScrollbarsClassName = 'with-scroll-bars-hidden'; +/** + * Name of a CSS variable containing the amount of "hidden" scrollbar + * ! might be undefined ! use will fallback! + */ +var removedBarSizeVariable = exports.removedBarSizeVariable = '--removed-body-scroll-bar-size'; + +/***/ }), + +/***/ "../../../node_modules/react-remove-scroll-bar/dist/es2015/index.js": +/*!**************************************************************************!*\ + !*** ../../../node_modules/react-remove-scroll-bar/dist/es2015/index.js ***! + \**************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "RemoveScrollBar", ({ + enumerable: true, + get: function () { + return _component.RemoveScrollBar; + } +})); +Object.defineProperty(exports, "fullWidthClassName", ({ + enumerable: true, + get: function () { + return _constants.fullWidthClassName; + } +})); +Object.defineProperty(exports, "getGapWidth", ({ + enumerable: true, + get: function () { + return _utils.getGapWidth; + } +})); +Object.defineProperty(exports, "noScrollbarsClassName", ({ + enumerable: true, + get: function () { + return _constants.noScrollbarsClassName; + } +})); +Object.defineProperty(exports, "removedBarSizeVariable", ({ + enumerable: true, + get: function () { + return _constants.removedBarSizeVariable; + } +})); +Object.defineProperty(exports, "zeroRightClassName", ({ + enumerable: true, + get: function () { + return _constants.zeroRightClassName; + } +})); +var _component = __webpack_require__(/*! ./component */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/component.js"); +var _constants = __webpack_require__(/*! ./constants */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/constants.js"); +var _utils = __webpack_require__(/*! ./utils */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/utils.js"); + +/***/ }), + +/***/ "../../../node_modules/react-remove-scroll-bar/dist/es2015/utils.js": +/*!**************************************************************************!*\ + !*** ../../../node_modules/react-remove-scroll-bar/dist/es2015/utils.js ***! + \**************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.zeroGap = exports.getGapWidth = void 0; +var zeroGap = exports.zeroGap = { + left: 0, + top: 0, + right: 0, + gap: 0 +}; +var parse = function (x) { + return parseInt(x || '', 10) || 0; +}; +var getOffset = function (gapMode) { + var cs = window.getComputedStyle(document.body); + if (true) { + if (cs.overflowY === 'hidden') { + console.error('react-remove-scroll-bar: cannot calculate scrollbar size because it is removed (overflow:hidden on body'); + } + } + var left = cs[gapMode === 'padding' ? 'paddingLeft' : 'marginLeft']; + var top = cs[gapMode === 'padding' ? 'paddingTop' : 'marginTop']; + var right = cs[gapMode === 'padding' ? 'paddingRight' : 'marginRight']; + return [parse(left), parse(top), parse(right)]; +}; +var getGapWidth = function (gapMode) { + if (gapMode === void 0) { + gapMode = 'margin'; + } + if (typeof window === 'undefined') { + return zeroGap; + } + var offsets = getOffset(gapMode); + var documentWidth = document.documentElement.clientWidth; + var windowWidth = window.innerWidth; + return { + left: offsets[0], + top: offsets[1], + right: offsets[2], + gap: Math.max(0, windowWidth - documentWidth + offsets[2] - offsets[0]) + }; +}; +exports.getGapWidth = getGapWidth; + +/***/ }), + +/***/ "../../../node_modules/react-remove-scroll/dist/es2015/Combination.js": +/*!****************************************************************************!*\ + !*** ../../../node_modules/react-remove-scroll/dist/es2015/Combination.js ***! + \****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.mjs"); +var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +var _UI = __webpack_require__(/*! ./UI */ "../../../node_modules/react-remove-scroll/dist/es2015/UI.js"); +var _sidecar = _interopRequireDefault(__webpack_require__(/*! ./sidecar */ "../../../node_modules/react-remove-scroll/dist/es2015/sidecar.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +var ReactRemoveScroll = /*#__PURE__*/React.forwardRef(function (props, ref) { + return /*#__PURE__*/React.createElement(_UI.RemoveScroll, (0, _tslib.__assign)({}, props, { + ref: ref, + sideCar: _sidecar.default + })); +}); +ReactRemoveScroll.classNames = _UI.RemoveScroll.classNames; +var _default = exports["default"] = ReactRemoveScroll; + +/***/ }), + +/***/ "../../../node_modules/react-remove-scroll/dist/es2015/SideEffect.js": +/*!***************************************************************************!*\ + !*** ../../../node_modules/react-remove-scroll/dist/es2015/SideEffect.js ***! + \***************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.RemoveScrollSideCar = RemoveScrollSideCar; +exports.getTouchXY = exports.getDeltaXY = void 0; +var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.mjs"); +var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +var _reactRemoveScrollBar = __webpack_require__(/*! react-remove-scroll-bar */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/index.js"); +var _reactStyleSingleton = __webpack_require__(/*! react-style-singleton */ "../../../node_modules/react-style-singleton/dist/es2015/index.js"); +var _aggresiveCapture = __webpack_require__(/*! ./aggresiveCapture */ "../../../node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js"); +var _handleScroll = __webpack_require__(/*! ./handleScroll */ "../../../node_modules/react-remove-scroll/dist/es2015/handleScroll.js"); +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +var getTouchXY = function (event) { + return 'changedTouches' in event ? [event.changedTouches[0].clientX, event.changedTouches[0].clientY] : [0, 0]; +}; +exports.getTouchXY = getTouchXY; +var getDeltaXY = function (event) { + return [event.deltaX, event.deltaY]; +}; +exports.getDeltaXY = getDeltaXY; +var extractRef = function (ref) { + return ref && 'current' in ref ? ref.current : ref; +}; +var deltaCompare = function (x, y) { + return x[0] === y[0] && x[1] === y[1]; +}; +var generateStyle = function (id) { + return "\n .block-interactivity-".concat(id, " {pointer-events: none;}\n .allow-interactivity-").concat(id, " {pointer-events: all;}\n"); +}; +var idCounter = 0; +var lockStack = []; +function RemoveScrollSideCar(props) { + var shouldPreventQueue = React.useRef([]); + var touchStartRef = React.useRef([0, 0]); + var activeAxis = React.useRef(); + var id = React.useState(idCounter++)[0]; + var Style = React.useState(function () { + return (0, _reactStyleSingleton.styleSingleton)(); + })[0]; + var lastProps = React.useRef(props); + React.useEffect(function () { + lastProps.current = props; + }, [props]); + React.useEffect(function () { + if (props.inert) { + document.body.classList.add("block-interactivity-".concat(id)); + var allow_1 = (0, _tslib.__spreadArray)([props.lockRef.current], (props.shards || []).map(extractRef), true).filter(Boolean); + allow_1.forEach(function (el) { + return el.classList.add("allow-interactivity-".concat(id)); + }); + return function () { + document.body.classList.remove("block-interactivity-".concat(id)); + allow_1.forEach(function (el) { + return el.classList.remove("allow-interactivity-".concat(id)); }); + }; + } + return; + }, [props.inert, props.lockRef.current, props.shards]); + var shouldCancelEvent = React.useCallback(function (event, parent) { + if ('touches' in event && event.touches.length === 2) { + return !lastProps.current.allowPinchZoom; + } + var touch = getTouchXY(event); + var touchStart = touchStartRef.current; + var deltaX = 'deltaX' in event ? event.deltaX : touchStart[0] - touch[0]; + var deltaY = 'deltaY' in event ? event.deltaY : touchStart[1] - touch[1]; + var currentAxis; + var target = event.target; + var moveDirection = Math.abs(deltaX) > Math.abs(deltaY) ? 'h' : 'v'; + // allow horizontal touch move on Range inputs. They will not cause any scroll + if ('touches' in event && moveDirection === 'h' && target.type === 'range') { + return false; + } + var canBeScrolledInMainDirection = (0, _handleScroll.locationCouldBeScrolled)(moveDirection, target); + if (!canBeScrolledInMainDirection) { + return true; + } + if (canBeScrolledInMainDirection) { + currentAxis = moveDirection; + } else { + currentAxis = moveDirection === 'v' ? 'h' : 'v'; + canBeScrolledInMainDirection = (0, _handleScroll.locationCouldBeScrolled)(moveDirection, target); + // other axis might be not scrollable + } + if (!canBeScrolledInMainDirection) { + return false; + } + if (!activeAxis.current && 'changedTouches' in event && (deltaX || deltaY)) { + activeAxis.current = currentAxis; + } + if (!currentAxis) { + return true; + } + var cancelingAxis = activeAxis.current || currentAxis; + return (0, _handleScroll.handleScroll)(cancelingAxis, parent, event, cancelingAxis === 'h' ? deltaX : deltaY, true); + }, []); + var shouldPrevent = React.useCallback(function (_event) { + var event = _event; + if (!lockStack.length || lockStack[lockStack.length - 1] !== Style) { + // not the last active + return; + } + var delta = 'deltaY' in event ? getDeltaXY(event) : getTouchXY(event); + var sourceEvent = shouldPreventQueue.current.filter(function (e) { + return e.name === event.type && e.target === event.target && deltaCompare(e.delta, delta); + })[0]; + // self event, and should be canceled + if (sourceEvent && sourceEvent.should) { + if (event.cancelable) { + event.preventDefault(); } - u(zi, "findMaxLine"); - var St = u(function (e, t, i) { - this.text = e, el(this, t), this.height = i ? i(this) : 1; - }, "Line"); - St.prototype.lineNo = function () { - return F(this); - }, xt(St); - function wa(e, t, i, r) { - e.text = t, e.stateAfter && (e.stateAfter = null), e.styles && (e.styles = null), e.order != null && (e.order = null), $n(e), el(e, i); - var n = r ? r(e) : 1; - n != e.height && De(e, n); - } - u(wa, "updateLine"); - function Sa(e) { - e.parent = null, $n(e); - } - u(Sa, "cleanUpLine"); - var La = {}, - ka = {}; - function ll(e, t) { - if (!e || /^\s*$/.test(e)) return null; - var i = t.addModeClass ? ka : La; - return i[e] || (i[e] = e.replace(/\S+/g, "cm-$&")); - } - u(ll, "interpretTokenStyle"); - function ol(e, t) { - var i = bt("span", null, null, ne ? "padding-right: .1px" : null), - r = { - pre: bt("pre", [i], "CodeMirror-line"), - content: i, - col: 0, - pos: 0, - cm: e, - trailingSpace: !1, - splitSpaces: e.getOption("lineWrapping") - }; - t.measure = {}; - for (var n = 0; n <= (t.rest ? t.rest.length : 0); n++) { - var l = n ? t.rest[n - 1] : t.line, - o = void 0; - r.pos = 0, r.addToken = Ma, ra(e.display.measure) && (o = Pe(l, e.doc.direction)) && (r.addToken = Na(r.addToken, o)), r.map = []; - var a = t != e.display.externalMeasured && F(l); - Aa(l, r, Xn(e, l, a)), l.styleClasses && (l.styleClasses.bgClass && (r.bgClass = di(l.styleClasses.bgClass, r.bgClass || "")), l.styleClasses.textClass && (r.textClass = di(l.styleClasses.textClass, r.textClass || ""))), r.map.length == 0 && r.map.push(0, 0, r.content.appendChild(ta(e.display.measure))), n == 0 ? (t.measure.map = r.map, t.measure.cache = {}) : ((t.measure.maps || (t.measure.maps = [])).push(r.map), (t.measure.caches || (t.measure.caches = [])).push({})); - } - if (ne) { - var s = r.content.lastChild; - (/\bcm-tab\b/.test(s.className) || s.querySelector && s.querySelector(".cm-tab")) && (r.content.className = "cm-tab-wrap-hack"); - } - return U(e, "renderLine", e, t.line, r.pre), r.pre.className && (r.textClass = di(r.pre.className, r.textClass || "")), r; - } - u(ol, "buildLineContent"); - function Ta(e) { - var t = T("span", "•", "cm-invalidchar"); - return t.title = "\\u" + e.charCodeAt(0).toString(16), t.setAttribute("aria-label", t.title), t; - } - u(Ta, "defaultSpecialCharPlaceholder"); - function Ma(e, t, i, r, n, l, o) { - if (t) { - var a = e.splitSpaces ? Da(t, e.trailingSpace) : t, - s = e.cm.state.specialChars, - f = !1, - h; - if (!s.test(t)) e.col += t.length, h = document.createTextNode(a), e.map.push(e.pos, e.pos + t.length, h), O && I < 9 && (f = !0), e.pos += t.length;else { - h = document.createDocumentFragment(); - for (var c = 0;;) { - s.lastIndex = c; - var p = s.exec(t), - d = p ? p.index - c : t.length - c; - if (d) { - var v = document.createTextNode(a.slice(c, c + d)); - O && I < 9 ? h.appendChild(T("span", [v])) : h.appendChild(v), e.map.push(e.pos, e.pos + d, v), e.col += d, e.pos += d; - } - if (!p) break; - c += d + 1; - var g = void 0; - if (p[0] == " ") { - var m = e.cm.options.tabSize, - b = m - e.col % m; - g = h.appendChild(T("span", yi(b), "cm-tab")), g.setAttribute("role", "presentation"), g.setAttribute("cm-text", " "), e.col += b; - } else p[0] == "\r" || p[0] == ` -` ? (g = h.appendChild(T("span", p[0] == "\r" ? "␍" : "␤", "cm-invalidchar")), g.setAttribute("cm-text", p[0]), e.col += 1) : (g = e.cm.options.specialCharPlaceholder(p[0]), g.setAttribute("cm-text", p[0]), O && I < 9 ? h.appendChild(T("span", [g])) : h.appendChild(g), e.col += 1); - e.map.push(e.pos, e.pos + 1, g), e.pos++; - } - } - if (e.trailingSpace = a.charCodeAt(t.length - 1) == 32, i || r || n || f || l || o) { - var C = i || ""; - r && (C += r), n && (C += n); - var x = T("span", [h], C, l); - if (o) for (var w in o) o.hasOwnProperty(w) && w != "style" && w != "class" && x.setAttribute(w, o[w]); - return e.content.appendChild(x); - } - e.content.appendChild(h); - } - } - u(Ma, "buildToken"); - function Da(e, t) { - if (e.length > 1 && !/ /.test(e)) return e; - for (var i = t, r = "", n = 0; n < e.length; n++) { - var l = e.charAt(n); - l == " " && i && (n == e.length - 1 || e.charCodeAt(n + 1) == 32) && (l = " "), r += l, i = l == " "; - } - return r; - } - u(Da, "splitSpaces"); - function Na(e, t) { - return function (i, r, n, l, o, a, s) { - n = n ? n + " cm-force-border" : "cm-force-border"; - for (var f = i.pos, h = f + r.length;;) { - for (var c = void 0, p = 0; p < t.length && (c = t[p], !(c.to > f && c.from <= f)); p++); - if (c.to >= h) return e(i, r, n, l, o, a, s); - e(i, r.slice(0, c.to - f), n, l, null, a, s), l = null, r = r.slice(c.to - f), f = c.to; - } - }; - } - u(Na, "buildTokenBadBidi"); - function al(e, t, i, r) { - var n = !r && i.widgetNode; - n && e.map.push(e.pos, e.pos + t, n), !r && e.cm.display.input.needsContentAttribute && (n || (n = e.content.appendChild(document.createElement("span"))), n.setAttribute("cm-marker", i.id)), n && (e.cm.display.input.setUneditable(n), e.content.appendChild(n)), e.pos += t, e.trailingSpace = !1; - } - u(al, "buildCollapsedSpan"); - function Aa(e, t, i) { - var r = e.markedSpans, - n = e.text, - l = 0; - if (!r) { - for (var o = 1; o < i.length; o += 2) t.addToken(t, n.slice(l, l = i[o]), ll(i[o + 1], t.cm.options)); - return; - } - for (var a = n.length, s = 0, f = 1, h = "", c, p, d = 0, v, g, m, b, C;;) { - if (d == s) { - v = g = m = p = "", C = null, b = null, d = 1 / 0; - for (var x = [], w = void 0, k = 0; k < r.length; ++k) { - var L = r[k], - A = L.marker; - if (A.type == "bookmark" && L.from == s && A.widgetNode) x.push(A);else if (L.from <= s && (L.to == null || L.to > s || A.collapsed && L.to == s && L.from == s)) { - if (L.to != null && L.to != s && d > L.to && (d = L.to, g = ""), A.className && (v += " " + A.className), A.css && (p = (p ? p + ";" : "") + A.css), A.startStyle && L.from == s && (m += " " + A.startStyle), A.endStyle && L.to == d && (w || (w = [])).push(A.endStyle, L.to), A.title && ((C || (C = {})).title = A.title), A.attributes) for (var E in A.attributes) (C || (C = {}))[E] = A.attributes[E]; - A.collapsed && (!b || Ii(b.marker, A) < 0) && (b = L); - } else L.from > s && d > L.from && (d = L.from); - } - if (w) for (var j = 0; j < w.length; j += 2) w[j + 1] == d && (g += " " + w[j]); - if (!b || b.from == s) for (var B = 0; B < x.length; ++B) al(t, 0, x[B]); - if (b && (b.from || 0) == s) { - if (al(t, (b.to == null ? a + 1 : b.to) - s, b.marker, b.from == null), b.to == null) return; - b.to == s && (b = !1); - } - } - if (s >= a) break; - for (var pe = Math.min(a, d);;) { - if (h) { - var fe = s + h.length; - if (!b) { - var _ = fe > pe ? h.slice(0, pe - s) : h; - t.addToken(t, _, c ? c + v : v, m, s + _.length == d ? g : "", p, C); - } - if (fe >= pe) { - h = h.slice(pe - s), s = pe; - break; - } - s = fe, m = ""; - } - h = n.slice(l, l = i[f++]), c = ll(i[f++], t.cm.options); - } - } - } - u(Aa, "insertLineContent"); - function sl(e, t, i) { - this.line = t, this.rest = Ca(t), this.size = this.rest ? F(H(this.rest)) - i + 1 : 1, this.node = this.text = null, this.hidden = Xe(e, t); - } - u(sl, "LineView"); - function Ur(e, t, i) { - for (var r = [], n, l = t; l < i; l = n) { - var o = new sl(e.doc, S(e.doc, l), l); - n = l + o.size, r.push(o); + return; + } + // outside or shard event + if (!sourceEvent) { + var shardNodes = (lastProps.current.shards || []).map(extractRef).filter(Boolean).filter(function (node) { + return node.contains(event.target); + }); + var shouldStop = shardNodes.length > 0 ? shouldCancelEvent(event, shardNodes[0]) : !lastProps.current.noIsolation; + if (shouldStop) { + if (event.cancelable) { + event.preventDefault(); } - return r; - } - u(Ur, "buildViewArray"); - var Lt = null; - function Oa(e) { - Lt ? Lt.ops.push(e) : e.ownsGroup = Lt = { - ops: [e], - delayedCallbacks: [] - }; } - u(Oa, "pushOperation"); - function Wa(e) { - var t = e.delayedCallbacks, - i = 0; - do { - for (; i < t.length; i++) t[i].call(null); - for (var r = 0; r < e.ops.length; r++) { - var n = e.ops[r]; - if (n.cursorActivityHandlers) for (; n.cursorActivityCalled < n.cursorActivityHandlers.length;) n.cursorActivityHandlers[n.cursorActivityCalled++].call(null, n.cm); - } - } while (i < t.length); - } - u(Wa, "fireCallbacksForOps"); - function Ha(e, t) { - var i = e.ownsGroup; - if (i) try { - Wa(i); - } finally { - Lt = null, t(i); - } - } - u(Ha, "finishOperation"); - var $t = null; - function Z(e, t) { - var i = xi(e, t); - if (i.length) { - var r = Array.prototype.slice.call(arguments, 2), - n; - Lt ? n = Lt.delayedCallbacks : $t ? n = $t : (n = $t = [], setTimeout(Fa, 0)); - for (var l = u(function (a) { - n.push(function () { - return i[a].apply(null, r); - }); - }, "loop"), o = 0; o < i.length; ++o) l(o); - } - } - u(Z, "signalLater"); - function Fa() { - var e = $t; - $t = null; - for (var t = 0; t < e.length; ++t) e[t](); - } - u(Fa, "fireOrphanDelayed"); - function ul(e, t, i, r) { - for (var n = 0; n < t.changes.length; n++) { - var l = t.changes[n]; - l == "text" ? Ea(e, t) : l == "gutter" ? hl(e, t, i, r) : l == "class" ? Gi(e, t) : l == "widget" && Ia(e, t, r); - } - t.changes = null; - } - u(ul, "updateLineForChanges"); - function er(e) { - return e.node == e.text && (e.node = T("div", null, null, "position: relative"), e.text.parentNode && e.text.parentNode.replaceChild(e.node, e.text), e.node.appendChild(e.text), O && I < 8 && (e.node.style.zIndex = 2)), e.node; - } - u(er, "ensureLineWrapped"); - function Pa(e, t) { - var i = t.bgClass ? t.bgClass + " " + (t.line.bgClass || "") : t.line.bgClass; - if (i && (i += " CodeMirror-linebackground"), t.background) i ? t.background.className = i : (t.background.parentNode.removeChild(t.background), t.background = null);else if (i) { - var r = er(t); - t.background = r.insertBefore(T("div", null, i), r.firstChild), e.display.input.setUneditable(t.background); - } - } - u(Pa, "updateLineBackground"); - function fl(e, t) { - var i = e.display.externalMeasured; - return i && i.line == t.line ? (e.display.externalMeasured = null, t.measure = i.measure, i.built) : ol(e, t); - } - u(fl, "getLineContent"); - function Ea(e, t) { - var i = t.text.className, - r = fl(e, t); - t.text == t.node && (t.node = r.pre), t.text.parentNode.replaceChild(r.pre, t.text), t.text = r.pre, r.bgClass != t.bgClass || r.textClass != t.textClass ? (t.bgClass = r.bgClass, t.textClass = r.textClass, Gi(e, t)) : i && (t.text.className = i); - } - u(Ea, "updateLineText"); - function Gi(e, t) { - Pa(e, t), t.line.wrapClass ? er(t).className = t.line.wrapClass : t.node != t.text && (t.node.className = ""); - var i = t.textClass ? t.textClass + " " + (t.line.textClass || "") : t.line.textClass; - t.text.className = i || ""; - } - u(Gi, "updateLineClasses"); - function hl(e, t, i, r) { - if (t.gutter && (t.node.removeChild(t.gutter), t.gutter = null), t.gutterBackground && (t.node.removeChild(t.gutterBackground), t.gutterBackground = null), t.line.gutterClass) { - var n = er(t); - t.gutterBackground = T("div", null, "CodeMirror-gutter-background " + t.line.gutterClass, "left: " + (e.options.fixedGutter ? r.fixedPos : -r.gutterTotalWidth) + "px; width: " + r.gutterTotalWidth + "px"), e.display.input.setUneditable(t.gutterBackground), n.insertBefore(t.gutterBackground, t.text); - } - var l = t.line.gutterMarkers; - if (e.options.lineNumbers || l) { - var o = er(t), - a = t.gutter = T("div", null, "CodeMirror-gutter-wrapper", "left: " + (e.options.fixedGutter ? r.fixedPos : -r.gutterTotalWidth) + "px"); - if (a.setAttribute("aria-hidden", "true"), e.display.input.setUneditable(a), o.insertBefore(a, t.text), t.line.gutterClass && (a.className += " " + t.line.gutterClass), e.options.lineNumbers && (!l || !l["CodeMirror-linenumbers"]) && (t.lineNumber = a.appendChild(T("div", Oi(e.options, i), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + r.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + e.display.lineNumInnerWidth + "px"))), l) for (var s = 0; s < e.display.gutterSpecs.length; ++s) { - var f = e.display.gutterSpecs[s].className, - h = l.hasOwnProperty(f) && l[f]; - h && a.appendChild(T("div", [h], "CodeMirror-gutter-elt", "left: " + r.gutterLeft[f] + "px; width: " + r.gutterWidth[f] + "px")); - } - } - } - u(hl, "updateLineGutter"); - function Ia(e, t, i) { - t.alignable && (t.alignable = null); - for (var r = mt("CodeMirror-linewidget"), n = t.node.firstChild, l = void 0; n; n = l) l = n.nextSibling, r.test(n.className) && t.node.removeChild(n); - cl(e, t, i); - } - u(Ia, "updateLineWidgets"); - function Ra(e, t, i, r) { - var n = fl(e, t); - return t.text = t.node = n.pre, n.bgClass && (t.bgClass = n.bgClass), n.textClass && (t.textClass = n.textClass), Gi(e, t), hl(e, t, i, r), cl(e, t, r), t.node; - } - u(Ra, "buildLineElement"); - function cl(e, t, i) { - if (dl(e, t.line, t, i, !0), t.rest) for (var r = 0; r < t.rest.length; r++) dl(e, t.rest[r], t, i, !1); - } - u(cl, "insertLineWidgets"); - function dl(e, t, i, r, n) { - if (t.widgets) for (var l = er(i), o = 0, a = t.widgets; o < a.length; ++o) { - var s = a[o], - f = T("div", [s.node], "CodeMirror-linewidget" + (s.className ? " " + s.className : "")); - s.handleMouseEvents || f.setAttribute("cm-ignore-events", "true"), Ba(s, f, i, r), e.display.input.setUneditable(f), n && s.above ? l.insertBefore(f, i.gutter || i.text) : l.appendChild(f), Z(s, "redraw"); - } - } - u(dl, "insertLineWidgetsFor"); - function Ba(e, t, i, r) { - if (e.noHScroll) { - (i.alignable || (i.alignable = [])).push(t); - var n = r.wrapperWidth; - t.style.left = r.fixedPos + "px", e.coverGutter || (n -= r.gutterTotalWidth, t.style.paddingLeft = r.gutterTotalWidth + "px"), t.style.width = n + "px"; - } - e.coverGutter && (t.style.zIndex = 5, t.style.position = "relative", e.noHScroll || (t.style.marginLeft = -r.gutterTotalWidth + "px")); - } - u(Ba, "positionLineWidget"); - function tr(e) { - if (e.height != null) return e.height; - var t = e.doc.cm; - if (!t) return 0; - if (!Ke(document.body, e.node)) { - var i = "position: relative;"; - e.coverGutter && (i += "margin-left: -" + t.display.gutters.offsetWidth + "px;"), e.noHScroll && (i += "width: " + t.display.wrapper.clientWidth + "px;"), ve(t.display.measure, T("div", [e.node], null, i)); - } - return e.height = e.node.parentNode.offsetHeight; - } - u(tr, "widgetHeight"); - function Re(e, t) { - for (var i = wi(t); i != e.wrapper; i = i.parentNode) if (!i || i.nodeType == 1 && i.getAttribute("cm-ignore-events") == "true" || i.parentNode == e.sizer && i != e.mover) return !0; - } - u(Re, "eventInWidget"); - function Kr(e) { - return e.lineSpace.offsetTop; - } - u(Kr, "paddingTop"); - function Ui(e) { - return e.mover.offsetHeight - e.lineSpace.offsetHeight; - } - u(Ui, "paddingVert"); - function pl(e) { - if (e.cachedPaddingH) return e.cachedPaddingH; - var t = ve(e.measure, T("pre", "x", "CodeMirror-line-like")), - i = window.getComputedStyle ? window.getComputedStyle(t) : t.currentStyle, - r = { - left: parseInt(i.paddingLeft), - right: parseInt(i.paddingRight) - }; - return !isNaN(r.left) && !isNaN(r.right) && (e.cachedPaddingH = r), r; - } - u(pl, "paddingH"); - function Ae(e) { - return Wn - e.display.nativeBarWidth; - } - u(Ae, "scrollGap"); - function st(e) { - return e.display.scroller.clientWidth - Ae(e) - e.display.barWidth; - } - u(st, "displayWidth"); - function Ki(e) { - return e.display.scroller.clientHeight - Ae(e) - e.display.barHeight; - } - u(Ki, "displayHeight"); - function za(e, t, i) { - var r = e.options.lineWrapping, - n = r && st(e); - if (!t.measure.heights || r && t.measure.width != n) { - var l = t.measure.heights = []; - if (r) { - t.measure.width = n; - for (var o = t.text.firstChild.getClientRects(), a = 0; a < o.length - 1; a++) { - var s = o[a], - f = o[a + 1]; - Math.abs(s.bottom - f.bottom) > 2 && l.push((s.bottom + f.top) / 2 - i.top); - } - } - l.push(i.bottom - i.top); - } - } - u(za, "ensureLineHeights"); - function vl(e, t, i) { - if (e.line == t) return { - map: e.measure.map, - cache: e.measure.cache - }; - if (e.rest) { - for (var r = 0; r < e.rest.length; r++) if (e.rest[r] == t) return { - map: e.measure.maps[r], - cache: e.measure.caches[r] - }; - for (var n = 0; n < e.rest.length; n++) if (F(e.rest[n]) > i) return { - map: e.measure.maps[n], - cache: e.measure.caches[n], - before: !0 - }; - } + } + }, []); + var shouldCancel = React.useCallback(function (name, delta, target, should) { + var event = { + name: name, + delta: delta, + target: target, + should: should + }; + shouldPreventQueue.current.push(event); + setTimeout(function () { + shouldPreventQueue.current = shouldPreventQueue.current.filter(function (e) { + return e !== event; + }); + }, 1); + }, []); + var scrollTouchStart = React.useCallback(function (event) { + touchStartRef.current = getTouchXY(event); + activeAxis.current = undefined; + }, []); + var scrollWheel = React.useCallback(function (event) { + shouldCancel(event.type, getDeltaXY(event), event.target, shouldCancelEvent(event, props.lockRef.current)); + }, []); + var scrollTouchMove = React.useCallback(function (event) { + shouldCancel(event.type, getTouchXY(event), event.target, shouldCancelEvent(event, props.lockRef.current)); + }, []); + React.useEffect(function () { + lockStack.push(Style); + props.setCallbacks({ + onScrollCapture: scrollWheel, + onWheelCapture: scrollWheel, + onTouchMoveCapture: scrollTouchMove + }); + document.addEventListener('wheel', shouldPrevent, _aggresiveCapture.nonPassive); + document.addEventListener('touchmove', shouldPrevent, _aggresiveCapture.nonPassive); + document.addEventListener('touchstart', scrollTouchStart, _aggresiveCapture.nonPassive); + return function () { + lockStack = lockStack.filter(function (inst) { + return inst !== Style; + }); + document.removeEventListener('wheel', shouldPrevent, _aggresiveCapture.nonPassive); + document.removeEventListener('touchmove', shouldPrevent, _aggresiveCapture.nonPassive); + document.removeEventListener('touchstart', scrollTouchStart, _aggresiveCapture.nonPassive); + }; + }, []); + var removeScrollBar = props.removeScrollBar, + inert = props.inert; + return /*#__PURE__*/React.createElement(React.Fragment, null, inert ? /*#__PURE__*/React.createElement(Style, { + styles: generateStyle(id) + }) : null, removeScrollBar ? /*#__PURE__*/React.createElement(_reactRemoveScrollBar.RemoveScrollBar, { + gapMode: "margin" + }) : null); +} + +/***/ }), + +/***/ "../../../node_modules/react-remove-scroll/dist/es2015/UI.js": +/*!*******************************************************************!*\ + !*** ../../../node_modules/react-remove-scroll/dist/es2015/UI.js ***! + \*******************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.RemoveScroll = void 0; +var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.mjs"); +var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +var _constants = __webpack_require__(/*! react-remove-scroll-bar/constants */ "../../../node_modules/react-remove-scroll-bar/dist/es2015/constants.js"); +var _useCallbackRef = __webpack_require__(/*! use-callback-ref */ "../../../node_modules/use-callback-ref/dist/es2015/index.js"); +var _medium = __webpack_require__(/*! ./medium */ "../../../node_modules/react-remove-scroll/dist/es2015/medium.js"); +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +var nothing = function () { + return; +}; +/** + * Removes scrollbar from the page and contain the scroll within the Lock + */ +var RemoveScroll = exports.RemoveScroll = /*#__PURE__*/React.forwardRef(function (props, parentRef) { + var ref = React.useRef(null); + var _a = React.useState({ + onScrollCapture: nothing, + onWheelCapture: nothing, + onTouchMoveCapture: nothing + }), + callbacks = _a[0], + setCallbacks = _a[1]; + var forwardProps = props.forwardProps, + children = props.children, + className = props.className, + removeScrollBar = props.removeScrollBar, + enabled = props.enabled, + shards = props.shards, + sideCar = props.sideCar, + noIsolation = props.noIsolation, + inert = props.inert, + allowPinchZoom = props.allowPinchZoom, + _b = props.as, + Container = _b === void 0 ? 'div' : _b, + rest = (0, _tslib.__rest)(props, ["forwardProps", "children", "className", "removeScrollBar", "enabled", "shards", "sideCar", "noIsolation", "inert", "allowPinchZoom", "as"]); + var SideCar = sideCar; + var containerRef = (0, _useCallbackRef.useMergeRefs)([ref, parentRef]); + var containerProps = (0, _tslib.__assign)((0, _tslib.__assign)({}, rest), callbacks); + return /*#__PURE__*/React.createElement(React.Fragment, null, enabled && ( /*#__PURE__*/React.createElement(SideCar, { + sideCar: _medium.effectCar, + removeScrollBar: removeScrollBar, + shards: shards, + noIsolation: noIsolation, + inert: inert, + setCallbacks: setCallbacks, + allowPinchZoom: !!allowPinchZoom, + lockRef: ref + })), forwardProps ? ( /*#__PURE__*/React.cloneElement(React.Children.only(children), (0, _tslib.__assign)((0, _tslib.__assign)({}, containerProps), { + ref: containerRef + }))) : ( /*#__PURE__*/React.createElement(Container, (0, _tslib.__assign)({}, containerProps, { + className: className, + ref: containerRef + }), children))); +}); +RemoveScroll.defaultProps = { + enabled: true, + removeScrollBar: true, + inert: false +}; +RemoveScroll.classNames = { + fullWidth: _constants.fullWidthClassName, + zeroRight: _constants.zeroRightClassName +}; + +/***/ }), + +/***/ "../../../node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js": +/*!*********************************************************************************!*\ + !*** ../../../node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js ***! + \*********************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.nonPassive = void 0; +var passiveSupported = false; +if (typeof window !== 'undefined') { + try { + var options = Object.defineProperty({}, 'passive', { + get: function () { + passiveSupported = true; + return true; } - u(vl, "mapFromLineView"); - function Ga(e, t) { - t = Se(t); - var i = F(t), - r = e.display.externalMeasured = new sl(e.doc, t, i); - r.lineN = i; - var n = r.built = ol(e, r); - return r.text = n.pre, ve(e.display.lineMeasure, n.pre), r; - } - u(Ga, "updateExternalMeasurement"); - function gl(e, t, i, r) { - return Oe(e, kt(e, t), i, r); - } - u(gl, "measureChar"); - function _i(e, t) { - if (t >= e.display.viewFrom && t < e.display.viewTo) return e.display.view[ht(e, t)]; - var i = e.display.externalMeasured; - if (i && t >= i.lineN && t < i.lineN + i.size) return i; - } - u(_i, "findViewForLine"); - function kt(e, t) { - var i = F(t), - r = _i(e, i); - r && !r.text ? r = null : r && r.changes && (ul(e, r, i, Qi(e)), e.curOp.forceUpdate = !0), r || (r = Ga(e, t)); - var n = vl(r, t, i); - return { - line: t, - view: r, - rect: null, - map: n.map, - cache: n.cache, - before: n.before, - hasHeights: !1 - }; + }); + // @ts-ignore + window.addEventListener('test', options, options); + // @ts-ignore + window.removeEventListener('test', options, options); + } catch (err) { + passiveSupported = false; + } +} +var nonPassive = exports.nonPassive = passiveSupported ? { + passive: false +} : false; + +/***/ }), + +/***/ "../../../node_modules/react-remove-scroll/dist/es2015/handleScroll.js": +/*!*****************************************************************************!*\ + !*** ../../../node_modules/react-remove-scroll/dist/es2015/handleScroll.js ***! + \*****************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.locationCouldBeScrolled = exports.handleScroll = void 0; +var alwaysContainsScroll = function (node) { + // textarea will always _contain_ scroll inside self. It only can be hidden + return node.tagName === 'TEXTAREA'; +}; +var elementCanBeScrolled = function (node, overflow) { + var styles = window.getComputedStyle(node); + return ( + // not-not-scrollable + styles[overflow] !== 'hidden' && + // contains scroll inside self + !(styles.overflowY === styles.overflowX && !alwaysContainsScroll(node) && styles[overflow] === 'visible') + ); +}; +var elementCouldBeVScrolled = function (node) { + return elementCanBeScrolled(node, 'overflowY'); +}; +var elementCouldBeHScrolled = function (node) { + return elementCanBeScrolled(node, 'overflowX'); +}; +var locationCouldBeScrolled = function (axis, node) { + var current = node; + do { + // Skip over shadow root + if (typeof ShadowRoot !== 'undefined' && current instanceof ShadowRoot) { + current = current.host; + } + var isScrollable = elementCouldBeScrolled(axis, current); + if (isScrollable) { + var _a = getScrollVariables(axis, current), + s = _a[1], + d = _a[2]; + if (s > d) { + return true; } - u(kt, "prepareMeasureForLine"); - function Oe(e, t, i, r, n) { - t.before && (i = -1); - var l = i + (r || ""), - o; - return t.cache.hasOwnProperty(l) ? o = t.cache[l] : (t.rect || (t.rect = t.view.text.getBoundingClientRect()), t.hasHeights || (za(e, t.view, t.rect), t.hasHeights = !0), o = Ka(e, t, i, r), o.bogus || (t.cache[l] = o)), { - left: o.left, - right: o.right, - top: n ? o.rtop : o.top, - bottom: n ? o.rbottom : o.bottom - }; + } + current = current.parentNode; + } while (current && current !== document.body); + return false; +}; +exports.locationCouldBeScrolled = locationCouldBeScrolled; +var getVScrollVariables = function (_a) { + var scrollTop = _a.scrollTop, + scrollHeight = _a.scrollHeight, + clientHeight = _a.clientHeight; + return [scrollTop, scrollHeight, clientHeight]; +}; +var getHScrollVariables = function (_a) { + var scrollLeft = _a.scrollLeft, + scrollWidth = _a.scrollWidth, + clientWidth = _a.clientWidth; + return [scrollLeft, scrollWidth, clientWidth]; +}; +var elementCouldBeScrolled = function (axis, node) { + return axis === 'v' ? elementCouldBeVScrolled(node) : elementCouldBeHScrolled(node); +}; +var getScrollVariables = function (axis, node) { + return axis === 'v' ? getVScrollVariables(node) : getHScrollVariables(node); +}; +var getDirectionFactor = function (axis, direction) { + /** + * If the element's direction is rtl (right-to-left), then scrollLeft is 0 when the scrollbar is at its rightmost position, + * and then increasingly negative as you scroll towards the end of the content. + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeft + */ + return axis === 'h' && direction === 'rtl' ? -1 : 1; +}; +var handleScroll = function (axis, endTarget, event, sourceDelta, noOverscroll) { + var directionFactor = getDirectionFactor(axis, window.getComputedStyle(endTarget).direction); + var delta = directionFactor * sourceDelta; + // find scrollable target + var target = event.target; + var targetInLock = endTarget.contains(target); + var shouldCancelScroll = false; + var isDeltaPositive = delta > 0; + var availableScroll = 0; + var availableScrollTop = 0; + do { + var _a = getScrollVariables(axis, target), + position = _a[0], + scroll_1 = _a[1], + capacity = _a[2]; + var elementScroll = scroll_1 - capacity - directionFactor * position; + if (position || elementScroll) { + if (elementCouldBeScrolled(axis, target)) { + availableScroll += elementScroll; + availableScrollTop += position; } - u(Oe, "measureCharPrepared"); - var yl = { - left: 0, - right: 0, - top: 0, - bottom: 0 + } + target = target.parentNode; + } while ( + // portaled content + !targetInLock && target !== document.body || + // self content + targetInLock && (endTarget.contains(target) || endTarget === target)); + if (isDeltaPositive && (noOverscroll && availableScroll === 0 || !noOverscroll && delta > availableScroll)) { + shouldCancelScroll = true; + } else if (!isDeltaPositive && (noOverscroll && availableScrollTop === 0 || !noOverscroll && -delta > availableScrollTop)) { + shouldCancelScroll = true; + } + return shouldCancelScroll; +}; +exports.handleScroll = handleScroll; + +/***/ }), + +/***/ "../../../node_modules/react-remove-scroll/dist/es2015/index.js": +/*!**********************************************************************!*\ + !*** ../../../node_modules/react-remove-scroll/dist/es2015/index.js ***! + \**********************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "RemoveScroll", ({ + enumerable: true, + get: function () { + return _Combination.default; + } +})); +var _Combination = _interopRequireDefault(__webpack_require__(/*! ./Combination */ "../../../node_modules/react-remove-scroll/dist/es2015/Combination.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), + +/***/ "../../../node_modules/react-remove-scroll/dist/es2015/medium.js": +/*!***********************************************************************!*\ + !*** ../../../node_modules/react-remove-scroll/dist/es2015/medium.js ***! + \***********************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.effectCar = void 0; +var _useSidecar = __webpack_require__(/*! use-sidecar */ "../../../node_modules/use-sidecar/dist/es2015/index.js"); +var effectCar = exports.effectCar = (0, _useSidecar.createSidecarMedium)(); + +/***/ }), + +/***/ "../../../node_modules/react-remove-scroll/dist/es2015/sidecar.js": +/*!************************************************************************!*\ + !*** ../../../node_modules/react-remove-scroll/dist/es2015/sidecar.js ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _useSidecar = __webpack_require__(/*! use-sidecar */ "../../../node_modules/use-sidecar/dist/es2015/index.js"); +var _SideEffect = __webpack_require__(/*! ./SideEffect */ "../../../node_modules/react-remove-scroll/dist/es2015/SideEffect.js"); +var _medium = __webpack_require__(/*! ./medium */ "../../../node_modules/react-remove-scroll/dist/es2015/medium.js"); +var _default = exports["default"] = (0, _useSidecar.exportSidecar)(_medium.effectCar, _SideEffect.RemoveScrollSideCar); + +/***/ }), + +/***/ "../../../node_modules/react-style-singleton/dist/es2015/component.js": +/*!****************************************************************************!*\ + !*** ../../../node_modules/react-style-singleton/dist/es2015/component.js ***! + \****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.styleSingleton = void 0; +var _hook = __webpack_require__(/*! ./hook */ "../../../node_modules/react-style-singleton/dist/es2015/hook.js"); +/** + * create a Component to add styles on demand + * - styles are added when first instance is mounted + * - styles are removed when the last instance is unmounted + * - changing styles in runtime does nothing unless dynamic is set. But with multiple components that can lead to the undefined behavior + */ +var styleSingleton = function () { + var useStyle = (0, _hook.styleHookSingleton)(); + var Sheet = function (_a) { + var styles = _a.styles, + dynamic = _a.dynamic; + useStyle(styles, dynamic); + return null; + }; + return Sheet; +}; +exports.styleSingleton = styleSingleton; + +/***/ }), + +/***/ "../../../node_modules/react-style-singleton/dist/es2015/hook.js": +/*!***********************************************************************!*\ + !*** ../../../node_modules/react-style-singleton/dist/es2015/hook.js ***! + \***********************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.styleHookSingleton = void 0; +var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +var _singleton = __webpack_require__(/*! ./singleton */ "../../../node_modules/react-style-singleton/dist/es2015/singleton.js"); +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +/** + * creates a hook to control style singleton + * @see {@link styleSingleton} for a safer component version + * @example + * ```tsx + * const useStyle = styleHookSingleton(); + * /// + * useStyle('body { overflow: hidden}'); + */ +var styleHookSingleton = function () { + var sheet = (0, _singleton.stylesheetSingleton)(); + return function (styles, isDynamic) { + React.useEffect(function () { + sheet.add(styles); + return function () { + sheet.remove(); }; - function ml(e, t, i) { - for (var r, n, l, o, a, s, f = 0; f < e.length; f += 3) if (a = e[f], s = e[f + 1], t < a ? (n = 0, l = 1, o = "left") : t < s ? (n = t - a, l = n + 1) : (f == e.length - 3 || t == s && e[f + 3] > t) && (l = s - a, n = l - 1, t >= s && (o = "right")), n != null) { - if (r = e[f + 2], a == s && i == (r.insertLeft ? "left" : "right") && (o = i), i == "left" && n == 0) for (; f && e[f - 2] == e[f - 3] && e[f - 1].insertLeft;) r = e[(f -= 3) + 2], o = "left"; - if (i == "right" && n == s - a) for (; f < e.length - 3 && e[f + 3] == e[f + 4] && !e[f + 5].insertLeft;) r = e[(f += 3) + 2], o = "right"; - break; + }, [styles && isDynamic]); + }; +}; +exports.styleHookSingleton = styleHookSingleton; + +/***/ }), + +/***/ "../../../node_modules/react-style-singleton/dist/es2015/index.js": +/*!************************************************************************!*\ + !*** ../../../node_modules/react-style-singleton/dist/es2015/index.js ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "styleHookSingleton", ({ + enumerable: true, + get: function () { + return _hook.styleHookSingleton; + } +})); +Object.defineProperty(exports, "styleSingleton", ({ + enumerable: true, + get: function () { + return _component.styleSingleton; + } +})); +Object.defineProperty(exports, "stylesheetSingleton", ({ + enumerable: true, + get: function () { + return _singleton.stylesheetSingleton; + } +})); +var _component = __webpack_require__(/*! ./component */ "../../../node_modules/react-style-singleton/dist/es2015/component.js"); +var _singleton = __webpack_require__(/*! ./singleton */ "../../../node_modules/react-style-singleton/dist/es2015/singleton.js"); +var _hook = __webpack_require__(/*! ./hook */ "../../../node_modules/react-style-singleton/dist/es2015/hook.js"); + +/***/ }), + +/***/ "../../../node_modules/react-style-singleton/dist/es2015/singleton.js": +/*!****************************************************************************!*\ + !*** ../../../node_modules/react-style-singleton/dist/es2015/singleton.js ***! + \****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.stylesheetSingleton = void 0; +var _getNonce = __webpack_require__(/*! get-nonce */ "../../../node_modules/get-nonce/dist/es2015/index.js"); +function makeStyleTag() { + if (!document) return null; + var tag = document.createElement('style'); + tag.type = 'text/css'; + var nonce = (0, _getNonce.getNonce)(); + if (nonce) { + tag.setAttribute('nonce', nonce); + } + return tag; +} +function injectStyles(tag, css) { + // @ts-ignore + if (tag.styleSheet) { + // @ts-ignore + tag.styleSheet.cssText = css; + } else { + tag.appendChild(document.createTextNode(css)); + } +} +function insertStyleTag(tag) { + var head = document.head || document.getElementsByTagName('head')[0]; + head.appendChild(tag); +} +var stylesheetSingleton = function () { + var counter = 0; + var stylesheet = null; + return { + add: function (style) { + if (counter == 0) { + if (stylesheet = makeStyleTag()) { + injectStyles(stylesheet, style); + insertStyleTag(stylesheet); } - return { - node: r, - start: n, - end: l, - collapse: o, - coverStart: a, - coverEnd: s - }; - } - u(ml, "nodeAndOffsetInLineMap"); - function Ua(e, t) { - var i = yl; - if (t == "left") for (var r = 0; r < e.length && (i = e[r]).left == i.right; r++);else for (var n = e.length - 1; n >= 0 && (i = e[n]).left == i.right; n--); - return i; - } - u(Ua, "getUsefulRect"); - function Ka(e, t, i, r) { - var n = ml(t.map, i, r), - l = n.node, - o = n.start, - a = n.end, - s = n.collapse, - f; - if (l.nodeType == 3) { - for (var h = 0; h < 4; h++) { - for (; o && bi(t.line.text.charAt(n.coverStart + o));) --o; - for (; n.coverStart + a < n.coverEnd && bi(t.line.text.charAt(n.coverStart + a));) ++a; - if (O && I < 9 && o == 0 && a == n.coverEnd - n.coverStart ? f = l.parentNode.getBoundingClientRect() : f = Ua(rt(l, o, a).getClientRects(), r), f.left || f.right || o == 0) break; - a = o, o = o - 1, s = "right"; - } - O && I < 11 && (f = _a(e.display.measure, f)); - } else { - o > 0 && (s = r = "right"); - var c; - e.options.lineWrapping && (c = l.getClientRects()).length > 1 ? f = c[r == "right" ? c.length - 1 : 0] : f = l.getBoundingClientRect(); - } - if (O && I < 9 && !o && (!f || !f.left && !f.right)) { - var p = l.parentNode.getClientRects()[0]; - p ? f = { - left: p.left, - right: p.left + Mt(e.display), - top: p.top, - bottom: p.bottom - } : f = yl; - } - for (var d = f.top - t.rect.top, v = f.bottom - t.rect.top, g = (d + v) / 2, m = t.view.measure.heights, b = 0; b < m.length - 1 && !(g < m[b]); b++); - var C = b ? m[b - 1] : 0, - x = m[b], - w = { - left: (s == "right" ? f.right : f.left) - t.rect.left, - right: (s == "left" ? f.left : f.right) - t.rect.left, - top: C, - bottom: x - }; - return !f.left && !f.right && (w.bogus = !0), e.options.singleCursorHeightPerLine || (w.rtop = d, w.rbottom = v), w; - } - u(Ka, "measureCharInner"); - function _a(e, t) { - if (!window.screen || screen.logicalXDPI == null || screen.logicalXDPI == screen.deviceXDPI || !la(e)) return t; - var i = screen.logicalXDPI / screen.deviceXDPI, - r = screen.logicalYDPI / screen.deviceYDPI; - return { - left: t.left * i, - right: t.right * i, - top: t.top * r, - bottom: t.bottom * r - }; - } - u(_a, "maybeUpdateRectForZooming"); - function bl(e) { - if (e.measure && (e.measure.cache = {}, e.measure.heights = null, e.rest)) for (var t = 0; t < e.rest.length; t++) e.measure.caches[t] = {}; - } - u(bl, "clearLineMeasurementCacheFor"); - function xl(e) { - e.display.externalMeasure = null, Ue(e.display.lineMeasure); - for (var t = 0; t < e.display.view.length; t++) bl(e.display.view[t]); - } - u(xl, "clearLineMeasurementCache"); - function rr(e) { - xl(e), e.display.cachedCharWidth = e.display.cachedTextHeight = e.display.cachedPaddingH = null, e.options.lineWrapping || (e.display.maxLineChanged = !0), e.display.lineNumChars = null; - } - u(rr, "clearCaches"); - function Cl() { - return Tr && Dr ? -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) : window.pageXOffset || (document.documentElement || document.body).scrollLeft; - } - u(Cl, "pageScrollX"); - function wl() { - return Tr && Dr ? -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) : window.pageYOffset || (document.documentElement || document.body).scrollTop; - } - u(wl, "pageScrollY"); - function Xi(e) { - var t = Se(e), - i = t.widgets, - r = 0; - if (i) for (var n = 0; n < i.length; ++n) i[n].above && (r += tr(i[n])); - return r; } - u(Xi, "widgetTopHeight"); - function _r(e, t, i, r, n) { - if (!n) { - var l = Xi(t); - i.top += l, i.bottom += l; - } - if (r == "line") return i; - r || (r = "local"); - var o = Ie(t); - if (r == "local" ? o += Kr(e.display) : o -= e.display.viewOffset, r == "page" || r == "window") { - var a = e.display.lineSpace.getBoundingClientRect(); - o += a.top + (r == "window" ? 0 : wl()); - var s = a.left + (r == "window" ? 0 : Cl()); - i.left += s, i.right += s; - } - return i.top += o, i.bottom += o, i; - } - u(_r, "intoCoordSystem"); - function Sl(e, t, i) { - if (i == "div") return t; - var r = t.left, - n = t.top; - if (i == "page") r -= Cl(), n -= wl();else if (i == "local" || !i) { - var l = e.display.sizer.getBoundingClientRect(); - r += l.left, n += l.top; - } - var o = e.display.lineSpace.getBoundingClientRect(); - return { - left: r - o.left, - top: n - o.top - }; + counter++; + }, + remove: function () { + counter--; + if (!counter && stylesheet) { + stylesheet.parentNode && stylesheet.parentNode.removeChild(stylesheet); + stylesheet = null; } - u(Sl, "fromCoordSystem"); - function Xr(e, t, i, r, n) { - return r || (r = S(e.doc, t.line)), _r(e, r, gl(e, r, t.ch, n), i); - } - u(Xr, "charCoords"); - function Le(e, t, i, r, n, l) { - r = r || S(e.doc, t.line), n || (n = kt(e, r)); - function o(v, g) { - var m = Oe(e, n, v, g ? "right" : "left", l); - return g ? m.left = m.right : m.right = m.left, _r(e, r, m, i); - } - u(o, "get"); - var a = Pe(r, e.doc.direction), - s = t.ch, - f = t.sticky; - if (s >= r.text.length ? (s = r.text.length, f = "before") : s <= 0 && (s = 0, f = "after"), !a) return o(f == "before" ? s - 1 : s, f == "before"); - function h(v, g, m) { - var b = a[g], - C = b.level == 1; - return o(m ? v - 1 : v, C != m); - } - u(h, "getBidi"); - var c = Zt(a, s, f), - p = qt, - d = h(s, c, f == "before"); - return p != null && (d.other = h(s, p, f != "before")), d; - } - u(Le, "cursorCoords"); - function Ll(e, t) { - var i = 0; - t = N(e.doc, t), e.options.lineWrapping || (i = Mt(e.display) * t.ch); - var r = S(e.doc, t.line), - n = Ie(r) + Kr(e.display); - return { - left: i, - right: i, - top: n, - bottom: n + r.height - }; + } + }; +}; +exports.stylesheetSingleton = stylesheetSingleton; + +/***/ }), + +/***/ "../../../node_modules/react/cjs/react-jsx-runtime.development.js": +/*!************************************************************************!*\ + !*** ../../../node_modules/react/cjs/react-jsx-runtime.development.js ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +/** + * @license React + * react-jsx-runtime.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +if (true) { + (function () { + 'use strict'; + + var React = __webpack_require__(/*! react */ "react"); + + // ATTENTION + // When adding new symbols to this file, + // Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' + // The Symbol used to tag the ReactElement-like types. + var REACT_ELEMENT_TYPE = Symbol.for('react.element'); + var REACT_PORTAL_TYPE = Symbol.for('react.portal'); + var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment'); + var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode'); + var REACT_PROFILER_TYPE = Symbol.for('react.profiler'); + var REACT_PROVIDER_TYPE = Symbol.for('react.provider'); + var REACT_CONTEXT_TYPE = Symbol.for('react.context'); + var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref'); + var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense'); + var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list'); + var REACT_MEMO_TYPE = Symbol.for('react.memo'); + var REACT_LAZY_TYPE = Symbol.for('react.lazy'); + var REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen'); + var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = '@@iterator'; + function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== 'object') { + return null; } - u(Ll, "estimateCoords"); - function Yi(e, t, i, r, n) { - var l = y(e, t, i); - return l.xRel = n, r && (l.outside = r), l; - } - u(Yi, "PosWithInfo"); - function qi(e, t, i) { - var r = e.doc; - if (i += e.display.viewOffset, i < 0) return Yi(r.first, 0, null, -1, -1); - var n = at(r, i), - l = r.first + r.size - 1; - if (n > l) return Yi(r.first + r.size - 1, S(r, l).text.length, null, 1, 1); - t < 0 && (t = 0); - for (var o = S(r, n);;) { - var a = Xa(e, o, n, t, i), - s = ba(o, a.ch + (a.xRel > 0 || a.outside > 0 ? 1 : 0)); - if (!s) return a; - var f = s.find(1); - if (f.line == n) return f; - o = S(r, n = f.line); - } - } - u(qi, "coordsChar"); - function kl(e, t, i, r) { - r -= Xi(t); - var n = t.text.length, - l = Yt(function (o) { - return Oe(e, i, o - 1).bottom <= r; - }, n, 0); - return n = Yt(function (o) { - return Oe(e, i, o).top > r; - }, l, n), { - begin: l, - end: n - }; + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + if (typeof maybeIterator === 'function') { + return maybeIterator; } - u(kl, "wrappedLineExtent"); - function Tl(e, t, i, r) { - i || (i = kt(e, t)); - var n = _r(e, t, Oe(e, i, r), "line").top; - return kl(e, t, i, n); - } - u(Tl, "wrappedLineExtentChar"); - function Zi(e, t, i, r) { - return e.bottom <= i ? !1 : e.top > i ? !0 : (r ? e.left : e.right) > t; - } - u(Zi, "boxIsAfter"); - function Xa(e, t, i, r, n) { - n -= Ie(t); - var l = kt(e, t), - o = Xi(t), - a = 0, - s = t.text.length, - f = !0, - h = Pe(t, e.doc.direction); - if (h) { - var c = (e.options.lineWrapping ? qa : Ya)(e, t, i, l, h, r, n); - f = c.level != 1, a = f ? c.from : c.to - 1, s = f ? c.to : c.from - 1; - } - var p = null, - d = null, - v = Yt(function (k) { - var L = Oe(e, l, k); - return L.top += o, L.bottom += o, Zi(L, r, n, !1) ? (L.top <= n && L.left <= r && (p = k, d = L), !0) : !1; - }, a, s), - g, - m, - b = !1; - if (d) { - var C = r - d.left < d.right - r, - x = C == f; - v = p + (x ? 0 : 1), m = x ? "after" : "before", g = C ? d.left : d.right; - } else { - !f && (v == s || v == a) && v++, m = v == 0 ? "after" : v == t.text.length ? "before" : Oe(e, l, v - (f ? 1 : 0)).bottom + o <= n == f ? "after" : "before"; - var w = Le(e, y(i, v, m), "line", t, l); - g = w.left, b = n < w.top ? -1 : n >= w.bottom ? 1 : 0; - } - return v = En(t.text, v, 1), Yi(i, v, m, b, r - g); - } - u(Xa, "coordsCharInner"); - function Ya(e, t, i, r, n, l, o) { - var a = Yt(function (c) { - var p = n[c], - d = p.level != 1; - return Zi(Le(e, y(i, d ? p.to : p.from, d ? "before" : "after"), "line", t, r), l, o, !0); - }, 0, n.length - 1), - s = n[a]; - if (a > 0) { - var f = s.level != 1, - h = Le(e, y(i, f ? s.from : s.to, f ? "after" : "before"), "line", t, r); - Zi(h, l, o, !0) && h.top > o && (s = n[a - 1]); - } - return s; - } - u(Ya, "coordsBidiPart"); - function qa(e, t, i, r, n, l, o) { - var a = kl(e, t, r, o), - s = a.begin, - f = a.end; - /\s/.test(t.text.charAt(f - 1)) && f--; - for (var h = null, c = null, p = 0; p < n.length; p++) { - var d = n[p]; - if (!(d.from >= f || d.to <= s)) { - var v = d.level != 1, - g = Oe(e, r, v ? Math.min(f, d.to) - 1 : Math.max(s, d.from)).right, - m = g < l ? l - g + 1e9 : g - l; - (!h || c > m) && (h = d, c = m); - } - } - return h || (h = n[n.length - 1]), h.from < s && (h = { - from: s, - to: h.to, - level: h.level - }), h.to > f && (h = { - from: h.from, - to: f, - level: h.level - }), h; - } - u(qa, "coordsBidiPartWrapped"); - var ut; - function Tt(e) { - if (e.cachedTextHeight != null) return e.cachedTextHeight; - if (ut == null) { - ut = T("pre", null, "CodeMirror-line-like"); - for (var t = 0; t < 49; ++t) ut.appendChild(document.createTextNode("x")), ut.appendChild(T("br")); - ut.appendChild(document.createTextNode("x")); - } - ve(e.measure, ut); - var i = ut.offsetHeight / 50; - return i > 3 && (e.cachedTextHeight = i), Ue(e.measure), i || 1; - } - u(Tt, "textHeight"); - function Mt(e) { - if (e.cachedCharWidth != null) return e.cachedCharWidth; - var t = T("span", "xxxxxxxxxx"), - i = T("pre", [t], "CodeMirror-line-like"); - ve(e.measure, i); - var r = t.getBoundingClientRect(), - n = (r.right - r.left) / 10; - return n > 2 && (e.cachedCharWidth = n), n || 10; - } - u(Mt, "charWidth"); - function Qi(e) { - for (var t = e.display, i = {}, r = {}, n = t.gutters.clientLeft, l = t.gutters.firstChild, o = 0; l; l = l.nextSibling, ++o) { - var a = e.display.gutterSpecs[o].className; - i[a] = l.offsetLeft + l.clientLeft + n, r[a] = l.clientWidth; + return null; + } + var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + function error(format) { + { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + printWarning('error', format, args); } - return { - fixedPos: Ji(t), - gutterTotalWidth: t.gutters.offsetWidth, - gutterLeft: i, - gutterWidth: r, - wrapperWidth: t.wrapper.clientWidth - }; - } - u(Qi, "getDimensions"); - function Ji(e) { - return e.scroller.getBoundingClientRect().left - e.sizer.getBoundingClientRect().left; - } - u(Ji, "compensateForHScroll"); - function Ml(e) { - var t = Tt(e.display), - i = e.options.lineWrapping, - r = i && Math.max(5, e.display.scroller.clientWidth / Mt(e.display) - 3); - return function (n) { - if (Xe(e.doc, n)) return 0; - var l = 0; - if (n.widgets) for (var o = 0; o < n.widgets.length; o++) n.widgets[o].height && (l += n.widgets[o].height); - return i ? l + (Math.ceil(n.text.length / r) || 1) * t : l + t; - }; - } - u(Ml, "estimateHeight"); - function ji(e) { - var t = e.doc, - i = Ml(e); - t.iter(function (r) { - var n = i(r); - n != r.height && De(r, n); - }); } - u(ji, "estimateLineHeights"); - function ft(e, t, i, r) { - var n = e.display; - if (!i && wi(t).getAttribute("cm-not-content") == "true") return null; - var l, - o, - a = n.lineSpace.getBoundingClientRect(); - try { - l = t.clientX - a.left, o = t.clientY - a.top; - } catch { - return null; - } - var s = qi(e, l, o), - f; - if (r && s.xRel > 0 && (f = S(e.doc, s.line).text).length == s.ch) { - var h = xe(f, f.length, e.options.tabSize) - f.length; - s = y(s.line, Math.max(0, Math.round((l - pl(e.display).left) / Mt(e.display)) - h)); - } - return s; - } - u(ft, "posFromMouse"); - function ht(e, t) { - if (t >= e.display.viewTo || (t -= e.display.viewFrom, t < 0)) return null; - for (var i = e.display.view, r = 0; r < i.length; r++) if (t -= i[r].size, t < 0) return r; - } - u(ht, "findViewIndex"); - function se(e, t, i, r) { - t == null && (t = e.doc.first), i == null && (i = e.doc.first + e.doc.size), r || (r = 0); - var n = e.display; - if (r && i < n.viewTo && (n.updateLineNumbers == null || n.updateLineNumbers > t) && (n.updateLineNumbers = t), e.curOp.viewChanged = !0, t >= n.viewTo) Ee && Ri(e.doc, t) < n.viewTo && qe(e);else if (i <= n.viewFrom) Ee && nl(e.doc, i + r) > n.viewFrom ? qe(e) : (n.viewFrom += r, n.viewTo += r);else if (t <= n.viewFrom && i >= n.viewTo) qe(e);else if (t <= n.viewFrom) { - var l = Yr(e, i, i + r, 1); - l ? (n.view = n.view.slice(l.index), n.viewFrom = l.lineN, n.viewTo += r) : qe(e); - } else if (i >= n.viewTo) { - var o = Yr(e, t, t, -1); - o ? (n.view = n.view.slice(0, o.index), n.viewTo = o.lineN) : qe(e); - } else { - var a = Yr(e, t, t, -1), - s = Yr(e, i, i + r, 1); - a && s ? (n.view = n.view.slice(0, a.index).concat(Ur(e, a.lineN, s.lineN)).concat(n.view.slice(s.index)), n.viewTo += r) : qe(e); - } - var f = n.externalMeasured; - f && (i < f.lineN ? f.lineN += r : t < f.lineN + f.size && (n.externalMeasured = null)); - } - u(se, "regChange"); - function Ye(e, t, i) { - e.curOp.viewChanged = !0; - var r = e.display, - n = e.display.externalMeasured; - if (n && t >= n.lineN && t < n.lineN + n.size && (r.externalMeasured = null), !(t < r.viewFrom || t >= r.viewTo)) { - var l = r.view[ht(e, t)]; - if (l.node != null) { - var o = l.changes || (l.changes = []); - ee(o, i) == -1 && o.push(i); - } - } - } - u(Ye, "regLineChange"); - function qe(e) { - e.display.viewFrom = e.display.viewTo = e.doc.first, e.display.view = [], e.display.viewOffset = 0; - } - u(qe, "resetView"); - function Yr(e, t, i, r) { - var n = ht(e, t), - l, - o = e.display.view; - if (!Ee || i == e.doc.first + e.doc.size) return { - index: n, - lineN: i - }; - for (var a = e.display.viewFrom, s = 0; s < n; s++) a += o[s].size; - if (a != t) { - if (r > 0) { - if (n == o.length - 1) return null; - l = a + o[n].size - t, n++; - } else l = a - t; - t += l, i += l; - } - for (; Ri(e.doc, i) != i;) { - if (n == (r < 0 ? 0 : o.length - 1)) return null; - i += r * o[n - (r < 0 ? 1 : 0)].size, n += r; - } - return { - index: n, - lineN: i - }; + } + function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } // eslint-disable-next-line react-internal/safe-string-coercion + + var argsWithFormat = args.map(function (item) { + return String(item); + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); } - u(Yr, "viewCuttingPoint"); - function Za(e, t, i) { - var r = e.display, - n = r.view; - n.length == 0 || t >= r.viewTo || i <= r.viewFrom ? (r.view = Ur(e, t, i), r.viewFrom = t) : (r.viewFrom > t ? r.view = Ur(e, t, r.viewFrom).concat(r.view) : r.viewFrom < t && (r.view = r.view.slice(ht(e, t))), r.viewFrom = t, r.viewTo < i ? r.view = r.view.concat(Ur(e, r.viewTo, i)) : r.viewTo > i && (r.view = r.view.slice(0, ht(e, i)))), r.viewTo = i; - } - u(Za, "adjustView"); - function Dl(e) { - for (var t = e.display.view, i = 0, r = 0; r < t.length; r++) { - var n = t[r]; - !n.hidden && (!n.node || n.changes) && ++i; - } - return i; - } - u(Dl, "countDirtyView"); - function ir(e) { - e.display.input.showSelection(e.display.input.prepareSelection()); - } - u(ir, "updateSelection"); - function Nl(e, t) { - t === void 0 && (t = !0); - var i = e.doc, - r = {}, - n = r.cursors = document.createDocumentFragment(), - l = r.selection = document.createDocumentFragment(), - o = e.options.$customCursor; - o && (t = !0); - for (var a = 0; a < i.sel.ranges.length; a++) if (!(!t && a == i.sel.primIndex)) { - var s = i.sel.ranges[a]; - if (!(s.from().line >= e.display.viewTo || s.to().line < e.display.viewFrom)) { - var f = s.empty(); - if (o) { - var h = o(e, s); - h && Vi(e, h, n); - } else (f || e.options.showCursorWhenSelecting) && Vi(e, s.head, n); - f || Qa(e, s, l); - } - } - return r; + } + + // ----------------------------------------------------------------------------- + + var enableScopeAPI = false; // Experimental Create Event Handle API. + var enableCacheElement = false; + var enableTransitionTracing = false; // No known bugs, but needs performance testing + + var enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber + // stuff. Intended to enable React core members to more easily debug scheduling + // issues in DEV builds. + + var enableDebugTracing = false; // Track which Fiber(s) schedule render work. + + var REACT_MODULE_REFERENCE; + { + REACT_MODULE_REFERENCE = Symbol.for('react.module.reference'); + } + function isValidElementType(type) { + if (typeof type === 'string' || typeof type === 'function') { + return true; + } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + + if (type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || enableDebugTracing || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || enableLegacyHidden || type === REACT_OFFSCREEN_TYPE || enableScopeAPI || enableCacheElement || enableTransitionTracing) { + return true; } - u(Nl, "prepareSelection"); - function Vi(e, t, i) { - var r = Le(e, t, "div", null, null, !e.options.singleCursorHeightPerLine), - n = i.appendChild(T("div", " ", "CodeMirror-cursor")); - if (n.style.left = r.left + "px", n.style.top = r.top + "px", n.style.height = Math.max(0, r.bottom - r.top) * e.options.cursorHeight + "px", /\bcm-fat-cursor\b/.test(e.getWrapperElement().className)) { - var l = Xr(e, t, "div", null, null), - o = l.right - l.left; - n.style.width = (o > 0 ? o : e.defaultCharWidth()) + "px"; - } - if (r.other) { - var a = i.appendChild(T("div", " ", "CodeMirror-cursor CodeMirror-secondarycursor")); - a.style.display = "", a.style.left = r.other.left + "px", a.style.top = r.other.top + "px", a.style.height = (r.other.bottom - r.other.top) * .85 + "px"; - } - } - u(Vi, "drawSelectionCursor"); - function qr(e, t) { - return e.top - t.top || e.left - t.left; - } - u(qr, "cmpCoords"); - function Qa(e, t, i) { - var r = e.display, - n = e.doc, - l = document.createDocumentFragment(), - o = pl(e.display), - a = o.left, - s = Math.max(r.sizerWidth, st(e) - r.sizer.offsetLeft) - o.right, - f = n.direction == "ltr"; - function h(x, w, k, L) { - w < 0 && (w = 0), w = Math.round(w), L = Math.round(L), l.appendChild(T("div", null, "CodeMirror-selected", "position: absolute; left: " + x + `px; - top: ` + w + "px; width: " + (k !== null && k !== void 0 ? k : s - x) + `px; - height: ` + (L - w) + "px")); - } - u(h, "add"); - function c(x, w, k) { - var L = S(n, x), - A = L.text.length, - E, - j; - function B(_, he) { - return Xr(e, y(x, _), "div", L, he); - } - u(B, "coords"); - function pe(_, he, $) { - var Y = Tl(e, L, null, _), - X = he == "ltr" == ($ == "after") ? "left" : "right", - z = $ == "after" ? Y.begin : Y.end - (/\s/.test(L.text.charAt(Y.end - 1)) ? 2 : 1); - return B(z, X)[X]; - } - u(pe, "wrapX"); - var fe = Pe(L, n.direction); - return Vo(fe, w || 0, k !== null && k !== void 0 ? k : A, function (_, he, $, Y) { - var X = $ == "ltr", - z = B(_, X ? "left" : "right"), - ce = B(he - 1, X ? "right" : "left"), - zt = w == null && _ == 0, - $e = k == null && he == A, - re = Y == 0, - We = !fe || Y == fe.length - 1; - if (ce.top - z.top <= 3) { - var V = (f ? zt : $e) && re, - kn = (f ? $e : zt) && We, - Ge = V ? a : (X ? z : ce).left, - gt = kn ? s : (X ? ce : z).right; - h(Ge, z.top, gt - Ge, z.bottom); - } else { - var yt, oe, Gt, Tn; - X ? (yt = f && zt && re ? a : z.left, oe = f ? s : pe(_, $, "before"), Gt = f ? a : pe(he, $, "after"), Tn = f && $e && We ? s : ce.right) : (yt = f ? pe(_, $, "before") : a, oe = !f && zt && re ? s : z.right, Gt = !f && $e && We ? a : ce.left, Tn = f ? pe(he, $, "after") : s), h(yt, z.top, oe - yt, z.bottom), z.bottom < ce.top && h(a, z.bottom, null, ce.top), h(Gt, ce.top, Tn - Gt, ce.bottom); - } - (!E || qr(z, E) < 0) && (E = z), qr(ce, E) < 0 && (E = ce), (!j || qr(z, j) < 0) && (j = z), qr(ce, j) < 0 && (j = ce); - }), { - start: E, - end: j - }; + if (typeof type === 'object' && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || + // This needs to include all possible module reference object + // types supported by any Flight configuration anywhere since + // we don't know which Flight build this will end up being used + // with. + type.$$typeof === REACT_MODULE_REFERENCE || type.getModuleId !== undefined) { + return true; } - u(c, "drawForLine"); - var p = t.from(), - d = t.to(); - if (p.line == d.line) c(p.line, p.ch, d.ch);else { - var v = S(n, p.line), - g = S(n, d.line), - m = Se(v) == Se(g), - b = c(p.line, p.ch, m ? v.text.length + 1 : null).end, - C = c(d.line, m ? 0 : null, d.ch).start; - m && (b.top < C.top - 2 ? (h(b.right, b.top, null, b.bottom), h(a, C.top, C.left, C.bottom)) : h(b.right, b.top, C.left - b.right, b.bottom)), b.bottom < C.top && h(a, b.bottom, null, C.top); - } - i.appendChild(l); - } - u(Qa, "drawSelectionRange"); - function $i(e) { - if (e.state.focused) { - var t = e.display; - clearInterval(t.blinker); - var i = !0; - t.cursorDiv.style.visibility = "", e.options.cursorBlinkRate > 0 ? t.blinker = setInterval(function () { - e.hasFocus() || Dt(e), t.cursorDiv.style.visibility = (i = !i) ? "" : "hidden"; - }, e.options.cursorBlinkRate) : e.options.cursorBlinkRate < 0 && (t.cursorDiv.style.visibility = "hidden"); - } - } - u($i, "restartBlink"); - function Al(e) { - e.hasFocus() || (e.display.input.focus(), e.state.focused || tn(e)); - } - u(Al, "ensureFocus"); - function en(e) { - e.state.delayingBlurEvent = !0, setTimeout(function () { - e.state.delayingBlurEvent && (e.state.delayingBlurEvent = !1, e.state.focused && Dt(e)); - }, 100); } - u(en, "delayBlurEvent"); - function tn(e, t) { - e.state.delayingBlurEvent && !e.state.draggingText && (e.state.delayingBlurEvent = !1), e.options.readOnly != "nocursor" && (e.state.focused || (U(e, "focus", e, t), e.state.focused = !0, it(e.display.wrapper, "CodeMirror-focused"), !e.curOp && e.display.selForContextMenu != e.doc.sel && (e.display.input.reset(), ne && setTimeout(function () { - return e.display.input.reset(!0); - }, 20)), e.display.input.receivedFocus()), $i(e)); - } - u(tn, "onFocus"); - function Dt(e, t) { - e.state.delayingBlurEvent || (e.state.focused && (U(e, "blur", e, t), e.state.focused = !1, tt(e.display.wrapper, "CodeMirror-focused")), clearInterval(e.display.blinker), setTimeout(function () { - e.state.focused || (e.display.shift = !1); - }, 150)); - } - u(Dt, "onBlur"); - function Zr(e) { - for (var t = e.display, i = t.lineDiv.offsetTop, r = Math.max(0, t.scroller.getBoundingClientRect().top), n = t.lineDiv.getBoundingClientRect().top, l = 0, o = 0; o < t.view.length; o++) { - var a = t.view[o], - s = e.options.lineWrapping, - f = void 0, - h = 0; - if (!a.hidden) { - if (n += a.line.height, O && I < 8) { - var c = a.node.offsetTop + a.node.offsetHeight; - f = c - i, i = c; - } else { - var p = a.node.getBoundingClientRect(); - f = p.bottom - p.top, !s && a.text.firstChild && (h = a.text.firstChild.getBoundingClientRect().right - p.left - 1); - } - var d = a.line.height - f; - if ((d > .005 || d < -.005) && (n < r && (l -= d), De(a.line, f), Ol(a.line), a.rest)) for (var v = 0; v < a.rest.length; v++) Ol(a.rest[v]); - if (h > e.display.sizerWidth) { - var g = Math.ceil(h / Mt(e.display)); - g > e.display.maxLineLength && (e.display.maxLineLength = g, e.display.maxLine = a.line, e.display.maxLineChanged = !0); - } - } - } - Math.abs(l) > 2 && (t.scroller.scrollTop += l); + return false; + } + function getWrappedName(outerType, innerType, wrapperName) { + var displayName = outerType.displayName; + if (displayName) { + return displayName; } - u(Zr, "updateHeightsInViewport"); - function Ol(e) { - if (e.widgets) for (var t = 0; t < e.widgets.length; ++t) { - var i = e.widgets[t], - r = i.node.parentNode; - r && (i.height = r.offsetHeight); - } + var functionName = innerType.displayName || innerType.name || ''; + return functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName; + } // Keep in sync with react-reconciler/getComponentNameFromFiber + + function getContextName(type) { + return type.displayName || 'Context'; + } // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead. + + function getComponentNameFromType(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; } - u(Ol, "updateWidgetHeight"); - function Qr(e, t, i) { - var r = i && i.top != null ? Math.max(0, i.top) : e.scroller.scrollTop; - r = Math.floor(r - Kr(e)); - var n = i && i.bottom != null ? i.bottom : r + e.wrapper.clientHeight, - l = at(t, r), - o = at(t, n); - if (i && i.ensure) { - var a = i.ensure.from.line, - s = i.ensure.to.line; - a < l ? (l = a, o = at(t, Ie(S(t, a)) + e.wrapper.clientHeight)) : Math.min(s, t.lastLine()) >= o && (l = at(t, Ie(S(t, s)) - e.wrapper.clientHeight), o = s); + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.'); } - return { - from: l, - to: Math.max(o, l + 1) - }; } - u(Qr, "visibleLines"); - function Ja(e, t) { - if (!q(e, "scrollCursorIntoView")) { - var i = e.display, - r = i.sizer.getBoundingClientRect(), - n = null; - if (t.top + r.top < 0 ? n = !0 : t.bottom + r.top > (window.innerHeight || document.documentElement.clientHeight) && (n = !1), n != null && !Yo) { - var l = T("div", "​", null, `position: absolute; - top: ` + (t.top - i.viewOffset - Kr(e.display)) + `px; - height: ` + (t.bottom - t.top + Ae(e) + i.barHeight) + `px; - left: ` + t.left + "px; width: " + Math.max(2, t.right - t.left) + "px;"); - e.display.lineSpace.appendChild(l), l.scrollIntoView(n), e.display.lineSpace.removeChild(l); - } - } - } - u(Ja, "maybeScrollWindow"); - function ja(e, t, i, r) { - r == null && (r = 0); - var n; - !e.options.lineWrapping && t == i && (i = t.sticky == "before" ? y(t.line, t.ch + 1, "before") : t, t = t.ch ? y(t.line, t.sticky == "before" ? t.ch - 1 : t.ch, "after") : t); - for (var l = 0; l < 5; l++) { - var o = !1, - a = Le(e, t), - s = !i || i == t ? a : Le(e, i); - n = { - left: Math.min(a.left, s.left), - top: Math.min(a.top, s.top) - r, - right: Math.max(a.left, s.left), - bottom: Math.max(a.bottom, s.bottom) + r - }; - var f = rn(e, n), - h = e.doc.scrollTop, - c = e.doc.scrollLeft; - if (f.scrollTop != null && (lr(e, f.scrollTop), Math.abs(e.doc.scrollTop - h) > 1 && (o = !0)), f.scrollLeft != null && (ct(e, f.scrollLeft), Math.abs(e.doc.scrollLeft - c) > 1 && (o = !0)), !o) break; - } - return n; - } - u(ja, "scrollPosIntoView"); - function Va(e, t) { - var i = rn(e, t); - i.scrollTop != null && lr(e, i.scrollTop), i.scrollLeft != null && ct(e, i.scrollLeft); - } - u(Va, "scrollIntoView"); - function rn(e, t) { - var i = e.display, - r = Tt(e.display); - t.top < 0 && (t.top = 0); - var n = e.curOp && e.curOp.scrollTop != null ? e.curOp.scrollTop : i.scroller.scrollTop, - l = Ki(e), - o = {}; - t.bottom - t.top > l && (t.bottom = t.top + l); - var a = e.doc.height + Ui(i), - s = t.top < r, - f = t.bottom > a - r; - if (t.top < n) o.scrollTop = s ? 0 : t.top;else if (t.bottom > n + l) { - var h = Math.min(t.top, (f ? a : t.bottom) - l); - h != n && (o.scrollTop = h); - } - var c = e.options.fixedGutter ? 0 : i.gutters.offsetWidth, - p = e.curOp && e.curOp.scrollLeft != null ? e.curOp.scrollLeft : i.scroller.scrollLeft - c, - d = st(e) - i.gutters.offsetWidth, - v = t.right - t.left > d; - return v && (t.right = t.left + d), t.left < 10 ? o.scrollLeft = 0 : t.left < p ? o.scrollLeft = Math.max(0, t.left + c - (v ? 0 : 10)) : t.right > d + p - 3 && (o.scrollLeft = t.right + (v ? 0 : 10) - d), o; - } - u(rn, "calculateScrollPos"); - function nn(e, t) { - t != null && (Jr(e), e.curOp.scrollTop = (e.curOp.scrollTop == null ? e.doc.scrollTop : e.curOp.scrollTop) + t); - } - u(nn, "addToScrollTop"); - function Nt(e) { - Jr(e); - var t = e.getCursor(); - e.curOp.scrollToPos = { - from: t, - to: t, - margin: e.options.cursorScrollMargin - }; + if (typeof type === 'function') { + return type.displayName || type.name || null; } - u(Nt, "ensureCursorVisible"); - function nr(e, t, i) { - (t != null || i != null) && Jr(e), t != null && (e.curOp.scrollLeft = t), i != null && (e.curOp.scrollTop = i); - } - u(nr, "scrollToCoords"); - function $a(e, t) { - Jr(e), e.curOp.scrollToPos = t; - } - u($a, "scrollToRange"); - function Jr(e) { - var t = e.curOp.scrollToPos; - if (t) { - e.curOp.scrollToPos = null; - var i = Ll(e, t.from), - r = Ll(e, t.to); - Wl(e, i, r, t.margin); - } - } - u(Jr, "resolveScrollToPos"); - function Wl(e, t, i, r) { - var n = rn(e, { - left: Math.min(t.left, i.left), - top: Math.min(t.top, i.top) - r, - right: Math.max(t.right, i.right), - bottom: Math.max(t.bottom, i.bottom) + r - }); - nr(e, n.scrollLeft, n.scrollTop); - } - u(Wl, "scrollToCoordsRange"); - function lr(e, t) { - Math.abs(e.doc.scrollTop - t) < 2 || (Fe || on(e, { - top: t - }), Hl(e, t, !0), Fe && on(e), sr(e, 100)); - } - u(lr, "updateScrollTop"); - function Hl(e, t, i) { - t = Math.max(0, Math.min(e.display.scroller.scrollHeight - e.display.scroller.clientHeight, t)), !(e.display.scroller.scrollTop == t && !i) && (e.doc.scrollTop = t, e.display.scrollbars.setScrollTop(t), e.display.scroller.scrollTop != t && (e.display.scroller.scrollTop = t)); - } - u(Hl, "setScrollTop"); - function ct(e, t, i, r) { - t = Math.max(0, Math.min(t, e.display.scroller.scrollWidth - e.display.scroller.clientWidth)), !((i ? t == e.doc.scrollLeft : Math.abs(e.doc.scrollLeft - t) < 2) && !r) && (e.doc.scrollLeft = t, Rl(e), e.display.scroller.scrollLeft != t && (e.display.scroller.scrollLeft = t), e.display.scrollbars.setScrollLeft(t)); - } - u(ct, "setScrollLeft"); - function or(e) { - var t = e.display, - i = t.gutters.offsetWidth, - r = Math.round(e.doc.height + Ui(e.display)); - return { - clientHeight: t.scroller.clientHeight, - viewHeight: t.wrapper.clientHeight, - scrollWidth: t.scroller.scrollWidth, - clientWidth: t.scroller.clientWidth, - viewWidth: t.wrapper.clientWidth, - barLeft: e.options.fixedGutter ? i : 0, - docHeight: r, - scrollHeight: r + Ae(e) + t.barHeight, - nativeBarWidth: t.nativeBarWidth, - gutterWidth: i - }; + if (typeof type === 'string') { + return type; } - u(or, "measureForScrollbars"); - var dt = u(function (e, t, i) { - this.cm = i; - var r = this.vert = T("div", [T("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"), - n = this.horiz = T("div", [T("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); - r.tabIndex = n.tabIndex = -1, e(r), e(n), M(r, "scroll", function () { - r.clientHeight && t(r.scrollTop, "vertical"); - }), M(n, "scroll", function () { - n.clientWidth && t(n.scrollLeft, "horizontal"); - }), this.checkedZeroWidth = !1, O && I < 8 && (this.horiz.style.minHeight = this.vert.style.minWidth = "18px"); - }, "NativeScrollbars"); - dt.prototype.update = function (e) { - var t = e.scrollWidth > e.clientWidth + 1, - i = e.scrollHeight > e.clientHeight + 1, - r = e.nativeBarWidth; - if (i) { - this.vert.style.display = "block", this.vert.style.bottom = t ? r + "px" : "0"; - var n = e.viewHeight - (t ? r : 0); - this.vert.firstChild.style.height = Math.max(0, e.scrollHeight - e.clientHeight + n) + "px"; - } else this.vert.scrollTop = 0, this.vert.style.display = "", this.vert.firstChild.style.height = "0"; - if (t) { - this.horiz.style.display = "block", this.horiz.style.right = i ? r + "px" : "0", this.horiz.style.left = e.barLeft + "px"; - var l = e.viewWidth - e.barLeft - (i ? r : 0); - this.horiz.firstChild.style.width = Math.max(0, e.scrollWidth - e.clientWidth + l) + "px"; - } else this.horiz.style.display = "", this.horiz.firstChild.style.width = "0"; - return !this.checkedZeroWidth && e.clientHeight > 0 && (r == 0 && this.zeroWidthHack(), this.checkedZeroWidth = !0), { - right: i ? r : 0, - bottom: t ? r : 0 - }; - }, dt.prototype.setScrollLeft = function (e) { - this.horiz.scrollLeft != e && (this.horiz.scrollLeft = e), this.disableHoriz && this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); - }, dt.prototype.setScrollTop = function (e) { - this.vert.scrollTop != e && (this.vert.scrollTop = e), this.disableVert && this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); - }, dt.prototype.zeroWidthHack = function () { - var e = me && !Xo ? "12px" : "18px"; - this.horiz.style.height = this.vert.style.width = e, this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none", this.disableHoriz = new _e(), this.disableVert = new _e(); - }, dt.prototype.enableZeroWidthBar = function (e, t, i) { - e.style.pointerEvents = "auto"; - function r() { - var n = e.getBoundingClientRect(), - l = i == "vert" ? document.elementFromPoint(n.right - 1, (n.top + n.bottom) / 2) : document.elementFromPoint((n.right + n.left) / 2, n.bottom - 1); - l != e ? e.style.pointerEvents = "none" : t.set(1e3, r); - } - u(r, "maybeDisable"), t.set(1e3, r); - }, dt.prototype.clear = function () { - var e = this.horiz.parentNode; - e.removeChild(this.horiz), e.removeChild(this.vert); - }; - var ar = u(function () {}, "NullScrollbars"); - ar.prototype.update = function () { - return { - bottom: 0, - right: 0 - }; - }, ar.prototype.setScrollLeft = function () {}, ar.prototype.setScrollTop = function () {}, ar.prototype.clear = function () {}; - function At(e, t) { - t || (t = or(e)); - var i = e.display.barWidth, - r = e.display.barHeight; - Fl(e, t); - for (var n = 0; n < 4 && i != e.display.barWidth || r != e.display.barHeight; n++) i != e.display.barWidth && e.options.lineWrapping && Zr(e), Fl(e, or(e)), i = e.display.barWidth, r = e.display.barHeight; - } - u(At, "updateScrollbars"); - function Fl(e, t) { - var i = e.display, - r = i.scrollbars.update(t); - i.sizer.style.paddingRight = (i.barWidth = r.right) + "px", i.sizer.style.paddingBottom = (i.barHeight = r.bottom) + "px", i.heightForcer.style.borderBottom = r.bottom + "px solid transparent", r.right && r.bottom ? (i.scrollbarFiller.style.display = "block", i.scrollbarFiller.style.height = r.bottom + "px", i.scrollbarFiller.style.width = r.right + "px") : i.scrollbarFiller.style.display = "", r.bottom && e.options.coverGutterNextToScrollbar && e.options.fixedGutter ? (i.gutterFiller.style.display = "block", i.gutterFiller.style.height = r.bottom + "px", i.gutterFiller.style.width = t.gutterWidth + "px") : i.gutterFiller.style.display = ""; - } - u(Fl, "updateScrollbarsInner"); - var Pl = { - native: dt, - null: ar - }; - function El(e) { - e.display.scrollbars && (e.display.scrollbars.clear(), e.display.scrollbars.addClass && tt(e.display.wrapper, e.display.scrollbars.addClass)), e.display.scrollbars = new Pl[e.options.scrollbarStyle](function (t) { - e.display.wrapper.insertBefore(t, e.display.scrollbarFiller), M(t, "mousedown", function () { - e.state.focused && setTimeout(function () { - return e.display.input.focus(); - }, 0); - }), t.setAttribute("cm-not-content", "true"); - }, function (t, i) { - i == "horizontal" ? ct(e, t) : lr(e, t); - }, e), e.display.scrollbars.addClass && it(e.display.wrapper, e.display.scrollbars.addClass); - } - u(El, "initScrollbars"); - var es = 0; - function pt(e) { - e.curOp = { - cm: e, - viewChanged: !1, - startHeight: e.doc.height, - forceUpdate: !1, - updateInput: 0, - typing: !1, - changeObjs: null, - cursorActivityHandlers: null, - cursorActivityCalled: 0, - selectionChanged: !1, - updateMaxLine: !1, - scrollLeft: null, - scrollTop: null, - scrollToPos: null, - focus: !1, - id: ++es, - markArrays: null - }, Oa(e.curOp); - } - u(pt, "startOperation"); - function vt(e) { - var t = e.curOp; - t && Ha(t, function (i) { - for (var r = 0; r < i.ops.length; r++) i.ops[r].cm.curOp = null; - ts(i); - }); + switch (type) { + case REACT_FRAGMENT_TYPE: + return 'Fragment'; + case REACT_PORTAL_TYPE: + return 'Portal'; + case REACT_PROFILER_TYPE: + return 'Profiler'; + case REACT_STRICT_MODE_TYPE: + return 'StrictMode'; + case REACT_SUSPENSE_TYPE: + return 'Suspense'; + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; } - u(vt, "endOperation"); - function ts(e) { - for (var t = e.ops, i = 0; i < t.length; i++) rs(t[i]); - for (var r = 0; r < t.length; r++) is(t[r]); - for (var n = 0; n < t.length; n++) ns(t[n]); - for (var l = 0; l < t.length; l++) ls(t[l]); - for (var o = 0; o < t.length; o++) os(t[o]); - } - u(ts, "endOperations"); - function rs(e) { - var t = e.cm, - i = t.display; - ss(t), e.updateMaxLine && zi(t), e.mustUpdate = e.viewChanged || e.forceUpdate || e.scrollTop != null || e.scrollToPos && (e.scrollToPos.from.line < i.viewFrom || e.scrollToPos.to.line >= i.viewTo) || i.maxLineChanged && t.options.lineWrapping, e.update = e.mustUpdate && new jr(t, e.mustUpdate && { - top: e.scrollTop, - ensure: e.scrollToPos - }, e.forceUpdate); - } - u(rs, "endOperation_R1"); - function is(e) { - e.updatedDisplay = e.mustUpdate && ln(e.cm, e.update); - } - u(is, "endOperation_W1"); - function ns(e) { - var t = e.cm, - i = t.display; - e.updatedDisplay && Zr(t), e.barMeasure = or(t), i.maxLineChanged && !t.options.lineWrapping && (e.adjustWidthTo = gl(t, i.maxLine, i.maxLine.text.length).left + 3, t.display.sizerWidth = e.adjustWidthTo, e.barMeasure.scrollWidth = Math.max(i.scroller.clientWidth, i.sizer.offsetLeft + e.adjustWidthTo + Ae(t) + t.display.barWidth), e.maxScrollLeft = Math.max(0, i.sizer.offsetLeft + e.adjustWidthTo - st(t))), (e.updatedDisplay || e.selectionChanged) && (e.preparedSelection = i.input.prepareSelection()); - } - u(ns, "endOperation_R2"); - function ls(e) { - var t = e.cm; - e.adjustWidthTo != null && (t.display.sizer.style.minWidth = e.adjustWidthTo + "px", e.maxScrollLeft < t.doc.scrollLeft && ct(t, Math.min(t.display.scroller.scrollLeft, e.maxScrollLeft), !0), t.display.maxLineChanged = !1); - var i = e.focus && e.focus == be(); - e.preparedSelection && t.display.input.showSelection(e.preparedSelection, i), (e.updatedDisplay || e.startHeight != t.doc.height) && At(t, e.barMeasure), e.updatedDisplay && sn(t, e.barMeasure), e.selectionChanged && $i(t), t.state.focused && e.updateInput && t.display.input.reset(e.typing), i && Al(e.cm); - } - u(ls, "endOperation_W2"); - function os(e) { - var t = e.cm, - i = t.display, - r = t.doc; - if (e.updatedDisplay && Il(t, e.update), i.wheelStartX != null && (e.scrollTop != null || e.scrollLeft != null || e.scrollToPos) && (i.wheelStartX = i.wheelStartY = null), e.scrollTop != null && Hl(t, e.scrollTop, e.forceScroll), e.scrollLeft != null && ct(t, e.scrollLeft, !0, !0), e.scrollToPos) { - var n = ja(t, N(r, e.scrollToPos.from), N(r, e.scrollToPos.to), e.scrollToPos.margin); - Ja(t, n); - } - var l = e.maybeHiddenMarkers, - o = e.maybeUnhiddenMarkers; - if (l) for (var a = 0; a < l.length; ++a) l[a].lines.length || U(l[a], "hide"); - if (o) for (var s = 0; s < o.length; ++s) o[s].lines.length && U(o[s], "unhide"); - i.wrapper.offsetHeight && (r.scrollTop = t.display.scroller.scrollTop), e.changeObjs && U(t, "changes", t, e.changeObjs), e.update && e.update.finish(); - } - u(os, "endOperation_finish"); - function de(e, t) { - if (e.curOp) return t(); - pt(e); - try { - return t(); - } finally { - vt(e); + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + '.Consumer'; + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + '.Provider'; + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); + case REACT_MEMO_TYPE: + var outerName = type.displayName || null; + if (outerName !== null) { + return outerName; + } + return getComponentNameFromType(type.type) || 'Memo'; + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + return getComponentNameFromType(init(payload)); + } catch (x) { + return null; + } + } + + // eslint-disable-next-line no-fallthrough } } - u(de, "runInOp"); - function Q(e, t) { - return function () { - if (e.curOp) return t.apply(e, arguments); - pt(e); - try { - return t.apply(e, arguments); - } finally { - vt(e); - } - }; - } - u(Q, "operation"); - function le(e) { - return function () { - if (this.curOp) return e.apply(this, arguments); - pt(this); - try { - return e.apply(this, arguments); - } finally { - vt(this); - } - }; - } - u(le, "methodOp"); - function J(e) { - return function () { - var t = this.cm; - if (!t || t.curOp) return e.apply(this, arguments); - pt(t); - try { - return e.apply(this, arguments); - } finally { - vt(t); - } - }; - } - u(J, "docMethodOp"); - function sr(e, t) { - e.doc.highlightFrontier < e.display.viewTo && e.state.highlight.set(t, pi(as, e)); - } - u(sr, "startWorker"); - function as(e) { - var t = e.doc; - if (!(t.highlightFrontier >= e.display.viewTo)) { - var i = +new Date() + e.options.workTime, - r = jt(e, t.highlightFrontier), - n = []; - t.iter(r.line, Math.min(t.first + t.size, e.display.viewTo + 500), function (l) { - if (r.line >= e.display.viewFrom) { - var o = l.styles, - a = l.text.length > e.options.maxHighlightLength ? lt(t.mode, r.state) : null, - s = _n(e, l, r, !0); - a && (r.state = a), l.styles = s.styles; - var f = l.styleClasses, - h = s.classes; - h ? l.styleClasses = h : f && (l.styleClasses = null); - for (var c = !o || o.length != l.styles.length || f != h && (!f || !h || f.bgClass != h.bgClass || f.textClass != h.textClass), p = 0; !c && p < o.length; ++p) c = o[p] != l.styles[p]; - c && n.push(r.line), l.stateAfter = r.save(), r.nextLine(); - } else l.text.length <= e.options.maxHighlightLength && Fi(e, l.text, r), l.stateAfter = r.line % 5 == 0 ? r.save() : null, r.nextLine(); - if (+new Date() > i) return sr(e, e.options.workDelay), !0; - }), t.highlightFrontier = r.line, t.modeFrontier = Math.max(t.modeFrontier, r.line), n.length && de(e, function () { - for (var l = 0; l < n.length; l++) Ye(e, n[l], "text"); + return null; + } + var assign = Object.assign; + + // Helpers to patch console.logs to avoid logging during side-effect free + // replaying on render function. This currently only patches the object + // lazily which won't cover if the log function was extracted eagerly. + // We could also eagerly patch the method. + var disabledDepth = 0; + var prevLog; + var prevInfo; + var prevWarn; + var prevError; + var prevGroup; + var prevGroupCollapsed; + var prevGroupEnd; + function disabledLog() {} + disabledLog.__reactDisabledLog = true; + function disableLogs() { + { + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 + + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props }); + /* eslint-enable react-internal/no-production-logging */ } + disabledDepth++; } - u(as, "highlightWorker"); - var jr = u(function (e, t, i) { - var r = e.display; - this.viewport = t, this.visible = Qr(r, e.doc, t), this.editorIsHidden = !r.wrapper.offsetWidth, this.wrapperHeight = r.wrapper.clientHeight, this.wrapperWidth = r.wrapper.clientWidth, this.oldDisplayWidth = st(e), this.force = i, this.dims = Qi(e), this.events = []; - }, "DisplayUpdate"); - jr.prototype.signal = function (e, t) { - Ce(e, t) && this.events.push(arguments); - }, jr.prototype.finish = function () { - for (var e = 0; e < this.events.length; e++) U.apply(null, this.events[e]); - }; - function ss(e) { - var t = e.display; - !t.scrollbarsClipped && t.scroller.offsetWidth && (t.nativeBarWidth = t.scroller.offsetWidth - t.scroller.clientWidth, t.heightForcer.style.height = Ae(e) + "px", t.sizer.style.marginBottom = -t.nativeBarWidth + "px", t.sizer.style.borderRightWidth = Ae(e) + "px", t.scrollbarsClipped = !0); - } - u(ss, "maybeClipScrollbars"); - function us(e) { - if (e.hasFocus()) return null; - var t = be(); - if (!t || !Ke(e.display.lineDiv, t)) return null; - var i = { - activeElt: t - }; - if (window.getSelection) { - var r = window.getSelection(); - r.anchorNode && r.extend && Ke(e.display.lineDiv, r.anchorNode) && (i.anchorNode = r.anchorNode, i.anchorOffset = r.anchorOffset, i.focusNode = r.focusNode, i.focusOffset = r.focusOffset); - } - return i; - } - u(us, "selectionSnapshot"); - function fs(e) { - if (!(!e || !e.activeElt || e.activeElt == be()) && (e.activeElt.focus(), !/^(INPUT|TEXTAREA)$/.test(e.activeElt.nodeName) && e.anchorNode && Ke(document.body, e.anchorNode) && Ke(document.body, e.focusNode))) { - var t = window.getSelection(), - i = document.createRange(); - i.setEnd(e.anchorNode, e.anchorOffset), i.collapse(!1), t.removeAllRanges(), t.addRange(i), t.extend(e.focusNode, e.focusOffset); - } - } - u(fs, "restoreSelection"); - function ln(e, t) { - var i = e.display, - r = e.doc; - if (t.editorIsHidden) return qe(e), !1; - if (!t.force && t.visible.from >= i.viewFrom && t.visible.to <= i.viewTo && (i.updateLineNumbers == null || i.updateLineNumbers >= i.viewTo) && i.renderedView == i.view && Dl(e) == 0) return !1; - Bl(e) && (qe(e), t.dims = Qi(e)); - var n = r.first + r.size, - l = Math.max(t.visible.from - e.options.viewportMargin, r.first), - o = Math.min(n, t.visible.to + e.options.viewportMargin); - i.viewFrom < l && l - i.viewFrom < 20 && (l = Math.max(r.first, i.viewFrom)), i.viewTo > o && i.viewTo - o < 20 && (o = Math.min(n, i.viewTo)), Ee && (l = Ri(e.doc, l), o = nl(e.doc, o)); - var a = l != i.viewFrom || o != i.viewTo || i.lastWrapHeight != t.wrapperHeight || i.lastWrapWidth != t.wrapperWidth; - Za(e, l, o), i.viewOffset = Ie(S(e.doc, i.viewFrom)), e.display.mover.style.top = i.viewOffset + "px"; - var s = Dl(e); - if (!a && s == 0 && !t.force && i.renderedView == i.view && (i.updateLineNumbers == null || i.updateLineNumbers >= i.viewTo)) return !1; - var f = us(e); - return s > 4 && (i.lineDiv.style.display = "none"), hs(e, i.updateLineNumbers, t.dims), s > 4 && (i.lineDiv.style.display = ""), i.renderedView = i.view, fs(f), Ue(i.cursorDiv), Ue(i.selectionDiv), i.gutters.style.height = i.sizer.style.minHeight = 0, a && (i.lastWrapHeight = t.wrapperHeight, i.lastWrapWidth = t.wrapperWidth, sr(e, 400)), i.updateLineNumbers = null, !0; - } - u(ln, "updateDisplayIfNeeded"); - function Il(e, t) { - for (var i = t.viewport, r = !0;; r = !1) { - if (!r || !e.options.lineWrapping || t.oldDisplayWidth == st(e)) { - if (i && i.top != null && (i = { - top: Math.min(e.doc.height + Ui(e.display) - Ki(e), i.top) - }), t.visible = Qr(e.display, e.doc, i), t.visible.from >= e.display.viewFrom && t.visible.to <= e.display.viewTo) break; - } else r && (t.visible = Qr(e.display, e.doc, i)); - if (!ln(e, t)) break; - Zr(e); - var n = or(e); - ir(e), At(e, n), sn(e, n), t.force = !1; - } - t.signal(e, "update", e), (e.display.viewFrom != e.display.reportedViewFrom || e.display.viewTo != e.display.reportedViewTo) && (t.signal(e, "viewportChange", e, e.display.viewFrom, e.display.viewTo), e.display.reportedViewFrom = e.display.viewFrom, e.display.reportedViewTo = e.display.viewTo); - } - u(Il, "postUpdateDisplay"); - function on(e, t) { - var i = new jr(e, t); - if (ln(e, i)) { - Zr(e), Il(e, i); - var r = or(e); - ir(e), At(e, r), sn(e, r), i.finish(); - } - } - u(on, "updateDisplaySimple"); - function hs(e, t, i) { - var r = e.display, - n = e.options.lineNumbers, - l = r.lineDiv, - o = l.firstChild; - function a(v) { - var g = v.nextSibling; - return ne && me && e.display.currentWheelTarget == v ? v.style.display = "none" : v.parentNode.removeChild(v), g; - } - u(a, "rm"); - for (var s = r.view, f = r.viewFrom, h = 0; h < s.length; h++) { - var c = s[h]; - if (!c.hidden) if (!c.node || c.node.parentNode != l) { - var p = Ra(e, c, f, i); - l.insertBefore(p, o); - } else { - for (; o != c.node;) o = a(o); - var d = n && t != null && t <= f && c.lineNumber; - c.changes && (ee(c.changes, "gutter") > -1 && (d = !1), ul(e, c, f, i)), d && (Ue(c.lineNumber), c.lineNumber.appendChild(document.createTextNode(Oi(e.options, f)))), o = c.node.nextSibling; - } - f += c.size; - } - for (; o;) o = a(o); - } - u(hs, "patchDisplay"); - function an(e) { - var t = e.gutters.offsetWidth; - e.sizer.style.marginLeft = t + "px", Z(e, "gutterChanged", e); - } - u(an, "updateGutterSpace"); - function sn(e, t) { - e.display.sizer.style.minHeight = t.docHeight + "px", e.display.heightForcer.style.top = t.docHeight + "px", e.display.gutters.style.height = t.docHeight + e.display.barHeight + Ae(e) + "px"; - } - u(sn, "setDocumentHeight"); - function Rl(e) { - var t = e.display, - i = t.view; - if (!(!t.alignWidgets && (!t.gutters.firstChild || !e.options.fixedGutter))) { - for (var r = Ji(t) - t.scroller.scrollLeft + e.doc.scrollLeft, n = t.gutters.offsetWidth, l = r + "px", o = 0; o < i.length; o++) if (!i[o].hidden) { - e.options.fixedGutter && (i[o].gutter && (i[o].gutter.style.left = l), i[o].gutterBackground && (i[o].gutterBackground.style.left = l)); - var a = i[o].alignable; - if (a) for (var s = 0; s < a.length; s++) a[s].style.left = l; - } - e.options.fixedGutter && (t.gutters.style.left = r + n + "px"); - } - } - u(Rl, "alignHorizontally"); - function Bl(e) { - if (!e.options.lineNumbers) return !1; - var t = e.doc, - i = Oi(e.options, t.first + t.size - 1), - r = e.display; - if (i.length != r.lineNumChars) { - var n = r.measure.appendChild(T("div", [T("div", i)], "CodeMirror-linenumber CodeMirror-gutter-elt")), - l = n.firstChild.offsetWidth, - o = n.offsetWidth - l; - return r.lineGutter.style.width = "", r.lineNumInnerWidth = Math.max(l, r.lineGutter.offsetWidth - o) + 1, r.lineNumWidth = r.lineNumInnerWidth + o, r.lineNumChars = r.lineNumInnerWidth ? i.length : -1, r.lineGutter.style.width = r.lineNumWidth + "px", an(e.display), !0; - } - return !1; - } - u(Bl, "maybeUpdateLineNumberWidth"); - function un(e, t) { - for (var i = [], r = !1, n = 0; n < e.length; n++) { - var l = e[n], - o = null; - if (typeof l != "string" && (o = l.style, l = l.className), l == "CodeMirror-linenumbers") if (t) r = !0;else continue; - i.push({ - className: l, - style: o + } + function reenableLogs() { + { + disabledDepth--; + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + var props = { + configurable: true, + enumerable: true, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + log: assign({}, props, { + value: prevLog + }), + info: assign({}, props, { + value: prevInfo + }), + warn: assign({}, props, { + value: prevWarn + }), + error: assign({}, props, { + value: prevError + }), + group: assign({}, props, { + value: prevGroup + }), + groupCollapsed: assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: assign({}, props, { + value: prevGroupEnd + }) }); + /* eslint-enable react-internal/no-production-logging */ } - return t && !r && i.push({ - className: "CodeMirror-linenumbers", - style: null - }), i; - } - u(un, "getGutters"); - function zl(e) { - var t = e.gutters, - i = e.gutterSpecs; - Ue(t), e.lineGutter = null; - for (var r = 0; r < i.length; ++r) { - var n = i[r], - l = n.className, - o = n.style, - a = t.appendChild(T("div", null, "CodeMirror-gutter " + l)); - o && (a.style.cssText = o), l == "CodeMirror-linenumbers" && (e.lineGutter = a, a.style.width = (e.lineNumWidth || 1) + "px"); - } - t.style.display = i.length ? "" : "none", an(e); - } - u(zl, "renderGutters"); - function ur(e) { - zl(e.display), se(e), Rl(e); - } - u(ur, "updateGutters"); - function cs(e, t, i, r) { - var n = this; - this.input = i, n.scrollbarFiller = T("div", null, "CodeMirror-scrollbar-filler"), n.scrollbarFiller.setAttribute("cm-not-content", "true"), n.gutterFiller = T("div", null, "CodeMirror-gutter-filler"), n.gutterFiller.setAttribute("cm-not-content", "true"), n.lineDiv = bt("div", null, "CodeMirror-code"), n.selectionDiv = T("div", null, null, "position: relative; z-index: 1"), n.cursorDiv = T("div", null, "CodeMirror-cursors"), n.measure = T("div", null, "CodeMirror-measure"), n.lineMeasure = T("div", null, "CodeMirror-measure"), n.lineSpace = bt("div", [n.measure, n.lineMeasure, n.selectionDiv, n.cursorDiv, n.lineDiv], null, "position: relative; outline: none"); - var l = bt("div", [n.lineSpace], "CodeMirror-lines"); - n.mover = T("div", [l], null, "position: relative"), n.sizer = T("div", [n.mover], "CodeMirror-sizer"), n.sizerWidth = null, n.heightForcer = T("div", null, null, "position: absolute; height: " + Wn + "px; width: 1px;"), n.gutters = T("div", null, "CodeMirror-gutters"), n.lineGutter = null, n.scroller = T("div", [n.sizer, n.heightForcer, n.gutters], "CodeMirror-scroll"), n.scroller.setAttribute("tabIndex", "-1"), n.wrapper = T("div", [n.scrollbarFiller, n.gutterFiller, n.scroller], "CodeMirror"), n.wrapper.setAttribute("translate", "no"), O && I < 8 && (n.gutters.style.zIndex = -1, n.scroller.style.paddingRight = 0), !ne && !(Fe && Kt) && (n.scroller.draggable = !0), e && (e.appendChild ? e.appendChild(n.wrapper) : e(n.wrapper)), n.viewFrom = n.viewTo = t.first, n.reportedViewFrom = n.reportedViewTo = t.first, n.view = [], n.renderedView = null, n.externalMeasured = null, n.viewOffset = 0, n.lastWrapHeight = n.lastWrapWidth = 0, n.updateLineNumbers = null, n.nativeBarWidth = n.barHeight = n.barWidth = 0, n.scrollbarsClipped = !1, n.lineNumWidth = n.lineNumInnerWidth = n.lineNumChars = null, n.alignWidgets = !1, n.cachedCharWidth = n.cachedTextHeight = n.cachedPaddingH = null, n.maxLine = null, n.maxLineLength = 0, n.maxLineChanged = !1, n.wheelDX = n.wheelDY = n.wheelStartX = n.wheelStartY = null, n.shift = !1, n.selForContextMenu = null, n.activeTouch = null, n.gutterSpecs = un(r.gutters, r.lineNumbers), zl(n), i.init(n); - } - u(cs, "Display"); - var Vr = 0, - Be = null; - O ? Be = -.53 : Fe ? Be = 15 : Tr ? Be = -.7 : Mr && (Be = -1 / 3); - function Gl(e) { - var t = e.wheelDeltaX, - i = e.wheelDeltaY; - return t == null && e.detail && e.axis == e.HORIZONTAL_AXIS && (t = e.detail), i == null && e.detail && e.axis == e.VERTICAL_AXIS ? i = e.detail : i == null && (i = e.wheelDelta), { - x: t, - y: i - }; - } - u(Gl, "wheelEventDelta"); - function ds(e) { - var t = Gl(e); - return t.x *= Be, t.y *= Be, t; - } - u(ds, "wheelEventPixels"); - function Ul(e, t) { - var i = Gl(t), - r = i.x, - n = i.y, - l = Be; - t.deltaMode === 0 && (r = t.deltaX, n = t.deltaY, l = 1); - var o = e.display, - a = o.scroller, - s = a.scrollWidth > a.clientWidth, - f = a.scrollHeight > a.clientHeight; - if (r && s || n && f) { - if (n && me && ne) { - e: for (var h = t.target, c = o.view; h != a; h = h.parentNode) for (var p = 0; p < c.length; p++) if (c[p].node == h) { - e.display.currentWheelTarget = h; - break e; - } - } - if (r && !Fe && !we && l != null) { - n && f && lr(e, Math.max(0, a.scrollTop + n * l)), ct(e, Math.max(0, a.scrollLeft + r * l)), (!n || n && f) && ae(t), o.wheelStartX = null; - return; - } - if (n && l != null) { - var d = n * l, - v = e.doc.scrollTop, - g = v + o.wrapper.clientHeight; - d < 0 ? v = Math.max(0, v + d - 50) : g = Math.min(e.doc.height, g + d + 50), on(e, { - top: v, - bottom: g - }); - } - Vr < 20 && t.deltaMode !== 0 && (o.wheelStartX == null ? (o.wheelStartX = a.scrollLeft, o.wheelStartY = a.scrollTop, o.wheelDX = r, o.wheelDY = n, setTimeout(function () { - if (o.wheelStartX != null) { - var m = a.scrollLeft - o.wheelStartX, - b = a.scrollTop - o.wheelStartY, - C = b && o.wheelDY && b / o.wheelDY || m && o.wheelDX && m / o.wheelDX; - o.wheelStartX = o.wheelStartY = null, C && (Be = (Be * Vr + C) / (Vr + 1), ++Vr); - } - }, 200)) : (o.wheelDX += r, o.wheelDY += n)); + if (disabledDepth < 0) { + error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); } } - u(Ul, "onScrollWheel"); - var ye = u(function (e, t) { - this.ranges = e, this.primIndex = t; - }, "Selection"); - ye.prototype.primary = function () { - return this.ranges[this.primIndex]; - }, ye.prototype.equals = function (e) { - if (e == this) return !0; - if (e.primIndex != this.primIndex || e.ranges.length != this.ranges.length) return !1; - for (var t = 0; t < this.ranges.length; t++) { - var i = this.ranges[t], - r = e.ranges[t]; - if (!Wi(i.anchor, r.anchor) || !Wi(i.head, r.head)) return !1; - } - return !0; - }, ye.prototype.deepCopy = function () { - for (var e = [], t = 0; t < this.ranges.length; t++) e[t] = new W(Hi(this.ranges[t].anchor), Hi(this.ranges[t].head)); - return new ye(e, this.primIndex); - }, ye.prototype.somethingSelected = function () { - for (var e = 0; e < this.ranges.length; e++) if (!this.ranges[e].empty()) return !0; - return !1; - }, ye.prototype.contains = function (e, t) { - t || (t = e); - for (var i = 0; i < this.ranges.length; i++) { - var r = this.ranges[i]; - if (D(t, r.from()) >= 0 && D(e, r.to()) <= 0) return i; - } - return -1; - }; - var W = u(function (e, t) { - this.anchor = e, this.head = t; - }, "Range"); - W.prototype.from = function () { - return Pr(this.anchor, this.head); - }, W.prototype.to = function () { - return Fr(this.anchor, this.head); - }, W.prototype.empty = function () { - return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch; - }; - function ke(e, t, i) { - var r = e && e.options.selectionsMayTouch, - n = t[i]; - t.sort(function (p, d) { - return D(p.from(), d.from()); - }), i = ee(t, n); - for (var l = 1; l < t.length; l++) { - var o = t[l], - a = t[l - 1], - s = D(a.to(), o.from()); - if (r && !o.empty() ? s > 0 : s >= 0) { - var f = Pr(a.from(), o.from()), - h = Fr(a.to(), o.to()), - c = a.empty() ? o.from() == o.head : a.from() == a.head; - l <= i && --i, t.splice(--l, 2, new W(c ? h : f, c ? f : h)); - } - } - return new ye(t, i); - } - u(ke, "normalizeSelection"); - function Ze(e, t) { - return new ye([new W(e, t || e)], 0); - } - u(Ze, "simpleSelection"); - function Qe(e) { - return e.text ? y(e.from.line + e.text.length - 1, H(e.text).length + (e.text.length == 1 ? e.from.ch : 0)) : e.to; - } - u(Qe, "changeEnd"); - function Kl(e, t) { - if (D(e, t.from) < 0) return e; - if (D(e, t.to) <= 0) return Qe(t); - var i = e.line + t.text.length - (t.to.line - t.from.line) - 1, - r = e.ch; - return e.line == t.to.line && (r += Qe(t).ch - t.to.ch), y(i, r); - } - u(Kl, "adjustForChange"); - function fn(e, t) { - for (var i = [], r = 0; r < e.sel.ranges.length; r++) { - var n = e.sel.ranges[r]; - i.push(new W(Kl(n.anchor, t), Kl(n.head, t))); - } - return ke(e.cm, i, e.sel.primIndex); - } - u(fn, "computeSelAfterChange"); - function _l(e, t, i) { - return e.line == t.line ? y(i.line, e.ch - t.ch + i.ch) : y(i.line + (e.line - t.line), e.ch); - } - u(_l, "offsetPos"); - function ps(e, t, i) { - for (var r = [], n = y(e.first, 0), l = n, o = 0; o < t.length; o++) { - var a = t[o], - s = _l(a.from, n, l), - f = _l(Qe(a), n, l); - if (n = a.to, l = f, i == "around") { - var h = e.sel.ranges[o], - c = D(h.head, h.anchor) < 0; - r[o] = new W(c ? f : s, c ? s : f); - } else r[o] = new W(s, s); - } - return new ye(r, e.sel.primIndex); - } - u(ps, "computeReplacedSel"); - function hn(e) { - e.doc.mode = Di(e.options, e.doc.modeOption), fr(e); - } - u(hn, "loadMode"); - function fr(e) { - e.doc.iter(function (t) { - t.stateAfter && (t.stateAfter = null), t.styles && (t.styles = null); - }), e.doc.modeFrontier = e.doc.highlightFrontier = e.doc.first, sr(e, 100), e.state.modeGen++, e.curOp && se(e); - } - u(fr, "resetModeState"); - function Xl(e, t) { - return t.from.ch == 0 && t.to.ch == 0 && H(t.text) == "" && (!e.cm || e.cm.options.wholeLineUpdateBefore); - } - u(Xl, "isWholeLineUpdate"); - function cn(e, t, i, r) { - function n(C) { - return i ? i[C] : null; - } - u(n, "spansFor"); - function l(C, x, w) { - wa(C, x, w, r), Z(C, "change", C, t); - } - u(l, "update"); - function o(C, x) { - for (var w = [], k = C; k < x; ++k) w.push(new St(f[k], n(k), r)); - return w; - } - u(o, "linesFor"); - var a = t.from, - s = t.to, - f = t.text, - h = S(e, a.line), - c = S(e, s.line), - p = H(f), - d = n(f.length - 1), - v = s.line - a.line; - if (t.full) e.insert(0, o(0, f.length)), e.remove(f.length, e.size - f.length);else if (Xl(e, t)) { - var g = o(0, f.length - 1); - l(c, c.text, d), v && e.remove(a.line, v), g.length && e.insert(a.line, g); - } else if (h == c) { - if (f.length == 1) l(h, h.text.slice(0, a.ch) + p + h.text.slice(s.ch), d);else { - var m = o(1, f.length - 1); - m.push(new St(p + h.text.slice(s.ch), d, r)), l(h, h.text.slice(0, a.ch) + f[0], n(0)), e.insert(a.line + 1, m); - } - } else if (f.length == 1) l(h, h.text.slice(0, a.ch) + f[0] + c.text.slice(s.ch), n(0)), e.remove(a.line + 1, v);else { - l(h, h.text.slice(0, a.ch) + f[0], n(0)), l(c, p + c.text.slice(s.ch), d); - var b = o(1, f.length - 1); - v > 1 && e.remove(a.line + 1, v - 1), e.insert(a.line + 1, b); - } - Z(e, "change", e, t); - } - u(cn, "updateDoc"); - function Je(e, t, i) { - function r(n, l, o) { - if (n.linked) for (var a = 0; a < n.linked.length; ++a) { - var s = n.linked[a]; - if (s.doc != l) { - var f = o && s.sharedHist; - i && !f || (t(s.doc, f), r(s.doc, n, f)); - } + } + var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; + var prefix; + function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === undefined) { + // Extract the VM specific prefix used by each line. + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ''; } - } - u(r, "propagate"), r(e, null, !0); - } - u(Je, "linkedDocs"); - function Yl(e, t) { - if (t.cm) throw new Error("This document is already in use."); - e.doc = t, t.cm = e, ji(e), hn(e), ql(e), e.options.direction = t.direction, e.options.lineWrapping || zi(e), e.options.mode = t.modeOption, se(e); - } - u(Yl, "attachDoc"); - function ql(e) { - (e.doc.direction == "rtl" ? it : tt)(e.display.lineDiv, "CodeMirror-rtl"); - } - u(ql, "setDirectionClass"); - function vs(e) { - de(e, function () { - ql(e), se(e); - }); - } - u(vs, "directionChanged"); - function $r(e) { - this.done = [], this.undone = [], this.undoDepth = e ? e.undoDepth : 1 / 0, this.lastModTime = this.lastSelTime = 0, this.lastOp = this.lastSelOp = null, this.lastOrigin = this.lastSelOrigin = null, this.generation = this.maxGeneration = e ? e.maxGeneration : 1; - } - u($r, "History"); - function dn(e, t) { - var i = { - from: Hi(t.from), - to: Qe(t), - text: ot(e, t.from, t.to) - }; - return Jl(e, i, t.from.line, t.to.line + 1), Je(e, function (r) { - return Jl(r, i, t.from.line, t.to.line + 1); - }, !0), i; - } - u(dn, "historyChangeFromChange"); - function Zl(e) { - for (; e.length;) { - var t = H(e); - if (t.ranges) e.pop();else break; - } - } - u(Zl, "clearSelectionEvents"); - function gs(e, t) { - if (t) return Zl(e.done), H(e.done); - if (e.done.length && !H(e.done).ranges) return H(e.done); - if (e.done.length > 1 && !e.done[e.done.length - 2].ranges) return e.done.pop(), H(e.done); - } - u(gs, "lastChangeEvent"); - function Ql(e, t, i, r) { - var n = e.history; - n.undone.length = 0; - var l = +new Date(), - o, - a; - if ((n.lastOp == r || n.lastOrigin == t.origin && t.origin && (t.origin.charAt(0) == "+" && n.lastModTime > l - (e.cm ? e.cm.options.historyEventDelay : 500) || t.origin.charAt(0) == "*")) && (o = gs(n, n.lastOp == r))) a = H(o.changes), D(t.from, t.to) == 0 && D(t.from, a.to) == 0 ? a.to = Qe(t) : o.changes.push(dn(e, t));else { - var s = H(n.done); - for ((!s || !s.ranges) && ei(e.sel, n.done), o = { - changes: [dn(e, t)], - generation: n.generation - }, n.done.push(o); n.done.length > n.undoDepth;) n.done.shift(), n.done[0].ranges || n.done.shift(); - } - n.done.push(i), n.generation = ++n.maxGeneration, n.lastModTime = n.lastSelTime = l, n.lastOp = n.lastSelOp = r, n.lastOrigin = n.lastSelOrigin = t.origin, a || U(e, "historyAdded"); - } - u(Ql, "addChangeToHistory"); - function ys(e, t, i, r) { - var n = t.charAt(0); - return n == "*" || n == "+" && i.ranges.length == r.ranges.length && i.somethingSelected() == r.somethingSelected() && new Date() - e.history.lastSelTime <= (e.cm ? e.cm.options.historyEventDelay : 500); - } - u(ys, "selectionEventCanBeMerged"); - function ms(e, t, i, r) { - var n = e.history, - l = r && r.origin; - i == n.lastSelOp || l && n.lastSelOrigin == l && (n.lastModTime == n.lastSelTime && n.lastOrigin == l || ys(e, l, H(n.done), t)) ? n.done[n.done.length - 1] = t : ei(t, n.done), n.lastSelTime = +new Date(), n.lastSelOrigin = l, n.lastSelOp = i, r && r.clearRedo !== !1 && Zl(n.undone); - } - u(ms, "addSelectionToHistory"); - function ei(e, t) { - var i = H(t); - i && i.ranges && i.equals(e) || t.push(e); - } - u(ei, "pushSelectionToHistory"); - function Jl(e, t, i, r) { - var n = t["spans_" + e.id], - l = 0; - e.iter(Math.max(e.first, i), Math.min(e.first + e.size, r), function (o) { - o.markedSpans && ((n || (n = t["spans_" + e.id] = {}))[l] = o.markedSpans), ++l; - }); + } // We use the prefix to ensure our stacks line up with native stack frames. + + return '\n' + prefix + name; } - u(Jl, "attachLocalSpans"); - function bs(e) { - if (!e) return null; - for (var t, i = 0; i < e.length; ++i) e[i].marker.explicitlyCleared ? t || (t = e.slice(0, i)) : t && t.push(e[i]); - return t ? t.length ? t : null : e; - } - u(bs, "removeClearedSpans"); - function xs(e, t) { - var i = t["spans_" + e.id]; - if (!i) return null; - for (var r = [], n = 0; n < t.text.length; ++n) r.push(bs(i[n])); - return r; + } + var reentry = false; + var componentFrameCache; + { + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); + } + function describeNativeComponentFrame(fn, construct) { + // If something asked for a stack inside a fake render, it should get ignored. + if (!fn || reentry) { + return ''; } - u(xs, "getOldSpans"); - function jl(e, t) { - var i = xs(e, t), - r = Ei(e, t); - if (!i) return r; - if (!r) return i; - for (var n = 0; n < i.length; ++n) { - var l = i[n], - o = r[n]; - if (l && o) e: for (var a = 0; a < o.length; ++a) { - for (var s = o[a], f = 0; f < l.length; ++f) if (l[f].marker == s.marker) continue e; - l.push(s); - } else o && (i[n] = o); - } - return i; - } - u(jl, "mergeOldSpans"); - function Ot(e, t, i) { - for (var r = [], n = 0; n < e.length; ++n) { - var l = e[n]; - if (l.ranges) { - r.push(i ? ye.prototype.deepCopy.call(l) : l); - continue; - } - var o = l.changes, - a = []; - r.push({ - changes: a - }); - for (var s = 0; s < o.length; ++s) { - var f = o[s], - h = void 0; - if (a.push({ - from: f.from, - to: f.to, - text: f.text - }), t) for (var c in f) (h = c.match(/^spans_(\d+)$/)) && ee(t, Number(h[1])) > -1 && (H(a)[c] = f[c], delete f[c]); - } + { + var frame = componentFrameCache.get(fn); + if (frame !== undefined) { + return frame; } - return r; } - u(Ot, "copyHistoryArray"); - function pn(e, t, i, r) { - if (r) { - var n = e.anchor; - if (i) { - var l = D(t, n) < 0; - l != D(i, n) < 0 ? (n = t, t = i) : l != D(t, i) < 0 && (t = i); - } - return new W(n, t); - } else return new W(i || t, t); - } - u(pn, "extendRange"); - function ti(e, t, i, r, n) { - n == null && (n = e.cm && (e.cm.display.shift || e.extend)), te(e, new ye([pn(e.sel.primary(), t, i, n)], 0), r); - } - u(ti, "extendSelection"); - function Vl(e, t, i) { - for (var r = [], n = e.cm && (e.cm.display.shift || e.extend), l = 0; l < e.sel.ranges.length; l++) r[l] = pn(e.sel.ranges[l], t[l], null, n); - var o = ke(e.cm, r, e.sel.primIndex); - te(e, o, i); - } - u(Vl, "extendSelections"); - function vn(e, t, i, r) { - var n = e.sel.ranges.slice(0); - n[t] = i, te(e, ke(e.cm, n, e.sel.primIndex), r); - } - u(vn, "replaceOneSelection"); - function $l(e, t, i, r) { - te(e, Ze(t, i), r); - } - u($l, "setSimpleSelection"); - function Cs(e, t, i) { - var r = { - ranges: t.ranges, - update: function (n) { - this.ranges = []; - for (var l = 0; l < n.length; l++) this.ranges[l] = new W(N(e, n[l].anchor), N(e, n[l].head)); - }, - origin: i && i.origin - }; - return U(e, "beforeSelectionChange", e, r), e.cm && U(e.cm, "beforeSelectionChange", e.cm, r), r.ranges != t.ranges ? ke(e.cm, r.ranges, r.ranges.length - 1) : t; - } - u(Cs, "filterSelectionChange"); - function eo(e, t, i) { - var r = e.history.done, - n = H(r); - n && n.ranges ? (r[r.length - 1] = t, ri(e, t, i)) : te(e, t, i); - } - u(eo, "setSelectionReplaceHistory"); - function te(e, t, i) { - ri(e, t, i), ms(e, e.sel, e.cm ? e.cm.curOp.id : NaN, i); - } - u(te, "setSelection"); - function ri(e, t, i) { - (Ce(e, "beforeSelectionChange") || e.cm && Ce(e.cm, "beforeSelectionChange")) && (t = Cs(e, t, i)); - var r = i && i.bias || (D(t.primary().head, e.sel.primary().head) < 0 ? -1 : 1); - to(e, io(e, t, r, !0)), !(i && i.scroll === !1) && e.cm && e.cm.getOption("readOnly") != "nocursor" && Nt(e.cm); - } - u(ri, "setSelectionNoUndo"); - function to(e, t) { - t.equals(e.sel) || (e.sel = t, e.cm && (e.cm.curOp.updateInput = 1, e.cm.curOp.selectionChanged = !0, Rn(e.cm)), Z(e, "cursorActivity", e)); - } - u(to, "setSelectionInner"); - function ro(e) { - to(e, io(e, e.sel, null, !1)); - } - u(ro, "reCheckSelection"); - function io(e, t, i, r) { - for (var n, l = 0; l < t.ranges.length; l++) { - var o = t.ranges[l], - a = t.ranges.length == e.sel.ranges.length && e.sel.ranges[l], - s = ii(e, o.anchor, a && a.anchor, i, r), - f = ii(e, o.head, a && a.head, i, r); - (n || s != o.anchor || f != o.head) && (n || (n = t.ranges.slice(0, l)), n[l] = new W(s, f)); - } - return n ? ke(e.cm, n, t.primIndex) : t; - } - u(io, "skipAtomicInSelection"); - function Wt(e, t, i, r, n) { - var l = S(e, t.line); - if (l.markedSpans) for (var o = 0; o < l.markedSpans.length; ++o) { - var a = l.markedSpans[o], - s = a.marker, - f = "selectLeft" in s ? !s.selectLeft : s.inclusiveLeft, - h = "selectRight" in s ? !s.selectRight : s.inclusiveRight; - if ((a.from == null || (f ? a.from <= t.ch : a.from < t.ch)) && (a.to == null || (h ? a.to >= t.ch : a.to > t.ch))) { - if (n && (U(s, "beforeCursorEnter"), s.explicitlyCleared)) if (l.markedSpans) { - --o; - continue; - } else break; - if (!s.atomic) continue; - if (i) { - var c = s.find(r < 0 ? 1 : -1), - p = void 0; - if ((r < 0 ? h : f) && (c = no(e, c, -r, c && c.line == t.line ? l : null)), c && c.line == t.line && (p = D(c, i)) && (r < 0 ? p < 0 : p > 0)) return Wt(e, c, t, r, n); - } - var d = s.find(r < 0 ? -1 : 1); - return (r < 0 ? f : h) && (d = no(e, d, r, d.line == t.line ? l : null)), d ? Wt(e, d, t, r, n) : null; - } - } - return t; - } - u(Wt, "skipAtomicInner"); - function ii(e, t, i, r, n) { - var l = r || 1, - o = Wt(e, t, i, l, n) || !n && Wt(e, t, i, l, !0) || Wt(e, t, i, -l, n) || !n && Wt(e, t, i, -l, !0); - return o || (e.cantEdit = !0, y(e.first, 0)); - } - u(ii, "skipAtomic"); - function no(e, t, i, r) { - return i < 0 && t.ch == 0 ? t.line > e.first ? N(e, y(t.line - 1)) : null : i > 0 && t.ch == (r || S(e, t.line)).text.length ? t.line < e.first + e.size - 1 ? y(t.line + 1, 0) : null : new y(t.line, t.ch + i); - } - u(no, "movePos"); - function lo(e) { - e.setSelection(y(e.firstLine(), 0), y(e.lastLine()), Me); - } - u(lo, "selectAll"); - function oo(e, t, i) { - var r = { - canceled: !1, - from: t.from, - to: t.to, - text: t.text, - origin: t.origin, - cancel: function () { - return r.canceled = !0; - } - }; - return i && (r.update = function (n, l, o, a) { - n && (r.from = N(e, n)), l && (r.to = N(e, l)), o && (r.text = o), a !== void 0 && (r.origin = a); - }), U(e, "beforeChange", e, r), e.cm && U(e.cm, "beforeChange", e.cm, r), r.canceled ? (e.cm && (e.cm.curOp.updateInput = 2), null) : { - from: r.from, - to: r.to, - text: r.text, - origin: r.origin - }; + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. + + Error.prepareStackTrace = undefined; + var previousDispatcher; + { + previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function + // for warnings. + + ReactCurrentDispatcher.current = null; + disableLogs(); } - u(oo, "filterChange"); - function Ht(e, t, i) { - if (e.cm) { - if (!e.cm.curOp) return Q(e.cm, Ht)(e, t, i); - if (e.cm.state.suppressEdits) return; - } - if (!((Ce(e, "beforeChange") || e.cm && Ce(e.cm, "beforeChange")) && (t = oo(e, t, !0), !t))) { - var r = jn && !i && ma(e, t.from, t.to); - if (r) for (var n = r.length - 1; n >= 0; --n) ao(e, { - from: r[n].from, - to: r[n].to, - text: n ? [""] : t.text, - origin: t.origin - });else ao(e, t); - } - } - u(Ht, "makeChange"); - function ao(e, t) { - if (!(t.text.length == 1 && t.text[0] == "" && D(t.from, t.to) == 0)) { - var i = fn(e, t); - Ql(e, t, i, e.cm ? e.cm.curOp.id : NaN), hr(e, t, i, Ei(e, t)); - var r = []; - Je(e, function (n, l) { - !l && ee(r, n.history) == -1 && (ho(n.history, t), r.push(n.history)), hr(n, t, null, Ei(n, t)); + try { + // This should throw. + if (construct) { + // Something should be setting the props in the constructor. + var Fake = function () { + throw Error(); + }; // $FlowFixMe + + Object.defineProperty(Fake.prototype, 'props', { + set: function () { + // We use a throwing setter instead of frozen or non-writable props + // because that won't throw in a non-strict mode function. + throw Error(); + } }); - } - } - u(ao, "makeChangeInner"); - function ni(e, t, i) { - var r = e.cm && e.cm.state.suppressEdits; - if (!(r && !i)) { - for (var n = e.history, l, o = e.sel, a = t == "undo" ? n.done : n.undone, s = t == "undo" ? n.undone : n.done, f = 0; f < a.length && (l = a[f], !(i ? l.ranges && !l.equals(e.sel) : !l.ranges)); f++); - if (f != a.length) { - for (n.lastOrigin = n.lastSelOrigin = null;;) if (l = a.pop(), l.ranges) { - if (ei(l, s), i && !l.equals(e.sel)) { - te(e, l, { - clearRedo: !1 - }); - return; - } - o = l; - } else if (r) { - a.push(l); - return; - } else break; - var h = []; - ei(o, s), s.push({ - changes: h, - generation: n.generation - }), n.generation = l.generation || ++n.maxGeneration; - for (var c = Ce(e, "beforeChange") || e.cm && Ce(e.cm, "beforeChange"), p = u(function (g) { - var m = l.changes[g]; - if (m.origin = t, c && !oo(e, m, !1)) return a.length = 0, {}; - h.push(dn(e, m)); - var b = g ? fn(e, m) : H(a); - hr(e, m, b, jl(e, m)), !g && e.cm && e.cm.scrollIntoView({ - from: m.from, - to: Qe(m) - }); - var C = []; - Je(e, function (x, w) { - !w && ee(C, x.history) == -1 && (ho(x.history, m), C.push(x.history)), hr(x, m, null, jl(x, m)); - }); - }, "loop"), d = l.changes.length - 1; d >= 0; --d) { - var v = p(d); - if (v) return v.v; + if (typeof Reflect === 'object' && Reflect.construct) { + // We construct a different control for this case to include any extra + // frames added by the construct call. + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; } - } - } - } - u(ni, "makeChangeFromHistory"); - function so(e, t) { - if (t != 0 && (e.first += t, e.sel = new ye(Or(e.sel.ranges, function (n) { - return new W(y(n.anchor.line + t, n.anchor.ch), y(n.head.line + t, n.head.ch)); - }), e.sel.primIndex), e.cm)) { - se(e.cm, e.first, e.first - t, t); - for (var i = e.cm.display, r = i.viewFrom; r < i.viewTo; r++) Ye(e.cm, r, "gutter"); - } - } - u(so, "shiftDoc"); - function hr(e, t, i, r) { - if (e.cm && !e.cm.curOp) return Q(e.cm, hr)(e, t, i, r); - if (t.to.line < e.first) { - so(e, t.text.length - 1 - (t.to.line - t.from.line)); - return; - } - if (!(t.from.line > e.lastLine())) { - if (t.from.line < e.first) { - var n = t.text.length - 1 - (e.first - t.from.line); - so(e, n), t = { - from: y(e.first, 0), - to: y(t.to.line + n, t.to.ch), - text: [H(t.text)], - origin: t.origin - }; - } - var l = e.lastLine(); - t.to.line > l && (t = { - from: t.from, - to: y(l, S(e, l).text.length), - text: [t.text[0]], - origin: t.origin - }), t.removed = ot(e, t.from, t.to), i || (i = fn(e, t)), e.cm ? ws(e.cm, t, r) : cn(e, t, r), ri(e, i, Me), e.cantEdit && ii(e, y(e.firstLine(), 0)) && (e.cantEdit = !1); - } - } - u(hr, "makeChangeSingleDoc"); - function ws(e, t, i) { - var r = e.doc, - n = e.display, - l = t.from, - o = t.to, - a = !1, - s = l.line; - e.options.lineWrapping || (s = F(Se(S(r, l.line))), r.iter(s, o.line + 1, function (d) { - if (d == n.maxLine) return a = !0, !0; - })), r.sel.contains(t.from, t.to) > -1 && Rn(e), cn(r, t, i, Ml(e)), e.options.lineWrapping || (r.iter(s, l.line + t.text.length, function (d) { - var v = Gr(d); - v > n.maxLineLength && (n.maxLine = d, n.maxLineLength = v, n.maxLineChanged = !0, a = !1); - }), a && (e.curOp.updateMaxLine = !0)), ha(r, l.line), sr(e, 400); - var f = t.text.length - (o.line - l.line) - 1; - t.full ? se(e) : l.line == o.line && t.text.length == 1 && !Xl(e.doc, t) ? Ye(e, l.line, "text") : se(e, l.line, o.line + 1, f); - var h = Ce(e, "changes"), - c = Ce(e, "change"); - if (c || h) { - var p = { - from: l, - to: o, - text: t.text, - removed: t.removed, - origin: t.origin - }; - c && Z(e, "change", e, p), h && (e.curOp.changeObjs || (e.curOp.changeObjs = [])).push(p); - } - e.display.selForContextMenu = null; - } - u(ws, "makeChangeSingleDocInEditor"); - function Ft(e, t, i, r, n) { - var l; - r || (r = i), D(r, i) < 0 && (l = [r, i], i = l[0], r = l[1]), typeof t == "string" && (t = e.splitLines(t)), Ht(e, { - from: i, - to: r, - text: t, - origin: n - }); - } - u(Ft, "replaceRange"); - function uo(e, t, i, r) { - i < e.line ? e.line += r : t < e.line && (e.line = t, e.ch = 0); - } - u(uo, "rebaseHistSelSingle"); - function fo(e, t, i, r) { - for (var n = 0; n < e.length; ++n) { - var l = e[n], - o = !0; - if (l.ranges) { - l.copied || (l = e[n] = l.deepCopy(), l.copied = !0); - for (var a = 0; a < l.ranges.length; a++) uo(l.ranges[a].anchor, t, i, r), uo(l.ranges[a].head, t, i, r); - continue; - } - for (var s = 0; s < l.changes.length; ++s) { - var f = l.changes[s]; - if (i < f.from.line) f.from = y(f.from.line + r, f.from.ch), f.to = y(f.to.line + r, f.to.ch);else if (t <= f.to.line) { - o = !1; - break; + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; } + fn.call(Fake.prototype); } - o || (e.splice(0, n + 1), n = 0); - } - } - u(fo, "rebaseHistArray"); - function ho(e, t) { - var i = t.from.line, - r = t.to.line, - n = t.text.length - (r - i) - 1; - fo(e.done, i, r, n), fo(e.undone, i, r, n); - } - u(ho, "rebaseHist"); - function cr(e, t, i, r) { - var n = t, - l = t; - return typeof t == "number" ? l = S(e, Un(e, t)) : n = F(t), n == null ? null : (r(l, n) && e.cm && Ye(e.cm, n, i), l); - } - u(cr, "changeLine"); - function dr(e) { - this.lines = e, this.parent = null; - for (var t = 0, i = 0; i < e.length; ++i) e[i].parent = this, t += e[i].height; - this.height = t; - } - u(dr, "LeafChunk"), dr.prototype = { - chunkSize: function () { - return this.lines.length; - }, - removeInner: function (e, t) { - for (var i = e, r = e + t; i < r; ++i) { - var n = this.lines[i]; - this.height -= n.height, Sa(n), Z(n, "delete"); + } else { + try { + throw Error(); + } catch (x) { + control = x; } - this.lines.splice(e, t); - }, - collapse: function (e) { - e.push.apply(e, this.lines); - }, - insertInner: function (e, t, i) { - this.height += i, this.lines = this.lines.slice(0, e).concat(t).concat(this.lines.slice(e)); - for (var r = 0; r < t.length; ++r) t[r].parent = this; - }, - iterN: function (e, t, i) { - for (var r = e + t; e < r; ++e) if (i(this.lines[e])) return !0; - } - }; - function pr(e) { - this.children = e; - for (var t = 0, i = 0, r = 0; r < e.length; ++r) { - var n = e[r]; - t += n.chunkSize(), i += n.height, n.parent = this; + fn(); } - this.size = t, this.height = i, this.parent = null; - } - u(pr, "BranchChunk"), pr.prototype = { - chunkSize: function () { - return this.size; - }, - removeInner: function (e, t) { - this.size -= t; - for (var i = 0; i < this.children.length; ++i) { - var r = this.children[i], - n = r.chunkSize(); - if (e < n) { - var l = Math.min(t, n - e), - o = r.height; - if (r.removeInner(e, l), this.height -= o - r.height, n == l && (this.children.splice(i--, 1), r.parent = null), (t -= l) == 0) break; - e = 0; - } else e -= n; - } - if (this.size - t < 25 && (this.children.length > 1 || !(this.children[0] instanceof dr))) { - var a = []; - this.collapse(a), this.children = [new dr(a)], this.children[0].parent = this; + } catch (sample) { + // This is inlined manually because closure doesn't do it for us. + if (sample && control && typeof sample.stack === 'string') { + // This extracts the first frame from the sample that isn't also in the control. + // Skipping one frame that we assume is the frame that calls the two. + var sampleLines = sample.stack.split('\n'); + var controlLines = control.stack.split('\n'); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + // We expect at least one stack frame to be shared. + // Typically this will be the root most one. However, stack frames may be + // cut off due to maximum stack limits. In this case, one maybe cut off + // earlier than the other. We assume that the sample is longer or the same + // and there for cut off earlier. So we should find the root most frame in + // the sample somewhere in the control. + c--; } - }, - collapse: function (e) { - for (var t = 0; t < this.children.length; ++t) this.children[t].collapse(e); - }, - insertInner: function (e, t, i) { - this.size += t.length, this.height += i; - for (var r = 0; r < this.children.length; ++r) { - var n = this.children[r], - l = n.chunkSize(); - if (e <= l) { - if (n.insertInner(e, t, i), n.lines && n.lines.length > 50) { - for (var o = n.lines.length % 25 + 25, a = o; a < n.lines.length;) { - var s = new dr(n.lines.slice(a, a += 25)); - n.height -= s.height, this.children.splice(++r, 0, s), s.parent = this; - } - n.lines = n.lines.slice(0, o), this.maybeSpill(); + for (; s >= 1 && c >= 0; s--, c--) { + // Next we find the first one that isn't the same which should be the + // frame that called our sample function and the control. + if (sampleLines[s] !== controlLines[c]) { + // In V8, the first line is describing the message but other VMs don't. + // If we're about to return the first line, and the control is also on the same + // line, that's a pretty good indicator that our sample threw at same line as + // the control. I.e. before we entered the sample frame. So we ignore this result. + // This can happen if you passed a class to function component, or non-function. + if (s !== 1 || c !== 1) { + do { + s--; + c--; // We may still have similar intermediate frames from the construct call. + // The next one that isn't the same should be our match though. + + if (c < 0 || sampleLines[s] !== controlLines[c]) { + // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. + var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled "" + // but we have a user-provided "displayName" + // splice it in to make the stack more readable. + + if (fn.displayName && _frame.includes('')) { + _frame = _frame.replace('', fn.displayName); + } + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, _frame); + } + } // Return the line we found. + + return _frame; + } + } while (s >= 1 && c >= 0); } break; } - e -= l; - } - }, - maybeSpill: function () { - if (!(this.children.length <= 10)) { - var e = this; - do { - var t = e.children.splice(e.children.length - 5, 5), - i = new pr(t); - if (e.parent) { - e.size -= i.size, e.height -= i.height; - var n = ee(e.parent.children, e); - e.parent.children.splice(n + 1, 0, i); - } else { - var r = new pr(e.children); - r.parent = e, e.children = [r, i], e = r; - } - i.parent = e.parent; - } while (e.children.length > 10); - e.parent.maybeSpill(); - } - }, - iterN: function (e, t, i) { - for (var r = 0; r < this.children.length; ++r) { - var n = this.children[r], - l = n.chunkSize(); - if (e < l) { - var o = Math.min(t, l - e); - if (n.iterN(e, o, i)) return !0; - if ((t -= o) == 0) break; - e = 0; - } else e -= l; } } - }; - var vr = u(function (e, t, i) { - if (i) for (var r in i) i.hasOwnProperty(r) && (this[r] = i[r]); - this.doc = e, this.node = t; - }, "LineWidget"); - vr.prototype.clear = function () { - var e = this.doc.cm, - t = this.line.widgets, - i = this.line, - r = F(i); - if (!(r == null || !t)) { - for (var n = 0; n < t.length; ++n) t[n] == this && t.splice(n--, 1); - t.length || (i.widgets = null); - var l = tr(this); - De(i, Math.max(0, i.height - l)), e && (de(e, function () { - co(e, i, -l), Ye(e, r, "widget"); - }), Z(e, "lineWidgetCleared", e, this, r)); - } - }, vr.prototype.changed = function () { - var e = this, - t = this.height, - i = this.doc.cm, - r = this.line; - this.height = null; - var n = tr(this) - t; - n && (Xe(this.doc, r) || De(r, r.height + n), i && de(i, function () { - i.curOp.forceUpdate = !0, co(i, r, n), Z(i, "lineWidgetChanged", i, e, F(r)); - })); - }, xt(vr); - function co(e, t, i) { - Ie(t) < (e.curOp && e.curOp.scrollTop || e.doc.scrollTop) && nn(e, i); - } - u(co, "adjustScrollWhenAboveVisible"); - function Ss(e, t, i, r) { - var n = new vr(e, i, r), - l = e.cm; - return l && n.noHScroll && (l.display.alignWidgets = !0), cr(e, t, "widget", function (o) { - var a = o.widgets || (o.widgets = []); - if (n.insertAt == null ? a.push(n) : a.splice(Math.min(a.length, Math.max(0, n.insertAt)), 0, n), n.line = o, l && !Xe(e, o)) { - var s = Ie(o) < e.scrollTop; - De(o, o.height + tr(n)), s && nn(l, n.height), l.curOp.forceUpdate = !0; - } - return !0; - }), l && Z(l, "lineWidgetAdded", l, n, typeof t == "number" ? t : F(t)), n; - } - u(Ss, "addLineWidget"); - var po = 0, - je = u(function (e, t) { - this.lines = [], this.type = t, this.doc = e, this.id = ++po; - }, "TextMarker"); - je.prototype.clear = function () { - if (!this.explicitlyCleared) { - var e = this.doc.cm, - t = e && !e.curOp; - if (t && pt(e), Ce(this, "clear")) { - var i = this.find(); - i && Z(this, "clear", i.from, i.to); - } - for (var r = null, n = null, l = 0; l < this.lines.length; ++l) { - var o = this.lines[l], - a = Vt(o.markedSpans, this); - e && !this.collapsed ? Ye(e, F(o), "text") : e && (a.to != null && (n = F(o)), a.from != null && (r = F(o))), o.markedSpans = pa(o.markedSpans, a), a.from == null && this.collapsed && !Xe(this.doc, o) && e && De(o, Tt(e.display)); - } - if (e && this.collapsed && !e.options.lineWrapping) for (var s = 0; s < this.lines.length; ++s) { - var f = Se(this.lines[s]), - h = Gr(f); - h > e.display.maxLineLength && (e.display.maxLine = f, e.display.maxLineLength = h, e.display.maxLineChanged = !0); - } - r != null && e && this.collapsed && se(e, r, n + 1), this.lines.length = 0, this.explicitlyCleared = !0, this.atomic && this.doc.cantEdit && (this.doc.cantEdit = !1, e && ro(e.doc)), e && Z(e, "markerCleared", e, this, r, n), t && vt(e), this.parent && this.parent.clear(); - } - }, je.prototype.find = function (e, t) { - e == null && this.type == "bookmark" && (e = 1); - for (var i, r, n = 0; n < this.lines.length; ++n) { - var l = this.lines[n], - o = Vt(l.markedSpans, this); - if (o.from != null && (i = y(t ? l : F(l), o.from), e == -1)) return i; - if (o.to != null && (r = y(t ? l : F(l), o.to), e == 1)) return r; - } - return i && { - from: i, - to: r - }; - }, je.prototype.changed = function () { - var e = this, - t = this.find(-1, !0), - i = this, - r = this.doc.cm; - !t || !r || de(r, function () { - var n = t.line, - l = F(t.line), - o = _i(r, l); - if (o && (bl(o), r.curOp.selectionChanged = r.curOp.forceUpdate = !0), r.curOp.updateMaxLine = !0, !Xe(i.doc, n) && i.height != null) { - var a = i.height; - i.height = null; - var s = tr(i) - a; - s && De(n, n.height + s); - } - Z(r, "markerChanged", r, e); - }); - }, je.prototype.attachLine = function (e) { - if (!this.lines.length && this.doc.cm) { - var t = this.doc.cm.curOp; - (!t.maybeHiddenMarkers || ee(t.maybeHiddenMarkers, this) == -1) && (t.maybeUnhiddenMarkers || (t.maybeUnhiddenMarkers = [])).push(this); - } - this.lines.push(e); - }, je.prototype.detachLine = function (e) { - if (this.lines.splice(ee(this.lines, e), 1), !this.lines.length && this.doc.cm) { - var t = this.doc.cm.curOp; - (t.maybeHiddenMarkers || (t.maybeHiddenMarkers = [])).push(this); - } - }, xt(je); - function Pt(e, t, i, r, n) { - if (r && r.shared) return Ls(e, t, i, r, n); - if (e.cm && !e.cm.curOp) return Q(e.cm, Pt)(e, t, i, r, n); - var l = new je(e, n), - o = D(t, i); - if (r && nt(r, l, !1), o > 0 || o == 0 && l.clearWhenEmpty !== !1) return l; - if (l.replacedWith && (l.collapsed = !0, l.widgetNode = bt("span", [l.replacedWith], "CodeMirror-widget"), r.handleMouseEvents || l.widgetNode.setAttribute("cm-ignore-events", "true"), r.insertLeft && (l.widgetNode.insertLeft = !0)), l.collapsed) { - if (il(e, t.line, t, i, l) || t.line != i.line && il(e, i.line, t, i, l)) throw new Error("Inserting collapsed marker partially overlapping an existing one"); - da(); - } - l.addToHistory && Ql(e, { - from: t, - to: i, - origin: "markText" - }, e.sel, NaN); - var a = t.line, - s = e.cm, - f; - if (e.iter(a, i.line + 1, function (c) { - s && l.collapsed && !s.options.lineWrapping && Se(c) == s.display.maxLine && (f = !0), l.collapsed && a != t.line && De(c, 0), va(c, new Ir(l, a == t.line ? t.ch : null, a == i.line ? i.ch : null), e.cm && e.cm.curOp), ++a; - }), l.collapsed && e.iter(t.line, i.line + 1, function (c) { - Xe(e, c) && De(c, 0); - }), l.clearOnEnter && M(l, "beforeCursorEnter", function () { - return l.clear(); - }), l.readOnly && (ca(), (e.history.done.length || e.history.undone.length) && e.clearHistory()), l.collapsed && (l.id = ++po, l.atomic = !0), s) { - if (f && (s.curOp.updateMaxLine = !0), l.collapsed) se(s, t.line, i.line + 1);else if (l.className || l.startStyle || l.endStyle || l.css || l.attributes || l.title) for (var h = t.line; h <= i.line; h++) Ye(s, h, "text"); - l.atomic && ro(s.doc), Z(s, "markerAdded", s, l); - } - return l; - } - u(Pt, "markText"); - var gr = u(function (e, t) { - this.markers = e, this.primary = t; - for (var i = 0; i < e.length; ++i) e[i].parent = this; - }, "SharedTextMarker"); - gr.prototype.clear = function () { - if (!this.explicitlyCleared) { - this.explicitlyCleared = !0; - for (var e = 0; e < this.markers.length; ++e) this.markers[e].clear(); - Z(this, "clear"); - } - }, gr.prototype.find = function (e, t) { - return this.primary.find(e, t); - }, xt(gr); - function Ls(e, t, i, r, n) { - r = nt(r), r.shared = !1; - var l = [Pt(e, t, i, r, n)], - o = l[0], - a = r.widgetNode; - return Je(e, function (s) { - a && (r.widgetNode = a.cloneNode(!0)), l.push(Pt(s, N(s, t), N(s, i), r, n)); - for (var f = 0; f < s.linked.length; ++f) if (s.linked[f].isParent) return; - o = H(l); - }), new gr(l, o); - } - u(Ls, "markTextShared"); - function vo(e) { - return e.findMarks(y(e.first, 0), e.clipPos(y(e.lastLine())), function (t) { - return t.parent; - }); + } finally { + reentry = false; + { + ReactCurrentDispatcher.current = previousDispatcher; + reenableLogs(); + } + Error.prepareStackTrace = previousPrepareStackTrace; + } // Fallback to just using the name if we couldn't make it throw. + + var name = fn ? fn.displayName || fn.name : ''; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, syntheticFrame); + } } - u(vo, "findSharedMarkers"); - function ks(e, t) { - for (var i = 0; i < t.length; i++) { - var r = t[i], - n = r.find(), - l = e.clipPos(n.from), - o = e.clipPos(n.to); - if (D(l, o)) { - var a = Pt(e, l, o, r.primary, r.primary.type); - r.markers.push(a), a.parent = r; - } - } - } - u(ks, "copySharedMarkers"); - function Ts(e) { - for (var t = u(function (r) { - var n = e[r], - l = [n.primary.doc]; - Je(n.primary.doc, function (s) { - return l.push(s); - }); - for (var o = 0; o < n.markers.length; o++) { - var a = n.markers[o]; - ee(l, a.doc) == -1 && (a.parent = null, n.markers.splice(o--, 1)); - } - }, "loop"), i = 0; i < e.length; i++) t(i); - } - u(Ts, "detachSharedMarkers"); - var Ms = 0, - ue = u(function (e, t, i, r, n) { - if (!(this instanceof ue)) return new ue(e, t, i, r, n); - i == null && (i = 0), pr.call(this, [new dr([new St("", null)])]), this.first = i, this.scrollTop = this.scrollLeft = 0, this.cantEdit = !1, this.cleanGeneration = 1, this.modeFrontier = this.highlightFrontier = i; - var l = y(i, 0); - this.sel = Ze(l), this.history = new $r(null), this.id = ++Ms, this.modeOption = t, this.lineSep = r, this.direction = n == "rtl" ? "rtl" : "ltr", this.extend = !1, typeof e == "string" && (e = this.splitLines(e)), cn(this, { - from: l, - to: l, - text: e - }), te(this, Ze(l), Me); - }, "Doc"); - ue.prototype = Fn(pr.prototype, { - constructor: ue, - iter: function (e, t, i) { - i ? this.iterN(e - this.first, t - e, i) : this.iterN(this.first, this.first + this.size, e); - }, - insert: function (e, t) { - for (var i = 0, r = 0; r < t.length; ++r) i += t[r].height; - this.insertInner(e - this.first, t, i); - }, - remove: function (e, t) { - this.removeInner(e - this.first, t); - }, - getValue: function (e) { - var t = Ai(this, this.first, this.first + this.size); - return e === !1 ? t : t.join(e || this.lineSeparator()); - }, - setValue: J(function (e) { - var t = y(this.first, 0), - i = this.first + this.size - 1; - Ht(this, { - from: t, - to: y(i, S(this, i).text.length), - text: this.splitLines(e), - origin: "setValue", - full: !0 - }, !0), this.cm && nr(this.cm, 0, 0), te(this, Ze(t), Me); - }), - replaceRange: function (e, t, i, r) { - t = N(this, t), i = i ? N(this, i) : t, Ft(this, e, t, i, r); - }, - getRange: function (e, t, i) { - var r = ot(this, N(this, e), N(this, t)); - return i === !1 ? r : i === "" ? r.join("") : r.join(i || this.lineSeparator()); - }, - getLine: function (e) { - var t = this.getLineHandle(e); - return t && t.text; - }, - getLineHandle: function (e) { - if (Jt(this, e)) return S(this, e); - }, - getLineNumber: function (e) { - return F(e); - }, - getLineHandleVisualStart: function (e) { - return typeof e == "number" && (e = S(this, e)), Se(e); - }, - lineCount: function () { - return this.size; - }, - firstLine: function () { - return this.first; - }, - lastLine: function () { - return this.first + this.size - 1; - }, - clipPos: function (e) { - return N(this, e); - }, - getCursor: function (e) { - var t = this.sel.primary(), - i; - return e == null || e == "head" ? i = t.head : e == "anchor" ? i = t.anchor : e == "end" || e == "to" || e === !1 ? i = t.to() : i = t.from(), i; - }, - listSelections: function () { - return this.sel.ranges; - }, - somethingSelected: function () { - return this.sel.somethingSelected(); - }, - setCursor: J(function (e, t, i) { - $l(this, N(this, typeof e == "number" ? y(e, t || 0) : e), null, i); - }), - setSelection: J(function (e, t, i) { - $l(this, N(this, e), N(this, t || e), i); - }), - extendSelection: J(function (e, t, i) { - ti(this, N(this, e), t && N(this, t), i); - }), - extendSelections: J(function (e, t) { - Vl(this, Kn(this, e), t); - }), - extendSelectionsBy: J(function (e, t) { - var i = Or(this.sel.ranges, e); - Vl(this, Kn(this, i), t); - }), - setSelections: J(function (e, t, i) { - if (e.length) { - for (var r = [], n = 0; n < e.length; n++) r[n] = new W(N(this, e[n].anchor), N(this, e[n].head || e[n].anchor)); - t == null && (t = Math.min(e.length - 1, this.sel.primIndex)), te(this, ke(this.cm, r, t), i); - } - }), - addSelection: J(function (e, t, i) { - var r = this.sel.ranges.slice(0); - r.push(new W(N(this, e), N(this, t || e))), te(this, ke(this.cm, r, r.length - 1), i); - }), - getSelection: function (e) { - for (var t = this.sel.ranges, i, r = 0; r < t.length; r++) { - var n = ot(this, t[r].from(), t[r].to()); - i = i ? i.concat(n) : n; - } - return e === !1 ? i : i.join(e || this.lineSeparator()); - }, - getSelections: function (e) { - for (var t = [], i = this.sel.ranges, r = 0; r < i.length; r++) { - var n = ot(this, i[r].from(), i[r].to()); - e !== !1 && (n = n.join(e || this.lineSeparator())), t[r] = n; - } - return t; - }, - replaceSelection: function (e, t, i) { - for (var r = [], n = 0; n < this.sel.ranges.length; n++) r[n] = e; - this.replaceSelections(r, t, i || "+input"); - }, - replaceSelections: J(function (e, t, i) { - for (var r = [], n = this.sel, l = 0; l < n.ranges.length; l++) { - var o = n.ranges[l]; - r[l] = { - from: o.from(), - to: o.to(), - text: this.splitLines(e[l]), - origin: i - }; - } - for (var a = t && t != "end" && ps(this, r, t), s = r.length - 1; s >= 0; s--) Ht(this, r[s]); - a ? eo(this, a) : this.cm && Nt(this.cm); - }), - undo: J(function () { - ni(this, "undo"); - }), - redo: J(function () { - ni(this, "redo"); - }), - undoSelection: J(function () { - ni(this, "undo", !0); - }), - redoSelection: J(function () { - ni(this, "redo", !0); - }), - setExtending: function (e) { - this.extend = e; - }, - getExtending: function () { - return this.extend; - }, - historySize: function () { - for (var e = this.history, t = 0, i = 0, r = 0; r < e.done.length; r++) e.done[r].ranges || ++t; - for (var n = 0; n < e.undone.length; n++) e.undone[n].ranges || ++i; - return { - undo: t, - redo: i - }; - }, - clearHistory: function () { - var e = this; - this.history = new $r(this.history), Je(this, function (t) { - return t.history = e.history; - }, !0); - }, - markClean: function () { - this.cleanGeneration = this.changeGeneration(!0); - }, - changeGeneration: function (e) { - return e && (this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null), this.history.generation; - }, - isClean: function (e) { - return this.history.generation == (e || this.cleanGeneration); - }, - getHistory: function () { - return { - done: Ot(this.history.done), - undone: Ot(this.history.undone) - }; - }, - setHistory: function (e) { - var t = this.history = new $r(this.history); - t.done = Ot(e.done.slice(0), null, !0), t.undone = Ot(e.undone.slice(0), null, !0); - }, - setGutterMarker: J(function (e, t, i) { - return cr(this, e, "gutter", function (r) { - var n = r.gutterMarkers || (r.gutterMarkers = {}); - return n[t] = i, !i && Pn(n) && (r.gutterMarkers = null), !0; - }); - }), - clearGutter: J(function (e) { - var t = this; - this.iter(function (i) { - i.gutterMarkers && i.gutterMarkers[e] && cr(t, i, "gutter", function () { - return i.gutterMarkers[e] = null, Pn(i.gutterMarkers) && (i.gutterMarkers = null), !0; - }); - }); - }), - lineInfo: function (e) { - var t; - if (typeof e == "number") { - if (!Jt(this, e) || (t = e, e = S(this, e), !e)) return null; - } else if (t = F(e), t == null) return null; - return { - line: t, - handle: e, - text: e.text, - gutterMarkers: e.gutterMarkers, - textClass: e.textClass, - bgClass: e.bgClass, - wrapClass: e.wrapClass, - widgets: e.widgets - }; - }, - addLineClass: J(function (e, t, i) { - return cr(this, e, t == "gutter" ? "gutter" : "class", function (r) { - var n = t == "text" ? "textClass" : t == "background" ? "bgClass" : t == "gutter" ? "gutterClass" : "wrapClass"; - if (!r[n]) r[n] = i;else { - if (mt(i).test(r[n])) return !1; - r[n] += " " + i; + return syntheticFrame; + } + function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } + } + function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); + } + function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + if (type == null) { + return ''; + } + if (typeof type === 'function') { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + if (typeof type === 'string') { + return describeBuiltInComponentFrame(type); + } + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame('Suspense'); + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame('SuspenseList'); + } + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + case REACT_MEMO_TYPE: + // Memo may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + try { + // Lazy may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) {} } - return !0; - }); - }), - removeLineClass: J(function (e, t, i) { - return cr(this, e, t == "gutter" ? "gutter" : "class", function (r) { - var n = t == "text" ? "textClass" : t == "background" ? "bgClass" : t == "gutter" ? "gutterClass" : "wrapClass", - l = r[n]; - if (l) { - if (i == null) r[n] = null;else { - var o = l.match(mt(i)); - if (!o) return !1; - var a = o.index + o[0].length; - r[n] = l.slice(0, o.index) + (!o.index || a == l.length ? "" : " ") + l.slice(a) || null; + } + } + return ''; + } + var hasOwnProperty = Object.prototype.hasOwnProperty; + var loggedTypeFailures = {}; + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame.setExtraStackFrame(null); + } + } + } + function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + // $FlowFixMe This is okay but Flow doesn't know it. + var has = Function.call.bind(hasOwnProperty); + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + // eslint-disable-next-line react-internal/prod-error-codes + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); + err.name = 'Invariant Violation'; + throw err; } - } else return !1; - return !0; - }); - }), - addLineWidget: J(function (e, t, i) { - return Ss(this, e, t, i); - }), - removeLineWidget: function (e) { - e.clear(); - }, - markText: function (e, t, i) { - return Pt(this, N(this, e), N(this, t), i, i && i.type || "range"); - }, - setBookmark: function (e, t) { - var i = { - replacedWith: t && (t.nodeType == null ? t.widget : t), - insertLeft: t && t.insertLeft, - clearWhenEmpty: !1, - shared: t && t.shared, - handleMouseEvents: t && t.handleMouseEvents - }; - return e = N(this, e), Pt(this, e, e, i, "bookmark"); - }, - findMarksAt: function (e) { - e = N(this, e); - var t = [], - i = S(this, e.line).markedSpans; - if (i) for (var r = 0; r < i.length; ++r) { - var n = i[r]; - (n.from == null || n.from <= e.ch) && (n.to == null || n.to >= e.ch) && t.push(n.marker.parent || n.marker); - } - return t; - }, - findMarks: function (e, t, i) { - e = N(this, e), t = N(this, t); - var r = [], - n = e.line; - return this.iter(e.line, t.line + 1, function (l) { - var o = l.markedSpans; - if (o) for (var a = 0; a < o.length; a++) { - var s = o[a]; - !(s.to != null && n == e.line && e.ch >= s.to || s.from == null && n != e.line || s.from != null && n == t.line && s.from >= t.ch) && (!i || i(s.marker)) && r.push(s.marker.parent || s.marker); + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); + } catch (ex) { + error$1 = ex; } - ++n; - }), r; - }, - getAllMarks: function () { - var e = []; - return this.iter(function (t) { - var i = t.markedSpans; - if (i) for (var r = 0; r < i.length; ++r) i[r].from != null && e.push(i[r].marker); - }), e; - }, - posFromIndex: function (e) { - var t, - i = this.first, - r = this.lineSeparator().length; - return this.iter(function (n) { - var l = n.text.length + r; - if (l > e) return t = e, !0; - e -= l, ++i; - }), N(this, y(i, t)); - }, - indexFromPos: function (e) { - e = N(this, e); - var t = e.ch; - if (e.line < this.first || e.ch < 0) return 0; - var i = this.lineSeparator().length; - return this.iter(this.first, e.line, function (r) { - t += r.text.length + i; - }), t; - }, - copy: function (e) { - var t = new ue(Ai(this, this.first, this.first + this.size), this.modeOption, this.first, this.lineSep, this.direction); - return t.scrollTop = this.scrollTop, t.scrollLeft = this.scrollLeft, t.sel = this.sel, t.extend = !1, e && (t.history.undoDepth = this.history.undoDepth, t.setHistory(this.getHistory())), t; - }, - linkedDoc: function (e) { - e || (e = {}); - var t = this.first, - i = this.first + this.size; - e.from != null && e.from > t && (t = e.from), e.to != null && e.to < i && (i = e.to); - var r = new ue(Ai(this, t, i), e.mode || this.modeOption, t, this.lineSep, this.direction); - return e.sharedHist && (r.history = this.history), (this.linked || (this.linked = [])).push({ - doc: r, - sharedHist: e.sharedHist - }), r.linked = [{ - doc: this, - isParent: !0, - sharedHist: e.sharedHist - }], ks(r, vo(this)), r; - }, - unlinkDoc: function (e) { - if (e instanceof R && (e = e.doc), this.linked) for (var t = 0; t < this.linked.length; ++t) { - var i = this.linked[t]; - if (i.doc == e) { - this.linked.splice(t, 1), e.unlinkDoc(this), Ts(vo(this)); - break; + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); + setCurrentlyValidatingElement(null); } - } - if (e.history == this.history) { - var r = [e.id]; - Je(e, function (n) { - return r.push(n.id); - }, !0), e.history = new $r(null), e.history.done = Ot(this.history.done, r), e.history.undone = Ot(this.history.undone, r); - } - }, - iterLinkedDocs: function (e) { - Je(this, e); - }, - getMode: function () { - return this.mode; - }, - getEditor: function () { - return this.cm; - }, - splitLines: function (e) { - return this.lineSep ? e.split(this.lineSep) : ki(e); - }, - lineSeparator: function () { - return this.lineSep || ` -`; - }, - setDirection: J(function (e) { - e != "rtl" && (e = "ltr"), e != this.direction && (this.direction = e, this.iter(function (t) { - return t.order = null; - }), this.cm && vs(this.cm)); - }) - }), ue.prototype.eachLine = ue.prototype.iter; - var go = 0; - function Ds(e) { - var t = this; - if (yo(t), !(q(t, e) || Re(t.display, e))) { - ae(e), O && (go = +new Date()); - var i = ft(t, e, !0), - r = e.dataTransfer.files; - if (!(!i || t.isReadOnly())) if (r && r.length && window.FileReader && window.File) for (var n = r.length, l = Array(n), o = 0, a = u(function () { - ++o == n && Q(t, function () { - i = N(t.doc, i); - var d = { - from: i, - to: i, - text: t.doc.splitLines(l.filter(function (v) { - return v != null; - }).join(t.doc.lineSeparator())), - origin: "paste" - }; - Ht(t.doc, d), eo(t.doc, Ze(N(t.doc, i), N(t.doc, Qe(d)))); - })(); - }, "markAsReadAndPasteIfAllFilesAreRead"), s = u(function (d, v) { - if (t.options.allowDropFileTypes && ee(t.options.allowDropFileTypes, d.type) == -1) { - a(); - return; - } - var g = new FileReader(); - g.onerror = function () { - return a(); - }, g.onload = function () { - var m = g.result; - if (/[\x00-\x08\x0e-\x1f]{2}/.test(m)) { - a(); - return; - } - l[v] = m, a(); - }, g.readAsText(d); - }, "readTextFromFile"), f = 0; f < r.length; f++) s(r[f], f);else { - if (t.state.draggingText && t.doc.sel.contains(i) > -1) { - t.state.draggingText(e), setTimeout(function () { - return t.display.input.focus(); - }, 20); - return; + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + error('Failed %s type: %s', location, error$1.message); + setCurrentlyValidatingElement(null); } - try { - var h = e.dataTransfer.getData("Text"); - if (h) { - var c; - if (t.state.draggingText && !t.state.draggingText.copy && (c = t.listSelections()), ri(t.doc, Ze(i, i)), c) for (var p = 0; p < c.length; ++p) Ft(t.doc, "", c[p].anchor, c[p].head, "drag"); - t.replaceSelection(h, "around", "paste"), t.display.input.focus(); - } - } catch {} } } } - u(Ds, "onDrop"); - function Ns(e, t) { - if (O && (!e.state.draggingText || +new Date() - go < 100)) { - Qt(t); - return; - } - if (!(q(e, t) || Re(e.display, t)) && (t.dataTransfer.setData("Text", e.getSelection()), t.dataTransfer.effectAllowed = "copyMove", t.dataTransfer.setDragImage && !Mr)) { - var i = T("img", null, null, "position: fixed; left: 0; top: 0;"); - i.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", we && (i.width = i.height = 1, e.display.wrapper.appendChild(i), i._top = i.offsetTop), t.dataTransfer.setDragImage(i, 0, 0), we && i.parentNode.removeChild(i); - } + } + var isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare + + function isArray(a) { + return isArrayImpl(a); + } + + /* + * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol + * and Temporal.* types. See https://github.com/facebook/react/pull/22064. + * + * The functions in this module will throw an easier-to-understand, + * easier-to-debug exception with a clear errors message message explaining the + * problem. (Instead of a confusing exception thrown inside the implementation + * of the `value` object). + */ + // $FlowFixMe only called in DEV, so void return is not possible. + function typeName(value) { + { + // toStringTag is needed for namespaced types like Temporal.Instant + var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag; + var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object'; + return type; } - u(Ns, "onDragStart"); - function As(e, t) { - var i = ft(e, t); - if (i) { - var r = document.createDocumentFragment(); - Vi(e, i, r), e.display.dragCursor || (e.display.dragCursor = T("div", null, "CodeMirror-cursors CodeMirror-dragcursors"), e.display.lineSpace.insertBefore(e.display.dragCursor, e.display.cursorDiv)), ve(e.display.dragCursor, r); + } // $FlowFixMe only called in DEV, so void return is not possible. + + function willCoercionThrow(value) { + { + try { + testStringCoercion(value); + return false; + } catch (e) { + return true; } } - u(As, "onDragOver"); - function yo(e) { - e.display.dragCursor && (e.display.lineSpace.removeChild(e.display.dragCursor), e.display.dragCursor = null); + } + function testStringCoercion(value) { + // If you ended up here by following an exception call stack, here's what's + // happened: you supplied an object or symbol value to React (as a prop, key, + // DOM attribute, CSS property, string ref, etc.) and when React tried to + // coerce it to a string using `'' + value`, an exception was thrown. + // + // The most common types that will cause this exception are `Symbol` instances + // and Temporal objects like `Temporal.Instant`. But any object that has a + // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this + // exception. (Library authors do this to prevent users from using built-in + // numeric operators like `+` or comparison operators like `>=` because custom + // methods are needed to perform accurate arithmetic or comparison.) + // + // To fix the problem, coerce this object or symbol value to a string before + // passing it to React. The most reliable way is usually `String(value)`. + // + // To find which value is throwing, check the browser or debugger console. + // Before this exception was thrown, there should be `console.error` output + // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the + // problem and how that type was used: key, atrribute, input value prop, etc. + // In most cases, this console output also shows the component and its + // ancestor components where the exception happened. + // + // eslint-disable-next-line react-internal/safe-string-coercion + return '' + value; + } + function checkKeyStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value)); + return testStringCoercion(value); // throw (to help callers find troubleshooting comments) + } } - u(yo, "clearDragCursor"); - function mo(e) { - if (document.getElementsByClassName) { - for (var t = document.getElementsByClassName("CodeMirror"), i = [], r = 0; r < t.length; r++) { - var n = t[r].CodeMirror; - n && i.push(n); + } + var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner; + var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true + }; + var specialPropKeyWarningShown; + var specialPropRefWarningShown; + var didWarnAboutStringRefs; + { + didWarnAboutStringRefs = {}; + } + function hasValidRef(config) { + { + if (hasOwnProperty.call(config, 'ref')) { + var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; + if (getter && getter.isReactWarning) { + return false; } - i.length && i[0].operation(function () { - for (var l = 0; l < i.length; l++) e(i[l]); - }); } } - u(mo, "forEachCodeMirror"); - var bo = !1; - function Os() { - bo || (Ws(), bo = !0); - } - u(Os, "ensureGlobalHandlers"); - function Ws() { - var e; - M(window, "resize", function () { - e == null && (e = setTimeout(function () { - e = null, mo(Hs); - }, 100)); - }), M(window, "blur", function () { - return mo(Dt); - }); - } - u(Ws, "registerGlobalHandlers"); - function Hs(e) { - var t = e.display; - t.cachedCharWidth = t.cachedTextHeight = t.cachedPaddingH = null, t.scrollbarsClipped = !1, e.setSize(); - } - u(Hs, "onResize"); - for (var Ve = { - 3: "Pause", - 8: "Backspace", - 9: "Tab", - 13: "Enter", - 16: "Shift", - 17: "Ctrl", - 18: "Alt", - 19: "Pause", - 20: "CapsLock", - 27: "Esc", - 32: "Space", - 33: "PageUp", - 34: "PageDown", - 35: "End", - 36: "Home", - 37: "Left", - 38: "Up", - 39: "Right", - 40: "Down", - 44: "PrintScrn", - 45: "Insert", - 46: "Delete", - 59: ";", - 61: "=", - 91: "Mod", - 92: "Mod", - 93: "Mod", - 106: "*", - 107: "=", - 109: "-", - 110: ".", - 111: "/", - 145: "ScrollLock", - 173: "-", - 186: ";", - 187: "=", - 188: ",", - 189: "-", - 190: ".", - 191: "/", - 192: "`", - 219: "[", - 220: "\\", - 221: "]", - 222: "'", - 224: "Mod", - 63232: "Up", - 63233: "Down", - 63234: "Left", - 63235: "Right", - 63272: "Delete", - 63273: "Home", - 63275: "End", - 63276: "PageUp", - 63277: "PageDown", - 63302: "Insert" - }, yr = 0; yr < 10; yr++) Ve[yr + 48] = Ve[yr + 96] = String(yr); - for (var li = 65; li <= 90; li++) Ve[li] = String.fromCharCode(li); - for (var mr = 1; mr <= 12; mr++) Ve[mr + 111] = Ve[mr + 63235] = "F" + mr; - var ze = {}; - ze.basic = { - Left: "goCharLeft", - Right: "goCharRight", - Up: "goLineUp", - Down: "goLineDown", - End: "goLineEnd", - Home: "goLineStartSmart", - PageUp: "goPageUp", - PageDown: "goPageDown", - Delete: "delCharAfter", - Backspace: "delCharBefore", - "Shift-Backspace": "delCharBefore", - Tab: "defaultTab", - "Shift-Tab": "indentAuto", - Enter: "newlineAndIndent", - Insert: "toggleOverwrite", - Esc: "singleSelection" - }, ze.pcDefault = { - "Ctrl-A": "selectAll", - "Ctrl-D": "deleteLine", - "Ctrl-Z": "undo", - "Shift-Ctrl-Z": "redo", - "Ctrl-Y": "redo", - "Ctrl-Home": "goDocStart", - "Ctrl-End": "goDocEnd", - "Ctrl-Up": "goLineUp", - "Ctrl-Down": "goLineDown", - "Ctrl-Left": "goGroupLeft", - "Ctrl-Right": "goGroupRight", - "Alt-Left": "goLineStart", - "Alt-Right": "goLineEnd", - "Ctrl-Backspace": "delGroupBefore", - "Ctrl-Delete": "delGroupAfter", - "Ctrl-S": "save", - "Ctrl-F": "find", - "Ctrl-G": "findNext", - "Shift-Ctrl-G": "findPrev", - "Shift-Ctrl-F": "replace", - "Shift-Ctrl-R": "replaceAll", - "Ctrl-[": "indentLess", - "Ctrl-]": "indentMore", - "Ctrl-U": "undoSelection", - "Shift-Ctrl-U": "redoSelection", - "Alt-U": "redoSelection", - fallthrough: "basic" - }, ze.emacsy = { - "Ctrl-F": "goCharRight", - "Ctrl-B": "goCharLeft", - "Ctrl-P": "goLineUp", - "Ctrl-N": "goLineDown", - "Ctrl-A": "goLineStart", - "Ctrl-E": "goLineEnd", - "Ctrl-V": "goPageDown", - "Shift-Ctrl-V": "goPageUp", - "Ctrl-D": "delCharAfter", - "Ctrl-H": "delCharBefore", - "Alt-Backspace": "delWordBefore", - "Ctrl-K": "killLine", - "Ctrl-T": "transposeChars", - "Ctrl-O": "openLine" - }, ze.macDefault = { - "Cmd-A": "selectAll", - "Cmd-D": "deleteLine", - "Cmd-Z": "undo", - "Shift-Cmd-Z": "redo", - "Cmd-Y": "redo", - "Cmd-Home": "goDocStart", - "Cmd-Up": "goDocStart", - "Cmd-End": "goDocEnd", - "Cmd-Down": "goDocEnd", - "Alt-Left": "goGroupLeft", - "Alt-Right": "goGroupRight", - "Cmd-Left": "goLineLeft", - "Cmd-Right": "goLineRight", - "Alt-Backspace": "delGroupBefore", - "Ctrl-Alt-Backspace": "delGroupAfter", - "Alt-Delete": "delGroupAfter", - "Cmd-S": "save", - "Cmd-F": "find", - "Cmd-G": "findNext", - "Shift-Cmd-G": "findPrev", - "Cmd-Alt-F": "replace", - "Shift-Cmd-Alt-F": "replaceAll", - "Cmd-[": "indentLess", - "Cmd-]": "indentMore", - "Cmd-Backspace": "delWrappedLineLeft", - "Cmd-Delete": "delWrappedLineRight", - "Cmd-U": "undoSelection", - "Shift-Cmd-U": "redoSelection", - "Ctrl-Up": "goDocStart", - "Ctrl-Down": "goDocEnd", - fallthrough: ["basic", "emacsy"] - }, ze.default = me ? ze.macDefault : ze.pcDefault; - function Fs(e) { - var t = e.split(/-(?!$)/); - e = t[t.length - 1]; - for (var i, r, n, l, o = 0; o < t.length - 1; o++) { - var a = t[o]; - if (/^(cmd|meta|m)$/i.test(a)) l = !0;else if (/^a(lt)?$/i.test(a)) i = !0;else if (/^(c|ctrl|control)$/i.test(a)) r = !0;else if (/^s(hift)?$/i.test(a)) n = !0;else throw new Error("Unrecognized modifier name: " + a); - } - return i && (e = "Alt-" + e), r && (e = "Ctrl-" + e), l && (e = "Cmd-" + e), n && (e = "Shift-" + e), e; - } - u(Fs, "normalizeKeyName"); - function Ps(e) { - var t = {}; - for (var i in e) if (e.hasOwnProperty(i)) { - var r = e[i]; - if (/^(name|fallthrough|(de|at)tach)$/.test(i)) continue; - if (r == "...") { - delete e[i]; - continue; - } - for (var n = Or(i.split(" "), Fs), l = 0; l < n.length; l++) { - var o = void 0, - a = void 0; - l == n.length - 1 ? (a = n.join(" "), o = r) : (a = n.slice(0, l + 1).join(" "), o = "..."); - var s = t[a]; - if (!s) t[a] = o;else if (s != o) throw new Error("Inconsistent bindings for " + a); + return config.ref !== undefined; + } + function hasValidKey(config) { + { + if (hasOwnProperty.call(config, 'key')) { + var getter = Object.getOwnPropertyDescriptor(config, 'key').get; + if (getter && getter.isReactWarning) { + return false; } - delete e[i]; } - for (var f in t) e[f] = t[f]; - return e; } - u(Ps, "normalizeKeyMap"); - function Et(e, t, i, r) { - t = oi(t); - var n = t.call ? t.call(e, r) : t[e]; - if (n === !1) return "nothing"; - if (n === "...") return "multi"; - if (n != null && i(n)) return "handled"; - if (t.fallthrough) { - if (Object.prototype.toString.call(t.fallthrough) != "[object Array]") return Et(e, t.fallthrough, i, r); - for (var l = 0; l < t.fallthrough.length; l++) { - var o = Et(e, t.fallthrough[l], i, r); - if (o) return o; - } - } - } - u(Et, "lookupKey"); - function xo(e) { - var t = typeof e == "string" ? e : Ve[e.keyCode]; - return t == "Ctrl" || t == "Alt" || t == "Shift" || t == "Mod"; - } - u(xo, "isModifierKey"); - function Co(e, t, i) { - var r = e; - return t.altKey && r != "Alt" && (e = "Alt-" + e), (On ? t.metaKey : t.ctrlKey) && r != "Ctrl" && (e = "Ctrl-" + e), (On ? t.ctrlKey : t.metaKey) && r != "Mod" && (e = "Cmd-" + e), !i && t.shiftKey && r != "Shift" && (e = "Shift-" + e), e; - } - u(Co, "addModifierNames"); - function wo(e, t) { - if (we && e.keyCode == 34 && e.char) return !1; - var i = Ve[e.keyCode]; - return i == null || e.altGraphKey ? !1 : (e.keyCode == 3 && e.code && (i = e.code), Co(i, e, t)); - } - u(wo, "keyName"); - function oi(e) { - return typeof e == "string" ? ze[e] : e; - } - u(oi, "getKeyMap"); - function It(e, t) { - for (var i = e.doc.sel.ranges, r = [], n = 0; n < i.length; n++) { - for (var l = t(i[n]); r.length && D(l.from, H(r).to) <= 0;) { - var o = r.pop(); - if (D(o.from, l.from) < 0) { - l.from = o.from; - break; - } + return config.key !== undefined; + } + function warnIfStringRefCannotBeAutoConverted(config, self) { + { + if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) { + var componentName = getComponentNameFromType(ReactCurrentOwner.current.type); + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentNameFromType(ReactCurrentOwner.current.type), config.ref); + didWarnAboutStringRefs[componentName] = true; } - r.push(l); } - de(e, function () { - for (var a = r.length - 1; a >= 0; a--) Ft(e.doc, "", r[a].from, r[a].to, "+delete"); - Nt(e); + } + } + function defineKeyPropWarningGetter(props, displayName) { + { + var warnAboutAccessingKey = function () { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + }; + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, 'key', { + get: warnAboutAccessingKey, + configurable: true }); } - u(It, "deleteNearSelection"); - function gn(e, t, i) { - var r = En(e.text, t + i, i); - return r < 0 || r > e.text.length ? null : r; - } - u(gn, "moveCharLogically"); - function yn(e, t, i) { - var r = gn(e, t.ch, i); - return r == null ? null : new y(t.line, r, i < 0 ? "after" : "before"); - } - u(yn, "moveLogically"); - function mn(e, t, i, r, n) { - if (e) { - t.doc.direction == "rtl" && (n = -n); - var l = Pe(i, t.doc.direction); - if (l) { - var o = n < 0 ? H(l) : l[0], - a = n < 0 == (o.level == 1), - s = a ? "after" : "before", - f; - if (o.level > 0 || t.doc.direction == "rtl") { - var h = kt(t, i); - f = n < 0 ? i.text.length - 1 : 0; - var c = Oe(t, h, f).top; - f = Yt(function (p) { - return Oe(t, h, p).top == c; - }, n < 0 == (o.level == 1) ? o.from : o.to - 1, f), s == "before" && (f = gn(i, f, 1)); - } else f = n < 0 ? o.to : o.from; - return new y(r, f, s); - } - } - return new y(r, n < 0 ? i.text.length : 0, n < 0 ? "before" : "after"); - } - u(mn, "endOfLine"); - function Es(e, t, i, r) { - var n = Pe(t, e.doc.direction); - if (!n) return yn(t, i, r); - i.ch >= t.text.length ? (i.ch = t.text.length, i.sticky = "before") : i.ch <= 0 && (i.ch = 0, i.sticky = "after"); - var l = Zt(n, i.ch, i.sticky), - o = n[l]; - if (e.doc.direction == "ltr" && o.level % 2 == 0 && (r > 0 ? o.to > i.ch : o.from < i.ch)) return yn(t, i, r); - var a = u(function (b, C) { - return gn(t, b instanceof y ? b.ch : b, C); - }, "mv"), - s, - f = u(function (b) { - return e.options.lineWrapping ? (s = s || kt(e, t), Tl(e, t, s, b)) : { - begin: 0, - end: t.text.length - }; - }, "getWrappedLineExtent"), - h = f(i.sticky == "before" ? a(i, -1) : i.ch); - if (e.doc.direction == "rtl" || o.level == 1) { - var c = o.level == 1 == r < 0, - p = a(i, c ? 1 : -1); - if (p != null && (c ? p <= o.to && p <= h.end : p >= o.from && p >= h.begin)) { - var d = c ? "before" : "after"; - return new y(i.line, p, d); - } - } - var v = u(function (b, C, x) { - for (var w = u(function (E, j) { - return j ? new y(i.line, a(E, 1), "before") : new y(i.line, E, "after"); - }, "getRes"); b >= 0 && b < n.length; b += C) { - var k = n[b], - L = C > 0 == (k.level != 1), - A = L ? x.begin : a(x.end, -1); - if (k.from <= A && A < k.to || (A = L ? k.from : a(k.to, -1), x.begin <= A && A < x.end)) return w(A, L); - } - }, "searchInVisualLine"), - g = v(l + r, r, h); - if (g) return g; - var m = r > 0 ? h.end : a(h.begin, -1); - return m != null && !(r > 0 && m == t.text.length) && (g = v(r > 0 ? 0 : n.length - 1, r, f(m)), g) ? g : null; - } - u(Es, "moveVisually"); - var br = { - selectAll: lo, - singleSelection: function (e) { - return e.setSelection(e.getCursor("anchor"), e.getCursor("head"), Me); - }, - killLine: function (e) { - return It(e, function (t) { - if (t.empty()) { - var i = S(e.doc, t.head.line).text.length; - return t.head.ch == i && t.head.line < e.lastLine() ? { - from: t.head, - to: y(t.head.line + 1, 0) - } : { - from: t.head, - to: y(t.head.line, i) - }; - } else return { - from: t.from(), - to: t.to() - }; - }); - }, - deleteLine: function (e) { - return It(e, function (t) { - return { - from: y(t.from().line, 0), - to: N(e.doc, y(t.to().line + 1, 0)) - }; - }); - }, - delLineLeft: function (e) { - return It(e, function (t) { - return { - from: y(t.from().line, 0), - to: t.from() - }; - }); - }, - delWrappedLineLeft: function (e) { - return It(e, function (t) { - var i = e.charCoords(t.head, "div").top + 5, - r = e.coordsChar({ - left: 0, - top: i - }, "div"); - return { - from: r, - to: t.from() - }; - }); - }, - delWrappedLineRight: function (e) { - return It(e, function (t) { - var i = e.charCoords(t.head, "div").top + 5, - r = e.coordsChar({ - left: e.display.lineDiv.offsetWidth + 100, - top: i - }, "div"); - return { - from: t.from(), - to: r - }; - }); - }, - undo: function (e) { - return e.undo(); - }, - redo: function (e) { - return e.redo(); - }, - undoSelection: function (e) { - return e.undoSelection(); - }, - redoSelection: function (e) { - return e.redoSelection(); - }, - goDocStart: function (e) { - return e.extendSelection(y(e.firstLine(), 0)); - }, - goDocEnd: function (e) { - return e.extendSelection(y(e.lastLine())); - }, - goLineStart: function (e) { - return e.extendSelectionsBy(function (t) { - return So(e, t.head.line); - }, { - origin: "+move", - bias: 1 - }); - }, - goLineStartSmart: function (e) { - return e.extendSelectionsBy(function (t) { - return Lo(e, t.head); - }, { - origin: "+move", - bias: 1 - }); - }, - goLineEnd: function (e) { - return e.extendSelectionsBy(function (t) { - return Is(e, t.head.line); - }, { - origin: "+move", - bias: -1 - }); - }, - goLineRight: function (e) { - return e.extendSelectionsBy(function (t) { - var i = e.cursorCoords(t.head, "div").top + 5; - return e.coordsChar({ - left: e.display.lineDiv.offsetWidth + 100, - top: i - }, "div"); - }, Xt); - }, - goLineLeft: function (e) { - return e.extendSelectionsBy(function (t) { - var i = e.cursorCoords(t.head, "div").top + 5; - return e.coordsChar({ - left: 0, - top: i - }, "div"); - }, Xt); - }, - goLineLeftSmart: function (e) { - return e.extendSelectionsBy(function (t) { - var i = e.cursorCoords(t.head, "div").top + 5, - r = e.coordsChar({ - left: 0, - top: i - }, "div"); - return r.ch < e.getLine(r.line).search(/\S/) ? Lo(e, t.head) : r; - }, Xt); - }, - goLineUp: function (e) { - return e.moveV(-1, "line"); - }, - goLineDown: function (e) { - return e.moveV(1, "line"); - }, - goPageUp: function (e) { - return e.moveV(-1, "page"); - }, - goPageDown: function (e) { - return e.moveV(1, "page"); - }, - goCharLeft: function (e) { - return e.moveH(-1, "char"); - }, - goCharRight: function (e) { - return e.moveH(1, "char"); - }, - goColumnLeft: function (e) { - return e.moveH(-1, "column"); - }, - goColumnRight: function (e) { - return e.moveH(1, "column"); - }, - goWordLeft: function (e) { - return e.moveH(-1, "word"); - }, - goGroupRight: function (e) { - return e.moveH(1, "group"); - }, - goGroupLeft: function (e) { - return e.moveH(-1, "group"); - }, - goWordRight: function (e) { - return e.moveH(1, "word"); - }, - delCharBefore: function (e) { - return e.deleteH(-1, "codepoint"); - }, - delCharAfter: function (e) { - return e.deleteH(1, "char"); - }, - delWordBefore: function (e) { - return e.deleteH(-1, "word"); - }, - delWordAfter: function (e) { - return e.deleteH(1, "word"); - }, - delGroupBefore: function (e) { - return e.deleteH(-1, "group"); - }, - delGroupAfter: function (e) { - return e.deleteH(1, "group"); - }, - indentAuto: function (e) { - return e.indentSelection("smart"); - }, - indentMore: function (e) { - return e.indentSelection("add"); - }, - indentLess: function (e) { - return e.indentSelection("subtract"); - }, - insertTab: function (e) { - return e.replaceSelection(" "); - }, - insertSoftTab: function (e) { - for (var t = [], i = e.listSelections(), r = e.options.tabSize, n = 0; n < i.length; n++) { - var l = i[n].from(), - o = xe(e.getLine(l.line), l.ch, r); - t.push(yi(r - o % r)); + } + function defineRefPropWarningGetter(props, displayName) { + { + var warnAboutAccessingRef = function () { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); } - e.replaceSelections(t); - }, - defaultTab: function (e) { - e.somethingSelected() ? e.indentSelection("add") : e.execCommand("insertTab"); - }, - transposeChars: function (e) { - return de(e, function () { - for (var t = e.listSelections(), i = [], r = 0; r < t.length; r++) if (t[r].empty()) { - var n = t[r].head, - l = S(e.doc, n.line).text; - if (l) { - if (n.ch == l.length && (n = new y(n.line, n.ch - 1)), n.ch > 0) n = new y(n.line, n.ch + 1), e.replaceRange(l.charAt(n.ch - 1) + l.charAt(n.ch - 2), y(n.line, n.ch - 2), n, "+transpose");else if (n.line > e.doc.first) { - var o = S(e.doc, n.line - 1).text; - o && (n = new y(n.line, 1), e.replaceRange(l.charAt(0) + e.doc.lineSeparator() + o.charAt(o.length - 1), y(n.line - 1, o.length - 1), n, "+transpose")); - } - } - i.push(new W(n, n)); - } - e.setSelections(i); - }); - }, - newlineAndIndent: function (e) { - return de(e, function () { - for (var t = e.listSelections(), i = t.length - 1; i >= 0; i--) e.replaceRange(e.doc.lineSeparator(), t[i].anchor, t[i].head, "+input"); - t = e.listSelections(); - for (var r = 0; r < t.length; r++) e.indentLine(t[r].from().line, null, !0); - Nt(e); - }); - }, - openLine: function (e) { - return e.replaceSelection(` -`, "start"); - }, - toggleOverwrite: function (e) { - return e.toggleOverwrite(); - } - }; - function So(e, t) { - var i = S(e.doc, t), - r = Se(i); - return r != i && (t = F(r)), mn(!0, e, r, t, 1); - } - u(So, "lineStart"); - function Is(e, t) { - var i = S(e.doc, t), - r = xa(i); - return r != i && (t = F(r)), mn(!0, e, i, t, -1); - } - u(Is, "lineEnd"); - function Lo(e, t) { - var i = So(e, t.line), - r = S(e.doc, i.line), - n = Pe(r, e.doc.direction); - if (!n || n[0].level == 0) { - var l = Math.max(i.ch, r.text.search(/\S/)), - o = t.line == i.line && t.ch <= l && t.ch; - return y(i.line, o ? 0 : l, i.sticky); - } - return i; - } - u(Lo, "lineStartSmart"); - function ai(e, t, i) { - if (typeof t == "string" && (t = br[t], !t)) return !1; - e.display.input.ensurePolled(); - var r = e.display.shift, - n = !1; - try { - e.isReadOnly() && (e.state.suppressEdits = !0), i && (e.display.shift = !1), n = t(e) != Nr; - } finally { - e.display.shift = r, e.state.suppressEdits = !1; - } - return n; - } - u(ai, "doHandleBinding"); - function Rs(e, t, i) { - for (var r = 0; r < e.state.keyMaps.length; r++) { - var n = Et(t, e.state.keyMaps[r], i, e); - if (n) return n; - } - return e.options.extraKeys && Et(t, e.options.extraKeys, i, e) || Et(t, e.options.keyMap, i, e); - } - u(Rs, "lookupKeyForEditor"); - var Bs = new _e(); - function xr(e, t, i, r) { - var n = e.state.keySeq; - if (n) { - if (xo(t)) return "handled"; - if (/\'$/.test(t) ? e.state.keySeq = null : Bs.set(50, function () { - e.state.keySeq == n && (e.state.keySeq = null, e.display.input.reset()); - }), ko(e, n + " " + t, i, r)) return !0; - } - return ko(e, t, i, r); - } - u(xr, "dispatchKey"); - function ko(e, t, i, r) { - var n = Rs(e, t, r); - return n == "multi" && (e.state.keySeq = t), n == "handled" && Z(e, "keyHandled", e, t, i), (n == "handled" || n == "multi") && (ae(i), $i(e)), !!n; - } - u(ko, "dispatchKeyInner"); - function To(e, t) { - var i = wo(t, !0); - return i ? t.shiftKey && !e.state.keySeq ? xr(e, "Shift-" + i, t, function (r) { - return ai(e, r, !0); - }) || xr(e, i, t, function (r) { - if (typeof r == "string" ? /^go[A-Z]/.test(r) : r.motion) return ai(e, r); - }) : xr(e, i, t, function (r) { - return ai(e, r); - }) : !1; - } - u(To, "handleKeyBinding"); - function zs(e, t, i) { - return xr(e, "'" + i + "'", t, function (r) { - return ai(e, r, !0); + }; + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, 'ref', { + get: warnAboutAccessingRef, + configurable: true }); } - u(zs, "handleCharBinding"); - var bn = null; - function Mo(e) { - var t = this; - if (!(e.target && e.target != t.display.input.getField()) && (t.curOp.focus = be(), !q(t, e))) { - O && I < 11 && e.keyCode == 27 && (e.returnValue = !1); - var i = e.keyCode; - t.display.shift = i == 16 || e.shiftKey; - var r = To(t, e); - we && (bn = r ? i : null, !r && i == 88 && !na && (me ? e.metaKey : e.ctrlKey) && t.replaceSelection("", null, "cut")), Fe && !me && !r && i == 46 && e.shiftKey && !e.ctrlKey && document.execCommand && document.execCommand("cut"), i == 18 && !/\bCodeMirror-crosshair\b/.test(t.display.lineDiv.className) && Gs(t); - } - } - u(Mo, "onKeyDown"); - function Gs(e) { - var t = e.display.lineDiv; - it(t, "CodeMirror-crosshair"); - function i(r) { - (r.keyCode == 18 || !r.altKey) && (tt(t, "CodeMirror-crosshair"), ge(document, "keyup", i), ge(document, "mouseover", i)); - } - u(i, "up"), M(document, "keyup", i), M(document, "mouseover", i); - } - u(Gs, "showCrossHair"); - function Do(e) { - e.keyCode == 16 && (this.doc.sel.shift = !1), q(this, e); - } - u(Do, "onKeyUp"); - function No(e) { - var t = this; - if (!(e.target && e.target != t.display.input.getField()) && !(Re(t.display, e) || q(t, e) || e.ctrlKey && !e.altKey || me && e.metaKey)) { - var i = e.keyCode, - r = e.charCode; - if (we && i == bn) { - bn = null, ae(e); - return; - } - if (!(we && (!e.which || e.which < 10) && To(t, e))) { - var n = String.fromCharCode(r !== null && r !== void 0 ? r : i); - n != "\b" && (zs(t, e, n) || t.display.input.onKeyPress(e)); - } + } + /** + * Factory method to create a new React element. This no longer adheres to + * the class pattern, so do not use new to call it. Also, instanceof check + * will not work. Instead test $$typeof field against Symbol.for('react.element') to check + * if something is a React Element. + * + * @param {*} type + * @param {*} props + * @param {*} key + * @param {string|object} ref + * @param {*} owner + * @param {*} self A *temporary* helper to detect places where `this` is + * different from the `owner` when React.createElement is called, so that we + * can warn. We want to get rid of owner and replace string `ref`s with arrow + * functions, and as long as `this` and owner are the same, there will be no + * change in behavior. + * @param {*} source An annotation object (added by a transpiler or otherwise) + * indicating filename, line number, and/or other information. + * @internal + */ + + var ReactElement = function (type, key, ref, self, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type: type, + key: key, + ref: ref, + props: props, + // Record the component responsible for creating this element. + _owner: owner + }; + { + // The validation flag is currently mutative. We put it on + // an external backing store so that we can freeze the whole object. + // This can be replaced with a WeakMap once they are implemented in + // commonly used development environments. + element._store = {}; // To make comparing ReactElements easier for testing purposes, we make + // the validation flag non-enumerable (where possible, which should + // include every environment we run tests in), so the test framework + // ignores it. + + Object.defineProperty(element._store, 'validated', { + configurable: false, + enumerable: false, + writable: true, + value: false + }); // self and source are DEV only properties. + + Object.defineProperty(element, '_self', { + configurable: false, + enumerable: false, + writable: false, + value: self + }); // Two elements created in two different places should be considered + // equal for testing purposes and therefore we hide it from enumeration. + + Object.defineProperty(element, '_source', { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); } } - u(No, "onKeyPress"); - var Us = 400, - xn = u(function (e, t, i) { - this.time = e, this.pos = t, this.button = i; - }, "PastClick"); - xn.prototype.compare = function (e, t, i) { - return this.time + Us > e && D(t, this.pos) == 0 && i == this.button; - }; - var Cr, wr; - function Ks(e, t) { - var i = +new Date(); - return wr && wr.compare(i, e, t) ? (Cr = wr = null, "triple") : Cr && Cr.compare(i, e, t) ? (wr = new xn(i, e, t), Cr = null, "double") : (Cr = new xn(i, e, t), wr = null, "single"); - } - u(Ks, "clickRepeat"); - function Ao(e) { - var t = this, - i = t.display; - if (!(q(t, e) || i.activeTouch && i.input.supportsTouch())) { - if (i.input.ensurePolled(), i.shift = e.shiftKey, Re(i, e)) { - ne || (i.scroller.draggable = !1, setTimeout(function () { - return i.scroller.draggable = !0; - }, 100)); - return; + return element; + }; + /** + * https://github.com/reactjs/rfcs/pull/107 + * @param {*} type + * @param {object} props + * @param {string} key + */ + + function jsxDEV(type, config, maybeKey, source, self) { + { + var propName; // Reserved names are extracted + + var props = {}; + var key = null; + var ref = null; // Currently, key can be spread in as a prop. This causes a potential + // issue if key is also explicitly declared (ie.

+ // or
). We want to deprecate key spread, + // but as an intermediary step, we will use jsxDEV for everything except + //
, because we aren't currently able to tell if + // key is explicitly declared to be undefined or not. + + if (maybeKey !== undefined) { + { + checkKeyStringCoercion(maybeKey); } - if (!Cn(t, e)) { - var r = ft(t, e), - n = zn(e), - l = r ? Ks(r, n) : "single"; - window.focus(), n == 1 && t.state.selectingText && t.state.selectingText(e), !(r && _s(t, n, r, l, e)) && (n == 1 ? r ? Ys(t, r, l, e) : wi(e) == i.scroller && ae(e) : n == 2 ? (r && ti(t.doc, r), setTimeout(function () { - return i.input.focus(); - }, 20)) : n == 3 && (ci ? t.display.input.onContextMenu(e) : en(t))); + key = '' + maybeKey; + } + if (hasValidKey(config)) { + { + checkKeyStringCoercion(config.key); } + key = '' + config.key; } - } - u(Ao, "onMouseDown"); - function _s(e, t, i, r, n) { - var l = "Click"; - return r == "double" ? l = "Double" + l : r == "triple" && (l = "Triple" + l), l = (t == 1 ? "Left" : t == 2 ? "Middle" : "Right") + l, xr(e, Co(l, n), n, function (o) { - if (typeof o == "string" && (o = br[o]), !o) return !1; - var a = !1; - try { - e.isReadOnly() && (e.state.suppressEdits = !0), a = o(e, i) != Nr; - } finally { - e.state.suppressEdits = !1; + if (hasValidRef(config)) { + ref = config.ref; + warnIfStringRefCannotBeAutoConverted(config, self); + } // Remaining properties are added to a new props object + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; } - return a; - }); - } - u(_s, "handleMappedButton"); - function Xs(e, t, i) { - var r = e.getOption("configureMouse"), - n = r ? r(e, t, i) : {}; - if (n.unit == null) { - var l = qo ? i.shiftKey && i.metaKey : i.altKey; - n.unit = l ? "rectangle" : t == "single" ? "char" : t == "double" ? "word" : "line"; - } - return (n.extend == null || e.doc.extend) && (n.extend = e.doc.extend || i.shiftKey), n.addNew == null && (n.addNew = me ? i.metaKey : i.ctrlKey), n.moveOnDrag == null && (n.moveOnDrag = !(me ? i.altKey : i.ctrlKey)), n; - } - u(Xs, "configureMouse"); - function Ys(e, t, i, r) { - O ? setTimeout(pi(Al, e), 0) : e.curOp.focus = be(); - var n = Xs(e, i, r), - l = e.doc.sel, - o; - e.options.dragDrop && ea && !e.isReadOnly() && i == "single" && (o = l.contains(t)) > -1 && (D((o = l.ranges[o]).from(), t) < 0 || t.xRel > 0) && (D(o.to(), t) > 0 || t.xRel < 0) ? qs(e, r, t, n) : Zs(e, r, t, n); - } - u(Ys, "leftButtonDown"); - function qs(e, t, i, r) { - var n = e.display, - l = !1, - o = Q(e, function (f) { - ne && (n.scroller.draggable = !1), e.state.draggingText = !1, e.state.delayingBlurEvent && (e.hasFocus() ? e.state.delayingBlurEvent = !1 : en(e)), ge(n.wrapper.ownerDocument, "mouseup", o), ge(n.wrapper.ownerDocument, "mousemove", a), ge(n.scroller, "dragstart", s), ge(n.scroller, "drop", o), l || (ae(f), r.addNew || ti(e.doc, i, null, null, r.extend), ne && !Mr || O && I == 9 ? setTimeout(function () { - n.wrapper.ownerDocument.body.focus({ - preventScroll: !0 - }), n.input.focus(); - }, 20) : n.input.focus()); - }), - a = u(function (f) { - l = l || Math.abs(t.clientX - f.clientX) + Math.abs(t.clientY - f.clientY) >= 10; - }, "mouseMove"), - s = u(function () { - return l = !0; - }, "dragStart"); - ne && (n.scroller.draggable = !0), e.state.draggingText = o, o.copy = !r.moveOnDrag, M(n.wrapper.ownerDocument, "mouseup", o), M(n.wrapper.ownerDocument, "mousemove", a), M(n.scroller, "dragstart", s), M(n.scroller, "drop", o), e.state.delayingBlurEvent = !0, setTimeout(function () { - return n.input.focus(); - }, 20), n.scroller.dragDrop && n.scroller.dragDrop(); - } - u(qs, "leftButtonStartDrag"); - function Oo(e, t, i) { - if (i == "char") return new W(t, t); - if (i == "word") return e.findWordAt(t); - if (i == "line") return new W(y(t.line, 0), N(e.doc, y(t.line + 1, 0))); - var r = i(e, t); - return new W(r.from, r.to); - } - u(Oo, "rangeForUnit"); - function Zs(e, t, i, r) { - O && en(e); - var n = e.display, - l = e.doc; - ae(t); - var o, - a, - s = l.sel, - f = s.ranges; - if (r.addNew && !r.extend ? (a = l.sel.contains(i), a > -1 ? o = f[a] : o = new W(i, i)) : (o = l.sel.primary(), a = l.sel.primIndex), r.unit == "rectangle") r.addNew || (o = new W(i, i)), i = ft(e, t, !0, !0), a = -1;else { - var h = Oo(e, i, r.unit); - r.extend ? o = pn(o, h.anchor, h.head, r.extend) : o = h; - } - r.addNew ? a == -1 ? (a = f.length, te(l, ke(e, f.concat([o]), a), { - scroll: !1, - origin: "*mouse" - })) : f.length > 1 && f[a].empty() && r.unit == "char" && !r.extend ? (te(l, ke(e, f.slice(0, a).concat(f.slice(a + 1)), 0), { - scroll: !1, - origin: "*mouse" - }), s = l.sel) : vn(l, a, o, vi) : (a = 0, te(l, new ye([o], 0), vi), s = l.sel); - var c = i; - function p(x) { - if (D(c, x) != 0) if (c = x, r.unit == "rectangle") { - for (var w = [], k = e.options.tabSize, L = xe(S(l, i.line).text, i.ch, k), A = xe(S(l, x.line).text, x.ch, k), E = Math.min(L, A), j = Math.max(L, A), B = Math.min(i.line, x.line), pe = Math.min(e.lastLine(), Math.max(i.line, x.line)); B <= pe; B++) { - var fe = S(l, B).text, - _ = gi(fe, E, k); - E == j ? w.push(new W(y(B, _), y(B, _))) : fe.length > _ && w.push(new W(y(B, _), y(B, gi(fe, j, k)))); + } // Resolve default props + + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + for (propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; } - w.length || w.push(new W(i, i)), te(l, ke(e, s.ranges.slice(0, a).concat(w), a), { - origin: "*mouse", - scroll: !1 - }), e.scrollIntoView(x); - } else { - var he = o, - $ = Oo(e, x, r.unit), - Y = he.anchor, - X; - D($.anchor, Y) > 0 ? (X = $.head, Y = Pr(he.from(), $.anchor)) : (X = $.anchor, Y = Fr(he.to(), $.head)); - var z = s.ranges.slice(0); - z[a] = Qs(e, new W(N(l, Y), X)), te(l, ke(e, z, a), vi); - } - } - u(p, "extendTo"); - var d = n.wrapper.getBoundingClientRect(), - v = 0; - function g(x) { - var w = ++v, - k = ft(e, x, !0, r.unit == "rectangle"); - if (k) if (D(k, c) != 0) { - e.curOp.focus = be(), p(k); - var L = Qr(n, l); - (k.line >= L.to || k.line < L.from) && setTimeout(Q(e, function () { - v == w && g(x); - }), 150); - } else { - var A = x.clientY < d.top ? -20 : x.clientY > d.bottom ? 20 : 0; - A && setTimeout(Q(e, function () { - v == w && (n.scroller.scrollTop += A, g(x)); - }), 50); } } - u(g, "extend"); - function m(x) { - e.state.selectingText = !1, v = 1 / 0, x && (ae(x), n.input.focus()), ge(n.wrapper.ownerDocument, "mousemove", b), ge(n.wrapper.ownerDocument, "mouseup", C), l.history.lastSelOrigin = null; - } - u(m, "done"); - var b = Q(e, function (x) { - x.buttons === 0 || !zn(x) ? m(x) : g(x); - }), - C = Q(e, m); - e.state.selectingText = C, M(n.wrapper.ownerDocument, "mousemove", b), M(n.wrapper.ownerDocument, "mouseup", C); - } - u(Zs, "leftButtonSelect"); - function Qs(e, t) { - var i = t.anchor, - r = t.head, - n = S(e.doc, i.line); - if (D(i, r) == 0 && i.sticky == r.sticky) return t; - var l = Pe(n); - if (!l) return t; - var o = Zt(l, i.ch, i.sticky), - a = l[o]; - if (a.from != i.ch && a.to != i.ch) return t; - var s = o + (a.from == i.ch == (a.level != 1) ? 0 : 1); - if (s == 0 || s == l.length) return t; - var f; - if (r.line != i.line) f = (r.line - i.line) * (e.doc.direction == "ltr" ? 1 : -1) > 0;else { - var h = Zt(l, r.ch, r.sticky), - c = h - o || (r.ch - i.ch) * (a.level == 1 ? -1 : 1); - h == s - 1 || h == s ? f = c < 0 : f = c > 0; - } - var p = l[s + (f ? -1 : 0)], - d = f == (p.level == 1), - v = d ? p.from : p.to, - g = d ? "after" : "before"; - return i.ch == v && i.sticky == g ? t : new W(new y(i.line, v, g), r); - } - u(Qs, "bidiSimplify"); - function Wo(e, t, i, r) { - var n, l; - if (t.touches) n = t.touches[0].clientX, l = t.touches[0].clientY;else try { - n = t.clientX, l = t.clientY; - } catch { - return !1; - } - if (n >= Math.floor(e.display.gutters.getBoundingClientRect().right)) return !1; - r && ae(t); - var o = e.display, - a = o.lineDiv.getBoundingClientRect(); - if (l > a.bottom || !Ce(e, i)) return Ci(t); - l -= a.top - o.viewOffset; - for (var s = 0; s < e.display.gutterSpecs.length; ++s) { - var f = o.gutters.childNodes[s]; - if (f && f.getBoundingClientRect().right >= n) { - var h = at(e.doc, l), - c = e.display.gutterSpecs[s]; - return U(e, i, e, h, c.className, t), Ci(t); - } - } - } - u(Wo, "gutterEvent"); - function Cn(e, t) { - return Wo(e, t, "gutterClick", !0); - } - u(Cn, "clickInGutter"); - function Ho(e, t) { - Re(e.display, t) || Js(e, t) || q(e, t, "contextmenu") || ci || e.display.input.onContextMenu(t); - } - u(Ho, "onContextMenu"); - function Js(e, t) { - return Ce(e, "gutterContextMenu") ? Wo(e, t, "gutterContextMenu", !1) : !1; - } - u(Js, "contextMenuInGutter"); - function Fo(e) { - e.display.wrapper.className = e.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + e.options.theme.replace(/(^|\s)\s*/g, " cm-s-"), rr(e); - } - u(Fo, "themeChanged"); - var Rt = { - toString: function () { - return "CodeMirror.Init"; - } - }, - Po = {}, - si = {}; - function js(e) { - var t = e.optionHandlers; - function i(r, n, l, o) { - e.defaults[r] = n, l && (t[r] = o ? function (a, s, f) { - f != Rt && l(a, s, f); - } : l); - } - u(i, "option"), e.defineOption = i, e.Init = Rt, i("value", "", function (r, n) { - return r.setValue(n); - }, !0), i("mode", null, function (r, n) { - r.doc.modeOption = n, hn(r); - }, !0), i("indentUnit", 2, hn, !0), i("indentWithTabs", !1), i("smartIndent", !0), i("tabSize", 4, function (r) { - fr(r), rr(r), se(r); - }, !0), i("lineSeparator", null, function (r, n) { - if (r.doc.lineSep = n, !!n) { - var l = [], - o = r.doc.first; - r.doc.iter(function (s) { - for (var f = 0;;) { - var h = s.text.indexOf(n, f); - if (h == -1) break; - f = h + n.length, l.push(y(o, h)); - } - o++; - }); - for (var a = l.length - 1; a >= 0; a--) Ft(r.doc, n, l[a], y(l[a].line, l[a].ch + n.length)); - } - }), i("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (r, n, l) { - r.state.specialChars = new RegExp(n.source + (n.test(" ") ? "" : "| "), "g"), l != Rt && r.refresh(); - }), i("specialCharPlaceholder", Ta, function (r) { - return r.refresh(); - }, !0), i("electricChars", !0), i("inputStyle", Kt ? "contenteditable" : "textarea", function () { - throw new Error("inputStyle can not (yet) be changed in a running editor"); - }, !0), i("spellcheck", !1, function (r, n) { - return r.getInputField().spellcheck = n; - }, !0), i("autocorrect", !1, function (r, n) { - return r.getInputField().autocorrect = n; - }, !0), i("autocapitalize", !1, function (r, n) { - return r.getInputField().autocapitalize = n; - }, !0), i("rtlMoveVisually", !Zo), i("wholeLineUpdateBefore", !0), i("theme", "default", function (r) { - Fo(r), ur(r); - }, !0), i("keyMap", "default", function (r, n, l) { - var o = oi(n), - a = l != Rt && oi(l); - a && a.detach && a.detach(r, o), o.attach && o.attach(r, a || null); - }), i("extraKeys", null), i("configureMouse", null), i("lineWrapping", !1, $s, !0), i("gutters", [], function (r, n) { - r.display.gutterSpecs = un(n, r.options.lineNumbers), ur(r); - }, !0), i("fixedGutter", !0, function (r, n) { - r.display.gutters.style.left = n ? Ji(r.display) + "px" : "0", r.refresh(); - }, !0), i("coverGutterNextToScrollbar", !1, function (r) { - return At(r); - }, !0), i("scrollbarStyle", "native", function (r) { - El(r), At(r), r.display.scrollbars.setScrollTop(r.doc.scrollTop), r.display.scrollbars.setScrollLeft(r.doc.scrollLeft); - }, !0), i("lineNumbers", !1, function (r, n) { - r.display.gutterSpecs = un(r.options.gutters, n), ur(r); - }, !0), i("firstLineNumber", 1, ur, !0), i("lineNumberFormatter", function (r) { - return r; - }, ur, !0), i("showCursorWhenSelecting", !1, ir, !0), i("resetSelectionOnContextMenu", !0), i("lineWiseCopyCut", !0), i("pasteLinesPerSelection", !0), i("selectionsMayTouch", !1), i("readOnly", !1, function (r, n) { - n == "nocursor" && (Dt(r), r.display.input.blur()), r.display.input.readOnlyChanged(n); - }), i("screenReaderLabel", null, function (r, n) { - n = n === "" ? null : n, r.display.input.screenReaderLabelChanged(n); - }), i("disableInput", !1, function (r, n) { - n || r.display.input.reset(); - }, !0), i("dragDrop", !0, Vs), i("allowDropFileTypes", null), i("cursorBlinkRate", 530), i("cursorScrollMargin", 0), i("cursorHeight", 1, ir, !0), i("singleCursorHeightPerLine", !0, ir, !0), i("workTime", 100), i("workDelay", 100), i("flattenSpans", !0, fr, !0), i("addModeClass", !1, fr, !0), i("pollInterval", 100), i("undoDepth", 200, function (r, n) { - return r.doc.history.undoDepth = n; - }), i("historyEventDelay", 1250), i("viewportMargin", 10, function (r) { - return r.refresh(); - }, !0), i("maxHighlightLength", 1e4, fr, !0), i("moveInputWithCursor", !0, function (r, n) { - n || r.display.input.resetPosition(); - }), i("tabindex", null, function (r, n) { - return r.display.input.getField().tabIndex = n || ""; - }), i("autofocus", null), i("direction", "ltr", function (r, n) { - return r.doc.setDirection(n); - }, !0), i("phrases", null); - } - u(js, "defineOptions"); - function Vs(e, t, i) { - var r = i && i != Rt; - if (!t != !r) { - var n = e.display.dragFunctions, - l = t ? M : ge; - l(e.display.scroller, "dragstart", n.start), l(e.display.scroller, "dragenter", n.enter), l(e.display.scroller, "dragover", n.over), l(e.display.scroller, "dragleave", n.leave), l(e.display.scroller, "drop", n.drop); - } - } - u(Vs, "dragDropChanged"); - function $s(e) { - e.options.lineWrapping ? (it(e.display.wrapper, "CodeMirror-wrap"), e.display.sizer.style.minWidth = "", e.display.sizerWidth = null) : (tt(e.display.wrapper, "CodeMirror-wrap"), zi(e)), ji(e), se(e), rr(e), setTimeout(function () { - return At(e); - }, 100); - } - u($s, "wrappingChanged"); - function R(e, t) { - var i = this; - if (!(this instanceof R)) return new R(e, t); - this.options = t = t ? nt(t) : {}, nt(Po, t, !1); - var r = t.value; - typeof r == "string" ? r = new ue(r, t.mode, null, t.lineSeparator, t.direction) : t.mode && (r.modeOption = t.mode), this.doc = r; - var n = new R.inputStyles[t.inputStyle](this), - l = this.display = new cs(e, r, n, t); - l.wrapper.CodeMirror = this, Fo(this), t.lineWrapping && (this.display.wrapper.className += " CodeMirror-wrap"), El(this), this.state = { - keyMaps: [], - overlays: [], - modeGen: 0, - overwrite: !1, - delayingBlurEvent: !1, - focused: !1, - suppressEdits: !1, - pasteIncoming: -1, - cutIncoming: -1, - selectingText: !1, - draggingText: !1, - highlight: new _e(), - keySeq: null, - specialChars: null - }, t.autofocus && !Kt && l.input.focus(), O && I < 11 && setTimeout(function () { - return i.display.input.reset(!0); - }, 20), eu(this), Os(), pt(this), this.curOp.forceUpdate = !0, Yl(this, r), t.autofocus && !Kt || this.hasFocus() ? setTimeout(function () { - i.hasFocus() && !i.state.focused && tn(i); - }, 20) : Dt(this); - for (var o in si) si.hasOwnProperty(o) && si[o](this, t[o], Rt); - Bl(this), t.finishInit && t.finishInit(this); - for (var a = 0; a < wn.length; ++a) wn[a](this); - vt(this), ne && t.lineWrapping && getComputedStyle(l.lineDiv).textRendering == "optimizelegibility" && (l.lineDiv.style.textRendering = "auto"); - } - u(R, "CodeMirror"), R.defaults = Po, R.optionHandlers = si; - function eu(e) { - var t = e.display; - M(t.scroller, "mousedown", Q(e, Ao)), O && I < 11 ? M(t.scroller, "dblclick", Q(e, function (s) { - if (!q(e, s)) { - var f = ft(e, s); - if (!(!f || Cn(e, s) || Re(e.display, s))) { - ae(s); - var h = e.findWordAt(f); - ti(e.doc, h.anchor, h.head); - } + if (key || ref) { + var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; + if (key) { + defineKeyPropWarningGetter(props, displayName); } - })) : M(t.scroller, "dblclick", function (s) { - return q(e, s) || ae(s); - }), M(t.scroller, "contextmenu", function (s) { - return Ho(e, s); - }), M(t.input.getField(), "contextmenu", function (s) { - t.scroller.contains(s.target) || Ho(e, s); - }); - var i, - r = { - end: 0 - }; - function n() { - t.activeTouch && (i = setTimeout(function () { - return t.activeTouch = null; - }, 1e3), r = t.activeTouch, r.end = +new Date()); - } - u(n, "finishTouch"); - function l(s) { - if (s.touches.length != 1) return !1; - var f = s.touches[0]; - return f.radiusX <= 1 && f.radiusY <= 1; - } - u(l, "isMouseLikeTouchEvent"); - function o(s, f) { - if (f.left == null) return !0; - var h = f.left - s.left, - c = f.top - s.top; - return h * h + c * c > 20 * 20; - } - u(o, "farAway"), M(t.scroller, "touchstart", function (s) { - if (!q(e, s) && !l(s) && !Cn(e, s)) { - t.input.ensurePolled(), clearTimeout(i); - var f = +new Date(); - t.activeTouch = { - start: f, - moved: !1, - prev: f - r.end <= 300 ? r : null - }, s.touches.length == 1 && (t.activeTouch.left = s.touches[0].pageX, t.activeTouch.top = s.touches[0].pageY); - } - }), M(t.scroller, "touchmove", function () { - t.activeTouch && (t.activeTouch.moved = !0); - }), M(t.scroller, "touchend", function (s) { - var f = t.activeTouch; - if (f && !Re(t, s) && f.left != null && !f.moved && new Date() - f.start < 300) { - var h = e.coordsChar(t.activeTouch, "page"), - c; - !f.prev || o(f, f.prev) ? c = new W(h, h) : !f.prev.prev || o(f, f.prev.prev) ? c = e.findWordAt(h) : c = new W(y(h.line, 0), N(e.doc, y(h.line + 1, 0))), e.setSelection(c.anchor, c.head), e.focus(), ae(s); - } - n(); - }), M(t.scroller, "touchcancel", n), M(t.scroller, "scroll", function () { - t.scroller.clientHeight && (lr(e, t.scroller.scrollTop), ct(e, t.scroller.scrollLeft, !0), U(e, "scroll", e)); - }), M(t.scroller, "mousewheel", function (s) { - return Ul(e, s); - }), M(t.scroller, "DOMMouseScroll", function (s) { - return Ul(e, s); - }), M(t.wrapper, "scroll", function () { - return t.wrapper.scrollTop = t.wrapper.scrollLeft = 0; - }), t.dragFunctions = { - enter: function (s) { - q(e, s) || Qt(s); - }, - over: function (s) { - q(e, s) || (As(e, s), Qt(s)); - }, - start: function (s) { - return Ns(e, s); - }, - drop: Q(e, Ds), - leave: function (s) { - q(e, s) || yo(e); + if (ref) { + defineRefPropWarningGetter(props, displayName); } - }; - var a = t.input.getField(); - M(a, "keyup", function (s) { - return Do.call(e, s); - }), M(a, "keydown", Q(e, Mo)), M(a, "keypress", Q(e, No)), M(a, "focus", function (s) { - return tn(e, s); - }), M(a, "blur", function (s) { - return Dt(e, s); - }); + } + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); } - u(eu, "registerEventHandlers"); - var wn = []; - R.defineInitHook = function (e) { - return wn.push(e); - }; - function Sr(e, t, i, r) { - var n = e.doc, - l; - i == null && (i = "add"), i == "smart" && (n.mode.indent ? l = jt(e, t).state : i = "prev"); - var o = e.options.tabSize, - a = S(n, t), - s = xe(a.text, null, o); - a.stateAfter && (a.stateAfter = null); - var f = a.text.match(/^\s*/)[0], - h; - if (!r && !/\S/.test(a.text)) h = 0, i = "not";else if (i == "smart" && (h = n.mode.indent(l, a.text.slice(f.length), a.text), h == Nr || h > 150)) { - if (!r) return; - i = "prev"; - } - i == "prev" ? t > n.first ? h = xe(S(n, t - 1).text, null, o) : h = 0 : i == "add" ? h = s + e.options.indentUnit : i == "subtract" ? h = s - e.options.indentUnit : typeof i == "number" && (h = s + i), h = Math.max(0, h); - var c = "", - p = 0; - if (e.options.indentWithTabs) for (var d = Math.floor(h / o); d; --d) p += o, c += " "; - if (p < h && (c += yi(h - p)), c != f) return Ft(n, c, y(t, 0), y(t, f.length), "+input"), a.stateAfter = null, !0; - for (var v = 0; v < n.sel.ranges.length; v++) { - var g = n.sel.ranges[v]; - if (g.head.line == t && g.head.ch < f.length) { - var m = y(t, f.length); - vn(n, v, new W(m, m)); - break; - } + } + var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner; + var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); } } - u(Sr, "indentLine"); - var Te = null; - function ui(e) { - Te = e; - } - u(ui, "setLastCopied"); - function Sn(e, t, i, r, n) { - var l = e.doc; - e.display.shift = !1, r || (r = l.sel); - var o = +new Date() - 200, - a = n == "paste" || e.state.pasteIncoming > o, - s = ki(t), - f = null; - if (a && r.ranges.length > 1) if (Te && Te.text.join(` -`) == t) { - if (r.ranges.length % Te.text.length == 0) { - f = []; - for (var h = 0; h < Te.text.length; h++) f.push(l.splitLines(Te.text[h])); - } - } else s.length == r.ranges.length && e.options.pasteLinesPerSelection && (f = Or(s, function (b) { - return [b]; - })); - for (var c = e.curOp.updateInput, p = r.ranges.length - 1; p >= 0; p--) { - var d = r.ranges[p], - v = d.from(), - g = d.to(); - d.empty() && (i && i > 0 ? v = y(v.line, v.ch - i) : e.state.overwrite && !a ? g = y(g.line, Math.min(S(l, g.line).text.length, g.ch + H(s).length)) : a && Te && Te.lineWise && Te.text.join(` -`) == s.join(` -`) && (v = g = y(v.line, 0))); - var m = { - from: v, - to: g, - text: f ? f[p % f.length] : s, - origin: n || (a ? "paste" : e.state.cutIncoming > o ? "cut" : "+input") - }; - Ht(e.doc, m), Z(e, "inputRead", e, m); - } - t && !a && Io(e, t), Nt(e), e.curOp.updateInput < 2 && (e.curOp.updateInput = c), e.curOp.typing = !0, e.state.pasteIncoming = e.state.cutIncoming = -1; - } - u(Sn, "applyTextInput"); - function Eo(e, t) { - var i = e.clipboardData && e.clipboardData.getData("Text"); - if (i) return e.preventDefault(), !t.isReadOnly() && !t.options.disableInput && de(t, function () { - return Sn(t, i, 0, null, "paste"); - }), !0; - } - u(Eo, "handlePaste"); - function Io(e, t) { - if (!(!e.options.electricChars || !e.options.smartIndent)) for (var i = e.doc.sel, r = i.ranges.length - 1; r >= 0; r--) { - var n = i.ranges[r]; - if (!(n.head.ch > 100 || r && i.ranges[r - 1].head.line == n.head.line)) { - var l = e.getModeAt(n.head), - o = !1; - if (l.electricChars) { - for (var a = 0; a < l.electricChars.length; a++) if (t.indexOf(l.electricChars.charAt(a)) > -1) { - o = Sr(e, n.head.line, "smart"); - break; - } - } else l.electricInput && l.electricInput.test(S(e.doc, n.head.line).text.slice(0, n.head.ch)) && (o = Sr(e, n.head.line, "smart")); - o && Z(e, "electricInput", e, n.head.line); + } + var propTypesMisspellWarningShown; + { + propTypesMisspellWarningShown = false; + } + /** + * Verifies the object is a ReactElement. + * See https://reactjs.org/docs/react-api.html#isvalidelement + * @param {?object} object + * @return {boolean} True if `object` is a ReactElement. + * @final + */ + + function isValidElement(object) { + { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + } + } + function getDeclarationErrorAddendum() { + { + if (ReactCurrentOwner$1.current) { + var name = getComponentNameFromType(ReactCurrentOwner$1.current.type); + if (name) { + return '\n\nCheck the render method of `' + name + '`.'; } } + return ''; } - u(Io, "triggerElectric"); - function Ro(e) { - for (var t = [], i = [], r = 0; r < e.doc.sel.ranges.length; r++) { - var n = e.doc.sel.ranges[r].head.line, - l = { - anchor: y(n, 0), - head: y(n + 1, 0) - }; - i.push(l), t.push(e.getRange(l.anchor, l.head)); + } + function getSourceInfoErrorAddendum(source) { + { + if (source !== undefined) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ''); + var lineNumber = source.lineNumber; + return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; } - return { - text: t, - ranges: i - }; + return ''; } - u(Ro, "copyableRanges"); - function Bo(e, t, i, r) { - e.setAttribute("autocorrect", i ? "" : "off"), e.setAttribute("autocapitalize", r ? "" : "off"), e.setAttribute("spellcheck", !!t); - } - u(Bo, "disableBrowserMagic"); - function zo() { - var e = T("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none"), - t = T("div", [e], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); - return ne ? e.style.width = "1000px" : e.setAttribute("wrap", "off"), Ut && (e.style.border = "1px solid black"), Bo(e), t; - } - u(zo, "hiddenTextarea"); - function tu(e) { - var t = e.optionHandlers, - i = e.helpers = {}; - e.prototype = { - constructor: e, - focus: function () { - window.focus(), this.display.input.focus(); - }, - setOption: function (r, n) { - var l = this.options, - o = l[r]; - l[r] == n && r != "mode" || (l[r] = n, t.hasOwnProperty(r) && Q(this, t[r])(this, n, o), U(this, "optionChange", this, r)); - }, - getOption: function (r) { - return this.options[r]; - }, - getDoc: function () { - return this.doc; - }, - addKeyMap: function (r, n) { - this.state.keyMaps[n ? "push" : "unshift"](oi(r)); - }, - removeKeyMap: function (r) { - for (var n = this.state.keyMaps, l = 0; l < n.length; ++l) if (n[l] == r || n[l].name == r) return n.splice(l, 1), !0; - }, - addOverlay: le(function (r, n) { - var l = r.token ? r : e.getMode(this.options, r); - if (l.startState) throw new Error("Overlays may not be stateful."); - Qo(this.state.overlays, { - mode: l, - modeSpec: r, - opaque: n && n.opaque, - priority: n && n.priority || 0 - }, function (o) { - return o.priority; - }), this.state.modeGen++, se(this); - }), - removeOverlay: le(function (r) { - for (var n = this.state.overlays, l = 0; l < n.length; ++l) { - var o = n[l].modeSpec; - if (o == r || typeof r == "string" && o.name == r) { - n.splice(l, 1), this.state.modeGen++, se(this); - return; - } - } - }), - indentLine: le(function (r, n, l) { - typeof n != "string" && typeof n != "number" && (n == null ? n = this.options.smartIndent ? "smart" : "prev" : n = n ? "add" : "subtract"), Jt(this.doc, r) && Sr(this, r, n, l); - }), - indentSelection: le(function (r) { - for (var n = this.doc.sel.ranges, l = -1, o = 0; o < n.length; o++) { - var a = n[o]; - if (a.empty()) a.head.line > l && (Sr(this, a.head.line, r, !0), l = a.head.line, o == this.doc.sel.primIndex && Nt(this));else { - var s = a.from(), - f = a.to(), - h = Math.max(l, s.line); - l = Math.min(this.lastLine(), f.line - (f.ch ? 0 : 1)) + 1; - for (var c = h; c < l; ++c) Sr(this, c, r); - var p = this.doc.sel.ranges; - s.ch == 0 && n.length == p.length && p[o].from().ch > 0 && vn(this.doc, o, new W(s, p[o].to()), Me); - } - } - }), - getTokenAt: function (r, n) { - return Zn(this, r, n); - }, - getLineTokens: function (r, n) { - return Zn(this, y(r), n, !0); - }, - getTokenTypeAt: function (r) { - r = N(this.doc, r); - var n = Xn(this, S(this.doc, r.line)), - l = 0, - o = (n.length - 1) / 2, - a = r.ch, - s; - if (a == 0) s = n[2];else for (;;) { - var f = l + o >> 1; - if ((f ? n[f * 2 - 1] : 0) >= a) o = f;else if (n[f * 2 + 1] < a) l = f + 1;else { - s = n[f * 2 + 2]; - break; - } - } - var h = s ? s.indexOf("overlay ") : -1; - return h < 0 ? s : h == 0 ? null : s.slice(0, h - 1); - }, - getModeAt: function (r) { - var n = this.doc.mode; - return n.innerMode ? e.innerMode(n, this.getTokenAt(r).state).mode : n; - }, - getHelper: function (r, n) { - return this.getHelpers(r, n)[0]; - }, - getHelpers: function (r, n) { - var l = []; - if (!i.hasOwnProperty(n)) return l; - var o = i[n], - a = this.getModeAt(r); - if (typeof a[n] == "string") o[a[n]] && l.push(o[a[n]]);else if (a[n]) for (var s = 0; s < a[n].length; s++) { - var f = o[a[n][s]]; - f && l.push(f); - } else a.helperType && o[a.helperType] ? l.push(o[a.helperType]) : o[a.name] && l.push(o[a.name]); - for (var h = 0; h < o._global.length; h++) { - var c = o._global[h]; - c.pred(a, this) && ee(l, c.val) == -1 && l.push(c.val); - } - return l; - }, - getStateAfter: function (r, n) { - var _r3; - var l = this.doc; - return r = Un(l, (_r3 = r) !== null && _r3 !== void 0 ? _r3 : l.first + l.size - 1), jt(this, r + 1, n).state; - }, - cursorCoords: function (r, n) { - var l, - o = this.doc.sel.primary(); - return r == null ? l = o.head : typeof r == "object" ? l = N(this.doc, r) : l = r ? o.from() : o.to(), Le(this, l, n || "page"); - }, - charCoords: function (r, n) { - return Xr(this, N(this.doc, r), n || "page"); - }, - coordsChar: function (r, n) { - return r = Sl(this, r, n || "page"), qi(this, r.left, r.top); - }, - lineAtHeight: function (r, n) { - return r = Sl(this, { - top: r, - left: 0 - }, n || "page").top, at(this.doc, r + this.display.viewOffset); - }, - heightAtLine: function (r, n, l) { - var o = !1, - a; - if (typeof r == "number") { - var s = this.doc.first + this.doc.size - 1; - r < this.doc.first ? r = this.doc.first : r > s && (r = s, o = !0), a = S(this.doc, r); - } else a = r; - return _r(this, a, { - top: 0, - left: 0 - }, n || "page", l || o).top + (o ? this.doc.height - Ie(a) : 0); - }, - defaultTextHeight: function () { - return Tt(this.display); - }, - defaultCharWidth: function () { - return Mt(this.display); - }, - getViewport: function () { - return { - from: this.display.viewFrom, - to: this.display.viewTo - }; - }, - addWidget: function (r, n, l, o, a) { - var s = this.display; - r = Le(this, N(this.doc, r)); - var f = r.bottom, - h = r.left; - if (n.style.position = "absolute", n.setAttribute("cm-ignore-events", "true"), this.display.input.setUneditable(n), s.sizer.appendChild(n), o == "over") f = r.top;else if (o == "above" || o == "near") { - var c = Math.max(s.wrapper.clientHeight, this.doc.height), - p = Math.max(s.sizer.clientWidth, s.lineSpace.clientWidth); - (o == "above" || r.bottom + n.offsetHeight > c) && r.top > n.offsetHeight ? f = r.top - n.offsetHeight : r.bottom + n.offsetHeight <= c && (f = r.bottom), h + n.offsetWidth > p && (h = p - n.offsetWidth); - } - n.style.top = f + "px", n.style.left = n.style.right = "", a == "right" ? (h = s.sizer.clientWidth - n.offsetWidth, n.style.right = "0px") : (a == "left" ? h = 0 : a == "middle" && (h = (s.sizer.clientWidth - n.offsetWidth) / 2), n.style.left = h + "px"), l && Va(this, { - left: h, - top: f, - right: h + n.offsetWidth, - bottom: f + n.offsetHeight - }); - }, - triggerOnKeyDown: le(Mo), - triggerOnKeyPress: le(No), - triggerOnKeyUp: Do, - triggerOnMouseDown: le(Ao), - execCommand: function (r) { - if (br.hasOwnProperty(r)) return br[r].call(null, this); - }, - triggerElectric: le(function (r) { - Io(this, r); - }), - findPosH: function (r, n, l, o) { - var a = 1; - n < 0 && (a = -1, n = -n); - for (var s = N(this.doc, r), f = 0; f < n && (s = Ln(this.doc, s, a, l, o), !s.hitSide); ++f); - return s; - }, - moveH: le(function (r, n) { - var l = this; - this.extendSelectionsBy(function (o) { - return l.display.shift || l.doc.extend || o.empty() ? Ln(l.doc, o.head, r, n, l.options.rtlMoveVisually) : r < 0 ? o.from() : o.to(); - }, Xt); - }), - deleteH: le(function (r, n) { - var l = this.doc.sel, - o = this.doc; - l.somethingSelected() ? o.replaceSelection("", null, "+delete") : It(this, function (a) { - var s = Ln(o, a.head, r, n, !1); - return r < 0 ? { - from: s, - to: a.head - } : { - from: a.head, - to: s - }; - }); - }), - findPosV: function (r, n, l, o) { - var a = 1, - s = o; - n < 0 && (a = -1, n = -n); - for (var f = N(this.doc, r), h = 0; h < n; ++h) { - var c = Le(this, f, "div"); - if (s == null ? s = c.left : c.left = s, f = Go(this, c, a, l), f.hitSide) break; - } - return f; - }, - moveV: le(function (r, n) { - var l = this, - o = this.doc, - a = [], - s = !this.display.shift && !o.extend && o.sel.somethingSelected(); - if (o.extendSelectionsBy(function (h) { - if (s) return r < 0 ? h.from() : h.to(); - var c = Le(l, h.head, "div"); - h.goalColumn != null && (c.left = h.goalColumn), a.push(c.left); - var p = Go(l, c, r, n); - return n == "page" && h == o.sel.primary() && nn(l, Xr(l, p, "div").top - c.top), p; - }, Xt), a.length) for (var f = 0; f < o.sel.ranges.length; f++) o.sel.ranges[f].goalColumn = a[f]; - }), - findWordAt: function (r) { - var n = this.doc, - l = S(n, r.line).text, - o = r.ch, - a = r.ch; - if (l) { - var s = this.getHelper(r, "wordChars"); - (r.sticky == "before" || a == l.length) && o ? --o : ++a; - for (var f = l.charAt(o), h = Wr(f, s) ? function (c) { - return Wr(c, s); - } : /\s/.test(f) ? function (c) { - return /\s/.test(c); - } : function (c) { - return !/\s/.test(c) && !Wr(c); - }; o > 0 && h(l.charAt(o - 1));) --o; - for (; a < l.length && h(l.charAt(a));) ++a; - } - return new W(y(r.line, o), y(r.line, a)); - }, - toggleOverwrite: function (r) { - r != null && r == this.state.overwrite || ((this.state.overwrite = !this.state.overwrite) ? it(this.display.cursorDiv, "CodeMirror-overwrite") : tt(this.display.cursorDiv, "CodeMirror-overwrite"), U(this, "overwriteToggle", this, this.state.overwrite)); - }, - hasFocus: function () { - return this.display.input.getField() == be(); - }, - isReadOnly: function () { - return !!(this.options.readOnly || this.doc.cantEdit); - }, - scrollTo: le(function (r, n) { - nr(this, r, n); - }), - getScrollInfo: function () { - var r = this.display.scroller; - return { - left: r.scrollLeft, - top: r.scrollTop, - height: r.scrollHeight - Ae(this) - this.display.barHeight, - width: r.scrollWidth - Ae(this) - this.display.barWidth, - clientHeight: Ki(this), - clientWidth: st(this) - }; - }, - scrollIntoView: le(function (r, n) { - r == null ? (r = { - from: this.doc.sel.primary().head, - to: null - }, n == null && (n = this.options.cursorScrollMargin)) : typeof r == "number" ? r = { - from: y(r, 0), - to: null - } : r.from == null && (r = { - from: r, - to: null - }), r.to || (r.to = r.from), r.margin = n || 0, r.from.line != null ? $a(this, r) : Wl(this, r.from, r.to, r.margin); - }), - setSize: le(function (r, n) { - var l = this, - o = u(function (s) { - return typeof s == "number" || /^\d+$/.test(String(s)) ? s + "px" : s; - }, "interpret"); - r != null && (this.display.wrapper.style.width = o(r)), n != null && (this.display.wrapper.style.height = o(n)), this.options.lineWrapping && xl(this); - var a = this.display.viewFrom; - this.doc.iter(a, this.display.viewTo, function (s) { - if (s.widgets) { - for (var f = 0; f < s.widgets.length; f++) if (s.widgets[f].noHScroll) { - Ye(l, a, "widget"); - break; - } - } - ++a; - }), this.curOp.forceUpdate = !0, U(this, "refresh", this); - }), - operation: function (r) { - return de(this, r); - }, - startOperation: function () { - return pt(this); - }, - endOperation: function () { - return vt(this); - }, - refresh: le(function () { - var r = this.display.cachedTextHeight; - se(this), this.curOp.forceUpdate = !0, rr(this), nr(this, this.doc.scrollLeft, this.doc.scrollTop), an(this.display), (r == null || Math.abs(r - Tt(this.display)) > .5 || this.options.lineWrapping) && ji(this), U(this, "refresh", this); - }), - swapDoc: le(function (r) { - var n = this.doc; - return n.cm = null, this.state.selectingText && this.state.selectingText(), Yl(this, r), rr(this), this.display.input.reset(), nr(this, r.scrollLeft, r.scrollTop), this.curOp.forceScroll = !0, Z(this, "swapDoc", this, n), n; - }), - phrase: function (r) { - var n = this.options.phrases; - return n && Object.prototype.hasOwnProperty.call(n, r) ? n[r] : r; - }, - getInputField: function () { - return this.display.input.getField(); - }, - getWrapperElement: function () { - return this.display.wrapper; - }, - getScrollerElement: function () { - return this.display.scroller; - }, - getGutterElement: function () { - return this.display.gutters; + } + /** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + + var ownerHasKeyUseWarning = {}; + function getCurrentComponentErrorInfo(parentType) { + { + var info = getDeclarationErrorAddendum(); + if (!info) { + var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; } - }, xt(e), e.registerHelper = function (r, n, l) { - i.hasOwnProperty(r) || (i[r] = e[r] = { - _global: [] - }), i[r][n] = l; - }, e.registerGlobalHelper = function (r, n, l, o) { - e.registerHelper(r, n, o), i[r]._global.push({ - pred: l, - val: o - }); - }; + } + return info; } - u(tu, "addEditorMethods"); - function Ln(e, t, i, r, n) { - var l = t, - o = i, - a = S(e, t.line), - s = n && e.direction == "rtl" ? -i : i; - function f() { - var C = t.line + s; - return C < e.first || C >= e.first + e.size ? !1 : (t = new y(C, t.ch, t.sticky), a = S(e, C)); - } - u(f, "findNextLine"); - function h(C) { - var x; - if (r == "codepoint") { - var w = a.text.charCodeAt(t.ch + (i > 0 ? 0 : -1)); - if (isNaN(w)) x = null;else { - var k = i > 0 ? w >= 55296 && w < 56320 : w >= 56320 && w < 57343; - x = new y(t.line, Math.max(0, Math.min(a.text.length, t.ch + i * (k ? 2 : 1))), -i); - } - } else n ? x = Es(e.cm, a, t, i) : x = yn(a, t, i); - if (x == null) { - if (!C && f()) t = mn(n, e.cm, a, t.line, s);else return !1; - } else t = x; - return !0; - } - if (u(h, "moveOnce"), r == "char" || r == "codepoint") h();else if (r == "column") h(!0);else if (r == "word" || r == "group") for (var c = null, p = r == "group", d = e.cm && e.cm.getHelper(t, "wordChars"), v = !0; !(i < 0 && !h(!v)); v = !1) { - var g = a.text.charAt(t.ch) || ` -`, - m = Wr(g, d) ? "w" : p && g == ` -` ? "n" : !p || /\s/.test(g) ? null : "p"; - if (p && !v && !m && (m = "s"), c && c != m) { - i < 0 && (i = 1, h(), t.sticky = "after"); - break; - } - if (m && (c = m), i > 0 && !h(!v)) break; - } - var b = ii(e, t, l, o, !0); - return Wi(l, b) && (b.hitSide = !0), b; - } - u(Ln, "findPosH"); - function Go(e, t, i, r) { - var n = e.doc, - l = t.left, - o; - if (r == "page") { - var a = Math.min(e.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight), - s = Math.max(a - .5 * Tt(e.display), 3); - o = (i > 0 ? t.bottom : t.top) + i * s; - } else r == "line" && (o = i > 0 ? t.bottom + 3 : t.top - 3); - for (var f; f = qi(e, l, o), !!f.outside;) { - if (i < 0 ? o <= 0 : o >= n.height) { - f.hitSide = !0; - break; - } - o += i * 5; - } - return f; - } - u(Go, "findPosV"); - var P = u(function (e) { - this.cm = e, this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null, this.polling = new _e(), this.composing = null, this.gracePeriod = !1, this.readDOMTimeout = null; - }, "ContentEditableInput"); - P.prototype.init = function (e) { - var t = this, - i = this, - r = i.cm, - n = i.div = e.lineDiv; - n.contentEditable = !0, Bo(n, r.options.spellcheck, r.options.autocorrect, r.options.autocapitalize); - function l(a) { - for (var s = a.target; s; s = s.parentNode) { - if (s == n) return !0; - if (/\bCodeMirror-(?:line)?widget\b/.test(s.className)) break; - } - return !1; - } - u(l, "belongsToInput"), M(n, "paste", function (a) { - !l(a) || q(r, a) || Eo(a, r) || I <= 11 && setTimeout(Q(r, function () { - return t.updateFromDOM(); - }), 20); - }), M(n, "compositionstart", function (a) { - t.composing = { - data: a.data, - done: !1 - }; - }), M(n, "compositionupdate", function (a) { - t.composing || (t.composing = { - data: a.data, - done: !1 - }); - }), M(n, "compositionend", function (a) { - t.composing && (a.data != t.composing.data && t.readFromDOMSoon(), t.composing.done = !0); - }), M(n, "touchstart", function () { - return i.forceCompositionEnd(); - }), M(n, "input", function () { - t.composing || t.readFromDOMSoon(); - }); - function o(a) { - if (!(!l(a) || q(r, a))) { - if (r.somethingSelected()) ui({ - lineWise: !1, - text: r.getSelections() - }), a.type == "cut" && r.replaceSelection("", null, "cut");else if (r.options.lineWiseCopyCut) { - var s = Ro(r); - ui({ - lineWise: !0, - text: s.text - }), a.type == "cut" && r.operation(function () { - r.setSelections(s.ranges, 0, Me), r.replaceSelection("", null, "cut"); - }); - } else return; - if (a.clipboardData) { - a.clipboardData.clearData(); - var f = Te.text.join(` -`); - if (a.clipboardData.setData("Text", f), a.clipboardData.getData("Text") == f) { - a.preventDefault(); - return; - } - } - var h = zo(), - c = h.firstChild; - r.display.lineSpace.insertBefore(h, r.display.lineSpace.firstChild), c.value = Te.text.join(` -`); - var p = be(); - _t(c), setTimeout(function () { - r.display.lineSpace.removeChild(h), p.focus(), p == n && i.showPrimarySelection(); - }, 50); - } - } - u(o, "onCopyCut"), M(n, "copy", o), M(n, "cut", o); - }, P.prototype.screenReaderLabelChanged = function (e) { - e ? this.div.setAttribute("aria-label", e) : this.div.removeAttribute("aria-label"); - }, P.prototype.prepareSelection = function () { - var e = Nl(this.cm, !1); - return e.focus = be() == this.div, e; - }, P.prototype.showSelection = function (e, t) { - !e || !this.cm.display.view.length || ((e.focus || t) && this.showPrimarySelection(), this.showMultipleSelections(e)); - }, P.prototype.getSelection = function () { - return this.cm.display.wrapper.ownerDocument.getSelection(); - }, P.prototype.showPrimarySelection = function () { - var e = this.getSelection(), - t = this.cm, - i = t.doc.sel.primary(), - r = i.from(), - n = i.to(); - if (t.display.viewTo == t.display.viewFrom || r.line >= t.display.viewTo || n.line < t.display.viewFrom) { - e.removeAllRanges(); + } + /** + * Warn if the element doesn't have an explicit key assigned to it. + * This element is in an array. The array could grow and shrink or be + * reordered. All children that haven't already been validated are required to + * have a "key" property assigned to it. Error statuses are cached so a warning + * will only be shown once. + * + * @internal + * @param {ReactElement} element Element that requires a key. + * @param {*} parentType element's parent's type. + */ + + function validateExplicitKey(element, parentType) { + { + if (!element._store || element._store.validated || element.key != null) { return; } - var l = fi(t, e.anchorNode, e.anchorOffset), - o = fi(t, e.focusNode, e.focusOffset); - if (!(l && !l.bad && o && !o.bad && D(Pr(l, o), r) == 0 && D(Fr(l, o), n) == 0)) { - var a = t.display.view, - s = r.line >= t.display.viewFrom && Uo(t, r) || { - node: a[0].measure.map[2], - offset: 0 - }, - f = n.line < t.display.viewTo && Uo(t, n); - if (!f) { - var h = a[a.length - 1].measure, - c = h.maps ? h.maps[h.maps.length - 1] : h.map; - f = { - node: c[c.length - 1], - offset: c[c.length - 2] - c[c.length - 3] - }; - } - if (!s || !f) { - e.removeAllRanges(); - return; - } - var p = e.rangeCount && e.getRangeAt(0), - d; - try { - d = rt(s.node, s.offset, f.offset, f.node); - } catch {} - d && (!Fe && t.state.focused ? (e.collapse(s.node, s.offset), d.collapsed || (e.removeAllRanges(), e.addRange(d))) : (e.removeAllRanges(), e.addRange(d)), p && e.anchorNode == null ? e.addRange(p) : Fe && this.startGracePeriod()), this.rememberSelection(); - } - }, P.prototype.startGracePeriod = function () { - var e = this; - clearTimeout(this.gracePeriod), this.gracePeriod = setTimeout(function () { - e.gracePeriod = !1, e.selectionChanged() && e.cm.operation(function () { - return e.cm.curOp.selectionChanged = !0; - }); - }, 20); - }, P.prototype.showMultipleSelections = function (e) { - ve(this.cm.display.cursorDiv, e.cursors), ve(this.cm.display.selectionDiv, e.selection); - }, P.prototype.rememberSelection = function () { - var e = this.getSelection(); - this.lastAnchorNode = e.anchorNode, this.lastAnchorOffset = e.anchorOffset, this.lastFocusNode = e.focusNode, this.lastFocusOffset = e.focusOffset; - }, P.prototype.selectionInEditor = function () { - var e = this.getSelection(); - if (!e.rangeCount) return !1; - var t = e.getRangeAt(0).commonAncestorContainer; - return Ke(this.div, t); - }, P.prototype.focus = function () { - this.cm.options.readOnly != "nocursor" && ((!this.selectionInEditor() || be() != this.div) && this.showSelection(this.prepareSelection(), !0), this.div.focus()); - }, P.prototype.blur = function () { - this.div.blur(); - }, P.prototype.getField = function () { - return this.div; - }, P.prototype.supportsTouch = function () { - return !0; - }, P.prototype.receivedFocus = function () { - var e = this, - t = this; - this.selectionInEditor() ? setTimeout(function () { - return e.pollSelection(); - }, 20) : de(this.cm, function () { - return t.cm.curOp.selectionChanged = !0; - }); - function i() { - t.cm.state.focused && (t.pollSelection(), t.polling.set(t.cm.options.pollInterval, i)); - } - u(i, "poll"), this.polling.set(this.cm.options.pollInterval, i); - }, P.prototype.selectionChanged = function () { - var e = this.getSelection(); - return e.anchorNode != this.lastAnchorNode || e.anchorOffset != this.lastAnchorOffset || e.focusNode != this.lastFocusNode || e.focusOffset != this.lastFocusOffset; - }, P.prototype.pollSelection = function () { - if (!(this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged())) { - var e = this.getSelection(), - t = this.cm; - if (Dr && Tr && this.cm.display.gutterSpecs.length && ru(e.anchorNode)) { - this.cm.triggerOnKeyDown({ - type: "keydown", - keyCode: 8, - preventDefault: Math.abs - }), this.blur(), this.focus(); - return; - } - if (!this.composing) { - this.rememberSelection(); - var i = fi(t, e.anchorNode, e.anchorOffset), - r = fi(t, e.focusNode, e.focusOffset); - i && r && de(t, function () { - te(t.doc, Ze(i, r), Me), (i.bad || r.bad) && (t.curOp.selectionChanged = !0); - }); - } - } - }, P.prototype.pollContent = function () { - this.readDOMTimeout != null && (clearTimeout(this.readDOMTimeout), this.readDOMTimeout = null); - var e = this.cm, - t = e.display, - i = e.doc.sel.primary(), - r = i.from(), - n = i.to(); - if (r.ch == 0 && r.line > e.firstLine() && (r = y(r.line - 1, S(e.doc, r.line - 1).length)), n.ch == S(e.doc, n.line).text.length && n.line < e.lastLine() && (n = y(n.line + 1, 0)), r.line < t.viewFrom || n.line > t.viewTo - 1) return !1; - var l, o, a; - r.line == t.viewFrom || (l = ht(e, r.line)) == 0 ? (o = F(t.view[0].line), a = t.view[0].node) : (o = F(t.view[l].line), a = t.view[l - 1].node.nextSibling); - var s = ht(e, n.line), - f, - h; - if (s == t.view.length - 1 ? (f = t.viewTo - 1, h = t.lineDiv.lastChild) : (f = F(t.view[s + 1].line) - 1, h = t.view[s + 1].node.previousSibling), !a) return !1; - for (var c = e.doc.splitLines(iu(e, a, h, o, f)), p = ot(e.doc, y(o, 0), y(f, S(e.doc, f).text.length)); c.length > 1 && p.length > 1;) if (H(c) == H(p)) c.pop(), p.pop(), f--;else if (c[0] == p[0]) c.shift(), p.shift(), o++;else break; - for (var d = 0, v = 0, g = c[0], m = p[0], b = Math.min(g.length, m.length); d < b && g.charCodeAt(d) == m.charCodeAt(d);) ++d; - for (var C = H(c), x = H(p), w = Math.min(C.length - (c.length == 1 ? d : 0), x.length - (p.length == 1 ? d : 0)); v < w && C.charCodeAt(C.length - v - 1) == x.charCodeAt(x.length - v - 1);) ++v; - if (c.length == 1 && p.length == 1 && o == r.line) for (; d && d > r.ch && C.charCodeAt(C.length - v - 1) == x.charCodeAt(x.length - v - 1);) d--, v++; - c[c.length - 1] = C.slice(0, C.length - v).replace(/^\u200b+/, ""), c[0] = c[0].slice(d).replace(/\u200b+$/, ""); - var k = y(o, d), - L = y(f, p.length ? H(p).length - v : 0); - if (c.length > 1 || c[0] || D(k, L)) return Ft(e.doc, c, k, L, "+input"), !0; - }, P.prototype.ensurePolled = function () { - this.forceCompositionEnd(); - }, P.prototype.reset = function () { - this.forceCompositionEnd(); - }, P.prototype.forceCompositionEnd = function () { - this.composing && (clearTimeout(this.readDOMTimeout), this.composing = null, this.updateFromDOM(), this.div.blur(), this.div.focus()); - }, P.prototype.readFromDOMSoon = function () { - var e = this; - this.readDOMTimeout == null && (this.readDOMTimeout = setTimeout(function () { - if (e.readDOMTimeout = null, e.composing) if (e.composing.done) e.composing = null;else return; - e.updateFromDOM(); - }, 80)); - }, P.prototype.updateFromDOM = function () { - var e = this; - (this.cm.isReadOnly() || !this.pollContent()) && de(this.cm, function () { - return se(e.cm); - }); - }, P.prototype.setUneditable = function (e) { - e.contentEditable = "false"; - }, P.prototype.onKeyPress = function (e) { - e.charCode == 0 || this.composing || (e.preventDefault(), this.cm.isReadOnly() || Q(this.cm, Sn)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0)); - }, P.prototype.readOnlyChanged = function (e) { - this.div.contentEditable = String(e != "nocursor"); - }, P.prototype.onContextMenu = function () {}, P.prototype.resetPosition = function () {}, P.prototype.needsContentAttribute = !0; - function Uo(e, t) { - var i = _i(e, t.line); - if (!i || i.hidden) return null; - var r = S(e.doc, t.line), - n = vl(i, r, t.line), - l = Pe(r, e.doc.direction), - o = "left"; - if (l) { - var a = Zt(l, t.ch); - o = a % 2 ? "right" : "left"; - } - var s = ml(n.map, t.ch, o); - return s.offset = s.collapse == "right" ? s.end : s.start, s; - } - u(Uo, "posToDOM"); - function ru(e) { - for (var t = e; t; t = t.parentNode) if (/CodeMirror-gutter-wrapper/.test(t.className)) return !0; - return !1; - } - u(ru, "isInGutter"); - function Bt(e, t) { - return t && (e.bad = !0), e; - } - u(Bt, "badPos"); - function iu(e, t, i, r, n) { - var l = "", - o = !1, - a = e.doc.lineSeparator(), - s = !1; - function f(d) { - return function (v) { - return v.id == d; - }; + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; } - u(f, "recognizeMarker"); - function h() { - o && (l += a, s && (l += a), o = s = !1); + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a + // property, it may be the creator of the child that's responsible for + // assigning it a key. + + var childOwner = ''; + if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) { + // Give the component that originally created this child. + childOwner = " It was passed a child from " + getComponentNameFromType(element._owner.type) + "."; } - u(h, "close"); - function c(d) { - d && (h(), l += d); + setCurrentlyValidatingElement$1(element); + error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); + setCurrentlyValidatingElement$1(null); + } + } + /** + * Ensure that every element either is passed in a static location, in an + * array with an explicit keys property defined, or in an object literal + * with valid key property. + * + * @internal + * @param {ReactNode} node Statically passed child of any type. + * @param {*} parentType node's parent's type. + */ + + function validateChildKeys(node, parentType) { + { + if (typeof node !== 'object') { + return; } - u(c, "addText"); - function p(d) { - if (d.nodeType == 1) { - var v = d.getAttribute("cm-text"); - if (v) { - c(v); - return; - } - var g = d.getAttribute("cm-marker"), - m; - if (g) { - var b = e.findMarks(y(r, 0), y(n + 1, 0), f(+g)); - b.length && (m = b[0].find(0)) && c(ot(e.doc, m.from, m.to).join(a)); - return; - } - if (d.getAttribute("contenteditable") == "false") return; - var C = /^(pre|div|p|li|table|br)$/i.test(d.nodeName); - if (!/^br$/i.test(d.nodeName) && d.textContent.length == 0) return; - C && h(); - for (var x = 0; x < d.childNodes.length; x++) p(d.childNodes[x]); - /^(pre|p)$/i.test(d.nodeName) && (s = !0), C && (o = !0); - } else d.nodeType == 3 && c(d.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); - } - for (u(p, "walk"); p(t), t != i;) t = t.nextSibling, s = !1; - return l; - } - u(iu, "domTextBetween"); - function fi(e, t, i) { - var r; - if (t == e.display.lineDiv) { - if (r = e.display.lineDiv.childNodes[i], !r) return Bt(e.clipPos(y(e.display.viewTo - 1)), !0); - t = null, i = 0; - } else for (r = t;; r = r.parentNode) { - if (!r || r == e.display.lineDiv) return null; - if (r.parentNode && r.parentNode == e.display.lineDiv) break; - } - for (var n = 0; n < e.display.view.length; n++) { - var l = e.display.view[n]; - if (l.node == r) return nu(l, t, i); - } - } - u(fi, "domToPos"); - function nu(e, t, i) { - var r = e.text.firstChild, - n = !1; - if (!t || !Ke(r, t)) return Bt(y(F(e.line), 0), !0); - if (t == r && (n = !0, t = r.childNodes[i], i = 0, !t)) { - var l = e.rest ? H(e.rest) : e.line; - return Bt(y(F(l), l.text.length), n); - } - var o = t.nodeType == 3 ? t : null, - a = t; - for (!o && t.childNodes.length == 1 && t.firstChild.nodeType == 3 && (o = t.firstChild, i && (i = o.nodeValue.length)); a.parentNode != r;) a = a.parentNode; - var s = e.measure, - f = s.maps; - function h(m, b, C) { - for (var x = -1; x < (f ? f.length : 0); x++) for (var w = x < 0 ? s.map : f[x], k = 0; k < w.length; k += 3) { - var L = w[k + 2]; - if (L == m || L == b) { - var A = F(x < 0 ? e.line : e.rest[x]), - E = w[k] + C; - return (C < 0 || L != m) && (E = w[k + (C ? 1 : 0)]), y(A, E); + if (isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + if (isValidElement(child)) { + validateExplicitKey(child, parentType); } } - } - u(h, "find"); - var c = h(o, a, i); - if (c) return Bt(c, n); - for (var p = a.nextSibling, d = o ? o.nodeValue.length - i : 0; p; p = p.nextSibling) { - if (c = h(p, p.firstChild, 0), c) return Bt(y(c.line, c.ch - d), n); - d += p.textContent.length; - } - for (var v = a.previousSibling, g = i; v; v = v.previousSibling) { - if (c = h(v, v.firstChild, -1), c) return Bt(y(c.line, c.ch + g), n); - g += v.textContent.length; - } - } - u(nu, "locateNodeInLineView"); - var G = u(function (e) { - this.cm = e, this.prevInput = "", this.pollingFast = !1, this.polling = new _e(), this.hasSelection = !1, this.composing = null; - }, "TextareaInput"); - G.prototype.init = function (e) { - var t = this, - i = this, - r = this.cm; - this.createField(e); - var n = this.textarea; - e.wrapper.insertBefore(this.wrapper, e.wrapper.firstChild), Ut && (n.style.width = "0px"), M(n, "input", function () { - O && I >= 9 && t.hasSelection && (t.hasSelection = null), i.poll(); - }), M(n, "paste", function (o) { - q(r, o) || Eo(o, r) || (r.state.pasteIncoming = +new Date(), i.fastPoll()); - }); - function l(o) { - if (!q(r, o)) { - if (r.somethingSelected()) ui({ - lineWise: !1, - text: r.getSelections() - });else if (r.options.lineWiseCopyCut) { - var a = Ro(r); - ui({ - lineWise: !0, - text: a.text - }), o.type == "cut" ? r.setSelections(a.ranges, null, Me) : (i.prevInput = "", n.value = a.text.join(` -`), _t(n)); - } else return; - o.type == "cut" && (r.state.cutIncoming = +new Date()); - } - } - u(l, "prepareCopyCut"), M(n, "cut", l), M(n, "copy", l), M(e.scroller, "paste", function (o) { - if (!(Re(e, o) || q(r, o))) { - if (!n.dispatchEvent) { - r.state.pasteIncoming = +new Date(), i.focus(); - return; + } else if (isValidElement(node)) { + // This element was passed in a valid location. + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + if (typeof iteratorFn === 'function') { + // Entry iterators used to provide implicit keys, + // but now we print a separate warning for them later. + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } } - var a = new Event("paste"); - a.clipboardData = o.clipboardData, n.dispatchEvent(a); - } - }), M(e.lineSpace, "selectstart", function (o) { - Re(e, o) || ae(o); - }), M(n, "compositionstart", function () { - var o = r.getCursor("from"); - i.composing && i.composing.range.clear(), i.composing = { - start: o, - range: r.markText(o, r.getCursor("to"), { - className: "CodeMirror-composing" - }) - }; - }), M(n, "compositionend", function () { - i.composing && (i.poll(), i.composing.range.clear(), i.composing = null); - }); - }, G.prototype.createField = function (e) { - this.wrapper = zo(), this.textarea = this.wrapper.firstChild; - }, G.prototype.screenReaderLabelChanged = function (e) { - e ? this.textarea.setAttribute("aria-label", e) : this.textarea.removeAttribute("aria-label"); - }, G.prototype.prepareSelection = function () { - var e = this.cm, - t = e.display, - i = e.doc, - r = Nl(e); - if (e.options.moveInputWithCursor) { - var n = Le(e, i.sel.primary().head, "div"), - l = t.wrapper.getBoundingClientRect(), - o = t.lineDiv.getBoundingClientRect(); - r.teTop = Math.max(0, Math.min(t.wrapper.clientHeight - 10, n.top + o.top - l.top)), r.teLeft = Math.max(0, Math.min(t.wrapper.clientWidth - 10, n.left + o.left - l.left)); - } - return r; - }, G.prototype.showSelection = function (e) { - var t = this.cm, - i = t.display; - ve(i.cursorDiv, e.cursors), ve(i.selectionDiv, e.selection), e.teTop != null && (this.wrapper.style.top = e.teTop + "px", this.wrapper.style.left = e.teLeft + "px"); - }, G.prototype.reset = function (e) { - if (!(this.contextMenuPending || this.composing)) { - var t = this.cm; - if (t.somethingSelected()) { - this.prevInput = ""; - var i = t.getSelection(); - this.textarea.value = i, t.state.focused && _t(this.textarea), O && I >= 9 && (this.hasSelection = i); - } else e || (this.prevInput = this.textarea.value = "", O && I >= 9 && (this.hasSelection = null)); - } - }, G.prototype.getField = function () { - return this.textarea; - }, G.prototype.supportsTouch = function () { - return !1; - }, G.prototype.focus = function () { - if (this.cm.options.readOnly != "nocursor" && (!Kt || be() != this.textarea)) try { - this.textarea.focus(); - } catch {} - }, G.prototype.blur = function () { - this.textarea.blur(); - }, G.prototype.resetPosition = function () { - this.wrapper.style.top = this.wrapper.style.left = 0; - }, G.prototype.receivedFocus = function () { - this.slowPoll(); - }, G.prototype.slowPoll = function () { - var e = this; - this.pollingFast || this.polling.set(this.cm.options.pollInterval, function () { - e.poll(), e.cm.state.focused && e.slowPoll(); - }); - }, G.prototype.fastPoll = function () { - var e = !1, - t = this; - t.pollingFast = !0; - function i() { - var r = t.poll(); - !r && !e ? (e = !0, t.polling.set(60, i)) : (t.pollingFast = !1, t.slowPoll()); - } - u(i, "p"), t.polling.set(20, i); - }, G.prototype.poll = function () { - var e = this, - t = this.cm, - i = this.textarea, - r = this.prevInput; - if (this.contextMenuPending || !t.state.focused || ia(i) && !r && !this.composing || t.isReadOnly() || t.options.disableInput || t.state.keySeq) return !1; - var n = i.value; - if (n == r && !t.somethingSelected()) return !1; - if (O && I >= 9 && this.hasSelection === n || me && /[\uf700-\uf7ff]/.test(n)) return t.display.input.reset(), !1; - if (t.doc.sel == t.display.selForContextMenu) { - var l = n.charCodeAt(0); - if (l == 8203 && !r && (r = "​"), l == 8666) return this.reset(), this.cm.execCommand("undo"); - } - for (var o = 0, a = Math.min(r.length, n.length); o < a && r.charCodeAt(o) == n.charCodeAt(o);) ++o; - return de(t, function () { - Sn(t, n.slice(o), r.length - o, null, e.composing ? "*compose" : null), n.length > 1e3 || n.indexOf(` -`) > -1 ? i.value = e.prevInput = "" : e.prevInput = n, e.composing && (e.composing.range.clear(), e.composing.range = t.markText(e.composing.start, t.getCursor("to"), { - className: "CodeMirror-composing" - })); - }), !0; - }, G.prototype.ensurePolled = function () { - this.pollingFast && this.poll() && (this.pollingFast = !1); - }, G.prototype.onKeyPress = function () { - O && I >= 9 && (this.hasSelection = null), this.fastPoll(); - }, G.prototype.onContextMenu = function (e) { - var t = this, - i = t.cm, - r = i.display, - n = t.textarea; - t.contextMenuPending && t.contextMenuPending(); - var l = ft(i, e), - o = r.scroller.scrollTop; - if (!l || we) return; - var a = i.options.resetSelectionOnContextMenu; - a && i.doc.sel.contains(l) == -1 && Q(i, te)(i.doc, Ze(l), Me); - var s = n.style.cssText, - f = t.wrapper.style.cssText, - h = t.wrapper.offsetParent.getBoundingClientRect(); - t.wrapper.style.cssText = "position: static", n.style.cssText = `position: absolute; width: 30px; height: 30px; - top: ` + (e.clientY - h.top - 5) + "px; left: " + (e.clientX - h.left - 5) + `px; - z-index: 1000; background: ` + (O ? "rgba(255, 255, 255, .05)" : "transparent") + `; - outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);`; - var c; - ne && (c = window.scrollY), r.input.focus(), ne && window.scrollTo(null, c), r.input.reset(), i.somethingSelected() || (n.value = t.prevInput = " "), t.contextMenuPending = d, r.selForContextMenu = i.doc.sel, clearTimeout(r.detectingSelectAll); - function p() { - if (n.selectionStart != null) { - var g = i.somethingSelected(), - m = "​" + (g ? n.value : ""); - n.value = "⇚", n.value = m, t.prevInput = g ? "" : "​", n.selectionStart = 1, n.selectionEnd = m.length, r.selForContextMenu = i.doc.sel; - } - } - u(p, "prepareSelectAllHack"); - function d() { - if (t.contextMenuPending == d && (t.contextMenuPending = !1, t.wrapper.style.cssText = f, n.style.cssText = s, O && I < 9 && r.scrollbars.setScrollTop(r.scroller.scrollTop = o), n.selectionStart != null)) { - (!O || O && I < 9) && p(); - var g = 0, - m = u(function () { - r.selForContextMenu == i.doc.sel && n.selectionStart == 0 && n.selectionEnd > 0 && t.prevInput == "​" ? Q(i, lo)(i) : g++ < 10 ? r.detectingSelectAll = setTimeout(m, 500) : (r.selForContextMenu = null, r.input.reset()); - }, "poll"); - r.detectingSelectAll = setTimeout(m, 200); - } - } - if (u(d, "rehide"), O && I >= 9 && p(), ci) { - Qt(e); - var v = u(function () { - ge(window, "mouseup", v), setTimeout(d, 20); - }, "mouseup"); - M(window, "mouseup", v); - } else setTimeout(d, 50); - }, G.prototype.readOnlyChanged = function (e) { - e || this.reset(), this.textarea.disabled = e == "nocursor", this.textarea.readOnly = !!e; - }, G.prototype.setUneditable = function () {}, G.prototype.needsContentAttribute = !1; - function lu(e, t) { - if (t = t ? nt(t) : {}, t.value = e.value, !t.tabindex && e.tabIndex && (t.tabindex = e.tabIndex), !t.placeholder && e.placeholder && (t.placeholder = e.placeholder), t.autofocus == null) { - var i = be(); - t.autofocus = i == e || e.getAttribute("autofocus") != null && i == document.body; - } - function r() { - e.value = a.getValue(); - } - u(r, "save"); - var n; - if (e.form && (M(e.form, "submit", r), !t.leaveSubmitMethodAlone)) { - var l = e.form; - n = l.submit; - try { - var o = l.submit = function () { - r(), l.submit = n, l.submit(), l.submit = o; - }; - } catch {} - } - t.finishInit = function (s) { - s.save = r, s.getTextArea = function () { - return e; - }, s.toTextArea = function () { - s.toTextArea = isNaN, r(), e.parentNode.removeChild(s.getWrapperElement()), e.style.display = "", e.form && (ge(e.form, "submit", r), !t.leaveSubmitMethodAlone && typeof e.form.submit == "function" && (e.form.submit = n)); - }; - }, e.style.display = "none"; - var a = R(function (s) { - return e.parentNode.insertBefore(s, e.nextSibling); - }, t); - return a; - } - u(lu, "fromTextArea"); - function ou(e) { - e.off = ge, e.on = M, e.wheelEventPixels = ds, e.Doc = ue, e.splitLines = ki, e.countColumn = xe, e.findColumn = gi, e.isWordChar = mi, e.Pass = Nr, e.signal = U, e.Line = St, e.changeEnd = Qe, e.scrollbarModel = Pl, e.Pos = y, e.cmpPos = D, e.modes = Mi, e.mimeModes = Ct, e.resolveMode = Hr, e.getMode = Di, e.modeExtensions = wt, e.extendMode = sa, e.copyState = lt, e.startState = Gn, e.innerMode = Ni, e.commands = br, e.keyMap = ze, e.keyName = wo, e.isModifierKey = xo, e.lookupKey = Et, e.normalizeKeyMap = Ps, e.StringStream = K, e.SharedTextMarker = gr, e.TextMarker = je, e.LineWidget = vr, e.e_preventDefault = ae, e.e_stopPropagation = Bn, e.e_stop = Qt, e.addClass = it, e.contains = Ke, e.rmClass = tt, e.keyNames = Ve; - } - u(ou, "addLegacyProps"), js(R), tu(R); - var au = "iter insert remove copy getEditor constructor".split(" "); - for (var hi in ue.prototype) ue.prototype.hasOwnProperty(hi) && ee(au, hi) < 0 && (R.prototype[hi] = function (e) { - return function () { - return e.apply(this.doc, arguments); - }; - }(ue.prototype[hi])); - return xt(ue), R.inputStyles = { - textarea: G, - contenteditable: P - }, R.defineMode = function (e) { - !R.defaults.mode && e != "null" && (R.defaults.mode = e), oa.apply(this, arguments); - }, R.defineMIME = aa, R.defineMode("null", function () { - return { - token: function (e) { - return e.skipToEnd(); } - }; - }), R.defineMIME("text/plain", "null"), R.defineExtension = function (e, t) { - R.prototype[e] = t; - }, R.defineDocExtension = function (e, t) { - ue.prototype[e] = t; - }, R.fromTextArea = lu, ou(R), R.version = "5.65.3", R; - }); - }(Mn)), Mn.exports; -} -u(hu, "requireCodemirror"); -exports.getDefaultExportFromCjs = fu; -exports.requireCodemirror = hu; - -/***/ }), - -/***/ "../../graphiql-react/dist/comment.cjs.js": -/*!************************************************!*\ - !*** ../../graphiql-react/dist/comment.cjs.js ***! - \************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var G = Object.defineProperty; -var I = (p, E) => G(p, "name", { - value: E, - configurable: !0 -}); -const z = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function H(p, E) { - for (var u = 0; u < E.length; u++) { - const C = E[u]; - if (typeof C != "string" && !Array.isArray(C)) { - for (const s in C) if (s !== "default" && !(s in p)) { - const r = Object.getOwnPropertyDescriptor(C, s); - r && Object.defineProperty(p, s, r.get ? r : { - enumerable: !0, - get: () => C[s] - }); + } } } - } - return Object.freeze(Object.defineProperty(p, Symbol.toStringTag, { - value: "Module" - })); -} -I(H, "_mergeNamespaces"); -var J = { - exports: {} -}; -(function (p, E) { - (function (u) { - u(z.requireCodemirror()); - })(function (u) { - var C = {}, - s = /[^\s\u00a0]/, - r = u.Pos, - F = u.cmpPos; - function D(t) { - var l = t.search(s); - return l == -1 ? 0 : l; - } - I(D, "firstNonWS"), u.commands.toggleComment = function (t) { - t.toggleComment(); - }, u.defineExtension("toggleComment", function (t) { - t || (t = C); - for (var l = this, n = 1 / 0, e = this.listSelections(), f = null, m = e.length - 1; m >= 0; m--) { - var a = e[m].from(), - i = e[m].to(); - a.line >= n || (i.line >= n && (i = r(n, 0)), n = a.line, f == null ? l.uncomment(a, i, t) ? f = "un" : (l.lineComment(a, i, t), f = "line") : f == "un" ? l.uncomment(a, i, t) : l.lineComment(a, i, t)); - } - }); - function w(t, l, n) { - return /\bstring\b/.test(t.getTokenTypeAt(r(l.line, 0))) && !/^[\'\"\`]/.test(n); - } - I(w, "probablyInsideString"); - function P(t, l) { - var n = t.getMode(); - return n.useInnerComments === !1 || !n.innerMode ? n : t.getModeAt(l); - } - I(P, "getMode"), u.defineExtension("lineComment", function (t, l, n) { - n || (n = C); - var e = this, - f = P(e, t), - m = e.getLine(t.line); - if (!(m == null || w(e, t, m))) { - var a = n.lineComment || f.lineComment; - if (!a) { - (n.blockCommentStart || f.blockCommentStart) && (n.fullLines = !0, e.blockComment(t, l, n)); + /** + * Given an element, validate that its props follow the propTypes definition, + * provided by the type. + * + * @param {ReactElement} element + */ + + function validatePropTypes(element) { + { + var type = element.type; + if (type === null || type === undefined || typeof type === 'string') { return; } - var i = Math.min(l.ch != 0 || l.line == t.line ? l.line + 1 : l.line, e.lastLine() + 1), - k = n.padding == null ? " " : n.padding, - g = n.commentBlankLines || t.line == l.line; - e.operation(function () { - if (n.indent) { - for (var d = null, c = t.line; c < i; ++c) { - var v = e.getLine(c), - h = v.slice(0, D(v)); - (d == null || d.length > h.length) && (d = h); - } - for (var c = t.line; c < i; ++c) { - var v = e.getLine(c), - o = d.length; - !g && !s.test(v) || (v.slice(0, o) != d && (o = D(v)), e.replaceRange(d + a + k, r(c, 0), r(c, o))); - } - } else for (var c = t.line; c < i; ++c) (g || s.test(e.getLine(c))) && e.replaceRange(a + k, r(c, 0)); - }); - } - }), u.defineExtension("blockComment", function (t, l, n) { - n || (n = C); - var e = this, - f = P(e, t), - m = n.blockCommentStart || f.blockCommentStart, - a = n.blockCommentEnd || f.blockCommentEnd; - if (!m || !a) { - (n.lineComment || f.lineComment) && n.fullLines != !1 && e.lineComment(t, l, n); - return; - } - if (!/\bcomment\b/.test(e.getTokenTypeAt(r(t.line, 0)))) { - var i = Math.min(l.line, e.lastLine()); - i != t.line && l.ch == 0 && s.test(e.getLine(i)) && --i; - var k = n.padding == null ? " " : n.padding; - t.line > i || e.operation(function () { - if (n.fullLines != !1) { - var g = s.test(e.getLine(i)); - e.replaceRange(k + a, r(i)), e.replaceRange(m + k, r(t.line, 0)); - var d = n.blockCommentLead || f.blockCommentLead; - if (d != null) for (var c = t.line + 1; c <= i; ++c) (c != i || g) && e.replaceRange(d + k, r(c, 0)); - } else { - var v = F(e.getCursor("to"), l) == 0, - h = !e.somethingSelected(); - e.replaceRange(a, l), v && e.setSelection(h ? l : e.getCursor("from"), l), e.replaceRange(m, t); - } - }); - } - }), u.defineExtension("uncomment", function (t, l, n) { - n || (n = C); - var e = this, - f = P(e, t), - m = Math.min(l.ch != 0 || l.line == t.line ? l.line : l.line - 1, e.lastLine()), - a = Math.min(t.line, m), - i = n.lineComment || f.lineComment, - k = [], - g = n.padding == null ? " " : n.padding, - d; - e: { - if (!i) break e; - for (var c = a; c <= m; ++c) { - var v = e.getLine(c), - h = v.indexOf(i); - if (h > -1 && !/comment/.test(e.getTokenTypeAt(r(c, h + 1))) && (h = -1), h == -1 && s.test(v) || h > -1 && s.test(v.slice(0, h))) break e; - k.push(v); - } - if (e.operation(function () { - for (var b = a; b <= m; ++b) { - var x = k[b - a], - O = x.indexOf(i), - L = O + i.length; - O < 0 || (x.slice(L, L + g.length) == g && (L += g.length), d = !0, e.replaceRange("", r(b, O), r(b, L))); - } - }), d) return !0; - } - var o = n.blockCommentStart || f.blockCommentStart, - S = n.blockCommentEnd || f.blockCommentEnd; - if (!o || !S) return !1; - var q = n.blockCommentLead || f.blockCommentLead, - A = e.getLine(a), - j = A.indexOf(o); - if (j == -1) return !1; - var _ = m == a ? A : e.getLine(m), - y = _.indexOf(S, m == a ? j + o.length : 0), - N = r(a, j + 1), - W = r(m, y + 1); - if (y == -1 || !/comment/.test(e.getTokenTypeAt(N)) || !/comment/.test(e.getTokenTypeAt(W)) || e.getRange(N, W, ` -`).indexOf(S) > -1) return !1; - var R = A.lastIndexOf(o, t.ch), - T = R == -1 ? -1 : A.slice(0, t.ch).indexOf(S, R + o.length); - if (R != -1 && T != -1 && T + S.length != t.ch) return !1; - T = _.indexOf(S, l.ch); - var $ = _.slice(l.ch).lastIndexOf(o, T - l.ch); - return R = T == -1 || $ == -1 ? -1 : l.ch + $, T != -1 && R != -1 && R != l.ch ? !1 : (e.operation(function () { - e.replaceRange("", r(m, y - (g && _.slice(y - g.length, y) == g ? g.length : 0)), r(m, y + S.length)); - var b = j + o.length; - if (g && A.slice(b, b + g.length) == g && (b += g.length), e.replaceRange("", r(a, j), r(a, b)), q) for (var x = a + 1; x <= m; ++x) { - var O = e.getLine(x), - L = O.indexOf(q); - if (!(L == -1 || s.test(O.slice(0, L)))) { - var M = L + q.length; - g && O.slice(M, M + g.length) == g && (M += g.length), e.replaceRange("", r(x, L), r(x, M)); - } - } - }), !0); - }); - }); -})(); -var B = J.exports; -const K = z.getDefaultExportFromCjs(B), - Q = H({ - __proto__: null, - default: K - }, [B]); -exports.comment = Q; - -/***/ }), - -/***/ "../../graphiql-react/dist/dialog.cjs.js": -/*!***********************************************!*\ - !*** ../../graphiql-react/dist/dialog.cjs.js ***! - \***********************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - + var propTypes; + if (typeof type === 'function') { + propTypes = type.propTypes; + } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || + // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } + if (propTypes) { + // Intentionally inside to avoid triggering lazy initializers: + var name = getComponentNameFromType(type); + checkPropTypes(propTypes, element.props, 'prop', name, element); + } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: -var E = Object.defineProperty; -var g = (v, m) => E(v, "name", { - value: m, - configurable: !0 -}); -const b = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function O(v, m) { - for (var n = 0; n < m.length; n++) { - const r = m[n]; - if (typeof r != "string" && !Array.isArray(r)) { - for (const c in r) if (c !== "default" && !(c in v)) { - const u = Object.getOwnPropertyDescriptor(r, c); - u && Object.defineProperty(v, c, u.get ? u : { - enumerable: !0, - get: () => r[c] - }); + var _name = getComponentNameFromType(type); + error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); + } + if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { + error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); + } } } - } - return Object.freeze(Object.defineProperty(v, Symbol.toStringTag, { - value: "Module" - })); -} -g(O, "_mergeNamespaces"); -var T = { - exports: {} -}; -(function (v, m) { - (function (n) { - n(b.requireCodemirror()); - })(function (n) { - function r(u, f, e) { - var a = u.getWrapperElement(), - l; - return l = a.appendChild(document.createElement("div")), e ? l.className = "CodeMirror-dialog CodeMirror-dialog-bottom" : l.className = "CodeMirror-dialog CodeMirror-dialog-top", typeof f == "string" ? l.innerHTML = f : l.appendChild(f), n.addClass(a, "dialog-opened"), l; - } - g(r, "dialogDiv"); - function c(u, f) { - u.state.currentNotificationClose && u.state.currentNotificationClose(), u.state.currentNotificationClose = f; - } - g(c, "closeNotification"), n.defineExtension("openDialog", function (u, f, e) { - e || (e = {}), c(this, null); - var a = r(this, u, e.bottom), - l = !1, - s = this; - function i(t) { - if (typeof t == "string") o.value = t;else { - if (l) return; - l = !0, n.rmClass(a.parentNode, "dialog-opened"), a.parentNode.removeChild(a), s.focus(), e.onClose && e.onClose(a); - } - } - g(i, "close"); - var o = a.getElementsByTagName("input")[0], - d; - return o ? (o.focus(), e.value && (o.value = e.value, e.selectValueOnOpen !== !1 && o.select()), e.onInput && n.on(o, "input", function (t) { - e.onInput(t, o.value, i); - }), e.onKeyUp && n.on(o, "keyup", function (t) { - e.onKeyUp(t, o.value, i); - }), n.on(o, "keydown", function (t) { - e && e.onKeyDown && e.onKeyDown(t, o.value, i) || ((t.keyCode == 27 || e.closeOnEnter !== !1 && t.keyCode == 13) && (o.blur(), n.e_stop(t), i()), t.keyCode == 13 && f(o.value, t)); - }), e.closeOnBlur !== !1 && n.on(a, "focusout", function (t) { - t.relatedTarget !== null && i(); - })) : (d = a.getElementsByTagName("button")[0]) && (n.on(d, "click", function () { - i(), s.focus(); - }), e.closeOnBlur !== !1 && n.on(d, "blur", i), d.focus()), i; - }), n.defineExtension("openConfirm", function (u, f, e) { - c(this, null); - var a = r(this, u, e && e.bottom), - l = a.getElementsByTagName("button"), - s = !1, - i = this, - o = 1; - function d() { - s || (s = !0, n.rmClass(a.parentNode, "dialog-opened"), a.parentNode.removeChild(a), i.focus()); - } - g(d, "close"), l[0].focus(); - for (var t = 0; t < l.length; ++t) { - var p = l[t]; - (function (N) { - n.on(p, "click", function (h) { - n.e_preventDefault(h), d(), N && N(i); - }); - })(f[t]), n.on(p, "blur", function () { - --o, setTimeout(function () { - o <= 0 && d(); - }, 200); - }), n.on(p, "focus", function () { - ++o; - }); - } - }), n.defineExtension("openNotification", function (u, f) { - c(this, i); - var e = r(this, u, f && f.bottom), - a = !1, - l, - s = f && typeof f.duration < "u" ? f.duration : 5e3; - function i() { - a || (a = !0, clearTimeout(l), n.rmClass(e.parentNode, "dialog-opened"), e.parentNode.removeChild(e)); - } - return g(i, "close"), n.on(e, "click", function (o) { - n.e_preventDefault(o), i(); - }), s && (l = setTimeout(i, s)), i; - }); - }); -})(); -var y = T.exports; -const x = b.getDefaultExportFromCjs(y), - k = O({ - __proto__: null, - default: x - }, [y]); -exports.dialog = k; -exports.dialogExports = y; - -/***/ }), - -/***/ "../../graphiql-react/dist/foldgutter.cjs.js": -/*!***************************************************!*\ - !*** ../../graphiql-react/dist/foldgutter.cjs.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - + /** + * Given a fragment, validate that it can only be provided with fragment props + * @param {ReactElement} fragment + */ -var z = Object.defineProperty; -var u = (O, k) => z(O, "name", { - value: k, - configurable: !0 -}); -const G = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function L(O, k) { - for (var i = 0; i < k.length; i++) { - const s = k[i]; - if (typeof s != "string" && !Array.isArray(s)) { - for (const p in s) if (p !== "default" && !(p in O)) { - const w = Object.getOwnPropertyDescriptor(s, p); - w && Object.defineProperty(O, p, w.get ? w : { - enumerable: !0, - get: () => s[p] - }); + function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (key !== 'children' && key !== 'key') { + setCurrentlyValidatingElement$1(fragment); + error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); + setCurrentlyValidatingElement$1(null); + break; + } + } + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + error('Invalid attribute `ref` supplied to `React.Fragment`.'); + setCurrentlyValidatingElement$1(null); + } } } - } - return Object.freeze(Object.defineProperty(O, Symbol.toStringTag, { - value: "Module" - })); -} -u(L, "_mergeNamespaces"); -var j = { - exports: {} - }, - U = { - exports: {} - }, - N; -function q() { - return N || (N = 1, function (O, k) { - (function (i) { - i(G.requireCodemirror()); - })(function (i) { - function s(t, o, f, a) { - if (f && f.call) { - var g = f; - f = null; - } else var g = v(t, f, "rangeFinder"); - typeof o == "number" && (o = i.Pos(o, 0)); - var y = v(t, f, "minFoldSize"); - function x(l) { - var r = g(t, o); - if (!r || r.to.line - r.from.line < y) return null; - if (a === "fold") return r; - for (var c = t.findMarksAt(r.from), h = 0; h < c.length; ++h) if (c[h].__isFold) { - if (!l) return null; - r.cleared = !0, c[h].clear(); + function jsxWithValidation(type, props, key, isStaticChildren, source, self) { + { + var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to + // succeed and there will likely be errors in render. + + if (!validType) { + var info = ''; + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; } - return r; + var sourceInfo = getSourceInfoErrorAddendum(source); + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + var typeString; + if (type === null) { + typeString = 'null'; + } else if (isArray(type)) { + typeString = 'array'; + } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentNameFromType(type.type) || 'Unknown') + " />"; + info = ' Did you accidentally export a JSX literal instead of a component?'; + } else { + typeString = typeof type; + } + error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); } - u(x, "getRange"); - var d = x(!0); - if (v(t, f, "scanUp")) for (; !d && o.line > t.firstLine();) o = i.Pos(o.line - 1, 0), d = x(!1); - if (!(!d || d.cleared || a === "unfold")) { - var e = p(t, f, d); - i.on(e, "mousedown", function (l) { - n.clear(), i.e_preventDefault(l); - }); - var n = t.markText(d.from, d.to, { - replacedWith: e, - clearOnEnter: v(t, f, "clearOnEnter"), - __isFold: !0 - }); - n.on("clear", function (l, r) { - i.signal(t, "unfold", t, l, r); - }), i.signal(t, "fold", t, d.from, d.to); - } - } - u(s, "doFold"); - function p(t, o, f) { - var a = v(t, o, "widget"); - if (typeof a == "function" && (a = a(f.from, f.to)), typeof a == "string") { - var g = document.createTextNode(a); - a = document.createElement("span"), a.appendChild(g), a.className = "CodeMirror-foldmarker"; - } else a && (a = a.cloneNode(!0)); - return a; - } - u(p, "makeWidget"), i.newFoldFunction = function (t, o) { - return function (f, a) { - s(f, a, { - rangeFinder: t, - widget: o - }); - }; - }, i.defineExtension("foldCode", function (t, o, f) { - s(this, t, o, f); - }), i.defineExtension("isFolded", function (t) { - for (var o = this.findMarksAt(t), f = 0; f < o.length; ++f) if (o[f].__isFold) return !0; - }), i.commands.toggleFold = function (t) { - t.foldCode(t.getCursor()); - }, i.commands.fold = function (t) { - t.foldCode(t.getCursor(), null, "fold"); - }, i.commands.unfold = function (t) { - t.foldCode(t.getCursor(), { - scanUp: !1 - }, "unfold"); - }, i.commands.foldAll = function (t) { - t.operation(function () { - for (var o = t.firstLine(), f = t.lastLine(); o <= f; o++) t.foldCode(i.Pos(o, 0), { - scanUp: !1 - }, "fold"); - }); - }, i.commands.unfoldAll = function (t) { - t.operation(function () { - for (var o = t.firstLine(), f = t.lastLine(); o <= f; o++) t.foldCode(i.Pos(o, 0), { - scanUp: !1 - }, "unfold"); - }); - }, i.registerHelper("fold", "combine", function () { - var t = Array.prototype.slice.call(arguments, 0); - return function (o, f) { - for (var a = 0; a < t.length; ++a) { - var g = t[a](o, f); - if (g) return g; + var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used. + // TODO: Drop this when these are no longer allowed as the type argument. + + if (element == null) { + return element; + } // Skip key warning if the type isn't valid since our key validation logic + // doesn't expect a non-string/function type and can throw confusing errors. + // We don't want exception behavior to differ between dev and prod. + // (Rendering will throw with a helpful message and as soon as the type is + // fixed, the key warnings will appear.) + + if (validType) { + var children = props.children; + if (children !== undefined) { + if (isStaticChildren) { + if (isArray(children)) { + for (var i = 0; i < children.length; i++) { + validateChildKeys(children[i], type); + } + if (Object.freeze) { + Object.freeze(children); + } + } else { + error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.'); + } + } else { + validateChildKeys(children, type); + } } - }; - }), i.registerHelper("fold", "auto", function (t, o) { - for (var f = t.getHelpers(o, "fold"), a = 0; a < f.length; a++) { - var g = f[a](t, o); - if (g) return g; } - }); - var w = { - rangeFinder: i.fold.auto, - widget: "↔", - minFoldSize: 0, - scanUp: !1, - clearOnEnter: !0 - }; - i.defineOption("foldOptions", null); - function v(t, o, f) { - if (o && o[f] !== void 0) return o[f]; - var a = t.options.foldOptions; - return a && a[f] !== void 0 ? a[f] : w[f]; - } - u(v, "getOption"), i.defineExtension("foldOption", function (t, o) { - return v(this, t, o); - }); - }); - }()), U.exports; -} -u(q, "requireFoldcode"); -(function (O, k) { - (function (i) { - i(G.requireCodemirror(), q()); - })(function (i) { - i.defineOption("foldGutter", !1, function (e, n, l) { - l && l != i.Init && (e.clearGutter(e.state.foldGutter.options.gutter), e.state.foldGutter = null, e.off("gutterClick", g), e.off("changes", y), e.off("viewportChange", x), e.off("fold", d), e.off("unfold", d), e.off("swapDoc", y)), n && (e.state.foldGutter = new p(w(n)), a(e), e.on("gutterClick", g), e.on("changes", y), e.on("viewportChange", x), e.on("fold", d), e.on("unfold", d), e.on("swapDoc", y)); - }); - var s = i.Pos; - function p(e) { - this.options = e, this.from = this.to = 0; - } - u(p, "State"); - function w(e) { - return e === !0 && (e = {}), e.gutter == null && (e.gutter = "CodeMirror-foldgutter"), e.indicatorOpen == null && (e.indicatorOpen = "CodeMirror-foldgutter-open"), e.indicatorFolded == null && (e.indicatorFolded = "CodeMirror-foldgutter-folded"), e; - } - u(w, "parseOptions"); - function v(e, n) { - for (var l = e.findMarks(s(n, 0), s(n + 1, 0)), r = 0; r < l.length; ++r) if (l[r].__isFold) { - var c = l[r].find(-1); - if (c && c.line === n) return l[r]; - } - } - u(v, "isFolded"); - function t(e) { - if (typeof e == "string") { - var n = document.createElement("div"); - return n.className = e + " CodeMirror-guttermarker-subtle", n; - } else return e.cloneNode(!0); - } - u(t, "marker"); - function o(e, n, l) { - var r = e.state.foldGutter.options, - c = n - 1, - h = e.foldOption(r, "minFoldSize"), - E = e.foldOption(r, "rangeFinder"), - S = typeof r.indicatorFolded == "string" && f(r.indicatorFolded), - T = typeof r.indicatorOpen == "string" && f(r.indicatorOpen); - e.eachLine(n, l, function (b) { - ++c; - var _ = null, - F = b.gutterMarkers; - if (F && (F = F[r.gutter]), v(e, c)) { - if (S && F && S.test(F.className)) return; - _ = t(r.indicatorFolded); + if (type === REACT_FRAGMENT_TYPE) { + validateFragmentProps(element); } else { - var A = s(c, 0), - m = E && E(e, A); - if (m && m.to.line - m.from.line >= h) { - if (T && F && T.test(F.className)) return; - _ = t(r.indicatorOpen); - } + validatePropTypes(element); } - !_ && !F || e.setGutterMarker(b, r.gutter, _); - }); - } - u(o, "updateFoldInfo"); - function f(e) { - return new RegExp("(^|\\s)" + e + "(?:$|\\s)\\s*"); - } - u(f, "classTest"); - function a(e) { - var n = e.getViewport(), - l = e.state.foldGutter; - l && (e.operation(function () { - o(e, n.from, n.to); - }), l.from = n.from, l.to = n.to); - } - u(a, "updateInViewport"); - function g(e, n, l) { - var r = e.state.foldGutter; - if (r) { - var c = r.options; - if (l == c.gutter) { - var h = v(e, n); - h ? h.clear() : e.foldCode(s(n, 0), c); - } - } - } - u(g, "onGutterClick"); - function y(e) { - var n = e.state.foldGutter; - if (n) { - var l = n.options; - n.from = n.to = 0, clearTimeout(n.changeUpdate), n.changeUpdate = setTimeout(function () { - a(e); - }, l.foldOnChangeTimeSpan || 600); - } - } - u(y, "onChange"); - function x(e) { - var n = e.state.foldGutter; - if (n) { - var l = n.options; - clearTimeout(n.changeUpdate), n.changeUpdate = setTimeout(function () { - var r = e.getViewport(); - n.from == n.to || r.from - n.to > 20 || n.from - r.to > 20 ? a(e) : e.operation(function () { - r.from < n.from && (o(e, r.from, n.from), n.from = r.from), r.to > n.to && (o(e, n.to, r.to), n.to = r.to); - }); - }, l.updateViewportTimeSpan || 400); + return element; + } + } // These two functions exist to still get child warnings in dev + // even with the prod transform. This means that jsxDEV is purely + // opt-in behavior for better messages but that we won't stop + // giving you warnings if you use production apis. + + function jsxWithValidationStatic(type, props, key) { + { + return jsxWithValidation(type, props, key, true); } } - u(x, "onViewportChange"); - function d(e, n) { - var l = e.state.foldGutter; - if (l) { - var r = n.line; - r >= l.from && r < l.to && o(e, r, r + 1); + function jsxWithValidationDynamic(type, props, key) { + { + return jsxWithValidation(type, props, key, false); } } - u(d, "onFold"); - }); -})(); -var P = j.exports; -const C = G.getDefaultExportFromCjs(P), - D = L({ - __proto__: null, - default: C - }, [P]); -exports.foldgutter = D; - -/***/ }), - -/***/ "../../graphiql-react/dist/forEachState.cjs.js": -/*!*****************************************************!*\ - !*** ../../graphiql-react/dist/forEachState.cjs.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - + var jsx = jsxWithValidationDynamic; // we may want to special case jsxs internally to take advantage of static children. + // for now we can ship identical prod functions -var c = Object.defineProperty; -var r = (e, a) => c(e, "name", { - value: a, - configurable: !0 -}); -function l(e, a) { - const i = []; - let t = e; - for (; t != null && t.kind;) i.push(t), t = t.prevState; - for (let o = i.length - 1; o >= 0; o--) a(i[o]); + var jsxs = jsxWithValidationStatic; + exports.Fragment = REACT_FRAGMENT_TYPE; + exports.jsx = jsx; + exports.jsxs = jsxs; + })(); } -r(l, "forEachState"); -exports.forEachState = l; /***/ }), -/***/ "../../graphiql-react/dist/hint.cjs.js": -/*!*********************************************!*\ - !*** ../../graphiql-react/dist/hint.cjs.js ***! - \*********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { +/***/ "../../../node_modules/react/jsx-runtime.js": +/*!**************************************************!*\ + !*** ../../../node_modules/react/jsx-runtime.js ***! + \**************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { -const s = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); -__webpack_require__(/*! ./show-hint.cjs.js */ "../../graphiql-react/dist/show-hint.cjs.js"); -const c = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -s.CodeMirror.registerHelper("hint", "graphql", (r, a) => { - const { - schema: i, - externalFragments: u - } = a; - if (!i) return; - const n = r.getCursor(), - t = r.getTokenAt(n), - l = t.type !== null && /"|\w/.test(t.string[0]) ? t.start : t.end, - g = new c.Position(n.line, l), - e = { - list: c.getAutocompleteSuggestions(i, r.getValue(), g, t, u).map(o => ({ - text: o.label, - type: o.type, - description: o.documentation, - isDeprecated: o.isDeprecated, - deprecationReason: o.deprecationReason - })), - from: { - line: n.line, - ch: l - }, - to: { - line: n.line, - ch: t.end - } - }; - return e != null && e.list && e.list.length > 0 && (e.from = s.CodeMirror.Pos(e.from.line, e.from.ch), e.to = s.CodeMirror.Pos(e.to.line, e.to.ch), s.CodeMirror.signal(r, "hasCompletion", r, e, t)), e; -}); +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react-jsx-runtime.development.js */ "../../../node_modules/react/cjs/react-jsx-runtime.development.js"); +} /***/ }), -/***/ "../../graphiql-react/dist/hint.cjs2.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/hint.cjs2.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { +/***/ "../../../node_modules/set-value/index.js": +/*!************************************************!*\ + !*** ../../../node_modules/set-value/index.js ***! + \************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +/*! + * set-value + * + * Copyright (c) Jon Schlinkert (https://github.com/jonschlinkert). + * Released under the MIT License. + */ -var g = Object.defineProperty; -var p = (i, n) => g(i, "name", { - value: n, - configurable: !0 -}); -const d = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - a = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"), - b = __webpack_require__(/*! ./forEachState.cjs.js */ "../../graphiql-react/dist/forEachState.cjs.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function f(i, n, t) { - const r = x(t, m(n.string)); - if (!r) return; - const e = n.type !== null && /"|\w/.test(n.string[0]) ? n.start : n.end; - return { - list: r, - from: { - line: i.line, - ch: e - }, - to: { - line: i.line, - ch: n.end +const { + deleteProperty +} = Reflect; +const isPrimitive = __webpack_require__(/*! is-primitive */ "../../../node_modules/is-primitive/index.js"); +const isPlainObject = __webpack_require__(/*! is-plain-object */ "../../../node_modules/is-plain-object/index.js"); +const isObject = value => { + return typeof value === 'object' && value !== null || typeof value === 'function'; +}; +const isUnsafeKey = key => { + return key === '__proto__' || key === 'constructor' || key === 'prototype'; +}; +const validateKey = key => { + if (!isPrimitive(key)) { + throw new TypeError('Object keys must be strings or symbols'); + } + if (isUnsafeKey(key)) { + throw new Error(`Cannot set unsafe key: "${key}"`); + } +}; +const toStringKey = input => { + return Array.isArray(input) ? input.flat().map(String).join(',') : input; +}; +const createMemoKey = (input, options) => { + if (typeof input !== 'string' || !options) return input; + let key = input + ';'; + if (options.arrays !== undefined) key += `arrays=${options.arrays};`; + if (options.separator !== undefined) key += `separator=${options.separator};`; + if (options.split !== undefined) key += `split=${options.split};`; + if (options.merge !== undefined) key += `merge=${options.merge};`; + if (options.preservePaths !== undefined) key += `preservePaths=${options.preservePaths};`; + return key; +}; +const memoize = (input, options, fn) => { + const key = toStringKey(options ? createMemoKey(input, options) : input); + validateKey(key); + const value = setValue.cache.get(key) || fn(); + setValue.cache.set(key, value); + return value; +}; +const splitString = (input, options = {}) => { + const sep = options.separator || '.'; + const preserve = sep === '/' ? false : options.preservePaths; + if (typeof input === 'string' && preserve !== false && /\//.test(input)) { + return [input]; + } + const parts = []; + let part = ''; + const push = part => { + let number; + if (part.trim() !== '' && Number.isInteger(number = Number(part))) { + parts.push(number); + } else { + parts.push(part); } }; -} -p(f, "hintList"); -function x(i, n) { - if (!n) return y(i, o => !o.isDeprecated); - const t = i.map(o => ({ - proximity: L(m(o.text), n), - entry: o - })); - return y(y(t, o => o.proximity <= 2), o => !o.entry.isDeprecated).sort((o, l) => (o.entry.isDeprecated ? 1 : 0) - (l.entry.isDeprecated ? 1 : 0) || o.proximity - l.proximity || o.entry.text.length - l.entry.text.length).map(o => o.entry); -} -p(x, "filterAndSortList"); -function y(i, n) { - const t = i.filter(n); - return t.length === 0 ? i : t; -} -p(y, "filterNonEmpty"); -function m(i) { - return i.toLowerCase().replaceAll(/\W/g, ""); -} -p(m, "normalizeText"); -function L(i, n) { - let t = T(n, i); - return i.length > n.length && (t -= i.length - n.length - 1, t += i.indexOf(n) === 0 ? 0 : .5), t; -} -p(L, "getProximity"); -function T(i, n) { - let t, r; - const e = [], - o = i.length, - l = n.length; - for (t = 0; t <= o; t++) e[t] = [t]; - for (r = 1; r <= l; r++) e[0][r] = r; - for (t = 1; t <= o; t++) for (r = 1; r <= l; r++) { - const u = i[t - 1] === n[r - 1] ? 0 : 1; - e[t][r] = Math.min(e[t - 1][r] + 1, e[t][r - 1] + 1, e[t - 1][r - 1] + u), t > 1 && r > 1 && i[t - 1] === n[r - 2] && i[t - 2] === n[r - 1] && (e[t][r] = Math.min(e[t][r], e[t - 2][r - 2] + u)); - } - return e[o][l]; -} -p(T, "lexicalDistance"); -d.CodeMirror.registerHelper("hint", "graphql-variables", (i, n) => { - const t = i.getCursor(), - r = i.getTokenAt(t), - e = V(t, r, n); - return e != null && e.list && e.list.length > 0 && (e.from = d.CodeMirror.Pos(e.from.line, e.from.ch), e.to = d.CodeMirror.Pos(e.to.line, e.to.ch), d.CodeMirror.signal(i, "hasCompletion", i, e, r)), e; -}); -function V(i, n, t) { - const r = n.state.kind === "Invalid" ? n.state.prevState : n.state, - { - kind: e, - step: o - } = r; - if (e === "Document" && o === 0) return f(i, n, [{ - text: "{" - }]); - const { - variableToType: l - } = t; - if (!l) return; - const u = j(l, n.state); - if (e === "Document" || e === "Variable" && o === 0) { - const c = Object.keys(l); - return f(i, n, c.map(s => ({ - text: `"${s}": `, - type: l[s] - }))); + for (let i = 0; i < input.length; i++) { + const value = input[i]; + if (value === '\\') { + part += input[++i]; + continue; + } + if (value === sep) { + push(part); + part = ''; + continue; + } + part += value; } - if ((e === "ObjectValue" || e === "ObjectField" && o === 0) && u.fields) { - const c = Object.keys(u.fields).map(s => u.fields[s]); - return f(i, n, c.map(s => ({ - text: `"${s.name}": `, - type: s.type, - description: s.description - }))); + if (part) { + push(part); } - if (e === "StringValue" || e === "NumberValue" || e === "BooleanValue" || e === "NullValue" || e === "ListValue" && o === 1 || e === "ObjectField" && o === 2 || e === "Variable" && o === 2) { - const c = u.type ? a.getNamedType(u.type) : void 0; - if (c instanceof a.GraphQLInputObjectType) return f(i, n, [{ - text: "{" - }]); - if (c instanceof a.GraphQLEnumType) { - const s = c.getValues(); - return f(i, n, s.map(h => ({ - text: `"${h.name}"`, - type: c, - description: h.description - }))); + return parts; +}; +const split = (input, options) => { + if (options && typeof options.split === 'function') return options.split(input); + if (typeof input === 'symbol') return [input]; + if (Array.isArray(input)) return input; + return memoize(input, options, () => splitString(input, options)); +}; +const assignProp = (obj, prop, value, options) => { + validateKey(prop); + + // Delete property when "value" is undefined + if (value === undefined) { + deleteProperty(obj, prop); + } else if (options && options.merge) { + const merge = options.merge === 'function' ? options.merge : Object.assign; + + // Only merge plain objects + if (merge && isPlainObject(obj[prop]) && isPlainObject(value)) { + obj[prop] = merge(obj[prop], value); + } else { + obj[prop] = value; } - if (c === a.GraphQLBoolean) return f(i, n, [{ - text: "true", - type: a.GraphQLBoolean, - description: "Not false." - }, { - text: "false", - type: a.GraphQLBoolean, - description: "Not true." - }]); + } else { + obj[prop] = value; } -} -p(V, "getVariablesHint"); -function j(i, n) { - const t = { - type: null, - fields: null - }; - return b.forEachState(n, r => { - switch (r.kind) { - case "Variable": - { - t.type = i[r.name]; - break; - } - case "ListValue": - { - const e = t.type ? a.getNullableType(t.type) : void 0; - t.type = e instanceof a.GraphQLList ? e.ofType : null; - break; - } - case "ObjectValue": - { - const e = t.type ? a.getNamedType(t.type) : void 0; - t.fields = e instanceof a.GraphQLInputObjectType ? e.getFields() : null; - break; - } - case "ObjectField": - { - const e = r.name && t.fields ? t.fields[r.name] : null; - t.type = e == null ? void 0 : e.type; - break; - } + return obj; +}; +const setValue = (target, path, value, options) => { + if (!path || !isObject(target)) return target; + const keys = split(path, options); + let obj = target; + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const next = keys[i + 1]; + validateKey(key); + if (next === undefined) { + assignProp(obj, key, value, options); + break; } - }), t; -} -p(j, "getTypeInfo"); + if (typeof next === 'number' && !Array.isArray(obj[key])) { + obj = obj[key] = []; + continue; + } + if (!isObject(obj[key])) { + obj[key] = {}; + } + obj = obj[key]; + } + return target; +}; +setValue.split = split; +setValue.cache = new Map(); +setValue.clear = () => { + setValue.cache = new Map(); +}; +module.exports = setValue; /***/ }), -/***/ "../../graphiql-react/dist/index.js": -/*!******************************************!*\ - !*** ../../graphiql-react/dist/index.js ***! - \******************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ "../../../node_modules/style-value-types/dist/valueTypes.cjs.js": +/*!**********************************************************************!*\ + !*** ../../../node_modules/style-value-types/dist/valueTypes.cjs.js ***! + \**********************************************************************/ +/***/ (function(__unused_webpack_module, exports) { -var Tn = Object.defineProperty; -var a = (e, t) => Tn(e, "name", { - value: t, - configurable: !0 -}); -Object.defineProperty(exports, Symbol.toStringTag, { - value: "Module" -}); -const r = __webpack_require__(/*! react/jsx-runtime */ "../../../node_modules/react/jsx-runtime.js"), - l = __webpack_require__(/*! react */ "react"), - _ = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.m.js"), - M = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"), - B = __webpack_require__(/*! @graphiql/toolkit */ "../../graphiql-toolkit/esm/index.js"), - kt = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"), - Mn = __webpack_require__(/*! set-value */ "../../../node_modules/set-value/index.js"), - Rn = __webpack_require__(/*! copy-to-clipboard */ "../../../node_modules/copy-to-clipboard/index.js"), - Pn = __webpack_require__(/*! @radix-ui/react-dialog */ "../../../node_modules/@radix-ui/react-dialog/dist/index.js"), - qn = __webpack_require__(/*! @radix-ui/react-visually-hidden */ "../../../node_modules/@radix-ui/react-visually-hidden/dist/index.js"), - xe = __webpack_require__(/*! @radix-ui/react-dropdown-menu */ "../../../node_modules/@radix-ui/react-dropdown-menu/dist/index.js"), - Vn = __webpack_require__(/*! markdown-it */ "../node_modules/markdown-it/dist/index.cjs.js"), - Nt = __webpack_require__(/*! framer-motion */ "../../../node_modules/framer-motion/dist/cjs/index.js"), - In = __webpack_require__(/*! @radix-ui/react-tooltip */ "../../../node_modules/@radix-ui/react-tooltip/dist/index.js"), - ae = __webpack_require__(/*! @headlessui/react */ "../../../node_modules/@headlessui/react/dist/index.cjs"), - yt = __webpack_require__(/*! react-dom */ "react-dom"); -function nt(e) { - const t = Object.create(null, { - [Symbol.toStringTag]: { - value: "Module" - } - }); - if (e) { - for (const n in e) if (n !== "default") { - const s = Object.getOwnPropertyDescriptor(e, n); - Object.defineProperty(t, n, s.get ? s : { - enumerable: !0, - get: () => e[n] - }); - } - } - return t.default = e, Object.freeze(t); -} -a(nt, "_interopNamespaceDefault"); -const u = nt(l), - re = nt(Pn), - pe = nt(In); -function le(e) { - const t = l.createContext(null); - return t.displayName = e, t; -} -a(le, "createNullableContext"); -function ie(e) { - function t(n) { - var o; - const s = l.useContext(e); - if (s === null && n != null && n.nonNull) throw new Error(`Tried to use \`${((o = n.caller) == null ? void 0 : o.name) || t.caller.name}\` without the necessary context. Make sure to render the \`${e.displayName}Provider\` component higher up the tree.`); - return s; - } - return a(t, "useGivenContext"), Object.defineProperty(t, "name", { - value: `use${e.displayName}` - }), t; -} -a(ie, "createContextHook"); -const rt = le("StorageContext"); -function Tt(e) { - const t = l.useRef(!0), - [n, s] = l.useState(new B.StorageAPI(e.storage)); - return l.useEffect(() => { - t.current ? t.current = !1 : s(new B.StorageAPI(e.storage)); - }, [e.storage]), r.jsx(rt.Provider, { - value: n, - children: e.children - }); -} -a(Tt, "StorageContextProvider"); -const se = ie(rt), - Hn = a(_ref => { - let { - title: e, - titleId: t, - ...n - } = _ref; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 14 14", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M5.0484 1.40838C6.12624 0.33054 7.87376 0.330541 8.9516 1.40838L12.5916 5.0484C13.6695 6.12624 13.6695 7.87376 12.5916 8.9516L8.9516 12.5916C7.87376 13.6695 6.12624 13.6695 5.0484 12.5916L1.40838 8.9516C0.33054 7.87376 0.330541 6.12624 1.40838 5.0484L5.0484 1.40838Z", - stroke: "currentColor", - strokeWidth: 1.2 - }), u.createElement("rect", { - x: 6, - y: 6, - width: 2, - height: 2, - rx: 1, - fill: "currentColor" - })); - }, "SvgArgument"), - Dn = a(_ref2 => { - let { - title: e, - titleId: t, - ...n - } = _ref2; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 14 9", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M1 1L7 7L13 1", - stroke: "currentColor", - strokeWidth: 1.5 - })); - }, "SvgChevronDown"), - An = a(_ref3 => { - let { - title: e, - titleId: t, - ...n - } = _ref3; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 7 10", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M6 1.04819L2 5.04819L6 9.04819", - stroke: "currentColor", - strokeWidth: 1.75 - })); - }, "SvgChevronLeft"), - On = a(_ref4 => { - let { - title: e, - titleId: t, - ...n - } = _ref4; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 14 9", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M13 8L7 2L1 8", - stroke: "currentColor", - strokeWidth: 1.5 - })); - }, "SvgChevronUp"), - Fn = a(_ref5 => { - let { - title: e, - titleId: t, - ...n - } = _ref5; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 14 14", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M1 1L12.9998 12.9997", - stroke: "currentColor", - strokeWidth: 1.5 - }), u.createElement("path", { - d: "M13 1L1.00079 13.0003", - stroke: "currentColor", - strokeWidth: 1.5 - })); - }, "SvgClose"), - Bn = a(_ref6 => { - let { - title: e, - titleId: t, - ...n - } = _ref6; - return u.createElement("svg", { - height: "1em", - viewBox: "-2 -2 22 22", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M11.25 14.2105V15.235C11.25 16.3479 10.3479 17.25 9.23501 17.25H2.76499C1.65214 17.25 0.75 16.3479 0.75 15.235L0.75 8.76499C0.75 7.65214 1.65214 6.75 2.76499 6.75L3.78947 6.75", - stroke: "currentColor", - strokeWidth: 1.5 - }), u.createElement("rect", { - x: 6.75, - y: .75, - width: 10.5, - height: 10.5, - rx: 2.2069, - stroke: "currentColor", - strokeWidth: 1.5 - })); - }, "SvgCopy"), - Wn = a(_ref7 => { - let { - title: e, - titleId: t, - ...n - } = _ref7; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 14 14", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M5.0484 1.40838C6.12624 0.33054 7.87376 0.330541 8.9516 1.40838L12.5916 5.0484C13.6695 6.12624 13.6695 7.87376 12.5916 8.9516L8.9516 12.5916C7.87376 13.6695 6.12624 13.6695 5.0484 12.5916L1.40838 8.9516C0.33054 7.87376 0.330541 6.12624 1.40838 5.0484L5.0484 1.40838Z", - stroke: "currentColor", - strokeWidth: 1.2 - }), u.createElement("path", { - d: "M5 9L9 5", - stroke: "currentColor", - strokeWidth: 1.2 - }), u.createElement("path", { - d: "M5 5L9 9", - stroke: "currentColor", - strokeWidth: 1.2 - })); - }, "SvgDeprecatedArgument"), - _n = a(_ref8 => { - let { - title: e, - titleId: t, - ...n - } = _ref8; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 12 12", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M4 8L8 4", - stroke: "currentColor", - strokeWidth: 1.2 - }), u.createElement("path", { - d: "M4 4L8 8", - stroke: "currentColor", - strokeWidth: 1.2 - }), u.createElement("path", { - fillRule: "evenodd", - clipRule: "evenodd", - d: "M8.5 1.2H9C9.99411 1.2 10.8 2.00589 10.8 3V9C10.8 9.99411 9.99411 10.8 9 10.8H8.5V12H9C10.6569 12 12 10.6569 12 9V3C12 1.34315 10.6569 0 9 0H8.5V1.2ZM3.5 1.2V0H3C1.34315 0 0 1.34315 0 3V9C0 10.6569 1.34315 12 3 12H3.5V10.8H3C2.00589 10.8 1.2 9.99411 1.2 9V3C1.2 2.00589 2.00589 1.2 3 1.2H3.5Z", - fill: "currentColor" - })); - }, "SvgDeprecatedEnumValue"), - Zn = a(_ref9 => { - let { - title: e, - titleId: t, - ...n - } = _ref9; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 12 12", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("rect", { - x: .6, - y: .6, - width: 10.8, - height: 10.8, - rx: 3.4, - stroke: "currentColor", - strokeWidth: 1.2 - }), u.createElement("path", { - d: "M4 8L8 4", - stroke: "currentColor", - strokeWidth: 1.2 - }), u.createElement("path", { - d: "M4 4L8 8", - stroke: "currentColor", - strokeWidth: 1.2 - })); - }, "SvgDeprecatedField"), - $n = a(_ref10 => { - let { - title: e, - titleId: t, - ...n - } = _ref10; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0.5 12 12", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("rect", { - x: 7, - y: 5.5, - width: 2, - height: 2, - rx: 1, - transform: "rotate(90 7 5.5)", - fill: "currentColor" - }), u.createElement("path", { - fillRule: "evenodd", - clipRule: "evenodd", - d: "M10.8 9L10.8 9.5C10.8 10.4941 9.99411 11.3 9 11.3L3 11.3C2.00589 11.3 1.2 10.4941 1.2 9.5L1.2 9L-3.71547e-07 9L-3.93402e-07 9.5C-4.65826e-07 11.1569 1.34314 12.5 3 12.5L9 12.5C10.6569 12.5 12 11.1569 12 9.5L12 9L10.8 9ZM10.8 4L12 4L12 3.5C12 1.84315 10.6569 0.5 9 0.5L3 0.5C1.34315 0.5 -5.87117e-08 1.84315 -1.31135e-07 3.5L-1.5299e-07 4L1.2 4L1.2 3.5C1.2 2.50589 2.00589 1.7 3 1.7L9 1.7C9.99411 1.7 10.8 2.50589 10.8 3.5L10.8 4Z", - fill: "currentColor" - })); - }, "SvgDirective"), - Gn = a(_ref11 => { - let { - title: e, - titleId: t, - ...n - } = _ref11; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 20 24", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M0.75 3C0.75 1.75736 1.75736 0.75 3 0.75H17.25C17.8023 0.75 18.25 1.19772 18.25 1.75V5.25", - stroke: "currentColor", - strokeWidth: 1.5 - }), u.createElement("path", { - d: "M0.75 3C0.75 4.24264 1.75736 5.25 3 5.25H18.25C18.8023 5.25 19.25 5.69771 19.25 6.25V22.25C19.25 22.8023 18.8023 23.25 18.25 23.25H3C1.75736 23.25 0.75 22.2426 0.75 21V3Z", - stroke: "currentColor", - strokeWidth: 1.5 - }), u.createElement("path", { - fillRule: "evenodd", - clipRule: "evenodd", - d: "M3 5.25C1.75736 5.25 0.75 4.24264 0.75 3V21C0.75 22.2426 1.75736 23.25 3 23.25H18.25C18.8023 23.25 19.25 22.8023 19.25 22.25V6.25C19.25 5.69771 18.8023 5.25 18.25 5.25H3ZM13 11L6 11V12.5L13 12.5V11Z", - fill: "currentColor" - })); - }, "SvgDocsFilled"), - Qn = a(_ref12 => { - let { - title: e, - titleId: t, - ...n - } = _ref12; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 20 24", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M0.75 3C0.75 4.24264 1.75736 5.25 3 5.25H17.25M0.75 3C0.75 1.75736 1.75736 0.75 3 0.75H16.25C16.8023 0.75 17.25 1.19772 17.25 1.75V5.25M0.75 3V21C0.75 22.2426 1.75736 23.25 3 23.25H18.25C18.8023 23.25 19.25 22.8023 19.25 22.25V6.25C19.25 5.69771 18.8023 5.25 18.25 5.25H17.25", - stroke: "currentColor", - strokeWidth: 1.5 - }), u.createElement("line", { - x1: 13, - y1: 11.75, - x2: 6, - y2: 11.75, - stroke: "currentColor", - strokeWidth: 1.5 - })); - }, "SvgDocs"), - zn = a(_ref13 => { - let { - title: e, - titleId: t, - ...n - } = _ref13; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 12 12", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("rect", { - x: 5, - y: 5, - width: 2, - height: 2, - rx: 1, - fill: "currentColor" - }), u.createElement("path", { - fillRule: "evenodd", - clipRule: "evenodd", - d: "M8.5 1.2H9C9.99411 1.2 10.8 2.00589 10.8 3V9C10.8 9.99411 9.99411 10.8 9 10.8H8.5V12H9C10.6569 12 12 10.6569 12 9V3C12 1.34315 10.6569 0 9 0H8.5V1.2ZM3.5 1.2V0H3C1.34315 0 0 1.34315 0 3V9C0 10.6569 1.34315 12 3 12H3.5V10.8H3C2.00589 10.8 1.2 9.99411 1.2 9V3C1.2 2.00589 2.00589 1.2 3 1.2H3.5Z", - fill: "currentColor" - })); - }, "SvgEnumValue"), - Un = a(_ref14 => { - let { - title: e, - titleId: t, - ...n - } = _ref14; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 12 13", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("rect", { - x: .6, - y: 1.1, - width: 10.8, - height: 10.8, - rx: 2.4, - stroke: "currentColor", - strokeWidth: 1.2 - }), u.createElement("rect", { - x: 5, - y: 5.5, - width: 2, - height: 2, - rx: 1, - fill: "currentColor" - })); - }, "SvgField"), - Kn = a(_ref15 => { - let { - title: e, - titleId: t, - ...n - } = _ref15; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 24 20", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M1.59375 9.52344L4.87259 12.9944L8.07872 9.41249", - stroke: "currentColor", - strokeWidth: 1.5, - strokeLinecap: "square" - }), u.createElement("path", { - d: "M13.75 5.25V10.75H18.75", - stroke: "currentColor", - strokeWidth: 1.5, - strokeLinecap: "square" - }), u.createElement("path", { - d: "M4.95427 11.9332C4.55457 10.0629 4.74441 8.11477 5.49765 6.35686C6.25089 4.59894 7.5305 3.11772 9.16034 2.11709C10.7902 1.11647 12.6901 0.645626 14.5986 0.769388C16.5071 0.893151 18.3303 1.60543 19.8172 2.80818C21.3042 4.01093 22.3818 5.64501 22.9017 7.48548C23.4216 9.32595 23.3582 11.2823 22.7203 13.0853C22.0824 14.8883 20.9013 16.4492 19.3396 17.5532C17.778 18.6572 15.9125 19.25 14 19.25", - stroke: "currentColor", - strokeWidth: 1.5 - })); - }, "SvgHistory"), - Jn = a(_ref16 => { - let { - title: e, - titleId: t, - ...n - } = _ref16; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 12 12", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("circle", { - cx: 6, - cy: 6, - r: 5.4, - stroke: "currentColor", - strokeWidth: 1.2, - strokeDasharray: "4.241025 4.241025", - transform: "rotate(22.5)", - "transform-origin": "center" - }), u.createElement("circle", { - cx: 6, - cy: 6, - r: 1, - fill: "currentColor" - })); - }, "SvgImplements"), - Yn = a(_ref17 => { - let { - title: e, - titleId: t, - ...n - } = _ref17; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 19 18", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M1.5 14.5653C1.5 15.211 1.75652 15.8303 2.21314 16.2869C2.66975 16.7435 3.28905 17 3.9348 17C4.58054 17 5.19984 16.7435 5.65646 16.2869C6.11307 15.8303 6.36959 15.211 6.36959 14.5653V12.1305H3.9348C3.28905 12.1305 2.66975 12.387 2.21314 12.8437C1.75652 13.3003 1.5 13.9195 1.5 14.5653Z", - stroke: "currentColor", - strokeWidth: 1.125, - strokeLinecap: "round", - strokeLinejoin: "round" - }), u.createElement("path", { - d: "M3.9348 1.00063C3.28905 1.00063 2.66975 1.25715 2.21314 1.71375C1.75652 2.17035 1.5 2.78964 1.5 3.43537C1.5 4.0811 1.75652 4.70038 2.21314 5.15698C2.66975 5.61358 3.28905 5.8701 3.9348 5.8701H6.36959V3.43537C6.36959 2.78964 6.11307 2.17035 5.65646 1.71375C5.19984 1.25715 4.58054 1.00063 3.9348 1.00063Z", - stroke: "currentColor", - strokeWidth: 1.125, - strokeLinecap: "round", - strokeLinejoin: "round" - }), u.createElement("path", { - d: "M15.0652 12.1305H12.6304V14.5653C12.6304 15.0468 12.7732 15.5175 13.0407 15.9179C13.3083 16.3183 13.6885 16.6304 14.1334 16.8147C14.5783 16.9989 15.0679 17.0472 15.5402 16.9532C16.0125 16.8593 16.4464 16.6274 16.7869 16.2869C17.1274 15.9464 17.3593 15.5126 17.4532 15.0403C17.5472 14.568 17.4989 14.0784 17.3147 13.6335C17.1304 13.1886 16.8183 12.8084 16.4179 12.5409C16.0175 12.2733 15.5468 12.1305 15.0652 12.1305Z", - stroke: "currentColor", - strokeWidth: 1.125, - strokeLinecap: "round", - strokeLinejoin: "round" - }), u.createElement("path", { - d: "M12.6318 5.86775H6.36955V12.1285H12.6318V5.86775Z", - stroke: "currentColor", - strokeWidth: 1.125, - strokeLinecap: "round", - strokeLinejoin: "round" - }), u.createElement("path", { - d: "M17.5 3.43473C17.5 2.789 17.2435 2.16972 16.7869 1.71312C16.3303 1.25652 15.711 1 15.0652 1C14.4195 1 13.8002 1.25652 13.3435 1.71312C12.8869 2.16972 12.6304 2.789 12.6304 3.43473V5.86946H15.0652C15.711 5.86946 16.3303 5.61295 16.7869 5.15635C17.2435 4.69975 17.5 4.08046 17.5 3.43473Z", - stroke: "currentColor", - strokeWidth: 1.125, - strokeLinecap: "round", - strokeLinejoin: "round" - })); - }, "SvgKeyboardShortcut"), - Xn = a(_ref18 => { - let { - title: e, - titleId: t, - ...n - } = _ref18; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 13 13", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("circle", { - cx: 5, - cy: 5, - r: 4.35, - stroke: "currentColor", - strokeWidth: 1.3 - }), u.createElement("line", { - x1: 8.45962, - y1: 8.54038, - x2: 11.7525, - y2: 11.8333, - stroke: "currentColor", - strokeWidth: 1.3 - })); - }, "SvgMagnifyingGlass"), - er = a(_ref19 => { - let { - title: e, - titleId: t, - ...n - } = _ref19; - return u.createElement("svg", { - height: "1em", - viewBox: "-2 -2 22 22", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M17.2492 6V2.9569C17.2492 1.73806 16.2611 0.75 15.0423 0.75L2.9569 0.75C1.73806 0.75 0.75 1.73806 0.75 2.9569L0.75 6", - stroke: "currentColor", - strokeWidth: 1.5 - }), u.createElement("path", { - d: "M0.749873 12V15.0431C0.749873 16.2619 1.73794 17.25 2.95677 17.25H15.0421C16.261 17.25 17.249 16.2619 17.249 15.0431V12", - stroke: "currentColor", - strokeWidth: 1.5 - }), u.createElement("path", { - d: "M6 4.5L9 7.5L12 4.5", - stroke: "currentColor", - strokeWidth: 1.5 - }), u.createElement("path", { - d: "M12 13.5L9 10.5L6 13.5", - stroke: "currentColor", - strokeWidth: 1.5 - })); - }, "SvgMerge"), - tr = a(_ref20 => { - let { - title: e, - titleId: t, - ...n - } = _ref20; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 14 14", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M0.75 13.25L0.0554307 12.967C-0.0593528 13.2488 0.00743073 13.5719 0.224488 13.7851C0.441545 13.9983 0.765869 14.0592 1.04549 13.9393L0.75 13.25ZM12.8214 1.83253L12.2911 2.36286L12.2911 2.36286L12.8214 1.83253ZM12.8214 3.90194L13.3517 4.43227L12.8214 3.90194ZM10.0981 1.17859L9.56773 0.648259L10.0981 1.17859ZM12.1675 1.17859L12.6978 0.648258L12.6978 0.648257L12.1675 1.17859ZM2.58049 8.75697L3.27506 9.03994L2.58049 8.75697ZM2.70066 8.57599L3.23099 9.10632L2.70066 8.57599ZM5.2479 11.4195L4.95355 10.7297L5.2479 11.4195ZM5.42036 11.303L4.89003 10.7727L5.42036 11.303ZM4.95355 10.7297C4.08882 11.0987 3.41842 11.362 2.73535 11.6308C2.05146 11.9 1.35588 12.1743 0.454511 12.5607L1.04549 13.9393C1.92476 13.5624 2.60256 13.2951 3.28469 13.0266C3.96762 12.7578 4.65585 12.4876 5.54225 12.1093L4.95355 10.7297ZM1.44457 13.533L3.27506 9.03994L1.88592 8.474L0.0554307 12.967L1.44457 13.533ZM3.23099 9.10632L10.6284 1.70892L9.56773 0.648259L2.17033 8.04566L3.23099 9.10632ZM11.6371 1.70892L12.2911 2.36286L13.3517 1.3022L12.6978 0.648258L11.6371 1.70892ZM12.2911 3.37161L4.89003 10.7727L5.95069 11.8333L13.3517 4.43227L12.2911 3.37161ZM12.2911 2.36286C12.5696 2.64142 12.5696 3.09305 12.2911 3.37161L13.3517 4.43227C14.2161 3.56792 14.2161 2.16654 13.3517 1.3022L12.2911 2.36286ZM10.6284 1.70892C10.9069 1.43036 11.3586 1.43036 11.6371 1.70892L12.6978 0.648257C11.8335 -0.216088 10.4321 -0.216084 9.56773 0.648259L10.6284 1.70892ZM3.27506 9.03994C3.26494 9.06479 3.24996 9.08735 3.23099 9.10632L2.17033 8.04566C2.04793 8.16806 1.95123 8.31369 1.88592 8.474L3.27506 9.03994ZM5.54225 12.1093C5.69431 12.0444 5.83339 11.9506 5.95069 11.8333L4.89003 10.7727C4.90863 10.7541 4.92988 10.7398 4.95355 10.7297L5.54225 12.1093Z", - fill: "currentColor" - }), u.createElement("path", { - d: "M11.5 4.5L9.5 2.5", - stroke: "currentColor", - strokeWidth: 1.4026, - strokeLinecap: "round", - strokeLinejoin: "round" - }), u.createElement("path", { - d: "M5.5 10.5L3.5 8.5", - stroke: "currentColor", - strokeWidth: 1.4026, - strokeLinecap: "round", - strokeLinejoin: "round" - })); - }, "SvgPen"), - nr = a(_ref21 => { - let { - title: e, - titleId: t, - ...n - } = _ref21; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 16 18", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M1.32226e-07 1.6609C7.22332e-08 0.907329 0.801887 0.424528 1.46789 0.777117L15.3306 8.11621C16.0401 8.49182 16.0401 9.50818 15.3306 9.88379L1.46789 17.2229C0.801886 17.5755 1.36076e-06 17.0927 1.30077e-06 16.3391L1.32226e-07 1.6609Z", - fill: "currentColor" - })); - }, "SvgPlay"), - rr = a(_ref22 => { - let { - title: e, - titleId: t, - ...n - } = _ref22; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 10 16", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - fillRule: "evenodd", - clipRule: "evenodd", - d: "M4.25 9.25V13.5H5.75V9.25L10 9.25V7.75L5.75 7.75V3.5H4.25V7.75L0 7.75V9.25L4.25 9.25Z", - fill: "currentColor" - })); - }, "SvgPlus"), - sr = a(_ref23 => { - let { - title: e, - titleId: t, - ...n - } = _ref23; - return u.createElement("svg", { - width: 25, - height: 25, - viewBox: "0 0 25 25", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M10.2852 24.0745L13.7139 18.0742", - stroke: "currentColor", - strokeWidth: 1.5625 - }), u.createElement("path", { - d: "M14.5742 24.0749L17.1457 19.7891", - stroke: "currentColor", - strokeWidth: 1.5625 - }), u.createElement("path", { - d: "M19.4868 24.0735L20.7229 21.7523C21.3259 20.6143 21.5457 19.3122 21.3496 18.0394C21.1535 16.7666 20.5519 15.591 19.6342 14.6874L23.7984 6.87853C24.0123 6.47728 24.0581 6.00748 23.9256 5.57249C23.7932 5.1375 23.4933 4.77294 23.0921 4.55901C22.6908 4.34509 22.221 4.29932 21.7861 4.43178C21.3511 4.56424 20.9865 4.86408 20.7726 5.26533L16.6084 13.0742C15.3474 12.8142 14.0362 12.9683 12.8699 13.5135C11.7035 14.0586 10.7443 14.9658 10.135 16.1L6 24.0735", - stroke: "currentColor", - strokeWidth: 1.5625 - }), u.createElement("path", { - d: "M4 15L5 13L7 12L5 11L4 9L3 11L1 12L3 13L4 15Z", - stroke: "currentColor", - strokeWidth: 1.5625, - strokeLinejoin: "round" - }), u.createElement("path", { - d: "M11.5 8L12.6662 5.6662L15 4.5L12.6662 3.3338L11.5 1L10.3338 3.3338L8 4.5L10.3338 5.6662L11.5 8Z", - stroke: "currentColor", - strokeWidth: 1.5625, - strokeLinejoin: "round" - })); - }, "SvgPrettify"), - or = a(_ref24 => { - let { - title: e, - titleId: t, - ...n - } = _ref24; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 16 16", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M4.75 9.25H1.25V12.75", - stroke: "currentColor", - strokeWidth: 1, - strokeLinecap: "square" - }), u.createElement("path", { - d: "M11.25 6.75H14.75V3.25", - stroke: "currentColor", - strokeWidth: 1, - strokeLinecap: "square" - }), u.createElement("path", { - d: "M14.1036 6.65539C13.8 5.27698 13.0387 4.04193 11.9437 3.15131C10.8487 2.26069 9.48447 1.76694 8.0731 1.75043C6.66173 1.73392 5.28633 2.19563 4.17079 3.0604C3.05526 3.92516 2.26529 5.14206 1.92947 6.513", - stroke: "currentColor", - strokeWidth: 1 - }), u.createElement("path", { - d: "M1.89635 9.34461C2.20001 10.723 2.96131 11.9581 4.05631 12.8487C5.15131 13.7393 6.51553 14.2331 7.9269 14.2496C9.33827 14.2661 10.7137 13.8044 11.8292 12.9396C12.9447 12.0748 13.7347 10.8579 14.0705 9.487", - stroke: "currentColor", - strokeWidth: 1 - })); - }, "SvgReload"), - lr = a(_ref25 => { - let { - title: e, - titleId: t, - ...n - } = _ref25; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 13 13", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("rect", { - x: .6, - y: .6, - width: 11.8, - height: 11.8, - rx: 5.9, - stroke: "currentColor", - strokeWidth: 1.2 - }), u.createElement("path", { - d: "M4.25 7.5C4.25 6 5.75 5 6.5 6.5C7.25 8 8.75 7 8.75 5.5", - stroke: "currentColor", - strokeWidth: 1.2 - })); - }, "SvgRootType"), - ir = a(_ref26 => { - let { - title: e, - titleId: t, - ...n - } = _ref26; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 21 20", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - fillRule: "evenodd", - clipRule: "evenodd", - d: "M9.29186 1.92702C9.06924 1.82745 8.87014 1.68202 8.70757 1.50024L7.86631 0.574931C7.62496 0.309957 7.30773 0.12592 6.95791 0.0479385C6.60809 -0.0300431 6.24274 0.00182978 5.91171 0.139208C5.58068 0.276585 5.3001 0.512774 5.10828 0.815537C4.91645 1.1183 4.82272 1.47288 4.83989 1.83089L4.90388 3.08019C4.91612 3.32348 4.87721 3.56662 4.78968 3.79394C4.70215 4.02126 4.56794 4.2277 4.39571 4.39994C4.22347 4.57219 4.01704 4.7064 3.78974 4.79394C3.56243 4.88147 3.3193 4.92038 3.07603 4.90814L1.8308 4.84414C1.47162 4.82563 1.11553 4.91881 0.811445 5.11086C0.507359 5.30292 0.270203 5.58443 0.132561 5.91671C-0.00508149 6.249 -0.0364554 6.61576 0.0427496 6.9666C0.121955 7.31744 0.307852 7.63514 0.5749 7.87606L1.50016 8.71204C1.68193 8.87461 1.82735 9.07373 1.92692 9.29636C2.02648 9.51898 2.07794 9.76012 2.07794 10.004C2.07794 10.2479 2.02648 10.489 1.92692 10.7116C1.82735 10.9343 1.68193 11.1334 1.50016 11.296L0.5749 12.1319C0.309856 12.3729 0.125575 12.6898 0.0471809 13.0393C-0.0312128 13.3888 9.64098e-05 13.754 0.13684 14.0851C0.273583 14.4162 0.509106 14.6971 0.811296 14.8894C1.11349 15.0817 1.46764 15.1762 1.82546 15.1599L3.0707 15.0959C3.31397 15.0836 3.5571 15.1225 3.7844 15.2101C4.01171 15.2976 4.21814 15.4318 4.39037 15.6041C4.56261 15.7763 4.69682 15.9827 4.78435 16.2101C4.87188 16.4374 4.91078 16.6805 4.89855 16.9238L4.83455 18.1691C4.81605 18.5283 4.90921 18.8844 5.10126 19.1885C5.2933 19.4926 5.5748 19.7298 5.90707 19.8674C6.23934 20.0051 6.60608 20.0365 6.9569 19.9572C7.30772 19.878 7.6254 19.6921 7.86631 19.4251L8.7129 18.4998C8.87547 18.318 9.07458 18.1725 9.29719 18.073C9.51981 17.9734 9.76093 17.9219 10.0048 17.9219C10.2487 17.9219 10.4898 17.9734 10.7124 18.073C10.935 18.1725 11.1341 18.318 11.2967 18.4998L12.1326 19.4251C12.3735 19.6921 12.6912 19.878 13.042 19.9572C13.3929 20.0365 13.7596 20.0051 14.0919 19.8674C14.4241 19.7298 14.7056 19.4926 14.8977 19.1885C15.0897 18.8844 15.1829 18.5283 15.1644 18.1691L15.1004 16.9238C15.0882 16.6805 15.1271 16.4374 15.2146 16.2101C15.3021 15.9827 15.4363 15.7763 15.6086 15.6041C15.7808 15.4318 15.9872 15.2976 16.2145 15.2101C16.4418 15.1225 16.685 15.0836 16.9282 15.0959L18.1735 15.1599C18.5326 15.1784 18.8887 15.0852 19.1928 14.8931C19.4969 14.7011 19.7341 14.4196 19.8717 14.0873C20.0093 13.755 20.0407 13.3882 19.9615 13.0374C19.8823 12.6866 19.6964 12.3689 19.4294 12.1279L18.5041 11.292C18.3223 11.1294 18.1769 10.9303 18.0774 10.7076C17.9778 10.485 17.9263 10.2439 17.9263 10C17.9263 9.75612 17.9778 9.51499 18.0774 9.29236C18.1769 9.06973 18.3223 8.87062 18.5041 8.70804L19.4294 7.87206C19.6964 7.63114 19.8823 7.31344 19.9615 6.9626C20.0407 6.61176 20.0093 6.245 19.8717 5.91271C19.7341 5.58043 19.4969 5.29892 19.1928 5.10686C18.8887 4.91481 18.5326 4.82163 18.1735 4.84014L16.9282 4.90414C16.685 4.91638 16.4418 4.87747 16.2145 4.78994C15.9872 4.7024 15.7808 4.56818 15.6086 4.39594C15.4363 4.2237 15.3021 4.01726 15.2146 3.78994C15.1271 3.56262 15.0882 3.31948 15.1004 3.07619L15.1644 1.83089C15.1829 1.4717 15.0897 1.11559 14.8977 0.811487C14.7056 0.507385 14.4241 0.270217 14.0919 0.132568C13.7596 -0.00508182 13.3929 -0.0364573 13.042 0.0427519C12.6912 0.121961 12.3735 0.307869 12.1326 0.574931L11.2914 1.50024C11.1288 1.68202 10.9297 1.82745 10.7071 1.92702C10.4845 2.02659 10.2433 2.07805 9.99947 2.07805C9.7556 2.07805 9.51448 2.02659 9.29186 1.92702ZM14.3745 10C14.3745 12.4162 12.4159 14.375 9.99977 14.375C7.58365 14.375 5.625 12.4162 5.625 10C5.625 7.58375 7.58365 5.625 9.99977 5.625C12.4159 5.625 14.3745 7.58375 14.3745 10Z", - fill: "currentColor" - })); - }, "SvgSettings"), - ar = a(_ref27 => { - let { - title: e, - titleId: t, - ...n - } = _ref27; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 14 14", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M6.5782 1.07092C6.71096 0.643026 7.28904 0.643027 7.4218 1.07092L8.59318 4.84622C8.65255 5.03758 8.82284 5.16714 9.01498 5.16714L12.8056 5.16714C13.2353 5.16714 13.4139 5.74287 13.0663 6.00732L9.99962 8.34058C9.84418 8.45885 9.77913 8.66848 9.83851 8.85984L11.0099 12.6351C11.1426 13.063 10.675 13.4189 10.3274 13.1544L7.26069 10.8211C7.10524 10.7029 6.89476 10.7029 6.73931 10.8211L3.6726 13.1544C3.32502 13.4189 2.85735 13.063 2.99012 12.6351L4.16149 8.85984C4.22087 8.66848 4.15582 8.45885 4.00038 8.34058L0.933671 6.00732C0.586087 5.74287 0.764722 5.16714 1.19436 5.16714L4.98502 5.16714C5.17716 5.16714 5.34745 5.03758 5.40682 4.84622L6.5782 1.07092Z", - fill: "currentColor", - stroke: "currentColor" - })); - }, "SvgStarFilled"), - cr = a(_ref28 => { - let { - title: e, - titleId: t, - ...n - } = _ref28; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 14 14", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M6.5782 1.07092C6.71096 0.643026 7.28904 0.643027 7.4218 1.07092L8.59318 4.84622C8.65255 5.03758 8.82284 5.16714 9.01498 5.16714L12.8056 5.16714C13.2353 5.16714 13.4139 5.74287 13.0663 6.00732L9.99962 8.34058C9.84418 8.45885 9.77913 8.66848 9.83851 8.85984L11.0099 12.6351C11.1426 13.063 10.675 13.4189 10.3274 13.1544L7.26069 10.8211C7.10524 10.7029 6.89476 10.7029 6.73931 10.8211L3.6726 13.1544C3.32502 13.4189 2.85735 13.063 2.99012 12.6351L4.16149 8.85984C4.22087 8.66848 4.15582 8.45885 4.00038 8.34058L0.933671 6.00732C0.586087 5.74287 0.764722 5.16714 1.19436 5.16714L4.98502 5.16714C5.17716 5.16714 5.34745 5.03758 5.40682 4.84622L6.5782 1.07092Z", - stroke: "currentColor", - strokeWidth: 1.5 - })); - }, "SvgStar"), - ur = a(_ref29 => { - let { - title: e, - titleId: t, - ...n - } = _ref29; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 16 16", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("rect", { - width: 16, - height: 16, - rx: 2, - fill: "currentColor" - })); - }, "SvgStop"), - dr = a(_ref30 => { - let { - title: e, - titleId: t, - ...n - } = _ref30; - return u.createElement("svg", { - width: "1em", - height: "5em", - xmlns: "http://www.w3.org/2000/svg", - fillRule: "evenodd", - "aria-hidden": "true", - viewBox: "0 0 23 23", - style: { - height: "1.5em" - }, - clipRule: "evenodd", - "aria-labelledby": t, - ...n - }, e === void 0 ? u.createElement("title", { - id: t - }, "trash icon") : e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("path", { - d: "M19 24h-14c-1.104 0-2-.896-2-2v-17h-1v-2h6v-1.5c0-.827.673-1.5 1.5-1.5h5c.825 0 1.5.671 1.5 1.5v1.5h6v2h-1v17c0 1.104-.896 2-2 2zm0-19h-14v16.5c0 .276.224.5.5.5h13c.276 0 .5-.224.5-.5v-16.5zm-7 7.586l3.293-3.293 1.414 1.414-3.293 3.293 3.293 3.293-1.414 1.414-3.293-3.293-3.293 3.293-1.414-1.414 3.293-3.293-3.293-3.293 1.414-1.414 3.293 3.293zm2-10.586h-4v1h4v-1z", - fill: "currentColor", - strokeWidth: .25, - stroke: "currentColor" - })); - }, "SvgTrash"), - hr = a(_ref31 => { - let { - title: e, - titleId: t, - ...n - } = _ref31; - return u.createElement("svg", { - height: "1em", - viewBox: "0 0 13 13", - fill: "none", - xmlns: "http://www.w3.org/2000/svg", - "aria-labelledby": t, - ...n - }, e ? u.createElement("title", { - id: t - }, e) : null, u.createElement("rect", { - x: .6, - y: .6, - width: 11.8, - height: 11.8, - rx: 5.9, - stroke: "currentColor", - strokeWidth: 1.2 - }), u.createElement("rect", { - x: 5.5, - y: 5.5, - width: 2, - height: 2, - rx: 1, - fill: "currentColor" - })); - }, "SvgType"), - Mt = V(Hn), - mr = V(Dn), - Rt = V(An), - fr = V(On), - Fe = V(Fn), - pr = V(Bn), - Pt = V(Wn), - qt = V(_n), - Vt = V(Zn), - It = V($n), - Ht = V(Gn, "filled docs icon"), - Dt = V(Qn), - At = V(zn), - Ot = V(Un), - Ft = V(Kn), - Bt = V(Jn), - gr = V(Yn), - Wt = V(Xn), - xr = V(er), - _t = V(tr), - Zt = V(nr), - Cr = V(rr), - vr = V(sr), - yr = V(or), - $t = V(lr), - br = V(ir), - Gt = V(ar, "filled star icon"), - Qt = V(cr), - zt = V(ur), - Ut = V(dr, "trash icon"), - ge = V(hr); -function V(e) { - let t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : e.name.replace("Svg", "").replaceAll(/([A-Z])/g, " $1").trimStart().toLowerCase() + " icon"; - return e.defaultProps = { - title: t - }, e; -} -a(V, "generateIcon"); -const Q = l.forwardRef((e, t) => r.jsx("button", { - ...e, - ref: t, - className: _.clsx("graphiql-un-styled", e.className) -})); -Q.displayName = "UnStyledButton"; -const me = l.forwardRef((e, t) => r.jsx("button", { - ...e, - ref: t, - className: _.clsx("graphiql-button", { - success: "graphiql-button-success", - error: "graphiql-button-error" - }[e.state], e.className) -})); -me.displayName = "Button"; -const Kt = l.forwardRef((e, t) => r.jsx("div", { - ...e, - ref: t, - className: _.clsx("graphiql-button-group", e.className) -})); -Kt.displayName = "ButtonGroup"; -const ye = a((e, t) => Object.entries(t).reduce((n, _ref32) => { - let [s, o] = _ref32; - return n[s] = o, n; -}, e), "createComponentGroup"); -const Jt = l.forwardRef((e, t) => r.jsx(re.Close, { - asChild: !0, - children: r.jsxs(Q, { - ...e, - ref: t, - type: "button", - className: _.clsx("graphiql-dialog-close", e.className), - children: [r.jsx(qn.Root, { - children: "Close dialog" - }), r.jsx(Fe, {})] - }) +Object.defineProperty(exports, "__esModule", ({ + value: true })); -Jt.displayName = "Dialog.Close"; -function Yt(_ref33) { - let { - children: e, - ...t - } = _ref33; - return r.jsx(re.Root, { - ...t, - children: r.jsxs(re.Portal, { - children: [r.jsx(re.Overlay, { - className: "graphiql-dialog-overlay" - }), r.jsx(re.Content, { - className: "graphiql-dialog", - children: e - })] - }) - }); +const clamp = (min, max) => v => Math.max(Math.min(v, max), min); +const sanitize = v => v % 1 ? Number(v.toFixed(5)) : v; +const floatRegex = /(-)?([\d]*\.?[\d])+/g; +const colorRegex = /(#[0-9a-f]{6}|#[0-9a-f]{3}|#(?:[0-9a-f]{2}){2,4}|(rgb|hsl)a?\((-?[\d\.]+%?[,\s]+){2,3}\s*\/*\s*[\d\.]+%?\))/gi; +const singleColorRegex = /^(#[0-9a-f]{3}|#(?:[0-9a-f]{2}){2,4}|(rgb|hsl)a?\((-?[\d\.]+%?[,\s]+){2,3}\s*\/*\s*[\d\.]+%?\))$/i; +function isString(v) { + return typeof v === 'string'; } -a(Yt, "DialogRoot"); -const wr = ye(Yt, { - Close: Jt, - Title: re.Title, - Trigger: re.Trigger, - Description: re.Description +const number = { + test: v => typeof v === 'number', + parse: parseFloat, + transform: v => v +}; +const alpha = Object.assign(Object.assign({}, number), { + transform: clamp(0, 1) }); -const Xt = l.forwardRef((e, t) => r.jsx(xe.Trigger, { - asChild: !0, - children: r.jsx("button", { - ...e, - ref: t, - className: _.clsx("graphiql-un-styled", e.className) - }) -})); -Xt.displayName = "DropdownMenuButton"; -function Er(_ref34) { - let { - children: e, - align: t = "start", - sideOffset: n = 5, - className: s, - ...o - } = _ref34; - return r.jsx(xe.Portal, { - children: r.jsx(xe.Content, { - align: t, - sideOffset: n, - className: _.clsx("graphiql-dropdown-content", s), - ...o, - children: e - }) - }); -} -a(Er, "Content"); -const Sr = a(_ref35 => { - let { - className: e, - children: t, - ...n - } = _ref35; - return r.jsx(xe.Item, { - className: _.clsx("graphiql-dropdown-item", e), - ...n, - children: t - }); - }, "Item"), - ee = ye(xe.Root, { - Button: Xt, - Item: Sr, - Content: Er - }), - Re = new Vn({ - breaks: !0, - linkify: !0 - }); -const K = l.forwardRef((_ref36, o) => { - let { - children: e, - onlyShowFirstChild: t, - type: n, - ...s - } = _ref36; - return r.jsx("div", { - ...s, - ref: o, - className: _.clsx(`graphiql-markdown-${n}`, t && "graphiql-markdown-preview", s.className), - dangerouslySetInnerHTML: { - __html: Re.render(e) - } - }); +const scale = Object.assign(Object.assign({}, number), { + default: 1 }); -K.displayName = "MarkdownContent"; -const st = l.forwardRef((e, t) => r.jsx("div", { - ...e, - ref: t, - className: _.clsx("graphiql-spinner", e.className) -})); -st.displayName = "Spinner"; -function en(_ref37) { - let { - children: e, - align: t = "start", - side: n = "bottom", - sideOffset: s = 5, - label: o - } = _ref37; - return r.jsxs(pe.Root, { - children: [r.jsx(pe.Trigger, { - asChild: !0, - children: e - }), r.jsx(pe.Portal, { - children: r.jsx(pe.Content, { - className: "graphiql-tooltip", - align: t, - side: n, - sideOffset: s, - children: o - }) - })] - }); -} -a(en, "TooltipRoot"); -const J = ye(en, { - Provider: pe.Provider +const createUnitType = unit => ({ + test: v => isString(v) && v.endsWith(unit) && v.split(' ').length === 1, + parse: parseFloat, + transform: v => `${v}${unit}` }); -const tn = l.forwardRef((_ref38, c) => { - let { - isActive: e, - value: t, - children: n, - className: s, - ...o - } = _ref38; - return r.jsx(Nt.Reorder.Item, { - ...o, - ref: c, - value: t, - "aria-selected": e ? "true" : void 0, - role: "tab", - className: _.clsx("graphiql-tab", e && "graphiql-tab-active", s), - children: n - }); +const degrees = createUnitType('deg'); +const percent = createUnitType('%'); +const px = createUnitType('px'); +const vh = createUnitType('vh'); +const vw = createUnitType('vw'); +const progressPercentage = Object.assign(Object.assign({}, percent), { + parse: v => percent.parse(v) / 100, + transform: v => percent.transform(v * 100) }); -tn.displayName = "Tab"; -const nn = l.forwardRef((e, t) => r.jsx(Q, { - ...e, - ref: t, - type: "button", - className: _.clsx("graphiql-tab-button", e.className), - children: e.children -})); -nn.displayName = "Tab.Button"; -const rn = l.forwardRef((e, t) => r.jsx(J, { - label: "Close Tab", - children: r.jsx(Q, { - "aria-label": "Close Tab", - ...e, - ref: t, - type: "button", - className: _.clsx("graphiql-tab-close", e.className), - children: r.jsx(Fe, {}) - }) -})); -rn.displayName = "Tab.Close"; -const Lr = ye(tn, { - Button: nn, - Close: rn - }), - sn = l.forwardRef((_ref39, c) => { - let { - values: e, - onReorder: t, - children: n, - className: s, - ...o - } = _ref39; - return r.jsx(Nt.Reorder.Group, { - ...o, - ref: c, - values: e, - onReorder: t, - axis: "x", - role: "tablist", - className: _.clsx("graphiql-tabs", s), - children: n - }); - }); -sn.displayName = "Tabs"; -const ot = le("HistoryContext"); -function on(e) { - var y; - const t = se(), - n = l.useRef(new B.HistoryStore(t || new B.StorageAPI(null), e.maxHistoryLength || jr)), - [s, o] = l.useState(((y = n.current) == null ? void 0 : y.queries) || []), - c = l.useCallback(h => { - var x; - (x = n.current) == null || x.updateHistory(h), o(n.current.queries); - }, []), - i = l.useCallback((h, x) => { - n.current.editLabel(h, x), o(n.current.queries); - }, []), - d = l.useCallback(h => { - n.current.toggleFavorite(h), o(n.current.queries); - }, []), - g = l.useCallback(h => h, []), - m = l.useCallback(function (h) { - let x = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : !1; - n.current.deleteHistory(h, x), o(n.current.queries); - }, []), - p = l.useMemo(() => ({ - addToHistory: c, - editLabel: i, - items: s, - toggleFavorite: d, - setActive: g, - deleteFromHistory: m - }), [c, i, s, d, g, m]); - return r.jsx(ot.Provider, { - value: p, - children: e.children - }); -} -a(on, "HistoryContextProvider"); -const be = ie(ot), - jr = 20; -function ln() { - const { - items: e, - deleteFromHistory: t - } = be({ - nonNull: !0 - }); - let n = e.slice().map((d, g) => ({ - ...d, - index: g - })).reverse(); - const s = n.filter(d => d.favorite); - s.length && (n = n.filter(d => !d.favorite)); - const [o, c] = l.useState(null); - l.useEffect(() => { - o && setTimeout(() => { - c(null); - }, 2e3); - }, [o]); - const i = l.useCallback(() => { - try { - for (const d of n) t(d, !0); - c("success"); - } catch { - c("error"); - } - }, [t, n]); - return r.jsxs("section", { - "aria-label": "History", - className: "graphiql-history", - children: [r.jsxs("div", { - className: "graphiql-history-header", - children: ["History", (o || n.length > 0) && r.jsx(me, { - type: "button", - state: o || void 0, - disabled: !n.length, - onClick: i, - children: { - success: "Cleared", - error: "Failed to Clear" - }[o] || "Clear" - })] - }), !!s.length && r.jsx("ul", { - className: "graphiql-history-items", - children: s.map(d => r.jsx(Pe, { - item: d - }, d.index)) - }), !!s.length && !!n.length && r.jsx("div", { - className: "graphiql-history-item-spacer" - }), !!n.length && r.jsx("ul", { - className: "graphiql-history-items", - children: n.map(d => r.jsx(Pe, { - item: d - }, d.index)) - })] - }); -} -a(ln, "History"); -function Pe(e) { - const { - editLabel: t, - toggleFavorite: n, - deleteFromHistory: s, - setActive: o - } = be({ - nonNull: !0, - caller: Pe - }), - { - headerEditor: c, - queryEditor: i, - variableEditor: d - } = Z({ - nonNull: !0, - caller: Pe - }), - g = l.useRef(null), - m = l.useRef(null), - [p, y] = l.useState(!1); - l.useEffect(() => { - var b; - p && ((b = g.current) == null || b.focus()); - }, [p]); - const h = e.item.label || e.item.operationName || kr(e.item.query), - x = l.useCallback(() => { - var T; - y(!1); - const { - index: b, - ...w - } = e.item; - t({ - ...w, - label: (T = g.current) == null ? void 0 : T.value - }, b); - }, [t, e.item]), - f = l.useCallback(() => { - y(!1); - }, []), - C = l.useCallback(b => { - b.stopPropagation(), y(!0); - }, []), - E = l.useCallback(() => { - const { - query: b, - variables: w, - headers: T - } = e.item; - i == null || i.setValue(b !== null && b !== void 0 ? b : ""), d == null || d.setValue(w !== null && w !== void 0 ? w : ""), c == null || c.setValue(T !== null && T !== void 0 ? T : ""), o(e.item); - }, [c, e.item, i, o, d]), - k = l.useCallback(b => { - b.stopPropagation(), s(e.item); - }, [e.item, s]), - L = l.useCallback(b => { - b.stopPropagation(), n(e.item); - }, [e.item, n]); - return r.jsx("li", { - className: _.clsx("graphiql-history-item", p && "editable"), - children: p ? r.jsxs(r.Fragment, { - children: [r.jsx("input", { - type: "text", - defaultValue: e.item.label, - ref: g, - onKeyDown: b => { - b.key === "Esc" ? y(!1) : b.key === "Enter" && (y(!1), t({ - ...e.item, - label: b.currentTarget.value - })); - }, - placeholder: "Type a label" - }), r.jsx(Q, { - type: "button", - ref: m, - onClick: x, - children: "Save" - }), r.jsx(Q, { - type: "button", - ref: m, - onClick: f, - children: r.jsx(Fe, {}) - })] - }) : r.jsxs(r.Fragment, { - children: [r.jsx(J, { - label: "Set active", - children: r.jsx(Q, { - type: "button", - className: "graphiql-history-item-label", - onClick: E, - "aria-label": "Set active", - children: h - }) - }), r.jsx(J, { - label: "Edit label", - children: r.jsx(Q, { - type: "button", - className: "graphiql-history-item-action", - onClick: C, - "aria-label": "Edit label", - children: r.jsx(_t, { - "aria-hidden": "true" - }) - }) - }), r.jsx(J, { - label: e.item.favorite ? "Remove favorite" : "Add favorite", - children: r.jsx(Q, { - type: "button", - className: "graphiql-history-item-action", - onClick: L, - "aria-label": e.item.favorite ? "Remove favorite" : "Add favorite", - children: e.item.favorite ? r.jsx(Gt, { - "aria-hidden": "true" - }) : r.jsx(Qt, { - "aria-hidden": "true" - }) - }) - }), r.jsx(J, { - label: "Delete from history", - children: r.jsx(Q, { - type: "button", - className: "graphiql-history-item-action", - onClick: k, - "aria-label": "Delete from history", - children: r.jsx(Ut, { - "aria-hidden": "true" - }) - }) - })] - }) - }); -} -a(Pe, "HistoryItem"); -function kr(e) { - return e == null ? void 0 : e.split(` -`).map(t => t.replace(/#(.*)/, "")).join(" ").replaceAll("{", " { ").replaceAll("}", " } ").replaceAll(/[\s]{2,}/g, " "); -} -a(kr, "formatQuery"); -const lt = le("ExecutionContext"); -function qe(_ref40) { - let { - fetcher: e, - getDefaultFieldNames: t, - children: n, - operationName: s - } = _ref40; - if (!e) throw new TypeError("The `ExecutionContextProvider` component requires a `fetcher` function to be passed as prop."); - const { - externalFragments: o, - headerEditor: c, - queryEditor: i, - responseEditor: d, - variableEditor: g, - updateActiveTabValues: m - } = Z({ - nonNull: !0, - caller: qe - }), - p = be(), - y = He({ - getDefaultFieldNames: t, - caller: qe - }), - [h, x] = l.useState(!1), - [f, C] = l.useState(null), - E = l.useRef(0), - k = l.useCallback(() => { - f == null || f.unsubscribe(), x(!1), C(null); - }, [f]), - L = l.useCallback(async () => { - var _ref41; - if (!i || !d) return; - if (f) { - k(); - return; - } - const T = a(N => { - d.setValue(N), m({ - response: N - }); - }, "setResponse"); - E.current += 1; - const A = E.current; - let F = y() || i.getValue(); - const I = g == null ? void 0 : g.getValue(); - let H; - try { - H = bt({ - json: I, - errorMessageParse: "Variables are invalid JSON", - errorMessageType: "Variables are not a JSON object." - }); - } catch (N) { - T(N instanceof Error ? N.message : `${N}`); - return; - } - const O = c == null ? void 0 : c.getValue(); - let D; - try { - D = bt({ - json: O, - errorMessageParse: "Headers are invalid JSON", - errorMessageType: "Headers are not a JSON object." - }); - } catch (N) { - T(N instanceof Error ? N.message : `${N}`); - return; - } - if (o) { - const N = i.documentAST ? kt.getFragmentDependenciesForAST(i.documentAST, o) : []; - N.length > 0 && (F += ` -` + N.map(P => M.print(P)).join(` -`)); - } - T(""), x(!0); - const q = (_ref41 = s !== null && s !== void 0 ? s : i.operationName) !== null && _ref41 !== void 0 ? _ref41 : void 0; - p == null || p.addToHistory({ - query: F, - variables: I, - headers: O, - operationName: q - }); - try { - var _D, _i$documentAST; - let N = { - data: {} - }; - const P = a(v => { - if (A !== E.current) return; - let j = Array.isArray(v) ? v : !1; - if (!j && typeof v == "object" && v !== null && "hasNext" in v && (j = [v]), j) { - const R = { - data: N.data - }, - $ = [...((N == null ? void 0 : N.errors) || []), ...j.flatMap(z => z.errors).filter(Boolean)]; - $.length && (R.errors = $); - for (const z of j) { - const { - path: vt, - data: Le, - errors: ms, - ...Nn - } = z; - if (vt) { - if (!Le) throw new Error(`Expected part to contain a data property, but got ${z}`); - Mn(R.data, vt, Le, { - merge: !0 - }); - } else Le && (R.data = Le); - N = { - ...R, - ...Nn - }; - } - x(!1), T(B.formatResult(N)); - } else { - const R = B.formatResult(v); - x(!1), T(R); - } - }, "handleResponse"), - S = e({ - query: F, - variables: H, - operationName: q - }, { - headers: (_D = D) !== null && _D !== void 0 ? _D : void 0, - documentAST: (_i$documentAST = i.documentAST) !== null && _i$documentAST !== void 0 ? _i$documentAST : void 0 - }), - W = await Promise.resolve(S); - if (B.isObservable(W)) C(W.subscribe({ - next(v) { - P(v); - }, - error(v) { - x(!1), v && T(B.formatError(v)), C(null); - }, - complete() { - x(!1), C(null); - } - }));else if (B.isAsyncIterable(W)) { - C({ - unsubscribe: () => { - var v, j; - return (j = (v = W[Symbol.asyncIterator]()).return) == null ? void 0 : j.call(v); - } - }); - for await (const v of W) P(v); - x(!1), C(null); - } else P(W); - } catch (N) { - x(!1), T(B.formatError(N)), C(null); - } - }, [y, o, e, c, p, s, i, d, k, f, m, g]), - b = !!f, - w = l.useMemo(() => ({ - isFetching: h, - isSubscribed: b, - operationName: s !== null && s !== void 0 ? s : null, - run: L, - stop: k - }), [h, b, s, L, k]); - return r.jsx(lt.Provider, { - value: w, - children: n - }); -} -a(qe, "ExecutionContextProvider"); -const we = ie(lt); -function bt(_ref42) { - let { - json: e, - errorMessageParse: t, - errorMessageType: n - } = _ref42; - let s; - try { - s = e && e.trim() !== "" ? JSON.parse(e) : void 0; - } catch (c) { - throw new Error(`${t}: ${c instanceof Error ? c.message : c}.`); - } - const o = typeof s == "object" && s !== null && !Array.isArray(s); - if (s !== void 0 && !o) throw new Error(n); - return s; -} -a(bt, "tryParseJsonObject"); -const Be = "graphiql", - We = "sublime"; -let an = !1; -typeof window == "object" && (an = window.navigator.platform.toLowerCase().indexOf("mac") === 0); -const _e = { - [an ? "Cmd-F" : "Ctrl-F"]: "findPersistent", - "Cmd-G": "findPersistent", - "Ctrl-G": "findPersistent", - "Ctrl-Left": "goSubwordLeft", - "Ctrl-Right": "goSubwordRight", - "Alt-Left": "goGroupLeft", - "Alt-Right": "goGroupRight" +const isColorString = (type, testProp) => v => { + return Boolean(isString(v) && singleColorRegex.test(v) && v.startsWith(type) || testProp && Object.prototype.hasOwnProperty.call(v, testProp)); }; -async function Ee(e, t) { - const n = await Promise.resolve().then(() => __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js")).then(s => s.codemirror).then(s => typeof s == "function" ? s : s.default); - return await Promise.all((t == null ? void 0 : t.useCommonAddons) === !1 ? e : [Promise.resolve().then(() => __webpack_require__(/*! ./show-hint.cjs.js */ "../../graphiql-react/dist/show-hint.cjs.js")).then(s => s.showHint), Promise.resolve().then(() => __webpack_require__(/*! ./matchbrackets.cjs.js */ "../../graphiql-react/dist/matchbrackets.cjs.js")).then(s => s.matchbrackets), Promise.resolve().then(() => __webpack_require__(/*! ./closebrackets.cjs.js */ "../../graphiql-react/dist/closebrackets.cjs.js")).then(s => s.closebrackets), Promise.resolve().then(() => __webpack_require__(/*! ./brace-fold.cjs.js */ "../../graphiql-react/dist/brace-fold.cjs.js")).then(s => s.braceFold), Promise.resolve().then(() => __webpack_require__(/*! ./foldgutter.cjs.js */ "../../graphiql-react/dist/foldgutter.cjs.js")).then(s => s.foldgutter), Promise.resolve().then(() => __webpack_require__(/*! ./lint.cjs.js */ "../../graphiql-react/dist/lint.cjs.js")).then(s => s.lint), Promise.resolve().then(() => __webpack_require__(/*! ./searchcursor.cjs.js */ "../../graphiql-react/dist/searchcursor.cjs.js")).then(s => s.searchcursor), Promise.resolve().then(() => __webpack_require__(/*! ./jump-to-line.cjs.js */ "../../graphiql-react/dist/jump-to-line.cjs.js")).then(s => s.jumpToLine), Promise.resolve().then(() => __webpack_require__(/*! ./dialog.cjs.js */ "../../graphiql-react/dist/dialog.cjs.js")).then(s => s.dialog), Promise.resolve().then(() => __webpack_require__(/*! ./sublime.cjs.js */ "../../graphiql-react/dist/sublime.cjs.js")).then(s => s.sublime), ...e]), n; -} -a(Ee, "importCodeMirror"); -const Nr = a(e => e ? M.print(e) : "", "printDefault"); -function it(_ref43) { - let { - field: e - } = _ref43; - if (!("defaultValue" in e) || e.defaultValue === void 0) return null; - const t = M.astFromValue(e.defaultValue, e.type); - return t ? r.jsxs(r.Fragment, { - children: [" = ", r.jsx("span", { - className: "graphiql-doc-explorer-default-value", - children: Nr(t) - })] - }) : null; -} -a(it, "DefaultValue"); -const at = le("SchemaContext"); -function ct(e) { - if (!e.fetcher) throw new TypeError("The `SchemaContextProvider` component requires a `fetcher` function to be passed as prop."); - const { - initialHeaders: t, - headerEditor: n - } = Z({ - nonNull: !0, - caller: ct - }), - [s, o] = l.useState(), - [c, i] = l.useState(!1), - [d, g] = l.useState(null), - m = l.useRef(0); - l.useEffect(() => { - o(M.isSchema(e.schema) || e.schema === null || e.schema === void 0 ? e.schema : void 0), m.current++; - }, [e.schema]); - const p = l.useRef(t); - l.useEffect(() => { - n && (p.current = n.getValue()); - }); - const { - introspectionQuery: y, - introspectionQueryName: h, - introspectionQuerySansSubscriptions: x - } = Tr({ - inputValueDeprecation: e.inputValueDeprecation, - introspectionQueryName: e.introspectionQueryName, - schemaDescription: e.schemaDescription - }), - { - fetcher: f, - onSchemaChange: C, - dangerouslyAssumeSchemaIsValid: E, - children: k - } = e, - L = l.useCallback(() => { - if (M.isSchema(e.schema) || e.schema === null) return; - const T = ++m.current, - A = e.schema; - async function F() { - if (A) return A; - const I = Mr(p.current); - if (!I.isValidJSON) { - g("Introspection failed as headers are invalid."); - return; - } - const H = I.headers ? { - headers: I.headers - } : {}, - O = B.fetcherReturnToPromise(f({ - query: y, - operationName: h - }, H)); - if (!B.isPromise(O)) { - g("Fetcher did not return a Promise for introspection."); - return; - } - i(!0), g(null); - let D = await O; - if (typeof D != "object" || D === null || !("data" in D)) { - const N = B.fetcherReturnToPromise(f({ - query: x, - operationName: h - }, H)); - if (!B.isPromise(N)) throw new Error("Fetcher did not return a Promise for introspection."); - D = await N; - } - if (i(!1), D != null && D.data && "__schema" in D.data) return D.data; - const q = typeof D == "string" ? D : B.formatResult(D); - g(q); - } - a(F, "fetchIntrospectionData"), F().then(I => { - if (!(T !== m.current || !I)) try { - const H = M.buildClientSchema(I); - o(H), C == null || C(H); - } catch (H) { - g(B.formatError(H)); - } - }).catch(I => { - T === m.current && (g(B.formatError(I)), i(!1)); - }); - }, [f, h, y, x, C, e.schema]); - l.useEffect(() => { - L(); - }, [L]), l.useEffect(() => { - function T(A) { - A.ctrlKey && A.key === "R" && L(); - } - return a(T, "triggerIntrospection"), window.addEventListener("keydown", T), () => window.removeEventListener("keydown", T); - }); - const b = l.useMemo(() => !s || E ? [] : M.validateSchema(s), [s, E]), - w = l.useMemo(() => ({ - fetchError: d, - introspect: L, - isFetching: c, - schema: s, - validationErrors: b - }), [d, L, c, s, b]); - return r.jsx(at.Provider, { - value: w, - children: k - }); -} -a(ct, "SchemaContextProvider"); -const X = ie(at); -function Tr(_ref44) { - let { - inputValueDeprecation: e, - introspectionQueryName: t, - schemaDescription: n - } = _ref44; - return l.useMemo(() => { - const s = t || "IntrospectionQuery"; - let o = M.getIntrospectionQuery({ - inputValueDeprecation: e, - schemaDescription: n - }); - t && (o = o.replace("query IntrospectionQuery", `query ${s}`)); - const c = o.replace("subscriptionType { name }", ""); - return { - introspectionQueryName: s, - introspectionQuery: o, - introspectionQuerySansSubscriptions: c - }; - }, [e, t, n]); -} -a(Tr, "useIntrospectionQuery"); -function Mr(e) { - let t = null, - n = !0; - try { - e && (t = JSON.parse(e)); - } catch { - n = !1; +const splitColor = (aName, bName, cName) => v => { + if (!isString(v)) return v; + const [a, b, c, alpha] = v.match(floatRegex); + return { + [aName]: parseFloat(a), + [bName]: parseFloat(b), + [cName]: parseFloat(c), + alpha: alpha !== undefined ? parseFloat(alpha) : 1 + }; +}; +const hsla = { + test: isColorString('hsl', 'hue'), + parse: splitColor('hue', 'saturation', 'lightness'), + transform: ({ + hue, + saturation, + lightness, + alpha: alpha$1 = 1 + }) => { + return 'hsla(' + Math.round(hue) + ', ' + percent.transform(sanitize(saturation)) + ', ' + percent.transform(sanitize(lightness)) + ', ' + sanitize(alpha.transform(alpha$1)) + ')'; + } +}; +const clampRgbUnit = clamp(0, 255); +const rgbUnit = Object.assign(Object.assign({}, number), { + transform: v => Math.round(clampRgbUnit(v)) +}); +const rgba = { + test: isColorString('rgb', 'red'), + parse: splitColor('red', 'green', 'blue'), + transform: ({ + red, + green, + blue, + alpha: alpha$1 = 1 + }) => 'rgba(' + rgbUnit.transform(red) + ', ' + rgbUnit.transform(green) + ', ' + rgbUnit.transform(blue) + ', ' + sanitize(alpha.transform(alpha$1)) + ')' +}; +function parseHex(v) { + let r = ''; + let g = ''; + let b = ''; + let a = ''; + if (v.length > 5) { + r = v.substr(1, 2); + g = v.substr(3, 2); + b = v.substr(5, 2); + a = v.substr(7, 2); + } else { + r = v.substr(1, 1); + g = v.substr(2, 1); + b = v.substr(3, 1); + a = v.substr(4, 1); + r += r; + g += g; + b += b; + a += a; } return { - headers: t, - isValidJSON: n + red: parseInt(r, 16), + green: parseInt(g, 16), + blue: parseInt(b, 16), + alpha: a ? parseInt(a, 16) / 255 : 1 }; } -a(Mr, "parseHeaderString"); -const je = { - name: "Docs" +const hex = { + test: isColorString('#'), + parse: parseHex, + transform: rgba.transform +}; +const color = { + test: v => rgba.test(v) || hex.test(v) || hsla.test(v), + parse: v => { + if (rgba.test(v)) { + return rgba.parse(v); + } else if (hsla.test(v)) { + return hsla.parse(v); + } else { + return hex.parse(v); + } }, - ut = le("ExplorerContext"); -function dt(e) { - const { - schema: t, - validationErrors: n - } = X({ - nonNull: !0, - caller: dt - }), - [s, o] = l.useState([je]), - c = l.useCallback(m => { - o(p => p.at(-1).def === m.def ? p : [...p, m]); - }, []), - i = l.useCallback(() => { - o(m => m.length > 1 ? m.slice(0, -1) : m); - }, []), - d = l.useCallback(() => { - o(m => m.length === 1 ? m : [je]); - }, []); - l.useEffect(() => { - t == null || n.length > 0 ? d() : o(m => { - if (m.length === 1) return m; - const p = [je]; - let y = null; - for (const h of m) if (h !== je) if (h.def) { - if (M.isNamedType(h.def)) { - const x = t.getType(h.def.name); - if (x) p.push({ - name: h.name, - def: x - }), y = x;else break; - } else { - if (y === null) break; - if (M.isObjectType(y) || M.isInputObjectType(y)) { - const x = y.getFields()[h.name]; - if (x) p.push({ - name: h.name, - def: x - });else break; - } else { - if (M.isScalarType(y) || M.isEnumType(y) || M.isInterfaceType(y) || M.isUnionType(y)) break; - { - const x = y; - if (x.args.find(C => C.name === h.name)) p.push({ - name: h.name, - def: x - });else break; - } - } - } - } else y = null, p.push(h); - return p; - }); - }, [d, t, n]); - const g = l.useMemo(() => ({ - explorerNavStack: s, - push: c, - pop: i, - reset: d - }), [s, c, i, d]); - return r.jsx(ut.Provider, { - value: g, - children: e.children - }); -} -a(dt, "ExplorerContextProvider"); -const te = ie(ut); -function Ve(e, t) { - return M.isNonNullType(e) ? r.jsxs(r.Fragment, { - children: [Ve(e.ofType, t), "!"] - }) : M.isListType(e) ? r.jsxs(r.Fragment, { - children: ["[", Ve(e.ofType, t), "]"] - }) : t(e); -} -a(Ve, "renderType"); -function U(e) { - const { - push: t - } = te({ - nonNull: !0, - caller: U - }); - return e.type ? Ve(e.type, n => r.jsx("a", { - className: "graphiql-doc-explorer-type-name", - onClick: s => { - s.preventDefault(), t({ - name: n.name, - def: n - }); - }, - href: "#", - children: n.name - })) : null; -} -a(U, "TypeLink"); -function Ce(_ref45) { - let { - arg: e, - showDefaultValue: t, - inline: n - } = _ref45; - const s = r.jsxs("span", { - children: [r.jsx("span", { - className: "graphiql-doc-explorer-argument-name", - children: e.name - }), ": ", r.jsx(U, { - type: e.type - }), t !== !1 && r.jsx(it, { - field: e - })] - }); - return n ? s : r.jsxs("div", { - className: "graphiql-doc-explorer-argument", - children: [s, e.description ? r.jsx(K, { - type: "description", - children: e.description - }) : null, e.deprecationReason ? r.jsxs("div", { - className: "graphiql-doc-explorer-argument-deprecation", - children: [r.jsx("div", { - className: "graphiql-doc-explorer-argument-deprecation-label", - children: "Deprecated" - }), r.jsx(K, { - type: "deprecation", - children: e.deprecationReason - })] - }) : null] - }); -} -a(Ce, "Argument"); -function ht(e) { - var _e$preview; - return e.children ? r.jsxs("div", { - className: "graphiql-doc-explorer-deprecation", - children: [r.jsx("div", { - className: "graphiql-doc-explorer-deprecation-label", - children: "Deprecated" - }), r.jsx(K, { - type: "deprecation", - onlyShowFirstChild: (_e$preview = e.preview) !== null && _e$preview !== void 0 ? _e$preview : !0, - children: e.children - })] - }) : null; -} -a(ht, "DeprecationReason"); -function cn(_ref46) { - let { - directive: e - } = _ref46; - return r.jsxs("span", { - className: "graphiql-doc-explorer-directive", - children: ["@", e.name.value] - }); -} -a(cn, "Directive"); -function G(e) { - const t = Rr[e.title]; - return r.jsxs("div", { - children: [r.jsxs("div", { - className: "graphiql-doc-explorer-section-title", - children: [r.jsx(t, {}), e.title] - }), r.jsx("div", { - className: "graphiql-doc-explorer-section-content", - children: e.children - })] - }); -} -a(G, "ExplorerSection"); -const Rr = { - Arguments: Mt, - "Deprecated Arguments": Pt, - "Deprecated Enum Values": qt, - "Deprecated Fields": Vt, - Directives: It, - "Enum Values": At, - Fields: Ot, - Implements: Bt, - Implementations: ge, - "Possible Types": ge, - "Root Types": $t, - Type: ge, - "All Schema Types": ge + transform: v => { + return isString(v) ? v : v.hasOwnProperty('red') ? rgba.transform(v) : hsla.transform(v); + } }; -function un(e) { - return r.jsxs(r.Fragment, { - children: [e.field.description ? r.jsx(K, { - type: "description", - children: e.field.description - }) : null, r.jsx(ht, { - preview: !1, - children: e.field.deprecationReason - }), r.jsx(G, { - title: "Type", - children: r.jsx(U, { - type: e.field.type - }) - }), r.jsx(Pr, { - field: e.field - }), r.jsx(qr, { - field: e.field - })] - }); -} -a(un, "FieldDocumentation"); -function Pr(_ref47) { - let { - field: e - } = _ref47; - const [t, n] = l.useState(!1), - s = l.useCallback(() => { - n(!0); - }, []); - if (!("args" in e)) return null; - const o = [], - c = []; - for (const i of e.args) i.deprecationReason ? c.push(i) : o.push(i); - return r.jsxs(r.Fragment, { - children: [o.length > 0 ? r.jsx(G, { - title: "Arguments", - children: o.map(i => r.jsx(Ce, { - arg: i - }, i.name)) - }) : null, c.length > 0 ? t || o.length === 0 ? r.jsx(G, { - title: "Deprecated Arguments", - children: c.map(i => r.jsx(Ce, { - arg: i - }, i.name)) - }) : r.jsx(me, { - type: "button", - onClick: s, - children: "Show Deprecated Arguments" - }) : null] - }); +const colorToken = '${c}'; +const numberToken = '${n}'; +function test(v) { + var _a, _b, _c, _d; + return isNaN(v) && isString(v) && ((_b = (_a = v.match(floatRegex)) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) + ((_d = (_c = v.match(colorRegex)) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0) > 0; } -a(Pr, "Arguments"); -function qr(_ref48) { - let { - field: e - } = _ref48; - var n; - const t = ((n = e.astNode) == null ? void 0 : n.directives) || []; - return !t || t.length === 0 ? null : r.jsx(G, { - title: "Directives", - children: t.map(s => r.jsx("div", { - children: r.jsx(cn, { - directive: s - }) - }, s.name.value)) - }); +function analyse(v) { + if (typeof v === 'number') v = `${v}`; + const values = []; + let numColors = 0; + const colors = v.match(colorRegex); + if (colors) { + numColors = colors.length; + v = v.replace(colorRegex, colorToken); + values.push(...colors.map(color.parse)); + } + const numbers = v.match(floatRegex); + if (numbers) { + v = v.replace(floatRegex, numberToken); + values.push(...numbers.map(number.parse)); + } + return { + values, + numColors, + tokenised: v + }; } -a(qr, "Directives"); -function dn(e) { - var i, d, g, m; - const t = e.schema.getQueryType(), - n = (d = (i = e.schema).getMutationType) == null ? void 0 : d.call(i), - s = (m = (g = e.schema).getSubscriptionType) == null ? void 0 : m.call(g), - o = e.schema.getTypeMap(), - c = [t == null ? void 0 : t.name, n == null ? void 0 : n.name, s == null ? void 0 : s.name]; - return r.jsxs(r.Fragment, { - children: [r.jsx(K, { - type: "description", - children: e.schema.description || "A GraphQL schema provides a root type for each kind of operation." - }), r.jsxs(G, { - title: "Root Types", - children: [t ? r.jsxs("div", { - children: [r.jsx("span", { - className: "graphiql-doc-explorer-root-type", - children: "query" - }), ": ", r.jsx(U, { - type: t - })] - }) : null, n && r.jsxs("div", { - children: [r.jsx("span", { - className: "graphiql-doc-explorer-root-type", - children: "mutation" - }), ": ", r.jsx(U, { - type: n - })] - }), s && r.jsxs("div", { - children: [r.jsx("span", { - className: "graphiql-doc-explorer-root-type", - children: "subscription" - }), ": ", r.jsx(U, { - type: s - })] - })] - }), r.jsx(G, { - title: "All Schema Types", - children: o && r.jsx("div", { - children: Object.values(o).map(p => c.includes(p.name) || p.name.startsWith("__") ? null : r.jsx("div", { - children: r.jsx(U, { - type: p - }) - }, p.name)) - }) - })] - }); +function parse(v) { + return analyse(v).values; } -a(dn, "SchemaDocumentation"); -function ue(e, t) { - let n; - return function () { - for (var _len = arguments.length, s = new Array(_len), _key = 0; _key < _len; _key++) { - s[_key] = arguments[_key]; +function createTransformer(v) { + const { + values, + numColors, + tokenised + } = analyse(v); + const numValues = values.length; + return v => { + let output = tokenised; + for (let i = 0; i < numValues; i++) { + output = output.replace(i < numColors ? colorToken : numberToken, i < numColors ? color.transform(v[i]) : sanitize(v[i])); } - n && window.clearTimeout(n), n = window.setTimeout(() => { - n = null, t(...s); - }, e); + return output; }; } -a(ue, "debounce"); -function mt() { - const { - explorerNavStack: e, - push: t - } = te({ - nonNull: !0, - caller: mt - }), - n = l.useRef(null), - s = Ke(), - [o, c] = l.useState(""), - [i, d] = l.useState(s(o)), - g = l.useMemo(() => ue(200, f => { - d(s(f)); - }), [s]); - l.useEffect(() => { - g(o); - }, [g, o]), l.useEffect(() => { - function f(C) { - var E; - C.metaKey && C.key === "k" && ((E = n.current) == null || E.focus()); - } - return a(f, "handleKeyDown"), window.addEventListener("keydown", f), () => window.removeEventListener("keydown", f); - }, []); - const m = e.at(-1), - p = l.useCallback(f => { - t("field" in f ? { - name: f.field.name, - def: f.field - } : { - name: f.type.name, - def: f.type - }); - }, [t]), - y = l.useRef(!1), - h = l.useCallback(f => { - y.current = f.type === "focus"; - }, []); - return e.length === 1 || M.isObjectType(m.def) || M.isInterfaceType(m.def) || M.isInputObjectType(m.def) ? r.jsxs(ae.Combobox, { - as: "div", - className: "graphiql-doc-explorer-search", - onChange: p, - "data-state": y ? void 0 : "idle", - "aria-label": `Search ${m.name}...`, - children: [r.jsxs("div", { - className: "graphiql-doc-explorer-search-input", - onClick: () => { - var f; - (f = n.current) == null || f.focus(); - }, - children: [r.jsx(Wt, {}), r.jsx(ae.Combobox.Input, { - autoComplete: "off", - onFocus: h, - onBlur: h, - onChange: f => c(f.target.value), - placeholder: "⌘ K", - ref: n, - value: o, - "data-cy": "doc-explorer-input" - })] - }), y.current && r.jsxs(ae.Combobox.Options, { - "data-cy": "doc-explorer-list", - children: [i.within.length + i.types.length + i.fields.length === 0 ? r.jsx("li", { - className: "graphiql-doc-explorer-search-empty", - children: "No results found" - }) : i.within.map((f, C) => r.jsx(ae.Combobox.Option, { - value: f, - "data-cy": "doc-explorer-option", - children: r.jsx(wt, { - field: f.field, - argument: f.argument - }) - }, `within-${C}`)), i.within.length > 0 && i.types.length + i.fields.length > 0 ? r.jsx("div", { - className: "graphiql-doc-explorer-search-divider", - children: "Other results" - }) : null, i.types.map((f, C) => r.jsx(ae.Combobox.Option, { - value: f, - "data-cy": "doc-explorer-option", - children: r.jsx(Je, { - type: f.type - }) - }, `type-${C}`)), i.fields.map((f, C) => r.jsxs(ae.Combobox.Option, { - value: f, - "data-cy": "doc-explorer-option", - children: [r.jsx(Je, { - type: f.type - }), ".", r.jsx(wt, { - field: f.field, - argument: f.argument - })] - }, `field-${C}`))] - })] - }) : null; +const convertNumbersToZero = v => typeof v === 'number' ? 0 : v; +function getAnimatableNone(v) { + const parsed = parse(v); + const transformer = createTransformer(v); + return transformer(parsed.map(convertNumbersToZero)); } -a(mt, "Search"); -function Ke(e) { - const { - explorerNavStack: t - } = te({ - nonNull: !0, - caller: e || Ke - }), - { - schema: n - } = X({ - nonNull: !0, - caller: e || Ke - }), - s = t.at(-1); - return l.useCallback(o => { - const c = { - within: [], - types: [], - fields: [] - }; - if (!n) return c; - const i = s.def, - d = n.getTypeMap(); - let g = Object.keys(d); - i && (g = g.filter(m => m !== i.name), g.unshift(i.name)); - for (const m of g) { - if (c.within.length + c.types.length + c.fields.length >= 100) break; - const p = d[m]; - if (i !== p && Qe(m, o) && c.types.push({ - type: p - }), !M.isObjectType(p) && !M.isInterfaceType(p) && !M.isInputObjectType(p)) continue; - const y = p.getFields(); - for (const h in y) { - const x = y[h]; - let f; - if (!Qe(h, o)) if ("args" in x) { - if (f = x.args.filter(C => Qe(C.name, o)), f.length === 0) continue; - } else continue; - c[i === p ? "within" : "fields"].push(...(f ? f.map(C => ({ - type: p, - field: x, - argument: C - })) : [{ - type: p, - field: x - }])); - } - } - return c; - }, [s.def, n]); +const complex = { + test, + parse, + createTransformer, + getAnimatableNone +}; +const maxDefaults = new Set(['brightness', 'contrast', 'saturate', 'opacity']); +function applyDefaultFilter(v) { + let [name, value] = v.slice(0, -1).split('('); + if (name === 'drop-shadow') return v; + const [number] = value.match(floatRegex) || []; + if (!number) return v; + const unit = value.replace(number, ''); + let defaultValue = maxDefaults.has(name) ? 1 : 0; + if (number !== value) defaultValue *= 100; + return name + '(' + defaultValue + unit + ')'; } -a(Ke, "useSearchResults"); -function Qe(e, t) { - try { - const n = t.replaceAll(/[^_0-9A-Za-z]/g, s => "\\" + s); - return e.search(new RegExp(n, "i")) !== -1; - } catch { - return e.toLowerCase().includes(t.toLowerCase()); +const functionRegex = /([a-z-]*)\(.*?\)/g; +const filter = Object.assign(Object.assign({}, complex), { + getAnimatableNone: v => { + const functions = v.match(functionRegex); + return functions ? functions.map(applyDefaultFilter).join(' ') : v; } -} -a(Qe, "isMatch"); -function Je(e) { - return r.jsx("span", { - className: "graphiql-doc-explorer-search-type", - children: e.type.name - }); -} -a(Je, "Type"); -function wt(_ref49) { - let { - field: e, - argument: t - } = _ref49; - return r.jsxs(r.Fragment, { - children: [r.jsx("span", { - className: "graphiql-doc-explorer-search-field", - children: e.name - }), t ? r.jsxs(r.Fragment, { - children: ["(", r.jsx("span", { - className: "graphiql-doc-explorer-search-argument", - children: t.name - }), ":", " ", Ve(t.type, n => r.jsx(Je, { - type: n - })), ")"] - }) : null] - }); -} -a(wt, "Field$1"); -function hn(e) { - const { - push: t - } = te({ - nonNull: !0 - }); - return r.jsx("a", { - className: "graphiql-doc-explorer-field-name", - onClick: n => { - n.preventDefault(), t({ - name: e.field.name, - def: e.field +}); +exports.alpha = alpha; +exports.color = color; +exports.complex = complex; +exports.degrees = degrees; +exports.filter = filter; +exports.hex = hex; +exports.hsla = hsla; +exports.number = number; +exports.percent = percent; +exports.progressPercentage = progressPercentage; +exports.px = px; +exports.rgbUnit = rgbUnit; +exports.rgba = rgba; +exports.scale = scale; +exports.vh = vh; +exports.vw = vw; + +/***/ }), + +/***/ "../../../node_modules/toggle-selection/index.js": +/*!*******************************************************!*\ + !*** ../../../node_modules/toggle-selection/index.js ***! + \*******************************************************/ +/***/ (function(module) { + + + +module.exports = function () { + var selection = document.getSelection(); + if (!selection.rangeCount) { + return function () {}; + } + var active = document.activeElement; + var ranges = []; + for (var i = 0; i < selection.rangeCount; i++) { + ranges.push(selection.getRangeAt(i)); + } + switch (active.tagName.toUpperCase()) { + // .toUpperCase handles XHTML + case 'INPUT': + case 'TEXTAREA': + active.blur(); + break; + default: + active = null; + break; + } + selection.removeAllRanges(); + return function () { + selection.type === 'Caret' && selection.removeAllRanges(); + if (!selection.rangeCount) { + ranges.forEach(function (range) { + selection.addRange(range); }); - }, - href: "#", - children: e.field.name - }); -} -a(hn, "FieldLink"); -function mn(e) { - return M.isNamedType(e.type) ? r.jsxs(r.Fragment, { - children: [e.type.description ? r.jsx(K, { - type: "description", - children: e.type.description - }) : null, r.jsx(Vr, { - type: e.type - }), r.jsx(Ir, { - type: e.type - }), r.jsx(Hr, { - type: e.type - }), r.jsx(Dr, { - type: e.type - })] - }) : null; -} -a(mn, "TypeDocumentation"); -function Vr(_ref50) { - let { - type: e - } = _ref50; - return M.isObjectType(e) && e.getInterfaces().length > 0 ? r.jsx(G, { - title: "Implements", - children: e.getInterfaces().map(n => r.jsx("div", { - children: r.jsx(U, { - type: n - }) - }, n.name)) - }) : null; -} -a(Vr, "ImplementsInterfaces"); -function Ir(_ref51) { - let { - type: e - } = _ref51; - const [t, n] = l.useState(!1), - s = l.useCallback(() => { - n(!0); - }, []); - if (!M.isObjectType(e) && !M.isInterfaceType(e) && !M.isInputObjectType(e)) return null; - const o = e.getFields(), - c = [], - i = []; - for (const d of Object.keys(o).map(g => o[g])) d.deprecationReason ? i.push(d) : c.push(d); - return r.jsxs(r.Fragment, { - children: [c.length > 0 ? r.jsx(G, { - title: "Fields", - children: c.map(d => r.jsx(Et, { - field: d - }, d.name)) - }) : null, i.length > 0 ? t || c.length === 0 ? r.jsx(G, { - title: "Deprecated Fields", - children: i.map(d => r.jsx(Et, { - field: d - }, d.name)) - }) : r.jsx(me, { - type: "button", - onClick: s, - children: "Show Deprecated Fields" - }) : null] - }); + } + active && active.focus(); + }; +}; + +/***/ }), + +/***/ "../../../node_modules/tslib/tslib.es6.mjs": +/*!*************************************************!*\ + !*** ../../../node_modules/tslib/tslib.es6.mjs ***! + \*************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.__addDisposableResource = __addDisposableResource; +exports.__assign = void 0; +exports.__asyncDelegator = __asyncDelegator; +exports.__asyncGenerator = __asyncGenerator; +exports.__asyncValues = __asyncValues; +exports.__await = __await; +exports.__awaiter = __awaiter; +exports.__classPrivateFieldGet = __classPrivateFieldGet; +exports.__classPrivateFieldIn = __classPrivateFieldIn; +exports.__classPrivateFieldSet = __classPrivateFieldSet; +exports.__createBinding = void 0; +exports.__decorate = __decorate; +exports.__disposeResources = __disposeResources; +exports.__esDecorate = __esDecorate; +exports.__exportStar = __exportStar; +exports.__extends = __extends; +exports.__generator = __generator; +exports.__importDefault = __importDefault; +exports.__importStar = __importStar; +exports.__makeTemplateObject = __makeTemplateObject; +exports.__metadata = __metadata; +exports.__param = __param; +exports.__propKey = __propKey; +exports.__read = __read; +exports.__rest = __rest; +exports.__runInitializers = __runInitializers; +exports.__setFunctionName = __setFunctionName; +exports.__spread = __spread; +exports.__spreadArray = __spreadArray; +exports.__spreadArrays = __spreadArrays; +exports.__values = __values; +exports["default"] = void 0; +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise, SuppressedError, Symbol */ + +var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || { + __proto__: [] + } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; + }; + return extendStatics(d, b); +}; +function __extends(d, b) { + if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { + this.constructor = d; + } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); } -a(Ir, "Fields"); -function Et(_ref52) { - let { - field: e - } = _ref52; - const t = "args" in e ? e.args.filter(n => !n.deprecationReason) : []; - return r.jsxs("div", { - className: "graphiql-doc-explorer-item", - children: [r.jsxs("div", { - children: [r.jsx(hn, { - field: e - }), t.length > 0 ? r.jsxs(r.Fragment, { - children: ["(", r.jsx("span", { - children: t.map(n => t.length === 1 ? r.jsx(Ce, { - arg: n, - inline: !0 - }, n.name) : r.jsx("div", { - className: "graphiql-doc-explorer-argument-multiple", - children: r.jsx(Ce, { - arg: n, - inline: !0 - }) - }, n.name)) - }), ")"] - }) : null, ": ", r.jsx(U, { - type: e.type - }), r.jsx(it, { - field: e - })] - }), e.description ? r.jsx(K, { - type: "description", - onlyShowFirstChild: !0, - children: e.description - }) : null, r.jsx(ht, { - children: e.deprecationReason - })] - }); +var __assign = function () { + exports.__assign = __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +exports.__assign = __assign; +function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; + } + return t; } -a(Et, "Field"); -function Hr(_ref53) { - let { - type: e - } = _ref53; - const [t, n] = l.useState(!1), - s = l.useCallback(() => { - n(!0); - }, []); - if (!M.isEnumType(e)) return null; - const o = [], - c = []; - for (const i of e.getValues()) i.deprecationReason ? c.push(i) : o.push(i); - return r.jsxs(r.Fragment, { - children: [o.length > 0 ? r.jsx(G, { - title: "Enum Values", - children: o.map(i => r.jsx(St, { - value: i - }, i.name)) - }) : null, c.length > 0 ? t || o.length === 0 ? r.jsx(G, { - title: "Deprecated Enum Values", - children: c.map(i => r.jsx(St, { - value: i - }, i.name)) - }) : r.jsx(me, { - type: "button", - onClick: s, - children: "Show Deprecated Values" - }) : null] - }); +function __decorate(decorators, target, key, desc) { + var c = arguments.length, + r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, + d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; } -a(Hr, "EnumValues"); -function St(_ref54) { - let { - value: e - } = _ref54; - return r.jsxs("div", { - className: "graphiql-doc-explorer-item", - children: [r.jsx("div", { - className: "graphiql-doc-explorer-enum-value", - children: e.name - }), e.description ? r.jsx(K, { - type: "description", - children: e.description - }) : null, e.deprecationReason ? r.jsx(K, { - type: "deprecation", - children: e.deprecationReason - }) : null] - }); +function __param(paramIndex, decorator) { + return function (target, key) { + decorator(target, key, paramIndex); + }; } -a(St, "EnumValue"); -function Dr(_ref55) { - let { - type: e - } = _ref55; - const { - schema: t - } = X({ - nonNull: !0 - }); - return !t || !M.isAbstractType(e) ? null : r.jsx(G, { - title: M.isInterfaceType(e) ? "Implementations" : "Possible Types", - children: t.getPossibleTypes(e).map(n => r.jsx("div", { - children: r.jsx(U, { - type: n - }) - }, n.name)) - }); +function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { + function accept(f) { + if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); + return f; + } + var kind = contextIn.kind, + key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; + var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; + var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); + var _, + done = false; + for (var i = decorators.length - 1; i >= 0; i--) { + var context = {}; + for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; + for (var p in contextIn.access) context.access[p] = contextIn.access[p]; + context.addInitializer = function (f) { + if (done) throw new TypeError("Cannot add initializers after decoration has completed"); + extraInitializers.push(accept(f || null)); + }; + var result = (0, decorators[i])(kind === "accessor" ? { + get: descriptor.get, + set: descriptor.set + } : descriptor[key], context); + if (kind === "accessor") { + if (result === void 0) continue; + if (result === null || typeof result !== "object") throw new TypeError("Object expected"); + if (_ = accept(result.get)) descriptor.get = _; + if (_ = accept(result.set)) descriptor.set = _; + if (_ = accept(result.init)) initializers.unshift(_); + } else if (_ = accept(result)) { + if (kind === "field") initializers.unshift(_);else descriptor[key] = _; + } + } + if (target) Object.defineProperty(target, contextIn.name, descriptor); + done = true; } -a(Dr, "PossibleTypes"); -function Ie() { - const { - fetchError: e, - isFetching: t, - schema: n, - validationErrors: s - } = X({ - nonNull: !0, - caller: Ie - }), - { - explorerNavStack: o, - pop: c - } = te({ - nonNull: !0, - caller: Ie - }), - i = o.at(-1); - let d = null; - e ? d = r.jsx("div", { - className: "graphiql-doc-explorer-error", - children: "Error fetching schema" - }) : s.length > 0 ? d = r.jsxs("div", { - className: "graphiql-doc-explorer-error", - children: ["Schema is invalid: ", s[0].message] - }) : t ? d = r.jsx(st, {}) : n ? o.length === 1 ? d = r.jsx(dn, { - schema: n - }) : M.isType(i.def) ? d = r.jsx(mn, { - type: i.def - }) : i.def && (d = r.jsx(un, { - field: i.def - })) : d = r.jsx("div", { - className: "graphiql-doc-explorer-error", - children: "No GraphQL schema available" - }); - let g; - return o.length > 1 && (g = o.at(-2).name), r.jsxs("section", { - className: "graphiql-doc-explorer", - "aria-label": "Documentation Explorer", - children: [r.jsxs("div", { - className: "graphiql-doc-explorer-header", - children: [r.jsxs("div", { - className: "graphiql-doc-explorer-header-content", - children: [g && r.jsxs("a", { - href: "#", - className: "graphiql-doc-explorer-back", - onClick: m => { - m.preventDefault(), c(); - }, - "aria-label": `Go back to ${g}`, - children: [r.jsx(Rt, {}), g] - }), r.jsx("div", { - className: "graphiql-doc-explorer-title", - children: i.name - })] - }), r.jsx(mt, {}, i.name)] - }), r.jsx("div", { - className: "graphiql-doc-explorer-content", - children: d - })] - }); +; +function __runInitializers(thisArg, initializers, value) { + var useValue = arguments.length > 2; + for (var i = 0; i < initializers.length; i++) { + value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); + } + return useValue ? value : void 0; } -a(Ie, "DocExplorer"); -const de = { - title: "Documentation Explorer", - icon: a(function () { - const t = Ze(); - return (t == null ? void 0 : t.visiblePlugin) === de ? r.jsx(Ht, {}) : r.jsx(Dt, {}); - }, "Icon"), - content: Ie - }, - Ye = { - title: "History", - icon: Ft, - content: ln - }, - ft = le("PluginContext"); -function fn(e) { - const t = se(), - n = te(), - s = be(), - o = !!n, - c = !!s, - i = l.useMemo(() => { - const x = [], - f = {}; - o && (x.push(de), f[de.title] = !0), c && (x.push(Ye), f[Ye.title] = !0); - for (const C of e.plugins || []) { - if (typeof C.title != "string" || !C.title) throw new Error("All GraphiQL plugins must have a unique title"); - if (f[C.title]) throw new Error(`All GraphiQL plugins must have a unique title, found two plugins with the title '${C.title}'`); - x.push(C), f[C.title] = !0; - } - return x; - }, [o, c, e.plugins]), - [d, g] = l.useState(() => { - const x = t == null ? void 0 : t.get(Lt), - f = i.find(C => C.title === x); - return f || (x && (t == null || t.set(Lt, "")), e.visiblePlugin && i.find(C => (typeof e.visiblePlugin == "string" ? C.title : C) === e.visiblePlugin) || null); - }), - { - onTogglePluginVisibility: m, - children: p - } = e, - y = l.useCallback(x => { - const f = x && i.find(C => (typeof x == "string" ? C.title : C) === x) || null; - g(C => f === C ? C : (m == null || m(f), f)); - }, [m, i]); - l.useEffect(() => { - e.visiblePlugin && y(e.visiblePlugin); - }, [i, e.visiblePlugin, y]); - const h = l.useMemo(() => ({ - plugins: i, - setVisiblePlugin: y, - visiblePlugin: d - }), [i, y, d]); - return r.jsx(ft.Provider, { - value: h, - children: p - }); +; +function __propKey(x) { + return typeof x === "symbol" ? x : "".concat(x); } -a(fn, "PluginContextProvider"); -const Ze = ie(ft), - Lt = "visiblePlugin"; -function Ar(e, t, n, s, o, c) { - Ee([], { - useCommonAddons: !1 - }).then(d => { - let g, m, p, y, h, x, f, C, E; - d.on(t, "select", (k, L) => { - if (!g) { - const b = L.parentNode; - g = document.createElement("div"), g.className = "CodeMirror-hint-information", b.append(g); - const w = document.createElement("header"); - w.className = "CodeMirror-hint-information-header", g.append(w), m = document.createElement("span"), m.className = "CodeMirror-hint-information-field-name", w.append(m), p = document.createElement("span"), p.className = "CodeMirror-hint-information-type-name-pill", w.append(p), y = document.createElement("span"), p.append(y), h = document.createElement("a"), h.className = "CodeMirror-hint-information-type-name", h.href = "javascript:void 0", h.addEventListener("click", i), p.append(h), x = document.createElement("span"), p.append(x), f = document.createElement("div"), f.className = "CodeMirror-hint-information-description", g.append(f), C = document.createElement("div"), C.className = "CodeMirror-hint-information-deprecation", g.append(C); - const T = document.createElement("span"); - T.className = "CodeMirror-hint-information-deprecation-label", T.textContent = "Deprecated", C.append(T), E = document.createElement("div"), E.className = "CodeMirror-hint-information-deprecation-reason", C.append(E); - const A = parseInt(window.getComputedStyle(g).paddingBottom.replace(/px$/, ""), 10) || 0, - F = parseInt(window.getComputedStyle(g).maxHeight.replace(/px$/, ""), 10) || 0, - I = a(() => { - g && (g.style.paddingTop = b.scrollTop + A + "px", g.style.maxHeight = b.scrollTop + F + "px"); - }, "handleScroll"); - b.addEventListener("scroll", I); - let H; - b.addEventListener("DOMNodeRemoved", H = a(O => { - O.target === b && (b.removeEventListener("scroll", I), b.removeEventListener("DOMNodeRemoved", H), g && g.removeEventListener("click", i), g = null, m = null, p = null, y = null, h = null, x = null, f = null, C = null, E = null, H = null); - }, "onRemoveFn")); - } - if (m && (m.textContent = k.text), p && y && h && x) if (k.type) { - p.style.display = "inline"; - const b = a(w => { - M.isNonNullType(w) ? (x.textContent = "!" + x.textContent, b(w.ofType)) : M.isListType(w) ? (y.textContent += "[", x.textContent = "]" + x.textContent, b(w.ofType)) : h.textContent = w.name; - }, "renderType"); - y.textContent = "", x.textContent = "", b(k.type); - } else y.textContent = "", h.textContent = "", x.textContent = "", p.style.display = "none"; - f && (k.description ? (f.style.display = "block", f.innerHTML = Re.render(k.description)) : (f.style.display = "none", f.innerHTML = "")), C && E && (k.deprecationReason ? (C.style.display = "block", E.innerHTML = Re.render(k.deprecationReason)) : (C.style.display = "none", E.innerHTML = "")); - }); +; +function __setFunctionName(f, name, prefix) { + if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : ""; + return Object.defineProperty(f, "name", { + configurable: true, + value: prefix ? "".concat(prefix, " ", name) : name }); - function i(d) { - if (!n || !s || !o || !(d.currentTarget instanceof HTMLElement)) return; - const g = d.currentTarget.textContent || "", - m = n.getType(g); - m && (o.setVisiblePlugin(de), s.push({ - name: m.name, - def: m - }), c == null || c(m)); - } - a(i, "onClickHintInformation"); -} -a(Ar, "onHasCompletion"); -function ke(e, t) { - l.useEffect(() => { - e && typeof t == "string" && t !== e.getValue() && e.setValue(t); - }, [e, t]); -} -a(ke, "useSynchronizeValue"); -function $e(e, t, n) { - l.useEffect(() => { - e && e.setOption(t, n); - }, [e, t, n]); -} -a($e, "useSynchronizeOption"); -function pn(e, t, n, s, o) { - const { - updateActiveTabValues: c - } = Z({ - nonNull: !0, - caller: o - }), - i = se(); - l.useEffect(() => { - if (!e) return; - const d = ue(500, p => { - !i || n === null || i.set(n, p); - }), - g = ue(100, p => { - c({ - [s]: p - }); - }), - m = a((p, y) => { - if (!y) return; - const h = p.getValue(); - d(h), g(h), t == null || t(h); - }, "handleChange"); - return e.on("change", m), () => e.off("change", m); - }, [t, e, i, n, s, c]); -} -a(pn, "useChangeHandler"); -function gn(e, t, n) { - const { - schema: s - } = X({ - nonNull: !0, - caller: n - }), - o = te(), - c = Ze(); - l.useEffect(() => { - if (!e) return; - const i = a((d, g) => { - Ar(d, g, s, o, c, m => { - t == null || t({ - kind: "Type", - type: m, - schema: s || void 0 - }); - }); - }, "handleCompletion"); - return e.on("hasCompletion", i), () => e.off("hasCompletion", i); - }, [t, e, o, c, s]); } -a(gn, "useCompletion"); -function Y(e, t, n) { - l.useEffect(() => { - if (e) { - for (const s of t) e.removeKeyMap(s); - if (n) { - const s = {}; - for (const o of t) s[o] = () => n(); - e.addKeyMap(s); - } - } - }, [e, t, n]); +; +function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); } -a(Y, "useKeyMap"); -function pt() { - let { - caller: e, - onCopyQuery: t - } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - const { - queryEditor: n - } = Z({ - nonNull: !0, - caller: e || pt - }); - return l.useCallback(() => { - if (!n) return; - const s = n.getValue(); - Rn(s), t == null || t(s); - }, [n, t]); -} -a(pt, "useCopyQuery"); -function he() { - let { - caller: e - } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - const { - queryEditor: t - } = Z({ - nonNull: !0, - caller: e || he - }), - { - schema: n - } = X({ - nonNull: !0, - caller: he +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function (resolve) { + resolve(value); }); - return l.useCallback(() => { - const s = t == null ? void 0 : t.documentAST, - o = t == null ? void 0 : t.getValue(); - !s || !o || t.setValue(M.print(B.mergeAst(s, n))); - }, [t, n]); -} -a(he, "useMergeQuery"); -function Se() { - let { - caller: e - } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - const { - queryEditor: t, - headerEditor: n, - variableEditor: s - } = Z({ - nonNull: !0, - caller: e || Se - }); - return l.useCallback(() => { - if (s) { - const o = s.getValue(); + } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { - const c = JSON.stringify(JSON.parse(o), null, 2); - c !== o && s.setValue(c); - } catch {} + step(generator.next(value)); + } catch (e) { + reject(e); + } } - if (n) { - const o = n.getValue(); + function rejected(value) { try { - const c = JSON.stringify(JSON.parse(o), null, 2); - c !== o && n.setValue(c); - } catch {} + step(generator["throw"](value)); + } catch (e) { + reject(e); + } } - if (t) { - const o = t.getValue(), - c = M.print(M.parse(o)); - c !== o && t.setValue(c); + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - }, [t, s, n]); + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); } -a(Se, "usePrettifyEditors"); -function He() { - let { - getDefaultFieldNames: e, - caller: t - } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - const { - schema: n - } = X({ - nonNull: !0, - caller: t || He - }), - { - queryEditor: s - } = Z({ - nonNull: !0, - caller: t || He - }); - return l.useCallback(() => { - if (!s) return; - const o = s.getValue(), - { - insertions: c, - result: i - } = B.fillLeafs(n, o, e); - return c && c.length > 0 && s.operation(() => { - const d = s.getCursor(), - g = s.indexFromPos(d); - s.setValue(i || ""); - let m = 0; - const p = c.map(_ref56 => { - let { - index: h, - string: x - } = _ref56; - return s.markText(s.posFromIndex(h + m), s.posFromIndex(h + (m += x.length)), { - className: "auto-inserted-leaf", - clearOnEnter: !0, - title: "Automatically added leaf fields" - }); - }); - setTimeout(() => { - for (const h of p) h.clear(); - }, 7e3); - let y = g; - for (const { - index: h, - string: x - } of c) h < g && (y += x.length); - s.setCursor(s.posFromIndex(y)); - }), i; - }, [e, s, n]); -} -a(He, "useAutoCompleteLeafs"); -const Ge = a(e => { - var _ref57; - const n = Z({ - nonNull: !0 - })[`${e}Editor`]; - let s = ""; - const o = (_ref57 = n == null ? void 0 : n.getValue()) !== null && _ref57 !== void 0 ? _ref57 : !1; - o && o.length > 0 && (s = o); - const c = l.useCallback(i => n == null ? void 0 : n.setValue(i), [n]); - return l.useMemo(() => [s, c], [s, c]); - }, "useEditorState"), - Or = a(() => Ge("query"), "useOperationsEditorState"), - Fr = a(() => Ge("variable"), "useVariablesEditorState"), - Br = a(() => Ge("header"), "useHeadersEditorState"); -function Wr(_ref58) { - let [e, t] = _ref58; - const n = l.useRef({ - pending: null, - last: e - }), - [s, o] = l.useState(e); - l.useEffect(() => { - n.current.last === e || (n.current.last = e, n.current.pending === null ? o(e) : n.current.pending === e ? (n.current.pending = null, e !== s && (n.current.pending = s, t(s))) : (n.current.pending = null, o(e))); - }, [e, s, t]); - const c = l.useCallback(i => { - o(i), n.current.pending === null && n.current.last !== i && (n.current.pending = i, t(i)); - }, [t]); - return l.useMemo(() => [s, c], [s, c]); -} -a(Wr, "useOptimisticState"); -function ce() { - let { - editorTheme: e = Be, - keyMap: t = We, - onEdit: n, - readOnly: s = !1 - } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - let o = arguments.length > 1 ? arguments[1] : undefined; - const { - initialHeaders: c, - headerEditor: i, - setHeaderEditor: d, - shouldPersistHeaders: g - } = Z({ - nonNull: !0, - caller: o || ce - }), - m = we(), - p = he({ - caller: o || ce - }), - y = Se({ - caller: o || ce - }), - h = l.useRef(null); - return l.useEffect(() => { - let x = !0; - return Ee([Promise.resolve().then(() => __webpack_require__(/*! ./javascript.cjs.js */ "../../graphiql-react/dist/javascript.cjs.js")).then(f => f.javascript)]).then(f => { - if (!x) return; - const C = h.current; - if (!C) return; - const E = f(C, { - value: c, - lineNumbers: !0, - tabSize: 2, - mode: { - name: "javascript", - json: !0 - }, - theme: e, - autoCloseBrackets: !0, - matchBrackets: !0, - showCursorWhenSelecting: !0, - readOnly: s ? "nocursor" : !1, - foldGutter: !0, - gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], - extraKeys: _e - }); - E.addKeyMap({ - "Cmd-Space"() { - E.showHint({ - completeSingle: !1, - container: C - }); - }, - "Ctrl-Space"() { - E.showHint({ - completeSingle: !1, - container: C - }); - }, - "Alt-Space"() { - E.showHint({ - completeSingle: !1, - container: C - }); - }, - "Shift-Space"() { - E.showHint({ - completeSingle: !1, - container: C - }); - } - }), E.on("keyup", (k, L) => { - const { - code: b, - key: w, - shiftKey: T - } = L, - A = b.startsWith("Key"), - F = !T && b.startsWith("Digit"); - (A || F || w === "_" || w === '"') && k.execCommand("autocomplete"); - }), d(E); - }), () => { - x = !1; - }; - }, [e, c, s, d]), $e(i, "keyMap", t), pn(i, n, g ? Me : null, "headers", ce), Y(i, ["Cmd-Enter", "Ctrl-Enter"], m == null ? void 0 : m.run), Y(i, ["Shift-Ctrl-P"], y), Y(i, ["Shift-Ctrl-M"], p), h; -} -a(ce, "useHeaderEditor"); -const Me = "headers", - _r = Array.from({ - length: 11 - }, (e, t) => String.fromCharCode(8192 + t)).concat(["\u2028", "\u2029", " ", " "]), - Zr = new RegExp("[" + _r.join("") + "]", "g"); -function $r(e) { - return e.replace(Zr, " "); -} -a($r, "normalizeWhitespace"); -function ne() { - let { - editorTheme: e = Be, - keyMap: t = We, - onClickReference: n, - onCopyQuery: s, - onEdit: o, - readOnly: c = !1 - } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - let i = arguments.length > 1 ? arguments[1] : undefined; - const { - schema: d - } = X({ - nonNull: !0, - caller: i || ne - }), - { - externalFragments: g, - initialQuery: m, - queryEditor: p, - setOperationName: y, - setQueryEditor: h, - validationRules: x, - variableEditor: f, - updateActiveTabValues: C - } = Z({ - nonNull: !0, - caller: i || ne - }), - E = we(), - k = se(), - L = te(), - b = Ze(), - w = pt({ - caller: i || ne, - onCopyQuery: s - }), - T = he({ - caller: i || ne - }), - A = Se({ - caller: i || ne - }), - F = l.useRef(null), - I = l.useRef(), - H = l.useRef(() => {}); - l.useEffect(() => { - H.current = q => { - if (!(!L || !b)) { - switch (b.setVisiblePlugin(de), q.kind) { - case "Type": - { - L.push({ - name: q.type.name, - def: q.type - }); - break; - } - case "Field": - { - L.push({ - name: q.field.name, - def: q.field - }); - break; - } - case "Argument": - { - q.field && L.push({ - name: q.field.name, - def: q.field - }); - break; - } - case "EnumValue": - { - q.type && L.push({ - name: q.type.name, - def: q.type - }); - break; - } - } - n == null || n(q); - } +function __generator(thisArg, body) { + var _ = { + label: 0, + sent: function () { + if (t[0] & 1) throw t[1]; + return t[1]; + }, + trys: [], + ops: [] + }, + f, + y, + t, + g; + return g = { + next: verb(0), + "throw": verb(1), + "return": verb(2) + }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { + return this; + }), g; + function verb(n) { + return function (v) { + return step([n, v]); }; - }, [L, n, b]), l.useEffect(() => { - let q = !0; - return Ee([Promise.resolve().then(() => __webpack_require__(/*! ./comment.cjs.js */ "../../graphiql-react/dist/comment.cjs.js")).then(N => N.comment), Promise.resolve().then(() => __webpack_require__(/*! ./search.cjs.js */ "../../graphiql-react/dist/search.cjs.js")).then(N => N.search), Promise.resolve().then(() => __webpack_require__(/*! ./hint.cjs.js */ "../../graphiql-react/dist/hint.cjs.js")), Promise.resolve().then(() => __webpack_require__(/*! ./lint.cjs2.js */ "../../graphiql-react/dist/lint.cjs2.js")), Promise.resolve().then(() => __webpack_require__(/*! ./info.cjs.js */ "../../graphiql-react/dist/info.cjs.js")), Promise.resolve().then(() => __webpack_require__(/*! ./jump.cjs.js */ "../../graphiql-react/dist/jump.cjs.js")), Promise.resolve().then(() => __webpack_require__(/*! ./mode.cjs.js */ "../../graphiql-react/dist/mode.cjs.js"))]).then(N => { - if (!q) return; - I.current = N; - const P = F.current; - if (!P) return; - const S = N(P, { - value: m, - lineNumbers: !0, - tabSize: 2, - foldGutter: !0, - mode: "graphql", - theme: e, - autoCloseBrackets: !0, - matchBrackets: !0, - showCursorWhenSelecting: !0, - readOnly: c ? "nocursor" : !1, - lint: { - schema: void 0, - validationRules: null, - externalFragments: void 0 - }, - hintOptions: { - schema: void 0, - closeOnUnfocus: !1, - completeSingle: !1, - container: P, - externalFragments: void 0 - }, - info: { - schema: void 0, - renderDescription: v => Re.render(v), - onClick(v) { - H.current(v); + } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: + case 1: + t = op; + break; + case 4: + _.label++; + return { + value: op[1], + done: false + }; + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; + case 7: + op = _.ops.pop(); + _.trys.pop(); + continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { + _ = 0; + continue; } - }, - jump: { - schema: void 0, - onClick(v) { - H.current(v); + if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { + _.label = op[1]; + break; } - }, - gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], - extraKeys: { - ..._e, - "Cmd-S"() {}, - "Ctrl-S"() {} - } - }); - S.addKeyMap({ - "Cmd-Space"() { - S.showHint({ - completeSingle: !0, - container: P - }); - }, - "Ctrl-Space"() { - S.showHint({ - completeSingle: !0, - container: P - }); - }, - "Alt-Space"() { - S.showHint({ - completeSingle: !0, - container: P - }); - }, - "Shift-Space"() { - S.showHint({ - completeSingle: !0, - container: P - }); - }, - "Shift-Alt-Space"() { - S.showHint({ - completeSingle: !0, - container: P - }); - } - }), S.on("keyup", (v, j) => { - Ur.test(j.key) && v.execCommand("autocomplete"); - }); - let W = !1; - S.on("startCompletion", () => { - W = !0; - }), S.on("endCompletion", () => { - W = !1; - }), S.on("keydown", (v, j) => { - j.key === "Escape" && W && j.stopPropagation(); - }), S.on("beforeChange", (v, j) => { - var R; - if (j.origin === "paste") { - const $ = j.text.map($r); - (R = j.update) == null || R.call(j, j.from, j.to, $); - } - }), S.documentAST = null, S.operationName = null, S.operations = null, S.variableToType = null, h(S); - }), () => { - q = !1; - }; - }, [e, m, c, h]), $e(p, "keyMap", t), l.useEffect(() => { - if (!p) return; - function q(P) { - var _P$operations, _P$operationName, _ref59, _ref60; - var v; - const S = kt.getOperationFacts(d, P.getValue()), - W = B.getSelectedOperationName((_P$operations = P.operations) !== null && _P$operations !== void 0 ? _P$operations : void 0, (_P$operationName = P.operationName) !== null && _P$operationName !== void 0 ? _P$operationName : void 0, S == null ? void 0 : S.operations); - return P.documentAST = (_ref59 = S == null ? void 0 : S.documentAST) !== null && _ref59 !== void 0 ? _ref59 : null, P.operationName = W !== null && W !== void 0 ? W : null, P.operations = (_ref60 = S == null ? void 0 : S.operations) !== null && _ref60 !== void 0 ? _ref60 : null, f && (f.state.lint.linterOptions.variableToType = S == null ? void 0 : S.variableToType, f.options.lint.variableToType = S == null ? void 0 : S.variableToType, f.options.hintOptions.variableToType = S == null ? void 0 : S.variableToType, (v = I.current) == null || v.signal(f, "change", f)), S ? { - ...S, - operationName: W - } : null; - } - a(q, "getAndUpdateOperationFacts"); - const N = ue(100, P => { - var _ref61; - const S = P.getValue(); - k == null || k.set(xn, S); - const W = P.operationName, - v = q(P); - (v == null ? void 0 : v.operationName) !== void 0 && (k == null || k.set(Kr, v.operationName)), o == null || o(S, v == null ? void 0 : v.documentAST), v != null && v.operationName && W !== v.operationName && y(v.operationName), C({ - query: S, - operationName: (_ref61 = v == null ? void 0 : v.operationName) !== null && _ref61 !== void 0 ? _ref61 : null - }); - }); - return q(p), p.on("change", N), () => p.off("change", N); - }, [o, p, d, y, k, f, C]), Gr(p, d !== null && d !== void 0 ? d : null, I), Qr(p, x !== null && x !== void 0 ? x : null, I), zr(p, g, I), gn(p, n || null, ne); - const O = E == null ? void 0 : E.run, - D = l.useCallback(() => { - var P; - if (!O || !p || !p.operations || !p.hasFocus()) { - O == null || O(); - return; - } - const q = p.indexFromPos(p.getCursor()); - let N; - for (const S of p.operations) S.loc && S.loc.start <= q && S.loc.end >= q && (N = (P = S.name) == null ? void 0 : P.value); - N && N !== p.operationName && y(N), O(); - }, [p, O, y]); - return Y(p, ["Cmd-Enter", "Ctrl-Enter"], D), Y(p, ["Shift-Ctrl-C"], w), Y(p, ["Shift-Ctrl-P", "Shift-Ctrl-F"], A), Y(p, ["Shift-Ctrl-M"], T), F; -} -a(ne, "useQueryEditor"); -function Gr(e, t, n) { - l.useEffect(() => { - if (!e) return; - const s = e.options.lint.schema !== t; - e.state.lint.linterOptions.schema = t, e.options.lint.schema = t, e.options.hintOptions.schema = t, e.options.info.schema = t, e.options.jump.schema = t, s && n.current && n.current.signal(e, "change", e); - }, [e, t, n]); -} -a(Gr, "useSynchronizeSchema"); -function Qr(e, t, n) { - l.useEffect(() => { - if (!e) return; - const s = e.options.lint.validationRules !== t; - e.state.lint.linterOptions.validationRules = t, e.options.lint.validationRules = t, s && n.current && n.current.signal(e, "change", e); - }, [e, t, n]); -} -a(Qr, "useSynchronizeValidationRules"); -function zr(e, t, n) { - const s = l.useMemo(() => [...t.values()], [t]); - l.useEffect(() => { - if (!e) return; - const o = e.options.lint.externalFragments !== s; - e.state.lint.linterOptions.externalFragments = s, e.options.lint.externalFragments = s, e.options.hintOptions.externalFragments = s, o && n.current && n.current.signal(e, "change", e); - }, [e, s, n]); -} -a(zr, "useSynchronizeExternalFragments"); -const Ur = /^[a-zA-Z0-9_@(]$/, - xn = "query", - Kr = "operationName"; -function Jr(_ref62) { - let { - defaultQuery: e, - defaultHeaders: t, - headers: n, - defaultTabs: s, - query: o, - variables: c, - storage: i, - shouldPersistHeaders: d - } = _ref62; - const g = i == null ? void 0 : i.get(ve); - try { - if (!g) throw new Error("Storage for tabs is empty"); - const m = JSON.parse(g), - p = d ? n : void 0; - if (Yr(m)) { - const y = De({ - query: o, - variables: c, - headers: p - }); - let h = -1; - for (let x = 0; x < m.tabs.length; x++) { - const f = m.tabs[x]; - f.hash = De({ - query: f.query, - variables: f.variables, - headers: f.headers - }), f.hash === y && (h = x); - } - if (h >= 0) m.activeTabIndex = h;else { - const x = o ? gt(o) : null; - m.tabs.push({ - id: bn(), - hash: y, - title: x || xt, - query: o, - variables: c, - headers: n, - operationName: x, - response: null - }), m.activeTabIndex = m.tabs.length - 1; + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; + t = op; + break; + } + if (t && _.label < t[2]) { + _.label = t[2]; + _.ops.push(op); + break; + } + if (t[2]) _.ops.pop(); + _.trys.pop(); + continue; } - return m; + op = body.call(thisArg, _); + } catch (e) { + op = [6, e]; + y = 0; + } finally { + f = t = 0; } - throw new Error("Storage for tabs is invalid"); - } catch { + if (op[0] & 5) throw op[1]; return { - activeTabIndex: 0, - tabs: (s || [{ - query: o !== null && o !== void 0 ? o : e, - variables: c, - headers: n !== null && n !== void 0 ? n : t - }]).map(vn) + value: op[0] ? op[1] : void 0, + done: true }; } } -a(Jr, "getDefaultTabState"); -function Yr(e) { - return e && typeof e == "object" && !Array.isArray(e) && es(e, "activeTabIndex") && "tabs" in e && Array.isArray(e.tabs) && e.tabs.every(Xr); -} -a(Yr, "isTabsState"); -function Xr(e) { - return e && typeof e == "object" && !Array.isArray(e) && jt(e, "id") && jt(e, "title") && fe(e, "query") && fe(e, "variables") && fe(e, "headers") && fe(e, "operationName") && fe(e, "response"); -} -a(Xr, "isTabState"); -function es(e, t) { - return t in e && typeof e[t] == "number"; -} -a(es, "hasNumberKey"); -function jt(e, t) { - return t in e && typeof e[t] == "string"; -} -a(jt, "hasStringKey"); -function fe(e, t) { - return t in e && (typeof e[t] == "string" || e[t] === null); -} -a(fe, "hasStringOrNullKey"); -function ts(_ref63) { - let { - queryEditor: e, - variableEditor: t, - headerEditor: n, - responseEditor: s - } = _ref63; - return l.useCallback(o => { - var _ref64, _ref65, _ref66, _ref67, _ref68; - const c = (_ref64 = e == null ? void 0 : e.getValue()) !== null && _ref64 !== void 0 ? _ref64 : null, - i = (_ref65 = t == null ? void 0 : t.getValue()) !== null && _ref65 !== void 0 ? _ref65 : null, - d = (_ref66 = n == null ? void 0 : n.getValue()) !== null && _ref66 !== void 0 ? _ref66 : null, - g = (_ref67 = e == null ? void 0 : e.operationName) !== null && _ref67 !== void 0 ? _ref67 : null, - m = (_ref68 = s == null ? void 0 : s.getValue()) !== null && _ref68 !== void 0 ? _ref68 : null; - return yn(o, { - query: c, - variables: i, - headers: d, - response: m, - operationName: g - }); - }, [e, t, n, s]); -} -a(ts, "useSynchronizeActiveTabValues"); -function Cn(e) { - let t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : !1; - return JSON.stringify(e, (n, s) => n === "hash" || n === "response" || !t && n === "headers" ? null : s); -} -a(Cn, "serializeTabState"); -function ns(_ref69) { - let { - storage: e, - shouldPersistHeaders: t - } = _ref69; - const n = l.useMemo(() => ue(500, s => { - e == null || e.set(ve, s); - }), [e]); - return l.useCallback(s => { - n(Cn(s, t)); - }, [t, n]); -} -a(ns, "useStoreTabs"); -function rs(_ref70) { - let { - queryEditor: e, - variableEditor: t, - headerEditor: n, - responseEditor: s - } = _ref70; - return l.useCallback(_ref71 => { - let { - query: o, - variables: c, - headers: i, - response: d - } = _ref71; - e == null || e.setValue(o !== null && o !== void 0 ? o : ""), t == null || t.setValue(c !== null && c !== void 0 ? c : ""), n == null || n.setValue(i !== null && i !== void 0 ? i : ""), s == null || s.setValue(d !== null && d !== void 0 ? d : ""); - }, [n, e, s, t]); -} -a(rs, "useSetEditorValues"); -function vn() { - let { - query: e = null, - variables: t = null, - headers: n = null - } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - return { - id: bn(), - hash: De({ - query: e, - variables: t, - headers: n - }), - title: e && gt(e) || xt, - query: e, - variables: t, - headers: n, - operationName: null, - response: null - }; +var __createBinding = exports.__createBinding = Object.create ? function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { + enumerable: true, + get: function () { + return m[k]; + } + }; + } + Object.defineProperty(o, k2, desc); +} : function (o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +}; +function __exportStar(m, o) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p); } -a(vn, "createTab"); -function yn(e, t) { - return { - ...e, - tabs: e.tabs.map((n, s) => { - if (s !== e.activeTabIndex) return n; - const o = { - ...n, - ...t - }; +function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, + m = s && o[s], + i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; return { - ...o, - hash: De(o), - title: o.operationName || (o.query ? gt(o.query) : void 0) || xt + value: o && o[i++], + done: !o }; - }) + } }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); } -a(yn, "setPropertiesInActiveTab"); -function bn() { - const e = a(() => Math.floor((1 + Math.random()) * 65536).toString(16).slice(1), "s4"); - return `${e()}${e()}-${e()}-${e()}-${e()}-${e()}${e()}${e()}`; -} -a(bn, "guid"); -function De(e) { - var _e$query, _e$variables, _e$headers; - return [(_e$query = e.query) !== null && _e$query !== void 0 ? _e$query : "", (_e$variables = e.variables) !== null && _e$variables !== void 0 ? _e$variables : "", (_e$headers = e.headers) !== null && _e$headers !== void 0 ? _e$headers : ""].join("|"); -} -a(De, "hashFromTabContents"); -function gt(e) { - var _ref72; - const n = /^(?!#).*(query|subscription|mutation)\s+([a-zA-Z0-9_]+)/m.exec(e); - return (_ref72 = n == null ? void 0 : n[2]) !== null && _ref72 !== void 0 ? _ref72 : null; -} -a(gt, "fuzzyExtractOperationName"); -function ss(e) { - const t = e == null ? void 0 : e.get(ve); - if (t) { - const n = JSON.parse(t); - e == null || e.set(ve, JSON.stringify(n, (s, o) => s === "headers" ? null : o)); - } -} -a(ss, "clearHeadersFromTabs"); -const xt = "", - ve = "tabState"; -function oe() { - let { - editorTheme: e = Be, - keyMap: t = We, - onClickReference: n, - onEdit: s, - readOnly: o = !1 - } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - let c = arguments.length > 1 ? arguments[1] : undefined; - const { - initialVariables: i, - variableEditor: d, - setVariableEditor: g - } = Z({ - nonNull: !0, - caller: c || oe - }), - m = we(), - p = he({ - caller: c || oe - }), - y = Se({ - caller: c || oe - }), - h = l.useRef(null), - x = l.useRef(); - return l.useEffect(() => { - let f = !0; - return Ee([Promise.resolve().then(() => __webpack_require__(/*! ./hint.cjs2.js */ "../../graphiql-react/dist/hint.cjs2.js")), Promise.resolve().then(() => __webpack_require__(/*! ./lint.cjs3.js */ "../../graphiql-react/dist/lint.cjs3.js")), Promise.resolve().then(() => __webpack_require__(/*! ./mode.cjs2.js */ "../../graphiql-react/dist/mode.cjs2.js"))]).then(C => { - if (!f) return; - x.current = C; - const E = h.current; - if (!E) return; - const k = C(E, { - value: i, - lineNumbers: !0, - tabSize: 2, - mode: "graphql-variables", - theme: e, - autoCloseBrackets: !0, - matchBrackets: !0, - showCursorWhenSelecting: !0, - readOnly: o ? "nocursor" : !1, - foldGutter: !0, - lint: { - variableToType: void 0 - }, - hintOptions: { - closeOnUnfocus: !1, - completeSingle: !1, - container: E, - variableToType: void 0 - }, - gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], - extraKeys: _e - }); - k.addKeyMap({ - "Cmd-Space"() { - k.showHint({ - completeSingle: !1, - container: E - }); - }, - "Ctrl-Space"() { - k.showHint({ - completeSingle: !1, - container: E - }); - }, - "Alt-Space"() { - k.showHint({ - completeSingle: !1, - container: E - }); - }, - "Shift-Space"() { - k.showHint({ - completeSingle: !1, - container: E - }); - } - }), k.on("keyup", (L, b) => { - const { - code: w, - key: T, - shiftKey: A - } = b, - F = w.startsWith("Key"), - I = !A && w.startsWith("Digit"); - (F || I || T === "_" || T === '"') && L.execCommand("autocomplete"); - }), g(k); - }), () => { - f = !1; +function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), + r, + ar = [], + e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } catch (error) { + e = { + error: error }; - }, [e, i, o, g]), $e(d, "keyMap", t), pn(d, s, wn, "variables", oe), gn(d, n || null, oe), Y(d, ["Cmd-Enter", "Ctrl-Enter"], m == null ? void 0 : m.run), Y(d, ["Shift-Ctrl-P"], y), Y(d, ["Shift-Ctrl-M"], p), h; -} -a(oe, "useVariableEditor"); -const wn = "variables", - Ct = le("EditorContext"); -function En(e) { - const t = se(), - [n, s] = l.useState(null), - [o, c] = l.useState(null), - [i, d] = l.useState(null), - [g, m] = l.useState(null), - [p, y] = l.useState(() => { - const v = (t == null ? void 0 : t.get(ze)) !== null; - return e.shouldPersistHeaders !== !1 && v ? (t == null ? void 0 : t.get(ze)) === "true" : !!e.shouldPersistHeaders; - }); - ke(n, e.headers), ke(o, e.query), ke(i, e.response), ke(g, e.variables); - const h = ns({ - storage: t, - shouldPersistHeaders: p - }), - [x] = l.useState(() => { - var _ref73, _e$query2, _ref74, _e$variables2, _ref75, _e$headers2, _e$response, _ref76, _ref77; - const v = (_ref73 = (_e$query2 = e.query) !== null && _e$query2 !== void 0 ? _e$query2 : t == null ? void 0 : t.get(xn)) !== null && _ref73 !== void 0 ? _ref73 : null, - j = (_ref74 = (_e$variables2 = e.variables) !== null && _e$variables2 !== void 0 ? _e$variables2 : t == null ? void 0 : t.get(wn)) !== null && _ref74 !== void 0 ? _ref74 : null, - R = (_ref75 = (_e$headers2 = e.headers) !== null && _e$headers2 !== void 0 ? _e$headers2 : t == null ? void 0 : t.get(Me)) !== null && _ref75 !== void 0 ? _ref75 : null, - $ = (_e$response = e.response) !== null && _e$response !== void 0 ? _e$response : "", - z = Jr({ - query: v, - variables: j, - headers: R, - defaultTabs: e.defaultTabs, - defaultQuery: e.defaultQuery || os, - defaultHeaders: e.defaultHeaders, - storage: t, - shouldPersistHeaders: p - }); - return h(z), { - query: (_ref76 = v !== null && v !== void 0 ? v : z.activeTabIndex === 0 ? z.tabs[0].query : null) !== null && _ref76 !== void 0 ? _ref76 : "", - variables: j !== null && j !== void 0 ? j : "", - headers: (_ref77 = R !== null && R !== void 0 ? R : e.defaultHeaders) !== null && _ref77 !== void 0 ? _ref77 : "", - response: $, - tabState: z - }; - }), - [f, C] = l.useState(x.tabState), - E = l.useCallback(v => { - if (v) { - var _ref78; - t == null || t.set(Me, (_ref78 = n == null ? void 0 : n.getValue()) !== null && _ref78 !== void 0 ? _ref78 : ""); - const j = Cn(f, !0); - t == null || t.set(ve, j); - } else t == null || t.set(Me, ""), ss(t); - y(v), t == null || t.set(ze, v.toString()); - }, [t, f, n]), - k = l.useRef(); - l.useEffect(() => { - const v = !!e.shouldPersistHeaders; - (k == null ? void 0 : k.current) !== v && (E(v), k.current = v); - }, [e.shouldPersistHeaders, E]); - const L = ts({ - queryEditor: o, - variableEditor: g, - headerEditor: n, - responseEditor: i - }), - b = rs({ - queryEditor: o, - variableEditor: g, - headerEditor: n, - responseEditor: i - }), - { - onTabChange: w, - defaultHeaders: T, - children: A - } = e, - F = l.useCallback(() => { - C(v => { - const j = L(v), - R = { - tabs: [...j.tabs, vn({ - headers: T - })], - activeTabIndex: j.tabs.length - }; - return h(R), b(R.tabs[R.activeTabIndex]), w == null || w(R), R; - }); - }, [T, w, b, h, L]), - I = l.useCallback(v => { - C(j => { - const R = { - ...j, - activeTabIndex: v - }; - return h(R), b(R.tabs[R.activeTabIndex]), w == null || w(R), R; - }); - }, [w, b, h]), - H = l.useCallback(v => { - C(j => { - const R = j.tabs[j.activeTabIndex], - $ = { - tabs: v, - activeTabIndex: v.indexOf(R) - }; - return h($), b($.tabs[$.activeTabIndex]), w == null || w($), $; - }); - }, [w, b, h]), - O = l.useCallback(v => { - C(j => { - const R = { - tabs: j.tabs.filter(($, z) => v !== z), - activeTabIndex: Math.max(j.activeTabIndex - 1, 0) - }; - return h(R), b(R.tabs[R.activeTabIndex]), w == null || w(R), R; - }); - }, [w, b, h]), - D = l.useCallback(v => { - C(j => { - const R = yn(j, v); - return h(R), w == null || w(R), R; - }); - }, [w, h]), - { - onEditOperationName: q - } = e, - N = l.useCallback(v => { - o && (o.operationName = v, D({ - operationName: v - }), q == null || q(v)); - }, [q, o, D]), - P = l.useMemo(() => { - const v = new Map(); - if (Array.isArray(e.externalFragments)) for (const j of e.externalFragments) v.set(j.name.value, j);else if (typeof e.externalFragments == "string") M.visit(M.parse(e.externalFragments, {}), { - FragmentDefinition(j) { - v.set(j.name.value, j); - } - });else if (e.externalFragments) throw new Error("The `externalFragments` prop must either be a string that contains the fragment definitions in SDL or a list of FragmentDefinitionNode objects."); - return v; - }, [e.externalFragments]), - S = l.useMemo(() => e.validationRules || [], [e.validationRules]), - W = l.useMemo(() => ({ - ...f, - addTab: F, - changeTab: I, - moveTab: H, - closeTab: O, - updateActiveTabValues: D, - headerEditor: n, - queryEditor: o, - responseEditor: i, - variableEditor: g, - setHeaderEditor: s, - setQueryEditor: c, - setResponseEditor: d, - setVariableEditor: m, - setOperationName: N, - initialQuery: x.query, - initialVariables: x.variables, - initialHeaders: x.headers, - initialResponse: x.response, - externalFragments: P, - validationRules: S, - shouldPersistHeaders: p, - setShouldPersistHeaders: E - }), [f, F, I, H, O, D, n, o, i, g, N, x, P, S, p, E]); - return r.jsx(Ct.Provider, { - value: W, - children: A - }); + } finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } finally { + if (e) throw e.error; + } + } + return ar; } -a(En, "EditorContextProvider"); -const Z = ie(Ct), - ze = "shouldPersistHeaders", - os = `# Welcome to GraphiQL -# -# GraphiQL is an in-browser tool for writing, validating, and -# testing GraphQL queries. -# -# Type queries into this side of the screen, and you will see intelligent -# typeaheads aware of the current GraphQL type schema and live syntax and -# validation errors highlighted within the text. -# -# GraphQL queries typically start with a "{" character. Lines that start -# with a # are ignored. -# -# An example GraphQL query might look like: -# -# { -# field(arg: "value") { -# subField -# } -# } -# -# Keyboard shortcuts: -# -# Prettify query: Shift-Ctrl-P (or press the prettify button) -# -# Merge fragments: Shift-Ctrl-M (or press the merge button) -# -# Run Query: Ctrl-Enter (or press the play button) -# -# Auto Complete: Ctrl-Space (or just start typing) -# -`; -function Xe(_ref79) { - let { - isHidden: e, - ...t - } = _ref79; - const { - headerEditor: n - } = Z({ - nonNull: !0, - caller: Xe - }), - s = ce(t, Xe); - return l.useEffect(() => { - e || n == null || n.refresh(); - }, [n, e]), r.jsx("div", { - className: _.clsx("graphiql-editor", e && "hidden"), - ref: s - }); +/** @deprecated */ +function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); + return ar; } -a(Xe, "HeaderEditor"); -function Ae(e) { - var g; - const [t, n] = l.useState({ - width: null, - height: null - }), - [s, o] = l.useState(null), - c = l.useRef(null), - i = (g = Sn(e.token)) == null ? void 0 : g.href; - l.useEffect(() => { - if (c.current) { - if (!i) { - n({ - width: null, - height: null - }), o(null); - return; - } - fetch(i, { - method: "HEAD" - }).then(m => { - o(m.headers.get("Content-Type")); - }).catch(() => { - o(null); - }); - } - }, [i]); - const d = t.width !== null && t.height !== null ? r.jsxs("div", { - children: [t.width, "x", t.height, s === null ? null : " " + s] - }) : null; - return r.jsxs("div", { - children: [r.jsx("img", { - onLoad: () => { - var _ref80, _ref81; - var m, p; - n({ - width: (_ref80 = (m = c.current) == null ? void 0 : m.naturalWidth) !== null && _ref80 !== void 0 ? _ref80 : null, - height: (_ref81 = (p = c.current) == null ? void 0 : p.naturalHeight) !== null && _ref81 !== void 0 ? _ref81 : null - }); - }, - ref: c, - src: i - }), d] - }); + +/** @deprecated */ +function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; + return r; } -a(Ae, "ImagePreview"); -Ae.shouldRender = a(function (t) { - const n = Sn(t); - return n ? ls(n) : !1; -}, "shouldRender"); -function Sn(e) { - if (e.type !== "string") return; - const t = e.string.slice(1).slice(0, -1).trim(); - try { - const { - location: n - } = window; - return new URL(t, n.protocol + "//" + n.host); - } catch { - return; +function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } } + return to.concat(ar || Array.prototype.slice.call(from)); } -a(Sn, "tokenToURL"); -function ls(e) { - return /(bmp|gif|jpeg|jpg|png|svg)$/.test(e.pathname); -} -a(ls, "isImageURL"); -function Ln(e) { - const t = ne(e, Ln); - return r.jsx("div", { - className: "graphiql-editor", - ref: t - }); +function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); } -a(Ln, "QueryEditor"); -function Oe() { - let { - responseTooltip: e, - editorTheme: t = Be, - keyMap: n = We - } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - let s = arguments.length > 1 ? arguments[1] : undefined; - const { - fetchError: o, - validationErrors: c - } = X({ - nonNull: !0, - caller: s || Oe - }), - { - initialResponse: i, - responseEditor: d, - setResponseEditor: g - } = Z({ - nonNull: !0, - caller: s || Oe - }), - m = l.useRef(null), - p = l.useRef(e); - return l.useEffect(() => { - p.current = e; - }, [e]), l.useEffect(() => { - let y = !0; - return Ee([Promise.resolve().then(() => __webpack_require__(/*! ./foldgutter.cjs.js */ "../../graphiql-react/dist/foldgutter.cjs.js")).then(h => h.foldgutter), Promise.resolve().then(() => __webpack_require__(/*! ./brace-fold.cjs.js */ "../../graphiql-react/dist/brace-fold.cjs.js")).then(h => h.braceFold), Promise.resolve().then(() => __webpack_require__(/*! ./dialog.cjs.js */ "../../graphiql-react/dist/dialog.cjs.js")).then(h => h.dialog), Promise.resolve().then(() => __webpack_require__(/*! ./search.cjs.js */ "../../graphiql-react/dist/search.cjs.js")).then(h => h.search), Promise.resolve().then(() => __webpack_require__(/*! ./searchcursor.cjs.js */ "../../graphiql-react/dist/searchcursor.cjs.js")).then(h => h.searchcursor), Promise.resolve().then(() => __webpack_require__(/*! ./jump-to-line.cjs.js */ "../../graphiql-react/dist/jump-to-line.cjs.js")).then(h => h.jumpToLine), Promise.resolve().then(() => __webpack_require__(/*! ./sublime.cjs.js */ "../../graphiql-react/dist/sublime.cjs.js")).then(h => h.sublime), Promise.resolve().then(() => __webpack_require__(/*! ./mode.cjs3.js */ "../../graphiql-react/dist/mode.cjs3.js")), Promise.resolve().then(() => __webpack_require__(/*! ./info-addon.cjs.js */ "../../graphiql-react/dist/info-addon.cjs.js"))], { - useCommonAddons: !1 - }).then(h => { - if (!y) return; - const x = document.createElement("div"); - h.registerHelper("info", "graphql-results", (E, k, L, b) => { - const w = [], - T = p.current; - return T && w.push(r.jsx(T, { - pos: b, - token: E - })), Ae.shouldRender(E) && w.push(r.jsx(Ae, { - token: E - }, "image-preview")), w.length ? (yt.render(w, x), x) : (yt.unmountComponentAtNode(x), null); - }); - const f = m.current; - if (!f) return; - const C = h(f, { - value: i, - lineWrapping: !0, - readOnly: !0, - theme: t, - mode: "graphql-results", - foldGutter: !0, - gutters: ["CodeMirror-foldgutter"], - info: !0, - extraKeys: _e +function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), + i, + q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { + return this; + }, i; + function verb(n) { + if (g[n]) i[n] = function (v) { + return new Promise(function (a, b) { + q.push([n, v, a, b]) > 1 || resume(n, v); }); - g(C); - }), () => { - y = !1; }; - }, [t, i, g]), $e(d, "keyMap", n), l.useEffect(() => { - o && (d == null || d.setValue(o)), c.length > 0 && (d == null || d.setValue(B.formatError(c))); - }, [d, o, c]), m; -} -a(Oe, "useResponseEditor"); -function jn(e) { - const t = Oe(e, jn); - return r.jsx("section", { - className: "result-window", - "aria-label": "Result Window", - "aria-live": "polite", - "aria-atomic": "true", - ref: t - }); + } + function resume(n, v) { + try { + step(g[n](v)); + } catch (e) { + settle(q[0][3], e); + } + } + function step(r) { + r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); + } + function fulfill(value) { + resume("next", value); + } + function reject(value) { + resume("throw", value); + } + function settle(f, v) { + if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); + } } -a(jn, "ResponseEditor"); -function et(_ref82) { - let { - isHidden: e, - ...t - } = _ref82; - const { - variableEditor: n - } = Z({ - nonNull: !0, - caller: et - }), - s = oe(t, et); - return l.useEffect(() => { - n && !e && n.refresh(); - }, [n, e]), r.jsx("div", { - className: _.clsx("graphiql-editor", e && "hidden"), - ref: s - }); +function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { + throw e; + }), verb("return"), i[Symbol.iterator] = function () { + return this; + }, i; + function verb(n, f) { + i[n] = o[n] ? function (v) { + return (p = !p) ? { + value: __await(o[n](v)), + done: false + } : f ? f(v) : v; + } : f; + } } -a(et, "VariableEditor"); -function is(_ref83) { - let { - children: e, - dangerouslyAssumeSchemaIsValid: t, - defaultQuery: n, - defaultHeaders: s, - defaultTabs: o, - externalFragments: c, - fetcher: i, - getDefaultFieldNames: d, - headers: g, - inputValueDeprecation: m, - introspectionQueryName: p, - maxHistoryLength: y, - onEditOperationName: h, - onSchemaChange: x, - onTabChange: f, - onTogglePluginVisibility: C, - operationName: E, - plugins: k, - query: L, - response: b, - schema: w, - schemaDescription: T, - shouldPersistHeaders: A, - storage: F, - validationRules: I, - variables: H, - visiblePlugin: O - } = _ref83; - return r.jsx(Tt, { - storage: F, - children: r.jsx(on, { - maxHistoryLength: y, - children: r.jsx(En, { - defaultQuery: n, - defaultHeaders: s, - defaultTabs: o, - externalFragments: c, - headers: g, - onEditOperationName: h, - onTabChange: f, - query: L, - response: b, - shouldPersistHeaders: A, - validationRules: I, - variables: H, - children: r.jsx(ct, { - dangerouslyAssumeSchemaIsValid: t, - fetcher: i, - inputValueDeprecation: m, - introspectionQueryName: p, - onSchemaChange: x, - schema: w, - schemaDescription: T, - children: r.jsx(qe, { - getDefaultFieldNames: d, - fetcher: i, - operationName: E, - children: r.jsx(dt, { - children: r.jsx(fn, { - onTogglePluginVisibility: C, - plugins: k, - visiblePlugin: O, - children: e - }) - }) - }) - }) - }) - }) - }); +function __asyncValues(o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], + i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { + return this; + }, i); + function verb(n) { + i[n] = o[n] && function (v) { + return new Promise(function (resolve, reject) { + v = o[n](v), settle(resolve, reject, v.done, v.value); + }); + }; + } + function settle(resolve, reject, d, v) { + Promise.resolve(v).then(function (v) { + resolve({ + value: v, + done: d + }); + }, reject); + } } -a(is, "GraphiQLProvider"); -function as() { - const e = se(), - [t, n] = l.useState(() => { - if (!e) return null; - const o = e.get(Ue); - switch (o) { - case "light": - return "light"; - case "dark": - return "dark"; - default: - return typeof o == "string" && e.set(Ue, ""), null; - } +function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { + Object.defineProperty(cooked, "raw", { + value: raw }); - l.useLayoutEffect(() => { - typeof window > "u" || (document.body.classList.remove("graphiql-light", "graphiql-dark"), t && document.body.classList.add(`graphiql-${t}`)); - }, [t]); - const s = l.useCallback(o => { - e == null || e.set(Ue, o || ""), n(o); - }, [e]); - return l.useMemo(() => ({ - theme: t, - setTheme: s - }), [t, s]); -} -a(as, "useTheme"); -const Ue = "theme"; -function cs(_ref84) { - let { - defaultSizeRelation: e = us, - direction: t, - initiallyHidden: n, - onHiddenElementChange: s, - sizeThresholdFirst: o = 100, - sizeThresholdSecond: c = 100, - storageKey: i - } = _ref84; - const d = se(), - g = l.useMemo(() => ue(500, L => { - i && (d == null || d.set(i, L)); - }), [d, i]), - [m, p] = l.useState(() => { - const L = i && (d == null ? void 0 : d.get(i)); - return L === Ne || n === "first" ? "first" : L === Te || n === "second" ? "second" : null; - }), - y = l.useCallback(L => { - L !== m && (p(L), s == null || s(L)); - }, [m, s]), - h = l.useRef(null), - x = l.useRef(null), - f = l.useRef(null), - C = l.useRef(`${e}`); - l.useLayoutEffect(() => { - const L = i && (d == null ? void 0 : d.get(i)) || C.current; - h.current && (h.current.style.display = "flex", h.current.style.flex = L === Ne || L === Te ? C.current : L), f.current && (f.current.style.display = "flex", f.current.style.flex = "1"), x.current && (x.current.style.display = "flex"); - }, [t, d, i]); - const E = l.useCallback(L => { - const b = L === "first" ? h.current : f.current; - if (b && (b.style.left = "-1000px", b.style.position = "absolute", b.style.opacity = "0", b.style.height = "500px", b.style.width = "500px", h.current)) { - const w = parseFloat(h.current.style.flex); - (!Number.isFinite(w) || w < 1) && (h.current.style.flex = "1"); - } - }, []), - k = l.useCallback(L => { - const b = L === "first" ? h.current : f.current; - if (b && (b.style.width = "", b.style.height = "", b.style.opacity = "", b.style.position = "", b.style.left = "", d && i)) { - const w = d.get(i); - h.current && w !== Ne && w !== Te && (h.current.style.flex = w || C.current); - } - }, [d, i]); - return l.useLayoutEffect(() => { - m === "first" ? E("first") : k("first"), m === "second" ? E("second") : k("second"); - }, [m, E, k]), l.useEffect(() => { - if (!x.current || !h.current || !f.current) return; - const L = x.current, - b = h.current, - w = b.parentElement, - T = t === "horizontal" ? "clientX" : "clientY", - A = t === "horizontal" ? "left" : "top", - F = t === "horizontal" ? "right" : "bottom", - I = t === "horizontal" ? "clientWidth" : "clientHeight"; - function H(D) { - D.preventDefault(); - const q = D[T] - L.getBoundingClientRect()[A]; - function N(S) { - if (S.buttons === 0) return P(); - const W = S[T] - w.getBoundingClientRect()[A] - q, - v = w.getBoundingClientRect()[F] - S[T] + q - L[I]; - if (W < o) y("first"), g(Ne);else if (v < c) y("second"), g(Te);else { - y(null); - const j = `${W / v}`; - b.style.flex = j, g(j); - } - } - a(N, "handleMouseMove"); - function P() { - document.removeEventListener("mousemove", N), document.removeEventListener("mouseup", P); - } - a(P, "handleMouseUp"), document.addEventListener("mousemove", N), document.addEventListener("mouseup", P); - } - a(H, "handleMouseDown"), L.addEventListener("mousedown", H); - function O() { - h.current && (h.current.style.flex = C.current), g(C.current), y(null); - } - return a(O, "reset"), L.addEventListener("dblclick", O), () => { - L.removeEventListener("mousedown", H), L.removeEventListener("dblclick", O); - }; - }, [t, y, o, c, g]), l.useMemo(() => ({ - dragBarRef: x, - hiddenElement: m, - firstRef: h, - setHiddenElement: p, - secondRef: f - }), [m, p]); -} -a(cs, "useDragResize"); -const us = 1, - Ne = "hide-first", - Te = "hide-second"; -const kn = l.forwardRef((_ref85, s) => { - let { - label: e, - onClick: t, - ...n - } = _ref85; - const [o, c] = l.useState(null), - i = l.useCallback(d => { - try { - t == null || t(d), c(null); - } catch (g) { - c(g instanceof Error ? g : new Error(`Toolbar button click failed: ${g}`)); - } - }, [t]); - return r.jsx(J, { - label: e, - children: r.jsx(Q, { - ...n, - ref: s, - type: "button", - className: _.clsx("graphiql-toolbar-button", o && "error", n.className), - onClick: i, - "aria-label": o ? o.message : e, - "aria-invalid": o ? "true" : n["aria-invalid"] - }) - }); -}); -kn.displayName = "ToolbarButton"; -function tt() { - const { - queryEditor: e, - setOperationName: t - } = Z({ - nonNull: !0, - caller: tt - }), - { - isFetching: n, - isSubscribed: s, - operationName: o, - run: c, - stop: i - } = we({ - nonNull: !0, - caller: tt - }), - d = (e == null ? void 0 : e.operations) || [], - g = d.length > 1 && typeof o != "string", - m = n || s, - p = `${m ? "Stop" : "Execute"} query (Ctrl-Enter)`, - y = { - type: "button", - className: "graphiql-execute-button", - children: m ? r.jsx(zt, {}) : r.jsx(Zt, {}), - "aria-label": p - }; - return g && !m ? r.jsxs(ee, { - children: [r.jsx(J, { - label: p, - children: r.jsx(ee.Button, { - ...y - }) - }), r.jsx(ee.Content, { - children: d.map((h, x) => { - const f = h.name ? h.name.value : ``; - return r.jsx(ee.Item, { - onSelect: () => { - var E; - const C = (E = h.name) == null ? void 0 : E.value; - e && C && C !== e.operationName && t(C), c(); - }, - children: f - }, `${f}-${x}`); - }) - })] - }) : r.jsx(J, { - label: p, - children: r.jsx("button", { - ...y, - onClick: () => { - m ? i() : c(); - } - }) + } else { + cooked.raw = raw; + } + return cooked; +} +; +var __setModuleDefault = Object.create ? function (o, v) { + Object.defineProperty(o, "default", { + enumerable: true, + value: v }); +} : function (o, v) { + o["default"] = v; +}; +function __importStar(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; } -a(tt, "ExecuteButton"); -const ds = a(_ref86 => { - let { - button: e, - children: t, - label: n, - ...s - } = _ref86; - return r.jsxs(ee, { - ...s, - children: [r.jsx(J, { - label: n, - children: r.jsx(ee.Button, { - className: _.clsx("graphiql-un-styled graphiql-toolbar-menu", s.className), - "aria-label": n, - children: e - }) - }), r.jsx(ee.Content, { - children: t - })] +function __importDefault(mod) { + return mod && mod.__esModule ? mod : { + default: mod + }; +} +function __classPrivateFieldGet(receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +} +function __classPrivateFieldSet(receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; +} +function __classPrivateFieldIn(state, receiver) { + if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") throw new TypeError("Cannot use 'in' operator on non-object"); + return typeof state === "function" ? receiver === state : state.has(receiver); +} +function __addDisposableResource(env, value, async) { + if (value !== null && value !== void 0) { + if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected."); + var dispose; + if (async) { + if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined."); + dispose = value[Symbol.asyncDispose]; + } + if (dispose === void 0) { + if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined."); + dispose = value[Symbol.dispose]; + } + if (typeof dispose !== "function") throw new TypeError("Object not disposable."); + env.stack.push({ + value: value, + dispose: dispose, + async: async }); - }, "ToolbarMenuRoot"), - hs = ye(ds, { - Item: ee.Item - }); -exports.Argument = Ce; -exports.ArgumentIcon = Mt; -exports.Button = me; -exports.ButtonGroup = Kt; -exports.ChevronDownIcon = mr; -exports.ChevronLeftIcon = Rt; -exports.ChevronUpIcon = fr; -exports.CloseIcon = Fe; -exports.CopyIcon = pr; -exports.DOC_EXPLORER_PLUGIN = de; -exports.DefaultValue = it; -exports.DeprecatedArgumentIcon = Pt; -exports.DeprecatedEnumValueIcon = qt; -exports.DeprecatedFieldIcon = Vt; -exports.DeprecationReason = ht; -exports.Dialog = wr; -exports.DialogRoot = Yt; -exports.Directive = cn; -exports.DirectiveIcon = It; -exports.DocExplorer = Ie; -exports.DocsFilledIcon = Ht; -exports.DocsIcon = Dt; -exports.DropdownMenu = ee; -exports.EditorContext = Ct; -exports.EditorContextProvider = En; -exports.EnumValueIcon = At; -exports.ExecuteButton = tt; -exports.ExecutionContext = lt; -exports.ExecutionContextProvider = qe; -exports.ExplorerContext = ut; -exports.ExplorerContextProvider = dt; -exports.ExplorerSection = G; -exports.FieldDocumentation = un; -exports.FieldIcon = Ot; -exports.FieldLink = hn; -exports.GraphiQLProvider = is; -exports.HISTORY_PLUGIN = Ye; -exports.HeaderEditor = Xe; -exports.History = ln; -exports.HistoryContext = ot; -exports.HistoryContextProvider = on; -exports.HistoryIcon = Ft; -exports.ImagePreview = Ae; -exports.ImplementsIcon = Bt; -exports.KeyboardShortcutIcon = gr; -exports.MagnifyingGlassIcon = Wt; -exports.MarkdownContent = K; -exports.MergeIcon = xr; -exports.PenIcon = _t; -exports.PlayIcon = Zt; -exports.PluginContext = ft; -exports.PluginContextProvider = fn; -exports.PlusIcon = Cr; -exports.PrettifyIcon = vr; -exports.QueryEditor = Ln; -exports.ReloadIcon = yr; -exports.ResponseEditor = jn; -exports.RootTypeIcon = $t; -exports.SchemaContext = at; -exports.SchemaContextProvider = ct; -exports.SchemaDocumentation = dn; -exports.Search = mt; -exports.SettingsIcon = br; -exports.Spinner = st; -exports.StarFilledIcon = Gt; -exports.StarIcon = Qt; -exports.StopIcon = zt; -exports.StorageContext = rt; -exports.StorageContextProvider = Tt; -exports.Tab = Lr; -exports.Tabs = sn; -exports.ToolbarButton = kn; -exports.ToolbarMenu = hs; -exports.Tooltip = J; -exports.TooltipRoot = en; -exports.TrashIcon = Ut; -exports.TypeDocumentation = mn; -exports.TypeIcon = ge; -exports.TypeLink = U; -exports.UnStyledButton = Q; -exports.VariableEditor = et; -exports.useAutoCompleteLeafs = He; -exports.useCopyQuery = pt; -exports.useDragResize = cs; -exports.useEditorContext = Z; -exports.useEditorState = Ge; -exports.useExecutionContext = we; -exports.useExplorerContext = te; -exports.useHeaderEditor = ce; -exports.useHeadersEditorState = Br; -exports.useHistoryContext = be; -exports.useMergeQuery = he; -exports.useOperationsEditorState = Or; -exports.useOptimisticState = Wr; -exports.usePluginContext = Ze; -exports.usePrettifyEditors = Se; -exports.useQueryEditor = ne; -exports.useResponseEditor = Oe; -exports.useSchemaContext = X; -exports.useStorageContext = se; -exports.useTheme = as; -exports.useVariableEditor = oe; -exports.useVariablesEditorState = Fr; + } else if (async) { + env.stack.push({ + async: true + }); + } + return value; +} +var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; +function __disposeResources(env) { + function fail(e) { + env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; + env.hasError = true; + } + function next() { + while (env.stack.length) { + var rec = env.stack.pop(); + try { + var result = rec.dispose && rec.dispose.call(rec.value); + if (rec.async) return Promise.resolve(result).then(next, function (e) { + fail(e); + return next(); + }); + } catch (e) { + fail(e); + } + } + if (env.hasError) throw env.error; + } + return next(); +} +var _default = exports["default"] = { + __extends, + __assign, + __rest, + __decorate, + __param, + __metadata, + __awaiter, + __generator, + __createBinding, + __exportStar, + __values, + __read, + __spread, + __spreadArrays, + __spreadArray, + __await, + __asyncGenerator, + __asyncDelegator, + __asyncValues, + __makeTemplateObject, + __importStar, + __importDefault, + __classPrivateFieldGet, + __classPrivateFieldSet, + __classPrivateFieldIn, + __addDisposableResource, + __disposeResources +}; /***/ }), -/***/ "../../graphiql-react/dist/info-addon.cjs.js": -/*!***************************************************!*\ - !*** ../../graphiql-react/dist/info-addon.cjs.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { +/***/ "../../../node_modules/uc.micro/build/index.cjs.js": +/*!*********************************************************!*\ + !*** ../../../node_modules/uc.micro/build/index.cjs.js ***! + \*********************************************************/ +/***/ (function(__unused_webpack_module, exports) { -var M = Object.defineProperty; -var i = (e, t) => M(e, "name", { - value: t, - configurable: !0 -}); -const r = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -r.CodeMirror.defineOption("info", !1, (e, t, n) => { - if (n && n !== r.CodeMirror.Init) { - const o = e.state.info.onMouseOver; - r.CodeMirror.off(e.getWrapperElement(), "mouseover", o), clearTimeout(e.state.info.hoverTimeout), delete e.state.info; - } - if (t) { - const o = e.state.info = g(t); - o.onMouseOver = h.bind(null, e), r.CodeMirror.on(e.getWrapperElement(), "mouseover", o.onMouseOver); +var regex$5 = /[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; +var regex$4 = /[\0-\x1F\x7F-\x9F]/; +var regex$3 = /[\xAD\u0600-\u0605\u061C\u06DD\u070F\u0890\u0891\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC3F]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/; +var regex$2 = /[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\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\u1B7D\u1B7E\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-\u2E5D\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]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/; +var regex$1 = /[\$\+<->\^`\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFF\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uAB6A\uAB6B\uFB29\uFBB2-\uFBC2\uFD40-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC5\uDECE-\uDEDB\uDEE0-\uDEE8\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFCA]/; +var regex = /[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/; +exports.Any = regex$5; +exports.Cc = regex$4; +exports.Cf = regex$3; +exports.P = regex$2; +exports.S = regex$1; +exports.Z = regex; + +/***/ }), + +/***/ "../../../node_modules/use-callback-ref/dist/es2015/assignRef.js": +/*!***********************************************************************!*\ + !*** ../../../node_modules/use-callback-ref/dist/es2015/assignRef.js ***! + \***********************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.assignRef = assignRef; +/** + * Assigns a value for a given ref, no matter of the ref format + * @param {RefObject} ref - a callback function or ref object + * @param value - a new value + * + * @see https://github.com/theKashey/use-callback-ref#assignref + * @example + * const refObject = useRef(); + * const refFn = (ref) => {....} + * + * assignRef(refObject, "refValue"); + * assignRef(refFn, "refValue"); + */ +function assignRef(ref, value) { + if (typeof ref === 'function') { + ref(value); + } else if (ref) { + ref.current = value; } -}); -function g(e) { - return { - options: e instanceof Function ? { - render: e - } : e === !0 ? {} : e - }; + return ref; } -i(g, "createState"); -function T(e) { - const { - options: t - } = e.state.info; - return (t == null ? void 0 : t.hoverTime) || 500; -} -i(T, "getHoverTime"); -function h(e, t) { - const n = e.state.info, - o = t.target || t.srcElement; - if (!(o instanceof HTMLElement) || o.nodeName !== "SPAN" || n.hoverTimeout !== void 0) return; - const s = o.getBoundingClientRect(), - u = i(function () { - clearTimeout(n.hoverTimeout), n.hoverTimeout = setTimeout(p, d); - }, "onMouseMove"), - f = i(function () { - r.CodeMirror.off(document, "mousemove", u), r.CodeMirror.off(e.getWrapperElement(), "mouseout", f), clearTimeout(n.hoverTimeout), n.hoverTimeout = void 0; - }, "onMouseOut"), - p = i(function () { - r.CodeMirror.off(document, "mousemove", u), r.CodeMirror.off(e.getWrapperElement(), "mouseout", f), n.hoverTimeout = void 0, C(e, s); - }, "onHover"), - d = T(e); - n.hoverTimeout = setTimeout(p, d), r.CodeMirror.on(document, "mousemove", u), r.CodeMirror.on(e.getWrapperElement(), "mouseout", f); -} -i(h, "onMouseOver"); -function C(e, t) { - const n = e.coordsChar({ - left: (t.left + t.right) / 2, - top: (t.top + t.bottom) / 2 - }, "window"), - o = e.state.info, - { - options: s - } = o, - u = s.render || e.getHelper(n, "info"); - if (u) { - const f = e.getTokenAt(n, !0); - if (f) { - const p = u(f, s, e, n); - p && w(e, t, p); - } - } -} -i(C, "onMouseHover"); -function w(e, t, n) { - const o = document.createElement("div"); - o.className = "CodeMirror-info", o.append(n), document.body.append(o); - const s = o.getBoundingClientRect(), - u = window.getComputedStyle(o), - f = s.right - s.left + parseFloat(u.marginLeft) + parseFloat(u.marginRight), - p = s.bottom - s.top + parseFloat(u.marginTop) + parseFloat(u.marginBottom); - let d = t.bottom; - p > window.innerHeight - t.bottom - 15 && t.top > window.innerHeight - t.bottom && (d = t.top - p), d < 0 && (d = t.bottom); - let m = Math.max(0, window.innerWidth - f - 15); - m > t.left && (m = t.left), o.style.opacity = "1", o.style.top = d + "px", o.style.left = m + "px"; - let l; - const c = i(function () { - clearTimeout(l); - }, "onMouseOverPopup"), - a = i(function () { - clearTimeout(l), l = setTimeout(v, 200); - }, "onMouseOut"), - v = i(function () { - r.CodeMirror.off(o, "mouseover", c), r.CodeMirror.off(o, "mouseout", a), r.CodeMirror.off(e.getWrapperElement(), "mouseout", a), o.style.opacity ? (o.style.opacity = "0", setTimeout(() => { - o.parentNode && o.remove(); - }, 600)) : o.parentNode && o.remove(); - }, "hidePopup"); - r.CodeMirror.on(o, "mouseover", c), r.CodeMirror.on(o, "mouseout", a), r.CodeMirror.on(e.getWrapperElement(), "mouseout", a); -} -i(w, "showPopup"); /***/ }), -/***/ "../../graphiql-react/dist/info.cjs.js": -/*!*********************************************!*\ - !*** ../../graphiql-react/dist/info.cjs.js ***! - \*********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { +/***/ "../../../node_modules/use-callback-ref/dist/es2015/createRef.js": +/*!***********************************************************************!*\ + !*** ../../../node_modules/use-callback-ref/dist/es2015/createRef.js ***! + \***********************************************************************/ +/***/ (function(__unused_webpack_module, exports) { -var v = Object.defineProperty; -var l = (a, e) => v(a, "name", { - value: e, - configurable: !0 -}); -const s = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"), - D = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - m = __webpack_require__(/*! ./SchemaReference.cjs.js */ "../../graphiql-react/dist/SchemaReference.cjs.js"); -__webpack_require__(/*! ./info-addon.cjs.js */ "../../graphiql-react/dist/info-addon.cjs.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -__webpack_require__(/*! ./forEachState.cjs.js */ "../../graphiql-react/dist/forEachState.cjs.js"); -D.CodeMirror.registerHelper("info", "graphql", (a, e) => { - if (!e.schema || !a.state) return; - const { - kind: c, - step: n - } = a.state, - r = m.getTypeInfo(e.schema, a.state); - if (c === "Field" && n === 0 && r.fieldDef || c === "AliasedField" && n === 2 && r.fieldDef) { - const i = document.createElement("div"); - i.className = "CodeMirror-info-header", E(i, r, e); - const d = document.createElement("div"); - return d.append(i), o(d, e, r.fieldDef), d; - } - if (c === "Directive" && n === 1 && r.directiveDef) { - const i = document.createElement("div"); - i.className = "CodeMirror-info-header", h(i, r, e); - const d = document.createElement("div"); - return d.append(i), o(d, e, r.directiveDef), d; - } - if (c === "Argument" && n === 0 && r.argDef) { - const i = document.createElement("div"); - i.className = "CodeMirror-info-header", T(i, r, e); - const d = document.createElement("div"); - return d.append(i), o(d, e, r.argDef), d; - } - if (c === "EnumValue" && r.enumValue && r.enumValue.description) { - const i = document.createElement("div"); - i.className = "CodeMirror-info-header", g(i, r, e); - const d = document.createElement("div"); - return d.append(i), o(d, e, r.enumValue), d; - } - if (c === "NamedType" && r.type && r.type.description) { - const i = document.createElement("div"); - i.className = "CodeMirror-info-header", u(i, r, e, r.type); - const d = document.createElement("div"); - return d.append(i), o(d, e, r.type), d; - } -}); -function E(a, e, c) { - N(a, e, c), p(a, e, c, e.type); -} -l(E, "renderField"); -function N(a, e, c) { - var n; - const r = ((n = e.fieldDef) === null || n === void 0 ? void 0 : n.name) || ""; - t(a, r, "field-name", c, m.getFieldReference(e)); -} -l(N, "renderQualifiedField"); -function h(a, e, c) { - var n; - const r = "@" + (((n = e.directiveDef) === null || n === void 0 ? void 0 : n.name) || ""); - t(a, r, "directive-name", c, m.getDirectiveReference(e)); -} -l(h, "renderDirective"); -function T(a, e, c) { - var n; - const r = ((n = e.argDef) === null || n === void 0 ? void 0 : n.name) || ""; - t(a, r, "arg-name", c, m.getArgumentReference(e)), p(a, e, c, e.inputType); -} -l(T, "renderArg"); -function g(a, e, c) { - var n; - const r = ((n = e.enumValue) === null || n === void 0 ? void 0 : n.name) || ""; - u(a, e, c, e.inputType), t(a, "."), t(a, r, "enum-value", c, m.getEnumValueReference(e)); -} -l(g, "renderEnumValue"); -function p(a, e, c, n) { - const r = document.createElement("span"); - r.className = "type-name-pill", n instanceof s.GraphQLNonNull ? (u(r, e, c, n.ofType), t(r, "!")) : n instanceof s.GraphQLList ? (t(r, "["), u(r, e, c, n.ofType), t(r, "]")) : t(r, (n == null ? void 0 : n.name) || "", "type-name", c, m.getTypeReference(e, n)), a.append(r); -} -l(p, "renderTypeAnnotation"); -function u(a, e, c, n) { - n instanceof s.GraphQLNonNull ? (u(a, e, c, n.ofType), t(a, "!")) : n instanceof s.GraphQLList ? (t(a, "["), u(a, e, c, n.ofType), t(a, "]")) : t(a, (n == null ? void 0 : n.name) || "", "type-name", c, m.getTypeReference(e, n)); -} -l(u, "renderType"); -function o(a, e, c) { - const { - description: n - } = c; - if (n) { - const r = document.createElement("div"); - r.className = "info-description", e.renderDescription ? r.innerHTML = e.renderDescription(n) : r.append(document.createTextNode(n)), a.append(r); - } - L(a, e, c); -} -l(o, "renderDescription"); -function L(a, e, c) { - const n = c.deprecationReason; - if (n) { - const r = document.createElement("div"); - r.className = "info-deprecation", a.append(r); - const i = document.createElement("span"); - i.className = "info-deprecation-label", i.append(document.createTextNode("Deprecated")), r.append(i); - const d = document.createElement("div"); - d.className = "info-deprecation-reason", e.renderDescription ? d.innerHTML = e.renderDescription(n) : d.append(document.createTextNode(n)), r.append(d); - } -} -l(L, "renderDeprecation"); -function t(a, e) { - let c = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ""; - let n = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { - onClick: null +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.createCallbackRef = createCallbackRef; +/** + * creates a Ref object with on change callback + * @param callback + * @returns {RefObject} + * + * @see {@link useCallbackRef} + * @see https://reactjs.org/docs/refs-and-the-dom.html#creating-refs + */ +function createCallbackRef(callback) { + var current = null; + return { + get current() { + return current; + }, + set current(value) { + var last = current; + if (last !== value) { + current = value; + callback(value, last); + } + } }; - let r = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; - if (c) { - const { - onClick: i - } = n; - let d; - i ? (d = document.createElement("a"), d.href = "javascript:void 0", d.addEventListener("click", f => { - f.preventDefault(), i(r, f); - })) : d = document.createElement("span"), d.className = c, d.append(document.createTextNode(e)), a.append(d); - } else a.append(document.createTextNode(e)); } -l(t, "text"); /***/ }), -/***/ "../../graphiql-react/dist/javascript.cjs.js": -/*!***************************************************!*\ - !*** ../../graphiql-react/dist/javascript.cjs.js ***! - \***************************************************/ +/***/ "../../../node_modules/use-callback-ref/dist/es2015/index.js": +/*!*******************************************************************!*\ + !*** ../../../node_modules/use-callback-ref/dist/es2015/index.js ***! + \*******************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -var ve = Object.defineProperty; -var f = (F, W) => ve(F, "name", { - value: W, - configurable: !0 -}); -const Dr = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function ge(F, W) { - for (var w = 0; w < W.length; w++) { - const M = W[w]; - if (typeof M != "string" && !Array.isArray(M)) { - for (const h in M) if (h !== "default" && !(h in F)) { - const A = Object.getOwnPropertyDescriptor(M, h); - A && Object.defineProperty(F, h, A.get ? A : { - enumerable: !0, - get: () => M[h] - }); - } - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "assignRef", ({ + enumerable: true, + get: function () { + return _assignRef.assignRef; } - return Object.freeze(Object.defineProperty(F, Symbol.toStringTag, { - value: "Module" - })); -} -f(ge, "_mergeNamespaces"); -var ye = { - exports: {} -}; -(function (F, W) { - (function (w) { - w(Dr.requireCodemirror()); - })(function (w) { - w.defineMode("javascript", function (M, h) { - var A = M.indentUnit, - vr = h.statementIndent, - rr = h.jsonld, - O = h.json || rr, - gr = h.trackScope !== !1, - k = h.typescript, - er = h.wordCharacters || /[\w$\xa1-\uffff]/, - yr = function () { - function r(y) { - return { - type: y, - style: "keyword" - }; - } - f(r, "kw"); - var e = r("keyword a"), - t = r("keyword b"), - a = r("keyword c"), - o = r("keyword d"), - d = r("operator"), - p = { - type: "atom", - style: "atom" - }; - return { - if: r("if"), - while: e, - with: e, - else: t, - do: t, - try: t, - finally: t, - return: o, - break: o, - continue: o, - new: r("new"), - delete: a, - void: a, - throw: a, - debugger: r("debugger"), - var: r("var"), - const: r("var"), - let: r("var"), - function: r("function"), - catch: r("catch"), - for: r("for"), - switch: r("switch"), - case: r("case"), - default: r("default"), - in: d, - typeof: d, - instanceof: d, - true: p, - false: p, - null: p, - undefined: p, - NaN: p, - Infinity: p, - this: r("this"), - class: r("class"), - super: r("atom"), - yield: a, - export: r("export"), - import: r("import"), - extends: a, - await: a - }; - }(), - jr = /[+\-*&%=<>!?|~^@]/, - Lr = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; - function Qr(r) { - for (var e = !1, t, a = !1; (t = r.next()) != null;) { - if (!e) { - if (t == "/" && !a) return; - t == "[" ? a = !0 : a && t == "]" && (a = !1); - } - e = !e && t == "\\"; - } - } - f(Qr, "readRegexp"); - var K, nr; - function x(r, e, t) { - return K = r, nr = t, e; - } - f(x, "ret"); - function $(r, e) { - var t = r.next(); - if (t == '"' || t == "'") return e.tokenize = Rr(t), e.tokenize(r, e); - if (t == "." && r.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/)) return x("number", "number"); - if (t == "." && r.match("..")) return x("spread", "meta"); - if (/[\[\]{}\(\),;\:\.]/.test(t)) return x(t); - if (t == "=" && r.eat(">")) return x("=>", "operator"); - if (t == "0" && r.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) return x("number", "number"); - if (/\d/.test(t)) return r.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/), x("number", "number"); - if (t == "/") return r.eat("*") ? (e.tokenize = tr, tr(r, e)) : r.eat("/") ? (r.skipToEnd(), x("comment", "comment")) : Fr(r, e, 1) ? (Qr(r), r.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/), x("regexp", "string-2")) : (r.eat("="), x("operator", "operator", r.current())); - if (t == "`") return e.tokenize = H, H(r, e); - if (t == "#" && r.peek() == "!") return r.skipToEnd(), x("meta", "meta"); - if (t == "#" && r.eatWhile(er)) return x("variable", "property"); - if (t == "<" && r.match("!--") || t == "-" && r.match("->") && !/\S/.test(r.string.slice(0, r.start))) return r.skipToEnd(), x("comment", "comment"); - if (jr.test(t)) return (t != ">" || !e.lexical || e.lexical.type != ">") && (r.eat("=") ? (t == "!" || t == "=") && r.eat("=") : /[<>*+\-|&?]/.test(t) && (r.eat(t), t == ">" && r.eat(t))), t == "?" && r.eat(".") ? x(".") : x("operator", "operator", r.current()); - if (er.test(t)) { - r.eatWhile(er); - var a = r.current(); - if (e.lastType != ".") { - if (yr.propertyIsEnumerable(a)) { - var o = yr[a]; - return x(o.type, o.style, a); - } - if (a == "async" && r.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/, !1)) return x("async", "keyword", a); - } - return x("variable", "variable", a); - } - } - f($, "tokenBase"); - function Rr(r) { - return function (e, t) { - var a = !1, - o; - if (rr && e.peek() == "@" && e.match(Lr)) return t.tokenize = $, x("jsonld-keyword", "meta"); - for (; (o = e.next()) != null && !(o == r && !a);) a = !a && o == "\\"; - return a || (t.tokenize = $), x("string", "string"); - }; - } - f(Rr, "tokenString"); - function tr(r, e) { - for (var t = !1, a; a = r.next();) { - if (a == "/" && t) { - e.tokenize = $; - break; - } - t = a == "*"; - } - return x("comment", "comment"); - } - f(tr, "tokenComment"); - function H(r, e) { - for (var t = !1, a; (a = r.next()) != null;) { - if (!t && (a == "`" || a == "$" && r.eat("{"))) { - e.tokenize = $; - break; - } - t = !t && a == "\\"; - } - return x("quasi", "string-2", r.current()); - } - f(H, "tokenQuasi"); - var Ur = "([{}])"; - function dr(r, e) { - e.fatArrowAt && (e.fatArrowAt = null); - var t = r.string.indexOf("=>", r.start); - if (!(t < 0)) { - if (k) { - var a = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(r.string.slice(r.start, t)); - a && (t = a.index); - } - for (var o = 0, d = !1, p = t - 1; p >= 0; --p) { - var y = r.string.charAt(p), - V = Ur.indexOf(y); - if (V >= 0 && V < 3) { - if (!o) { - ++p; - break; - } - if (--o == 0) { - y == "(" && (d = !0); - break; - } - } else if (V >= 3 && V < 6) ++o;else if (er.test(y)) d = !0;else if (/["'\/`]/.test(y)) for (;; --p) { - if (p == 0) return; - var he = r.string.charAt(p - 1); - if (he == y && r.string.charAt(p - 2) != "\\") { - p--; - break; - } - } else if (d && !o) { - ++p; - break; - } - } - d && !o && (e.fatArrowAt = p); - } - } - f(dr, "findFatArrow"); - var Wr = { - atom: !0, - number: !0, - variable: !0, - string: !0, - regexp: !0, - this: !0, - import: !0, - "jsonld-keyword": !0 - }; - function Er(r, e, t, a, o, d) { - this.indented = r, this.column = e, this.type = t, this.prev = o, this.info = d, a != null && (this.align = a); - } - f(Er, "JSLexical"); - function Kr(r, e) { - if (!gr) return !1; - for (var t = r.localVars; t; t = t.next) if (t.name == e) return !0; - for (var a = r.context; a; a = a.prev) for (var t = a.vars; t; t = t.next) if (t.name == e) return !0; - } - f(Kr, "inScope"); - function Tr(r, e, t, a, o) { - var d = r.cc; - for (i.state = r, i.stream = o, i.marked = null, i.cc = d, i.style = e, r.lexical.hasOwnProperty("align") || (r.lexical.align = !0);;) { - var p = d.length ? d.pop() : O ? b : v; - if (p(t, a)) { - for (; d.length && d[d.length - 1].lex;) d.pop()(); - return i.marked ? i.marked : t == "variable" && Kr(r, a) ? "variable-2" : e; - } - } - } - f(Tr, "parseJS"); - var i = { - state: null, - column: null, - marked: null, - cc: null - }; - function s() { - for (var r = arguments.length - 1; r >= 0; r--) i.cc.push(arguments[r]); - } - f(s, "pass"); - function n() { - return s.apply(null, arguments), !0; - } - f(n, "cont"); - function mr(r, e) { - for (var t = e; t; t = t.next) if (t.name == r) return !0; - return !1; - } - f(mr, "inList"); - function D(r) { - var e = i.state; - if (i.marked = "def", !!gr) { - if (e.context) { - if (e.lexical.info == "var" && e.context && e.context.block) { - var t = Ar(r, e.context); - if (t != null) { - e.context = t; - return; - } - } else if (!mr(r, e.localVars)) { - e.localVars = new X(r, e.localVars); - return; - } - } - h.globalVars && !mr(r, e.globalVars) && (e.globalVars = new X(r, e.globalVars)); - } - } - f(D, "register"); - function Ar(r, e) { - if (e) { - if (e.block) { - var t = Ar(r, e.prev); - return t ? t == e.prev ? e : new G(t, e.vars, !0) : null; - } else return mr(r, e.vars) ? e : new G(e.prev, new X(r, e.vars), !1); - } else return null; - } - f(Ar, "registerVarScoped"); - function ir(r) { - return r == "public" || r == "private" || r == "protected" || r == "abstract" || r == "readonly"; - } - f(ir, "isModifier"); - function G(r, e, t) { - this.prev = r, this.vars = e, this.block = t; - } - f(G, "Context"); - function X(r, e) { - this.name = r, this.next = e; - } - f(X, "Var"); - var Hr = new X("this", new X("arguments", null)); - function q() { - i.state.context = new G(i.state.context, i.state.localVars, !1), i.state.localVars = Hr; - } - f(q, "pushcontext"); - function fr() { - i.state.context = new G(i.state.context, i.state.localVars, !0), i.state.localVars = null; - } - f(fr, "pushblockcontext"), q.lex = fr.lex = !0; - function E() { - i.state.localVars = i.state.context.vars, i.state.context = i.state.context.prev; - } - f(E, "popcontext"), E.lex = !0; - function c(r, e) { - var t = f(function () { - var a = i.state, - o = a.indented; - if (a.lexical.type == "stat") o = a.lexical.indented;else for (var d = a.lexical; d && d.type == ")" && d.align; d = d.prev) o = d.indented; - a.lexical = new Er(o, i.stream.column(), r, null, a.lexical, e); - }, "result"); - return t.lex = !0, t; - } - f(c, "pushlex"); - function u() { - var r = i.state; - r.lexical.prev && (r.lexical.type == ")" && (r.indented = r.lexical.indented), r.lexical = r.lexical.prev); - } - f(u, "poplex"), u.lex = !0; - function l(r) { - function e(t) { - return t == r ? n() : r == ";" || t == "}" || t == ")" || t == "]" ? s() : n(e); - } - return f(e, "exp"), e; - } - f(l, "expect"); - function v(r, e) { - return r == "var" ? n(c("vardef", e), xr, l(";"), u) : r == "keyword a" ? n(c("form"), pr, v, u) : r == "keyword b" ? n(c("form"), v, u) : r == "keyword d" ? i.stream.match(/^\s*$/, !1) ? n() : n(c("stat"), J, l(";"), u) : r == "debugger" ? n(l(";")) : r == "{" ? n(c("}"), fr, or, u, E) : r == ";" ? n() : r == "if" ? (i.state.lexical.info == "else" && i.state.cc[i.state.cc.length - 1] == u && i.state.cc.pop()(), n(c("form"), pr, v, u, Mr)) : r == "function" ? n(z) : r == "for" ? n(c("form"), fr, Or, v, E, u) : r == "class" || k && e == "interface" ? (i.marked = "keyword", n(c("form", r == "class" ? r : e), qr, u)) : r == "variable" ? k && e == "declare" ? (i.marked = "keyword", n(v)) : k && (e == "module" || e == "enum" || e == "type") && i.stream.match(/^\s*\w/, !1) ? (i.marked = "keyword", e == "enum" ? n(Pr) : e == "type" ? n($r, l("operator"), m, l(";")) : n(c("form"), T, l("{"), c("}"), or, u, u)) : k && e == "namespace" ? (i.marked = "keyword", n(c("form"), b, v, u)) : k && e == "abstract" ? (i.marked = "keyword", n(v)) : n(c("stat"), re) : r == "switch" ? n(c("form"), pr, l("{"), c("}", "switch"), fr, or, u, u, E) : r == "case" ? n(b, l(":")) : r == "default" ? n(l(":")) : r == "catch" ? n(c("form"), q, Gr, v, u, E) : r == "export" ? n(c("stat"), me, u) : r == "import" ? n(c("stat"), pe, u) : r == "async" ? n(v) : e == "@" ? n(b, v) : s(c("stat"), b, l(";"), u); - } - f(v, "statement"); - function Gr(r) { - if (r == "(") return n(P, l(")")); - } - f(Gr, "maybeCatchBinding"); - function b(r, e) { - return Vr(r, e, !1); - } - f(b, "expression"); - function j(r, e) { - return Vr(r, e, !0); - } - f(j, "expressionNoComma"); - function pr(r) { - return r != "(" ? s() : n(c(")"), J, l(")"), u); - } - f(pr, "parenExpr"); - function Vr(r, e, t) { - if (i.state.fatArrowAt == i.stream.start) { - var a = t ? Sr : Ir; - if (r == "(") return n(q, c(")"), g(P, ")"), u, l("=>"), a, E); - if (r == "variable") return s(q, T, l("=>"), a, E); - } - var o = t ? L : N; - return Wr.hasOwnProperty(r) ? n(o) : r == "function" ? n(z, o) : r == "class" || k && e == "interface" ? (i.marked = "keyword", n(c("form"), de, u)) : r == "keyword c" || r == "async" ? n(t ? j : b) : r == "(" ? n(c(")"), J, l(")"), u, o) : r == "operator" || r == "spread" ? n(t ? j : b) : r == "[" ? n(c("]"), be, u, o) : r == "{" ? Y(ur, "}", null, o) : r == "quasi" ? s(ar, o) : r == "new" ? n(Yr(t)) : n(); - } - f(Vr, "expressionInner"); - function J(r) { - return r.match(/[;\}\)\],]/) ? s() : s(b); - } - f(J, "maybeexpression"); - function N(r, e) { - return r == "," ? n(J) : L(r, e, !1); - } - f(N, "maybeoperatorComma"); - function L(r, e, t) { - var a = t == !1 ? N : L, - o = t == !1 ? b : j; - if (r == "=>") return n(q, t ? Sr : Ir, E); - if (r == "operator") return /\+\+|--/.test(e) || k && e == "!" ? n(a) : k && e == "<" && i.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/, !1) ? n(c(">"), g(m, ">"), u, a) : e == "?" ? n(b, l(":"), o) : n(o); - if (r == "quasi") return s(ar, a); - if (r != ";") { - if (r == "(") return Y(j, ")", "call", a); - if (r == ".") return n(ee, a); - if (r == "[") return n(c("]"), J, l("]"), u, a); - if (k && e == "as") return i.marked = "keyword", n(m, a); - if (r == "regexp") return i.state.lastType = i.marked = "operator", i.stream.backUp(i.stream.pos - i.stream.start - 1), n(o); - } - } - f(L, "maybeoperatorNoComma"); - function ar(r, e) { - return r != "quasi" ? s() : e.slice(e.length - 2) != "${" ? n(ar) : n(J, Xr); - } - f(ar, "quasi"); - function Xr(r) { - if (r == "}") return i.marked = "string-2", i.state.tokenize = H, n(ar); - } - f(Xr, "continueQuasi"); - function Ir(r) { - return dr(i.stream, i.state), s(r == "{" ? v : b); - } - f(Ir, "arrowBody"); - function Sr(r) { - return dr(i.stream, i.state), s(r == "{" ? v : j); - } - f(Sr, "arrowBodyNoComma"); - function Yr(r) { - return function (e) { - return e == "." ? n(r ? Cr : Zr) : e == "variable" && k ? n(ue, r ? L : N) : s(r ? j : b); - }; - } - f(Yr, "maybeTarget"); - function Zr(r, e) { - if (e == "target") return i.marked = "keyword", n(N); - } - f(Zr, "target"); - function Cr(r, e) { - if (e == "target") return i.marked = "keyword", n(L); - } - f(Cr, "targetNoComma"); - function re(r) { - return r == ":" ? n(u, v) : s(N, l(";"), u); - } - f(re, "maybelabel"); - function ee(r) { - if (r == "variable") return i.marked = "property", n(); - } - f(ee, "property"); - function ur(r, e) { - if (r == "async") return i.marked = "property", n(ur); - if (r == "variable" || i.style == "keyword") { - if (i.marked = "property", e == "get" || e == "set") return n(ne); - var t; - return k && i.state.fatArrowAt == i.stream.start && (t = i.stream.match(/^\s*:\s*/, !1)) && (i.state.fatArrowAt = i.stream.pos + t[0].length), n(B); - } else { - if (r == "number" || r == "string") return i.marked = rr ? "property" : i.style + " property", n(B); - if (r == "jsonld-keyword") return n(B); - if (k && ir(e)) return i.marked = "keyword", n(ur); - if (r == "[") return n(b, Q, l("]"), B); - if (r == "spread") return n(j, B); - if (e == "*") return i.marked = "keyword", n(ur); - if (r == ":") return s(B); - } - } - f(ur, "objprop"); - function ne(r) { - return r != "variable" ? s(B) : (i.marked = "property", n(z)); - } - f(ne, "getterSetter"); - function B(r) { - if (r == ":") return n(j); - if (r == "(") return s(z); - } - f(B, "afterprop"); - function g(r, e, t) { - function a(o, d) { - if (t ? t.indexOf(o) > -1 : o == ",") { - var p = i.state.lexical; - return p.info == "call" && (p.pos = (p.pos || 0) + 1), n(function (y, V) { - return y == e || V == e ? s() : s(r); - }, a); - } - return o == e || d == e ? n() : t && t.indexOf(";") > -1 ? s(r) : n(l(e)); - } - return f(a, "proceed"), function (o, d) { - return o == e || d == e ? n() : s(r, a); - }; - } - f(g, "commasep"); - function Y(r, e, t) { - for (var a = 3; a < arguments.length; a++) i.cc.push(arguments[a]); - return n(c(e, t), g(r, e), u); - } - f(Y, "contCommasep"); - function or(r) { - return r == "}" ? n() : s(v, or); - } - f(or, "block"); - function Q(r, e) { - if (k) { - if (r == ":") return n(m); - if (e == "?") return n(Q); - } - } - f(Q, "maybetype"); - function te(r, e) { - if (k && (r == ":" || e == "in")) return n(m); - } - f(te, "maybetypeOrIn"); - function _r(r) { - if (k && r == ":") return i.stream.match(/^\s*\w+\s+is\b/, !1) ? n(b, ie, m) : n(m); - } - f(_r, "mayberettype"); - function ie(r, e) { - if (e == "is") return i.marked = "keyword", n(); - } - f(ie, "isKW"); - function m(r, e) { - if (e == "keyof" || e == "typeof" || e == "infer" || e == "readonly") return i.marked = "keyword", n(e == "typeof" ? j : m); - if (r == "variable" || e == "void") return i.marked = "type", n(I); - if (e == "|" || e == "&") return n(m); - if (r == "string" || r == "number" || r == "atom") return n(I); - if (r == "[") return n(c("]"), g(m, "]", ","), u, I); - if (r == "{") return n(c("}"), kr, u, I); - if (r == "(") return n(g(wr, ")"), fe, I); - if (r == "<") return n(g(m, ">"), m); - if (r == "quasi") return s(br, I); - } - f(m, "typeexpr"); - function fe(r) { - if (r == "=>") return n(m); - } - f(fe, "maybeReturnType"); - function kr(r) { - return r.match(/[\}\)\]]/) ? n() : r == "," || r == ";" ? n(kr) : s(Z, kr); - } - f(kr, "typeprops"); - function Z(r, e) { - if (r == "variable" || i.style == "keyword") return i.marked = "property", n(Z); - if (e == "?" || r == "number" || r == "string") return n(Z); - if (r == ":") return n(m); - if (r == "[") return n(l("variable"), te, l("]"), Z); - if (r == "(") return s(U, Z); - if (!r.match(/[;\}\)\],]/)) return n(); - } - f(Z, "typeprop"); - function br(r, e) { - return r != "quasi" ? s() : e.slice(e.length - 2) != "${" ? n(br) : n(m, ae); - } - f(br, "quasiType"); - function ae(r) { - if (r == "}") return i.marked = "string-2", i.state.tokenize = H, n(br); - } - f(ae, "continueQuasiType"); - function wr(r, e) { - return r == "variable" && i.stream.match(/^\s*[?:]/, !1) || e == "?" ? n(wr) : r == ":" ? n(m) : r == "spread" ? n(wr) : s(m); - } - f(wr, "typearg"); - function I(r, e) { - if (e == "<") return n(c(">"), g(m, ">"), u, I); - if (e == "|" || r == "." || e == "&") return n(m); - if (r == "[") return n(m, l("]"), I); - if (e == "extends" || e == "implements") return i.marked = "keyword", n(m); - if (e == "?") return n(m, l(":"), m); - } - f(I, "afterType"); - function ue(r, e) { - if (e == "<") return n(c(">"), g(m, ">"), u, I); - } - f(ue, "maybeTypeArgs"); - function sr() { - return s(m, oe); - } - f(sr, "typeparam"); - function oe(r, e) { - if (e == "=") return n(m); - } - f(oe, "maybeTypeDefault"); - function xr(r, e) { - return e == "enum" ? (i.marked = "keyword", n(Pr)) : s(T, Q, _, ce); - } - f(xr, "vardef"); - function T(r, e) { - if (k && ir(e)) return i.marked = "keyword", n(T); - if (r == "variable") return D(e), n(); - if (r == "spread") return n(T); - if (r == "[") return Y(se, "]"); - if (r == "{") return Y(zr, "}"); - } - f(T, "pattern"); - function zr(r, e) { - return r == "variable" && !i.stream.match(/^\s*:/, !1) ? (D(e), n(_)) : (r == "variable" && (i.marked = "property"), r == "spread" ? n(T) : r == "}" ? s() : r == "[" ? n(b, l("]"), l(":"), zr) : n(l(":"), T, _)); - } - f(zr, "proppattern"); - function se() { - return s(T, _); - } - f(se, "eltpattern"); - function _(r, e) { - if (e == "=") return n(j); - } - f(_, "maybeAssign"); - function ce(r) { - if (r == ",") return n(xr); - } - f(ce, "vardefCont"); - function Mr(r, e) { - if (r == "keyword b" && e == "else") return n(c("form", "else"), v, u); - } - f(Mr, "maybeelse"); - function Or(r, e) { - if (e == "await") return n(Or); - if (r == "(") return n(c(")"), le, u); - } - f(Or, "forspec"); - function le(r) { - return r == "var" ? n(xr, R) : r == "variable" ? n(R) : s(R); - } - f(le, "forspec1"); - function R(r, e) { - return r == ")" ? n() : r == ";" ? n(R) : e == "in" || e == "of" ? (i.marked = "keyword", n(b, R)) : s(b, R); - } - f(R, "forspec2"); - function z(r, e) { - if (e == "*") return i.marked = "keyword", n(z); - if (r == "variable") return D(e), n(z); - if (r == "(") return n(q, c(")"), g(P, ")"), u, _r, v, E); - if (k && e == "<") return n(c(">"), g(sr, ">"), u, z); - } - f(z, "functiondef"); - function U(r, e) { - if (e == "*") return i.marked = "keyword", n(U); - if (r == "variable") return D(e), n(U); - if (r == "(") return n(q, c(")"), g(P, ")"), u, _r, E); - if (k && e == "<") return n(c(">"), g(sr, ">"), u, U); - } - f(U, "functiondecl"); - function $r(r, e) { - if (r == "keyword" || r == "variable") return i.marked = "type", n($r); - if (e == "<") return n(c(">"), g(sr, ">"), u); - } - f($r, "typename"); - function P(r, e) { - return e == "@" && n(b, P), r == "spread" ? n(P) : k && ir(e) ? (i.marked = "keyword", n(P)) : k && r == "this" ? n(Q, _) : s(T, Q, _); - } - f(P, "funarg"); - function de(r, e) { - return r == "variable" ? qr(r, e) : cr(r, e); - } - f(de, "classExpression"); - function qr(r, e) { - if (r == "variable") return D(e), n(cr); - } - f(qr, "className"); - function cr(r, e) { - if (e == "<") return n(c(">"), g(sr, ">"), u, cr); - if (e == "extends" || e == "implements" || k && r == ",") return e == "implements" && (i.marked = "keyword"), n(k ? m : b, cr); - if (r == "{") return n(c("}"), S, u); - } - f(cr, "classNameAfter"); - function S(r, e) { - if (r == "async" || r == "variable" && (e == "static" || e == "get" || e == "set" || k && ir(e)) && i.stream.match(/^\s+[\w$\xa1-\uffff]/, !1)) return i.marked = "keyword", n(S); - if (r == "variable" || i.style == "keyword") return i.marked = "property", n(C, S); - if (r == "number" || r == "string") return n(C, S); - if (r == "[") return n(b, Q, l("]"), C, S); - if (e == "*") return i.marked = "keyword", n(S); - if (k && r == "(") return s(U, S); - if (r == ";" || r == ",") return n(S); - if (r == "}") return n(); - if (e == "@") return n(b, S); - } - f(S, "classBody"); - function C(r, e) { - if (e == "!" || e == "?") return n(C); - if (r == ":") return n(m, _); - if (e == "=") return n(j); - var t = i.state.lexical.prev, - a = t && t.info == "interface"; - return s(a ? U : z); - } - f(C, "classfield"); - function me(r, e) { - return e == "*" ? (i.marked = "keyword", n(hr, l(";"))) : e == "default" ? (i.marked = "keyword", n(b, l(";"))) : r == "{" ? n(g(Nr, "}"), hr, l(";")) : s(v); - } - f(me, "afterExport"); - function Nr(r, e) { - if (e == "as") return i.marked = "keyword", n(l("variable")); - if (r == "variable") return s(j, Nr); - } - f(Nr, "exportField"); - function pe(r) { - return r == "string" ? n() : r == "(" ? s(b) : r == "." ? s(N) : s(lr, Br, hr); - } - f(pe, "afterImport"); - function lr(r, e) { - return r == "{" ? Y(lr, "}") : (r == "variable" && D(e), e == "*" && (i.marked = "keyword"), n(ke)); - } - f(lr, "importSpec"); - function Br(r) { - if (r == ",") return n(lr, Br); - } - f(Br, "maybeMoreImports"); - function ke(r, e) { - if (e == "as") return i.marked = "keyword", n(lr); - } - f(ke, "maybeAs"); - function hr(r, e) { - if (e == "from") return i.marked = "keyword", n(b); - } - f(hr, "maybeFrom"); - function be(r) { - return r == "]" ? n() : s(g(j, "]")); - } - f(be, "arrayLiteral"); - function Pr() { - return s(c("form"), T, l("{"), c("}"), g(we, "}"), u, u); - } - f(Pr, "enumdef"); - function we() { - return s(T, _); - } - f(we, "enummember"); - function xe(r, e) { - return r.lastType == "operator" || r.lastType == "," || jr.test(e.charAt(0)) || /[,.]/.test(e.charAt(0)); - } - f(xe, "isContinuedStatement"); - function Fr(r, e, t) { - return e.tokenize == $ && /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(e.lastType) || e.lastType == "quasi" && /\{\s*$/.test(r.string.slice(0, r.pos - (t || 0))); - } - return f(Fr, "expressionAllowed"), { - startState: function (r) { - var e = { - tokenize: $, - lastType: "sof", - cc: [], - lexical: new Er((r || 0) - A, 0, "block", !1), - localVars: h.localVars, - context: h.localVars && new G(null, null, !1), - indented: r || 0 - }; - return h.globalVars && typeof h.globalVars == "object" && (e.globalVars = h.globalVars), e; - }, - token: function (r, e) { - if (r.sol() && (e.lexical.hasOwnProperty("align") || (e.lexical.align = !1), e.indented = r.indentation(), dr(r, e)), e.tokenize != tr && r.eatSpace()) return null; - var t = e.tokenize(r, e); - return K == "comment" ? t : (e.lastType = K == "operator" && (nr == "++" || nr == "--") ? "incdec" : K, Tr(e, t, K, nr, r)); - }, - indent: function (r, e) { - if (r.tokenize == tr || r.tokenize == H) return w.Pass; - if (r.tokenize != $) return 0; - var t = e && e.charAt(0), - a = r.lexical, - o; - if (!/^\s*else\b/.test(e)) for (var d = r.cc.length - 1; d >= 0; --d) { - var p = r.cc[d]; - if (p == u) a = a.prev;else if (p != Mr && p != E) break; - } - for (; (a.type == "stat" || a.type == "form") && (t == "}" || (o = r.cc[r.cc.length - 1]) && (o == N || o == L) && !/^[,\.=+\-*:?[\(]/.test(e));) a = a.prev; - vr && a.type == ")" && a.prev.type == "stat" && (a = a.prev); - var y = a.type, - V = t == y; - return y == "vardef" ? a.indented + (r.lastType == "operator" || r.lastType == "," ? a.info.length + 1 : 0) : y == "form" && t == "{" ? a.indented : y == "form" ? a.indented + A : y == "stat" ? a.indented + (xe(r, e) ? vr || A : 0) : a.info == "switch" && !V && h.doubleIndentSwitch != !1 ? a.indented + (/^(?:case|default)\b/.test(e) ? A : 2 * A) : a.align ? a.column + (V ? 0 : 1) : a.indented + (V ? 0 : A); - }, - electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, - blockCommentStart: O ? null : "/*", - blockCommentEnd: O ? null : "*/", - blockCommentContinue: O ? null : " * ", - lineComment: O ? null : "//", - fold: "brace", - closeBrackets: "()[]{}''\"\"``", - helperType: O ? "json" : "javascript", - jsonldMode: rr, - jsonMode: O, - expressionAllowed: Fr, - skipExpression: function (r) { - Tr(r, "atom", "atom", "true", new w.StringStream("", 2, null)); - } - }; - }), w.registerHelper("wordChars", "javascript", /[\w$]/), w.defineMIME("text/javascript", "javascript"), w.defineMIME("text/ecmascript", "javascript"), w.defineMIME("application/javascript", "javascript"), w.defineMIME("application/x-javascript", "javascript"), w.defineMIME("application/ecmascript", "javascript"), w.defineMIME("application/json", { - name: "javascript", - json: !0 - }), w.defineMIME("application/x-json", { - name: "javascript", - json: !0 - }), w.defineMIME("application/manifest+json", { - name: "javascript", - json: !0 - }), w.defineMIME("application/ld+json", { - name: "javascript", - jsonld: !0 - }), w.defineMIME("text/typescript", { - name: "javascript", - typescript: !0 - }), w.defineMIME("application/typescript", { - name: "javascript", - typescript: !0 - }); - }); -})(); -var Jr = ye.exports; -const je = Dr.getDefaultExportFromCjs(Jr), - Ee = ge({ - __proto__: null, - default: je - }, [Jr]); -exports.javascript = Ee; +})); +Object.defineProperty(exports, "createCallbackRef", ({ + enumerable: true, + get: function () { + return _createRef.createCallbackRef; + } +})); +Object.defineProperty(exports, "mergeRefs", ({ + enumerable: true, + get: function () { + return _mergeRef.mergeRefs; + } +})); +Object.defineProperty(exports, "refToCallback", ({ + enumerable: true, + get: function () { + return _refToCallback.refToCallback; + } +})); +Object.defineProperty(exports, "transformRef", ({ + enumerable: true, + get: function () { + return _transformRef.transformRef; + } +})); +Object.defineProperty(exports, "useCallbackRef", ({ + enumerable: true, + get: function () { + return _useRef.useCallbackRef; + } +})); +Object.defineProperty(exports, "useMergeRefs", ({ + enumerable: true, + get: function () { + return _useMergeRef.useMergeRefs; + } +})); +Object.defineProperty(exports, "useRefToCallback", ({ + enumerable: true, + get: function () { + return _refToCallback.useRefToCallback; + } +})); +Object.defineProperty(exports, "useTransformRef", ({ + enumerable: true, + get: function () { + return _useTransformRef.useTransformRef; + } +})); +var _assignRef = __webpack_require__(/*! ./assignRef */ "../../../node_modules/use-callback-ref/dist/es2015/assignRef.js"); +var _useRef = __webpack_require__(/*! ./useRef */ "../../../node_modules/use-callback-ref/dist/es2015/useRef.js"); +var _createRef = __webpack_require__(/*! ./createRef */ "../../../node_modules/use-callback-ref/dist/es2015/createRef.js"); +var _mergeRef = __webpack_require__(/*! ./mergeRef */ "../../../node_modules/use-callback-ref/dist/es2015/mergeRef.js"); +var _useMergeRef = __webpack_require__(/*! ./useMergeRef */ "../../../node_modules/use-callback-ref/dist/es2015/useMergeRef.js"); +var _useTransformRef = __webpack_require__(/*! ./useTransformRef */ "../../../node_modules/use-callback-ref/dist/es2015/useTransformRef.js"); +var _transformRef = __webpack_require__(/*! ./transformRef */ "../../../node_modules/use-callback-ref/dist/es2015/transformRef.js"); +var _refToCallback = __webpack_require__(/*! ./refToCallback */ "../../../node_modules/use-callback-ref/dist/es2015/refToCallback.js"); /***/ }), -/***/ "../../graphiql-react/dist/jump-to-line.cjs.js": -/*!*****************************************************!*\ - !*** ../../graphiql-react/dist/jump-to-line.cjs.js ***! - \*****************************************************/ +/***/ "../../../node_modules/use-callback-ref/dist/es2015/mergeRef.js": +/*!**********************************************************************!*\ + !*** ../../../node_modules/use-callback-ref/dist/es2015/mergeRef.js ***! + \**********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -var m = Object.defineProperty; -var c = (u, p) => m(u, "name", { - value: p, - configurable: !0 -}); -const f = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"), - g = __webpack_require__(/*! ./dialog.cjs.js */ "../../graphiql-react/dist/dialog.cjs.js"); -function h(u, p) { - for (var o = 0; o < p.length; o++) { - const s = p[o]; - if (typeof s != "string" && !Array.isArray(s)) { - for (const i in s) if (i !== "default" && !(i in u)) { - const a = Object.getOwnPropertyDescriptor(s, i); - a && Object.defineProperty(u, i, a.get ? a : { - enumerable: !0, - get: () => s[i] - }); - } - } - } - return Object.freeze(Object.defineProperty(u, Symbol.toStringTag, { - value: "Module" - })); -} -c(h, "_mergeNamespaces"); -var b = { - exports: {} -}; -(function (u, p) { - (function (o) { - o(f.requireCodemirror(), g.dialogExports); - })(function (o) { - o.defineOption("search", { - bottom: !1 +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.mergeRefs = mergeRefs; +var _assignRef = __webpack_require__(/*! ./assignRef */ "../../../node_modules/use-callback-ref/dist/es2015/assignRef.js"); +var _createRef = __webpack_require__(/*! ./createRef */ "../../../node_modules/use-callback-ref/dist/es2015/createRef.js"); +/** + * Merges two or more refs together providing a single interface to set their value + * @param {RefObject|Ref} refs + * @returns {MutableRefObject} - a new ref, which translates all changes to {refs} + * + * @see {@link useMergeRefs} to be used in ReactComponents + * @example + * const Component = React.forwardRef((props, ref) => { + * const ownRef = useRef(); + * const domRef = mergeRefs([ref, ownRef]); // 👈 merge together + * return
...
+ * } + */ +function mergeRefs(refs) { + return (0, _createRef.createCallbackRef)(function (newValue) { + return refs.forEach(function (ref) { + return (0, _assignRef.assignRef)(ref, newValue); }); - function s(e, r, n, t, l) { - e.openDialog ? e.openDialog(r, l, { - value: t, - selectValueOnOpen: !0, - bottom: e.options.search.bottom - }) : l(prompt(n, t)); - } - c(s, "dialog"); - function i(e) { - return e.phrase("Jump to line:") + ' ' + e.phrase("(Use line:column or scroll% syntax)") + ""; - } - c(i, "getJumpDialog"); - function a(e, r) { - var n = Number(r); - return /^[-+]/.test(r) ? e.getCursor().line + n : n - 1; - } - c(a, "interpretLine"), o.commands.jumpToLine = function (e) { - var r = e.getCursor(); - s(e, i(e), e.phrase("Jump to line:"), r.line + 1 + ":" + r.ch, function (n) { - if (n) { - var t; - if (t = /^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(n)) e.setCursor(a(e, t[1]), Number(t[2]));else if (t = /^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(n)) { - var l = Math.round(e.lineCount() * Number(t[1]) / 100); - /^[-+]/.test(t[1]) && (l = r.line + l + 1), e.setCursor(l - 1, r.ch); - } else (t = /^\s*\:?\s*([\+\-]?\d+)\s*/.exec(n)) && e.setCursor(a(e, t[1]), r.ch); - } - }); - }, o.keyMap.default["Alt-G"] = "jumpToLine"; }); -})(); -var d = b.exports; -const j = f.getDefaultExportFromCjs(d), - y = h({ - __proto__: null, - default: j - }, [d]); -exports.jumpToLine = y; +} /***/ }), -/***/ "../../graphiql-react/dist/jump.cjs.js": -/*!*********************************************!*\ - !*** ../../graphiql-react/dist/jump.cjs.js ***! - \*********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { +/***/ "../../../node_modules/use-callback-ref/dist/es2015/refToCallback.js": +/*!***************************************************************************!*\ + !*** ../../../node_modules/use-callback-ref/dist/es2015/refToCallback.js ***! + \***************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { -var c = Object.defineProperty; -var s = (e, r) => c(e, "name", { - value: r, - configurable: !0 -}); -const u = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - d = __webpack_require__(/*! ./SchemaReference.cjs.js */ "../../graphiql-react/dist/SchemaReference.cjs.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -__webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -__webpack_require__(/*! ./forEachState.cjs.js */ "../../graphiql-react/dist/forEachState.cjs.js"); -u.CodeMirror.defineOption("jump", !1, (e, r, n) => { - if (n && n !== u.CodeMirror.Init) { - const t = e.state.jump.onMouseOver; - u.CodeMirror.off(e.getWrapperElement(), "mouseover", t); - const i = e.state.jump.onMouseOut; - u.CodeMirror.off(e.getWrapperElement(), "mouseout", i), u.CodeMirror.off(document, "keydown", e.state.jump.onKeyDown), delete e.state.jump; - } - if (r) { - const t = e.state.jump = { - options: r, - onMouseOver: M.bind(null, e), - onMouseOut: m.bind(null, e), - onKeyDown: g.bind(null, e) - }; - u.CodeMirror.on(e.getWrapperElement(), "mouseover", t.onMouseOver), u.CodeMirror.on(e.getWrapperElement(), "mouseout", t.onMouseOut), u.CodeMirror.on(document, "keydown", t.onKeyDown); - } -}); -function M(e, r) { - const n = r.target || r.srcElement; - if (!(n instanceof HTMLElement) || (n == null ? void 0 : n.nodeName) !== "SPAN") return; - const t = n.getBoundingClientRect(), - i = { - left: (t.left + t.right) / 2, - top: (t.top + t.bottom) / 2 - }; - e.state.jump.cursor = i, e.state.jump.isHoldingModifier && l(e); -} -s(M, "onMouseOver"); -function m(e) { - if (!e.state.jump.isHoldingModifier && e.state.jump.cursor) { - e.state.jump.cursor = null; - return; - } - e.state.jump.isHoldingModifier && e.state.jump.marker && p(e); -} -s(m, "onMouseOut"); -function g(e, r) { - if (e.state.jump.isHoldingModifier || !k(r.key)) return; - e.state.jump.isHoldingModifier = !0, e.state.jump.cursor && l(e); - const n = s(o => { - o.code === r.code && (e.state.jump.isHoldingModifier = !1, e.state.jump.marker && p(e), u.CodeMirror.off(document, "keyup", n), u.CodeMirror.off(document, "click", t), e.off("mousedown", i)); - }, "onKeyUp"), - t = s(o => { - const { - destination: a, - options: f - } = e.state.jump; - a && f.onClick(a, o); - }, "onClick"), - i = s((o, a) => { - e.state.jump.destination && (a.codemirrorIgnore = !0); - }, "onMouseDown"); - u.CodeMirror.on(document, "keyup", n), u.CodeMirror.on(document, "click", t), e.on("mousedown", i); -} -s(g, "onKeyDown"); -const j = typeof navigator < "u" && navigator && navigator.appVersion.includes("Mac"); -function k(e) { - return e === (j ? "Meta" : "Control"); -} -s(k, "isJumpModifier"); -function l(e) { - if (e.state.jump.marker) return; - const { - cursor: r, - options: n - } = e.state.jump, - t = e.coordsChar(r), - i = e.getTokenAt(t, !0), - o = n.getDestination || e.getHelper(t, "jump"); - if (o) { - const a = o(i, n, e); - if (a) { - const f = e.markText({ - line: t.line, - ch: i.start - }, { - line: t.line, - ch: i.end - }, { - className: "CodeMirror-jump-token" - }); - e.state.jump.marker = f, e.state.jump.destination = a; +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.refToCallback = refToCallback; +exports.useRefToCallback = useRefToCallback; +/** + * Unmemoized version of {@link useRefToCallback} + * @see {@link useRefToCallback} + * @param ref + */ +function refToCallback(ref) { + return function (newValue) { + if (typeof ref === 'function') { + ref(newValue); + } else if (ref) { + ref.current = newValue; } - } + }; } -s(l, "enableJumpMode"); -function p(e) { - const { - marker: r - } = e.state.jump; - e.state.jump.marker = null, e.state.jump.destination = null, r.clear(); +var nullCallback = function () { + return null; +}; +// lets maintain a weak ref to, well, ref :) +// not using `kashe` to keep this package small +var weakMem = new WeakMap(); +var weakMemoize = function (ref) { + var usedRef = ref || nullCallback; + var storedRef = weakMem.get(usedRef); + if (storedRef) { + return storedRef; + } + var cb = refToCallback(usedRef); + weakMem.set(usedRef, cb); + return cb; +}; +/** + * Transforms a given `ref` into `callback`. + * + * To transform `callback` into ref use {@link useCallbackRef|useCallbackRef(undefined, callback)} + * + * @param {ReactRef} ref + * @returns {Function} + * + * @see https://github.com/theKashey/use-callback-ref#reftocallback + * + * @example + * const ref = useRef(0); + * const setRef = useRefToCallback(ref); + * 👉 setRef(10); + * ✅ ref.current === 10 + */ +function useRefToCallback(ref) { + return weakMemoize(ref); } -s(p, "disableJumpMode"); -u.CodeMirror.registerHelper("jump", "graphql", (e, r) => { - if (!r.schema || !r.onClick || !e.state) return; - const { - state: n - } = e, - { - kind: t, - step: i - } = n, - o = d.getTypeInfo(r.schema, n); - if (t === "Field" && i === 0 && o.fieldDef || t === "AliasedField" && i === 2 && o.fieldDef) return d.getFieldReference(o); - if (t === "Directive" && i === 1 && o.directiveDef) return d.getDirectiveReference(o); - if (t === "Argument" && i === 0 && o.argDef) return d.getArgumentReference(o); - if (t === "EnumValue" && o.enumValue) return d.getEnumValueReference(o); - if (t === "NamedType" && o.type) return d.getTypeReference(o); -}); /***/ }), -/***/ "../../graphiql-react/dist/lint.cjs.js": -/*!*********************************************!*\ - !*** ../../graphiql-react/dist/lint.cjs.js ***! - \*********************************************/ +/***/ "../../../node_modules/use-callback-ref/dist/es2015/transformRef.js": +/*!**************************************************************************!*\ + !*** ../../../node_modules/use-callback-ref/dist/es2015/transformRef.js ***! + \**************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -var W = Object.defineProperty; -var s = (h, v) => W(h, "name", { - value: v, - configurable: !0 -}); -const x = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function q(h, v) { - for (var l = 0; l < v.length; l++) { - const u = v[l]; - if (typeof u != "string" && !Array.isArray(u)) { - for (const g in u) if (g !== "default" && !(g in h)) { - const c = Object.getOwnPropertyDescriptor(u, g); - c && Object.defineProperty(h, g, c.get ? c : { - enumerable: !0, - get: () => u[g] - }); - } - } - } - return Object.freeze(Object.defineProperty(h, Symbol.toStringTag, { - value: "Module" - })); -} -s(q, "_mergeNamespaces"); -var B = { - exports: {} -}; -(function (h, v) { - (function (l) { - l(x.requireCodemirror()); - })(function (l) { - var u = "CodeMirror-lint-markers", - g = "CodeMirror-lint-line-"; - function c(t, e, r) { - var n = document.createElement("div"); - n.className = "CodeMirror-lint-tooltip cm-s-" + t.options.theme, n.appendChild(r.cloneNode(!0)), t.state.lint.options.selfContain ? t.getWrapperElement().appendChild(n) : document.body.appendChild(n); - function i(o) { - if (!n.parentNode) return l.off(document, "mousemove", i); - n.style.top = Math.max(0, o.clientY - n.offsetHeight - 5) + "px", n.style.left = o.clientX + 5 + "px"; - } - return s(i, "position"), l.on(document, "mousemove", i), i(e), n.style.opacity != null && (n.style.opacity = 1), n; - } - s(c, "showTooltip"); - function L(t) { - t.parentNode && t.parentNode.removeChild(t); - } - s(L, "rm"); - function A(t) { - t.parentNode && (t.style.opacity == null && L(t), t.style.opacity = 0, setTimeout(function () { - L(t); - }, 600)); - } - s(A, "hideTooltip"); - function M(t, e, r, n) { - var i = c(t, e, r); - function o() { - l.off(n, "mouseout", o), i && (A(i), i = null); - } - s(o, "hide"); - var a = setInterval(function () { - if (i) for (var f = n;; f = f.parentNode) { - if (f && f.nodeType == 11 && (f = f.host), f == document.body) return; - if (!f) { - o(); - break; - } - } - if (!i) return clearInterval(a); - }, 400); - l.on(n, "mouseout", o); - } - s(M, "showTooltipFor"); - function F(t, e, r) { - this.marked = [], e instanceof Function && (e = { - getAnnotations: e - }), (!e || e === !0) && (e = {}), this.options = {}, this.linterOptions = e.options || {}; - for (var n in C) this.options[n] = C[n]; - for (var n in e) C.hasOwnProperty(n) ? e[n] != null && (this.options[n] = e[n]) : e.options || (this.linterOptions[n] = e[n]); - this.timeout = null, this.hasGutter = r, this.onMouseOver = function (i) { - U(t, i); - }, this.waitingFor = 0; - } - s(F, "LintState"); - var C = { - highlightLines: !1, - tooltips: !0, - delay: 500, - lintOnChange: !0, - getAnnotations: null, - async: !1, - selfContain: null, - formatAnnotation: null, - onUpdateLinting: null - }; - function E(t) { - var e = t.state.lint; - e.hasGutter && t.clearGutter(u), e.options.highlightLines && G(t); - for (var r = 0; r < e.marked.length; ++r) e.marked[r].clear(); - e.marked.length = 0; - } - s(E, "clearMarks"); - function G(t) { - t.eachLine(function (e) { - var r = e.wrapClass && /\bCodeMirror-lint-line-\w+\b/.exec(e.wrapClass); - r && t.removeLineClass(e, "wrap", r[0]); - }); - } - s(G, "clearErrorLines"); - function I(t, e, r, n, i) { - var o = document.createElement("div"), - a = o; - return o.className = "CodeMirror-lint-marker CodeMirror-lint-marker-" + r, n && (a = o.appendChild(document.createElement("div")), a.className = "CodeMirror-lint-marker CodeMirror-lint-marker-multiple"), i != !1 && l.on(a, "mouseover", function (f) { - M(t, f, e, a); - }), o; - } - s(I, "makeMarker"); - function D(t, e) { - return t == "error" ? t : e; - } - s(D, "getMaxSeverity"); - function j(t) { - for (var e = [], r = 0; r < t.length; ++r) { - var n = t[r], - i = n.from.line; - (e[i] || (e[i] = [])).push(n); - } - return e; - } - s(j, "groupByLine"); - function N(t) { - var e = t.severity; - e || (e = "error"); - var r = document.createElement("div"); - return r.className = "CodeMirror-lint-message CodeMirror-lint-message-" + e, typeof t.messageHTML < "u" ? r.innerHTML = t.messageHTML : r.appendChild(document.createTextNode(t.message)), r; - } - s(N, "annotationTooltip"); - function H(t, e) { - var r = t.state.lint, - n = ++r.waitingFor; - function i() { - n = -1, t.off("change", i); - } - s(i, "abort"), t.on("change", i), e(t.getValue(), function (o, a) { - t.off("change", i), r.waitingFor == n && (a && o instanceof l && (o = a), t.operation(function () { - O(t, o); - })); - }, r.linterOptions, t); - } - s(H, "lintAsync"); - function k(t) { - var e = t.state.lint; - if (e) { - var r = e.options, - n = r.getAnnotations || t.getHelper(l.Pos(0, 0), "lint"); - if (n) if (r.async || n.async) H(t, n);else { - var i = n(t.getValue(), e.linterOptions, t); - if (!i) return; - i.then ? i.then(function (o) { - t.operation(function () { - O(t, o); - }); - }) : t.operation(function () { - O(t, i); - }); - } - } - } - s(k, "startLinting"); - function O(t, e) { - var r = t.state.lint; - if (r) { - var n = r.options; - E(t); - for (var i = j(e), o = 0; o < i.length; ++o) { - var a = i[o]; - if (a) { - var f = []; - a = a.filter(function (w) { - return f.indexOf(w.message) > -1 ? !1 : f.push(w.message); - }); - for (var p = null, m = r.hasGutter && document.createDocumentFragment(), T = 0; T < a.length; ++T) { - var d = a[T], - y = d.severity; - y || (y = "error"), p = D(p, y), n.formatAnnotation && (d = n.formatAnnotation(d)), r.hasGutter && m.appendChild(N(d)), d.to && r.marked.push(t.markText(d.from, d.to, { - className: "CodeMirror-lint-mark CodeMirror-lint-mark-" + y, - __annotation: d - })); - } - r.hasGutter && t.setGutterMarker(o, u, I(t, m, p, i[o].length > 1, n.tooltips)), n.highlightLines && t.addLineClass(o, "wrap", g + p); - } - } - n.onUpdateLinting && n.onUpdateLinting(e, i, t); - } - } - s(O, "updateLinting"); - function b(t) { - var e = t.state.lint; - e && (clearTimeout(e.timeout), e.timeout = setTimeout(function () { - k(t); - }, e.options.delay)); - } - s(b, "onChange"); - function P(t, e, r) { - for (var n = r.target || r.srcElement, i = document.createDocumentFragment(), o = 0; o < e.length; o++) { - var a = e[o]; - i.appendChild(N(a)); - } - M(t, r, i, n); - } - s(P, "popupTooltips"); - function U(t, e) { - var r = e.target || e.srcElement; - if (/\bCodeMirror-lint-mark-/.test(r.className)) { - for (var n = r.getBoundingClientRect(), i = (n.left + n.right) / 2, o = (n.top + n.bottom) / 2, a = t.findMarksAt(t.coordsChar({ - left: i, - top: o - }, "client")), f = [], p = 0; p < a.length; ++p) { - var m = a[p].__annotation; - m && f.push(m); - } - f.length && P(t, f, e); - } - } - s(U, "onMouseOver"), l.defineOption("lint", !1, function (t, e, r) { - if (r && r != l.Init && (E(t), t.state.lint.options.lintOnChange !== !1 && t.off("change", b), l.off(t.getWrapperElement(), "mouseover", t.state.lint.onMouseOver), clearTimeout(t.state.lint.timeout), delete t.state.lint), e) { - for (var n = t.getOption("gutters"), i = !1, o = 0; o < n.length; ++o) n[o] == u && (i = !0); - var a = t.state.lint = new F(t, e, i); - a.options.lintOnChange && t.on("change", b), a.options.tooltips != !1 && a.options.tooltips != "gutter" && l.on(t.getWrapperElement(), "mouseover", a.onMouseOver), k(t); - } - }), l.defineExtension("performLint", function () { - k(this); - }); +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.transformRef = transformRef; +var _assignRef = __webpack_require__(/*! ./assignRef */ "../../../node_modules/use-callback-ref/dist/es2015/assignRef.js"); +var _createRef = __webpack_require__(/*! ./createRef */ "../../../node_modules/use-callback-ref/dist/es2015/createRef.js"); +/** + * Transforms one ref to another + * @example + * ```tsx + * const ResizableWithRef = forwardRef((props, ref) => + * i ? i.resizable : null)}/> + * ); + * ``` + */ +function transformRef(ref, transformer) { + return (0, _createRef.createCallbackRef)(function (value) { + return (0, _assignRef.assignRef)(ref, transformer(value)); }); -})(); -var _ = B.exports; -const R = x.getDefaultExportFromCjs(_), - V = q({ - __proto__: null, - default: R - }, [_]); -exports.lint = V; - -/***/ }), - -/***/ "../../graphiql-react/dist/lint.cjs2.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/lint.cjs2.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -const t = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - c = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -const a = ["error", "warning", "information", "hint"], - g = { - "GraphQL: Validation": "validation", - "GraphQL: Deprecation": "deprecation", - "GraphQL: Syntax": "syntax" - }; -t.CodeMirror.registerHelper("lint", "graphql", (n, s) => { - const { - schema: r, - validationRules: i, - externalFragments: o - } = s; - return c.getDiagnostics(n, r, i, void 0, o).map(e => ({ - message: e.message, - severity: e.severity ? a[e.severity - 1] : a[0], - type: e.source ? g[e.source] : void 0, - from: t.CodeMirror.Pos(e.range.start.line, e.range.start.character), - to: t.CodeMirror.Pos(e.range.end.line, e.range.end.character) - })); -}); +} /***/ }), -/***/ "../../graphiql-react/dist/lint.cjs3.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/lint.cjs3.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { +/***/ "../../../node_modules/use-callback-ref/dist/es2015/useMergeRef.js": +/*!*************************************************************************!*\ + !*** ../../../node_modules/use-callback-ref/dist/es2015/useMergeRef.js ***! + \*************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -var V = Object.defineProperty; -var t = (e, n) => V(e, "name", { - value: n, - configurable: !0 -}); -const I = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - b = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function C(e) { - d = e, E = e.length, s = u = N = -1, o(), y(); - const n = q(); - return p("EOF"), n; -} -t(C, "jsonParse"); -let d, E, s, u, N, r, l; -function q() { - const e = s, - n = []; - if (p("{"), !x("}")) { - do n.push(M()); while (x(",")); - p("}"); - } - return { - kind: "Object", - start: e, - end: N, - members: n - }; -} -t(q, "parseObj"); -function M() { - const e = s, - n = l === "String" ? G() : null; - p("String"), p(":"); - const i = B(); - return { - kind: "Member", - start: e, - end: N, - key: n, - value: i - }; -} -t(M, "parseMember"); -function v() { - const e = s, - n = []; - if (p("["), !x("]")) { - do n.push(B()); while (x(",")); - p("]"); - } - return { - kind: "Array", - start: e, - end: N, - values: n - }; -} -t(v, "parseArr"); -function B() { - switch (l) { - case "[": - return v(); - case "{": - return q(); - case "String": - case "Number": - case "Boolean": - case "Null": - const e = G(); - return y(), e; - } - p("Value"); -} -t(B, "parseVal"); -function G() { - return { - kind: l, - start: s, - end: u, - value: JSON.parse(d.slice(s, u)) - }; -} -t(G, "curToken"); -function p(e) { - if (l === e) { - y(); - return; - } - let n; - if (l === "EOF") n = "[end of file]";else if (u - s > 1) n = "`" + d.slice(s, u) + "`";else { - const i = d.slice(s).match(/^.+?\b/); - n = "`" + (i ? i[0] : d[s]) + "`"; - } - throw k(`Expected ${e} but found ${n}.`); -} -t(p, "expect"); -class j extends Error { - constructor(n, i) { - super(n), this.position = i; - } -} -t(j, "JSONSyntaxError"); -function k(e) { - return new j(e, { - start: s, - end: u +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.useMergeRefs = useMergeRefs; +var _assignRef = __webpack_require__(/*! ./assignRef */ "../../../node_modules/use-callback-ref/dist/es2015/assignRef.js"); +var _useRef = __webpack_require__(/*! ./useRef */ "../../../node_modules/use-callback-ref/dist/es2015/useRef.js"); +/** + * Merges two or more refs together providing a single interface to set their value + * @param {RefObject|Ref} refs + * @returns {MutableRefObject} - a new ref, which translates all changes to {refs} + * + * @see {@link mergeRefs} a version without buit-in memoization + * @see https://github.com/theKashey/use-callback-ref#usemergerefs + * @example + * const Component = React.forwardRef((props, ref) => { + * const ownRef = useRef(); + * const domRef = useMergeRefs([ref, ownRef]); // 👈 merge together + * return
...
+ * } + */ +function useMergeRefs(refs, defaultValue) { + return (0, _useRef.useCallbackRef)(defaultValue || null, function (newValue) { + return refs.forEach(function (ref) { + return (0, _assignRef.assignRef)(ref, newValue); + }); }); } -t(k, "syntaxError"); -function x(e) { - if (l === e) return y(), !0; -} -t(x, "skip"); -function o() { - return u < E && (u++, r = u === E ? 0 : d.charCodeAt(u)), r; -} -t(o, "ch"); -function y() { - for (N = u; r === 9 || r === 10 || r === 13 || r === 32;) o(); - if (r === 0) { - l = "EOF"; - return; - } - switch (s = u, r) { - case 34: - return l = "String", D(); - case 45: - case 48: - case 49: - case 50: - case 51: - case 52: - case 53: - case 54: - case 55: - case 56: - case 57: - return l = "Number", H(); - case 102: - if (d.slice(s, s + 5) !== "false") break; - u += 4, o(), l = "Boolean"; - return; - case 110: - if (d.slice(s, s + 4) !== "null") break; - u += 3, o(), l = "Null"; - return; - case 116: - if (d.slice(s, s + 4) !== "true") break; - u += 3, o(), l = "Boolean"; - return; - } - l = d[s], o(); -} -t(y, "lex"); -function D() { - for (o(); r !== 34 && r > 31;) if (r === 92) switch (r = o(), r) { - case 34: - case 47: - case 92: - case 98: - case 102: - case 110: - case 114: - case 116: - o(); - break; - case 117: - o(), w(), w(), w(), w(); - break; - default: - throw k("Bad character escape sequence."); - } else { - if (u === E) throw k("Unterminated string."); - o(); - } - if (r === 34) { - o(); - return; - } - throw k("Unterminated string."); -} -t(D, "readString"); -function w() { - if (r >= 48 && r <= 57 || r >= 65 && r <= 70 || r >= 97 && r <= 102) return o(); - throw k("Expected hexadecimal digit."); -} -t(w, "readHex"); -function H() { - r === 45 && o(), r === 48 ? o() : $(), r === 46 && (o(), $()), (r === 69 || r === 101) && (r = o(), (r === 43 || r === 45) && o(), $()); -} -t(H, "readNumber"); -function $() { - if (r < 48 || r > 57) throw k("Expected decimal digit."); - do o(); while (r >= 48 && r <= 57); -} -t($, "readDigits"); -I.CodeMirror.registerHelper("lint", "graphql-variables", (e, n, i) => { - if (!e) return []; - let f; - try { - f = C(e); - } catch (c) { - if (c instanceof j) return [F(i, c.position, c.message)]; - throw c; - } - const { - variableToType: a - } = n; - return a ? U(i, a, f) : []; -}); -function U(e, n, i) { - var f; - const a = []; - for (const c of i.members) if (c) { - const h = (f = c.key) === null || f === void 0 ? void 0 : f.value, - m = n[h]; - if (m) for (const [O, Q] of g(m, c.value)) a.push(F(e, O, Q));else a.push(F(e, c.key, `Variable "$${h}" does not appear in any GraphQL query.`)); - } - return a; -} -t(U, "validateVariables"); -function g(e, n) { - if (!e || !n) return []; - if (e instanceof b.GraphQLNonNull) return n.kind === "Null" ? [[n, `Type "${e}" is non-nullable and cannot be null.`]] : g(e.ofType, n); - if (n.kind === "Null") return []; - if (e instanceof b.GraphQLList) { - const i = e.ofType; - if (n.kind === "Array") { - const f = n.values || []; - return L(f, a => g(i, a)); - } - return g(i, n); - } - if (e instanceof b.GraphQLInputObjectType) { - if (n.kind !== "Object") return [[n, `Type "${e}" must be an Object.`]]; - const i = Object.create(null), - f = L(n.members, a => { - var c; - const h = (c = a == null ? void 0 : a.key) === null || c === void 0 ? void 0 : c.value; - i[h] = !0; - const m = e.getFields()[h]; - if (!m) return [[a.key, `Type "${e}" does not have a field "${h}".`]]; - const O = m ? m.type : void 0; - return g(O, a.value); - }); - for (const a of Object.keys(e.getFields())) { - const c = e.getFields()[a]; - !i[a] && c.type instanceof b.GraphQLNonNull && !c.defaultValue && f.push([n, `Object of type "${e}" is missing required field "${a}".`]); - } - return f; - } - return e.name === "Boolean" && n.kind !== "Boolean" || e.name === "String" && n.kind !== "String" || e.name === "ID" && n.kind !== "Number" && n.kind !== "String" || e.name === "Float" && n.kind !== "Number" || e.name === "Int" && (n.kind !== "Number" || (n.value | 0) !== n.value) ? [[n, `Expected value of type "${e}".`]] : (e instanceof b.GraphQLEnumType || e instanceof b.GraphQLScalarType) && (n.kind !== "String" && n.kind !== "Number" && n.kind !== "Boolean" && n.kind !== "Null" || _(e.parseValue(n.value))) ? [[n, `Expected value of type "${e}".`]] : []; -} -t(g, "validateValue"); -function F(e, n, i) { - return { - message: i, - severity: "error", - type: "validation", - from: e.posFromIndex(n.start), - to: e.posFromIndex(n.end) - }; -} -t(F, "lintError"); -function _(e) { - return e == null || e !== e; -} -t(_, "isNullish"); -function L(e, n) { - return Array.prototype.concat.apply([], e.map(n)); -} -t(L, "mapCat"); /***/ }), -/***/ "../../graphiql-react/dist/matchbrackets.cjs.js": -/*!******************************************************!*\ - !*** ../../graphiql-react/dist/matchbrackets.cjs.js ***! - \******************************************************/ +/***/ "../../../node_modules/use-callback-ref/dist/es2015/useRef.js": +/*!********************************************************************!*\ + !*** ../../../node_modules/use-callback-ref/dist/es2015/useRef.js ***! + \********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -var i = Object.defineProperty; -var s = (e, c) => i(e, "name", { - value: c, - configurable: !0 -}); -const u = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"), - f = __webpack_require__(/*! ./matchbrackets.cjs2.js */ "../../graphiql-react/dist/matchbrackets.cjs2.js"); -function b(e, c) { - for (var o = 0; o < c.length; o++) { - const t = c[o]; - if (typeof t != "string" && !Array.isArray(t)) { - for (const r in t) if (r !== "default" && !(r in e)) { - const a = Object.getOwnPropertyDescriptor(t, r); - a && Object.defineProperty(e, r, a.get ? a : { - enumerable: !0, - get: () => t[r] - }); +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.useCallbackRef = useCallbackRef; +var _react = __webpack_require__(/*! react */ "react"); +/** + * creates a MutableRef with ref change callback + * @param initialValue - initial ref value + * @param {Function} callback - a callback to run when value changes + * + * @example + * const ref = useCallbackRef(0, (newValue, oldValue) => console.log(oldValue, '->', newValue); + * ref.current = 1; + * // prints 0 -> 1 + * + * @see https://reactjs.org/docs/hooks-reference.html#useref + * @see https://github.com/theKashey/use-callback-ref#usecallbackref---to-replace-reactuseref + * @returns {MutableRefObject} + */ +function useCallbackRef(initialValue, callback) { + var ref = (0, _react.useState)(function () { + return { + // value + value: initialValue, + // last callback + callback: callback, + // "memoized" public interface + facade: { + get current() { + return ref.value; + }, + set current(value) { + var last = ref.value; + if (last !== value) { + ref.value = value; + ref.callback(value, last); + } + } } - } - } - return Object.freeze(Object.defineProperty(e, Symbol.toStringTag, { - value: "Module" - })); + }; + })[0]; + // update callback + ref.callback = callback; + return ref.facade; } -s(b, "_mergeNamespaces"); -var n = f.requireMatchbrackets(); -const l = u.getDefaultExportFromCjs(n), - m = b({ - __proto__: null, - default: l - }, [n]); -exports.matchbrackets = m; /***/ }), -/***/ "../../graphiql-react/dist/matchbrackets.cjs2.js": -/*!*******************************************************!*\ - !*** ../../graphiql-react/dist/matchbrackets.cjs2.js ***! - \*******************************************************/ +/***/ "../../../node_modules/use-callback-ref/dist/es2015/useTransformRef.js": +/*!*****************************************************************************!*\ + !*** ../../../node_modules/use-callback-ref/dist/es2015/useTransformRef.js ***! + \*****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -var R = Object.defineProperty; -var f = (L, y) => R(L, "name", { - value: y, - configurable: !0 -}); -const F = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -var T = { - exports: {} - }, - E; -function I() { - return E || (E = 1, function (L, y) { - (function (o) { - o(F.requireCodemirror()); - })(function (o) { - var S = /MSIE \d/.test(navigator.userAgent) && (document.documentMode == null || document.documentMode < 8), - g = o.Pos, - B = { - "(": ")>", - ")": "(<", - "[": "]>", - "]": "[<", - "{": "}>", - "}": "{<", - "<": ">>", - ">": "<<" - }; - function A(t) { - return t && t.bracketRegex || /[(){}[\]]/; - } - f(A, "bracketRegex"); - function b(t, r, e) { - var s = t.getLineHandle(r.line), - n = r.ch - 1, - h = e && e.afterCursor; - h == null && (h = /(^| )cm-fat-cursor($| )/.test(t.getWrapperElement().className)); - var l = A(e), - u = !h && n >= 0 && l.test(s.text.charAt(n)) && B[s.text.charAt(n)] || l.test(s.text.charAt(n + 1)) && B[s.text.charAt(++n)]; - if (!u) return null; - var a = u.charAt(1) == ">" ? 1 : -1; - if (e && e.strict && a > 0 != (n == r.ch)) return null; - var k = t.getTokenTypeAt(g(r.line, n + 1)), - i = H(t, g(r.line, n + (a > 0 ? 1 : 0)), a, k, e); - return i == null ? null : { - from: g(r.line, n), - to: i && i.pos, - match: i && i.ch == u.charAt(0), - forward: a > 0 - }; - } - f(b, "findMatchingBracket"); - function H(t, r, e, s, n) { - for (var h = n && n.maxScanLineLength || 1e4, l = n && n.maxScanLines || 1e3, u = [], a = A(n), k = e > 0 ? Math.min(r.line + l, t.lastLine() + 1) : Math.max(t.firstLine() - 1, r.line - l), i = r.line; i != k; i += e) { - var c = t.getLine(i); - if (c) { - var v = e > 0 ? 0 : c.length - 1, - q = e > 0 ? c.length : -1; - if (!(c.length > h)) for (i == r.line && (v = r.ch - (e < 0 ? 1 : 0)); v != q; v += e) { - var d = c.charAt(v); - if (a.test(d) && (s === void 0 || (t.getTokenTypeAt(g(i, v + 1)) || "") == (s || ""))) { - var m = B[d]; - if (m && m.charAt(1) == ">" == e > 0) u.push(d);else if (u.length) u.pop();else return { - pos: g(i, v), - ch: d - }; - } - } - } - } - return i - e == (e > 0 ? t.lastLine() : t.firstLine()) ? !1 : null; - } - f(H, "scanForBracket"); - function M(t, r, e) { - for (var s = t.state.matchBrackets.maxHighlightLineLength || 1e3, n = e && e.highlightNonMatching, h = [], l = t.listSelections(), u = 0; u < l.length; u++) { - var a = l[u].empty() && b(t, l[u].head, e); - if (a && (a.match || n !== !1) && t.getLine(a.from.line).length <= s) { - var k = a.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; - h.push(t.markText(a.from, g(a.from.line, a.from.ch + 1), { - className: k - })), a.to && t.getLine(a.to.line).length <= s && h.push(t.markText(a.to, g(a.to.line, a.to.ch + 1), { - className: k - })); - } - } - if (h.length) { - S && t.state.focused && t.focus(); - var i = f(function () { - t.operation(function () { - for (var c = 0; c < h.length; c++) h[c].clear(); - }); - }, "clear"); - if (r) setTimeout(i, 800);else return i; - } - } - f(M, "matchBrackets"); - function x(t) { - t.operation(function () { - t.state.matchBrackets.currentlyHighlighted && (t.state.matchBrackets.currentlyHighlighted(), t.state.matchBrackets.currentlyHighlighted = null), t.state.matchBrackets.currentlyHighlighted = M(t, !1, t.state.matchBrackets); - }); - } - f(x, "doMatchBrackets"); - function p(t) { - t.state.matchBrackets && t.state.matchBrackets.currentlyHighlighted && (t.state.matchBrackets.currentlyHighlighted(), t.state.matchBrackets.currentlyHighlighted = null); - } - f(p, "clearHighlighted"), o.defineOption("matchBrackets", !1, function (t, r, e) { - e && e != o.Init && (t.off("cursorActivity", x), t.off("focus", x), t.off("blur", p), p(t)), r && (t.state.matchBrackets = typeof r == "object" ? r : {}, t.on("cursorActivity", x), t.on("focus", x), t.on("blur", p)); - }), o.defineExtension("matchBrackets", function () { - M(this, !0); - }), o.defineExtension("findMatchingBracket", function (t, r, e) { - return (e || typeof r == "boolean") && (e ? (e.strict = r, r = e) : r = r ? { - strict: !0 - } : null), b(this, t, r); - }), o.defineExtension("scanForBracket", function (t, r, e, s) { - return H(this, t, r, e, s); - }); - }); - }()), T.exports; +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.useTransformRef = useTransformRef; +var _assignRef = __webpack_require__(/*! ./assignRef */ "../../../node_modules/use-callback-ref/dist/es2015/assignRef.js"); +var _useRef = __webpack_require__(/*! ./useRef */ "../../../node_modules/use-callback-ref/dist/es2015/useRef.js"); +/** + * Create a _lense_ on Ref, making it possible to transform ref value + * @param {ReactRef} ref + * @param {Function} transformer. 👉 Ref would be __NOT updated__ on `transformer` update. + * @returns {RefObject} + * + * @see https://github.com/theKashey/use-callback-ref#usetransformref-to-replace-reactuseimperativehandle + * @example + * + * const ResizableWithRef = forwardRef((props, ref) => + * i ? i.resizable : null)}/> + * ); + */ +function useTransformRef(ref, transformer) { + return (0, _useRef.useCallbackRef)(null, function (value) { + return (0, _assignRef.assignRef)(ref, transformer(value)); + }); } -f(I, "requireMatchbrackets"); -exports.requireMatchbrackets = I; /***/ }), -/***/ "../../graphiql-react/dist/mode-indent.cjs.js": -/*!****************************************************!*\ - !*** ../../graphiql-react/dist/mode-indent.cjs.js ***! - \****************************************************/ +/***/ "../../../node_modules/use-sidecar/dist/es2015/config.js": +/*!***************************************************************!*\ + !*** ../../../node_modules/use-sidecar/dist/es2015/config.js ***! + \***************************************************************/ /***/ (function(__unused_webpack_module, exports) { -var o = Object.defineProperty; -var v = (n, t) => o(n, "name", { - value: t, - configurable: !0 -}); -function s(n, t) { - var e, i; - const { - levels: l, - indentLevel: d - } = n; - return ((!l || l.length === 0 ? d : l.at(-1) - (!((e = this.electricInput) === null || e === void 0) && e.test(t) ? 1 : 0)) || 0) * (((i = this.config) === null || i === void 0 ? void 0 : i.indentUnit) || 0); -} -v(s, "indent"); -exports.indent = s; +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.setConfig = exports.config = void 0; +var config = exports.config = { + onError: function (e) { + return console.error(e); + } +}; +var setConfig = function (conf) { + Object.assign(config, conf); +}; +exports.setConfig = setConfig; /***/ }), -/***/ "../../graphiql-react/dist/mode.cjs.js": -/*!*********************************************!*\ - !*** ../../graphiql-react/dist/mode.cjs.js ***! - \*********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { +/***/ "../../../node_modules/use-sidecar/dist/es2015/env.js": +/*!************************************************************!*\ + !*** ../../../node_modules/use-sidecar/dist/es2015/env.js ***! + \************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -var n = Object.defineProperty; -var s = (e, r) => n(e, "name", { - value: r, - configurable: !0 -}); -const o = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - t = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"), - i = __webpack_require__(/*! ./mode-indent.cjs.js */ "../../graphiql-react/dist/mode-indent.cjs.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -const l = s(e => { - const r = t.onlineParser({ - eatWhitespace: a => a.eatWhile(t.isIgnored), - lexRules: t.LexRules, - parseRules: t.ParseRules, - editorConfig: { - tabSize: e.tabSize - } - }); - return { - config: e, - startState: r.startState, - token: r.token, - indent: i.indent, - electricInput: /^\s*[})\]]/, - fold: "brace", - lineComment: "#", - closeBrackets: { - pairs: '()[]{}""', - explode: "()[]{}" - } - }; -}, "graphqlModeFactory"); -o.CodeMirror.defineMode("graphql", l); +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.env = void 0; +var _detectNodeEs = __webpack_require__(/*! detect-node-es */ "../../../node_modules/detect-node-es/esm/browser.js"); +var env = exports.env = { + isNode: _detectNodeEs.isNode, + forceCache: false +}; /***/ }), -/***/ "../../graphiql-react/dist/mode.cjs2.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/mode.cjs2.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { +/***/ "../../../node_modules/use-sidecar/dist/es2015/exports.js": +/*!****************************************************************!*\ + !*** ../../../node_modules/use-sidecar/dist/es2015/exports.js ***! + \****************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -var n = Object.defineProperty; -var u = (t, r) => n(t, "name", { - value: r, - configurable: !0 -}); -const i = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - e = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"), - s = __webpack_require__(/*! ./mode-indent.cjs.js */ "../../graphiql-react/dist/mode-indent.cjs.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -i.CodeMirror.defineMode("graphql-variables", t => { - const r = e.onlineParser({ - eatWhitespace: a => a.eatSpace(), - lexRules: c, - parseRules: o, - editorConfig: { - tabSize: t.tabSize - } - }); - return { - config: t, - startState: r.startState, - token: r.token, - indent: s.indent, - electricInput: /^\s*[}\]]/, - fold: "brace", - closeBrackets: { - pairs: '[]{}""', - explode: "[]{}" - } - }; -}); -const c = { - Punctuation: /^\[|]|\{|\}|:|,/, - Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/, - String: /^"(?:[^"\\]|\\(?:"|\/|\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*"?/, - Keyword: /^true|false|null/ - }, - o = { - Document: [e.p("{"), e.list("Variable", e.opt(e.p(","))), e.p("}")], - Variable: [l("variable"), e.p(":"), "Value"], - Value(t) { - switch (t.kind) { - case "Number": - return "NumberValue"; - case "String": - return "StringValue"; - case "Punctuation": - switch (t.value) { - case "[": - return "ListValue"; - case "{": - return "ObjectValue"; - } - return null; - case "Keyword": - switch (t.value) { - case "true": - case "false": - return "BooleanValue"; - case "null": - return "NullValue"; - } - return null; - } - }, - NumberValue: [e.t("Number", "number")], - StringValue: [e.t("String", "string")], - BooleanValue: [e.t("Keyword", "builtin")], - NullValue: [e.t("Keyword", "keyword")], - ListValue: [e.p("["), e.list("Value", e.opt(e.p(","))), e.p("]")], - ObjectValue: [e.p("{"), e.list("ObjectField", e.opt(e.p(","))), e.p("}")], - ObjectField: [l("attribute"), e.p(":"), "Value"] - }; -function l(t) { - return { - style: t, - match: r => r.kind === "String", - update(r, a) { - r.name = a.value.slice(1, -1); - } - }; +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.exportSidecar = exportSidecar; +var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.mjs"); +var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +var SideCar = function (_a) { + var sideCar = _a.sideCar, + rest = (0, _tslib.__rest)(_a, ["sideCar"]); + if (!sideCar) { + throw new Error('Sidecar: please provide `sideCar` property to import the right car'); + } + var Target = sideCar.read(); + if (!Target) { + throw new Error('Sidecar medium not found'); + } + return /*#__PURE__*/React.createElement(Target, (0, _tslib.__assign)({}, rest)); +}; +SideCar.isSideCarExport = true; +function exportSidecar(medium, exported) { + medium.useMedium(exported); + return SideCar; } -u(l, "namedKey"); /***/ }), -/***/ "../../graphiql-react/dist/mode.cjs3.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/mode.cjs3.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { +/***/ "../../../node_modules/use-sidecar/dist/es2015/hoc.js": +/*!************************************************************!*\ + !*** ../../../node_modules/use-sidecar/dist/es2015/hoc.js ***! + \************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -const a = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"), - e = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"), - l = __webpack_require__(/*! ./mode-indent.cjs.js */ "../../graphiql-react/dist/mode-indent.cjs.js"); -__webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -a.CodeMirror.defineMode("graphql-results", r => { - const t = e.onlineParser({ - eatWhitespace: u => u.eatSpace(), - lexRules: n, - parseRules: s, - editorConfig: { - tabSize: r.tabSize - } - }); - return { - config: r, - startState: t.startState, - token: t.token, - indent: l.indent, - electricInput: /^\s*[}\]]/, - fold: "brace", - closeBrackets: { - pairs: '[]{}""', - explode: "[]{}" - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.sidecar = sidecar; +var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.mjs"); +var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +var _hook = __webpack_require__(/*! ./hook */ "../../../node_modules/use-sidecar/dist/es2015/hook.js"); +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +// eslint-disable-next-line @typescript-eslint/ban-types +function sidecar(importer, errorComponent) { + var ErrorCase = function () { + return errorComponent; }; -}); -const n = { - Punctuation: /^\[|]|\{|\}|:|,/, - Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/, - String: /^"(?:[^"\\]|\\(?:"|\/|\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*"?/, - Keyword: /^true|false|null/ - }, - s = { - Document: [e.p("{"), e.list("Entry", e.p(",")), e.p("}")], - Entry: [e.t("String", "def"), e.p(":"), "Value"], - Value(r) { - switch (r.kind) { - case "Number": - return "NumberValue"; - case "String": - return "StringValue"; - case "Punctuation": - switch (r.value) { - case "[": - return "ListValue"; - case "{": - return "ObjectValue"; - } - return null; - case "Keyword": - switch (r.value) { - case "true": - case "false": - return "BooleanValue"; - case "null": - return "NullValue"; - } - return null; - } - }, - NumberValue: [e.t("Number", "number")], - StringValue: [e.t("String", "string")], - BooleanValue: [e.t("Keyword", "builtin")], - NullValue: [e.t("Keyword", "keyword")], - ListValue: [e.p("["), e.list("Value", e.p(",")), e.p("]")], - ObjectValue: [e.p("{"), e.list("ObjectField", e.p(",")), e.p("}")], - ObjectField: [e.t("String", "property"), e.p(":"), "Value"] + return function Sidecar(props) { + var _a = (0, _hook.useSidecar)(importer, props.sideCar), + Car = _a[0], + error = _a[1]; + if (error && errorComponent) { + return ErrorCase; + } + // @ts-expect-error type shenanigans + return Car ? /*#__PURE__*/React.createElement(Car, (0, _tslib.__assign)({}, props)) : null; }; +} /***/ }), -/***/ "../../graphiql-react/dist/search.cjs.js": -/*!***********************************************!*\ - !*** ../../graphiql-react/dist/search.cjs.js ***! - \***********************************************/ +/***/ "../../../node_modules/use-sidecar/dist/es2015/hook.js": +/*!*************************************************************!*\ + !*** ../../../node_modules/use-sidecar/dist/es2015/hook.js ***! + \*************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -var K = Object.defineProperty; -var a = (S, O) => K(S, "name", { - value: O, - configurable: !0 -}); -const Q = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"), - L = __webpack_require__(/*! ./searchcursor.cjs2.js */ "../../graphiql-react/dist/searchcursor.cjs2.js"), - z = __webpack_require__(/*! ./dialog.cjs.js */ "../../graphiql-react/dist/dialog.cjs.js"); -function U(S, O) { - for (var i = 0; i < O.length; i++) { - const y = O[i]; - if (typeof y != "string" && !Array.isArray(y)) { - for (const v in y) if (v !== "default" && !(v in S)) { - const h = Object.getOwnPropertyDescriptor(y, v); - h && Object.defineProperty(S, v, h.get ? h : { - enumerable: !0, - get: () => y[v] - }); - } - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.useSidecar = useSidecar; +var _react = __webpack_require__(/*! react */ "react"); +var _env = __webpack_require__(/*! ./env */ "../../../node_modules/use-sidecar/dist/es2015/env.js"); +var cache = new WeakMap(); +var NO_OPTIONS = {}; +function useSidecar(importer, effect) { + var options = effect && effect.options || NO_OPTIONS; + if (_env.env.isNode && !options.ssr) { + return [null, null]; } - return Object.freeze(Object.defineProperty(S, Symbol.toStringTag, { - value: "Module" - })); + // eslint-disable-next-line react-hooks/rules-of-hooks + return useRealSidecar(importer, effect); } -a(U, "_mergeNamespaces"); -var B = { - exports: {} -}; -(function (S, O) { - (function (i) { - i(Q.requireCodemirror(), L.requireSearchcursor(), z.dialogExports); - })(function (i) { - i.defineOption("search", { - bottom: !1 - }); - function y(e, n) { - return typeof e == "string" ? e = new RegExp(e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), n ? "gi" : "g") : e.global || (e = new RegExp(e.source, e.ignoreCase ? "gi" : "g")), { - token: function (t) { - e.lastIndex = t.pos; - var o = e.exec(t.string); - if (o && o.index == t.pos) return t.pos += o[0].length || 1, "searching"; - o ? t.pos = o.index : t.skipToEnd(); +function useRealSidecar(importer, effect) { + var options = effect && effect.options || NO_OPTIONS; + var couldUseCache = _env.env.forceCache || _env.env.isNode && !!options.ssr || !options.async; + var _a = (0, _react.useState)(couldUseCache ? function () { + return cache.get(importer); + } : undefined), + Car = _a[0], + setCar = _a[1]; + var _b = (0, _react.useState)(null), + error = _b[0], + setError = _b[1]; + (0, _react.useEffect)(function () { + if (!Car) { + importer().then(function (car) { + var resolved = effect ? effect.read() : car.default || car; + if (!resolved) { + console.error('Sidecar error: with importer', importer); + var error_1; + if (effect) { + console.error('Sidecar error: with medium', effect); + error_1 = new Error('Sidecar medium was not found'); + } else { + error_1 = new Error('Sidecar was not found in exports'); + } + setError(function () { + return error_1; + }); + throw error_1; } - }; - } - a(y, "searchOverlay"); - function v() { - this.posFrom = this.posTo = this.lastQuery = this.query = null, this.overlay = null; - } - a(v, "SearchState"); - function h(e) { - return e.state.search || (e.state.search = new v()); - } - a(h, "getSearchState"); - function m(e) { - return typeof e == "string" && e == e.toLowerCase(); - } - a(m, "queryCaseInsensitive"); - function N(e, n, t) { - return e.getSearchCursor(n, t, { - caseFold: m(n), - multiline: !0 - }); - } - a(N, "getSearchCursor"); - function j(e, n, t, o, r) { - e.openDialog(n, o, { - value: t, - selectValueOnOpen: !0, - closeOnEnter: !1, - onClose: function () { - w(e); - }, - onKeyDown: r, - bottom: e.options.search.bottom - }); - } - a(j, "persistentDialog"); - function D(e, n, t, o, r) { - e.openDialog ? e.openDialog(n, r, { - value: o, - selectValueOnOpen: !0, - bottom: e.options.search.bottom - }) : r(prompt(t, o)); - } - a(D, "dialog"); - function k(e, n, t, o) { - e.openConfirm ? e.openConfirm(n, o) : confirm(t) && o[0](); - } - a(k, "confirmDialog"); - function C(e) { - return e.replace(/\\([nrt\\])/g, function (n, t) { - return t == "n" ? ` -` : t == "r" ? "\r" : t == "t" ? " " : t == "\\" ? "\\" : n; - }); - } - a(C, "parseString"); - function T(e) { - var n = e.match(/^\/(.*)\/([a-z]*)$/); - if (n) try { - e = new RegExp(n[1], n[2].indexOf("i") == -1 ? "" : "i"); - } catch {} else e = C(e); - return (typeof e == "string" ? e == "" : e.test("")) && (e = /x^/), e; - } - a(T, "parseQuery"); - function P(e, n, t) { - n.queryText = t, n.query = T(t), e.removeOverlay(n.overlay, m(n.query)), n.overlay = y(n.query, m(n.query)), e.addOverlay(n.overlay), e.showMatchesOnScrollbar && (n.annotate && (n.annotate.clear(), n.annotate = null), n.annotate = e.showMatchesOnScrollbar(n.query, m(n.query))); - } - a(P, "startSearch"); - function b(e, n, t, o) { - var r = h(e); - if (r.query) return R(e, n); - var s = e.getSelection() || r.lastQuery; - if (s instanceof RegExp && s.source == "x^" && (s = null), t && e.openDialog) { - var c = null, - u = a(function (f, x) { - i.e_stop(x), f && (f != r.queryText && (P(e, r, f), r.posFrom = r.posTo = e.getCursor()), c && (c.style.opacity = 1), R(e, x.shiftKey, function (d, g) { - var p; - g.line < 3 && document.querySelector && (p = e.display.wrapper.querySelector(".CodeMirror-dialog")) && p.getBoundingClientRect().bottom - 4 > e.cursorCoords(g, "window").top && ((c = p).style.opacity = .4); - })); - }, "searchNext"); - j(e, E(e), s, u, function (f, x) { - var d = i.keyName(f), - g = e.getOption("extraKeys"), - p = g && g[d] || i.keyMap[e.getOption("keyMap")][d]; - p == "findNext" || p == "findPrev" || p == "findPersistentNext" || p == "findPersistentPrev" ? (i.e_stop(f), P(e, h(e), x), e.execCommand(p)) : (p == "find" || p == "findPersistent") && (i.e_stop(f), u(x, f)); - }), o && s && (P(e, r, s), R(e, n)); - } else D(e, E(e), "Search for:", s, function (f) { - f && !r.query && e.operation(function () { - P(e, r, f), r.posFrom = r.posTo = e.getCursor(), R(e, n); + cache.set(importer, resolved); + setCar(function () { + return resolved; }); - }); - } - a(b, "doSearch"); - function R(e, n, t) { - e.operation(function () { - var o = h(e), - r = N(e, o.query, n ? o.posFrom : o.posTo); - !r.find(n) && (r = N(e, o.query, n ? i.Pos(e.lastLine()) : i.Pos(e.firstLine(), 0)), !r.find(n)) || (e.setSelection(r.from(), r.to()), e.scrollIntoView({ - from: r.from(), - to: r.to() - }, 20), o.posFrom = r.from(), o.posTo = r.to(), t && t(r.from(), r.to())); - }); - } - a(R, "findNext"); - function w(e) { - e.operation(function () { - var n = h(e); - n.lastQuery = n.query, n.query && (n.query = n.queryText = null, e.removeOverlay(n.overlay), n.annotate && (n.annotate.clear(), n.annotate = null)); - }); - } - a(w, "clearSearch"); - function l(e, n) { - var t = e ? document.createElement(e) : document.createDocumentFragment(); - for (var o in n) t[o] = n[o]; - for (var r = 2; r < arguments.length; r++) { - var s = arguments[r]; - t.appendChild(typeof s == "string" ? document.createTextNode(s) : s); - } - return t; - } - a(l, "el"); - function E(e) { - return l("", null, l("span", { - className: "CodeMirror-search-label" - }, e.phrase("Search:")), " ", l("input", { - type: "text", - style: "width: 10em", - className: "CodeMirror-search-field" - }), " ", l("span", { - style: "color: #888", - className: "CodeMirror-search-hint" - }, e.phrase("(Use /re/ syntax for regexp search)"))); - } - a(E, "getQueryDialog"); - function A(e) { - return l("", null, " ", l("input", { - type: "text", - style: "width: 10em", - className: "CodeMirror-search-field" - }), " ", l("span", { - style: "color: #888", - className: "CodeMirror-search-hint" - }, e.phrase("(Use /re/ syntax for regexp search)"))); - } - a(A, "getReplaceQueryDialog"); - function I(e) { - return l("", null, l("span", { - className: "CodeMirror-search-label" - }, e.phrase("With:")), " ", l("input", { - type: "text", - style: "width: 10em", - className: "CodeMirror-search-field" - })); - } - a(I, "getReplacementQueryDialog"); - function V(e) { - return l("", null, l("span", { - className: "CodeMirror-search-label" - }, e.phrase("Replace?")), " ", l("button", {}, e.phrase("Yes")), " ", l("button", {}, e.phrase("No")), " ", l("button", {}, e.phrase("All")), " ", l("button", {}, e.phrase("Stop"))); - } - a(V, "getDoReplaceConfirm"); - function _(e, n, t) { - e.operation(function () { - for (var o = N(e, n); o.findNext();) if (typeof n != "string") { - var r = e.getRange(o.from(), o.to()).match(n); - o.replace(t.replace(/\$(\d)/g, function (s, c) { - return r[c]; - })); - } else o.replace(t); - }); - } - a(_, "replaceAll"); - function F(e, n) { - if (!e.getOption("readOnly")) { - var t = e.getSelection() || h(e).lastQuery, - o = n ? e.phrase("Replace all:") : e.phrase("Replace:"), - r = l("", null, l("span", { - className: "CodeMirror-search-label" - }, o), A(e)); - D(e, r, o, t, function (s) { - s && (s = T(s), D(e, I(e), e.phrase("Replace with:"), "", function (c) { - if (c = C(c), n) _(e, s, c);else { - w(e); - var u = N(e, s, e.getCursor("from")), - f = a(function () { - var d = u.from(), - g; - !(g = u.findNext()) && (u = N(e, s), !(g = u.findNext()) || d && u.from().line == d.line && u.from().ch == d.ch) || (e.setSelection(u.from(), u.to()), e.scrollIntoView({ - from: u.from(), - to: u.to() - }), k(e, V(e), e.phrase("Replace?"), [function () { - x(g); - }, f, function () { - _(e, s, c); - }])); - }, "advance"), - x = a(function (d) { - u.replace(typeof s == "string" ? c : c.replace(/\$(\d)/g, function (g, p) { - return d[p]; - })), f(); - }, "doReplace"); - f(); - } - })); + }, function (e) { + return setError(function () { + return e; }); - } + }); } - a(F, "replace"), i.commands.find = function (e) { - w(e), b(e); - }, i.commands.findPersistent = function (e) { - w(e), b(e, !1, !0); - }, i.commands.findPersistentNext = function (e) { - b(e, !1, !0, !0); - }, i.commands.findPersistentPrev = function (e) { - b(e, !0, !0, !0); - }, i.commands.findNext = b, i.commands.findPrev = function (e) { - b(e, !0); - }, i.commands.clearSearch = w, i.commands.replace = F, i.commands.replaceAll = function (e) { - F(e, !0); - }; - }); -})(); -var $ = B.exports; -const W = Q.getDefaultExportFromCjs($), - Y = U({ - __proto__: null, - default: W - }, [$]); -exports.search = Y; + }, []); + return [Car, error]; +} /***/ }), -/***/ "../../graphiql-react/dist/searchcursor.cjs.js": -/*!*****************************************************!*\ - !*** ../../graphiql-react/dist/searchcursor.cjs.js ***! - \*****************************************************/ +/***/ "../../../node_modules/use-sidecar/dist/es2015/index.js": +/*!**************************************************************!*\ + !*** ../../../node_modules/use-sidecar/dist/es2015/index.js ***! + \**************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -var n = Object.defineProperty; -var u = (r, o) => n(r, "name", { - value: o, - configurable: !0 -}); -const i = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"), - f = __webpack_require__(/*! ./searchcursor.cjs2.js */ "../../graphiql-react/dist/searchcursor.cjs2.js"); -function l(r, o) { - for (var c = 0; c < o.length; c++) { - const e = o[c]; - if (typeof e != "string" && !Array.isArray(e)) { - for (const t in e) if (t !== "default" && !(t in r)) { - const s = Object.getOwnPropertyDescriptor(e, t); - s && Object.defineProperty(r, t, s.get ? s : { - enumerable: !0, - get: () => e[t] - }); - } - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "createMedium", ({ + enumerable: true, + get: function () { + return _medium.createMedium; } - return Object.freeze(Object.defineProperty(r, Symbol.toStringTag, { - value: "Module" - })); -} -u(l, "_mergeNamespaces"); -var a = f.requireSearchcursor(); -const g = i.getDefaultExportFromCjs(a), - p = l({ - __proto__: null, - default: g - }, [a]); -exports.searchcursor = p; +})); +Object.defineProperty(exports, "createSidecarMedium", ({ + enumerable: true, + get: function () { + return _medium.createSidecarMedium; + } +})); +Object.defineProperty(exports, "exportSidecar", ({ + enumerable: true, + get: function () { + return _exports.exportSidecar; + } +})); +Object.defineProperty(exports, "renderCar", ({ + enumerable: true, + get: function () { + return _renderProp.renderCar; + } +})); +Object.defineProperty(exports, "setConfig", ({ + enumerable: true, + get: function () { + return _config.setConfig; + } +})); +Object.defineProperty(exports, "sidecar", ({ + enumerable: true, + get: function () { + return _hoc.sidecar; + } +})); +Object.defineProperty(exports, "useSidecar", ({ + enumerable: true, + get: function () { + return _hook.useSidecar; + } +})); +var _hoc = __webpack_require__(/*! ./hoc */ "../../../node_modules/use-sidecar/dist/es2015/hoc.js"); +var _hook = __webpack_require__(/*! ./hook */ "../../../node_modules/use-sidecar/dist/es2015/hook.js"); +var _config = __webpack_require__(/*! ./config */ "../../../node_modules/use-sidecar/dist/es2015/config.js"); +var _medium = __webpack_require__(/*! ./medium */ "../../../node_modules/use-sidecar/dist/es2015/medium.js"); +var _renderProp = __webpack_require__(/*! ./renderProp */ "../../../node_modules/use-sidecar/dist/es2015/renderProp.js"); +var _exports = __webpack_require__(/*! ./exports */ "../../../node_modules/use-sidecar/dist/es2015/exports.js"); /***/ }), -/***/ "../../graphiql-react/dist/searchcursor.cjs2.js": -/*!******************************************************!*\ - !*** ../../graphiql-react/dist/searchcursor.cjs2.js ***! - \******************************************************/ +/***/ "../../../node_modules/use-sidecar/dist/es2015/medium.js": +/*!***************************************************************!*\ + !*** ../../../node_modules/use-sidecar/dist/es2015/medium.js ***! + \***************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { -var W = Object.defineProperty; -var o = (d, E) => W(d, "name", { - value: E, - configurable: !0 -}); -const G = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -var N = { - exports: {} - }, - b; -function H() { - return b || (b = 1, function (d, E) { - (function (m) { - m(G.requireCodemirror()); - })(function (m) { - var a = m.Pos; - function B(e) { - var t = e.flags; - return t !== null && t !== void 0 ? t : (e.ignoreCase ? "i" : "") + (e.global ? "g" : "") + (e.multiline ? "m" : ""); - } - o(B, "regexpFlags"); - function F(e, t) { - for (var n = B(e), r = n, l = 0; l < t.length; l++) r.indexOf(t.charAt(l)) == -1 && (r += t.charAt(l)); - return n == r ? e : new RegExp(e.source, r); - } - o(F, "ensureFlags"); - function R(e) { - return /\\s|\\n|\n|\\W|\\D|\[\^/.test(e.source); - } - o(R, "maybeMultiline"); - function I(e, t, n) { - t = F(t, "g"); - for (var r = n.line, l = n.ch, i = e.lastLine(); r <= i; r++, l = 0) { - t.lastIndex = l; - var h = e.getLine(r), - f = t.exec(h); - if (f) return { - from: a(r, f.index), - to: a(r, f.index + f[0].length), - match: f - }; - } - } - o(I, "searchRegexpForward"); - function j(e, t, n) { - if (!R(t)) return I(e, t, n); - t = F(t, "gm"); - for (var r, l = 1, i = n.line, h = e.lastLine(); i <= h;) { - for (var f = 0; f < l && !(i > h); f++) { - var p = e.getLine(i++); - r = r == null ? p : r + ` -` + p; - } - l = l * 2, t.lastIndex = n.ch; - var u = t.exec(r); - if (u) { - var s = r.slice(0, u.index).split(` -`), - c = u[0].split(` -`), - g = n.line + s.length - 1, - v = s[s.length - 1].length; - return { - from: a(g, v), - to: a(g + c.length - 1, c.length == 1 ? v + c[0].length : c[c.length - 1].length), - match: u - }; - } - } - } - o(j, "searchRegexpForwardMultiline"); - function z(e, t, n) { - for (var r, l = 0; l <= e.length;) { - t.lastIndex = l; - var i = t.exec(e); - if (!i) break; - var h = i.index + i[0].length; - if (h > e.length - n) break; - (!r || h > r.index + r[0].length) && (r = i), l = i.index + 1; - } - return r; - } - o(z, "lastMatchIn"); - function D(e, t, n) { - t = F(t, "g"); - for (var r = n.line, l = n.ch, i = e.firstLine(); r >= i; r--, l = -1) { - var h = e.getLine(r), - f = z(h, t, l < 0 ? 0 : h.length - l); - if (f) return { - from: a(r, f.index), - to: a(r, f.index + f[0].length), - match: f - }; - } - } - o(D, "searchRegexpBackward"); - function A(e, t, n) { - if (!R(t)) return D(e, t, n); - t = F(t, "gm"); - for (var r, l = 1, i = e.getLine(n.line).length - n.ch, h = n.line, f = e.firstLine(); h >= f;) { - for (var p = 0; p < l && h >= f; p++) { - var u = e.getLine(h--); - r = r == null ? u : u + ` -` + r; - } - l *= 2; - var s = z(r, t, i); - if (s) { - var c = r.slice(0, s.index).split(` -`), - g = s[0].split(` -`), - v = h + c.length, - x = c[c.length - 1].length; - return { - from: a(v, x), - to: a(v + g.length - 1, g.length == 1 ? x + g[0].length : g[g.length - 1].length), - match: s - }; - } - } - } - o(A, "searchRegexpBackwardMultiline"); - var P, k; - String.prototype.normalize ? (P = o(function (e) { - return e.normalize("NFD").toLowerCase(); - }, "doFold"), k = o(function (e) { - return e.normalize("NFD"); - }, "noFold")) : (P = o(function (e) { - return e.toLowerCase(); - }, "doFold"), k = o(function (e) { - return e; - }, "noFold")); - function L(e, t, n, r) { - if (e.length == t.length) return n; - for (var l = 0, i = n + Math.max(0, e.length - t.length);;) { - if (l == i) return l; - var h = l + i >> 1, - f = r(e.slice(0, h)).length; - if (f == n) return h; - f > n ? i = h : l = h + 1; - } - } - o(L, "adjustPos"); - function y(e, t, n, r) { - if (!t.length) return null; - var l = r ? P : k, - i = l(t).split(/\r|\n\r?/); - t: for (var h = n.line, f = n.ch, p = e.lastLine() + 1 - i.length; h <= p; h++, f = 0) { - var u = e.getLine(h).slice(f), - s = l(u); - if (i.length == 1) { - var c = s.indexOf(i[0]); - if (c == -1) continue t; - var n = L(u, s, c, l) + f; - return { - from: a(h, L(u, s, c, l) + f), - to: a(h, L(u, s, c + i[0].length, l) + f) - }; - } else { - var g = s.length - i[0].length; - if (s.slice(g) != i[0]) continue t; - for (var v = 1; v < i.length - 1; v++) if (l(e.getLine(h + v)) != i[v]) continue t; - var x = e.getLine(h + i.length - 1), - O = l(x), - S = i[i.length - 1]; - if (O.slice(0, S.length) != S) continue t; - return { - from: a(h, L(u, s, g, l) + f), - to: a(h + i.length - 1, L(x, O, S.length, l)) - }; - } - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.createMedium = createMedium; +exports.createSidecarMedium = createSidecarMedium; +var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.mjs"); +function ItoI(a) { + return a; +} +function innerCreateMedium(defaults, middleware) { + if (middleware === void 0) { + middleware = ItoI; + } + var buffer = []; + var assigned = false; + var medium = { + read: function () { + if (assigned) { + throw new Error('Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.'); } - o(y, "searchStringForward"); - function C(e, t, n, r) { - if (!t.length) return null; - var l = r ? P : k, - i = l(t).split(/\r|\n\r?/); - t: for (var h = n.line, f = n.ch, p = e.firstLine() - 1 + i.length; h >= p; h--, f = -1) { - var u = e.getLine(h); - f > -1 && (u = u.slice(0, f)); - var s = l(u); - if (i.length == 1) { - var c = s.lastIndexOf(i[0]); - if (c == -1) continue t; - return { - from: a(h, L(u, s, c, l)), - to: a(h, L(u, s, c + i[0].length, l)) - }; - } else { - var g = i[i.length - 1]; - if (s.slice(0, g.length) != g) continue t; - for (var v = 1, n = h - i.length + 1; v < i.length - 1; v++) if (l(e.getLine(n + v)) != i[v]) continue t; - var x = e.getLine(h + 1 - i.length), - O = l(x); - if (O.slice(O.length - i[0].length) != i[0]) continue t; - return { - from: a(h + 1 - i.length, L(x, O, x.length - i[0].length, l)), - to: a(h, L(u, s, g.length, l)) - }; - } - } + if (buffer.length) { + return buffer[buffer.length - 1]; } - o(C, "searchStringBackward"); - function w(e, t, n, r) { - this.atOccurrence = !1, this.afterEmptyMatch = !1, this.doc = e, n = n ? e.clipPos(n) : a(0, 0), this.pos = { - from: n, - to: n - }; - var l; - typeof r == "object" ? l = r.caseFold : (l = r, r = null), typeof t == "string" ? (l == null && (l = !1), this.matches = function (i, h) { - return (i ? C : y)(e, t, h, l); - }) : (t = F(t, "gm"), !r || r.multiline !== !1 ? this.matches = function (i, h) { - return (i ? A : j)(e, t, h); - } : this.matches = function (i, h) { - return (i ? D : I)(e, t, h); + return defaults; + }, + useMedium: function (data) { + var item = middleware(data, assigned); + buffer.push(item); + return function () { + buffer = buffer.filter(function (x) { + return x !== item; }); + }; + }, + assignSyncMedium: function (cb) { + assigned = true; + while (buffer.length) { + var cbs = buffer; + buffer = []; + cbs.forEach(cb); } - o(w, "SearchCursor"), w.prototype = { - findNext: function () { - return this.find(!1); - }, - findPrevious: function () { - return this.find(!0); - }, - find: function (e) { - var t = this.doc.clipPos(e ? this.pos.from : this.pos.to); - if (this.afterEmptyMatch && this.atOccurrence && (t = a(t.line, t.ch), e ? (t.ch--, t.ch < 0 && (t.line--, t.ch = (this.doc.getLine(t.line) || "").length)) : (t.ch++, t.ch > (this.doc.getLine(t.line) || "").length && (t.ch = 0, t.line++)), m.cmpPos(t, this.doc.clipPos(t)) != 0)) return this.atOccurrence = !1; - var n = this.matches(e, t); - if (this.afterEmptyMatch = n && m.cmpPos(n.from, n.to) == 0, n) return this.pos = n, this.atOccurrence = !0, this.pos.match || !0; - var r = a(e ? this.doc.firstLine() : this.doc.lastLine() + 1, 0); - return this.pos = { - from: r, - to: r - }, this.atOccurrence = !1; - }, - from: function () { - if (this.atOccurrence) return this.pos.from; - }, - to: function () { - if (this.atOccurrence) return this.pos.to; + buffer = { + push: function (x) { + return cb(x); }, - replace: function (e, t) { - if (this.atOccurrence) { - var n = m.splitLines(e); - this.doc.replaceRange(n, this.pos.from, this.pos.to, t), this.pos.to = a(this.pos.from.line + n.length - 1, n[n.length - 1].length + (n.length == 1 ? this.pos.from.ch : 0)); - } - } - }, m.defineExtension("getSearchCursor", function (e, t, n) { - return new w(this.doc, e, t, n); - }), m.defineDocExtension("getSearchCursor", function (e, t, n) { - return new w(this, e, t, n); - }), m.defineExtension("selectMatches", function (e, t) { - for (var n = [], r = this.getSearchCursor(e, this.getCursor("from"), t); r.findNext() && !(m.cmpPos(r.to(), this.getCursor("to")) > 0);) n.push({ - anchor: r.from(), - head: r.to() - }); - n.length && this.setSelections(n, 0); - }); - }); - }()), N.exports; -} -o(H, "requireSearchcursor"); -exports.requireSearchcursor = H; - -/***/ }), - -/***/ "../../graphiql-react/dist/show-hint.cjs.js": -/*!**************************************************!*\ - !*** ../../graphiql-react/dist/show-hint.cjs.js ***! - \**************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var ct = Object.defineProperty; -var p = (H, A) => ct(H, "name", { - value: A, - configurable: !0 -}); -const G = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function lt(H, A) { - for (var r = 0; r < A.length; r++) { - const w = A[r]; - if (typeof w != "string" && !Array.isArray(w)) { - for (const v in w) if (v !== "default" && !(v in H)) { - const b = Object.getOwnPropertyDescriptor(w, v); - b && Object.defineProperty(H, v, b.get ? b : { - enumerable: !0, - get: () => w[v] - }); - } - } - } - return Object.freeze(Object.defineProperty(H, Symbol.toStringTag, { - value: "Module" - })); -} -p(lt, "_mergeNamespaces"); -var ht = { - exports: {} -}; -(function (H, A) { - (function (r) { - r(G.requireCodemirror()); - })(function (r) { - var w = "CodeMirror-hint", - v = "CodeMirror-hint-active"; - r.showHint = function (t, e, i) { - if (!e) return t.showHint(i); - i && i.async && (e.async = !0); - var n = { - hint: e + filter: function () { + return buffer; + } }; - if (i) for (var s in i) n[s] = i[s]; - return t.showHint(n); - }, r.defineExtension("showHint", function (t) { - t = tt(this, this.getCursor("start"), t); - var e = this.listSelections(); - if (!(e.length > 1)) { - if (this.somethingSelected()) { - if (!t.hint.supportsSelection) return; - for (var i = 0; i < e.length; i++) if (e[i].head.line != e[i].anchor.line) return; - } - this.state.completionActive && this.state.completionActive.close(); - var n = this.state.completionActive = new b(this, t); - n.options.hint && (r.signal(this, "startCompletion", this), n.update(!0)); - } - }), r.defineExtension("closeHint", function () { - this.state.completionActive && this.state.completionActive.close(); - }); - function b(t, e) { - if (this.cm = t, this.options = e, this.widget = null, this.debounce = 0, this.tick = 0, this.startPos = this.cm.getCursor("start"), this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length, this.options.updateOnCursorActivity) { - var i = this; - t.on("cursorActivity", this.activityFunc = function () { - i.cursorActivity(); - }); + }, + assignMedium: function (cb) { + assigned = true; + var pendingQueue = []; + if (buffer.length) { + var cbs = buffer; + buffer = []; + cbs.forEach(cb); + pendingQueue = buffer; } - } - p(b, "Completion"); - var Q = window.requestAnimationFrame || function (t) { - return setTimeout(t, 1e3 / 60); - }, - Z = window.cancelAnimationFrame || clearTimeout; - b.prototype = { - close: function () { - this.active() && (this.cm.state.completionActive = null, this.tick = null, this.options.updateOnCursorActivity && this.cm.off("cursorActivity", this.activityFunc), this.widget && this.data && r.signal(this.data, "close"), this.widget && this.widget.close(), r.signal(this.cm, "endCompletion", this.cm)); - }, - active: function () { - return this.cm.state.completionActive == this; - }, - pick: function (t, e) { - var i = t.list[e], - n = this; - this.cm.operation(function () { - i.hint ? i.hint(n.cm, t, i) : n.cm.replaceRange(_(i), i.from || t.from, i.to || t.to, "complete"), r.signal(t, "pick", i), n.cm.scrollIntoView(); - }), this.options.closeOnPick && this.close(); - }, - cursorActivity: function () { - this.debounce && (Z(this.debounce), this.debounce = 0); - var t = this.startPos; - this.data && (t = this.data.from); - var e = this.cm.getCursor(), - i = this.cm.getLine(e.line); - if (e.line != this.startPos.line || i.length - e.ch != this.startLen - this.startPos.ch || e.ch < t.ch || this.cm.somethingSelected() || !e.ch || this.options.closeCharacters.test(i.charAt(e.ch - 1))) this.close();else { - var n = this; - this.debounce = Q(function () { - n.update(); - }), this.widget && this.widget.disable(); - } - }, - update: function (t) { - if (this.tick != null) { - var e = this, - i = ++this.tick; - U(this.options.hint, this.cm, this.options, function (n) { - e.tick == i && e.finishUpdate(n, t); - }); - } - }, - finishUpdate: function (t, e) { - this.data && r.signal(this.data, "update"); - var i = this.widget && this.widget.picked || e && this.options.completeSingle; - this.widget && this.widget.close(), this.data = t, t && t.list.length && (i && t.list.length == 1 ? this.pick(t, 0) : (this.widget = new K(this, t), r.signal(t, "shown"))); - } - }; - function tt(t, e, i) { - var n = t.options.hintOptions, - s = {}; - for (var c in D) s[c] = D[c]; - if (n) for (var c in n) n[c] !== void 0 && (s[c] = n[c]); - if (i) for (var c in i) i[c] !== void 0 && (s[c] = i[c]); - return s.hint.resolve && (s.hint = s.hint.resolve(t, e)), s; - } - p(tt, "parseOptions"); - function _(t) { - return typeof t == "string" ? t : t.text; - } - p(_, "getText"); - function et(t, e) { - var i = { - Up: function () { - e.moveFocus(-1); - }, - Down: function () { - e.moveFocus(1); - }, - PageUp: function () { - e.moveFocus(-e.menuSize() + 1, !0); - }, - PageDown: function () { - e.moveFocus(e.menuSize() - 1, !0); - }, - Home: function () { - e.setFocus(0); - }, - End: function () { - e.setFocus(e.length - 1); - }, - Enter: e.pick, - Tab: e.pick, - Esc: e.close - }, - n = /Mac/.test(navigator.platform); - n && (i["Ctrl-P"] = function () { - e.moveFocus(-1); - }, i["Ctrl-N"] = function () { - e.moveFocus(1); - }); - var s = t.options.customKeys, - c = s ? {} : i; - function o(u, l) { - var a; - typeof l != "string" ? a = p(function (S) { - return l(S, e); - }, "bound") : i.hasOwnProperty(l) ? a = i[l] : a = l, c[u] = a; - } - if (p(o, "addBinding"), s) for (var f in s) s.hasOwnProperty(f) && o(f, s[f]); - var h = t.options.extraKeys; - if (h) for (var f in h) h.hasOwnProperty(f) && o(f, h[f]); - return c; - } - p(et, "buildKeyMap"); - function B(t, e) { - for (; e && e != t;) { - if (e.nodeName.toUpperCase() === "LI" && e.parentNode == t) return e; - e = e.parentNode; - } - } - p(B, "getHintElement"); - function K(t, e) { - this.id = "cm-complete-" + Math.floor(Math.random(1e6)), this.completion = t, this.data = e, this.picked = !1; - var i = this, - n = t.cm, - s = n.getInputField().ownerDocument, - c = s.defaultView || s.parentWindow, - o = this.hints = s.createElement("ul"); - o.setAttribute("role", "listbox"), o.setAttribute("aria-expanded", "true"), o.id = this.id; - var f = t.cm.options.theme; - o.className = "CodeMirror-hints " + f, this.selectedHint = e.selectedHint || 0; - for (var h = e.list, u = 0; u < h.length; ++u) { - var l = o.appendChild(s.createElement("li")), - a = h[u], - S = w + (u != this.selectedHint ? "" : " " + v); - a.className != null && (S = a.className + " " + S), l.className = S, u == this.selectedHint && l.setAttribute("aria-selected", "true"), l.id = this.id + "-" + u, l.setAttribute("role", "option"), a.render ? a.render(l, e, a) : l.appendChild(s.createTextNode(a.displayText || _(a))), l.hintId = u; - } - var T = t.options.container || s.body, - y = n.cursorCoords(t.options.alignWithWord ? e.from : null), - k = y.left, - O = y.bottom, - j = !0, - F = 0, - E = 0; - if (T !== s.body) { - var st = ["absolute", "relative", "fixed"].indexOf(c.getComputedStyle(T).position) !== -1, - W = st ? T : T.offsetParent, - M = W.getBoundingClientRect(), - q = s.body.getBoundingClientRect(); - F = M.left - q.left - W.scrollLeft, E = M.top - q.top - W.scrollTop; - } - o.style.left = k - F + "px", o.style.top = O - E + "px"; - var N = c.innerWidth || Math.max(s.body.offsetWidth, s.documentElement.offsetWidth), - L = c.innerHeight || Math.max(s.body.offsetHeight, s.documentElement.offsetHeight); - T.appendChild(o), n.getInputField().setAttribute("aria-autocomplete", "list"), n.getInputField().setAttribute("aria-owns", this.id), n.getInputField().setAttribute("aria-activedescendant", this.id + "-" + this.selectedHint); - var m = t.options.moveOnOverlap ? o.getBoundingClientRect() : new DOMRect(), - z = t.options.paddingForScrollbar ? o.scrollHeight > o.clientHeight + 1 : !1, - x; - setTimeout(function () { - x = n.getScrollInfo(); - }); - var ot = m.bottom - L; - if (ot > 0) { - var P = m.bottom - m.top, - rt = y.top - (y.bottom - m.top); - if (rt - P > 0) o.style.top = (O = y.top - P - E) + "px", j = !1;else if (P > L) { - o.style.height = L - 5 + "px", o.style.top = (O = y.bottom - m.top - E) + "px"; - var V = n.getCursor(); - e.from.ch != V.ch && (y = n.cursorCoords(V), o.style.left = (k = y.left - F) + "px", m = o.getBoundingClientRect()); - } - } - var C = m.right - N; - if (z && (C += n.display.nativeBarWidth), C > 0 && (m.right - m.left > N && (o.style.width = N - 5 + "px", C -= m.right - m.left - N), o.style.left = (k = y.left - C - F) + "px"), z) for (var I = o.firstChild; I; I = I.nextSibling) I.style.paddingRight = n.display.nativeBarWidth + "px"; - if (n.addKeyMap(this.keyMap = et(t, { - moveFocus: function (d, g) { - i.changeActive(i.selectedHint + d, g); - }, - setFocus: function (d) { - i.changeActive(d); - }, - menuSize: function () { - return i.screenAmount(); - }, - length: h.length, - close: function () { - t.close(); - }, - pick: function () { - i.pick(); + var executeQueue = function () { + var cbs = pendingQueue; + pendingQueue = []; + cbs.forEach(cb); + }; + var cycle = function () { + return Promise.resolve().then(executeQueue); + }; + cycle(); + buffer = { + push: function (x) { + pendingQueue.push(x); + cycle(); }, - data: e - })), t.options.closeOnUnfocus) { - var Y; - n.on("blur", this.onBlur = function () { - Y = setTimeout(function () { - t.close(); - }, 100); - }), n.on("focus", this.onFocus = function () { - clearTimeout(Y); - }); - } - n.on("scroll", this.onScroll = function () { - var d = n.getScrollInfo(), - g = n.getWrapperElement().getBoundingClientRect(); - x || (x = n.getScrollInfo()); - var X = O + x.top - d.top, - R = X - (c.pageYOffset || (s.documentElement || s.body).scrollTop); - if (j || (R += o.offsetHeight), R <= g.top || R >= g.bottom) return t.close(); - o.style.top = X + "px", o.style.left = k + x.left - d.left + "px"; - }), r.on(o, "dblclick", function (d) { - var g = B(o, d.target || d.srcElement); - g && g.hintId != null && (i.changeActive(g.hintId), i.pick()); - }), r.on(o, "click", function (d) { - var g = B(o, d.target || d.srcElement); - g && g.hintId != null && (i.changeActive(g.hintId), t.options.completeOnSingleClick && i.pick()); - }), r.on(o, "mousedown", function () { - setTimeout(function () { - n.focus(); - }, 20); - }); - var $ = this.getSelectedHintRange(); - return ($.from !== 0 || $.to !== 0) && this.scrollToActive(), r.signal(e, "select", h[this.selectedHint], o.childNodes[this.selectedHint]), !0; - } - p(K, "Widget"), K.prototype = { - close: function () { - if (this.completion.widget == this) { - this.completion.widget = null, this.hints.parentNode && this.hints.parentNode.removeChild(this.hints), this.completion.cm.removeKeyMap(this.keyMap); - var t = this.completion.cm.getInputField(); - t.removeAttribute("aria-activedescendant"), t.removeAttribute("aria-owns"); - var e = this.completion.cm; - this.completion.options.closeOnUnfocus && (e.off("blur", this.onBlur), e.off("focus", this.onFocus)), e.off("scroll", this.onScroll); - } - }, - disable: function () { - this.completion.cm.removeKeyMap(this.keyMap); - var t = this; - this.keyMap = { - Enter: function () { - t.picked = !0; - } - }, this.completion.cm.addKeyMap(this.keyMap); - }, - pick: function () { - this.completion.pick(this.data, this.selectedHint); - }, - changeActive: function (t, e) { - if (t >= this.data.list.length ? t = e ? this.data.list.length - 1 : 0 : t < 0 && (t = e ? 0 : this.data.list.length - 1), this.selectedHint != t) { - var i = this.hints.childNodes[this.selectedHint]; - i && (i.className = i.className.replace(" " + v, ""), i.removeAttribute("aria-selected")), i = this.hints.childNodes[this.selectedHint = t], i.className += " " + v, i.setAttribute("aria-selected", "true"), this.completion.cm.getInputField().setAttribute("aria-activedescendant", i.id), this.scrollToActive(), r.signal(this.data, "select", this.data.list[this.selectedHint], i); + filter: function (filter) { + pendingQueue = pendingQueue.filter(filter); + return buffer; } - }, - scrollToActive: function () { - var t = this.getSelectedHintRange(), - e = this.hints.childNodes[t.from], - i = this.hints.childNodes[t.to], - n = this.hints.firstChild; - e.offsetTop < this.hints.scrollTop ? this.hints.scrollTop = e.offsetTop - n.offsetTop : i.offsetTop + i.offsetHeight > this.hints.scrollTop + this.hints.clientHeight && (this.hints.scrollTop = i.offsetTop + i.offsetHeight - this.hints.clientHeight + n.offsetTop); - }, - screenAmount: function () { - return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1; - }, - getSelectedHintRange: function () { - var t = this.completion.options.scrollMargin || 0; - return { - from: Math.max(0, this.selectedHint - t), - to: Math.min(this.data.list.length - 1, this.selectedHint + t) - }; - } - }; - function it(t, e) { - if (!t.somethingSelected()) return e; - for (var i = [], n = 0; n < e.length; n++) e[n].supportsSelection && i.push(e[n]); - return i; - } - p(it, "applicableHelpers"); - function U(t, e, i, n) { - if (t.async) t(e, n, i);else { - var s = t(e, i); - s && s.then ? s.then(n) : n(s); - } - } - p(U, "fetchHints"); - function nt(t, e) { - var i = t.getHelpers(e, "hint"), - n; - if (i.length) { - var s = p(function (c, o, f) { - var h = it(c, i); - function u(l) { - if (l == h.length) return o(null); - U(h[l], c, f, function (a) { - a && a.list.length > 0 ? o(a) : u(l + 1); - }); - } - p(u, "run"), u(0); - }, "resolved"); - return s.async = !0, s.supportsSelection = !0, s; - } else return (n = t.getHelper(t.getCursor(), "hintWords")) ? function (c) { - return r.hint.fromList(c, { - words: n - }); - } : r.hint.anyword ? function (c, o) { - return r.hint.anyword(c, o); - } : function () {}; - } - p(nt, "resolveAutoHints"), r.registerHelper("hint", "auto", { - resolve: nt - }), r.registerHelper("hint", "fromList", function (t, e) { - var i = t.getCursor(), - n = t.getTokenAt(i), - s, - c = r.Pos(i.line, n.start), - o = i; - n.start < i.ch && /\w/.test(n.string.charAt(i.ch - n.start - 1)) ? s = n.string.substr(0, i.ch - n.start) : (s = "", c = i); - for (var f = [], h = 0; h < e.words.length; h++) { - var u = e.words[h]; - u.slice(0, s.length) == s && f.push(u); - } - if (f.length) return { - list: f, - from: c, - to: o }; - }), r.commands.autocomplete = r.showHint; - var D = { - hint: r.hint.auto, - completeSingle: !0, - alignWithWord: !0, - closeCharacters: /[\s()\[\]{};:>,]/, - closeOnPick: !0, - closeOnUnfocus: !0, - updateOnCursorActivity: !0, - completeOnSingleClick: !0, - container: null, - customKeys: null, - extraKeys: null, - paddingForScrollbar: !0, - moveOnOverlap: !0 - }; - r.defineOption("hintOptions", null); - }); -})(); -var J = ht.exports; -const at = G.getDefaultExportFromCjs(J), - ft = lt({ - __proto__: null, - default: at - }, [J]); -exports.showHint = ft; - -/***/ }), - -/***/ "../../graphiql-react/dist/sublime.cjs.js": -/*!************************************************!*\ - !*** ../../graphiql-react/dist/sublime.cjs.js ***! - \************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var _ = Object.defineProperty; -var v = (m, B) => _(m, "name", { - value: B, - configurable: !0 -}); -const E = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"), - Y = __webpack_require__(/*! ./searchcursor.cjs2.js */ "../../graphiql-react/dist/searchcursor.cjs2.js"), - z = __webpack_require__(/*! ./matchbrackets.cjs2.js */ "../../graphiql-react/dist/matchbrackets.cjs2.js"); -function J(m, B) { - for (var h = 0; h < B.length; h++) { - const a = B[h]; - if (typeof a != "string" && !Array.isArray(a)) { - for (const f in a) if (f !== "default" && !(f in m)) { - const A = Object.getOwnPropertyDescriptor(a, f); - A && Object.defineProperty(m, f, A.get ? A : { - enumerable: !0, - get: () => a[f] - }); - } } + }; + return medium; +} +function createMedium(defaults, middleware) { + if (middleware === void 0) { + middleware = ItoI; } - return Object.freeze(Object.defineProperty(m, Symbol.toStringTag, { - value: "Module" - })); + return innerCreateMedium(defaults, middleware); +} +// eslint-disable-next-line @typescript-eslint/ban-types +function createSidecarMedium(options) { + if (options === void 0) { + options = {}; + } + var medium = innerCreateMedium(null); + medium.options = (0, _tslib.__assign)({ + async: true, + ssr: false + }, options); + return medium; } -v(J, "_mergeNamespaces"); -var G = { - exports: {} -}; -(function (m, B) { - (function (h) { - h(E.requireCodemirror(), Y.requireSearchcursor(), z.requireMatchbrackets()); - })(function (h) { - var a = h.commands, - f = h.Pos; - function A(e, t, n) { - if (n < 0 && t.ch == 0) return e.clipPos(f(t.line - 1)); - var r = e.getLine(t.line); - if (n > 0 && t.ch >= r.length) return e.clipPos(f(t.line + 1, 0)); - for (var l = "start", i, o = t.ch, s = o, u = n < 0 ? 0 : r.length, d = 0; s != u; s += n, d++) { - var p = r.charAt(n < 0 ? s - 1 : s), - c = p != "_" && h.isWordChar(p) ? "w" : "o"; - if (c == "w" && p.toUpperCase() == p && (c = "W"), l == "start") c != "o" ? (l = "in", i = c) : o = s + n;else if (l == "in" && i != c) { - if (i == "w" && c == "W" && n < 0 && s--, i == "W" && c == "w" && n > 0) if (s == o + 1) { - i = "w"; - continue; - } else s--; - break; - } - } - return f(t.line, s); - } - v(A, "findPosSubword"); - function T(e, t) { - e.extendSelectionsBy(function (n) { - return e.display.shift || e.doc.extend || n.empty() ? A(e.doc, n.head, t) : t < 0 ? n.from() : n.to(); - }); - } - v(T, "moveSubword"), a.goSubwordLeft = function (e) { - T(e, -1); - }, a.goSubwordRight = function (e) { - T(e, 1); - }, a.scrollLineUp = function (e) { - var t = e.getScrollInfo(); - if (!e.somethingSelected()) { - var n = e.lineAtHeight(t.top + t.clientHeight, "local"); - e.getCursor().line >= n && e.execCommand("goLineUp"); - } - e.scrollTo(null, t.top - e.defaultTextHeight()); - }, a.scrollLineDown = function (e) { - var t = e.getScrollInfo(); - if (!e.somethingSelected()) { - var n = e.lineAtHeight(t.top, "local") + 1; - e.getCursor().line <= n && e.execCommand("goLineDown"); - } - e.scrollTo(null, t.top + e.defaultTextHeight()); - }, a.splitSelectionByLine = function (e) { - for (var t = e.listSelections(), n = [], r = 0; r < t.length; r++) for (var l = t[r].from(), i = t[r].to(), o = l.line; o <= i.line; ++o) i.line > l.line && o == i.line && i.ch == 0 || n.push({ - anchor: o == l.line ? l : f(o, 0), - head: o == i.line ? i : f(o) - }); - e.setSelections(n, 0); - }, a.singleSelectionTop = function (e) { - var t = e.listSelections()[0]; - e.setSelection(t.anchor, t.head, { - scroll: !1 - }); - }, a.selectLine = function (e) { - for (var t = e.listSelections(), n = [], r = 0; r < t.length; r++) { - var l = t[r]; - n.push({ - anchor: f(l.from().line, 0), - head: f(l.to().line + 1, 0) - }); - } - e.setSelections(n); - }; - function x(e, t) { - if (e.isReadOnly()) return h.Pass; - e.operation(function () { - for (var n = e.listSelections().length, r = [], l = -1, i = 0; i < n; i++) { - var o = e.listSelections()[i].head; - if (!(o.line <= l)) { - var s = f(o.line + (t ? 0 : 1), 0); - e.replaceRange(` -`, s, null, "+insertLine"), e.indentLine(s.line, null, !0), r.push({ - head: s, - anchor: s - }), l = o.line + 1; - } - } - e.setSelections(r); - }), e.execCommand("indentAuto"); - } - v(x, "insertLine"), a.insertLineAfter = function (e) { - return x(e, !1); - }, a.insertLineBefore = function (e) { - return x(e, !0); - }; - function K(e, t) { - for (var n = t.ch, r = n, l = e.getLine(t.line); n && h.isWordChar(l.charAt(n - 1));) --n; - for (; r < l.length && h.isWordChar(l.charAt(r));) ++r; - return { - from: f(t.line, n), - to: f(t.line, r), - word: l.slice(n, r) - }; - } - v(K, "wordAt"), a.selectNextOccurrence = function (e) { - var t = e.getCursor("from"), - n = e.getCursor("to"), - r = e.state.sublimeFindFullWord == e.doc.sel; - if (h.cmpPos(t, n) == 0) { - var l = K(e, t); - if (!l.word) return; - e.setSelection(l.from, l.to), r = !0; - } else { - var i = e.getRange(t, n), - o = r ? new RegExp("\\b" + i + "\\b") : i, - s = e.getSearchCursor(o, n), - u = s.findNext(); - if (u || (s = e.getSearchCursor(o, f(e.firstLine(), 0)), u = s.findNext()), !u || H(e.listSelections(), s.from(), s.to())) return; - e.addSelection(s.from(), s.to()); - } - r && (e.state.sublimeFindFullWord = e.doc.sel); - }, a.skipAndSelectNextOccurrence = function (e) { - var t = e.getCursor("anchor"), - n = e.getCursor("head"); - a.selectNextOccurrence(e), h.cmpPos(t, n) != 0 && e.doc.setSelections(e.doc.listSelections().filter(function (r) { - return r.anchor != t || r.head != n; - })); - }; - function y(e, t) { - for (var n = e.listSelections(), r = [], l = 0; l < n.length; l++) { - var i = n[l], - o = e.findPosV(i.anchor, t, "line", i.anchor.goalColumn), - s = e.findPosV(i.head, t, "line", i.head.goalColumn); - o.goalColumn = i.anchor.goalColumn != null ? i.anchor.goalColumn : e.cursorCoords(i.anchor, "div").left, s.goalColumn = i.head.goalColumn != null ? i.head.goalColumn : e.cursorCoords(i.head, "div").left; - var u = { - anchor: o, - head: s - }; - r.push(i), r.push(u); - } - e.setSelections(r); - } - v(y, "addCursorToSelection"), a.addCursorToPrevLine = function (e) { - y(e, -1); - }, a.addCursorToNextLine = function (e) { - y(e, 1); - }; - function H(e, t, n) { - for (var r = 0; r < e.length; r++) if (h.cmpPos(e[r].from(), t) == 0 && h.cmpPos(e[r].to(), n) == 0) return !0; - return !1; - } - v(H, "isSelectedRange"); - var P = "(){}[]"; - function U(e) { - for (var t = e.listSelections(), n = [], r = 0; r < t.length; r++) { - var l = t[r], - i = l.head, - o = e.scanForBracket(i, -1); - if (!o) return !1; - for (;;) { - var s = e.scanForBracket(i, 1); - if (!s) return !1; - if (s.ch == P.charAt(P.indexOf(o.ch) + 1)) { - var u = f(o.pos.line, o.pos.ch + 1); - if (h.cmpPos(u, l.from()) == 0 && h.cmpPos(s.pos, l.to()) == 0) { - if (o = e.scanForBracket(o.pos, -1), !o) return !1; - } else { - n.push({ - anchor: u, - head: s.pos - }); - break; - } - } - i = f(s.pos.line, s.pos.ch + 1); - } - } - return e.setSelections(n), !0; - } - v(U, "selectBetweenBrackets"), a.selectScope = function (e) { - U(e) || e.execCommand("selectAll"); - }, a.selectBetweenBrackets = function (e) { - if (!U(e)) return h.Pass; - }; - function I(e) { - return e ? /\bpunctuation\b/.test(e) ? e : void 0 : null; - } - v(I, "puncType"), a.goToBracket = function (e) { - e.extendSelectionsBy(function (t) { - var n = e.scanForBracket(t.head, 1, I(e.getTokenTypeAt(t.head))); - if (n && h.cmpPos(n.pos, t.head) != 0) return n.pos; - var r = e.scanForBracket(t.head, -1, I(e.getTokenTypeAt(f(t.head.line, t.head.ch + 1)))); - return r && f(r.pos.line, r.pos.ch + 1) || t.head; - }); - }, a.swapLineUp = function (e) { - if (e.isReadOnly()) return h.Pass; - for (var t = e.listSelections(), n = [], r = e.firstLine() - 1, l = [], i = 0; i < t.length; i++) { - var o = t[i], - s = o.from().line - 1, - u = o.to().line; - l.push({ - anchor: f(o.anchor.line - 1, o.anchor.ch), - head: f(o.head.line - 1, o.head.ch) - }), o.to().ch == 0 && !o.empty() && --u, s > r ? n.push(s, u) : n.length && (n[n.length - 1] = u), r = u; - } - e.operation(function () { - for (var d = 0; d < n.length; d += 2) { - var p = n[d], - c = n[d + 1], - b = e.getLine(p); - e.replaceRange("", f(p, 0), f(p + 1, 0), "+swapLine"), c > e.lastLine() ? e.replaceRange(` -` + b, f(e.lastLine()), null, "+swapLine") : e.replaceRange(b + ` -`, f(c, 0), null, "+swapLine"); - } - e.setSelections(l), e.scrollIntoView(); - }); - }, a.swapLineDown = function (e) { - if (e.isReadOnly()) return h.Pass; - for (var t = e.listSelections(), n = [], r = e.lastLine() + 1, l = t.length - 1; l >= 0; l--) { - var i = t[l], - o = i.to().line + 1, - s = i.from().line; - i.to().ch == 0 && !i.empty() && o--, o < r ? n.push(o, s) : n.length && (n[n.length - 1] = s), r = s; - } - e.operation(function () { - for (var u = n.length - 2; u >= 0; u -= 2) { - var d = n[u], - p = n[u + 1], - c = e.getLine(d); - d == e.lastLine() ? e.replaceRange("", f(d - 1), f(d), "+swapLine") : e.replaceRange("", f(d, 0), f(d + 1, 0), "+swapLine"), e.replaceRange(c + ` -`, f(p, 0), null, "+swapLine"); - } - e.scrollIntoView(); - }); - }, a.toggleCommentIndented = function (e) { - e.toggleComment({ - indent: !0 - }); - }, a.joinLines = function (e) { - for (var t = e.listSelections(), n = [], r = 0; r < t.length; r++) { - for (var l = t[r], i = l.from(), o = i.line, s = l.to().line; r < t.length - 1 && t[r + 1].from().line == s;) s = t[++r].to().line; - n.push({ - start: o, - end: s, - anchor: !l.empty() && i - }); - } - e.operation(function () { - for (var u = 0, d = [], p = 0; p < n.length; p++) { - for (var c = n[p], b = c.anchor && f(c.anchor.line - u, c.anchor.ch), w, g = c.start; g <= c.end; g++) { - var S = g - u; - g == c.end && (w = f(S, e.getLine(S).length + 1)), S < e.lastLine() && (e.replaceRange(" ", f(S), f(S + 1, /^\s*/.exec(e.getLine(S + 1))[0].length)), ++u); - } - d.push({ - anchor: b || w, - head: w - }); - } - e.setSelections(d, 0); - }); - }, a.duplicateLine = function (e) { - e.operation(function () { - for (var t = e.listSelections().length, n = 0; n < t; n++) { - var r = e.listSelections()[n]; - r.empty() ? e.replaceRange(e.getLine(r.head.line) + ` -`, f(r.head.line, 0)) : e.replaceRange(e.getRange(r.from(), r.to()), r.from()); - } - e.scrollIntoView(); - }); - }; - function R(e, t, n) { - if (e.isReadOnly()) return h.Pass; - for (var r = e.listSelections(), l = [], i, o = 0; o < r.length; o++) { - var s = r[o]; - if (!s.empty()) { - for (var u = s.from().line, d = s.to().line; o < r.length - 1 && r[o + 1].from().line == d;) d = r[++o].to().line; - r[o].to().ch || d--, l.push(u, d); - } - } - l.length ? i = !0 : l.push(e.firstLine(), e.lastLine()), e.operation(function () { - for (var p = [], c = 0; c < l.length; c += 2) { - var b = l[c], - w = l[c + 1], - g = f(b, 0), - S = f(w), - F = e.getRange(g, S, !1); - t ? F.sort(function (k, L) { - return k < L ? -n : k == L ? 0 : n; - }) : F.sort(function (k, L) { - var W = k.toUpperCase(), - M = L.toUpperCase(); - return W != M && (k = W, L = M), k < L ? -n : k == L ? 0 : n; - }), e.replaceRange(F, g, S), i && p.push({ - anchor: g, - head: f(w + 1, 0) - }); - } - i && e.setSelections(p, 0); - }); - } - v(R, "sortLines"), a.sortLines = function (e) { - R(e, !0, 1); - }, a.reverseSortLines = function (e) { - R(e, !0, -1); - }, a.sortLinesInsensitive = function (e) { - R(e, !1, 1); - }, a.reverseSortLinesInsensitive = function (e) { - R(e, !1, -1); - }, a.nextBookmark = function (e) { - var t = e.state.sublimeBookmarks; - if (t) for (; t.length;) { - var n = t.shift(), - r = n.find(); - if (r) return t.push(n), e.setSelection(r.from, r.to); - } - }, a.prevBookmark = function (e) { - var t = e.state.sublimeBookmarks; - if (t) for (; t.length;) { - t.unshift(t.pop()); - var n = t[t.length - 1].find(); - if (!n) t.pop();else return e.setSelection(n.from, n.to); - } - }, a.toggleBookmark = function (e) { - for (var t = e.listSelections(), n = e.state.sublimeBookmarks || (e.state.sublimeBookmarks = []), r = 0; r < t.length; r++) { - for (var l = t[r].from(), i = t[r].to(), o = t[r].empty() ? e.findMarksAt(l) : e.findMarks(l, i), s = 0; s < o.length; s++) if (o[s].sublimeBookmark) { - o[s].clear(); - for (var u = 0; u < n.length; u++) n[u] == o[s] && n.splice(u--, 1); - break; - } - s == o.length && n.push(e.markText(l, i, { - sublimeBookmark: !0, - clearWhenEmpty: !1 - })); - } - }, a.clearBookmarks = function (e) { - var t = e.state.sublimeBookmarks; - if (t) for (var n = 0; n < t.length; n++) t[n].clear(); - t.length = 0; - }, a.selectBookmarks = function (e) { - var t = e.state.sublimeBookmarks, - n = []; - if (t) for (var r = 0; r < t.length; r++) { - var l = t[r].find(); - l ? n.push({ - anchor: l.from, - head: l.to - }) : t.splice(r--, 0); - } - n.length && e.setSelections(n, 0); - }; - function D(e, t) { - e.operation(function () { - for (var n = e.listSelections(), r = [], l = [], i = 0; i < n.length; i++) { - var o = n[i]; - o.empty() ? (r.push(i), l.push("")) : l.push(t(e.getRange(o.from(), o.to()))); - } - e.replaceSelections(l, "around", "case"); - for (var i = r.length - 1, s; i >= 0; i--) { - var o = n[r[i]]; - if (!(s && h.cmpPos(o.head, s) > 0)) { - var u = K(e, o.head); - s = u.from, e.replaceRange(t(u.word), u.from, u.to); - } - } - }); - } - v(D, "modifyWordOrSelection"), a.smartBackspace = function (e) { - if (e.somethingSelected()) return h.Pass; - e.operation(function () { - for (var t = e.listSelections(), n = e.getOption("indentUnit"), r = t.length - 1; r >= 0; r--) { - var l = t[r].head, - i = e.getRange({ - line: l.line, - ch: 0 - }, l), - o = h.countColumn(i, null, e.getOption("tabSize")), - s = e.findPosH(l, -1, "char", !1); - if (i && !/\S/.test(i) && o % n == 0) { - var u = new f(l.line, h.findColumn(i, o - n, n)); - u.ch != l.ch && (s = u); - } - e.replaceRange("", s, l, "+delete"); - } - }); - }, a.delLineRight = function (e) { - e.operation(function () { - for (var t = e.listSelections(), n = t.length - 1; n >= 0; n--) e.replaceRange("", t[n].anchor, f(t[n].to().line), "+delete"); - e.scrollIntoView(); - }); - }, a.upcaseAtCursor = function (e) { - D(e, function (t) { - return t.toUpperCase(); - }); - }, a.downcaseAtCursor = function (e) { - D(e, function (t) { - return t.toLowerCase(); - }); - }, a.setSublimeMark = function (e) { - e.state.sublimeMark && e.state.sublimeMark.clear(), e.state.sublimeMark = e.setBookmark(e.getCursor()); - }, a.selectToSublimeMark = function (e) { - var t = e.state.sublimeMark && e.state.sublimeMark.find(); - t && e.setSelection(e.getCursor(), t); - }, a.deleteToSublimeMark = function (e) { - var t = e.state.sublimeMark && e.state.sublimeMark.find(); - if (t) { - var n = e.getCursor(), - r = t; - if (h.cmpPos(n, r) > 0) { - var l = r; - r = n, n = l; - } - e.state.sublimeKilled = e.getRange(n, r), e.replaceRange("", n, r); - } - }, a.swapWithSublimeMark = function (e) { - var t = e.state.sublimeMark && e.state.sublimeMark.find(); - t && (e.state.sublimeMark.clear(), e.state.sublimeMark = e.setBookmark(e.getCursor()), e.setCursor(t)); - }, a.sublimeYank = function (e) { - e.state.sublimeKilled != null && e.replaceSelection(e.state.sublimeKilled, null, "paste"); - }, a.showInCenter = function (e) { - var t = e.cursorCoords(null, "local"); - e.scrollTo(null, (t.top + t.bottom) / 2 - e.getScrollInfo().clientHeight / 2); - }; - function N(e) { - var t = e.getCursor("from"), - n = e.getCursor("to"); - if (h.cmpPos(t, n) == 0) { - var r = K(e, t); - if (!r.word) return; - t = r.from, n = r.to; - } - return { - from: t, - to: n, - query: e.getRange(t, n), - word: r - }; - } - v(N, "getTarget"); - function O(e, t) { - var n = N(e); - if (n) { - var r = n.query, - l = e.getSearchCursor(r, t ? n.to : n.from); - (t ? l.findNext() : l.findPrevious()) ? e.setSelection(l.from(), l.to()) : (l = e.getSearchCursor(r, t ? f(e.firstLine(), 0) : e.clipPos(f(e.lastLine()))), (t ? l.findNext() : l.findPrevious()) ? e.setSelection(l.from(), l.to()) : n.word && e.setSelection(n.from, n.to)); - } - } - v(O, "findAndGoTo"), a.findUnder = function (e) { - O(e, !0); - }, a.findUnderPrevious = function (e) { - O(e, !1); - }, a.findAllUnder = function (e) { - var t = N(e); - if (t) { - for (var n = e.getSearchCursor(t.query), r = [], l = -1; n.findNext();) r.push({ - anchor: n.from(), - head: n.to() - }), n.from().line <= t.from.line && n.from().ch <= t.from.ch && l++; - e.setSelections(r, l); - } - }; - var C = h.keyMap; - C.macSublime = { - "Cmd-Left": "goLineStartSmart", - "Shift-Tab": "indentLess", - "Shift-Ctrl-K": "deleteLine", - "Alt-Q": "wrapLines", - "Ctrl-Left": "goSubwordLeft", - "Ctrl-Right": "goSubwordRight", - "Ctrl-Alt-Up": "scrollLineUp", - "Ctrl-Alt-Down": "scrollLineDown", - "Cmd-L": "selectLine", - "Shift-Cmd-L": "splitSelectionByLine", - Esc: "singleSelectionTop", - "Cmd-Enter": "insertLineAfter", - "Shift-Cmd-Enter": "insertLineBefore", - "Cmd-D": "selectNextOccurrence", - "Shift-Cmd-Space": "selectScope", - "Shift-Cmd-M": "selectBetweenBrackets", - "Cmd-M": "goToBracket", - "Cmd-Ctrl-Up": "swapLineUp", - "Cmd-Ctrl-Down": "swapLineDown", - "Cmd-/": "toggleCommentIndented", - "Cmd-J": "joinLines", - "Shift-Cmd-D": "duplicateLine", - F5: "sortLines", - "Shift-F5": "reverseSortLines", - "Cmd-F5": "sortLinesInsensitive", - "Shift-Cmd-F5": "reverseSortLinesInsensitive", - F2: "nextBookmark", - "Shift-F2": "prevBookmark", - "Cmd-F2": "toggleBookmark", - "Shift-Cmd-F2": "clearBookmarks", - "Alt-F2": "selectBookmarks", - Backspace: "smartBackspace", - "Cmd-K Cmd-D": "skipAndSelectNextOccurrence", - "Cmd-K Cmd-K": "delLineRight", - "Cmd-K Cmd-U": "upcaseAtCursor", - "Cmd-K Cmd-L": "downcaseAtCursor", - "Cmd-K Cmd-Space": "setSublimeMark", - "Cmd-K Cmd-A": "selectToSublimeMark", - "Cmd-K Cmd-W": "deleteToSublimeMark", - "Cmd-K Cmd-X": "swapWithSublimeMark", - "Cmd-K Cmd-Y": "sublimeYank", - "Cmd-K Cmd-C": "showInCenter", - "Cmd-K Cmd-G": "clearBookmarks", - "Cmd-K Cmd-Backspace": "delLineLeft", - "Cmd-K Cmd-1": "foldAll", - "Cmd-K Cmd-0": "unfoldAll", - "Cmd-K Cmd-J": "unfoldAll", - "Ctrl-Shift-Up": "addCursorToPrevLine", - "Ctrl-Shift-Down": "addCursorToNextLine", - "Cmd-F3": "findUnder", - "Shift-Cmd-F3": "findUnderPrevious", - "Alt-F3": "findAllUnder", - "Shift-Cmd-[": "fold", - "Shift-Cmd-]": "unfold", - "Cmd-I": "findIncremental", - "Shift-Cmd-I": "findIncrementalReverse", - "Cmd-H": "replace", - F3: "findNext", - "Shift-F3": "findPrev", - fallthrough: "macDefault" - }, h.normalizeKeyMap(C.macSublime), C.pcSublime = { - "Shift-Tab": "indentLess", - "Shift-Ctrl-K": "deleteLine", - "Alt-Q": "wrapLines", - "Ctrl-T": "transposeChars", - "Alt-Left": "goSubwordLeft", - "Alt-Right": "goSubwordRight", - "Ctrl-Up": "scrollLineUp", - "Ctrl-Down": "scrollLineDown", - "Ctrl-L": "selectLine", - "Shift-Ctrl-L": "splitSelectionByLine", - Esc: "singleSelectionTop", - "Ctrl-Enter": "insertLineAfter", - "Shift-Ctrl-Enter": "insertLineBefore", - "Ctrl-D": "selectNextOccurrence", - "Shift-Ctrl-Space": "selectScope", - "Shift-Ctrl-M": "selectBetweenBrackets", - "Ctrl-M": "goToBracket", - "Shift-Ctrl-Up": "swapLineUp", - "Shift-Ctrl-Down": "swapLineDown", - "Ctrl-/": "toggleCommentIndented", - "Ctrl-J": "joinLines", - "Shift-Ctrl-D": "duplicateLine", - F9: "sortLines", - "Shift-F9": "reverseSortLines", - "Ctrl-F9": "sortLinesInsensitive", - "Shift-Ctrl-F9": "reverseSortLinesInsensitive", - F2: "nextBookmark", - "Shift-F2": "prevBookmark", - "Ctrl-F2": "toggleBookmark", - "Shift-Ctrl-F2": "clearBookmarks", - "Alt-F2": "selectBookmarks", - Backspace: "smartBackspace", - "Ctrl-K Ctrl-D": "skipAndSelectNextOccurrence", - "Ctrl-K Ctrl-K": "delLineRight", - "Ctrl-K Ctrl-U": "upcaseAtCursor", - "Ctrl-K Ctrl-L": "downcaseAtCursor", - "Ctrl-K Ctrl-Space": "setSublimeMark", - "Ctrl-K Ctrl-A": "selectToSublimeMark", - "Ctrl-K Ctrl-W": "deleteToSublimeMark", - "Ctrl-K Ctrl-X": "swapWithSublimeMark", - "Ctrl-K Ctrl-Y": "sublimeYank", - "Ctrl-K Ctrl-C": "showInCenter", - "Ctrl-K Ctrl-G": "clearBookmarks", - "Ctrl-K Ctrl-Backspace": "delLineLeft", - "Ctrl-K Ctrl-1": "foldAll", - "Ctrl-K Ctrl-0": "unfoldAll", - "Ctrl-K Ctrl-J": "unfoldAll", - "Ctrl-Alt-Up": "addCursorToPrevLine", - "Ctrl-Alt-Down": "addCursorToNextLine", - "Ctrl-F3": "findUnder", - "Shift-Ctrl-F3": "findUnderPrevious", - "Alt-F3": "findAllUnder", - "Shift-Ctrl-[": "fold", - "Shift-Ctrl-]": "unfold", - "Ctrl-I": "findIncremental", - "Shift-Ctrl-I": "findIncrementalReverse", - "Ctrl-H": "replace", - F3: "findNext", - "Shift-F3": "findPrev", - fallthrough: "pcDefault" - }, h.normalizeKeyMap(C.pcSublime); - var V = C.default == C.macDefault; - C.sublime = V ? C.macSublime : C.pcSublime; - }); -})(); -var q = G.exports; -const Q = E.getDefaultExportFromCjs(q), - X = J({ - __proto__: null, - default: Q - }, [q]); -exports.sublime = X; /***/ }), -/***/ "../../graphiql-toolkit/esm/async-helpers/index.js": -/*!*********************************************************!*\ - !*** ../../graphiql-toolkit/esm/async-helpers/index.js ***! - \*********************************************************/ -/***/ (function(__unused_webpack_module, exports) { +/***/ "../../../node_modules/use-sidecar/dist/es2015/renderProp.js": +/*!*******************************************************************!*\ + !*** ../../../node_modules/use-sidecar/dist/es2015/renderProp.js ***! + \*******************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.fetcherReturnToPromise = fetcherReturnToPromise; -exports.isAsyncIterable = isAsyncIterable; -exports.isObservable = isObservable; -exports.isPromise = isPromise; -var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function (resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); +exports.renderCar = renderCar; +var _tslib = __webpack_require__(/*! tslib */ "../../../node_modules/tslib/tslib.es6.mjs"); +var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); +var React = _react; +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +function renderCar(WrappedComponent, defaults) { + function State(_a) { + var stateRef = _a.stateRef, + props = _a.props; + var renderTarget = (0, _react.useCallback)(function SideTarget() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); + (0, _react.useLayoutEffect)(function () { + stateRef.current(args); + }); + return null; + }, []); + // @ts-ignore + return /*#__PURE__*/React.createElement(WrappedComponent, (0, _tslib.__assign)({}, props, { + children: renderTarget + })); + } + var Children = /*#__PURE__*/React.memo(function (_a) { + var stateRef = _a.stateRef, + defaultState = _a.defaultState, + children = _a.children; + var _b = (0, _react.useState)(defaultState.current), + state = _b[0], + setState = _b[1]; + (0, _react.useEffect)(function () { + stateRef.current = setState; + }, []); + return children.apply(void 0, state); + }, function () { + return true; }); -}; -function isPromise(value) { - return typeof value === 'object' && value !== null && typeof value.then === 'function'; -} -function observableToPromise(observable) { - return new Promise((resolve, reject) => { - const subscription = observable.subscribe({ - next(v) { - resolve(v); - subscription.unsubscribe(); - }, - error: reject, - complete() { - reject(new Error('no value resolved')); - } + return function Combiner(props) { + var defaultState = React.useRef(defaults(props)); + var ref = React.useRef(function (state) { + return defaultState.current = state; }); - }); -} -function isObservable(value) { - return typeof value === 'object' && value !== null && 'subscribe' in value && typeof value.subscribe === 'function'; -} -function isAsyncIterable(input) { - return typeof input === 'object' && input !== null && (input[Symbol.toStringTag] === 'AsyncGenerator' || Symbol.asyncIterator in input); -} -function asyncIterableToPromise(input) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const iteratorReturn = (_a = ('return' in input ? input : input[Symbol.asyncIterator]()).return) === null || _a === void 0 ? void 0 : _a.bind(input); - const iteratorNext = ('next' in input ? input : input[Symbol.asyncIterator]()).next.bind(input); - const result = yield iteratorNext(); - void (iteratorReturn === null || iteratorReturn === void 0 ? void 0 : iteratorReturn()); - return result.value; - }); -} -function fetcherReturnToPromise(fetcherResult) { - return __awaiter(this, void 0, void 0, function* () { - const result = yield fetcherResult; - if (isAsyncIterable(result)) { - return asyncIterableToPromise(result); - } - if (isObservable(result)) { - return observableToPromise(result); - } - return result; - }); + return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(State, { + stateRef: ref, + props: props + }), /*#__PURE__*/React.createElement(Children, { + stateRef: ref, + defaultState: defaultState, + children: props.children + })); + }; } /***/ }), -/***/ "../../graphiql-toolkit/esm/create-fetcher/createFetcher.js": -/*!******************************************************************!*\ - !*** ../../graphiql-toolkit/esm/create-fetcher/createFetcher.js ***! - \******************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ "../../../node_modules/vscode-languageserver-types/lib/esm/main.js": +/*!*************************************************************************!*\ + !*** ../../../node_modules/vscode-languageserver-types/lib/esm/main.js ***! + \*************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + * ------------------------------------------------------------------------------------------ */ Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.createGraphiQLFetcher = createGraphiQLFetcher; -var _lib = __webpack_require__(/*! ./lib */ "../../graphiql-toolkit/esm/create-fetcher/lib.js"); -function createGraphiQLFetcher(options) { - let httpFetch; - if (typeof window !== 'undefined' && window.fetch) { - httpFetch = window.fetch; +exports.uinteger = exports.integer = exports.WorkspaceSymbol = exports.WorkspaceFolder = exports.WorkspaceEdit = exports.WorkspaceChange = exports.VersionedTextDocumentIdentifier = exports.URI = exports.TextEdit = exports.TextDocumentItem = exports.TextDocumentIdentifier = exports.TextDocumentEdit = exports.TextDocument = exports.SymbolTag = exports.SymbolKind = exports.SymbolInformation = exports.SignatureInformation = exports.SemanticTokens = exports.SemanticTokenTypes = exports.SemanticTokenModifiers = exports.SelectionRange = exports.RenameFile = exports.Range = exports.Position = exports.ParameterInformation = exports.OptionalVersionedTextDocumentIdentifier = exports.MarkupKind = exports.MarkupContent = exports.MarkedString = exports.LocationLink = exports.Location = exports.InsertTextMode = exports.InsertTextFormat = exports.InsertReplaceEdit = exports.InlineValueVariableLookup = exports.InlineValueText = exports.InlineValueEvaluatableExpression = exports.InlineValueContext = exports.InlayHintLabelPart = exports.InlayHintKind = exports.InlayHint = exports.Hover = exports.FormattingOptions = exports.FoldingRangeKind = exports.FoldingRange = exports.EOL = exports.DocumentUri = exports.DocumentSymbol = exports.DocumentLink = exports.DocumentHighlightKind = exports.DocumentHighlight = exports.DiagnosticTag = exports.DiagnosticSeverity = exports.DiagnosticRelatedInformation = exports.Diagnostic = exports.DeleteFile = exports.CreateFile = exports.CompletionList = exports.CompletionItemTag = exports.CompletionItemLabelDetails = exports.CompletionItemKind = exports.CompletionItem = exports.Command = exports.ColorPresentation = exports.ColorInformation = exports.Color = exports.CodeLens = exports.CodeDescription = exports.CodeActionTriggerKind = exports.CodeActionKind = exports.CodeActionContext = exports.CodeAction = exports.ChangeAnnotationIdentifier = exports.ChangeAnnotation = exports.AnnotatedTextEdit = void 0; +var DocumentUri; +(function (DocumentUri) { + function is(value) { + return typeof value === 'string'; } - if ((options === null || options === void 0 ? void 0 : options.enableIncrementalDelivery) === null || options.enableIncrementalDelivery !== false) { - options.enableIncrementalDelivery = true; + DocumentUri.is = is; +})(DocumentUri || (exports.DocumentUri = DocumentUri = {})); +var URI; +(function (URI) { + function is(value) { + return typeof value === 'string'; } - if (options.fetch) { - httpFetch = options.fetch; + URI.is = is; +})(URI || (exports.URI = URI = {})); +var integer; +(function (integer) { + integer.MIN_VALUE = -2147483648; + integer.MAX_VALUE = 2147483647; + function is(value) { + return typeof value === 'number' && integer.MIN_VALUE <= value && value <= integer.MAX_VALUE; } - if (!httpFetch) { - throw new Error('No valid fetcher implementation available'); + integer.is = is; +})(integer || (exports.integer = integer = {})); +var uinteger; +(function (uinteger) { + uinteger.MIN_VALUE = 0; + uinteger.MAX_VALUE = 2147483647; + function is(value) { + return typeof value === 'number' && uinteger.MIN_VALUE <= value && value <= uinteger.MAX_VALUE; } - const simpleFetcher = (0, _lib.createSimpleFetcher)(options, httpFetch); - const httpFetcher = options.enableIncrementalDelivery ? (0, _lib.createMultipartFetcher)(options, httpFetch) : simpleFetcher; - return (graphQLParams, fetcherOpts) => { - if (graphQLParams.operationName === 'IntrospectionQuery') { - return (options.schemaFetcher || simpleFetcher)(graphQLParams, fetcherOpts); + uinteger.is = is; +})(uinteger || (exports.uinteger = uinteger = {})); +/** + * The Position namespace provides helper functions to work with + * {@link Position} literals. + */ +var Position; +(function (Position) { + /** + * Creates a new Position literal from the given line and character. + * @param line The position's line. + * @param character The position's character. + */ + function create(line, character) { + if (line === Number.MAX_VALUE) { + line = uinteger.MAX_VALUE; } - const isSubscription = (fetcherOpts === null || fetcherOpts === void 0 ? void 0 : fetcherOpts.documentAST) ? (0, _lib.isSubscriptionWithName)(fetcherOpts.documentAST, graphQLParams.operationName || undefined) : false; - if (isSubscription) { - const wsFetcher = (0, _lib.getWsFetcher)(options, fetcherOpts); - if (!wsFetcher) { - throw new Error(`Your GraphiQL createFetcher is not properly configured for websocket subscriptions yet. ${options.subscriptionUrl ? `Provided URL ${options.subscriptionUrl} failed` : 'Please provide subscriptionUrl, wsClient or legacyClient option first.'}`); - } - return wsFetcher(graphQLParams); + if (character === Number.MAX_VALUE) { + character = uinteger.MAX_VALUE; } - return httpFetcher(graphQLParams, fetcherOpts); - }; -} - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/create-fetcher/index.js": -/*!**********************************************************!*\ - !*** ../../graphiql-toolkit/esm/create-fetcher/index.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var _exportNames = { - createGraphiQLFetcher: true -}; -Object.defineProperty(exports, "createGraphiQLFetcher", ({ - enumerable: true, - get: function () { - return _createFetcher.createGraphiQLFetcher; + return { + line: line, + character: character + }; } -})); -var _types = __webpack_require__(/*! ./types */ "../../graphiql-toolkit/esm/create-fetcher/types.js"); -Object.keys(_types).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; - if (key in exports && exports[key] === _types[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _types[key]; - } - }); -}); -var _createFetcher = __webpack_require__(/*! ./createFetcher */ "../../graphiql-toolkit/esm/create-fetcher/createFetcher.js"); - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/create-fetcher/lib.js": -/*!********************************************************!*\ - !*** ../../graphiql-toolkit/esm/create-fetcher/lib.js ***! - \********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isSubscriptionWithName = exports.getWsFetcher = exports.createWebsocketsFetcherFromUrl = exports.createWebsocketsFetcherFromClient = exports.createSimpleFetcher = exports.createMultipartFetcher = exports.createLegacyWebsocketsFetcher = void 0; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -var _meros = __webpack_require__(/*! meros */ "../../../node_modules/meros/browser/index.mjs"); -var _pushPullAsyncIterableIterator = __webpack_require__(/*! @n1ru4l/push-pull-async-iterable-iterator */ "../../../node_modules/@n1ru4l/push-pull-async-iterable-iterator/index.js"); -var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function (resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __await = void 0 && (void 0).__await || function (v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -}; -var __asyncValues = void 0 && (void 0).__asyncValues || function (o) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], - i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { - return this; - }, i); - function verb(n) { - i[n] = o[n] && function (v) { - return new Promise(function (resolve, reject) { - v = o[n](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function (v) { - resolve({ - value: v, - done: d - }); - }, reject); - } -}; -var __asyncGenerator = void 0 && (void 0).__asyncGenerator || function (thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), - i, - q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { - return this; - }, i; - function verb(n) { - if (g[n]) i[n] = function (v) { - return new Promise(function (a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; - } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } - } - function step(r) { - r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); - } - function fulfill(value) { - resume("next", value); - } - function reject(value) { - resume("throw", value); - } - function settle(f, v) { - if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); - } -}; -const errorHasCode = err => { - return typeof err === 'object' && err !== null && 'code' in err; -}; -const isSubscriptionWithName = (document, name) => { - let isSubscription = false; - (0, _graphql.visit)(document, { - OperationDefinition(node) { - var _a; - if (name === ((_a = node.name) === null || _a === void 0 ? void 0 : _a.value) && node.operation === 'subscription') { - isSubscription = true; - } - } - }); - return isSubscription; -}; -exports.isSubscriptionWithName = isSubscriptionWithName; -const createSimpleFetcher = (options, httpFetch) => (graphQLParams, fetcherOpts) => __awaiter(void 0, void 0, void 0, function* () { - const data = yield httpFetch(options.url, { - method: 'POST', - body: JSON.stringify(graphQLParams), - headers: Object.assign(Object.assign({ - 'content-type': 'application/json' - }, options.headers), fetcherOpts === null || fetcherOpts === void 0 ? void 0 : fetcherOpts.headers) - }); - return data.json(); -}); -exports.createSimpleFetcher = createSimpleFetcher; -const createWebsocketsFetcherFromUrl = (url, connectionParams) => { - let wsClient; - try { - const { - createClient - } = __webpack_require__(/*! graphql-ws */ "../../../node_modules/graphql-ws/lib/index.js"); - wsClient = createClient({ - url, - connectionParams - }); - return createWebsocketsFetcherFromClient(wsClient); - } catch (err) { - if (errorHasCode(err) && err.code === 'MODULE_NOT_FOUND') { - throw new Error("You need to install the 'graphql-ws' package to use websockets when passing a 'subscriptionUrl'"); - } - console.error(`Error creating websocket client for ${url}`, err); + Position.create = create; + /** + * Checks whether the given literal conforms to the {@link Position} interface. + */ + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && Is.uinteger(candidate.line) && Is.uinteger(candidate.character); } -}; -exports.createWebsocketsFetcherFromUrl = createWebsocketsFetcherFromUrl; -const createWebsocketsFetcherFromClient = wsClient => graphQLParams => (0, _pushPullAsyncIterableIterator.makeAsyncIterableIteratorFromSink)(sink => wsClient.subscribe(graphQLParams, Object.assign(Object.assign({}, sink), { - error(err) { - if (err instanceof CloseEvent) { - sink.error(new Error(`Socket closed with event ${err.code} ${err.reason || ''}`.trim())); + Position.is = is; +})(Position || (exports.Position = Position = {})); +/** + * The Range namespace provides helper functions to work with + * {@link Range} literals. + */ +var Range; +(function (Range) { + function create(one, two, three, four) { + if (Is.uinteger(one) && Is.uinteger(two) && Is.uinteger(three) && Is.uinteger(four)) { + return { + start: Position.create(one, two), + end: Position.create(three, four) + }; + } else if (Position.is(one) && Position.is(two)) { + return { + start: one, + end: two + }; } else { - sink.error(err); + throw new Error("Range#create called with invalid arguments[".concat(one, ", ").concat(two, ", ").concat(three, ", ").concat(four, "]")); } } -}))); -exports.createWebsocketsFetcherFromClient = createWebsocketsFetcherFromClient; -const createLegacyWebsocketsFetcher = legacyWsClient => graphQLParams => { - const observable = legacyWsClient.request(graphQLParams); - return (0, _pushPullAsyncIterableIterator.makeAsyncIterableIteratorFromSink)(sink => observable.subscribe(sink).unsubscribe); -}; -exports.createLegacyWebsocketsFetcher = createLegacyWebsocketsFetcher; -const createMultipartFetcher = (options, httpFetch) => function (graphQLParams, fetcherOpts) { - return __asyncGenerator(this, arguments, function* () { - var e_1, _a; - const response = yield __await(httpFetch(options.url, { - method: 'POST', - body: JSON.stringify(graphQLParams), - headers: Object.assign(Object.assign({ - 'content-type': 'application/json', - accept: 'application/json, multipart/mixed' - }, options.headers), fetcherOpts === null || fetcherOpts === void 0 ? void 0 : fetcherOpts.headers) - }).then(r => (0, _meros.meros)(r, { - multiple: true - }))); - if (!(0, _pushPullAsyncIterableIterator.isAsyncIterable)(response)) { - return yield __await(yield yield __await(response.json())); - } - try { - for (var response_1 = __asyncValues(response), response_1_1; response_1_1 = yield __await(response_1.next()), !response_1_1.done;) { - const chunk = response_1_1.value; - if (chunk.some(part => !part.json)) { - const message = chunk.map(part => `Headers::\n${part.headers}\n\nBody::\n${part.body}`); - throw new Error(`Expected multipart chunks to be of json type. got:\n${message}`); - } - yield yield __await(chunk.map(part => part.body)); - } - } catch (e_1_1) { - e_1 = { - error: e_1_1 - }; - } finally { - try { - if (response_1_1 && !response_1_1.done && (_a = response_1.return)) yield __await(_a.call(response_1)); - } finally { - if (e_1) throw e_1.error; - } - } - }); -}; -exports.createMultipartFetcher = createMultipartFetcher; -const getWsFetcher = (options, fetcherOpts) => { - if (options.wsClient) { - return createWebsocketsFetcherFromClient(options.wsClient); + Range.create = create; + /** + * Checks whether the given literal conforms to the {@link Range} interface. + */ + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && Position.is(candidate.start) && Position.is(candidate.end); } - if (options.subscriptionUrl) { - return createWebsocketsFetcherFromUrl(options.subscriptionUrl, Object.assign(Object.assign({}, options.wsConnectionParams), fetcherOpts === null || fetcherOpts === void 0 ? void 0 : fetcherOpts.headers)); + Range.is = is; +})(Range || (exports.Range = Range = {})); +/** + * The Location namespace provides helper functions to work with + * {@link Location} literals. + */ +var Location; +(function (Location) { + /** + * Creates a Location literal. + * @param uri The location's uri. + * @param range The location's range. + */ + function create(uri, range) { + return { + uri: uri, + range: range + }; } - const legacyWebsocketsClient = options.legacyClient || options.legacyWsClient; - if (legacyWebsocketsClient) { - return createLegacyWebsocketsFetcher(legacyWebsocketsClient); + Location.create = create; + /** + * Checks whether the given literal conforms to the {@link Location} interface. + */ + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && Range.is(candidate.range) && (Is.string(candidate.uri) || Is.undefined(candidate.uri)); } -}; -exports.getWsFetcher = getWsFetcher; - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/create-fetcher/types.js": -/*!**********************************************************!*\ - !*** ../../graphiql-toolkit/esm/create-fetcher/types.js ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/format/index.js": -/*!**************************************************!*\ - !*** ../../graphiql-toolkit/esm/format/index.js ***! - \**************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.formatError = formatError; -exports.formatResult = formatResult; -function stringify(obj) { - return JSON.stringify(obj, null, 2); -} -function formatSingleError(error) { - return Object.assign(Object.assign({}, error), { - message: error.message, - stack: error.stack - }); -} -function handleSingleError(error) { - if (error instanceof Error) { - return formatSingleError(error); + Location.is = is; +})(Location || (exports.Location = Location = {})); +/** + * The LocationLink namespace provides helper functions to work with + * {@link LocationLink} literals. + */ +var LocationLink; +(function (LocationLink) { + /** + * Creates a LocationLink literal. + * @param targetUri The definition's uri. + * @param targetRange The full range of the definition. + * @param targetSelectionRange The span of the symbol definition at the target. + * @param originSelectionRange The span of the symbol being defined in the originating source file. + */ + function create(targetUri, targetRange, targetSelectionRange, originSelectionRange) { + return { + targetUri: targetUri, + targetRange: targetRange, + targetSelectionRange: targetSelectionRange, + originSelectionRange: originSelectionRange + }; } - return error; -} -function formatError(error) { - if (Array.isArray(error)) { - return stringify({ - errors: error.map(e => handleSingleError(e)) - }); + LocationLink.create = create; + /** + * Checks whether the given literal conforms to the {@link LocationLink} interface. + */ + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && Range.is(candidate.targetRange) && Is.string(candidate.targetUri) && Range.is(candidate.targetSelectionRange) && (Range.is(candidate.originSelectionRange) || Is.undefined(candidate.originSelectionRange)); } - return stringify({ - errors: [handleSingleError(error)] - }); -} -function formatResult(result) { - return stringify(result); -} - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/graphql-helpers/auto-complete.js": -/*!*******************************************************************!*\ - !*** ../../graphiql-toolkit/esm/graphql-helpers/auto-complete.js ***! - \*******************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.fillLeafs = fillLeafs; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -function fillLeafs(schema, docString, getDefaultFieldNames) { - const insertions = []; - if (!schema || !docString) { + LocationLink.is = is; +})(LocationLink || (exports.LocationLink = LocationLink = {})); +/** + * The Color namespace provides helper functions to work with + * {@link Color} literals. + */ +var Color; +(function (Color) { + /** + * Creates a new Color literal. + */ + function create(red, green, blue, alpha) { return { - insertions, - result: docString + red: red, + green: green, + blue: blue, + alpha: alpha }; } - let ast; - try { - ast = (0, _graphql.parse)(docString); - } catch (_a) { + Color.create = create; + /** + * Checks whether the given literal conforms to the {@link Color} interface. + */ + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && Is.numberRange(candidate.red, 0, 1) && Is.numberRange(candidate.green, 0, 1) && Is.numberRange(candidate.blue, 0, 1) && Is.numberRange(candidate.alpha, 0, 1); + } + Color.is = is; +})(Color || (exports.Color = Color = {})); +/** + * The ColorInformation namespace provides helper functions to work with + * {@link ColorInformation} literals. + */ +var ColorInformation; +(function (ColorInformation) { + /** + * Creates a new ColorInformation literal. + */ + function create(range, color) { return { - insertions, - result: docString + range: range, + color: color }; } - const fieldNameFn = getDefaultFieldNames || defaultGetDefaultFieldNames; - const typeInfo = new _graphql.TypeInfo(schema); - (0, _graphql.visit)(ast, { - leave(node) { - typeInfo.leave(node); - }, - enter(node) { - typeInfo.enter(node); - if (node.kind === 'Field' && !node.selectionSet) { - const fieldType = typeInfo.getType(); - const selectionSet = buildSelectionSet(isFieldType(fieldType), fieldNameFn); - if (selectionSet && node.loc) { - const indent = getIndentation(docString, node.loc.start); - insertions.push({ - index: node.loc.end, - string: ' ' + (0, _graphql.print)(selectionSet).replaceAll('\n', '\n' + indent) - }); - } - } - } - }); - return { - insertions, - result: withInsertions(docString, insertions) - }; -} -function defaultGetDefaultFieldNames(type) { - if (!('getFields' in type)) { - return []; - } - const fields = type.getFields(); - if (fields.id) { - return ['id']; + ColorInformation.create = create; + /** + * Checks whether the given literal conforms to the {@link ColorInformation} interface. + */ + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && Range.is(candidate.range) && Color.is(candidate.color); } - if (fields.edges) { - return ['edges']; + ColorInformation.is = is; +})(ColorInformation || (exports.ColorInformation = ColorInformation = {})); +/** + * The Color namespace provides helper functions to work with + * {@link ColorPresentation} literals. + */ +var ColorPresentation; +(function (ColorPresentation) { + /** + * Creates a new ColorInformation literal. + */ + function create(label, textEdit, additionalTextEdits) { + return { + label: label, + textEdit: textEdit, + additionalTextEdits: additionalTextEdits + }; } - if (fields.node) { - return ['node']; + ColorPresentation.create = create; + /** + * Checks whether the given literal conforms to the {@link ColorInformation} interface. + */ + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && Is.string(candidate.label) && (Is.undefined(candidate.textEdit) || TextEdit.is(candidate)) && (Is.undefined(candidate.additionalTextEdits) || Is.typedArray(candidate.additionalTextEdits, TextEdit.is)); } - const leafFieldNames = []; - for (const fieldName of Object.keys(fields)) { - if ((0, _graphql.isLeafType)(fields[fieldName].type)) { - leafFieldNames.push(fieldName); + ColorPresentation.is = is; +})(ColorPresentation || (exports.ColorPresentation = ColorPresentation = {})); +/** + * A set of predefined range kinds. + */ +var FoldingRangeKind; +(function (FoldingRangeKind) { + /** + * Folding range for a comment + */ + FoldingRangeKind.Comment = 'comment'; + /** + * Folding range for an import or include + */ + FoldingRangeKind.Imports = 'imports'; + /** + * Folding range for a region (e.g. `#region`) + */ + FoldingRangeKind.Region = 'region'; +})(FoldingRangeKind || (exports.FoldingRangeKind = FoldingRangeKind = {})); +/** + * The folding range namespace provides helper functions to work with + * {@link FoldingRange} literals. + */ +var FoldingRange; +(function (FoldingRange) { + /** + * Creates a new FoldingRange literal. + */ + function create(startLine, endLine, startCharacter, endCharacter, kind, collapsedText) { + var result = { + startLine: startLine, + endLine: endLine + }; + if (Is.defined(startCharacter)) { + result.startCharacter = startCharacter; } - } - return leafFieldNames; -} -function buildSelectionSet(type, getDefaultFieldNames) { - const namedType = (0, _graphql.getNamedType)(type); - if (!type || (0, _graphql.isLeafType)(type)) { - return; - } - const fieldNames = getDefaultFieldNames(namedType); - if (!Array.isArray(fieldNames) || fieldNames.length === 0 || !('getFields' in namedType)) { - return; - } - return { - kind: _graphql.Kind.SELECTION_SET, - selections: fieldNames.map(fieldName => { - const fieldDef = namedType.getFields()[fieldName]; - const fieldType = fieldDef ? fieldDef.type : null; - return { - kind: _graphql.Kind.FIELD, - name: { - kind: _graphql.Kind.NAME, - value: fieldName - }, - selectionSet: buildSelectionSet(fieldType, getDefaultFieldNames) - }; - }) - }; -} -function withInsertions(initial, insertions) { - if (insertions.length === 0) { - return initial; - } - let edited = ''; - let prevIndex = 0; - for (const { - index, - string - } of insertions) { - edited += initial.slice(prevIndex, index) + string; - prevIndex = index; - } - edited += initial.slice(prevIndex); - return edited; -} -function getIndentation(str, index) { - let indentStart = index; - let indentEnd = index; - while (indentStart) { - const c = str.charCodeAt(indentStart - 1); - if (c === 10 || c === 13 || c === 0x2028 || c === 0x2029) { - break; + if (Is.defined(endCharacter)) { + result.endCharacter = endCharacter; + } + if (Is.defined(kind)) { + result.kind = kind; } - indentStart--; - if (c !== 9 && c !== 11 && c !== 12 && c !== 32 && c !== 160) { - indentEnd = indentStart; + if (Is.defined(collapsedText)) { + result.collapsedText = collapsedText; } + return result; } - return str.slice(indentStart, indentEnd); -} -function isFieldType(fieldType) { - if (fieldType) { - return fieldType; + FoldingRange.create = create; + /** + * Checks whether the given literal conforms to the {@link FoldingRange} interface. + */ + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && Is.uinteger(candidate.startLine) && Is.uinteger(candidate.startLine) && (Is.undefined(candidate.startCharacter) || Is.uinteger(candidate.startCharacter)) && (Is.undefined(candidate.endCharacter) || Is.uinteger(candidate.endCharacter)) && (Is.undefined(candidate.kind) || Is.string(candidate.kind)); } -} - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/graphql-helpers/index.js": -/*!***********************************************************!*\ - !*** ../../graphiql-toolkit/esm/graphql-helpers/index.js ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var _autoComplete = __webpack_require__(/*! ./auto-complete */ "../../graphiql-toolkit/esm/graphql-helpers/auto-complete.js"); -Object.keys(_autoComplete).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _autoComplete[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _autoComplete[key]; - } - }); -}); -var _mergeAst = __webpack_require__(/*! ./merge-ast */ "../../graphiql-toolkit/esm/graphql-helpers/merge-ast.js"); -Object.keys(_mergeAst).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _mergeAst[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _mergeAst[key]; - } - }); -}); -var _operationName = __webpack_require__(/*! ./operation-name */ "../../graphiql-toolkit/esm/graphql-helpers/operation-name.js"); -Object.keys(_operationName).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _operationName[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _operationName[key]; - } - }); -}); - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/graphql-helpers/merge-ast.js": -/*!***************************************************************!*\ - !*** ../../graphiql-toolkit/esm/graphql-helpers/merge-ast.js ***! - \***************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.mergeAst = mergeAst; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -function uniqueBy(array, iteratee) { - var _a; - const FilteredMap = new Map(); - const result = []; - for (const item of array) { - if (item.kind === 'Field') { - const uniqueValue = iteratee(item); - const existing = FilteredMap.get(uniqueValue); - if ((_a = item.directives) === null || _a === void 0 ? void 0 : _a.length) { - const itemClone = Object.assign({}, item); - result.push(itemClone); - } else if ((existing === null || existing === void 0 ? void 0 : existing.selectionSet) && item.selectionSet) { - existing.selectionSet.selections = [...existing.selectionSet.selections, ...item.selectionSet.selections]; - } else if (!existing) { - const itemClone = Object.assign({}, item); - FilteredMap.set(uniqueValue, itemClone); - result.push(itemClone); - } - } else { - result.push(item); - } + FoldingRange.is = is; +})(FoldingRange || (exports.FoldingRange = FoldingRange = {})); +/** + * The DiagnosticRelatedInformation namespace provides helper functions to work with + * {@link DiagnosticRelatedInformation} literals. + */ +var DiagnosticRelatedInformation; +(function (DiagnosticRelatedInformation) { + /** + * Creates a new DiagnosticRelatedInformation literal. + */ + function create(location, message) { + return { + location: location, + message: message + }; } - return result; -} -function inlineRelevantFragmentSpreads(fragmentDefinitions, selections, selectionSetType) { - var _a; - const selectionSetTypeName = selectionSetType ? (0, _graphql.getNamedType)(selectionSetType).name : null; - const outputSelections = []; - const seenSpreads = []; - for (let selection of selections) { - if (selection.kind === 'FragmentSpread') { - const fragmentName = selection.name.value; - if (!selection.directives || selection.directives.length === 0) { - if (seenSpreads.includes(fragmentName)) { - continue; - } else { - seenSpreads.push(fragmentName); - } - } - const fragmentDefinition = fragmentDefinitions[selection.name.value]; - if (fragmentDefinition) { - const { - typeCondition, - directives, - selectionSet - } = fragmentDefinition; - selection = { - kind: _graphql.Kind.INLINE_FRAGMENT, - typeCondition, - directives, - selectionSet - }; - } - } - if (selection.kind === _graphql.Kind.INLINE_FRAGMENT && (!selection.directives || ((_a = selection.directives) === null || _a === void 0 ? void 0 : _a.length) === 0)) { - const fragmentTypeName = selection.typeCondition ? selection.typeCondition.name.value : null; - if (!fragmentTypeName || fragmentTypeName === selectionSetTypeName) { - outputSelections.push(...inlineRelevantFragmentSpreads(fragmentDefinitions, selection.selectionSet.selections, selectionSetType)); - continue; - } - } - outputSelections.push(selection); + DiagnosticRelatedInformation.create = create; + /** + * Checks whether the given literal conforms to the {@link DiagnosticRelatedInformation} interface. + */ + function is(value) { + var candidate = value; + return Is.defined(candidate) && Location.is(candidate.location) && Is.string(candidate.message); } - return outputSelections; -} -function mergeAst(documentAST, schema) { - const typeInfo = schema ? new _graphql.TypeInfo(schema) : null; - const fragmentDefinitions = Object.create(null); - for (const definition of documentAST.definitions) { - if (definition.kind === _graphql.Kind.FRAGMENT_DEFINITION) { - fragmentDefinitions[definition.name.value] = definition; - } + DiagnosticRelatedInformation.is = is; +})(DiagnosticRelatedInformation || (exports.DiagnosticRelatedInformation = DiagnosticRelatedInformation = {})); +/** + * The diagnostic's severity. + */ +var DiagnosticSeverity; +(function (DiagnosticSeverity) { + /** + * Reports an error. + */ + DiagnosticSeverity.Error = 1; + /** + * Reports a warning. + */ + DiagnosticSeverity.Warning = 2; + /** + * Reports an information. + */ + DiagnosticSeverity.Information = 3; + /** + * Reports a hint. + */ + DiagnosticSeverity.Hint = 4; +})(DiagnosticSeverity || (exports.DiagnosticSeverity = DiagnosticSeverity = {})); +/** + * The diagnostic tags. + * + * @since 3.15.0 + */ +var DiagnosticTag; +(function (DiagnosticTag) { + /** + * Unused or unnecessary code. + * + * Clients are allowed to render diagnostics with this tag faded out instead of having + * an error squiggle. + */ + DiagnosticTag.Unnecessary = 1; + /** + * Deprecated or obsolete code. + * + * Clients are allowed to rendered diagnostics with this tag strike through. + */ + DiagnosticTag.Deprecated = 2; +})(DiagnosticTag || (exports.DiagnosticTag = DiagnosticTag = {})); +/** + * The CodeDescription namespace provides functions to deal with descriptions for diagnostic codes. + * + * @since 3.16.0 + */ +var CodeDescription; +(function (CodeDescription) { + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && Is.string(candidate.href); } - const flattenVisitors = { - SelectionSet(node) { - const selectionSetType = typeInfo ? typeInfo.getParentType() : null; - let { - selections - } = node; - selections = inlineRelevantFragmentSpreads(fragmentDefinitions, selections, selectionSetType); - return Object.assign(Object.assign({}, node), { - selections - }); - }, - FragmentDefinition() { - return null; + CodeDescription.is = is; +})(CodeDescription || (exports.CodeDescription = CodeDescription = {})); +/** + * The Diagnostic namespace provides helper functions to work with + * {@link Diagnostic} literals. + */ +var Diagnostic; +(function (Diagnostic) { + /** + * Creates a new Diagnostic literal. + */ + function create(range, message, severity, code, source, relatedInformation) { + var result = { + range: range, + message: message + }; + if (Is.defined(severity)) { + result.severity = severity; } - }; - const flattenedAST = (0, _graphql.visit)(documentAST, typeInfo ? (0, _graphql.visitWithTypeInfo)(typeInfo, flattenVisitors) : flattenVisitors); - const deduplicateVisitors = { - SelectionSet(node) { - let { - selections - } = node; - selections = uniqueBy(selections, selection => selection.alias ? selection.alias.value : selection.name.value); - return Object.assign(Object.assign({}, node), { - selections - }); - }, - FragmentDefinition() { - return null; + if (Is.defined(code)) { + result.code = code; } - }; - return (0, _graphql.visit)(flattenedAST, deduplicateVisitors); -} - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/graphql-helpers/operation-name.js": -/*!********************************************************************!*\ - !*** ../../graphiql-toolkit/esm/graphql-helpers/operation-name.js ***! - \********************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getSelectedOperationName = getSelectedOperationName; -function getSelectedOperationName(prevOperations, prevSelectedOperationName, operations) { - if (!operations || operations.length < 1) { - return; + if (Is.defined(source)) { + result.source = source; + } + if (Is.defined(relatedInformation)) { + result.relatedInformation = relatedInformation; + } + return result; } - const names = operations.map(op => { + Diagnostic.create = create; + /** + * Checks whether the given literal conforms to the {@link Diagnostic} interface. + */ + function is(value) { var _a; - return (_a = op.name) === null || _a === void 0 ? void 0 : _a.value; - }); - if (prevSelectedOperationName && names.includes(prevSelectedOperationName)) { - return prevSelectedOperationName; - } - if (prevSelectedOperationName && prevOperations) { - const prevNames = prevOperations.map(op => { - var _a; - return (_a = op.name) === null || _a === void 0 ? void 0 : _a.value; - }); - const prevIndex = prevNames.indexOf(prevSelectedOperationName); - if (prevIndex !== -1 && prevIndex < names.length) { - return names[prevIndex]; - } + var candidate = value; + return Is.defined(candidate) && Range.is(candidate.range) && Is.string(candidate.message) && (Is.number(candidate.severity) || Is.undefined(candidate.severity)) && (Is.integer(candidate.code) || Is.string(candidate.code) || Is.undefined(candidate.code)) && (Is.undefined(candidate.codeDescription) || Is.string((_a = candidate.codeDescription) === null || _a === void 0 ? void 0 : _a.href)) && (Is.string(candidate.source) || Is.undefined(candidate.source)) && (Is.undefined(candidate.relatedInformation) || Is.typedArray(candidate.relatedInformation, DiagnosticRelatedInformation.is)); } - return names[0]; -} - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/index.js": -/*!*******************************************!*\ - !*** ../../graphiql-toolkit/esm/index.js ***! - \*******************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var _asyncHelpers = __webpack_require__(/*! ./async-helpers */ "../../graphiql-toolkit/esm/async-helpers/index.js"); -Object.keys(_asyncHelpers).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _asyncHelpers[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _asyncHelpers[key]; - } - }); -}); -var _createFetcher = __webpack_require__(/*! ./create-fetcher */ "../../graphiql-toolkit/esm/create-fetcher/index.js"); -Object.keys(_createFetcher).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _createFetcher[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _createFetcher[key]; - } - }); -}); -var _format = __webpack_require__(/*! ./format */ "../../graphiql-toolkit/esm/format/index.js"); -Object.keys(_format).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _format[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _format[key]; - } - }); -}); -var _graphqlHelpers = __webpack_require__(/*! ./graphql-helpers */ "../../graphiql-toolkit/esm/graphql-helpers/index.js"); -Object.keys(_graphqlHelpers).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _graphqlHelpers[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _graphqlHelpers[key]; - } - }); -}); -var _storage = __webpack_require__(/*! ./storage */ "../../graphiql-toolkit/esm/storage/index.js"); -Object.keys(_storage).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _storage[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _storage[key]; + Diagnostic.is = is; +})(Diagnostic || (exports.Diagnostic = Diagnostic = {})); +/** + * The Command namespace provides helper functions to work with + * {@link Command} literals. + */ +var Command; +(function (Command) { + /** + * Creates a new Command literal. + */ + function create(title, command) { + var args = []; + for (var _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; } - }); -}); - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/storage/base.js": -/*!**************************************************!*\ - !*** ../../graphiql-toolkit/esm/storage/base.js ***! - \**************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.StorageAPI = void 0; -function isQuotaError(storage, e) { - return e instanceof DOMException && (e.code === 22 || e.code === 1014 || e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') && storage.length !== 0; -} -class StorageAPI { - constructor(storage) { - if (storage) { - this.storage = storage; - } else if (storage === null) { - this.storage = null; - } else if (typeof window === 'undefined') { - this.storage = null; - } else { - this.storage = { - getItem: window.localStorage.getItem.bind(window.localStorage), - setItem: window.localStorage.setItem.bind(window.localStorage), - removeItem: window.localStorage.removeItem.bind(window.localStorage), - get length() { - let keys = 0; - for (const key in window.localStorage) { - if (key.indexOf(`${STORAGE_NAMESPACE}:`) === 0) { - keys += 1; - } - } - return keys; - }, - clear() { - for (const key in window.localStorage) { - if (key.indexOf(`${STORAGE_NAMESPACE}:`) === 0) { - window.localStorage.removeItem(key); - } - } - } - }; + var result = { + title: title, + command: command + }; + if (Is.defined(args) && args.length > 0) { + result.arguments = args; } + return result; } - get(name) { - if (!this.storage) { - return null; - } - const key = `${STORAGE_NAMESPACE}:${name}`; - const value = this.storage.getItem(key); - if (value === 'null' || value === 'undefined') { - this.storage.removeItem(key); - return null; - } - return value || null; + Command.create = create; + /** + * Checks whether the given literal conforms to the {@link Command} interface. + */ + function is(value) { + var candidate = value; + return Is.defined(candidate) && Is.string(candidate.title) && Is.string(candidate.command); } - set(name, value) { - let quotaError = false; - let error = null; - if (this.storage) { - const key = `${STORAGE_NAMESPACE}:${name}`; - if (value) { - try { - this.storage.setItem(key, value); - } catch (e) { - error = e instanceof Error ? e : new Error(`${e}`); - quotaError = isQuotaError(this.storage, e); - } - } else { - this.storage.removeItem(key); - } - } + Command.is = is; +})(Command || (exports.Command = Command = {})); +/** + * The TextEdit namespace provides helper function to create replace, + * insert and delete edits more easily. + */ +var TextEdit; +(function (TextEdit) { + /** + * Creates a replace text edit. + * @param range The range of text to be replaced. + * @param newText The new text. + */ + function replace(range, newText) { return { - isQuotaError: quotaError, - error + range: range, + newText: newText }; } - clear() { - if (this.storage) { - this.storage.clear(); - } - } -} -exports.StorageAPI = StorageAPI; -const STORAGE_NAMESPACE = 'graphiql'; - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/storage/custom.js": -/*!****************************************************!*\ - !*** ../../graphiql-toolkit/esm/storage/custom.js ***! - \****************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.createLocalStorage = createLocalStorage; -function createLocalStorage(_ref) { - let { - namespace - } = _ref; - const storageKeyPrefix = `${namespace}:`; - const getStorageKey = key => `${storageKeyPrefix}${key}`; - const storage = { - setItem: (key, value) => localStorage.setItem(getStorageKey(key), value), - getItem: key => localStorage.getItem(getStorageKey(key)), - removeItem: key => localStorage.removeItem(getStorageKey(key)), - get length() { - let keys = 0; - for (const key in window.localStorage) { - if (key.indexOf(storageKeyPrefix) === 0) { - keys += 1; - } - } - return keys; - }, - clear() { - for (const key in window.localStorage) { - if (key.indexOf(storageKeyPrefix) === 0) { - window.localStorage.removeItem(key); - } - } - } - }; - return storage; -} - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/storage/history.js": -/*!*****************************************************!*\ - !*** ../../graphiql-toolkit/esm/storage/history.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.HistoryStore = void 0; -var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -var _query = __webpack_require__(/*! ./query */ "../../graphiql-toolkit/esm/storage/query.js"); -const MAX_QUERY_SIZE = 100000; -class HistoryStore { - constructor(storage, maxHistoryLength) { - var _this = this; - this.storage = storage; - this.maxHistoryLength = maxHistoryLength; - this.updateHistory = _ref => { - let { - query, - variables, - headers, - operationName - } = _ref; - if (!this.shouldSaveQuery(query, variables, headers, this.history.fetchRecent())) { - return; - } - this.history.push({ - query, - variables, - headers, - operationName - }); - const historyQueries = this.history.items; - const favoriteQueries = this.favorite.items; - this.queries = historyQueries.concat(favoriteQueries); + TextEdit.replace = replace; + /** + * Creates an insert text edit. + * @param position The position to insert the text at. + * @param newText The text to be inserted. + */ + function insert(position, newText) { + return { + range: { + start: position, + end: position + }, + newText: newText }; - this.deleteHistory = function (_ref2) { - let { - query, - variables, - headers, - operationName, - favorite - } = _ref2; - let clearFavorites = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - function deleteFromStore(store) { - const found = store.items.find(x => x.query === query && x.variables === variables && x.headers === headers && x.operationName === operationName); - if (found) { - store.delete(found); - } - } - if (favorite || clearFavorites) { - deleteFromStore(_this.favorite); - } - if (!favorite || clearFavorites) { - deleteFromStore(_this.history); - } - _this.queries = [..._this.history.items, ..._this.favorite.items]; + } + TextEdit.insert = insert; + /** + * Creates a delete text edit. + * @param range The range of text to be deleted. + */ + function del(range) { + return { + range: range, + newText: '' }; - this.history = new _query.QueryStore('queries', this.storage, this.maxHistoryLength); - this.favorite = new _query.QueryStore('favorites', this.storage, null); - this.queries = [...this.history.fetchAll(), ...this.favorite.fetchAll()]; } - shouldSaveQuery(query, variables, headers, lastQuerySaved) { - if (!query) { - return false; - } - try { - (0, _graphql.parse)(query); - } catch (_a) { - return false; - } - if (query.length > MAX_QUERY_SIZE) { - return false; - } - if (!lastQuerySaved) { - return true; - } - if (JSON.stringify(query) === JSON.stringify(lastQuerySaved.query)) { - if (JSON.stringify(variables) === JSON.stringify(lastQuerySaved.variables)) { - if (JSON.stringify(headers) === JSON.stringify(lastQuerySaved.headers)) { - return false; - } - if (headers && !lastQuerySaved.headers) { - return false; - } - } - if (variables && !lastQuerySaved.variables) { - return false; - } - } - return true; + TextEdit.del = del; + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && Is.string(candidate.newText) && Range.is(candidate.range); } - toggleFavorite(_ref3) { - let { - query, - variables, - headers, - operationName, - label, - favorite - } = _ref3; - const item = { - query, - variables, - headers, - operationName, - label + TextEdit.is = is; +})(TextEdit || (exports.TextEdit = TextEdit = {})); +var ChangeAnnotation; +(function (ChangeAnnotation) { + function create(label, needsConfirmation, description) { + var result = { + label: label }; - if (favorite) { - item.favorite = false; - this.favorite.delete(item); - this.history.push(item); - } else { - item.favorite = true; - this.favorite.push(item); - this.history.delete(item); + if (needsConfirmation !== undefined) { + result.needsConfirmation = needsConfirmation; + } + if (description !== undefined) { + result.description = description; } - this.queries = [...this.history.items, ...this.favorite.items]; + return result; } - editLabel(_ref4, index) { - let { - query, - variables, - headers, - operationName, - label, - favorite - } = _ref4; - const item = { - query, - variables, - headers, - operationName, - label + ChangeAnnotation.create = create; + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && Is.string(candidate.label) && (Is.boolean(candidate.needsConfirmation) || candidate.needsConfirmation === undefined) && (Is.string(candidate.description) || candidate.description === undefined); + } + ChangeAnnotation.is = is; +})(ChangeAnnotation || (exports.ChangeAnnotation = ChangeAnnotation = {})); +var ChangeAnnotationIdentifier; +(function (ChangeAnnotationIdentifier) { + function is(value) { + var candidate = value; + return Is.string(candidate); + } + ChangeAnnotationIdentifier.is = is; +})(ChangeAnnotationIdentifier || (exports.ChangeAnnotationIdentifier = ChangeAnnotationIdentifier = {})); +var AnnotatedTextEdit; +(function (AnnotatedTextEdit) { + /** + * Creates an annotated replace text edit. + * + * @param range The range of text to be replaced. + * @param newText The new text. + * @param annotation The annotation. + */ + function replace(range, newText, annotation) { + return { + range: range, + newText: newText, + annotationId: annotation }; - if (favorite) { - this.favorite.edit(Object.assign(Object.assign({}, item), { - favorite - }), index); - } else { - this.history.edit(item, index); - } - this.queries = [...this.history.items, ...this.favorite.items]; } -} -exports.HistoryStore = HistoryStore; - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/storage/index.js": -/*!***************************************************!*\ - !*** ../../graphiql-toolkit/esm/storage/index.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -var _base = __webpack_require__(/*! ./base */ "../../graphiql-toolkit/esm/storage/base.js"); -Object.keys(_base).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _base[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _base[key]; - } - }); -}); -var _history = __webpack_require__(/*! ./history */ "../../graphiql-toolkit/esm/storage/history.js"); -Object.keys(_history).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _history[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _history[key]; - } - }); -}); -var _query = __webpack_require__(/*! ./query */ "../../graphiql-toolkit/esm/storage/query.js"); -Object.keys(_query).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _query[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _query[key]; - } - }); -}); -var _custom = __webpack_require__(/*! ./custom */ "../../graphiql-toolkit/esm/storage/custom.js"); -Object.keys(_custom).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - if (key in exports && exports[key] === _custom[key]) return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _custom[key]; - } - }); -}); - -/***/ }), - -/***/ "../../graphiql-toolkit/esm/storage/query.js": -/*!***************************************************!*\ - !*** ../../graphiql-toolkit/esm/storage/query.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.QueryStore = void 0; -class QueryStore { - constructor(key, storage) { - let maxSize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; - this.key = key; - this.storage = storage; - this.maxSize = maxSize; - this.items = this.fetchAll(); + AnnotatedTextEdit.replace = replace; + /** + * Creates an annotated insert text edit. + * + * @param position The position to insert the text at. + * @param newText The text to be inserted. + * @param annotation The annotation. + */ + function insert(position, newText, annotation) { + return { + range: { + start: position, + end: position + }, + newText: newText, + annotationId: annotation + }; } - get length() { - return this.items.length; + AnnotatedTextEdit.insert = insert; + /** + * Creates an annotated delete text edit. + * + * @param range The range of text to be deleted. + * @param annotation The annotation. + */ + function del(range, annotation) { + return { + range: range, + newText: '', + annotationId: annotation + }; } - contains(item) { - return this.items.some(x => x.query === item.query && x.variables === item.variables && x.headers === item.headers && x.operationName === item.operationName); + AnnotatedTextEdit.del = del; + function is(value) { + var candidate = value; + return TextEdit.is(candidate) && (ChangeAnnotation.is(candidate.annotationId) || ChangeAnnotationIdentifier.is(candidate.annotationId)); } - edit(item, index) { - if (typeof index === 'number' && this.items[index]) { - const found = this.items[index]; - if (found.query === item.query && found.variables === item.variables && found.headers === item.headers && found.operationName === item.operationName) { - this.items.splice(index, 1, item); - this.save(); - return; - } + AnnotatedTextEdit.is = is; +})(AnnotatedTextEdit || (exports.AnnotatedTextEdit = AnnotatedTextEdit = {})); +/** + * The TextDocumentEdit namespace provides helper function to create + * an edit that manipulates a text document. + */ +var TextDocumentEdit; +(function (TextDocumentEdit) { + /** + * Creates a new `TextDocumentEdit` + */ + function create(textDocument, edits) { + return { + textDocument: textDocument, + edits: edits + }; + } + TextDocumentEdit.create = create; + function is(value) { + var candidate = value; + return Is.defined(candidate) && OptionalVersionedTextDocumentIdentifier.is(candidate.textDocument) && Array.isArray(candidate.edits); + } + TextDocumentEdit.is = is; +})(TextDocumentEdit || (exports.TextDocumentEdit = TextDocumentEdit = {})); +var CreateFile; +(function (CreateFile) { + function create(uri, options, annotation) { + var result = { + kind: 'create', + uri: uri + }; + if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) { + result.options = options; } - const itemIndex = this.items.findIndex(x => x.query === item.query && x.variables === item.variables && x.headers === item.headers && x.operationName === item.operationName); - if (itemIndex !== -1) { - this.items.splice(itemIndex, 1, item); - this.save(); + if (annotation !== undefined) { + result.annotationId = annotation; } + return result; } - delete(item) { - const itemIndex = this.items.findIndex(x => x.query === item.query && x.variables === item.variables && x.headers === item.headers && x.operationName === item.operationName); - if (itemIndex !== -1) { - this.items.splice(itemIndex, 1); - this.save(); + CreateFile.create = create; + function is(value) { + var candidate = value; + return candidate && candidate.kind === 'create' && Is.string(candidate.uri) && (candidate.options === undefined || (candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId)); + } + CreateFile.is = is; +})(CreateFile || (exports.CreateFile = CreateFile = {})); +var RenameFile; +(function (RenameFile) { + function create(oldUri, newUri, options, annotation) { + var result = { + kind: 'rename', + oldUri: oldUri, + newUri: newUri + }; + if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) { + result.options = options; + } + if (annotation !== undefined) { + result.annotationId = annotation; } + return result; } - fetchRecent() { - return this.items.at(-1); + RenameFile.create = create; + function is(value) { + var candidate = value; + return candidate && candidate.kind === 'rename' && Is.string(candidate.oldUri) && Is.string(candidate.newUri) && (candidate.options === undefined || (candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId)); } - fetchAll() { - const raw = this.storage.get(this.key); - if (raw) { - return JSON.parse(raw)[this.key]; + RenameFile.is = is; +})(RenameFile || (exports.RenameFile = RenameFile = {})); +var DeleteFile; +(function (DeleteFile) { + function create(uri, options, annotation) { + var result = { + kind: 'delete', + uri: uri + }; + if (options !== undefined && (options.recursive !== undefined || options.ignoreIfNotExists !== undefined)) { + result.options = options; } - return []; - } - push(item) { - const items = [...this.items, item]; - if (this.maxSize && items.length > this.maxSize) { - items.shift(); + if (annotation !== undefined) { + result.annotationId = annotation; } - for (let attempts = 0; attempts < 5; attempts++) { - const response = this.storage.set(this.key, JSON.stringify({ - [this.key]: items - })); - if (!(response === null || response === void 0 ? void 0 : response.error)) { - this.items = items; - } else if (response.isQuotaError && this.maxSize) { - items.shift(); + return result; + } + DeleteFile.create = create; + function is(value) { + var candidate = value; + return candidate && candidate.kind === 'delete' && Is.string(candidate.uri) && (candidate.options === undefined || (candidate.options.recursive === undefined || Is.boolean(candidate.options.recursive)) && (candidate.options.ignoreIfNotExists === undefined || Is.boolean(candidate.options.ignoreIfNotExists))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId)); + } + DeleteFile.is = is; +})(DeleteFile || (exports.DeleteFile = DeleteFile = {})); +var WorkspaceEdit; +(function (WorkspaceEdit) { + function is(value) { + var candidate = value; + return candidate && (candidate.changes !== undefined || candidate.documentChanges !== undefined) && (candidate.documentChanges === undefined || candidate.documentChanges.every(function (change) { + if (Is.string(change.kind)) { + return CreateFile.is(change) || RenameFile.is(change) || DeleteFile.is(change); } else { - return; + return TextDocumentEdit.is(change); } - } - } - save() { - this.storage.set(this.key, JSON.stringify({ - [this.key]: this.items })); } -} -exports.QueryStore = QueryStore; - -/***/ }), - -/***/ "../node_modules/linkify-it/build/index.cjs.js": -/*!*****************************************************!*\ - !*** ../node_modules/linkify-it/build/index.cjs.js ***! - \*****************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var uc_micro = __webpack_require__(/*! uc.micro */ "../node_modules/uc.micro/build/index.cjs.js"); -function reFactory(opts) { - const re = {}; - opts = opts || {}; - re.src_Any = uc_micro.Any.source; - re.src_Cc = uc_micro.Cc.source; - re.src_Z = uc_micro.Z.source; - re.src_P = uc_micro.P.source; - - // \p{\Z\P\Cc\CF} (white spaces + control + format + punctuation) - re.src_ZPCc = [re.src_Z, re.src_P, re.src_Cc].join('|'); - - // \p{\Z\Cc} (white spaces + control) - re.src_ZCc = [re.src_Z, re.src_Cc].join('|'); - - // Experimental. List of chars, completely prohibited in links - // because can separate it from other part of text - const text_separators = '[><\uff5c]'; - - // All possible word characters (everything without punctuation, spaces & controls) - // Defined via punctuation & spaces to save space - // Should be something like \p{\L\N\S\M} (\w but without `_`) - re.src_pseudo_letter = '(?:(?!' + text_separators + '|' + re.src_ZPCc + ')' + re.src_Any + ')'; - // The same as abothe but without [0-9] - // var src_pseudo_letter_non_d = '(?:(?![0-9]|' + src_ZPCc + ')' + src_Any + ')'; - - re.src_ip4 = '(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'; - - // Prohibit any of "@/[]()" in user/pass to avoid wrong domain fetch. - re.src_auth = '(?:(?:(?!' + re.src_ZCc + '|[@/\\[\\]()]).)+@)?'; - re.src_port = '(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?'; - re.src_host_terminator = '(?=$|' + text_separators + '|' + re.src_ZPCc + ')' + '(?!' + (opts['---'] ? '-(?!--)|' : '-|') + '_|:\\d|\\.-|\\.(?!$|' + re.src_ZPCc + '))'; - re.src_path = '(?:' + '[/?#]' + '(?:' + '(?!' + re.src_ZCc + '|' + text_separators + '|[()[\\]{}.,"\'?!\\-;]).|' + '\\[(?:(?!' + re.src_ZCc + '|\\]).)*\\]|' + '\\((?:(?!' + re.src_ZCc + '|[)]).)*\\)|' + '\\{(?:(?!' + re.src_ZCc + '|[}]).)*\\}|' + '\\"(?:(?!' + re.src_ZCc + '|["]).)+\\"|' + "\\'(?:(?!" + re.src_ZCc + "|[']).)+\\'|" + - // allow `I'm_king` if no pair found - "\\'(?=" + re.src_pseudo_letter + '|[-])|' + - // google has many dots in "google search" links (#66, #81). - // github has ... in commit range links, - // Restrict to - // - english - // - percent-encoded - // - parts of file path - // - params separator - // until more examples found. - '\\.{2,}[a-zA-Z0-9%/&]|' + '\\.(?!' + re.src_ZCc + '|[.]|$)|' + (opts['---'] ? '\\-(?!--(?:[^-]|$))(?:-*)|' // `---` => long dash, terminate - : '\\-+|') + - // allow `,,,` in paths - ',(?!' + re.src_ZCc + '|$)|' + - // allow `;` if not followed by space-like char - ';(?!' + re.src_ZCc + '|$)|' + - // allow `!!!` in paths, but not at the end - '\\!+(?!' + re.src_ZCc + '|[!]|$)|' + '\\?(?!' + re.src_ZCc + '|[?]|$)' + ')+' + '|\\/' + ')?'; - - // Allow anything in markdown spec, forbid quote (") at the first position - // because emails enclosed in quotes are far more common - re.src_email_name = '[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*'; - re.src_xn = 'xn--[a-z0-9\\-]{1,59}'; - - // More to read about domain names - // http://serverfault.com/questions/638260/ - - re.src_domain_root = - // Allow letters & digits (http://test1) - '(?:' + re.src_xn + '|' + re.src_pseudo_letter + '{1,63}' + ')'; - re.src_domain = '(?:' + re.src_xn + '|' + '(?:' + re.src_pseudo_letter + ')' + '|' + '(?:' + re.src_pseudo_letter + '(?:-|' + re.src_pseudo_letter + '){0,61}' + re.src_pseudo_letter + ')' + ')'; - re.src_host = '(?:' + - // Don't need IP check, because digits are already allowed in normal domain names - // src_ip4 + - // '|' + - '(?:(?:(?:' + re.src_domain + ')\\.)*' + re.src_domain /* _root */ + ')' + ')'; - re.tpl_host_fuzzy = '(?:' + re.src_ip4 + '|' + '(?:(?:(?:' + re.src_domain + ')\\.)+(?:%TLDS%))' + ')'; - re.tpl_host_no_ip_fuzzy = '(?:(?:(?:' + re.src_domain + ')\\.)+(?:%TLDS%))'; - re.src_host_strict = re.src_host + re.src_host_terminator; - re.tpl_host_fuzzy_strict = re.tpl_host_fuzzy + re.src_host_terminator; - re.src_host_port_strict = re.src_host + re.src_port + re.src_host_terminator; - re.tpl_host_port_fuzzy_strict = re.tpl_host_fuzzy + re.src_port + re.src_host_terminator; - re.tpl_host_port_no_ip_fuzzy_strict = re.tpl_host_no_ip_fuzzy + re.src_port + re.src_host_terminator; - - // - // Main rules - // - - // Rude test fuzzy links by host, for quick deny - re.tpl_host_fuzzy_test = 'localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:' + re.src_ZPCc + '|>|$))'; - re.tpl_email_fuzzy = '(^|' + text_separators + '|"|\\(|' + re.src_ZCc + ')' + '(' + re.src_email_name + '@' + re.tpl_host_fuzzy_strict + ')'; - re.tpl_link_fuzzy = - // Fuzzy link can't be prepended with .:/\- and non punctuation. - // but can start with > (markdown blockquote) - '(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|' + re.src_ZPCc + '))' + '((?![$+<=>^`|\uff5c])' + re.tpl_host_port_fuzzy_strict + re.src_path + ')'; - re.tpl_link_no_ip_fuzzy = - // Fuzzy link can't be prepended with .:/\- and non punctuation. - // but can start with > (markdown blockquote) - '(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|' + re.src_ZPCc + '))' + '((?![$+<=>^`|\uff5c])' + re.tpl_host_port_no_ip_fuzzy_strict + re.src_path + ')'; - return re; -} - -// -// Helpers -// - -// Merge objects -// -function assign(obj /* from1, from2, from3, ... */) { - const sources = Array.prototype.slice.call(arguments, 1); - sources.forEach(function (source) { - if (!source) { - return; + WorkspaceEdit.is = is; +})(WorkspaceEdit || (exports.WorkspaceEdit = WorkspaceEdit = {})); +var TextEditChangeImpl = /** @class */function () { + function TextEditChangeImpl(edits, changeAnnotations) { + this.edits = edits; + this.changeAnnotations = changeAnnotations; + } + TextEditChangeImpl.prototype.insert = function (position, newText, annotation) { + var edit; + var id; + if (annotation === undefined) { + edit = TextEdit.insert(position, newText); + } else if (ChangeAnnotationIdentifier.is(annotation)) { + id = annotation; + edit = AnnotatedTextEdit.insert(position, newText, annotation); + } else { + this.assertChangeAnnotations(this.changeAnnotations); + id = this.changeAnnotations.manage(annotation); + edit = AnnotatedTextEdit.insert(position, newText, id); } - Object.keys(source).forEach(function (key) { - obj[key] = source[key]; - }); - }); - return obj; -} -function _class(obj) { - return Object.prototype.toString.call(obj); -} -function isString(obj) { - return _class(obj) === '[object String]'; -} -function isObject(obj) { - return _class(obj) === '[object Object]'; -} -function isRegExp(obj) { - return _class(obj) === '[object RegExp]'; -} -function isFunction(obj) { - return _class(obj) === '[object Function]'; -} -function escapeRE(str) { - return str.replace(/[.?*+^$[\]\\(){}|-]/g, '\\$&'); -} - -// - -const defaultOptions = { - fuzzyLink: true, - fuzzyEmail: true, - fuzzyIP: false -}; -function isOptionsObj(obj) { - return Object.keys(obj || {}).reduce(function (acc, k) { - /* eslint-disable-next-line no-prototype-builtins */ - return acc || defaultOptions.hasOwnProperty(k); - }, false); -} -const defaultSchemas = { - 'http:': { - validate: function (text, pos, self) { - const tail = text.slice(pos); - if (!self.re.http) { - // compile lazily, because "host"-containing variables can change on tlds update. - self.re.http = new RegExp('^\\/\\/' + self.re.src_auth + self.re.src_host_port_strict + self.re.src_path, 'i'); - } - if (self.re.http.test(tail)) { - return tail.match(self.re.http)[0].length; - } - return 0; + this.edits.push(edit); + if (id !== undefined) { + return id; } - }, - 'https:': 'http:', - 'ftp:': 'http:', - '//': { - validate: function (text, pos, self) { - const tail = text.slice(pos); - if (!self.re.no_http) { - // compile lazily, because "host"-containing variables can change on tlds update. - self.re.no_http = new RegExp('^' + self.re.src_auth + - // Don't allow single-level domains, because of false positives like '//test' - // with code comments - '(?:localhost|(?:(?:' + self.re.src_domain + ')\\.)+' + self.re.src_domain_root + ')' + self.re.src_port + self.re.src_host_terminator + self.re.src_path, 'i'); - } - if (self.re.no_http.test(tail)) { - // should not be `://` & `///`, that protects from errors in protocol name - if (pos >= 3 && text[pos - 3] === ':') { - return 0; - } - if (pos >= 3 && text[pos - 3] === '/') { - return 0; - } - return tail.match(self.re.no_http)[0].length; - } - return 0; + }; + TextEditChangeImpl.prototype.replace = function (range, newText, annotation) { + var edit; + var id; + if (annotation === undefined) { + edit = TextEdit.replace(range, newText); + } else if (ChangeAnnotationIdentifier.is(annotation)) { + id = annotation; + edit = AnnotatedTextEdit.replace(range, newText, annotation); + } else { + this.assertChangeAnnotations(this.changeAnnotations); + id = this.changeAnnotations.manage(annotation); + edit = AnnotatedTextEdit.replace(range, newText, id); } - }, - 'mailto:': { - validate: function (text, pos, self) { - const tail = text.slice(pos); - if (!self.re.mailto) { - self.re.mailto = new RegExp('^' + self.re.src_email_name + '@' + self.re.src_host_strict, 'i'); - } - if (self.re.mailto.test(tail)) { - return tail.match(self.re.mailto)[0].length; - } - return 0; + this.edits.push(edit); + if (id !== undefined) { + return id; } - } -}; - -// RE pattern for 2-character tlds (autogenerated by ./support/tlds_2char_gen.js) -/* eslint-disable-next-line max-len */ -const tlds_2ch_src_re = 'a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]'; - -// DON'T try to make PRs with changes. Extend TLDs with LinkifyIt.tlds() instead -const tlds_default = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|'); -function resetScanCache(self) { - self.__index__ = -1; - self.__text_cache__ = ''; -} -function createValidator(re) { - return function (text, pos) { - const tail = text.slice(pos); - if (re.test(tail)) { - return tail.match(re)[0].length; + }; + TextEditChangeImpl.prototype.delete = function (range, annotation) { + var edit; + var id; + if (annotation === undefined) { + edit = TextEdit.del(range); + } else if (ChangeAnnotationIdentifier.is(annotation)) { + id = annotation; + edit = AnnotatedTextEdit.del(range, annotation); + } else { + this.assertChangeAnnotations(this.changeAnnotations); + id = this.changeAnnotations.manage(annotation); + edit = AnnotatedTextEdit.del(range, id); + } + this.edits.push(edit); + if (id !== undefined) { + return id; } - return 0; }; -} -function createNormalizer() { - return function (match, self) { - self.normalize(match); + TextEditChangeImpl.prototype.add = function (edit) { + this.edits.push(edit); }; -} - -// Schemas compiler. Build regexps. -// -function compile(self) { - // Load & clone RE patterns. - const re = self.re = reFactory(self.__opts__); - - // Define dynamic patterns - const tlds = self.__tlds__.slice(); - self.onCompile(); - if (!self.__tlds_replaced__) { - tlds.push(tlds_2ch_src_re); - } - tlds.push(re.src_xn); - re.src_tlds = tlds.join('|'); - function untpl(tpl) { - return tpl.replace('%TLDS%', re.src_tlds); - } - re.email_fuzzy = RegExp(untpl(re.tpl_email_fuzzy), 'i'); - re.link_fuzzy = RegExp(untpl(re.tpl_link_fuzzy), 'i'); - re.link_no_ip_fuzzy = RegExp(untpl(re.tpl_link_no_ip_fuzzy), 'i'); - re.host_fuzzy_test = RegExp(untpl(re.tpl_host_fuzzy_test), 'i'); - - // - // Compile each schema - // - - const aliases = []; - self.__compiled__ = {}; // Reset compiled data - - function schemaError(name, val) { - throw new Error('(LinkifyIt) Invalid schema "' + name + '": ' + val); + TextEditChangeImpl.prototype.all = function () { + return this.edits; + }; + TextEditChangeImpl.prototype.clear = function () { + this.edits.splice(0, this.edits.length); + }; + TextEditChangeImpl.prototype.assertChangeAnnotations = function (value) { + if (value === undefined) { + throw new Error("Text edit change is not configured to manage change annotations."); + } + }; + return TextEditChangeImpl; +}(); +/** + * A helper class + */ +var ChangeAnnotations = /** @class */function () { + function ChangeAnnotations(annotations) { + this._annotations = annotations === undefined ? Object.create(null) : annotations; + this._counter = 0; + this._size = 0; } - Object.keys(self.__schemas__).forEach(function (name) { - const val = self.__schemas__[name]; - - // skip disabled methods - if (val === null) { - return; + ChangeAnnotations.prototype.all = function () { + return this._annotations; + }; + Object.defineProperty(ChangeAnnotations.prototype, "size", { + get: function () { + return this._size; + }, + enumerable: false, + configurable: true + }); + ChangeAnnotations.prototype.manage = function (idOrAnnotation, annotation) { + var id; + if (ChangeAnnotationIdentifier.is(idOrAnnotation)) { + id = idOrAnnotation; + } else { + id = this.nextId(); + annotation = idOrAnnotation; } - const compiled = { - validate: null, - link: null - }; - self.__compiled__[name] = compiled; - if (isObject(val)) { - if (isRegExp(val.validate)) { - compiled.validate = createValidator(val.validate); - } else if (isFunction(val.validate)) { - compiled.validate = val.validate; - } else { - schemaError(name, val); + if (this._annotations[id] !== undefined) { + throw new Error("Id ".concat(id, " is already in use.")); + } + if (annotation === undefined) { + throw new Error("No annotation provided for id ".concat(id)); + } + this._annotations[id] = annotation; + this._size++; + return id; + }; + ChangeAnnotations.prototype.nextId = function () { + this._counter++; + return this._counter.toString(); + }; + return ChangeAnnotations; +}(); +/** + * A workspace change helps constructing changes to a workspace. + */ +var WorkspaceChange = exports.WorkspaceChange = /** @class */function () { + function WorkspaceChange(workspaceEdit) { + var _this = this; + this._textEditChanges = Object.create(null); + if (workspaceEdit !== undefined) { + this._workspaceEdit = workspaceEdit; + if (workspaceEdit.documentChanges) { + this._changeAnnotations = new ChangeAnnotations(workspaceEdit.changeAnnotations); + workspaceEdit.changeAnnotations = this._changeAnnotations.all(); + workspaceEdit.documentChanges.forEach(function (change) { + if (TextDocumentEdit.is(change)) { + var textEditChange = new TextEditChangeImpl(change.edits, _this._changeAnnotations); + _this._textEditChanges[change.textDocument.uri] = textEditChange; + } + }); + } else if (workspaceEdit.changes) { + Object.keys(workspaceEdit.changes).forEach(function (key) { + var textEditChange = new TextEditChangeImpl(workspaceEdit.changes[key]); + _this._textEditChanges[key] = textEditChange; + }); } - if (isFunction(val.normalize)) { - compiled.normalize = val.normalize; - } else if (!val.normalize) { - compiled.normalize = createNormalizer(); - } else { - schemaError(name, val); + } else { + this._workspaceEdit = {}; + } + } + Object.defineProperty(WorkspaceChange.prototype, "edit", { + /** + * Returns the underlying {@link WorkspaceEdit} literal + * use to be returned from a workspace edit operation like rename. + */ + get: function () { + this.initDocumentChanges(); + if (this._changeAnnotations !== undefined) { + if (this._changeAnnotations.size === 0) { + this._workspaceEdit.changeAnnotations = undefined; + } else { + this._workspaceEdit.changeAnnotations = this._changeAnnotations.all(); + } } - return; + return this._workspaceEdit; + }, + enumerable: false, + configurable: true + }); + WorkspaceChange.prototype.getTextEditChange = function (key) { + if (OptionalVersionedTextDocumentIdentifier.is(key)) { + this.initDocumentChanges(); + if (this._workspaceEdit.documentChanges === undefined) { + throw new Error('Workspace edit is not configured for document changes.'); + } + var textDocument = { + uri: key.uri, + version: key.version + }; + var result = this._textEditChanges[textDocument.uri]; + if (!result) { + var edits = []; + var textDocumentEdit = { + textDocument: textDocument, + edits: edits + }; + this._workspaceEdit.documentChanges.push(textDocumentEdit); + result = new TextEditChangeImpl(edits, this._changeAnnotations); + this._textEditChanges[textDocument.uri] = result; + } + return result; + } else { + this.initChanges(); + if (this._workspaceEdit.changes === undefined) { + throw new Error('Workspace edit is not configured for normal text edit changes.'); + } + var result = this._textEditChanges[key]; + if (!result) { + var edits = []; + this._workspaceEdit.changes[key] = edits; + result = new TextEditChangeImpl(edits); + this._textEditChanges[key] = result; + } + return result; } - if (isString(val)) { - aliases.push(name); - return; + }; + WorkspaceChange.prototype.initDocumentChanges = function () { + if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) { + this._changeAnnotations = new ChangeAnnotations(); + this._workspaceEdit.documentChanges = []; + this._workspaceEdit.changeAnnotations = this._changeAnnotations.all(); } - schemaError(name, val); - }); - - // - // Compile postponed aliases - // - - aliases.forEach(function (alias) { - if (!self.__compiled__[self.__schemas__[alias]]) { - // Silently fail on missed schemas to avoid errons on disable. - // schemaError(alias, self.__schemas__[alias]); - return; + }; + WorkspaceChange.prototype.initChanges = function () { + if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) { + this._workspaceEdit.changes = Object.create(null); } - self.__compiled__[alias].validate = self.__compiled__[self.__schemas__[alias]].validate; - self.__compiled__[alias].normalize = self.__compiled__[self.__schemas__[alias]].normalize; - }); - - // - // Fake record for guessed links - // - self.__compiled__[''] = { - validate: null, - normalize: createNormalizer() }; - - // - // Build schema condition - // - const slist = Object.keys(self.__compiled__).filter(function (name) { - // Filter disabled & fake schemas - return name.length > 0 && self.__compiled__[name]; - }).map(escapeRE).join('|'); - // (?!_) cause 1.5x slowdown - self.re.schema_test = RegExp('(^|(?!_)(?:[><\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'i'); - self.re.schema_search = RegExp('(^|(?!_)(?:[><\uff5c]|' + re.src_ZPCc + '))(' + slist + ')', 'ig'); - self.re.schema_at_start = RegExp('^' + self.re.schema_search.source, 'i'); - self.re.pretest = RegExp('(' + self.re.schema_test.source + ')|(' + self.re.host_fuzzy_test.source + ')|@', 'i'); - - // - // Cleanup - // - - resetScanCache(self); -} - + WorkspaceChange.prototype.createFile = function (uri, optionsOrAnnotation, options) { + this.initDocumentChanges(); + if (this._workspaceEdit.documentChanges === undefined) { + throw new Error('Workspace edit is not configured for document changes.'); + } + var annotation; + if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) { + annotation = optionsOrAnnotation; + } else { + options = optionsOrAnnotation; + } + var operation; + var id; + if (annotation === undefined) { + operation = CreateFile.create(uri, options); + } else { + id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation); + operation = CreateFile.create(uri, options, id); + } + this._workspaceEdit.documentChanges.push(operation); + if (id !== undefined) { + return id; + } + }; + WorkspaceChange.prototype.renameFile = function (oldUri, newUri, optionsOrAnnotation, options) { + this.initDocumentChanges(); + if (this._workspaceEdit.documentChanges === undefined) { + throw new Error('Workspace edit is not configured for document changes.'); + } + var annotation; + if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) { + annotation = optionsOrAnnotation; + } else { + options = optionsOrAnnotation; + } + var operation; + var id; + if (annotation === undefined) { + operation = RenameFile.create(oldUri, newUri, options); + } else { + id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation); + operation = RenameFile.create(oldUri, newUri, options, id); + } + this._workspaceEdit.documentChanges.push(operation); + if (id !== undefined) { + return id; + } + }; + WorkspaceChange.prototype.deleteFile = function (uri, optionsOrAnnotation, options) { + this.initDocumentChanges(); + if (this._workspaceEdit.documentChanges === undefined) { + throw new Error('Workspace edit is not configured for document changes.'); + } + var annotation; + if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) { + annotation = optionsOrAnnotation; + } else { + options = optionsOrAnnotation; + } + var operation; + var id; + if (annotation === undefined) { + operation = DeleteFile.create(uri, options); + } else { + id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation); + operation = DeleteFile.create(uri, options, id); + } + this._workspaceEdit.documentChanges.push(operation); + if (id !== undefined) { + return id; + } + }; + return WorkspaceChange; +}(); /** - * class Match - * - * Match result. Single element of array, returned by [[LinkifyIt#match]] - **/ -function Match(self, shift) { - const start = self.__index__; - const end = self.__last_index__; - const text = self.__text_cache__.slice(start, end); - + * The TextDocumentIdentifier namespace provides helper functions to work with + * {@link TextDocumentIdentifier} literals. + */ +var TextDocumentIdentifier; +(function (TextDocumentIdentifier) { /** - * Match#schema -> String - * - * Prefix (protocol) for matched string. - **/ - this.schema = self.__schema__.toLowerCase(); + * Creates a new TextDocumentIdentifier literal. + * @param uri The document's uri. + */ + function create(uri) { + return { + uri: uri + }; + } + TextDocumentIdentifier.create = create; /** - * Match#index -> Number - * - * First position of matched string. - **/ - this.index = start + shift; + * Checks whether the given literal conforms to the {@link TextDocumentIdentifier} interface. + */ + function is(value) { + var candidate = value; + return Is.defined(candidate) && Is.string(candidate.uri); + } + TextDocumentIdentifier.is = is; +})(TextDocumentIdentifier || (exports.TextDocumentIdentifier = TextDocumentIdentifier = {})); +/** + * The VersionedTextDocumentIdentifier namespace provides helper functions to work with + * {@link VersionedTextDocumentIdentifier} literals. + */ +var VersionedTextDocumentIdentifier; +(function (VersionedTextDocumentIdentifier) { /** - * Match#lastIndex -> Number - * - * Next position after matched string. - **/ - this.lastIndex = end + shift; + * Creates a new VersionedTextDocumentIdentifier literal. + * @param uri The document's uri. + * @param version The document's version. + */ + function create(uri, version) { + return { + uri: uri, + version: version + }; + } + VersionedTextDocumentIdentifier.create = create; /** - * Match#raw -> String - * - * Matched string. - **/ - this.raw = text; + * Checks whether the given literal conforms to the {@link VersionedTextDocumentIdentifier} interface. + */ + function is(value) { + var candidate = value; + return Is.defined(candidate) && Is.string(candidate.uri) && Is.integer(candidate.version); + } + VersionedTextDocumentIdentifier.is = is; +})(VersionedTextDocumentIdentifier || (exports.VersionedTextDocumentIdentifier = VersionedTextDocumentIdentifier = {})); +/** + * The OptionalVersionedTextDocumentIdentifier namespace provides helper functions to work with + * {@link OptionalVersionedTextDocumentIdentifier} literals. + */ +var OptionalVersionedTextDocumentIdentifier; +(function (OptionalVersionedTextDocumentIdentifier) { /** - * Match#text -> String - * - * Notmalized text of matched string. - **/ - this.text = text; + * Creates a new OptionalVersionedTextDocumentIdentifier literal. + * @param uri The document's uri. + * @param version The document's version. + */ + function create(uri, version) { + return { + uri: uri, + version: version + }; + } + OptionalVersionedTextDocumentIdentifier.create = create; /** - * Match#url -> String - * - * Normalized url of matched string. - **/ - this.url = text; -} -function createMatch(self, shift) { - const match = new Match(self, shift); - self.__compiled__[match.schema].normalize(match, self); - return match; -} - + * Checks whether the given literal conforms to the {@link OptionalVersionedTextDocumentIdentifier} interface. + */ + function is(value) { + var candidate = value; + return Is.defined(candidate) && Is.string(candidate.uri) && (candidate.version === null || Is.integer(candidate.version)); + } + OptionalVersionedTextDocumentIdentifier.is = is; +})(OptionalVersionedTextDocumentIdentifier || (exports.OptionalVersionedTextDocumentIdentifier = OptionalVersionedTextDocumentIdentifier = {})); /** - * class LinkifyIt - **/ - + * The TextDocumentItem namespace provides helper functions to work with + * {@link TextDocumentItem} literals. + */ +var TextDocumentItem; +(function (TextDocumentItem) { + /** + * Creates a new TextDocumentItem literal. + * @param uri The document's uri. + * @param languageId The document's language identifier. + * @param version The document's version number. + * @param text The document's text. + */ + function create(uri, languageId, version, text) { + return { + uri: uri, + languageId: languageId, + version: version, + text: text + }; + } + TextDocumentItem.create = create; + /** + * Checks whether the given literal conforms to the {@link TextDocumentItem} interface. + */ + function is(value) { + var candidate = value; + return Is.defined(candidate) && Is.string(candidate.uri) && Is.string(candidate.languageId) && Is.integer(candidate.version) && Is.string(candidate.text); + } + TextDocumentItem.is = is; +})(TextDocumentItem || (exports.TextDocumentItem = TextDocumentItem = {})); /** - * new LinkifyIt(schemas, options) - * - schemas (Object): Optional. Additional schemas to validate (prefix/validator) - * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false } - * - * Creates new linkifier instance with optional additional schemas. - * Can be called without `new` keyword for convenience. - * - * By default understands: + * Describes the content type that a client supports in various + * result literals like `Hover`, `ParameterInfo` or `CompletionItem`. * - * - `http(s)://...` , `ftp://...`, `mailto:...` & `//...` links - * - "fuzzy" links and emails (example.com, foo@bar.com). - * - * `schemas` is an object, where each key/value describes protocol/rule: - * - * - __key__ - link prefix (usually, protocol name with `:` at the end, `skype:` - * for example). `linkify-it` makes shure that prefix is not preceeded with - * alphanumeric char and symbols. Only whitespaces and punctuation allowed. - * - __value__ - rule to check tail after link prefix - * - _String_ - just alias to existing rule - * - _Object_ - * - _validate_ - validator function (should return matched length on success), - * or `RegExp`. - * - _normalize_ - optional function to normalize text & url of matched result - * (for example, for @twitter mentions). - * - * `options`: - * - * - __fuzzyLink__ - recognige URL-s without `http(s):` prefix. Default `true`. - * - __fuzzyIP__ - allow IPs in fuzzy links above. Can conflict with some texts - * like version numbers. Default `false`. - * - __fuzzyEmail__ - recognize emails without `mailto:` prefix. - * - **/ -function LinkifyIt(schemas, options) { - if (!(this instanceof LinkifyIt)) { - return new LinkifyIt(schemas, options); + * Please note that `MarkupKinds` must not start with a `$`. This kinds + * are reserved for internal usage. + */ +var MarkupKind; +(function (MarkupKind) { + /** + * Plain text is supported as a content format + */ + MarkupKind.PlainText = 'plaintext'; + /** + * Markdown is supported as a content format + */ + MarkupKind.Markdown = 'markdown'; + /** + * Checks whether the given value is a value of the {@link MarkupKind} type. + */ + function is(value) { + var candidate = value; + return candidate === MarkupKind.PlainText || candidate === MarkupKind.Markdown; } - if (!options) { - if (isOptionsObj(schemas)) { - options = schemas; - schemas = {}; - } + MarkupKind.is = is; +})(MarkupKind || (exports.MarkupKind = MarkupKind = {})); +var MarkupContent; +(function (MarkupContent) { + /** + * Checks whether the given value conforms to the {@link MarkupContent} interface. + */ + function is(value) { + var candidate = value; + return Is.objectLiteral(value) && MarkupKind.is(candidate.kind) && Is.string(candidate.value); } - this.__opts__ = assign({}, defaultOptions, options); - - // Cache last tested result. Used to skip repeating steps on next `match` call. - this.__index__ = -1; - this.__last_index__ = -1; // Next scan position - this.__schema__ = ''; - this.__text_cache__ = ''; - this.__schemas__ = assign({}, defaultSchemas, schemas); - this.__compiled__ = {}; - this.__tlds__ = tlds_default; - this.__tlds_replaced__ = false; - this.re = {}; - compile(this); -} - -/** chainable - * LinkifyIt#add(schema, definition) - * - schema (String): rule name (fixed pattern prefix) - * - definition (String|RegExp|Object): schema definition - * - * Add new rule definition. See constructor description for details. - **/ -LinkifyIt.prototype.add = function add(schema, definition) { - this.__schemas__[schema] = definition; - compile(this); - return this; -}; - -/** chainable - * LinkifyIt#set(options) - * - options (Object): { fuzzyLink|fuzzyEmail|fuzzyIP: true|false } + MarkupContent.is = is; +})(MarkupContent || (exports.MarkupContent = MarkupContent = {})); +/** + * The kind of a completion entry. + */ +var CompletionItemKind; +(function (CompletionItemKind) { + CompletionItemKind.Text = 1; + CompletionItemKind.Method = 2; + CompletionItemKind.Function = 3; + CompletionItemKind.Constructor = 4; + CompletionItemKind.Field = 5; + CompletionItemKind.Variable = 6; + CompletionItemKind.Class = 7; + CompletionItemKind.Interface = 8; + CompletionItemKind.Module = 9; + CompletionItemKind.Property = 10; + CompletionItemKind.Unit = 11; + CompletionItemKind.Value = 12; + CompletionItemKind.Enum = 13; + CompletionItemKind.Keyword = 14; + CompletionItemKind.Snippet = 15; + CompletionItemKind.Color = 16; + CompletionItemKind.File = 17; + CompletionItemKind.Reference = 18; + CompletionItemKind.Folder = 19; + CompletionItemKind.EnumMember = 20; + CompletionItemKind.Constant = 21; + CompletionItemKind.Struct = 22; + CompletionItemKind.Event = 23; + CompletionItemKind.Operator = 24; + CompletionItemKind.TypeParameter = 25; +})(CompletionItemKind || (exports.CompletionItemKind = CompletionItemKind = {})); +/** + * Defines whether the insert text in a completion item should be interpreted as + * plain text or a snippet. + */ +var InsertTextFormat; +(function (InsertTextFormat) { + /** + * The primary text to be inserted is treated as a plain string. + */ + InsertTextFormat.PlainText = 1; + /** + * The primary text to be inserted is treated as a snippet. + * + * A snippet can define tab stops and placeholders with `$1`, `$2` + * and `${3:foo}`. `$0` defines the final tab stop, it defaults to + * the end of the snippet. Placeholders with equal identifiers are linked, + * that is typing in one will update others too. + * + * See also: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#snippet_syntax + */ + InsertTextFormat.Snippet = 2; +})(InsertTextFormat || (exports.InsertTextFormat = InsertTextFormat = {})); +/** + * Completion item tags are extra annotations that tweak the rendering of a completion + * item. * - * Set recognition options for links without schema. - **/ -LinkifyIt.prototype.set = function set(options) { - this.__opts__ = assign(this.__opts__, options); - return this; -}; - + * @since 3.15.0 + */ +var CompletionItemTag; +(function (CompletionItemTag) { + /** + * Render a completion as obsolete, usually using a strike-out. + */ + CompletionItemTag.Deprecated = 1; +})(CompletionItemTag || (exports.CompletionItemTag = CompletionItemTag = {})); /** - * LinkifyIt#test(text) -> Boolean + * The InsertReplaceEdit namespace provides functions to deal with insert / replace edits. * - * Searches linkifiable pattern and returns `true` on success or `false` on fail. - **/ -LinkifyIt.prototype.test = function test(text) { - // Reset scan cache - this.__text_cache__ = text; - this.__index__ = -1; - if (!text.length) { - return false; - } - let m, ml, me, len, shift, next, re, tld_pos, at_pos; - - // try to scan for link with schema - that's the most simple rule - if (this.re.schema_test.test(text)) { - re = this.re.schema_search; - re.lastIndex = 0; - while ((m = re.exec(text)) !== null) { - len = this.testSchemaAt(text, m[2], re.lastIndex); - if (len) { - this.__schema__ = m[2]; - this.__index__ = m.index + m[1].length; - this.__last_index__ = m.index + m[0].length + len; - break; - } - } - } - if (this.__opts__.fuzzyLink && this.__compiled__['http:']) { - // guess schemaless links - tld_pos = text.search(this.re.host_fuzzy_test); - if (tld_pos >= 0) { - // if tld is located after found link - no need to check fuzzy pattern - if (this.__index__ < 0 || tld_pos < this.__index__) { - if ((ml = text.match(this.__opts__.fuzzyIP ? this.re.link_fuzzy : this.re.link_no_ip_fuzzy)) !== null) { - shift = ml.index + ml[1].length; - if (this.__index__ < 0 || shift < this.__index__) { - this.__schema__ = ''; - this.__index__ = shift; - this.__last_index__ = ml.index + ml[0].length; - } - } - } - } + * @since 3.16.0 + */ +var InsertReplaceEdit; +(function (InsertReplaceEdit) { + /** + * Creates a new insert / replace edit + */ + function create(newText, insert, replace) { + return { + newText: newText, + insert: insert, + replace: replace + }; } - if (this.__opts__.fuzzyEmail && this.__compiled__['mailto:']) { - // guess schemaless emails - at_pos = text.indexOf('@'); - if (at_pos >= 0) { - // We can't skip this check, because this cases are possible: - // 192.168.1.1@gmail.com, my.in@example.com - if ((me = text.match(this.re.email_fuzzy)) !== null) { - shift = me.index + me[1].length; - next = me.index + me[0].length; - if (this.__index__ < 0 || shift < this.__index__ || shift === this.__index__ && next > this.__last_index__) { - this.__schema__ = 'mailto:'; - this.__index__ = shift; - this.__last_index__ = next; - } - } - } + InsertReplaceEdit.create = create; + /** + * Checks whether the given literal conforms to the {@link InsertReplaceEdit} interface. + */ + function is(value) { + var candidate = value; + return candidate && Is.string(candidate.newText) && Range.is(candidate.insert) && Range.is(candidate.replace); } - return this.__index__ >= 0; -}; - + InsertReplaceEdit.is = is; +})(InsertReplaceEdit || (exports.InsertReplaceEdit = InsertReplaceEdit = {})); /** - * LinkifyIt#pretest(text) -> Boolean + * How whitespace and indentation is handled during completion + * item insertion. * - * Very quick check, that can give false positives. Returns true if link MAY BE - * can exists. Can be used for speed optimization, when you need to check that - * link NOT exists. - **/ -LinkifyIt.prototype.pretest = function pretest(text) { - return this.re.pretest.test(text); -}; - + * @since 3.16.0 + */ +var InsertTextMode; +(function (InsertTextMode) { + /** + * The insertion or replace strings is taken as it is. If the + * value is multi line the lines below the cursor will be + * inserted using the indentation defined in the string value. + * The client will not apply any kind of adjustments to the + * string. + */ + InsertTextMode.asIs = 1; + /** + * The editor adjusts leading whitespace of new lines so that + * they match the indentation up to the cursor of the line for + * which the item is accepted. + * + * Consider a line like this: <2tabs><3tabs>foo. Accepting a + * multi line completion item is indented using 2 tabs and all + * following lines inserted will be indented using 2 tabs as well. + */ + InsertTextMode.adjustIndentation = 2; +})(InsertTextMode || (exports.InsertTextMode = InsertTextMode = {})); +var CompletionItemLabelDetails; +(function (CompletionItemLabelDetails) { + function is(value) { + var candidate = value; + return candidate && (Is.string(candidate.detail) || candidate.detail === undefined) && (Is.string(candidate.description) || candidate.description === undefined); + } + CompletionItemLabelDetails.is = is; +})(CompletionItemLabelDetails || (exports.CompletionItemLabelDetails = CompletionItemLabelDetails = {})); /** - * LinkifyIt#testSchemaAt(text, name, position) -> Number - * - text (String): text to scan - * - name (String): rule (schema) name - * - position (Number): text offset to check from - * - * Similar to [[LinkifyIt#test]] but checks only specific protocol tail exactly - * at given position. Returns length of found pattern (0 on fail). - **/ -LinkifyIt.prototype.testSchemaAt = function testSchemaAt(text, schema, pos) { - // If not supported schema check requested - terminate - if (!this.__compiled__[schema.toLowerCase()]) { - return 0; + * The CompletionItem namespace provides functions to deal with + * completion items. + */ +var CompletionItem; +(function (CompletionItem) { + /** + * Create a completion item and seed it with a label. + * @param label The completion item's label + */ + function create(label) { + return { + label: label + }; } - return this.__compiled__[schema.toLowerCase()].validate(text, pos, this); -}; - + CompletionItem.create = create; +})(CompletionItem || (exports.CompletionItem = CompletionItem = {})); /** - * LinkifyIt#match(text) -> Array|null - * - * Returns array of found link descriptions or `null` on fail. We strongly - * recommend to use [[LinkifyIt#test]] first, for best speed. - * - * ##### Result match description - * - * - __schema__ - link schema, can be empty for fuzzy links, or `//` for - * protocol-neutral links. - * - __index__ - offset of matched text - * - __lastIndex__ - index of next char after mathch end - * - __raw__ - matched text - * - __text__ - normalized text - * - __url__ - link, generated from matched text - **/ -LinkifyIt.prototype.match = function match(text) { - const result = []; - let shift = 0; - - // Try to take previous element from cache, if .test() called before - if (this.__index__ >= 0 && this.__text_cache__ === text) { - result.push(createMatch(this, shift)); - shift = this.__last_index__; + * The CompletionList namespace provides functions to deal with + * completion lists. + */ +var CompletionList; +(function (CompletionList) { + /** + * Creates a new completion list. + * + * @param items The completion items. + * @param isIncomplete The list is not complete. + */ + function create(items, isIncomplete) { + return { + items: items ? items : [], + isIncomplete: !!isIncomplete + }; } - - // Cut head if cache was used - let tail = shift ? text.slice(shift) : text; - - // Scan string until end reached - while (this.test(tail)) { - result.push(createMatch(this, shift)); - tail = tail.slice(this.__last_index__); - shift += this.__last_index__; + CompletionList.create = create; +})(CompletionList || (exports.CompletionList = CompletionList = {})); +var MarkedString; +(function (MarkedString) { + /** + * Creates a marked string from plain text. + * + * @param plainText The plain text. + */ + function fromPlainText(plainText) { + return plainText.replace(/[\\`*_{}[\]()#+\-.!]/g, '\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash } - if (result.length) { - return result; + MarkedString.fromPlainText = fromPlainText; + /** + * Checks whether the given value conforms to the {@link MarkedString} type. + */ + function is(value) { + var candidate = value; + return Is.string(candidate) || Is.objectLiteral(candidate) && Is.string(candidate.language) && Is.string(candidate.value); } - return null; -}; - -/** - * LinkifyIt#matchAtStart(text) -> Match|null - * - * Returns fully-formed (not fuzzy) link if it starts at the beginning - * of the string, and null otherwise. - **/ -LinkifyIt.prototype.matchAtStart = function matchAtStart(text) { - // Reset scan cache - this.__text_cache__ = text; - this.__index__ = -1; - if (!text.length) return null; - const m = this.re.schema_at_start.exec(text); - if (!m) return null; - const len = this.testSchemaAt(text, m[2], m[0].length); - if (!len) return null; - this.__schema__ = m[2]; - this.__index__ = m.index + m[1].length; - this.__last_index__ = m.index + m[0].length + len; - return createMatch(this, 0); -}; - -/** chainable - * LinkifyIt#tlds(list [, keepOld]) -> this - * - list (Array): list of tlds - * - keepOld (Boolean): merge with current list if `true` (`false` by default) - * - * Load (or merge) new tlds list. Those are user for fuzzy links (without prefix) - * to avoid false positives. By default this algorythm used: - * - * - hostname with any 2-letter root zones are ok. - * - biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф - * are ok. - * - encoded (`xn--...`) root zones are ok. - * - * If list is replaced, then exact match for 2-chars root zones will be checked. - **/ -LinkifyIt.prototype.tlds = function tlds(list, keepOld) { - list = Array.isArray(list) ? list : [list]; - if (!keepOld) { - this.__tlds__ = list.slice(); - this.__tlds_replaced__ = true; - compile(this); - return this; + MarkedString.is = is; +})(MarkedString || (exports.MarkedString = MarkedString = {})); +var Hover; +(function (Hover) { + /** + * Checks whether the given value conforms to the {@link Hover} interface. + */ + function is(value) { + var candidate = value; + return !!candidate && Is.objectLiteral(candidate) && (MarkupContent.is(candidate.contents) || MarkedString.is(candidate.contents) || Is.typedArray(candidate.contents, MarkedString.is)) && (value.range === undefined || Range.is(value.range)); } - this.__tlds__ = this.__tlds__.concat(list).sort().filter(function (el, idx, arr) { - return el !== arr[idx - 1]; - }).reverse(); - compile(this); - return this; -}; - + Hover.is = is; +})(Hover || (exports.Hover = Hover = {})); /** - * LinkifyIt#normalize(match) - * - * Default normalizer (if schema does not define it's own). - **/ -LinkifyIt.prototype.normalize = function normalize(match) { - // Do minimal possible changes by default. Need to collect feedback prior - // to move forward https://github.com/markdown-it/linkify-it/issues/1 - - if (!match.schema) { - match.url = 'http://' + match.url; + * The ParameterInformation namespace provides helper functions to work with + * {@link ParameterInformation} literals. + */ +var ParameterInformation; +(function (ParameterInformation) { + /** + * Creates a new parameter information literal. + * + * @param label A label string. + * @param documentation A doc string. + */ + function create(label, documentation) { + return documentation ? { + label: label, + documentation: documentation + } : { + label: label + }; } - if (match.schema === 'mailto:' && !/^mailto:/i.test(match.url)) { - match.url = 'mailto:' + match.url; + ParameterInformation.create = create; +})(ParameterInformation || (exports.ParameterInformation = ParameterInformation = {})); +/** + * The SignatureInformation namespace provides helper functions to work with + * {@link SignatureInformation} literals. + */ +var SignatureInformation; +(function (SignatureInformation) { + function create(label, documentation) { + var parameters = []; + for (var _i = 2; _i < arguments.length; _i++) { + parameters[_i - 2] = arguments[_i]; + } + var result = { + label: label + }; + if (Is.defined(documentation)) { + result.documentation = documentation; + } + if (Is.defined(parameters)) { + result.parameters = parameters; + } else { + result.parameters = []; + } + return result; } -}; - + SignatureInformation.create = create; +})(SignatureInformation || (exports.SignatureInformation = SignatureInformation = {})); /** - * LinkifyIt#onCompile() - * - * Override to modify basic RegExp-s. - **/ -LinkifyIt.prototype.onCompile = function onCompile() {}; -module.exports = LinkifyIt; - -/***/ }), - -/***/ "../node_modules/markdown-it/dist/index.cjs.js": -/*!*****************************************************!*\ - !*** ../node_modules/markdown-it/dist/index.cjs.js ***! - \*****************************************************/ -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - - -var mdurl = __webpack_require__(/*! mdurl */ "../node_modules/mdurl/build/index.cjs.js"); -var ucmicro = __webpack_require__(/*! uc.micro */ "../node_modules/uc.micro/build/index.cjs.js"); -var entities = __webpack_require__(/*! entities */ "../../../node_modules/entities/lib/index.js"); -var LinkifyIt = __webpack_require__(/*! linkify-it */ "../node_modules/linkify-it/build/index.cjs.js"); -var punycode = __webpack_require__(/*! punycode.js */ "../../../node_modules/punycode.js/punycode.es6.js"); -function _interopNamespaceDefault(e) { - var n = Object.create(null); - if (e) { - Object.keys(e).forEach(function (k) { - if (k !== 'default') { - var d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: function () { - return e[k]; - } - }); - } - }); - } - n.default = e; - return Object.freeze(n); -} -var mdurl__namespace = /*#__PURE__*/_interopNamespaceDefault(mdurl); -var ucmicro__namespace = /*#__PURE__*/_interopNamespaceDefault(ucmicro); - -// Utilities -// - -function _class(obj) { - return Object.prototype.toString.call(obj); -} -function isString(obj) { - return _class(obj) === '[object String]'; -} -const _hasOwnProperty = Object.prototype.hasOwnProperty; -function has(object, key) { - return _hasOwnProperty.call(object, key); -} - -// Merge objects -// -function assign(obj /* from1, from2, from3, ... */) { - const sources = Array.prototype.slice.call(arguments, 1); - sources.forEach(function (source) { - if (!source) { - return; - } - if (typeof source !== 'object') { - throw new TypeError(source + 'must be object'); + * A document highlight kind. + */ +var DocumentHighlightKind; +(function (DocumentHighlightKind) { + /** + * A textual occurrence. + */ + DocumentHighlightKind.Text = 1; + /** + * Read-access of a symbol, like reading a variable. + */ + DocumentHighlightKind.Read = 2; + /** + * Write-access of a symbol, like writing to a variable. + */ + DocumentHighlightKind.Write = 3; +})(DocumentHighlightKind || (exports.DocumentHighlightKind = DocumentHighlightKind = {})); +/** + * DocumentHighlight namespace to provide helper functions to work with + * {@link DocumentHighlight} literals. + */ +var DocumentHighlight; +(function (DocumentHighlight) { + /** + * Create a DocumentHighlight object. + * @param range The range the highlight applies to. + * @param kind The highlight kind + */ + function create(range, kind) { + var result = { + range: range + }; + if (Is.number(kind)) { + result.kind = kind; } - Object.keys(source).forEach(function (key) { - obj[key] = source[key]; - }); - }); - return obj; -} - -// Remove element from array and put another array at those position. -// Useful for some operations with tokens -function arrayReplaceAt(src, pos, newElements) { - return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1)); -} -function isValidEntityCode(c) { - /* eslint no-bitwise:0 */ - // broken sequence - if (c >= 0xD800 && c <= 0xDFFF) { - return false; + return result; } - // never used - if (c >= 0xFDD0 && c <= 0xFDEF) { - return false; + DocumentHighlight.create = create; +})(DocumentHighlight || (exports.DocumentHighlight = DocumentHighlight = {})); +/** + * A symbol kind. + */ +var SymbolKind; +(function (SymbolKind) { + SymbolKind.File = 1; + SymbolKind.Module = 2; + SymbolKind.Namespace = 3; + SymbolKind.Package = 4; + SymbolKind.Class = 5; + SymbolKind.Method = 6; + SymbolKind.Property = 7; + SymbolKind.Field = 8; + SymbolKind.Constructor = 9; + SymbolKind.Enum = 10; + SymbolKind.Interface = 11; + SymbolKind.Function = 12; + SymbolKind.Variable = 13; + SymbolKind.Constant = 14; + SymbolKind.String = 15; + SymbolKind.Number = 16; + SymbolKind.Boolean = 17; + SymbolKind.Array = 18; + SymbolKind.Object = 19; + SymbolKind.Key = 20; + SymbolKind.Null = 21; + SymbolKind.EnumMember = 22; + SymbolKind.Struct = 23; + SymbolKind.Event = 24; + SymbolKind.Operator = 25; + SymbolKind.TypeParameter = 26; +})(SymbolKind || (exports.SymbolKind = SymbolKind = {})); +/** + * Symbol tags are extra annotations that tweak the rendering of a symbol. + * + * @since 3.16 + */ +var SymbolTag; +(function (SymbolTag) { + /** + * Render a symbol as obsolete, usually using a strike-out. + */ + SymbolTag.Deprecated = 1; +})(SymbolTag || (exports.SymbolTag = SymbolTag = {})); +var SymbolInformation; +(function (SymbolInformation) { + /** + * Creates a new symbol information literal. + * + * @param name The name of the symbol. + * @param kind The kind of the symbol. + * @param range The range of the location of the symbol. + * @param uri The resource of the location of symbol. + * @param containerName The name of the symbol containing the symbol. + */ + function create(name, kind, range, uri, containerName) { + var result = { + name: name, + kind: kind, + location: { + uri: uri, + range: range + } + }; + if (containerName) { + result.containerName = containerName; + } + return result; } - if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { - return false; + SymbolInformation.create = create; +})(SymbolInformation || (exports.SymbolInformation = SymbolInformation = {})); +var WorkspaceSymbol; +(function (WorkspaceSymbol) { + /** + * Create a new workspace symbol. + * + * @param name The name of the symbol. + * @param kind The kind of the symbol. + * @param uri The resource of the location of the symbol. + * @param range An options range of the location. + * @returns A WorkspaceSymbol. + */ + function create(name, kind, uri, range) { + return range !== undefined ? { + name: name, + kind: kind, + location: { + uri: uri, + range: range + } + } : { + name: name, + kind: kind, + location: { + uri: uri + } + }; } - // control codes - if (c >= 0x00 && c <= 0x08) { - return false; + WorkspaceSymbol.create = create; +})(WorkspaceSymbol || (exports.WorkspaceSymbol = WorkspaceSymbol = {})); +var DocumentSymbol; +(function (DocumentSymbol) { + /** + * Creates a new symbol information literal. + * + * @param name The name of the symbol. + * @param detail The detail of the symbol. + * @param kind The kind of the symbol. + * @param range The range of the symbol. + * @param selectionRange The selectionRange of the symbol. + * @param children Children of the symbol. + */ + function create(name, detail, kind, range, selectionRange, children) { + var result = { + name: name, + detail: detail, + kind: kind, + range: range, + selectionRange: selectionRange + }; + if (children !== undefined) { + result.children = children; + } + return result; } - if (c === 0x0B) { - return false; + DocumentSymbol.create = create; + /** + * Checks whether the given literal conforms to the {@link DocumentSymbol} interface. + */ + function is(value) { + var candidate = value; + return candidate && Is.string(candidate.name) && Is.number(candidate.kind) && Range.is(candidate.range) && Range.is(candidate.selectionRange) && (candidate.detail === undefined || Is.string(candidate.detail)) && (candidate.deprecated === undefined || Is.boolean(candidate.deprecated)) && (candidate.children === undefined || Array.isArray(candidate.children)) && (candidate.tags === undefined || Array.isArray(candidate.tags)); } - if (c >= 0x0E && c <= 0x1F) { - return false; + DocumentSymbol.is = is; +})(DocumentSymbol || (exports.DocumentSymbol = DocumentSymbol = {})); +/** + * A set of predefined code action kinds + */ +var CodeActionKind; +(function (CodeActionKind) { + /** + * Empty kind. + */ + CodeActionKind.Empty = ''; + /** + * Base kind for quickfix actions: 'quickfix' + */ + CodeActionKind.QuickFix = 'quickfix'; + /** + * Base kind for refactoring actions: 'refactor' + */ + CodeActionKind.Refactor = 'refactor'; + /** + * Base kind for refactoring extraction actions: 'refactor.extract' + * + * Example extract actions: + * + * - Extract method + * - Extract function + * - Extract variable + * - Extract interface from class + * - ... + */ + CodeActionKind.RefactorExtract = 'refactor.extract'; + /** + * Base kind for refactoring inline actions: 'refactor.inline' + * + * Example inline actions: + * + * - Inline function + * - Inline variable + * - Inline constant + * - ... + */ + CodeActionKind.RefactorInline = 'refactor.inline'; + /** + * Base kind for refactoring rewrite actions: 'refactor.rewrite' + * + * Example rewrite actions: + * + * - Convert JavaScript function to class + * - Add or remove parameter + * - Encapsulate field + * - Make method static + * - Move method to base class + * - ... + */ + CodeActionKind.RefactorRewrite = 'refactor.rewrite'; + /** + * Base kind for source actions: `source` + * + * Source code actions apply to the entire file. + */ + CodeActionKind.Source = 'source'; + /** + * Base kind for an organize imports source action: `source.organizeImports` + */ + CodeActionKind.SourceOrganizeImports = 'source.organizeImports'; + /** + * Base kind for auto-fix source actions: `source.fixAll`. + * + * Fix all actions automatically fix errors that have a clear fix that do not require user input. + * They should not suppress errors or perform unsafe fixes such as generating new types or classes. + * + * @since 3.15.0 + */ + CodeActionKind.SourceFixAll = 'source.fixAll'; +})(CodeActionKind || (exports.CodeActionKind = CodeActionKind = {})); +/** + * The reason why code actions were requested. + * + * @since 3.17.0 + */ +var CodeActionTriggerKind; +(function (CodeActionTriggerKind) { + /** + * Code actions were explicitly requested by the user or by an extension. + */ + CodeActionTriggerKind.Invoked = 1; + /** + * Code actions were requested automatically. + * + * This typically happens when current selection in a file changes, but can + * also be triggered when file content changes. + */ + CodeActionTriggerKind.Automatic = 2; +})(CodeActionTriggerKind || (exports.CodeActionTriggerKind = CodeActionTriggerKind = {})); +/** + * The CodeActionContext namespace provides helper functions to work with + * {@link CodeActionContext} literals. + */ +var CodeActionContext; +(function (CodeActionContext) { + /** + * Creates a new CodeActionContext literal. + */ + function create(diagnostics, only, triggerKind) { + var result = { + diagnostics: diagnostics + }; + if (only !== undefined && only !== null) { + result.only = only; + } + if (triggerKind !== undefined && triggerKind !== null) { + result.triggerKind = triggerKind; + } + return result; } - if (c >= 0x7F && c <= 0x9F) { - return false; + CodeActionContext.create = create; + /** + * Checks whether the given literal conforms to the {@link CodeActionContext} interface. + */ + function is(value) { + var candidate = value; + return Is.defined(candidate) && Is.typedArray(candidate.diagnostics, Diagnostic.is) && (candidate.only === undefined || Is.typedArray(candidate.only, Is.string)) && (candidate.triggerKind === undefined || candidate.triggerKind === CodeActionTriggerKind.Invoked || candidate.triggerKind === CodeActionTriggerKind.Automatic); } - // out of range - if (c > 0x10FFFF) { - return false; + CodeActionContext.is = is; +})(CodeActionContext || (exports.CodeActionContext = CodeActionContext = {})); +var CodeAction; +(function (CodeAction) { + function create(title, kindOrCommandOrEdit, kind) { + var result = { + title: title + }; + var checkKind = true; + if (typeof kindOrCommandOrEdit === 'string') { + checkKind = false; + result.kind = kindOrCommandOrEdit; + } else if (Command.is(kindOrCommandOrEdit)) { + result.command = kindOrCommandOrEdit; + } else { + result.edit = kindOrCommandOrEdit; + } + if (checkKind && kind !== undefined) { + result.kind = kind; + } + return result; } - return true; -} -function fromCodePoint(c) { - /* eslint no-bitwise:0 */ - if (c > 0xffff) { - c -= 0x10000; - const surrogate1 = 0xd800 + (c >> 10); - const surrogate2 = 0xdc00 + (c & 0x3ff); - return String.fromCharCode(surrogate1, surrogate2); + CodeAction.create = create; + function is(value) { + var candidate = value; + return candidate && Is.string(candidate.title) && (candidate.diagnostics === undefined || Is.typedArray(candidate.diagnostics, Diagnostic.is)) && (candidate.kind === undefined || Is.string(candidate.kind)) && (candidate.edit !== undefined || candidate.command !== undefined) && (candidate.command === undefined || Command.is(candidate.command)) && (candidate.isPreferred === undefined || Is.boolean(candidate.isPreferred)) && (candidate.edit === undefined || WorkspaceEdit.is(candidate.edit)); } - return String.fromCharCode(c); -} -const UNESCAPE_MD_RE = /\\([!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])/g; -const ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi; -const UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi'); -const DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i; -function replaceEntityPattern(match, name) { - if (name.charCodeAt(0) === 0x23 /* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) { - const code = name[1].toLowerCase() === 'x' ? parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10); - if (isValidEntityCode(code)) { - return fromCodePoint(code); + CodeAction.is = is; +})(CodeAction || (exports.CodeAction = CodeAction = {})); +/** + * The CodeLens namespace provides helper functions to work with + * {@link CodeLens} literals. + */ +var CodeLens; +(function (CodeLens) { + /** + * Creates a new CodeLens literal. + */ + function create(range, data) { + var result = { + range: range + }; + if (Is.defined(data)) { + result.data = data; } - return match; - } - const decoded = entities.decodeHTML(match); - if (decoded !== match) { - return decoded; + return result; } - return match; -} - -/* function replaceEntities(str) { - if (str.indexOf('&') < 0) { return str; } - - return str.replace(ENTITY_RE, replaceEntityPattern); -} */ - -function unescapeMd(str) { - if (str.indexOf('\\') < 0) { - return str; + CodeLens.create = create; + /** + * Checks whether the given literal conforms to the {@link CodeLens} interface. + */ + function is(value) { + var candidate = value; + return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.command) || Command.is(candidate.command)); } - return str.replace(UNESCAPE_MD_RE, '$1'); -} -function unescapeAll(str) { - if (str.indexOf('\\') < 0 && str.indexOf('&') < 0) { - return str; + CodeLens.is = is; +})(CodeLens || (exports.CodeLens = CodeLens = {})); +/** + * The FormattingOptions namespace provides helper functions to work with + * {@link FormattingOptions} literals. + */ +var FormattingOptions; +(function (FormattingOptions) { + /** + * Creates a new FormattingOptions literal. + */ + function create(tabSize, insertSpaces) { + return { + tabSize: tabSize, + insertSpaces: insertSpaces + }; } - return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) { - if (escaped) { - return escaped; - } - return replaceEntityPattern(match, entity); - }); -} -const HTML_ESCAPE_TEST_RE = /[&<>"]/; -const HTML_ESCAPE_REPLACE_RE = /[&<>"]/g; -const HTML_REPLACEMENTS = { - '&': '&', - '<': '<', - '>': '>', - '"': '"' -}; -function replaceUnsafeChar(ch) { - return HTML_REPLACEMENTS[ch]; -} -function escapeHtml(str) { - if (HTML_ESCAPE_TEST_RE.test(str)) { - return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar); + FormattingOptions.create = create; + /** + * Checks whether the given literal conforms to the {@link FormattingOptions} interface. + */ + function is(value) { + var candidate = value; + return Is.defined(candidate) && Is.uinteger(candidate.tabSize) && Is.boolean(candidate.insertSpaces); } - return str; -} -const REGEXP_ESCAPE_RE = /[.?*+^$[\]\\(){}|-]/g; -function escapeRE(str) { - return str.replace(REGEXP_ESCAPE_RE, '\\$&'); -} -function isSpace(code) { - switch (code) { - case 0x09: - case 0x20: - return true; - } - return false; -} - -// Zs (unicode class) || [\t\f\v\r\n] -function isWhiteSpace(code) { - if (code >= 0x2000 && code <= 0x200A) { - return true; + FormattingOptions.is = is; +})(FormattingOptions || (exports.FormattingOptions = FormattingOptions = {})); +/** + * The DocumentLink namespace provides helper functions to work with + * {@link DocumentLink} literals. + */ +var DocumentLink; +(function (DocumentLink) { + /** + * Creates a new DocumentLink literal. + */ + function create(range, target, data) { + return { + range: range, + target: target, + data: data + }; } - switch (code) { - case 0x09: // \t - case 0x0A: // \n - case 0x0B: // \v - case 0x0C: // \f - case 0x0D: // \r - case 0x20: - case 0xA0: - case 0x1680: - case 0x202F: - case 0x205F: - case 0x3000: - return true; + DocumentLink.create = create; + /** + * Checks whether the given literal conforms to the {@link DocumentLink} interface. + */ + function is(value) { + var candidate = value; + return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.target) || Is.string(candidate.target)); } - return false; -} - -/* eslint-disable max-len */ - -// Currently without astral characters support. -function isPunctChar(ch) { - return ucmicro__namespace.P.test(ch) || ucmicro__namespace.S.test(ch); -} - -// Markdown ASCII punctuation characters. -// -// !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \, ], ^, _, `, {, |, }, or ~ -// http://spec.commonmark.org/0.15/#ascii-punctuation-character -// -// Don't confuse with unicode punctuation !!! It lacks some chars in ascii range. -// -function isMdAsciiPunct(ch) { - switch (ch) { - case 0x21 /* ! */: - case 0x22 /* " */: - case 0x23 /* # */: - case 0x24 /* $ */: - case 0x25 /* % */: - case 0x26 /* & */: - case 0x27 /* ' */: - case 0x28 /* ( */: - case 0x29 /* ) */: - case 0x2A /* * */: - case 0x2B /* + */: - case 0x2C /* , */: - case 0x2D /* - */: - case 0x2E /* . */: - case 0x2F /* / */: - case 0x3A /* : */: - case 0x3B /* ; */: - case 0x3C /* < */: - case 0x3D /* = */: - case 0x3E /* > */: - case 0x3F /* ? */: - case 0x40 /* @ */: - case 0x5B /* [ */: - case 0x5C /* \ */: - case 0x5D /* ] */: - case 0x5E /* ^ */: - case 0x5F /* _ */: - case 0x60 /* ` */: - case 0x7B /* { */: - case 0x7C /* | */: - case 0x7D /* } */: - case 0x7E /* ~ */: - return true; - default: - return false; + DocumentLink.is = is; +})(DocumentLink || (exports.DocumentLink = DocumentLink = {})); +/** + * The SelectionRange namespace provides helper function to work with + * SelectionRange literals. + */ +var SelectionRange; +(function (SelectionRange) { + /** + * Creates a new SelectionRange + * @param range the range. + * @param parent an optional parent. + */ + function create(range, parent) { + return { + range: range, + parent: parent + }; } -} - -// Hepler to unify [reference labels]. -// -function normalizeReference(str) { - // Trim and collapse whitespace - // - str = str.trim().replace(/\s+/g, ' '); - - // In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug - // fixed in v12 (couldn't find any details). - // - // So treat this one as a special case - // (remove this when node v10 is no longer supported). - // - if ('ẞ'.toLowerCase() === 'Ṿ') { - str = str.replace(/ẞ/g, 'ß'); + SelectionRange.create = create; + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && Range.is(candidate.range) && (candidate.parent === undefined || SelectionRange.is(candidate.parent)); } - - // .toLowerCase().toUpperCase() should get rid of all differences - // between letter variants. - // - // Simple .toLowerCase() doesn't normalize 125 code points correctly, - // and .toUpperCase doesn't normalize 6 of them (list of exceptions: - // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently - // uppercased versions). - // - // Here's an example showing how it happens. Lets take greek letter omega: - // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ) - // - // Unicode entries: - // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; - // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 - // 03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 - // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8; - // - // Case-insensitive comparison should treat all of them as equivalent. - // - // But .toLowerCase() doesn't change ϑ (it's already lowercase), - // and .toUpperCase() doesn't change ϴ (already uppercase). - // - // Applying first lower then upper case normalizes any character: - // '\u0398\u03f4\u03b8\u03d1'.toLowerCase().toUpperCase() === '\u0398\u0398\u0398\u0398' - // - // Note: this is equivalent to unicode case folding; unicode normalization - // is a different step that is not required here. - // - // Final result should be uppercased, because it's later stored in an object - // (this avoid a conflict with Object.prototype members, - // most notably, `__proto__`) - // - return str.toLowerCase().toUpperCase(); -} - -// Re-export libraries commonly used in both markdown-it and its plugins, -// so plugins won't have to depend on them explicitly, which reduces their -// bundled size (e.g. a browser build). -// -const lib = { - mdurl: mdurl__namespace, - ucmicro: ucmicro__namespace -}; -var utils = /*#__PURE__*/Object.freeze({ - __proto__: null, - arrayReplaceAt: arrayReplaceAt, - assign: assign, - escapeHtml: escapeHtml, - escapeRE: escapeRE, - fromCodePoint: fromCodePoint, - has: has, - isMdAsciiPunct: isMdAsciiPunct, - isPunctChar: isPunctChar, - isSpace: isSpace, - isString: isString, - isValidEntityCode: isValidEntityCode, - isWhiteSpace: isWhiteSpace, - lib: lib, - normalizeReference: normalizeReference, - unescapeAll: unescapeAll, - unescapeMd: unescapeMd -}); - -// Parse link label -// -// this function assumes that first character ("[") already matches; -// returns the end of the label -// - -function parseLinkLabel(state, start, disableNested) { - let level, found, marker, prevPos; - const max = state.posMax; - const oldPos = state.pos; - state.pos = start + 1; - level = 1; - while (state.pos < max) { - marker = state.src.charCodeAt(state.pos); - if (marker === 0x5D /* ] */) { - level--; - if (level === 0) { - found = true; - break; - } - } - prevPos = state.pos; - state.md.inline.skipToken(state); - if (marker === 0x5B /* [ */) { - if (prevPos === state.pos - 1) { - // increase level if we find text `[`, which is not a part of any token - level++; - } else if (disableNested) { - state.pos = oldPos; - return -1; - } - } + SelectionRange.is = is; +})(SelectionRange || (exports.SelectionRange = SelectionRange = {})); +/** + * A set of predefined token types. This set is not fixed + * an clients can specify additional token types via the + * corresponding client capabilities. + * + * @since 3.16.0 + */ +var SemanticTokenTypes; +(function (SemanticTokenTypes) { + SemanticTokenTypes["namespace"] = "namespace"; + /** + * Represents a generic type. Acts as a fallback for types which can't be mapped to + * a specific type like class or enum. + */ + SemanticTokenTypes["type"] = "type"; + SemanticTokenTypes["class"] = "class"; + SemanticTokenTypes["enum"] = "enum"; + SemanticTokenTypes["interface"] = "interface"; + SemanticTokenTypes["struct"] = "struct"; + SemanticTokenTypes["typeParameter"] = "typeParameter"; + SemanticTokenTypes["parameter"] = "parameter"; + SemanticTokenTypes["variable"] = "variable"; + SemanticTokenTypes["property"] = "property"; + SemanticTokenTypes["enumMember"] = "enumMember"; + SemanticTokenTypes["event"] = "event"; + SemanticTokenTypes["function"] = "function"; + SemanticTokenTypes["method"] = "method"; + SemanticTokenTypes["macro"] = "macro"; + SemanticTokenTypes["keyword"] = "keyword"; + SemanticTokenTypes["modifier"] = "modifier"; + SemanticTokenTypes["comment"] = "comment"; + SemanticTokenTypes["string"] = "string"; + SemanticTokenTypes["number"] = "number"; + SemanticTokenTypes["regexp"] = "regexp"; + SemanticTokenTypes["operator"] = "operator"; + /** + * @since 3.17.0 + */ + SemanticTokenTypes["decorator"] = "decorator"; +})(SemanticTokenTypes || (exports.SemanticTokenTypes = SemanticTokenTypes = {})); +/** + * A set of predefined token modifiers. This set is not fixed + * an clients can specify additional token types via the + * corresponding client capabilities. + * + * @since 3.16.0 + */ +var SemanticTokenModifiers; +(function (SemanticTokenModifiers) { + SemanticTokenModifiers["declaration"] = "declaration"; + SemanticTokenModifiers["definition"] = "definition"; + SemanticTokenModifiers["readonly"] = "readonly"; + SemanticTokenModifiers["static"] = "static"; + SemanticTokenModifiers["deprecated"] = "deprecated"; + SemanticTokenModifiers["abstract"] = "abstract"; + SemanticTokenModifiers["async"] = "async"; + SemanticTokenModifiers["modification"] = "modification"; + SemanticTokenModifiers["documentation"] = "documentation"; + SemanticTokenModifiers["defaultLibrary"] = "defaultLibrary"; +})(SemanticTokenModifiers || (exports.SemanticTokenModifiers = SemanticTokenModifiers = {})); +/** + * @since 3.16.0 + */ +var SemanticTokens; +(function (SemanticTokens) { + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && (candidate.resultId === undefined || typeof candidate.resultId === 'string') && Array.isArray(candidate.data) && (candidate.data.length === 0 || typeof candidate.data[0] === 'number'); } - let labelEnd = -1; - if (found) { - labelEnd = state.pos; + SemanticTokens.is = is; +})(SemanticTokens || (exports.SemanticTokens = SemanticTokens = {})); +/** + * The InlineValueText namespace provides functions to deal with InlineValueTexts. + * + * @since 3.17.0 + */ +var InlineValueText; +(function (InlineValueText) { + /** + * Creates a new InlineValueText literal. + */ + function create(range, text) { + return { + range: range, + text: text + }; } - - // restore old state - state.pos = oldPos; - return labelEnd; -} - -// Parse link destination -// - -function parseLinkDestination(str, start, max) { - let code; - let pos = start; - const result = { - ok: false, - pos: 0, - str: '' - }; - if (str.charCodeAt(pos) === 0x3C /* < */) { - pos++; - while (pos < max) { - code = str.charCodeAt(pos); - if (code === 0x0A /* \n */) { - return result; - } - if (code === 0x3C /* < */) { - return result; - } - if (code === 0x3E /* > */) { - result.pos = pos + 1; - result.str = unescapeAll(str.slice(start + 1, pos)); - result.ok = true; - return result; - } - if (code === 0x5C /* \ */ && pos + 1 < max) { - pos += 2; - continue; - } - pos++; - } - - // no closing '>' - return result; + InlineValueText.create = create; + function is(value) { + var candidate = value; + return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.string(candidate.text); } - - // this should be ... } else { ... branch - - let level = 0; - while (pos < max) { - code = str.charCodeAt(pos); - if (code === 0x20) { - break; - } - - // ascii control characters - if (code < 0x20 || code === 0x7F) { - break; - } - if (code === 0x5C /* \ */ && pos + 1 < max) { - if (str.charCodeAt(pos + 1) === 0x20) { - break; - } - pos += 2; - continue; - } - if (code === 0x28 /* ( */) { - level++; - if (level > 32) { - return result; - } - } - if (code === 0x29 /* ) */) { - if (level === 0) { - break; - } - level--; - } - pos++; + InlineValueText.is = is; +})(InlineValueText || (exports.InlineValueText = InlineValueText = {})); +/** + * The InlineValueVariableLookup namespace provides functions to deal with InlineValueVariableLookups. + * + * @since 3.17.0 + */ +var InlineValueVariableLookup; +(function (InlineValueVariableLookup) { + /** + * Creates a new InlineValueText literal. + */ + function create(range, variableName, caseSensitiveLookup) { + return { + range: range, + variableName: variableName, + caseSensitiveLookup: caseSensitiveLookup + }; } - if (start === pos) { - return result; + InlineValueVariableLookup.create = create; + function is(value) { + var candidate = value; + return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.boolean(candidate.caseSensitiveLookup) && (Is.string(candidate.variableName) || candidate.variableName === undefined); } - if (level !== 0) { - return result; + InlineValueVariableLookup.is = is; +})(InlineValueVariableLookup || (exports.InlineValueVariableLookup = InlineValueVariableLookup = {})); +/** + * The InlineValueEvaluatableExpression namespace provides functions to deal with InlineValueEvaluatableExpression. + * + * @since 3.17.0 + */ +var InlineValueEvaluatableExpression; +(function (InlineValueEvaluatableExpression) { + /** + * Creates a new InlineValueEvaluatableExpression literal. + */ + function create(range, expression) { + return { + range: range, + expression: expression + }; } - result.str = unescapeAll(str.slice(start, pos)); - result.pos = pos; - result.ok = true; - return result; -} - -// Parse link title -// - -// Parse link title within `str` in [start, max] range, -// or continue previous parsing if `prev_state` is defined (equal to result of last execution). -// -function parseLinkTitle(str, start, max, prev_state) { - let code; - let pos = start; - const state = { - // if `true`, this is a valid link title - ok: false, - // if `true`, this link can be continued on the next line - can_continue: false, - // if `ok`, it's the position of the first character after the closing marker - pos: 0, - // if `ok`, it's the unescaped title - str: '', - // expected closing marker character code - marker: 0 - }; - if (prev_state) { - // this is a continuation of a previous parseLinkTitle call on the next line, - // used in reference links only - state.str = prev_state.str; - state.marker = prev_state.marker; - } else { - if (pos >= max) { - return state; - } - let marker = str.charCodeAt(pos); - if (marker !== 0x22 /* " */ && marker !== 0x27 /* ' */ && marker !== 0x28 /* ( */) { - return state; - } - start++; - pos++; - - // if opening marker is "(", switch it to closing marker ")" - if (marker === 0x28) { - marker = 0x29; - } - state.marker = marker; + InlineValueEvaluatableExpression.create = create; + function is(value) { + var candidate = value; + return candidate !== undefined && candidate !== null && Range.is(candidate.range) && (Is.string(candidate.expression) || candidate.expression === undefined); } - while (pos < max) { - code = str.charCodeAt(pos); - if (code === state.marker) { - state.pos = pos + 1; - state.str += unescapeAll(str.slice(start, pos)); - state.ok = true; - return state; - } else if (code === 0x28 /* ( */ && state.marker === 0x29 /* ) */) { - return state; - } else if (code === 0x5C /* \ */ && pos + 1 < max) { - pos++; - } - pos++; - } - - // no closing marker found, but this link title may continue on the next line (for references) - state.can_continue = true; - state.str += unescapeAll(str.slice(start, pos)); - return state; -} - -// Just a shortcut for bulk export - -var helpers = /*#__PURE__*/Object.freeze({ - __proto__: null, - parseLinkDestination: parseLinkDestination, - parseLinkLabel: parseLinkLabel, - parseLinkTitle: parseLinkTitle -}); - + InlineValueEvaluatableExpression.is = is; +})(InlineValueEvaluatableExpression || (exports.InlineValueEvaluatableExpression = InlineValueEvaluatableExpression = {})); /** - * class Renderer + * The InlineValueContext namespace provides helper functions to work with + * {@link InlineValueContext} literals. * - * Generates HTML from parsed token stream. Each instance has independent - * copy of rules. Those can be rewritten with ease. Also, you can add new - * rules if you create plugin and adds new token types. - **/ - -const default_rules = {}; -default_rules.code_inline = function (tokens, idx, options, env, slf) { - const token = tokens[idx]; - return '' + escapeHtml(token.content) + '
'; -}; -default_rules.code_block = function (tokens, idx, options, env, slf) { - const token = tokens[idx]; - return '' + escapeHtml(tokens[idx].content) + '\n'; -}; -default_rules.fence = function (tokens, idx, options, env, slf) { - const token = tokens[idx]; - const info = token.info ? unescapeAll(token.info).trim() : ''; - let langName = ''; - let langAttrs = ''; - if (info) { - const arr = info.split(/(\s+)/g); - langName = arr[0]; - langAttrs = arr.slice(2).join(''); - } - let highlighted; - if (options.highlight) { - highlighted = options.highlight(token.content, langName, langAttrs) || escapeHtml(token.content); - } else { - highlighted = escapeHtml(token.content); - } - if (highlighted.indexOf('${highlighted}\n`; } - return `
${highlighted}
\n`; -}; -default_rules.image = function (tokens, idx, options, env, slf) { - const token = tokens[idx]; - - // "alt" attr MUST be set, even if empty. Because it's mandatory and - // should be placed on proper position for tests. - // - // Replace content with actual value - - token.attrs[token.attrIndex('alt')][1] = slf.renderInlineAsText(token.children, options, env); - return slf.renderToken(tokens, idx, options); -}; -default_rules.hardbreak = function (tokens, idx, options /*, env */) { - return options.xhtmlOut ? '
\n' : '
\n'; -}; -default_rules.softbreak = function (tokens, idx, options /*, env */) { - return options.breaks ? options.xhtmlOut ? '
\n' : '
\n' : '\n'; -}; -default_rules.text = function (tokens, idx /*, options, env */) { - return escapeHtml(tokens[idx].content); -}; -default_rules.html_block = function (tokens, idx /*, options, env */) { - return tokens[idx].content; -}; -default_rules.html_inline = function (tokens, idx /*, options, env */) { - return tokens[idx].content; -}; - -/** - * new Renderer() - * - * Creates new [[Renderer]] instance and fill [[Renderer#rules]] with defaults. - **/ -function Renderer() { + InlineValueContext.create = create; /** - * Renderer#rules -> Object - * - * Contains render rules for tokens. Can be updated and extended. - * - * ##### Example - * - * ```javascript - * var md = require('markdown-it')(); - * - * md.renderer.rules.strong_open = function () { return ''; }; - * md.renderer.rules.strong_close = function () { return ''; }; - * - * var result = md.renderInline(...); - * ``` - * - * Each rule is called as independent static function with fixed signature: - * - * ```javascript - * function my_token_render(tokens, idx, options, env, renderer) { - * // ... - * return renderedHTML; - * } - * ``` - * - * See [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.mjs) - * for more details and examples. - **/ - this.rules = assign({}, default_rules); -} - -/** - * Renderer.renderAttrs(token) -> String - * - * Render token attributes to string. - **/ -Renderer.prototype.renderAttrs = function renderAttrs(token) { - let i, l, result; - if (!token.attrs) { - return ''; - } - result = ''; - for (i = 0, l = token.attrs.length; i < l; i++) { - result += ' ' + escapeHtml(token.attrs[i][0]) + '="' + escapeHtml(token.attrs[i][1]) + '"'; + * Checks whether the given literal conforms to the {@link InlineValueContext} interface. + */ + function is(value) { + var candidate = value; + return Is.defined(candidate) && Range.is(value.stoppedLocation); } - return result; -}; - + InlineValueContext.is = is; +})(InlineValueContext || (exports.InlineValueContext = InlineValueContext = {})); /** - * Renderer.renderToken(tokens, idx, options) -> String - * - tokens (Array): list of tokens - * - idx (Numbed): token index to render - * - options (Object): params of parser instance + * Inlay hint kinds. * - * Default token renderer. Can be overriden by custom function - * in [[Renderer#rules]]. - **/ -Renderer.prototype.renderToken = function renderToken(tokens, idx, options) { - const token = tokens[idx]; - let result = ''; - - // Tight list paragraphs - if (token.hidden) { - return ''; + * @since 3.17.0 + */ +var InlayHintKind; +(function (InlayHintKind) { + /** + * An inlay hint that for a type annotation. + */ + InlayHintKind.Type = 1; + /** + * An inlay hint that is for a parameter. + */ + InlayHintKind.Parameter = 2; + function is(value) { + return value === 1 || value === 2; } - - // Insert a newline between hidden paragraph and subsequent opening - // block-level tag. - // - // For example, here we should insert a newline before blockquote: - // - a - // > - // - if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden) { - result += '\n'; + InlayHintKind.is = is; +})(InlayHintKind || (exports.InlayHintKind = InlayHintKind = {})); +var InlayHintLabelPart; +(function (InlayHintLabelPart) { + function create(value) { + return { + value: value + }; } - - // Add token name, e.g. ``. - // - needLf = false; - } - } + InlayHintLabelPart.is = is; +})(InlayHintLabelPart || (exports.InlayHintLabelPart = InlayHintLabelPart = {})); +var InlayHint; +(function (InlayHint) { + function create(position, label, kind) { + var result = { + position: position, + label: label + }; + if (kind !== undefined) { + result.kind = kind; } + return result; } - result += needLf ? '>\n' : '>'; - return result; -}; - -/** - * Renderer.renderInline(tokens, options, env) -> String - * - tokens (Array): list on block tokens to render - * - options (Object): params of parser instance - * - env (Object): additional data from parsed input (references, for example) - * - * The same as [[Renderer.render]], but for single token of `inline` type. - **/ -Renderer.prototype.renderInline = function (tokens, options, env) { - let result = ''; - const rules = this.rules; - for (let i = 0, len = tokens.length; i < len; i++) { - const type = tokens[i].type; - if (typeof rules[type] !== 'undefined') { - result += rules[type](tokens, i, options, env, this); - } else { - result += this.renderToken(tokens, i, options); - } + InlayHint.create = create; + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && Position.is(candidate.position) && (Is.string(candidate.label) || Is.typedArray(candidate.label, InlayHintLabelPart.is)) && (candidate.kind === undefined || InlayHintKind.is(candidate.kind)) && candidate.textEdits === undefined || Is.typedArray(candidate.textEdits, TextEdit.is) && (candidate.tooltip === undefined || Is.string(candidate.tooltip) || MarkupContent.is(candidate.tooltip)) && (candidate.paddingLeft === undefined || Is.boolean(candidate.paddingLeft)) && (candidate.paddingRight === undefined || Is.boolean(candidate.paddingRight)); } - return result; -}; - -/** internal - * Renderer.renderInlineAsText(tokens, options, env) -> String - * - tokens (Array): list on block tokens to render - * - options (Object): params of parser instance - * - env (Object): additional data from parsed input (references, for example) - * - * Special kludge for image `alt` attributes to conform CommonMark spec. - * Don't try to use it! Spec requires to show `alt` content with stripped markup, - * instead of simple escaping. - **/ -Renderer.prototype.renderInlineAsText = function (tokens, options, env) { - let result = ''; - for (let i = 0, len = tokens.length; i < len; i++) { - switch (tokens[i].type) { - case 'text': - result += tokens[i].content; - break; - case 'image': - result += this.renderInlineAsText(tokens[i].children, options, env); - break; - case 'html_inline': - case 'html_block': - result += tokens[i].content; - break; - case 'softbreak': - case 'hardbreak': - result += '\n'; - break; - // all other tokens are skipped - } + InlayHint.is = is; +})(InlayHint || (exports.InlayHint = InlayHint = {})); +var WorkspaceFolder; +(function (WorkspaceFolder) { + function is(value) { + var candidate = value; + return Is.objectLiteral(candidate) && URI.is(candidate.uri) && Is.string(candidate.name); } - - return result; -}; - + WorkspaceFolder.is = is; +})(WorkspaceFolder || (exports.WorkspaceFolder = WorkspaceFolder = {})); +var EOL = exports.EOL = ['\n', '\r\n', '\r']; /** - * Renderer.render(tokens, options, env) -> String - * - tokens (Array): list on block tokens to render - * - options (Object): params of parser instance - * - env (Object): additional data from parsed input (references, for example) - * - * Takes token stream and generates HTML. Probably, you will never need to call - * this method directly. - **/ -Renderer.prototype.render = function (tokens, options, env) { - let result = ''; - const rules = this.rules; - for (let i = 0, len = tokens.length; i < len; i++) { - const type = tokens[i].type; - if (type === 'inline') { - result += this.renderInline(tokens[i].children, options, env); - } else if (typeof rules[type] !== 'undefined') { - result += rules[type](tokens, i, options, env, this); - } else { - result += this.renderToken(tokens, i, options, env); - } + * @deprecated Use the text document from the new vscode-languageserver-textdocument package. + */ +var TextDocument; +(function (TextDocument) { + /** + * Creates a new ITextDocument literal from the given uri and content. + * @param uri The document's uri. + * @param languageId The document's language Id. + * @param version The document's version. + * @param content The document's content. + */ + function create(uri, languageId, version, content) { + return new FullTextDocument(uri, languageId, version, content); } - return result; -}; - -/** - * class Ruler - * - * Helper class, used by [[MarkdownIt#core]], [[MarkdownIt#block]] and - * [[MarkdownIt#inline]] to manage sequences of functions (rules): - * - * - keep rules in defined order - * - assign the name to each rule - * - enable/disable rules - * - add/replace rules - * - allow assign rules to additional named chains (in the same) - * - cacheing lists of active rules - * - * You will not need use this class directly until write plugins. For simple - * rules control use [[MarkdownIt.disable]], [[MarkdownIt.enable]] and - * [[MarkdownIt.use]]. - **/ - -/** - * new Ruler() - **/ -function Ruler() { - // List of added rules. Each element is: - // - // { - // name: XXX, - // enabled: Boolean, - // fn: Function(), - // alt: [ name2, name3 ] - // } - // - this.__rules__ = []; - - // Cached rule chains. - // - // First level - chain name, '' for default. - // Second level - diginal anchor for fast filtering by charcodes. - // - this.__cache__ = null; -} - -// Helper methods, should not be used directly - -// Find rule index by name -// -Ruler.prototype.__find__ = function (name) { - for (let i = 0; i < this.__rules__.length; i++) { - if (this.__rules__[i].name === name) { - return i; - } + TextDocument.create = create; + /** + * Checks whether the given literal conforms to the {@link ITextDocument} interface. + */ + function is(value) { + var candidate = value; + return Is.defined(candidate) && Is.string(candidate.uri) && (Is.undefined(candidate.languageId) || Is.string(candidate.languageId)) && Is.uinteger(candidate.lineCount) && Is.func(candidate.getText) && Is.func(candidate.positionAt) && Is.func(candidate.offsetAt) ? true : false; } - return -1; -}; - -// Build rules lookup cache -// -Ruler.prototype.__compile__ = function () { - const self = this; - const chains = ['']; - - // collect unique names - self.__rules__.forEach(function (rule) { - if (!rule.enabled) { - return; - } - rule.alt.forEach(function (altName) { - if (chains.indexOf(altName) < 0) { - chains.push(altName); + TextDocument.is = is; + function applyEdits(document, edits) { + var text = document.getText(); + var sortedEdits = mergeSort(edits, function (a, b) { + var diff = a.range.start.line - b.range.start.line; + if (diff === 0) { + return a.range.start.character - b.range.start.character; } + return diff; }); - }); - self.__cache__ = {}; - chains.forEach(function (chain) { - self.__cache__[chain] = []; - self.__rules__.forEach(function (rule) { - if (!rule.enabled) { - return; - } - if (chain && rule.alt.indexOf(chain) < 0) { - return; + var lastModifiedOffset = text.length; + for (var i = sortedEdits.length - 1; i >= 0; i--) { + var e = sortedEdits[i]; + var startOffset = document.offsetAt(e.range.start); + var endOffset = document.offsetAt(e.range.end); + if (endOffset <= lastModifiedOffset) { + text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length); + } else { + throw new Error('Overlapping edit'); } - self.__cache__[chain].push(rule.fn); - }); - }); -}; - -/** - * Ruler.at(name, fn [, options]) - * - name (String): rule name to replace. - * - fn (Function): new rule function. - * - options (Object): new rule options (not mandatory). - * - * Replace rule by name with new function & options. Throws error if name not - * found. - * - * ##### Options: - * - * - __alt__ - array with names of "alternate" chains. - * - * ##### Example - * - * Replace existing typographer replacement rule with new one: - * - * ```javascript - * var md = require('markdown-it')(); - * - * md.core.ruler.at('replacements', function replace(state) { - * //... - * }); - * ``` - **/ -Ruler.prototype.at = function (name, fn, options) { - const index = this.__find__(name); - const opt = options || {}; - if (index === -1) { - throw new Error('Parser rule not found: ' + name); + lastModifiedOffset = startOffset; + } + return text; } - this.__rules__[index].fn = fn; - this.__rules__[index].alt = opt.alt || []; - this.__cache__ = null; -}; - -/** - * Ruler.before(beforeName, ruleName, fn [, options]) - * - beforeName (String): new rule will be added before this one. - * - ruleName (String): name of added rule. - * - fn (Function): rule function. - * - options (Object): rule options (not mandatory). - * - * Add new rule to chain before one with given name. See also - * [[Ruler.after]], [[Ruler.push]]. - * - * ##### Options: - * - * - __alt__ - array with names of "alternate" chains. - * - * ##### Example - * - * ```javascript - * var md = require('markdown-it')(); - * - * md.block.ruler.before('paragraph', 'my_rule', function replace(state) { - * //... - * }); - * ``` - **/ -Ruler.prototype.before = function (beforeName, ruleName, fn, options) { - const index = this.__find__(beforeName); - const opt = options || {}; - if (index === -1) { - throw new Error('Parser rule not found: ' + beforeName); + TextDocument.applyEdits = applyEdits; + function mergeSort(data, compare) { + if (data.length <= 1) { + // sorted + return data; + } + var p = data.length / 2 | 0; + var left = data.slice(0, p); + var right = data.slice(p); + mergeSort(left, compare); + mergeSort(right, compare); + var leftIdx = 0; + var rightIdx = 0; + var i = 0; + while (leftIdx < left.length && rightIdx < right.length) { + var ret = compare(left[leftIdx], right[rightIdx]); + if (ret <= 0) { + // smaller_equal -> take left to preserve order + data[i++] = left[leftIdx++]; + } else { + // greater -> take right + data[i++] = right[rightIdx++]; + } + } + while (leftIdx < left.length) { + data[i++] = left[leftIdx++]; + } + while (rightIdx < right.length) { + data[i++] = right[rightIdx++]; + } + return data; } - this.__rules__.splice(index, 0, { - name: ruleName, - enabled: true, - fn, - alt: opt.alt || [] - }); - this.__cache__ = null; -}; - +})(TextDocument || (exports.TextDocument = TextDocument = {})); /** - * Ruler.after(afterName, ruleName, fn [, options]) - * - afterName (String): new rule will be added after this one. - * - ruleName (String): name of added rule. - * - fn (Function): rule function. - * - options (Object): rule options (not mandatory). - * - * Add new rule to chain after one with given name. See also - * [[Ruler.before]], [[Ruler.push]]. - * - * ##### Options: - * - * - __alt__ - array with names of "alternate" chains. - * - * ##### Example - * - * ```javascript - * var md = require('markdown-it')(); - * - * md.inline.ruler.after('text', 'my_rule', function replace(state) { - * //... - * }); - * ``` - **/ -Ruler.prototype.after = function (afterName, ruleName, fn, options) { - const index = this.__find__(afterName); - const opt = options || {}; - if (index === -1) { - throw new Error('Parser rule not found: ' + afterName); + * @deprecated Use the text document from the new vscode-languageserver-textdocument package. + */ +var FullTextDocument = /** @class */function () { + function FullTextDocument(uri, languageId, version, content) { + this._uri = uri; + this._languageId = languageId; + this._version = version; + this._content = content; + this._lineOffsets = undefined; } - this.__rules__.splice(index + 1, 0, { - name: ruleName, - enabled: true, - fn, - alt: opt.alt || [] + Object.defineProperty(FullTextDocument.prototype, "uri", { + get: function () { + return this._uri; + }, + enumerable: false, + configurable: true }); - this.__cache__ = null; -}; - -/** - * Ruler.push(ruleName, fn [, options]) - * - ruleName (String): name of added rule. - * - fn (Function): rule function. - * - options (Object): rule options (not mandatory). - * - * Push new rule to the end of chain. See also - * [[Ruler.before]], [[Ruler.after]]. - * - * ##### Options: - * - * - __alt__ - array with names of "alternate" chains. - * - * ##### Example - * - * ```javascript - * var md = require('markdown-it')(); - * - * md.core.ruler.push('my_rule', function replace(state) { - * //... - * }); - * ``` - **/ -Ruler.prototype.push = function (ruleName, fn, options) { - const opt = options || {}; - this.__rules__.push({ - name: ruleName, - enabled: true, - fn, - alt: opt.alt || [] + Object.defineProperty(FullTextDocument.prototype, "languageId", { + get: function () { + return this._languageId; + }, + enumerable: false, + configurable: true }); - this.__cache__ = null; -}; - -/** - * Ruler.enable(list [, ignoreInvalid]) -> Array - * - list (String|Array): list of rule names to enable. - * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found. - * - * Enable rules with given names. If any rule name not found - throw Error. - * Errors can be disabled by second param. - * - * Returns list of found rule names (if no exception happened). - * - * See also [[Ruler.disable]], [[Ruler.enableOnly]]. - **/ -Ruler.prototype.enable = function (list, ignoreInvalid) { - if (!Array.isArray(list)) { - list = [list]; - } - const result = []; - - // Search by name and enable - list.forEach(function (name) { - const idx = this.__find__(name); - if (idx < 0) { - if (ignoreInvalid) { - return; + Object.defineProperty(FullTextDocument.prototype, "version", { + get: function () { + return this._version; + }, + enumerable: false, + configurable: true + }); + FullTextDocument.prototype.getText = function (range) { + if (range) { + var start = this.offsetAt(range.start); + var end = this.offsetAt(range.end); + return this._content.substring(start, end); + } + return this._content; + }; + FullTextDocument.prototype.update = function (event, version) { + this._content = event.text; + this._version = version; + this._lineOffsets = undefined; + }; + FullTextDocument.prototype.getLineOffsets = function () { + if (this._lineOffsets === undefined) { + var lineOffsets = []; + var text = this._content; + var isLineStart = true; + for (var i = 0; i < text.length; i++) { + if (isLineStart) { + lineOffsets.push(i); + isLineStart = false; + } + var ch = text.charAt(i); + isLineStart = ch === '\r' || ch === '\n'; + if (ch === '\r' && i + 1 < text.length && text.charAt(i + 1) === '\n') { + i++; + } } - throw new Error('Rules manager: invalid rule name ' + name); + if (isLineStart && text.length > 0) { + lineOffsets.push(text.length); + } + this._lineOffsets = lineOffsets; } - this.__rules__[idx].enabled = true; - result.push(name); - }, this); - this.__cache__ = null; - return result; -}; - -/** - * Ruler.enableOnly(list [, ignoreInvalid]) - * - list (String|Array): list of rule names to enable (whitelist). - * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found. - * - * Enable rules with given names, and disable everything else. If any rule name - * not found - throw Error. Errors can be disabled by second param. - * - * See also [[Ruler.disable]], [[Ruler.enable]]. - **/ -Ruler.prototype.enableOnly = function (list, ignoreInvalid) { - if (!Array.isArray(list)) { - list = [list]; - } - this.__rules__.forEach(function (rule) { - rule.enabled = false; + return this._lineOffsets; + }; + FullTextDocument.prototype.positionAt = function (offset) { + offset = Math.max(Math.min(offset, this._content.length), 0); + var lineOffsets = this.getLineOffsets(); + var low = 0, + high = lineOffsets.length; + if (high === 0) { + return Position.create(0, offset); + } + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (lineOffsets[mid] > offset) { + high = mid; + } else { + low = mid + 1; + } + } + // low is the least x for which the line offset is larger than the current offset + // or array.length if no line offset is larger than the current offset + var line = low - 1; + return Position.create(line, offset - lineOffsets[line]); + }; + FullTextDocument.prototype.offsetAt = function (position) { + var lineOffsets = this.getLineOffsets(); + if (position.line >= lineOffsets.length) { + return this._content.length; + } else if (position.line < 0) { + return 0; + } + var lineOffset = lineOffsets[position.line]; + var nextLineOffset = position.line + 1 < lineOffsets.length ? lineOffsets[position.line + 1] : this._content.length; + return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset); + }; + Object.defineProperty(FullTextDocument.prototype, "lineCount", { + get: function () { + return this.getLineOffsets().length; + }, + enumerable: false, + configurable: true }); - this.enable(list, ignoreInvalid); -}; - -/** - * Ruler.disable(list [, ignoreInvalid]) -> Array - * - list (String|Array): list of rule names to disable. - * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found. - * - * Disable rules with given names. If any rule name not found - throw Error. - * Errors can be disabled by second param. - * - * Returns list of found rule names (if no exception happened). - * - * See also [[Ruler.enable]], [[Ruler.enableOnly]]. - **/ -Ruler.prototype.disable = function (list, ignoreInvalid) { - if (!Array.isArray(list)) { - list = [list]; + return FullTextDocument; +}(); +var Is; +(function (Is) { + var toString = Object.prototype.toString; + function defined(value) { + return typeof value !== 'undefined'; } - const result = []; + Is.defined = defined; + function undefined(value) { + return typeof value === 'undefined'; + } + Is.undefined = undefined; + function boolean(value) { + return value === true || value === false; + } + Is.boolean = boolean; + function string(value) { + return toString.call(value) === '[object String]'; + } + Is.string = string; + function number(value) { + return toString.call(value) === '[object Number]'; + } + Is.number = number; + function numberRange(value, min, max) { + return toString.call(value) === '[object Number]' && min <= value && value <= max; + } + Is.numberRange = numberRange; + function integer(value) { + return toString.call(value) === '[object Number]' && -2147483648 <= value && value <= 2147483647; + } + Is.integer = integer; + function uinteger(value) { + return toString.call(value) === '[object Number]' && 0 <= value && value <= 2147483647; + } + Is.uinteger = uinteger; + function func(value) { + return toString.call(value) === '[object Function]'; + } + Is.func = func; + function objectLiteral(value) { + // Strictly speaking class instances pass this check as well. Since the LSP + // doesn't use classes we ignore this for now. If we do we need to add something + // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null` + return value !== null && typeof value === 'object'; + } + Is.objectLiteral = objectLiteral; + function typedArray(value, check) { + return Array.isArray(value) && value.every(check); + } + Is.typedArray = typedArray; +})(Is || (Is = {})); - // Search by name and disable - list.forEach(function (name) { - const idx = this.__find__(name); - if (idx < 0) { - if (ignoreInvalid) { - return; - } - throw new Error('Rules manager: invalid rule name ' + name); - } - this.__rules__[idx].enabled = false; - result.push(name); - }, this); - this.__cache__ = null; - return result; -}; +/***/ }), -/** - * Ruler.getRules(chainName) -> Array - * - * Return array of active functions (rules) for given chain name. It analyzes - * rules configuration, compiles caches if not exists and returns result. - * - * Default chain name is `''` (empty string). It can't be skipped. That's - * done intentionally, to keep signature monomorphic for high speed. - **/ -Ruler.prototype.getRules = function (chainName) { - if (this.__cache__ === null) { - this.__compile__(); +/***/ "../../graphiql-react/dist/SchemaReference.cjs.js": +/*!********************************************************!*\ + !*** ../../graphiql-react/dist/SchemaReference.cjs.js ***! + \********************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +const graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +const forEachState = __webpack_require__(/*! ./forEachState.cjs.js */ "../../graphiql-react/dist/forEachState.cjs.js"); +function getTypeInfo(schema, tokenState) { + const info = { + schema, + type: null, + parentType: null, + inputType: null, + directiveDef: null, + fieldDef: null, + argDef: null, + argDefs: null, + objectFieldDefs: null + }; + forEachState.forEachState(tokenState, state => { + var _a, _b; + switch (state.kind) { + case "Query": + case "ShortQuery": + info.type = schema.getQueryType(); + break; + case "Mutation": + info.type = schema.getMutationType(); + break; + case "Subscription": + info.type = schema.getSubscriptionType(); + break; + case "InlineFragment": + case "FragmentDefinition": + if (state.type) { + info.type = schema.getType(state.type); + } + break; + case "Field": + case "AliasedField": + info.fieldDef = info.type && state.name ? getFieldDef(schema, info.parentType, state.name) : null; + info.type = (_a = info.fieldDef) === null || _a === void 0 ? void 0 : _a.type; + break; + case "SelectionSet": + info.parentType = info.type ? graphql.getNamedType(info.type) : null; + break; + case "Directive": + info.directiveDef = state.name ? schema.getDirective(state.name) : null; + break; + case "Arguments": + const parentDef = state.prevState ? state.prevState.kind === "Field" ? info.fieldDef : state.prevState.kind === "Directive" ? info.directiveDef : state.prevState.kind === "AliasedField" ? state.prevState.name && getFieldDef(schema, info.parentType, state.prevState.name) : null : null; + info.argDefs = parentDef ? parentDef.args : null; + break; + case "Argument": + info.argDef = null; + if (info.argDefs) { + for (let i = 0; i < info.argDefs.length; i++) { + if (info.argDefs[i].name === state.name) { + info.argDef = info.argDefs[i]; + break; + } + } + } + info.inputType = (_b = info.argDef) === null || _b === void 0 ? void 0 : _b.type; + break; + case "EnumValue": + const enumType = info.inputType ? graphql.getNamedType(info.inputType) : null; + info.enumValue = enumType instanceof graphql.GraphQLEnumType ? find(enumType.getValues(), val => val.value === state.name) : null; + break; + case "ListValue": + const nullableType = info.inputType ? graphql.getNullableType(info.inputType) : null; + info.inputType = nullableType instanceof graphql.GraphQLList ? nullableType.ofType : null; + break; + case "ObjectValue": + const objectType = info.inputType ? graphql.getNamedType(info.inputType) : null; + info.objectFieldDefs = objectType instanceof graphql.GraphQLInputObjectType ? objectType.getFields() : null; + break; + case "ObjectField": + const objectField = state.name && info.objectFieldDefs ? info.objectFieldDefs[state.name] : null; + info.inputType = objectField === null || objectField === void 0 ? void 0 : objectField.type; + info.fieldDef = objectField; + break; + case "NamedType": + info.type = state.name ? schema.getType(state.name) : null; + break; + } + }); + return info; +} +function getFieldDef(schema, type, fieldName) { + if (fieldName === graphql.SchemaMetaFieldDef.name && schema.getQueryType() === type) { + return graphql.SchemaMetaFieldDef; + } + if (fieldName === graphql.TypeMetaFieldDef.name && schema.getQueryType() === type) { + return graphql.TypeMetaFieldDef; + } + if (fieldName === graphql.TypeNameMetaFieldDef.name && graphql.isCompositeType(type)) { + return graphql.TypeNameMetaFieldDef; + } + if (type && type.getFields) { + return type.getFields()[fieldName]; } +} +function find(array, predicate) { + for (let i = 0; i < array.length; i++) { + if (predicate(array[i])) { + return array[i]; + } + } +} +function getFieldReference(typeInfo) { + return { + kind: "Field", + schema: typeInfo.schema, + field: typeInfo.fieldDef, + type: isMetaField(typeInfo.fieldDef) ? null : typeInfo.parentType + }; +} +function getDirectiveReference(typeInfo) { + return { + kind: "Directive", + schema: typeInfo.schema, + directive: typeInfo.directiveDef + }; +} +function getArgumentReference(typeInfo) { + return typeInfo.directiveDef ? { + kind: "Argument", + schema: typeInfo.schema, + argument: typeInfo.argDef, + directive: typeInfo.directiveDef + } : { + kind: "Argument", + schema: typeInfo.schema, + argument: typeInfo.argDef, + field: typeInfo.fieldDef, + type: isMetaField(typeInfo.fieldDef) ? null : typeInfo.parentType + }; +} +function getEnumValueReference(typeInfo) { + return { + kind: "EnumValue", + value: typeInfo.enumValue || void 0, + type: typeInfo.inputType ? graphql.getNamedType(typeInfo.inputType) : void 0 + }; +} +function getTypeReference(typeInfo, type) { + return { + kind: "Type", + schema: typeInfo.schema, + type: type || typeInfo.type + }; +} +function isMetaField(fieldDef) { + return fieldDef.name.slice(0, 2) === "__"; +} +exports.getArgumentReference = getArgumentReference; +exports.getDirectiveReference = getDirectiveReference; +exports.getEnumValueReference = getEnumValueReference; +exports.getFieldReference = getFieldReference; +exports.getTypeInfo = getTypeInfo; +exports.getTypeReference = getTypeReference; - // Chain can be empty, if rules disabled. But we still have to return Array. - return this.__cache__[chainName] || []; -}; +/***/ }), -// Token class +/***/ "../../graphiql-react/dist/brace-fold.cjs.js": +/*!***************************************************!*\ + !*** ../../graphiql-react/dist/brace-fold.cjs.js ***! + \***************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -/** - * class Token - **/ -/** - * new Token(type, tag, nesting) - * - * Create new token and fill passed properties. - **/ -function Token(type, tag, nesting) { - /** - * Token#type -> String - * - * Type of the token (string, e.g. "paragraph_open") - **/ - this.type = type; - /** - * Token#tag -> String - * - * html tag name, e.g. "p" - **/ - this.tag = tag; - - /** - * Token#attrs -> Array - * - * Html attributes. Format: `[ [ name1, value1 ], [ name2, value2 ] ]` - **/ - this.attrs = null; - - /** - * Token#map -> Array - * - * Source map info. Format: `[ line_begin, line_end ]` - **/ - this.map = null; - - /** - * Token#nesting -> Number - * - * Level change (number in {-1, 0, 1} set), where: - * - * - `1` means the tag is opening - * - `0` means the tag is self-closing - * - `-1` means the tag is closing - **/ - this.nesting = nesting; - - /** - * Token#level -> Number - * - * nesting level, the same as `state.level` - **/ - this.level = 0; - - /** - * Token#children -> Array - * - * An array of child nodes (inline and img tokens) - **/ - this.children = null; - - /** - * Token#content -> String - * - * In a case of self-closing tag (code, html, fence, etc.), - * it has contents of this tag. - **/ - this.content = ''; - - /** - * Token#markup -> String - * - * '*' or '_' for emphasis, fence string for fence, etc. - **/ - this.markup = ''; - - /** - * Token#info -> String - * - * Additional information: - * - * - Info string for "fence" tokens - * - The value "auto" for autolink "link_open" and "link_close" tokens - * - The string value of the item marker for ordered-list "list_item_open" tokens - **/ - this.info = ''; - - /** - * Token#meta -> Object - * - * A place for plugins to store an arbitrary data - **/ - this.meta = null; - - /** - * Token#block -> Boolean - * - * True for block-level tokens, false for inline tokens. - * Used in renderer to calculate line breaks - **/ - this.block = false; - - /** - * Token#hidden -> Boolean - * - * If it's true, ignore this element when rendering. Used for tight lists - * to hide paragraphs. - **/ - this.hidden = false; -} - -/** - * Token.attrIndex(name) -> Number - * - * Search attribute index by name. - **/ -Token.prototype.attrIndex = function attrIndex(name) { - if (!this.attrs) { - return -1; - } - const attrs = this.attrs; - for (let i = 0, len = attrs.length; i < len; i++) { - if (attrs[i][0] === name) { - return i; +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } } } - return -1; -}; - -/** - * Token.attrPush(attrData) - * - * Add `[ name, value ]` attribute to list. Init attrs if necessary - **/ -Token.prototype.attrPush = function attrPush(attrData) { - if (this.attrs) { - this.attrs.push(attrData); - } else { - this.attrs = [attrData]; - } + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); +} +var braceFold$2 = { + exports: {} }; +(function (module2, exports2) { + (function (mod) { + mod(codemirror.requireCodemirror()); + })(function (CodeMirror) { + function bracketFolding(pairs) { + return function (cm, start) { + var line = start.line, + lineText = cm.getLine(line); + function findOpening(pair) { + var tokenType; + for (var at = start.ch, pass = 0;;) { + var found2 = at <= 0 ? -1 : lineText.lastIndexOf(pair[0], at - 1); + if (found2 == -1) { + if (pass == 1) break; + pass = 1; + at = lineText.length; + continue; + } + if (pass == 1 && found2 < start.ch) break; + tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found2 + 1)); + if (!/^(comment|string)/.test(tokenType)) return { + ch: found2 + 1, + tokenType, + pair + }; + at = found2 - 1; + } + } + function findRange(found2) { + var count = 1, + lastLine = cm.lastLine(), + end, + startCh = found2.ch, + endCh; + outer: for (var i2 = line; i2 <= lastLine; ++i2) { + var text = cm.getLine(i2), + pos = i2 == line ? startCh : 0; + for (;;) { + var nextOpen = text.indexOf(found2.pair[0], pos), + nextClose = text.indexOf(found2.pair[1], pos); + if (nextOpen < 0) nextOpen = text.length; + if (nextClose < 0) nextClose = text.length; + pos = Math.min(nextOpen, nextClose); + if (pos == text.length) break; + if (cm.getTokenTypeAt(CodeMirror.Pos(i2, pos + 1)) == found2.tokenType) { + if (pos == nextOpen) ++count;else if (! --count) { + end = i2; + endCh = pos; + break outer; + } + } + ++pos; + } + } + if (end == null || line == end) return null; + return { + from: CodeMirror.Pos(line, startCh), + to: CodeMirror.Pos(end, endCh) + }; + } + var found = []; + for (var i = 0; i < pairs.length; i++) { + var open = findOpening(pairs[i]); + if (open) found.push(open); + } + found.sort(function (a, b) { + return a.ch - b.ch; + }); + for (var i = 0; i < found.length; i++) { + var range = findRange(found[i]); + if (range) return range; + } + return null; + }; + } + CodeMirror.registerHelper("fold", "brace", bracketFolding([["{", "}"], ["[", "]"]])); + CodeMirror.registerHelper("fold", "brace-paren", bracketFolding([["{", "}"], ["[", "]"], ["(", ")"]])); + CodeMirror.registerHelper("fold", "import", function (cm, start) { + function hasImport(line) { + if (line < cm.firstLine() || line > cm.lastLine()) return null; + var start2 = cm.getTokenAt(CodeMirror.Pos(line, 1)); + if (!/\S/.test(start2.string)) start2 = cm.getTokenAt(CodeMirror.Pos(line, start2.end + 1)); + if (start2.type != "keyword" || start2.string != "import") return null; + for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) { + var text = cm.getLine(i), + semi = text.indexOf(";"); + if (semi != -1) return { + startCh: start2.end, + end: CodeMirror.Pos(i, semi) + }; + } + } + var startLine = start.line, + has = hasImport(startLine), + prev; + if (!has || hasImport(startLine - 1) || (prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1) return null; + for (var end = has.end;;) { + var next = hasImport(end.line + 1); + if (next == null) break; + end = next.end; + } + return { + from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), + to: end + }; + }); + CodeMirror.registerHelper("fold", "include", function (cm, start) { + function hasInclude(line) { + if (line < cm.firstLine() || line > cm.lastLine()) return null; + var start2 = cm.getTokenAt(CodeMirror.Pos(line, 1)); + if (!/\S/.test(start2.string)) start2 = cm.getTokenAt(CodeMirror.Pos(line, start2.end + 1)); + if (start2.type == "meta" && start2.string.slice(0, 8) == "#include") return start2.start + 8; + } + var startLine = start.line, + has = hasInclude(startLine); + if (has == null || hasInclude(startLine - 1) != null) return null; + for (var end = startLine;;) { + var next = hasInclude(end + 1); + if (next == null) break; + ++end; + } + return { + from: CodeMirror.Pos(startLine, has + 1), + to: cm.clipPos(CodeMirror.Pos(end)) + }; + }); + }); +})(); +var braceFoldExports = braceFold$2.exports; +const braceFold = /* @__PURE__ */codemirror.getDefaultExportFromCjs(braceFoldExports); +const braceFold$1 = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: braceFold +}, [braceFoldExports]); +exports.braceFold = braceFold$1; -/** - * Token.attrSet(name, value) - * - * Set `name` attribute to `value`. Override old value if exists. - **/ -Token.prototype.attrSet = function attrSet(name, value) { - const idx = this.attrIndex(name); - const attrData = [name, value]; - if (idx < 0) { - this.attrPush(attrData); - } else { - this.attrs[idx] = attrData; - } -}; +/***/ }), -/** - * Token.attrGet(name) - * - * Get the value of attribute `name`, or null if it does not exist. - **/ -Token.prototype.attrGet = function attrGet(name) { - const idx = this.attrIndex(name); - let value = null; - if (idx >= 0) { - value = this.attrs[idx][1]; - } - return value; -}; +/***/ "../../graphiql-react/dist/closebrackets.cjs.js": +/*!******************************************************!*\ + !*** ../../graphiql-react/dist/closebrackets.cjs.js ***! + \******************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -/** - * Token.attrJoin(name, value) - * - * Join value to existing attribute via space. Or create new attribute if not - * exists. Useful to operate with token classes. - **/ -Token.prototype.attrJoin = function attrJoin(name, value) { - const idx = this.attrIndex(name); - if (idx < 0) { - this.attrPush([name, value]); - } else { - this.attrs[idx][1] = this.attrs[idx][1] + ' ' + value; - } -}; -// Core state object -// -function StateCore(src, md, env) { - this.src = src; - this.env = env; - this.tokens = []; - this.inlineMode = false; - this.md = md; // link to parser instance +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } + } + } + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); } +var closebrackets$2 = { + exports: {} +}; +(function (module2, exports2) { + (function (mod) { + mod(codemirror.requireCodemirror()); + })(function (CodeMirror) { + var defaults = { + pairs: `()[]{}''""`, + closeBefore: `)]}'":;>`, + triples: "", + explode: "[]{}" + }; + var Pos = CodeMirror.Pos; + CodeMirror.defineOption("autoCloseBrackets", false, function (cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.removeKeyMap(keyMap); + cm.state.closeBrackets = null; + } + if (val) { + ensureBound(getOption(val, "pairs")); + cm.state.closeBrackets = val; + cm.addKeyMap(keyMap); + } + }); + function getOption(conf, name) { + if (name == "pairs" && typeof conf == "string") return conf; + if (typeof conf == "object" && conf[name] != null) return conf[name]; + return defaults[name]; + } + var keyMap = { + Backspace: handleBackspace, + Enter: handleEnter + }; + function ensureBound(chars) { + for (var i = 0; i < chars.length; i++) { + var ch = chars.charAt(i), + key = "'" + ch + "'"; + if (!keyMap[key]) keyMap[key] = handler(ch); + } + } + ensureBound(defaults.pairs + "`"); + function handler(ch) { + return function (cm) { + return handleChar(cm, ch); + }; + } + function getConfig(cm) { + var deflt = cm.state.closeBrackets; + if (!deflt || deflt.override) return deflt; + var mode = cm.getModeAt(cm.getCursor()); + return mode.closeBrackets || deflt; + } + function handleBackspace(cm) { + var conf = getConfig(cm); + if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; + var pairs = getOption(conf, "pairs"); + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var around = charsAround(cm, ranges[i].head); + if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; + } + for (var i = ranges.length - 1; i >= 0; i--) { + var cur = ranges[i].head; + cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), "+delete"); + } + } + function handleEnter(cm) { + var conf = getConfig(cm); + var explode = conf && getOption(conf, "explode"); + if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass; + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var around = charsAround(cm, ranges[i].head); + if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass; + } + cm.operation(function () { + var linesep = cm.lineSeparator() || "\n"; + cm.replaceSelection(linesep + linesep, null); + moveSel(cm, -1); + ranges = cm.listSelections(); + for (var i2 = 0; i2 < ranges.length; i2++) { + var line = ranges[i2].head.line; + cm.indentLine(line, null, true); + cm.indentLine(line + 1, null, true); + } + }); + } + function moveSel(cm, dir) { + var newRanges = [], + ranges = cm.listSelections(), + primary = 0; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (range.head == cm.getCursor()) primary = i; + var pos = range.head.ch || dir > 0 ? { + line: range.head.line, + ch: range.head.ch + dir + } : { + line: range.head.line - 1 + }; + newRanges.push({ + anchor: pos, + head: pos + }); + } + cm.setSelections(newRanges, primary); + } + function contractSelection(sel) { + var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0; + return { + anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)), + head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1)) + }; + } + function handleChar(cm, ch) { + var conf = getConfig(cm); + if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; + var pairs = getOption(conf, "pairs"); + var pos = pairs.indexOf(ch); + if (pos == -1) return CodeMirror.Pass; + var closeBefore = getOption(conf, "closeBefore"); + var triples = getOption(conf, "triples"); + var identical = pairs.charAt(pos + 1) == ch; + var ranges = cm.listSelections(); + var opening = pos % 2 == 0; + var type; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i], + cur = range.head, + curType; + var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1)); + if (opening && !range.empty()) { + curType = "surround"; + } else if ((identical || !opening) && next == ch) { + if (identical && stringStartsAfter(cm, cur)) curType = "both";else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch) curType = "skipThree";else curType = "skip"; + } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 && cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch) { + if (cur.ch > 2 && /\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))) return CodeMirror.Pass; + curType = "addFour"; + } else if (identical) { + var prev = cur.ch == 0 ? " " : cm.getRange(Pos(cur.line, cur.ch - 1), cur); + if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = "both";else return CodeMirror.Pass; + } else if (opening && (next.length === 0 || /\s/.test(next) || closeBefore.indexOf(next) > -1)) { + curType = "both"; + } else { + return CodeMirror.Pass; + } + if (!type) type = curType;else if (type != curType) return CodeMirror.Pass; + } + var left = pos % 2 ? pairs.charAt(pos - 1) : ch; + var right = pos % 2 ? ch : pairs.charAt(pos + 1); + cm.operation(function () { + if (type == "skip") { + moveSel(cm, 1); + } else if (type == "skipThree") { + moveSel(cm, 3); + } else if (type == "surround") { + var sels = cm.getSelections(); + for (var i2 = 0; i2 < sels.length; i2++) sels[i2] = left + sels[i2] + right; + cm.replaceSelections(sels, "around"); + sels = cm.listSelections().slice(); + for (var i2 = 0; i2 < sels.length; i2++) sels[i2] = contractSelection(sels[i2]); + cm.setSelections(sels); + } else if (type == "both") { + cm.replaceSelection(left + right, null); + cm.triggerElectric(left + right); + moveSel(cm, -1); + } else if (type == "addFour") { + cm.replaceSelection(left + left + left + left, "before"); + moveSel(cm, 1); + } + }); + } + function charsAround(cm, pos) { + var str = cm.getRange(Pos(pos.line, pos.ch - 1), Pos(pos.line, pos.ch + 1)); + return str.length == 2 ? str : null; + } + function stringStartsAfter(cm, pos) { + var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1)); + return /\bstring/.test(token.type) && token.start == pos.ch && (pos.ch == 0 || !/\bstring/.test(cm.getTokenTypeAt(pos))); + } + }); +})(); +var closebracketsExports = closebrackets$2.exports; +const closebrackets = /* @__PURE__ */codemirror.getDefaultExportFromCjs(closebracketsExports); +const closebrackets$1 = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: closebrackets +}, [closebracketsExports]); +exports.closebrackets = closebrackets$1; -// re-export Token class to use in core rules -StateCore.prototype.Token = Token; - -// Normalize input string +/***/ }), -// https://spec.commonmark.org/0.29/#line-ending -const NEWLINES_RE = /\r\n?|\n/g; -const NULL_RE = /\0/g; -function normalize(state) { - let str; +/***/ "../../graphiql-react/dist/codemirror.cjs.js": +/*!***************************************************!*\ + !*** ../../graphiql-react/dist/codemirror.cjs.js ***! + \***************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - // Normalize newlines - str = state.src.replace(NEWLINES_RE, '\n'); - // Replace NULL characters - str = str.replace(NULL_RE, '\uFFFD'); - state.src = str; -} -function block(state) { - let token; - if (state.inlineMode) { - token = new state.Token('inline', '', 0); - token.content = state.src; - token.map = [0, 1]; - token.children = []; - state.tokens.push(token); - } else { - state.md.block.parse(state.src, state.md, state.env, state.tokens); - } -} -function inline(state) { - const tokens = state.tokens; - // Parse inlines - for (let i = 0, l = tokens.length; i < l; i++) { - const tok = tokens[i]; - if (tok.type === 'inline') { - state.md.inline.parse(tok.content, state.md, state.env, tok.children); +const codemirror$1 = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } } } + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); } +var codemirrorExports = codemirror$1.requireCodemirror(); +const CodeMirror = /* @__PURE__ */codemirror$1.getDefaultExportFromCjs(codemirrorExports); +const codemirror = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: CodeMirror +}, [codemirrorExports]); +exports.CodeMirror = CodeMirror; +exports.codemirror = codemirror; -// Replace link-like texts with link nodes. -// -// Currently restricted by `md.validateLink()` to http/https/ftp -// +/***/ }), -function isLinkOpen$1(str) { - return /^\s]/i.test(str); -} -function isLinkClose$1(str) { - return /^<\/a\s*>/i.test(str); -} -function linkify$1(state) { - const blockTokens = state.tokens; - if (!state.md.options.linkify) { - return; - } - for (let j = 0, l = blockTokens.length; j < l; j++) { - if (blockTokens[j].type !== 'inline' || !state.md.linkify.pretest(blockTokens[j].content)) { - continue; - } - let tokens = blockTokens[j].children; - let htmlLinkLevel = 0; +/***/ "../../graphiql-react/dist/codemirror.cjs2.js": +/*!****************************************************!*\ + !*** ../../graphiql-react/dist/codemirror.cjs2.js ***! + \****************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - // We scan from the end, to keep position when new tags added. - // Use reversed logic in links start/end match - for (let i = tokens.length - 1; i >= 0; i--) { - const currentToken = tokens[i]; - // Skip content of markdown links - if (currentToken.type === 'link_close') { - i--; - while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') { - i--; + +var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof __webpack_require__.g !== "undefined" ? __webpack_require__.g : typeof self !== "undefined" ? self : {}; +function getDefaultExportFromCjs(x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; +} +var codemirror = { + exports: {} +}; +var hasRequiredCodemirror; +function requireCodemirror() { + if (hasRequiredCodemirror) return codemirror.exports; + hasRequiredCodemirror = 1; + (function (module2, exports2) { + (function (global2, factory) { + module2.exports = factory(); + })(commonjsGlobal, function () { + var userAgent = navigator.userAgent; + var platform = navigator.platform; + var gecko = /gecko\/\d/i.test(userAgent); + var ie_upto10 = /MSIE \d/.test(userAgent); + var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); + var edge = /Edge\/(\d+)/.exec(userAgent); + var ie = ie_upto10 || ie_11up || edge; + var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); + var webkit = !edge && /WebKit\//.test(userAgent); + var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); + var chrome = !edge && /Chrome\//.test(userAgent); + var presto = /Opera\//.test(userAgent); + var safari = /Apple Computer/.test(navigator.vendor); + var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); + var phantom = /PhantomJS/.test(userAgent); + var ios = safari && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2); + var android = /Android/.test(userAgent); + var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); + var mac = ios || /Mac/.test(platform); + var chromeOS = /\bCrOS\b/.test(userAgent); + var windows = /win/i.test(platform); + var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); + if (presto_version) { + presto_version = Number(presto_version[1]); + } + if (presto_version && presto_version >= 15) { + presto = false; + webkit = true; + } + var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); + var captureRightClick = gecko || ie && ie_version >= 9; + function classTest(cls) { + return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); + } + var rmClass = function (node, cls) { + var current = node.className; + var match = classTest(cls).exec(current); + if (match) { + var after = current.slice(match.index + match[0].length); + node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); } - continue; + }; + function removeChildren(e) { + for (var count = e.childNodes.length; count > 0; --count) { + e.removeChild(e.firstChild); + } + return e; + } + function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e); + } + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) { + e.className = className; + } + if (style) { + e.style.cssText = style; + } + if (typeof content == "string") { + e.appendChild(document.createTextNode(content)); + } else if (content) { + for (var i2 = 0; i2 < content.length; ++i2) { + e.appendChild(content[i2]); + } + } + return e; + } + function eltP(tag, content, className, style) { + var e = elt(tag, content, className, style); + e.setAttribute("role", "presentation"); + return e; + } + var range; + if (document.createRange) { + range = function (node, start, end, endNode) { + var r = document.createRange(); + r.setEnd(endNode || node, end); + r.setStart(node, start); + return r; + }; + } else { + range = function (node, start, end) { + var r = document.body.createTextRange(); + try { + r.moveToElementText(node.parentNode); + } catch (e) { + return r; + } + r.collapse(true); + r.moveEnd("character", end); + r.moveStart("character", start); + return r; + }; + } + function contains(parent, child) { + if (child.nodeType == 3) { + child = child.parentNode; + } + if (parent.contains) { + return parent.contains(child); + } + do { + if (child.nodeType == 11) { + child = child.host; + } + if (child == parent) { + return true; + } + } while (child = child.parentNode); + } + function activeElt() { + var activeElement; + try { + activeElement = document.activeElement; + } catch (e) { + activeElement = document.body || null; + } + while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) { + activeElement = activeElement.shadowRoot.activeElement; + } + return activeElement; + } + function addClass(node, cls) { + var current = node.className; + if (!classTest(cls).test(current)) { + node.className += (current ? " " : "") + cls; + } + } + function joinClasses(a, b) { + var as = a.split(" "); + for (var i2 = 0; i2 < as.length; i2++) { + if (as[i2] && !classTest(as[i2]).test(b)) { + b += " " + as[i2]; + } + } + return b; + } + var selectInput = function (node) { + node.select(); + }; + if (ios) { + selectInput = function (node) { + node.selectionStart = 0; + node.selectionEnd = node.value.length; + }; + } else if (ie) { + selectInput = function (node) { + try { + node.select(); + } catch (_e) {} + }; + } + function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function () { + return f.apply(null, args); + }; + } + function copyObj(obj, target, overwrite) { + if (!target) { + target = {}; + } + for (var prop2 in obj) { + if (obj.hasOwnProperty(prop2) && (overwrite !== false || !target.hasOwnProperty(prop2))) { + target[prop2] = obj[prop2]; + } + } + return target; + } + function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) { + end = string.length; + } + } + for (var i2 = startIndex || 0, n = startValue || 0;;) { + var nextTab = string.indexOf(" ", i2); + if (nextTab < 0 || nextTab >= end) { + return n + (end - i2); + } + n += nextTab - i2; + n += tabSize - n % tabSize; + i2 = nextTab + 1; + } + } + var Delayed = function () { + this.id = null; + this.f = null; + this.time = 0; + this.handler = bind(this.onTimeout, this); + }; + Delayed.prototype.onTimeout = function (self2) { + self2.id = 0; + if (self2.time <= + /* @__PURE__ */new Date()) { + self2.f(); + } else { + setTimeout(self2.handler, self2.time - + /* @__PURE__ */new Date()); + } + }; + Delayed.prototype.set = function (ms, f) { + this.f = f; + var time = + /* @__PURE__ */new Date() + ms; + if (!this.id || time < this.time) { + clearTimeout(this.id); + this.id = setTimeout(this.handler, ms); + this.time = time; + } + }; + function indexOf(array, elt2) { + for (var i2 = 0; i2 < array.length; ++i2) { + if (array[i2] == elt2) { + return i2; + } + } + return -1; + } + var scrollerGap = 50; + var Pass = { + toString: function () { + return "CodeMirror.Pass"; + } + }; + var sel_dontScroll = { + scroll: false + }, + sel_mouse = { + origin: "*mouse" + }, + sel_move = { + origin: "+move" + }; + function findColumn(string, goal, tabSize) { + for (var pos = 0, col = 0;;) { + var nextTab = string.indexOf(" ", pos); + if (nextTab == -1) { + nextTab = string.length; + } + var skipped = nextTab - pos; + if (nextTab == string.length || col + skipped >= goal) { + return pos + Math.min(skipped, goal - col); + } + col += nextTab - pos; + col += tabSize - col % tabSize; + pos = nextTab + 1; + if (col >= goal) { + return pos; + } + } + } + var spaceStrs = [""]; + function spaceStr(n) { + while (spaceStrs.length <= n) { + spaceStrs.push(lst(spaceStrs) + " "); + } + return spaceStrs[n]; + } + function lst(arr) { + return arr[arr.length - 1]; + } + function map(array, f) { + var out = []; + for (var i2 = 0; i2 < array.length; i2++) { + out[i2] = f(array[i2], i2); + } + return out; + } + function insertSorted(array, value, score) { + var pos = 0, + priority = score(value); + while (pos < array.length && score(array[pos]) <= priority) { + pos++; + } + array.splice(pos, 0, value); + } + function nothing() {} + function createObj(base, props) { + var inst; + if (Object.create) { + inst = Object.create(base); + } else { + nothing.prototype = base; + inst = new nothing(); + } + if (props) { + copyObj(props, inst); + } + return inst; + } + var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; + function isWordCharBasic(ch) { + return /\w/.test(ch) || ch > "€" && (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)); + } + function isWordChar(ch, helper) { + if (!helper) { + return isWordCharBasic(ch); + } + if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { + return true; + } + return helper.test(ch); + } + function isEmpty(obj) { + for (var n in obj) { + if (obj.hasOwnProperty(n) && obj[n]) { + return false; + } + } + return true; + } + var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; + function isExtendingChar(ch) { + return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); + } + function skipExtendingChars(str, pos, dir) { + while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { + pos += dir; + } + return pos; + } + function findFirst(pred, from, to) { + var dir = from > to ? -1 : 1; + for (;;) { + if (from == to) { + return from; + } + var midF = (from + to) / 2, + mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF); + if (mid == from) { + return pred(mid) ? from : to; + } + if (pred(mid)) { + to = mid; + } else { + from = mid + dir; + } + } + } + function iterateBidiSections(order, from, to, f) { + if (!order) { + return f(from, to, "ltr", 0); + } + var found = false; + for (var i2 = 0; i2 < order.length; ++i2) { + var part = order[i2]; + if (part.from < to && part.to > from || from == to && part.to == from) { + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i2); + found = true; + } + } + if (!found) { + f(from, to, "ltr"); + } + } + var bidiOther = null; + function getBidiPartAt(order, ch, sticky) { + var found; + bidiOther = null; + for (var i2 = 0; i2 < order.length; ++i2) { + var cur = order[i2]; + if (cur.from < ch && cur.to > ch) { + return i2; + } + if (cur.to == ch) { + if (cur.from != cur.to && sticky == "before") { + found = i2; + } else { + bidiOther = i2; + } + } + if (cur.from == ch) { + if (cur.from != cur.to && sticky != "before") { + found = i2; + } else { + bidiOther = i2; + } + } + } + return found != null ? found : bidiOther; + } + var bidiOrdering = /* @__PURE__ */function () { + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; + var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; + function charType(code) { + if (code <= 247) { + return lowTypes.charAt(code); + } else if (1424 <= code && code <= 1524) { + return "R"; + } else if (1536 <= code && code <= 1785) { + return arabicTypes.charAt(code - 1536); + } else if (1774 <= code && code <= 2220) { + return "r"; + } else if (8192 <= code && code <= 8203) { + return "w"; + } else if (code == 8204) { + return "b"; + } else { + return "L"; + } + } + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, + isStrong = /[LRr]/, + countsAsLeft = /[Lb1n]/, + countsAsNum = /[1n]/; + function BidiSpan(level, from, to) { + this.level = level; + this.from = from; + this.to = to; + } + return function (str, direction) { + var outerType = direction == "ltr" ? "L" : "R"; + if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { + return false; + } + var len = str.length, + types = []; + for (var i2 = 0; i2 < len; ++i2) { + types.push(charType(str.charCodeAt(i2))); + } + for (var i$12 = 0, prev = outerType; i$12 < len; ++i$12) { + var type = types[i$12]; + if (type == "m") { + types[i$12] = prev; + } else { + prev = type; + } + } + for (var i$22 = 0, cur = outerType; i$22 < len; ++i$22) { + var type$1 = types[i$22]; + if (type$1 == "1" && cur == "r") { + types[i$22] = "n"; + } else if (isStrong.test(type$1)) { + cur = type$1; + if (type$1 == "r") { + types[i$22] = "R"; + } + } + } + for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { + var type$2 = types[i$3]; + if (type$2 == "+" && prev$1 == "1" && types[i$3 + 1] == "1") { + types[i$3] = "1"; + } else if (type$2 == "," && prev$1 == types[i$3 + 1] && (prev$1 == "1" || prev$1 == "n")) { + types[i$3] = prev$1; + } + prev$1 = type$2; + } + for (var i$4 = 0; i$4 < len; ++i$4) { + var type$3 = types[i$4]; + if (type$3 == ",") { + types[i$4] = "N"; + } else if (type$3 == "%") { + var end = void 0; + for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} + var replace = i$4 && types[i$4 - 1] == "!" || end < len && types[end] == "1" ? "1" : "N"; + for (var j = i$4; j < end; ++j) { + types[j] = replace; + } + i$4 = end - 1; + } + } + for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { + var type$4 = types[i$5]; + if (cur$1 == "L" && type$4 == "1") { + types[i$5] = "L"; + } else if (isStrong.test(type$4)) { + cur$1 = type$4; + } + } + for (var i$6 = 0; i$6 < len; ++i$6) { + if (isNeutral.test(types[i$6])) { + var end$1 = void 0; + for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} + var before = (i$6 ? types[i$6 - 1] : outerType) == "L"; + var after = (end$1 < len ? types[end$1] : outerType) == "L"; + var replace$1 = before == after ? before ? "L" : "R" : outerType; + for (var j$1 = i$6; j$1 < end$1; ++j$1) { + types[j$1] = replace$1; + } + i$6 = end$1 - 1; + } + } + var order = [], + m; + for (var i$7 = 0; i$7 < len;) { + if (countsAsLeft.test(types[i$7])) { + var start = i$7; + for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} + order.push(new BidiSpan(0, start, i$7)); + } else { + var pos = i$7, + at = order.length, + isRTL = direction == "rtl" ? 1 : 0; + for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} + for (var j$2 = pos; j$2 < i$7;) { + if (countsAsNum.test(types[j$2])) { + if (pos < j$2) { + order.splice(at, 0, new BidiSpan(1, pos, j$2)); + at += isRTL; + } + var nstart = j$2; + for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} + order.splice(at, 0, new BidiSpan(2, nstart, j$2)); + at += isRTL; + pos = j$2; + } else { + ++j$2; + } + } + if (pos < i$7) { + order.splice(at, 0, new BidiSpan(1, pos, i$7)); + } + } + } + if (direction == "ltr") { + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift(new BidiSpan(0, 0, m[0].length)); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push(new BidiSpan(0, len - m[0].length, len)); + } + } + return direction == "rtl" ? order.reverse() : order; + }; + }(); + function getOrder(line, direction) { + var order = line.order; + if (order == null) { + order = line.order = bidiOrdering(line.text, direction); + } + return order; + } + var noHandlers = []; + var on = function (emitter, type, f) { + if (emitter.addEventListener) { + emitter.addEventListener(type, f, false); + } else if (emitter.attachEvent) { + emitter.attachEvent("on" + type, f); + } else { + var map2 = emitter._handlers || (emitter._handlers = {}); + map2[type] = (map2[type] || noHandlers).concat(f); + } + }; + function getHandlers(emitter, type) { + return emitter._handlers && emitter._handlers[type] || noHandlers; + } + function off(emitter, type, f) { + if (emitter.removeEventListener) { + emitter.removeEventListener(type, f, false); + } else if (emitter.detachEvent) { + emitter.detachEvent("on" + type, f); + } else { + var map2 = emitter._handlers, + arr = map2 && map2[type]; + if (arr) { + var index = indexOf(arr, f); + if (index > -1) { + map2[type] = arr.slice(0, index).concat(arr.slice(index + 1)); + } + } + } + } + function signal(emitter, type) { + var handlers = getHandlers(emitter, type); + if (!handlers.length) { + return; + } + var args = Array.prototype.slice.call(arguments, 2); + for (var i2 = 0; i2 < handlers.length; ++i2) { + handlers[i2].apply(null, args); + } + } + function signalDOMEvent(cm, e, override) { + if (typeof e == "string") { + e = { + type: e, + preventDefault: function () { + this.defaultPrevented = true; + } + }; + } + signal(cm, override || e.type, cm, e); + return e_defaultPrevented(e) || e.codemirrorIgnore; + } + function signalCursorActivity(cm) { + var arr = cm._handlers && cm._handlers.cursorActivity; + if (!arr) { + return; + } + var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); + for (var i2 = 0; i2 < arr.length; ++i2) { + if (indexOf(set, arr[i2]) == -1) { + set.push(arr[i2]); + } + } + } + function hasHandler(emitter, type) { + return getHandlers(emitter, type).length > 0; + } + function eventMixin(ctor) { + ctor.prototype.on = function (type, f) { + on(this, type, f); + }; + ctor.prototype.off = function (type, f) { + off(this, type, f); + }; + } + function e_preventDefault(e) { + if (e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + } + function e_stopPropagation(e) { + if (e.stopPropagation) { + e.stopPropagation(); + } else { + e.cancelBubble = true; + } + } + function e_defaultPrevented(e) { + return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false; + } + function e_stop(e) { + e_preventDefault(e); + e_stopPropagation(e); + } + function e_target(e) { + return e.target || e.srcElement; + } + function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) { + b = 1; + } else if (e.button & 2) { + b = 3; + } else if (e.button & 4) { + b = 2; + } + } + if (mac && e.ctrlKey && b == 1) { + b = 3; + } + return b; + } + var dragAndDrop = function () { + if (ie && ie_version < 9) { + return false; + } + var div = elt("div"); + return "draggable" in div || "dragDrop" in div; + }(); + var zwspSupported; + function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "​"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) { + zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); + } + } + var node = zwspSupported ? elt("span", "​") : elt("span", " ", null, "display: inline-block; width: 1px; margin-right: -1px"); + node.setAttribute("cm-text", ""); + return node; + } + var badBidiRects; + function hasBadBidiRects(measure) { + if (badBidiRects != null) { + return badBidiRects; + } + var txt = removeChildrenAndAdd(measure, document.createTextNode("AخA")); + var r0 = range(txt, 0, 1).getBoundingClientRect(); + var r1 = range(txt, 1, 2).getBoundingClientRect(); + removeChildren(measure); + if (!r0 || r0.left == r0.right) { + return false; + } + return badBidiRects = r1.right - r0.right < 3; + } + var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) { + var pos = 0, + result = [], + l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) { + nl = string.length; + } + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; + } else { + result.push(line); + pos = nl + 1; + } + } + return result; + } : function (string) { + return string.split(/\r\n?|\n/); + }; + var hasSelection = window.getSelection ? function (te) { + try { + return te.selectionStart != te.selectionEnd; + } catch (e) { + return false; + } + } : function (te) { + var range2; + try { + range2 = te.ownerDocument.selection.createRange(); + } catch (e) {} + if (!range2 || range2.parentElement() != te) { + return false; + } + return range2.compareEndPoints("StartToEnd", range2) != 0; + }; + var hasCopyEvent = function () { + var e = elt("div"); + if ("oncopy" in e) { + return true; + } + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == "function"; + }(); + var badZoomedRects = null; + function hasBadZoomedRects(measure) { + if (badZoomedRects != null) { + return badZoomedRects; + } + var node = removeChildrenAndAdd(measure, elt("span", "x")); + var normal = node.getBoundingClientRect(); + var fromRange = range(node, 0, 1).getBoundingClientRect(); + return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1; + } + var modes = {}, + mimeModes = {}; + function defineMode(name, mode) { + if (arguments.length > 2) { + mode.dependencies = Array.prototype.slice.call(arguments, 2); + } + modes[name] = mode; + } + function defineMIME(mime, spec) { + mimeModes[mime] = spec; + } + function resolveMode(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + var found = mimeModes[spec.name]; + if (typeof found == "string") { + found = { + name: found + }; + } + spec = createObj(found, spec); + spec.name = found.name; + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { + return resolveMode("application/xml"); + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { + return resolveMode("application/json"); + } + if (typeof spec == "string") { + return { + name: spec + }; + } else { + return spec || { + name: "null" + }; + } + } + function getMode(options, spec) { + spec = resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) { + return getMode(options, "text/plain"); + } + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop2 in exts) { + if (!exts.hasOwnProperty(prop2)) { + continue; + } + if (modeObj.hasOwnProperty(prop2)) { + modeObj["_" + prop2] = modeObj[prop2]; + } + modeObj[prop2] = exts[prop2]; + } + } + modeObj.name = spec.name; + if (spec.helperType) { + modeObj.helperType = spec.helperType; + } + if (spec.modeProps) { + for (var prop$1 in spec.modeProps) { + modeObj[prop$1] = spec.modeProps[prop$1]; + } + } + return modeObj; + } + var modeExtensions = {}; + function extendMode(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : modeExtensions[mode] = {}; + copyObj(properties, exts); + } + function copyState(mode, state) { + if (state === true) { + return state; + } + if (mode.copyState) { + return mode.copyState(state); + } + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) { + val = val.concat([]); + } + nstate[n] = val; + } + return nstate; + } + function innerMode(mode, state) { + var info; + while (mode.innerMode) { + info = mode.innerMode(state); + if (!info || info.mode == mode) { + break; + } + state = info.state; + mode = info.mode; + } + return info || { + mode, + state + }; + } + function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true; + } + var StringStream = function (string, tabSize, lineOracle) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + this.lineOracle = lineOracle; + }; + StringStream.prototype.eol = function () { + return this.pos >= this.string.length; + }; + StringStream.prototype.sol = function () { + return this.pos == this.lineStart; + }; + StringStream.prototype.peek = function () { + return this.string.charAt(this.pos) || void 0; + }; + StringStream.prototype.next = function () { + if (this.pos < this.string.length) { + return this.string.charAt(this.pos++); + } + }; + StringStream.prototype.eat = function (match) { + var ch = this.string.charAt(this.pos); + var ok; + if (typeof match == "string") { + ok = ch == match; + } else { + ok = ch && (match.test ? match.test(ch) : match(ch)); + } + if (ok) { + ++this.pos; + return ch; + } + }; + StringStream.prototype.eatWhile = function (match) { + var start = this.pos; + while (this.eat(match)) {} + return this.pos > start; + }; + StringStream.prototype.eatSpace = function () { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { + ++this.pos; + } + return this.pos > start; + }; + StringStream.prototype.skipToEnd = function () { + this.pos = this.string.length; + }; + StringStream.prototype.skipTo = function (ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) { + this.pos = found; + return true; + } + }; + StringStream.prototype.backUp = function (n) { + this.pos -= n; + }; + StringStream.prototype.column = function () { + if (this.lastColumnPos < this.start) { + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; + } + return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); + }; + StringStream.prototype.indentation = function () { + return countColumn(this.string, null, this.tabSize) - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); + }; + StringStream.prototype.match = function (pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function (str) { + return caseInsensitive ? str.toLowerCase() : str; + }; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) { + this.pos += pattern.length; + } + return true; + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) { + return null; + } + if (match && consume !== false) { + this.pos += match[0].length; + } + return match; + } + }; + StringStream.prototype.current = function () { + return this.string.slice(this.start, this.pos); + }; + StringStream.prototype.hideFirstChars = function (n, inner) { + this.lineStart += n; + try { + return inner(); + } finally { + this.lineStart -= n; + } + }; + StringStream.prototype.lookAhead = function (n) { + var oracle = this.lineOracle; + return oracle && oracle.lookAhead(n); + }; + StringStream.prototype.baseToken = function () { + var oracle = this.lineOracle; + return oracle && oracle.baseToken(this.pos); + }; + function getLine(doc, n) { + n -= doc.first; + if (n < 0 || n >= doc.size) { + throw new Error("There is no line " + (n + doc.first) + " in the document."); + } + var chunk = doc; + while (!chunk.lines) { + for (var i2 = 0;; ++i2) { + var child = chunk.children[i2], + sz = child.chunkSize(); + if (n < sz) { + chunk = child; + break; + } + n -= sz; + } + } + return chunk.lines[n]; + } + function getBetween(doc, start, end) { + var out = [], + n = start.line; + doc.iter(start.line, end.line + 1, function (line) { + var text = line.text; + if (n == end.line) { + text = text.slice(0, end.ch); + } + if (n == start.line) { + text = text.slice(start.ch); + } + out.push(text); + ++n; + }); + return out; + } + function getLines(doc, from, to) { + var out = []; + doc.iter(from, to, function (line) { + out.push(line.text); + }); + return out; + } + function updateLineHeight(line, height) { + var diff = height - line.height; + if (diff) { + for (var n = line; n; n = n.parent) { + n.height += diff; + } + } + } + function lineNo(line) { + if (line.parent == null) { + return null; + } + var cur = line.parent, + no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i2 = 0;; ++i2) { + if (chunk.children[i2] == cur) { + break; + } + no += chunk.children[i2].chunkSize(); + } + } + return no + cur.first; + } + function lineAtHeight(chunk, h) { + var n = chunk.first; + outer: do { + for (var i$12 = 0; i$12 < chunk.children.length; ++i$12) { + var child = chunk.children[i$12], + ch = child.height; + if (h < ch) { + chunk = child; + continue outer; + } + h -= ch; + n += child.chunkSize(); + } + return n; + } while (!chunk.lines); + var i2 = 0; + for (; i2 < chunk.lines.length; ++i2) { + var line = chunk.lines[i2], + lh = line.height; + if (h < lh) { + break; + } + h -= lh; + } + return n + i2; + } + function isLine(doc, l) { + return l >= doc.first && l < doc.first + doc.size; + } + function lineNumberFor(options, i2) { + return String(options.lineNumberFormatter(i2 + options.firstLineNumber)); + } + function Pos(line, ch, sticky) { + if (sticky === void 0) sticky = null; + if (!(this instanceof Pos)) { + return new Pos(line, ch, sticky); + } + this.line = line; + this.ch = ch; + this.sticky = sticky; + } + function cmp(a, b) { + return a.line - b.line || a.ch - b.ch; + } + function equalCursorPos(a, b) { + return a.sticky == b.sticky && cmp(a, b) == 0; + } + function copyPos(x) { + return Pos(x.line, x.ch); + } + function maxPos(a, b) { + return cmp(a, b) < 0 ? b : a; + } + function minPos(a, b) { + return cmp(a, b) < 0 ? a : b; + } + function clipLine(doc, n) { + return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1)); + } + function clipPos(doc, pos) { + if (pos.line < doc.first) { + return Pos(doc.first, 0); + } + var last = doc.first + doc.size - 1; + if (pos.line > last) { + return Pos(last, getLine(doc, last).text.length); + } + return clipToLen(pos, getLine(doc, pos.line).text.length); + } + function clipToLen(pos, linelen) { + var ch = pos.ch; + if (ch == null || ch > linelen) { + return Pos(pos.line, linelen); + } else if (ch < 0) { + return Pos(pos.line, 0); + } else { + return pos; + } + } + function clipPosArray(doc, array) { + var out = []; + for (var i2 = 0; i2 < array.length; i2++) { + out[i2] = clipPos(doc, array[i2]); + } + return out; + } + var SavedContext = function (state, lookAhead) { + this.state = state; + this.lookAhead = lookAhead; + }; + var Context = function (doc, state, line, lookAhead) { + this.state = state; + this.doc = doc; + this.line = line; + this.maxLookAhead = lookAhead || 0; + this.baseTokens = null; + this.baseTokenPos = 1; + }; + Context.prototype.lookAhead = function (n) { + var line = this.doc.getLine(this.line + n); + if (line != null && n > this.maxLookAhead) { + this.maxLookAhead = n; + } + return line; + }; + Context.prototype.baseToken = function (n) { + if (!this.baseTokens) { + return null; + } + while (this.baseTokens[this.baseTokenPos] <= n) { + this.baseTokenPos += 2; + } + var type = this.baseTokens[this.baseTokenPos + 1]; + return { + type: type && type.replace(/( |^)overlay .*/, ""), + size: this.baseTokens[this.baseTokenPos] - n + }; + }; + Context.prototype.nextLine = function () { + this.line++; + if (this.maxLookAhead > 0) { + this.maxLookAhead--; + } + }; + Context.fromSaved = function (doc, saved, line) { + if (saved instanceof SavedContext) { + return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead); + } else { + return new Context(doc, copyState(doc.mode, saved), line); + } + }; + Context.prototype.save = function (copy) { + var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; + return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state; + }; + function highlightLine(cm, line, context, forceToEnd) { + var st = [cm.state.modeGen], + lineClasses = {}; + runMode(cm, line.text, cm.doc.mode, context, function (end, style) { + return st.push(end, style); + }, lineClasses, forceToEnd); + var state = context.state; + var loop = function (o2) { + context.baseTokens = st; + var overlay = cm.state.overlays[o2], + i2 = 1, + at = 0; + context.state = true; + runMode(cm, line.text, overlay.mode, context, function (end, style) { + var start = i2; + while (at < end) { + var i_end = st[i2]; + if (i_end > end) { + st.splice(i2, 1, end, st[i2 + 1], i_end); + } + i2 += 2; + at = Math.min(end, i_end); + } + if (!style) { + return; + } + if (overlay.opaque) { + st.splice(start, i2 - start, end, "overlay " + style); + i2 = start + 2; + } else { + for (; start < i2; start += 2) { + var cur = st[start + 1]; + st[start + 1] = (cur ? cur + " " : "") + "overlay " + style; + } + } + }, lineClasses); + context.state = state; + context.baseTokens = null; + context.baseTokenPos = 1; + }; + for (var o = 0; o < cm.state.overlays.length; ++o) loop(o); + return { + styles: st, + classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null + }; + } + function getLineStyles(cm, line, updateFrontier) { + if (!line.styles || line.styles[0] != cm.state.modeGen) { + var context = getContextBefore(cm, lineNo(line)); + var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); + var result = highlightLine(cm, line, context); + if (resetState) { + context.state = resetState; + } + line.stateAfter = context.save(!resetState); + line.styles = result.styles; + if (result.classes) { + line.styleClasses = result.classes; + } else if (line.styleClasses) { + line.styleClasses = null; + } + if (updateFrontier === cm.doc.highlightFrontier) { + cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); + } + } + return line.styles; + } + function getContextBefore(cm, n, precise) { + var doc = cm.doc, + display = cm.display; + if (!doc.mode.startState) { + return new Context(doc, true, n); + } + var start = findStartLine(cm, n, precise); + var saved = start > doc.first && getLine(doc, start - 1).stateAfter; + var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start); + doc.iter(start, n, function (line) { + processLine(cm, line.text, context); + var pos = context.line; + line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; + context.nextLine(); + }); + if (precise) { + doc.modeFrontier = context.line; + } + return context; + } + function processLine(cm, text, context, startAt) { + var mode = cm.doc.mode; + var stream = new StringStream(text, cm.options.tabSize, context); + stream.start = stream.pos = startAt || 0; + if (text == "") { + callBlankLine(mode, context.state); + } + while (!stream.eol()) { + readToken(mode, stream, context.state); + stream.start = stream.pos; + } + } + function callBlankLine(mode, state) { + if (mode.blankLine) { + return mode.blankLine(state); + } + if (!mode.innerMode) { + return; + } + var inner = innerMode(mode, state); + if (inner.mode.blankLine) { + return inner.mode.blankLine(inner.state); + } + } + function readToken(mode, stream, state, inner) { + for (var i2 = 0; i2 < 10; i2++) { + if (inner) { + inner[0] = innerMode(mode, state).mode; + } + var style = mode.token(stream, state); + if (stream.pos > stream.start) { + return style; + } + } + throw new Error("Mode " + mode.name + " failed to advance stream."); + } + var Token = function (stream, type, state) { + this.start = stream.start; + this.end = stream.pos; + this.string = stream.current(); + this.type = type || null; + this.state = state; + }; + function takeToken(cm, pos, precise, asArray) { + var doc = cm.doc, + mode = doc.mode, + style; + pos = clipPos(doc, pos); + var line = getLine(doc, pos.line), + context = getContextBefore(cm, pos.line, precise); + var stream = new StringStream(line.text, cm.options.tabSize, context), + tokens; + if (asArray) { + tokens = []; + } + while ((asArray || stream.pos < pos.ch) && !stream.eol()) { + stream.start = stream.pos; + style = readToken(mode, stream, context.state); + if (asArray) { + tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); + } + } + return asArray ? tokens : new Token(stream, style, context.state); + } + function extractLineClasses(type, output) { + if (type) { + for (;;) { + var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); + if (!lineClass) { + break; + } + type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); + var prop2 = lineClass[1] ? "bgClass" : "textClass"; + if (output[prop2] == null) { + output[prop2] = lineClass[2]; + } else if (!new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)").test(output[prop2])) { + output[prop2] += " " + lineClass[2]; + } + } + } + return type; + } + function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { + var flattenSpans = mode.flattenSpans; + if (flattenSpans == null) { + flattenSpans = cm.options.flattenSpans; + } + var curStart = 0, + curStyle = null; + var stream = new StringStream(text, cm.options.tabSize, context), + style; + var inner = cm.options.addModeClass && [null]; + if (text == "") { + extractLineClasses(callBlankLine(mode, context.state), lineClasses); + } + while (!stream.eol()) { + if (stream.pos > cm.options.maxHighlightLength) { + flattenSpans = false; + if (forceToEnd) { + processLine(cm, text, context, stream.pos); + } + stream.pos = text.length; + style = null; + } else { + style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); + } + if (inner) { + var mName = inner[0].name; + if (mName) { + style = "m-" + (style ? mName + " " + style : mName); + } + } + if (!flattenSpans || curStyle != style) { + while (curStart < stream.start) { + curStart = Math.min(stream.start, curStart + 5e3); + f(curStart, curStyle); + } + curStyle = style; + } + stream.start = stream.pos; + } + while (curStart < stream.pos) { + var pos = Math.min(stream.pos, curStart + 5e3); + f(pos, curStyle); + curStart = pos; + } + } + function findStartLine(cm, n, precise) { + var minindent, + minline, + doc = cm.doc; + var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1e3 : 100); + for (var search = n; search > lim; --search) { + if (search <= doc.first) { + return doc.first; + } + var line = getLine(doc, search - 1), + after = line.stateAfter; + if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier)) { + return search; + } + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline; + } + function retreatFrontier(doc, n) { + doc.modeFrontier = Math.min(doc.modeFrontier, n); + if (doc.highlightFrontier < n - 10) { + return; + } + var start = doc.first; + for (var line = n - 1; line > start; line--) { + var saved = getLine(doc, line).stateAfter; + if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { + start = line + 1; + break; + } + } + doc.highlightFrontier = Math.min(doc.highlightFrontier, start); + } + var sawReadOnlySpans = false, + sawCollapsedSpans = false; + function seeReadOnlySpans() { + sawReadOnlySpans = true; + } + function seeCollapsedSpans() { + sawCollapsedSpans = true; + } + function MarkedSpan(marker, from, to) { + this.marker = marker; + this.from = from; + this.to = to; + } + function getMarkedSpanFor(spans, marker) { + if (spans) { + for (var i2 = 0; i2 < spans.length; ++i2) { + var span = spans[i2]; + if (span.marker == marker) { + return span; + } + } + } + } + function removeMarkedSpan(spans, span) { + var r; + for (var i2 = 0; i2 < spans.length; ++i2) { + if (spans[i2] != span) { + (r || (r = [])).push(spans[i2]); + } + } + return r; + } + function addMarkedSpan(line, span, op) { + var inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = /* @__PURE__ */new WeakSet())); + if (inThisOp && line.markedSpans && inThisOp.has(line.markedSpans)) { + line.markedSpans.push(span); + } else { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + if (inThisOp) { + inThisOp.add(line.markedSpans); + } + } + span.marker.attachLine(line); + } + function markedSpansBefore(old, startCh, isInsert) { + var nw; + if (old) { + for (var i2 = 0; i2 < old.length; ++i2) { + var span = old[i2], + marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh); + (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); + } + } + } + return nw; + } + function markedSpansAfter(old, endCh, isInsert) { + var nw; + if (old) { + for (var i2 = 0; i2 < old.length; ++i2) { + var span = old[i2], + marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh); + (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, span.to == null ? null : span.to - endCh)); + } + } + } + return nw; + } + function stretchSpansOverChange(doc, change) { + if (change.full) { + return null; + } + var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; + var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; + if (!oldFirst && !oldLast) { + return null; + } + var startCh = change.from.ch, + endCh = change.to.ch, + isInsert = cmp(change.from, change.to) == 0; + var first = markedSpansBefore(oldFirst, startCh, isInsert); + var last = markedSpansAfter(oldLast, endCh, isInsert); + var sameLine = change.text.length == 1, + offset = lst(change.text).length + (sameLine ? startCh : 0); + if (first) { + for (var i2 = 0; i2 < first.length; ++i2) { + var span = first[i2]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) { + span.to = startCh; + } else if (sameLine) { + span.to = found.to == null ? null : found.to + offset; + } + } + } + } + if (last) { + for (var i$12 = 0; i$12 < last.length; ++i$12) { + var span$1 = last[i$12]; + if (span$1.to != null) { + span$1.to += offset; + } + if (span$1.from == null) { + var found$1 = getMarkedSpanFor(first, span$1.marker); + if (!found$1) { + span$1.from = offset; + if (sameLine) { + (first || (first = [])).push(span$1); + } + } + } else { + span$1.from += offset; + if (sameLine) { + (first || (first = [])).push(span$1); + } + } + } + } + if (first) { + first = clearEmptySpans(first); + } + if (last && last != first) { + last = clearEmptySpans(last); + } + var newMarkers = [first]; + if (!sameLine) { + var gap = change.text.length - 2, + gapMarkers; + if (gap > 0 && first) { + for (var i$22 = 0; i$22 < first.length; ++i$22) { + if (first[i$22].to == null) { + (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$22].marker, null, null)); + } + } + } + for (var i$3 = 0; i$3 < gap; ++i$3) { + newMarkers.push(gapMarkers); + } + newMarkers.push(last); + } + return newMarkers; + } + function clearEmptySpans(spans) { + for (var i2 = 0; i2 < spans.length; ++i2) { + var span = spans[i2]; + if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) { + spans.splice(i2--, 1); + } + } + if (!spans.length) { + return null; + } + return spans; + } + function removeReadOnlyRanges(doc, from, to) { + var markers = null; + doc.iter(from.line, to.line + 1, function (line) { + if (line.markedSpans) { + for (var i3 = 0; i3 < line.markedSpans.length; ++i3) { + var mark = line.markedSpans[i3].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) { + (markers || (markers = [])).push(mark); + } + } + } + }); + if (!markers) { + return null; + } + var parts = [{ + from, + to + }]; + for (var i2 = 0; i2 < markers.length; ++i2) { + var mk = markers[i2], + m = mk.find(0); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { + continue; + } + var newParts = [j, 1], + dfrom = cmp(p.from, m.from), + dto = cmp(p.to, m.to); + if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) { + newParts.push({ + from: p.from, + to: m.from + }); + } + if (dto > 0 || !mk.inclusiveRight && !dto) { + newParts.push({ + from: m.to, + to: p.to + }); + } + parts.splice.apply(parts, newParts); + j += newParts.length - 3; + } + } + return parts; + } + function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) { + return; + } + for (var i2 = 0; i2 < spans.length; ++i2) { + spans[i2].marker.detachLine(line); + } + line.markedSpans = null; + } + function attachMarkedSpans(line, spans) { + if (!spans) { + return; + } + for (var i2 = 0; i2 < spans.length; ++i2) { + spans[i2].marker.attachLine(line); + } + line.markedSpans = spans; + } + function extraLeft(marker) { + return marker.inclusiveLeft ? -1 : 0; + } + function extraRight(marker) { + return marker.inclusiveRight ? 1 : 0; + } + function compareCollapsedMarkers(a, b) { + var lenDiff = a.lines.length - b.lines.length; + if (lenDiff != 0) { + return lenDiff; + } + var aPos = a.find(), + bPos = b.find(); + var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); + if (fromCmp) { + return -fromCmp; + } + var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); + if (toCmp) { + return toCmp; + } + return b.id - a.id; + } + function collapsedSpanAtSide(line, start) { + var sps = sawCollapsedSpans && line.markedSpans, + found; + if (sps) { + for (var sp = void 0, i2 = 0; i2 < sps.length; ++i2) { + sp = sps[i2]; + if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { + found = sp.marker; + } + } + } + return found; + } + function collapsedSpanAtStart(line) { + return collapsedSpanAtSide(line, true); + } + function collapsedSpanAtEnd(line) { + return collapsedSpanAtSide(line, false); + } + function collapsedSpanAround(line, ch) { + var sps = sawCollapsedSpans && line.markedSpans, + found; + if (sps) { + for (var i2 = 0; i2 < sps.length; ++i2) { + var sp = sps[i2]; + if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) && (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { + found = sp.marker; + } + } + } + return found; + } + function conflictingCollapsedRange(doc, lineNo2, from, to, marker) { + var line = getLine(doc, lineNo2); + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { + for (var i2 = 0; i2 < sps.length; ++i2) { + var sp = sps[i2]; + if (!sp.marker.collapsed) { + continue; + } + var found = sp.marker.find(0); + var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); + var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); + if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { + continue; + } + if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) { + return true; + } + } + } + } + function visualLine(line) { + var merged; + while (merged = collapsedSpanAtStart(line)) { + line = merged.find(-1, true).line; + } + return line; + } + function visualLineEnd(line) { + var merged; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line; + } + return line; + } + function visualLineContinued(line) { + var merged, lines; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line; + (lines || (lines = [])).push(line); + } + return lines; + } + function visualLineNo(doc, lineN) { + var line = getLine(doc, lineN), + vis = visualLine(line); + if (line == vis) { + return lineN; + } + return lineNo(vis); + } + function visualLineEndNo(doc, lineN) { + if (lineN > doc.lastLine()) { + return lineN; + } + var line = getLine(doc, lineN), + merged; + if (!lineIsHidden(doc, line)) { + return lineN; + } + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line; + } + return lineNo(line) + 1; + } + function lineIsHidden(doc, line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { + for (var sp = void 0, i2 = 0; i2 < sps.length; ++i2) { + sp = sps[i2]; + if (!sp.marker.collapsed) { + continue; + } + if (sp.from == null) { + return true; + } + if (sp.marker.widgetNode) { + continue; + } + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) { + return true; + } + } + } + } + function lineIsHiddenInner(doc, line, span) { + if (span.to == null) { + var end = span.marker.find(1, true); + return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)); + } + if (span.marker.inclusiveRight && span.to == line.text.length) { + return true; + } + for (var sp = void 0, i2 = 0; i2 < line.markedSpans.length; ++i2) { + sp = line.markedSpans[i2]; + if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && (sp.to == null || sp.to != span.from) && (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && lineIsHiddenInner(doc, line, sp)) { + return true; + } + } + } + function heightAtLine(lineObj) { + lineObj = visualLine(lineObj); + var h = 0, + chunk = lineObj.parent; + for (var i2 = 0; i2 < chunk.lines.length; ++i2) { + var line = chunk.lines[i2]; + if (line == lineObj) { + break; + } else { + h += line.height; + } + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i$12 = 0; i$12 < p.children.length; ++i$12) { + var cur = p.children[i$12]; + if (cur == chunk) { + break; + } else { + h += cur.height; + } + } + } + return h; + } + function lineLength(line) { + if (line.height == 0) { + return 0; + } + var len = line.text.length, + merged, + cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(0, true); + cur = found.from.line; + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found$1 = merged.find(0, true); + len -= cur.text.length - found$1.from.ch; + cur = found$1.to.line; + len += cur.text.length - found$1.to.ch; + } + return len; + } + function findMaxLine(cm) { + var d = cm.display, + doc = cm.doc; + d.maxLine = getLine(doc, doc.first); + d.maxLineLength = lineLength(d.maxLine); + d.maxLineChanged = true; + doc.iter(function (line) { + var len = lineLength(line); + if (len > d.maxLineLength) { + d.maxLineLength = len; + d.maxLine = line; + } + }); + } + var Line = function (text, markedSpans, estimateHeight2) { + this.text = text; + attachMarkedSpans(this, markedSpans); + this.height = estimateHeight2 ? estimateHeight2(this) : 1; + }; + Line.prototype.lineNo = function () { + return lineNo(this); + }; + eventMixin(Line); + function updateLine(line, text, markedSpans, estimateHeight2) { + line.text = text; + if (line.stateAfter) { + line.stateAfter = null; + } + if (line.styles) { + line.styles = null; + } + if (line.order != null) { + line.order = null; + } + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + var estHeight = estimateHeight2 ? estimateHeight2(line) : 1; + if (estHeight != line.height) { + updateLineHeight(line, estHeight); + } + } + function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); + } + var styleToClassCache = {}, + styleToClassCacheWithMode = {}; + function interpretTokenStyle(style, options) { + if (!style || /^\s*$/.test(style)) { + return null; + } + var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; + return cache[style] || (cache[style] = style.replace(/\S+/g, "cm-$&")); + } + function buildLineContent(cm, lineView) { + var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); + var builder = { + pre: eltP("pre", [content], "CodeMirror-line"), + content, + col: 0, + pos: 0, + cm, + trailingSpace: false, + splitSpaces: cm.getOption("lineWrapping") + }; + lineView.measure = {}; + for (var i2 = 0; i2 <= (lineView.rest ? lineView.rest.length : 0); i2++) { + var line = i2 ? lineView.rest[i2 - 1] : lineView.line, + order = void 0; + builder.pos = 0; + builder.addToken = buildToken; + if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) { + builder.addToken = buildTokenBadBidi(builder.addToken, order); + } + builder.map = []; + var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); + insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); + if (line.styleClasses) { + if (line.styleClasses.bgClass) { + builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); + } + if (line.styleClasses.textClass) { + builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); + } + } + if (builder.map.length == 0) { + builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); + } + if (i2 == 0) { + lineView.measure.map = builder.map; + lineView.measure.cache = {}; + } else { + (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map); + (lineView.measure.caches || (lineView.measure.caches = [])).push({}); + } + } + if (webkit) { + var last = builder.content.lastChild; + if (/\bcm-tab\b/.test(last.className) || last.querySelector && last.querySelector(".cm-tab")) { + builder.content.className = "cm-tab-wrap-hack"; + } + } + signal(cm, "renderLine", cm, lineView.line, builder.pre); + if (builder.pre.className) { + builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); + } + return builder; + } + function defaultSpecialCharPlaceholder(ch) { + var token = elt("span", "•", "cm-invalidchar"); + token.title = "\\u" + ch.charCodeAt(0).toString(16); + token.setAttribute("aria-label", token.title); + return token; + } + function buildToken(builder, text, style, startStyle, endStyle, css, attributes) { + if (!text) { + return; + } + var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; + var special = builder.cm.state.specialChars, + mustWrap = false; + var content; + if (!special.test(text)) { + builder.col += text.length; + content = document.createTextNode(displayText); + builder.map.push(builder.pos, builder.pos + text.length, content); + if (ie && ie_version < 9) { + mustWrap = true; + } + builder.pos += text.length; + } else { + content = document.createDocumentFragment(); + var pos = 0; + while (true) { + special.lastIndex = pos; + var m = special.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); + if (ie && ie_version < 9) { + content.appendChild(elt("span", [txt])); + } else { + content.appendChild(txt); + } + builder.map.push(builder.pos, builder.pos + skipped, txt); + builder.col += skipped; + builder.pos += skipped; + } + if (!m) { + break; + } + pos += skipped + 1; + var txt$1 = void 0; + if (m[0] == " ") { + var tabSize = builder.cm.options.tabSize, + tabWidth = tabSize - builder.col % tabSize; + txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + txt$1.setAttribute("role", "presentation"); + txt$1.setAttribute("cm-text", " "); + builder.col += tabWidth; + } else if (m[0] == "\r" || m[0] == "\n") { + txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "␍" : "␤", "cm-invalidchar")); + txt$1.setAttribute("cm-text", m[0]); + builder.col += 1; + } else { + txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); + txt$1.setAttribute("cm-text", m[0]); + if (ie && ie_version < 9) { + content.appendChild(elt("span", [txt$1])); + } else { + content.appendChild(txt$1); + } + builder.col += 1; + } + builder.map.push(builder.pos, builder.pos + 1, txt$1); + builder.pos++; + } + } + builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; + if (style || startStyle || endStyle || mustWrap || css || attributes) { + var fullStyle = style || ""; + if (startStyle) { + fullStyle += startStyle; + } + if (endStyle) { + fullStyle += endStyle; + } + var token = elt("span", [content], fullStyle, css); + if (attributes) { + for (var attr in attributes) { + if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class") { + token.setAttribute(attr, attributes[attr]); + } + } + } + return builder.content.appendChild(token); + } + builder.content.appendChild(content); + } + function splitSpaces(text, trailingBefore) { + if (text.length > 1 && !/ /.test(text)) { + return text; + } + var spaceBefore = trailingBefore, + result = ""; + for (var i2 = 0; i2 < text.length; i2++) { + var ch = text.charAt(i2); + if (ch == " " && spaceBefore && (i2 == text.length - 1 || text.charCodeAt(i2 + 1) == 32)) { + ch = " "; + } + result += ch; + spaceBefore = ch == " "; + } + return result; + } + function buildTokenBadBidi(inner, order) { + return function (builder, text, style, startStyle, endStyle, css, attributes) { + style = style ? style + " cm-force-border" : "cm-force-border"; + var start = builder.pos, + end = start + text.length; + for (;;) { + var part = void 0; + for (var i2 = 0; i2 < order.length; i2++) { + part = order[i2]; + if (part.to > start && part.from <= start) { + break; + } + } + if (part.to >= end) { + return inner(builder, text, style, startStyle, endStyle, css, attributes); + } + inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes); + startStyle = null; + text = text.slice(part.to - start); + start = part.to; + } + }; + } + function buildCollapsedSpan(builder, size, marker, ignoreWidget) { + var widget = !ignoreWidget && marker.widgetNode; + if (widget) { + builder.map.push(builder.pos, builder.pos + size, widget); + } + if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { + if (!widget) { + widget = builder.content.appendChild(document.createElement("span")); + } + widget.setAttribute("cm-marker", marker.id); + } + if (widget) { + builder.cm.display.input.setUneditable(widget); + builder.content.appendChild(widget); + } + builder.pos += size; + builder.trailingSpace = false; + } + function insertLineContent(line, builder, styles) { + var spans = line.markedSpans, + allText = line.text, + at = 0; + if (!spans) { + for (var i$12 = 1; i$12 < styles.length; i$12 += 2) { + builder.addToken(builder, allText.slice(at, at = styles[i$12]), interpretTokenStyle(styles[i$12 + 1], builder.cm.options)); + } + return; + } + var len = allText.length, + pos = 0, + i2 = 1, + text = "", + style, + css; + var nextChange = 0, + spanStyle, + spanEndStyle, + spanStartStyle, + collapsed, + attributes; + for (;;) { + if (nextChange == pos) { + spanStyle = spanEndStyle = spanStartStyle = css = ""; + attributes = null; + collapsed = null; + nextChange = Infinity; + var foundBookmarks = [], + endStyles = void 0; + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], + m = sp.marker; + if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { + foundBookmarks.push(m); + } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { + if (sp.to != null && sp.to != pos && nextChange > sp.to) { + nextChange = sp.to; + spanEndStyle = ""; + } + if (m.className) { + spanStyle += " " + m.className; + } + if (m.css) { + css = (css ? css + ";" : "") + m.css; + } + if (m.startStyle && sp.from == pos) { + spanStartStyle += " " + m.startStyle; + } + if (m.endStyle && sp.to == nextChange) { + (endStyles || (endStyles = [])).push(m.endStyle, sp.to); + } + if (m.title) { + (attributes || (attributes = {})).title = m.title; + } + if (m.attributes) { + for (var attr in m.attributes) { + (attributes || (attributes = {}))[attr] = m.attributes[attr]; + } + } + if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) { + collapsed = sp; + } + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + } + if (endStyles) { + for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) { + if (endStyles[j$1 + 1] == nextChange) { + spanEndStyle += " " + endStyles[j$1]; + } + } + } + if (!collapsed || collapsed.from == pos) { + for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) { + buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); + } + } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, collapsed.marker, collapsed.from == null); + if (collapsed.to == null) { + return; + } + if (collapsed.to == pos) { + collapsed = false; + } + } + } + if (pos >= len) { + break; + } + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes); + } + if (end >= upto) { + text = text.slice(upto - pos); + pos = upto; + break; + } + pos = end; + spanStartStyle = ""; + } + text = allText.slice(at, at = styles[i2++]); + style = interpretTokenStyle(styles[i2++], builder.cm.options); + } + } + } + function LineView(doc, line, lineN) { + this.line = line; + this.rest = visualLineContinued(line); + this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; + this.node = this.text = null; + this.hidden = lineIsHidden(doc, line); + } + function buildViewArray(cm, from, to) { + var array = [], + nextPos; + for (var pos = from; pos < to; pos = nextPos) { + var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); + nextPos = pos + view.size; + array.push(view); + } + return array; + } + var operationGroup = null; + function pushOperation(op) { + if (operationGroup) { + operationGroup.ops.push(op); + } else { + op.ownsGroup = operationGroup = { + ops: [op], + delayedCallbacks: [] + }; + } + } + function fireCallbacksForOps(group) { + var callbacks = group.delayedCallbacks, + i2 = 0; + do { + for (; i2 < callbacks.length; i2++) { + callbacks[i2].call(null); + } + for (var j = 0; j < group.ops.length; j++) { + var op = group.ops[j]; + if (op.cursorActivityHandlers) { + while (op.cursorActivityCalled < op.cursorActivityHandlers.length) { + op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); + } + } + } + } while (i2 < callbacks.length); + } + function finishOperation(op, endCb) { + var group = op.ownsGroup; + if (!group) { + return; + } + try { + fireCallbacksForOps(group); + } finally { + operationGroup = null; + endCb(group); + } + } + var orphanDelayedCallbacks = null; + function signalLater(emitter, type) { + var arr = getHandlers(emitter, type); + if (!arr.length) { + return; + } + var args = Array.prototype.slice.call(arguments, 2), + list; + if (operationGroup) { + list = operationGroup.delayedCallbacks; + } else if (orphanDelayedCallbacks) { + list = orphanDelayedCallbacks; + } else { + list = orphanDelayedCallbacks = []; + setTimeout(fireOrphanDelayed, 0); + } + var loop = function (i3) { + list.push(function () { + return arr[i3].apply(null, args); + }); + }; + for (var i2 = 0; i2 < arr.length; ++i2) loop(i2); + } + function fireOrphanDelayed() { + var delayed = orphanDelayedCallbacks; + orphanDelayedCallbacks = null; + for (var i2 = 0; i2 < delayed.length; ++i2) { + delayed[i2](); + } + } + function updateLineForChanges(cm, lineView, lineN, dims) { + for (var j = 0; j < lineView.changes.length; j++) { + var type = lineView.changes[j]; + if (type == "text") { + updateLineText(cm, lineView); + } else if (type == "gutter") { + updateLineGutter(cm, lineView, lineN, dims); + } else if (type == "class") { + updateLineClasses(cm, lineView); + } else if (type == "widget") { + updateLineWidgets(cm, lineView, dims); + } + } + lineView.changes = null; + } + function ensureLineWrapped(lineView) { + if (lineView.node == lineView.text) { + lineView.node = elt("div", null, null, "position: relative"); + if (lineView.text.parentNode) { + lineView.text.parentNode.replaceChild(lineView.node, lineView.text); + } + lineView.node.appendChild(lineView.text); + if (ie && ie_version < 8) { + lineView.node.style.zIndex = 2; + } + } + return lineView.node; + } + function updateLineBackground(cm, lineView) { + var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; + if (cls) { + cls += " CodeMirror-linebackground"; + } + if (lineView.background) { + if (cls) { + lineView.background.className = cls; + } else { + lineView.background.parentNode.removeChild(lineView.background); + lineView.background = null; + } + } else if (cls) { + var wrap = ensureLineWrapped(lineView); + lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); + cm.display.input.setUneditable(lineView.background); + } + } + function getLineContent(cm, lineView) { + var ext = cm.display.externalMeasured; + if (ext && ext.line == lineView.line) { + cm.display.externalMeasured = null; + lineView.measure = ext.measure; + return ext.built; + } + return buildLineContent(cm, lineView); + } + function updateLineText(cm, lineView) { + var cls = lineView.text.className; + var built = getLineContent(cm, lineView); + if (lineView.text == lineView.node) { + lineView.node = built.pre; + } + lineView.text.parentNode.replaceChild(built.pre, lineView.text); + lineView.text = built.pre; + if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { + lineView.bgClass = built.bgClass; + lineView.textClass = built.textClass; + updateLineClasses(cm, lineView); + } else if (cls) { + lineView.text.className = cls; + } + } + function updateLineClasses(cm, lineView) { + updateLineBackground(cm, lineView); + if (lineView.line.wrapClass) { + ensureLineWrapped(lineView).className = lineView.line.wrapClass; + } else if (lineView.node != lineView.text) { + lineView.node.className = ""; + } + var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; + lineView.text.className = textClass || ""; + } + function updateLineGutter(cm, lineView, lineN, dims) { + if (lineView.gutter) { + lineView.node.removeChild(lineView.gutter); + lineView.gutter = null; + } + if (lineView.gutterBackground) { + lineView.node.removeChild(lineView.gutterBackground); + lineView.gutterBackground = null; + } + if (lineView.line.gutterClass) { + var wrap = ensureLineWrapped(lineView); + lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + dims.gutterTotalWidth + "px"); + cm.display.input.setUneditable(lineView.gutterBackground); + wrap.insertBefore(lineView.gutterBackground, lineView.text); + } + var markers = lineView.line.gutterMarkers; + if (cm.options.lineNumbers || markers) { + var wrap$1 = ensureLineWrapped(lineView); + var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"); + gutterWrap.setAttribute("aria-hidden", "true"); + cm.display.input.setUneditable(gutterWrap); + wrap$1.insertBefore(gutterWrap, lineView.text); + if (lineView.line.gutterClass) { + gutterWrap.className += " " + lineView.line.gutterClass; + } + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) { + lineView.lineNumber = gutterWrap.appendChild(elt("div", lineNumberFor(cm.options, lineN), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + cm.display.lineNumInnerWidth + "px")); + } + if (markers) { + for (var k = 0; k < cm.display.gutterSpecs.length; ++k) { + var id = cm.display.gutterSpecs[k].className, + found = markers.hasOwnProperty(id) && markers[id]; + if (found) { + gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " + dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px")); + } + } + } + } + } + function updateLineWidgets(cm, lineView, dims) { + if (lineView.alignable) { + lineView.alignable = null; + } + var isWidget = classTest("CodeMirror-linewidget"); + for (var node = lineView.node.firstChild, next = void 0; node; node = next) { + next = node.nextSibling; + if (isWidget.test(node.className)) { + lineView.node.removeChild(node); + } + } + insertLineWidgets(cm, lineView, dims); + } + function buildLineElement(cm, lineView, lineN, dims) { + var built = getLineContent(cm, lineView); + lineView.text = lineView.node = built.pre; + if (built.bgClass) { + lineView.bgClass = built.bgClass; + } + if (built.textClass) { + lineView.textClass = built.textClass; + } + updateLineClasses(cm, lineView); + updateLineGutter(cm, lineView, lineN, dims); + insertLineWidgets(cm, lineView, dims); + return lineView.node; + } + function insertLineWidgets(cm, lineView, dims) { + insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); + if (lineView.rest) { + for (var i2 = 0; i2 < lineView.rest.length; i2++) { + insertLineWidgetsFor(cm, lineView.rest[i2], lineView, dims, false); + } + } + } + function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { + if (!line.widgets) { + return; + } + var wrap = ensureLineWrapped(lineView); + for (var i2 = 0, ws = line.widgets; i2 < ws.length; ++i2) { + var widget = ws[i2], + node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : "")); + if (!widget.handleMouseEvents) { + node.setAttribute("cm-ignore-events", "true"); + } + positionLineWidget(widget, node, lineView, dims); + cm.display.input.setUneditable(node); + if (allowAbove && widget.above) { + wrap.insertBefore(node, lineView.gutter || lineView.text); + } else { + wrap.appendChild(node); + } + signalLater(widget, "redraw"); + } + } + function positionLineWidget(widget, node, lineView, dims) { + if (widget.noHScroll) { + (lineView.alignable || (lineView.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) { + node.style.marginLeft = -dims.gutterTotalWidth + "px"; + } + } + } + function widgetHeight(widget) { + if (widget.height != null) { + return widget.height; + } + var cm = widget.doc.cm; + if (!cm) { + return 0; + } + if (!contains(document.body, widget.node)) { + var parentStyle = "position: relative;"; + if (widget.coverGutter) { + parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; + } + if (widget.noHScroll) { + parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; + } + removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); + } + return widget.height = widget.node.parentNode.offsetHeight; + } + function eventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { + if (!n || n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true" || n.parentNode == display.sizer && n != display.mover) { + return true; + } + } + } + function paddingTop(display) { + return display.lineSpace.offsetTop; + } + function paddingVert(display) { + return display.mover.offsetHeight - display.lineSpace.offsetHeight; + } + function paddingH(display) { + if (display.cachedPaddingH) { + return display.cachedPaddingH; + } + var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like")); + var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; + var data = { + left: parseInt(style.paddingLeft), + right: parseInt(style.paddingRight) + }; + if (!isNaN(data.left) && !isNaN(data.right)) { + display.cachedPaddingH = data; + } + return data; + } + function scrollGap(cm) { + return scrollerGap - cm.display.nativeBarWidth; + } + function displayWidth(cm) { + return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth; + } + function displayHeight(cm) { + return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight; + } + function ensureLineHeights(cm, lineView, rect) { + var wrapping = cm.options.lineWrapping; + var curWidth = wrapping && displayWidth(cm); + if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { + var heights = lineView.measure.heights = []; + if (wrapping) { + lineView.measure.width = curWidth; + var rects = lineView.text.firstChild.getClientRects(); + for (var i2 = 0; i2 < rects.length - 1; i2++) { + var cur = rects[i2], + next = rects[i2 + 1]; + if (Math.abs(cur.bottom - next.bottom) > 2) { + heights.push((cur.bottom + next.top) / 2 - rect.top); + } + } + } + heights.push(rect.bottom - rect.top); + } + } + function mapFromLineView(lineView, line, lineN) { + if (lineView.line == line) { + return { + map: lineView.measure.map, + cache: lineView.measure.cache + }; + } + if (lineView.rest) { + for (var i2 = 0; i2 < lineView.rest.length; i2++) { + if (lineView.rest[i2] == line) { + return { + map: lineView.measure.maps[i2], + cache: lineView.measure.caches[i2] + }; + } + } + for (var i$12 = 0; i$12 < lineView.rest.length; i$12++) { + if (lineNo(lineView.rest[i$12]) > lineN) { + return { + map: lineView.measure.maps[i$12], + cache: lineView.measure.caches[i$12], + before: true + }; + } + } + } + } + function updateExternalMeasurement(cm, line) { + line = visualLine(line); + var lineN = lineNo(line); + var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); + view.lineN = lineN; + var built = view.built = buildLineContent(cm, view); + view.text = built.pre; + removeChildrenAndAdd(cm.display.lineMeasure, built.pre); + return view; + } + function measureChar(cm, line, ch, bias) { + return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias); + } + function findViewForLine(cm, lineN) { + if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) { + return cm.display.view[findViewIndex(cm, lineN)]; + } + var ext = cm.display.externalMeasured; + if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) { + return ext; + } + } + function prepareMeasureForLine(cm, line) { + var lineN = lineNo(line); + var view = findViewForLine(cm, lineN); + if (view && !view.text) { + view = null; + } else if (view && view.changes) { + updateLineForChanges(cm, view, lineN, getDimensions(cm)); + cm.curOp.forceUpdate = true; + } + if (!view) { + view = updateExternalMeasurement(cm, line); + } + var info = mapFromLineView(view, line, lineN); + return { + line, + view, + rect: null, + map: info.map, + cache: info.cache, + before: info.before, + hasHeights: false + }; + } + function measureCharPrepared(cm, prepared, ch, bias, varHeight) { + if (prepared.before) { + ch = -1; + } + var key = ch + (bias || ""), + found; + if (prepared.cache.hasOwnProperty(key)) { + found = prepared.cache[key]; + } else { + if (!prepared.rect) { + prepared.rect = prepared.view.text.getBoundingClientRect(); + } + if (!prepared.hasHeights) { + ensureLineHeights(cm, prepared.view, prepared.rect); + prepared.hasHeights = true; + } + found = measureCharInner(cm, prepared, ch, bias); + if (!found.bogus) { + prepared.cache[key] = found; + } + } + return { + left: found.left, + right: found.right, + top: varHeight ? found.rtop : found.top, + bottom: varHeight ? found.rbottom : found.bottom + }; + } + var nullRect = { + left: 0, + right: 0, + top: 0, + bottom: 0 + }; + function nodeAndOffsetInLineMap(map2, ch, bias) { + var node, start, end, collapse, mStart, mEnd; + for (var i2 = 0; i2 < map2.length; i2 += 3) { + mStart = map2[i2]; + mEnd = map2[i2 + 1]; + if (ch < mStart) { + start = 0; + end = 1; + collapse = "left"; + } else if (ch < mEnd) { + start = ch - mStart; + end = start + 1; + } else if (i2 == map2.length - 3 || ch == mEnd && map2[i2 + 3] > ch) { + end = mEnd - mStart; + start = end - 1; + if (ch >= mEnd) { + collapse = "right"; + } + } + if (start != null) { + node = map2[i2 + 2]; + if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) { + collapse = bias; + } + if (bias == "left" && start == 0) { + while (i2 && map2[i2 - 2] == map2[i2 - 3] && map2[i2 - 1].insertLeft) { + node = map2[(i2 -= 3) + 2]; + collapse = "left"; + } + } + if (bias == "right" && start == mEnd - mStart) { + while (i2 < map2.length - 3 && map2[i2 + 3] == map2[i2 + 4] && !map2[i2 + 5].insertLeft) { + node = map2[(i2 += 3) + 2]; + collapse = "right"; + } + } + break; + } + } + return { + node, + start, + end, + collapse, + coverStart: mStart, + coverEnd: mEnd + }; + } + function getUsefulRect(rects, bias) { + var rect = nullRect; + if (bias == "left") { + for (var i2 = 0; i2 < rects.length; i2++) { + if ((rect = rects[i2]).left != rect.right) { + break; + } + } + } else { + for (var i$12 = rects.length - 1; i$12 >= 0; i$12--) { + if ((rect = rects[i$12]).left != rect.right) { + break; + } + } + } + return rect; + } + function measureCharInner(cm, prepared, ch, bias) { + var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); + var node = place.node, + start = place.start, + end = place.end, + collapse = place.collapse; + var rect; + if (node.nodeType == 3) { + for (var i$12 = 0; i$12 < 4; i$12++) { + while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { + --start; + } + while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { + ++end; + } + if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) { + rect = node.parentNode.getBoundingClientRect(); + } else { + rect = getUsefulRect(range(node, start, end).getClientRects(), bias); + } + if (rect.left || rect.right || start == 0) { + break; + } + end = start; + start = start - 1; + collapse = "right"; + } + if (ie && ie_version < 11) { + rect = maybeUpdateRectForZooming(cm.display.measure, rect); + } + } else { + if (start > 0) { + collapse = bias = "right"; + } + var rects; + if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) { + rect = rects[bias == "right" ? rects.length - 1 : 0]; + } else { + rect = node.getBoundingClientRect(); + } + } + if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { + var rSpan = node.parentNode.getClientRects()[0]; + if (rSpan) { + rect = { + left: rSpan.left, + right: rSpan.left + charWidth(cm.display), + top: rSpan.top, + bottom: rSpan.bottom + }; + } else { + rect = nullRect; + } + } + var rtop = rect.top - prepared.rect.top, + rbot = rect.bottom - prepared.rect.top; + var mid = (rtop + rbot) / 2; + var heights = prepared.view.measure.heights; + var i2 = 0; + for (; i2 < heights.length - 1; i2++) { + if (mid < heights[i2]) { + break; + } + } + var top = i2 ? heights[i2 - 1] : 0, + bot = heights[i2]; + var result = { + left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, + right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, + top, + bottom: bot + }; + if (!rect.left && !rect.right) { + result.bogus = true; + } + if (!cm.options.singleCursorHeightPerLine) { + result.rtop = rtop; + result.rbottom = rbot; + } + return result; + } + function maybeUpdateRectForZooming(measure, rect) { + if (!window.screen || screen.logicalXDPI == null || screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) { + return rect; + } + var scaleX = screen.logicalXDPI / screen.deviceXDPI; + var scaleY = screen.logicalYDPI / screen.deviceYDPI; + return { + left: rect.left * scaleX, + right: rect.right * scaleX, + top: rect.top * scaleY, + bottom: rect.bottom * scaleY + }; + } + function clearLineMeasurementCacheFor(lineView) { + if (lineView.measure) { + lineView.measure.cache = {}; + lineView.measure.heights = null; + if (lineView.rest) { + for (var i2 = 0; i2 < lineView.rest.length; i2++) { + lineView.measure.caches[i2] = {}; + } + } + } + } + function clearLineMeasurementCache(cm) { + cm.display.externalMeasure = null; + removeChildren(cm.display.lineMeasure); + for (var i2 = 0; i2 < cm.display.view.length; i2++) { + clearLineMeasurementCacheFor(cm.display.view[i2]); + } + } + function clearCaches(cm) { + clearLineMeasurementCache(cm); + cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; + if (!cm.options.lineWrapping) { + cm.display.maxLineChanged = true; + } + cm.display.lineNumChars = null; + } + function pageScrollX() { + if (chrome && android) { + return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)); + } + return window.pageXOffset || (document.documentElement || document.body).scrollLeft; + } + function pageScrollY() { + if (chrome && android) { + return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)); + } + return window.pageYOffset || (document.documentElement || document.body).scrollTop; + } + function widgetTopHeight(lineObj) { + var ref = visualLine(lineObj); + var widgets = ref.widgets; + var height = 0; + if (widgets) { + for (var i2 = 0; i2 < widgets.length; ++i2) { + if (widgets[i2].above) { + height += widgetHeight(widgets[i2]); + } + } + } + return height; + } + function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { + if (!includeWidgets) { + var height = widgetTopHeight(lineObj); + rect.top += height; + rect.bottom += height; + } + if (context == "line") { + return rect; + } + if (!context) { + context = "local"; + } + var yOff = heightAtLine(lineObj); + if (context == "local") { + yOff += paddingTop(cm.display); + } else { + yOff -= cm.display.viewOffset; + } + if (context == "page" || context == "window") { + var lOff = cm.display.lineSpace.getBoundingClientRect(); + yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); + var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); + rect.left += xOff; + rect.right += xOff; + } + rect.top += yOff; + rect.bottom += yOff; + return rect; + } + function fromCoordSystem(cm, coords, context) { + if (context == "div") { + return coords; + } + var left = coords.left, + top = coords.top; + if (context == "page") { + left -= pageScrollX(); + top -= pageScrollY(); + } else if (context == "local" || !context) { + var localBox = cm.display.sizer.getBoundingClientRect(); + left += localBox.left; + top += localBox.top; + } + var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); + return { + left: left - lineSpaceBox.left, + top: top - lineSpaceBox.top + }; + } + function charCoords(cm, pos, context, lineObj, bias) { + if (!lineObj) { + lineObj = getLine(cm.doc, pos.line); + } + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context); + } + function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { + lineObj = lineObj || getLine(cm.doc, pos.line); + if (!preparedMeasure) { + preparedMeasure = prepareMeasureForLine(cm, lineObj); + } + function get(ch2, right) { + var m = measureCharPrepared(cm, preparedMeasure, ch2, right ? "right" : "left", varHeight); + if (right) { + m.left = m.right; + } else { + m.right = m.left; + } + return intoCoordSystem(cm, lineObj, m, context); + } + var order = getOrder(lineObj, cm.doc.direction), + ch = pos.ch, + sticky = pos.sticky; + if (ch >= lineObj.text.length) { + ch = lineObj.text.length; + sticky = "before"; + } else if (ch <= 0) { + ch = 0; + sticky = "after"; + } + if (!order) { + return get(sticky == "before" ? ch - 1 : ch, sticky == "before"); + } + function getBidi(ch2, partPos2, invert) { + var part = order[partPos2], + right = part.level == 1; + return get(invert ? ch2 - 1 : ch2, right != invert); + } + var partPos = getBidiPartAt(order, ch, sticky); + var other = bidiOther; + var val = getBidi(ch, partPos, sticky == "before"); + if (other != null) { + val.other = getBidi(ch, other, sticky != "before"); + } + return val; + } + function estimateCoords(cm, pos) { + var left = 0; + pos = clipPos(cm.doc, pos); + if (!cm.options.lineWrapping) { + left = charWidth(cm.display) * pos.ch; + } + var lineObj = getLine(cm.doc, pos.line); + var top = heightAtLine(lineObj) + paddingTop(cm.display); + return { + left, + right: left, + top, + bottom: top + lineObj.height + }; + } + function PosWithInfo(line, ch, sticky, outside, xRel) { + var pos = Pos(line, ch, sticky); + pos.xRel = xRel; + if (outside) { + pos.outside = outside; + } + return pos; + } + function coordsChar(cm, x, y) { + var doc = cm.doc; + y += cm.display.viewOffset; + if (y < 0) { + return PosWithInfo(doc.first, 0, null, -1, -1); + } + var lineN = lineAtHeight(doc, y), + last = doc.first + doc.size - 1; + if (lineN > last) { + return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1); + } + if (x < 0) { + x = 0; + } + var lineObj = getLine(doc, lineN); + for (;;) { + var found = coordsCharInner(cm, lineObj, lineN, x, y); + var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0)); + if (!collapsed) { + return found; + } + var rangeEnd = collapsed.find(1); + if (rangeEnd.line == lineN) { + return rangeEnd; + } + lineObj = getLine(doc, lineN = rangeEnd.line); + } + } + function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { + y -= widgetTopHeight(lineObj); + var end = lineObj.text.length; + var begin = findFirst(function (ch) { + return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; + }, end, 0); + end = findFirst(function (ch) { + return measureCharPrepared(cm, preparedMeasure, ch).top > y; + }, begin, end); + return { + begin, + end + }; + } + function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { + if (!preparedMeasure) { + preparedMeasure = prepareMeasureForLine(cm, lineObj); + } + var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; + return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop); + } + function boxIsAfter(box, x, y, left) { + return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x; + } + function coordsCharInner(cm, lineObj, lineNo2, x, y) { + y -= heightAtLine(lineObj); + var preparedMeasure = prepareMeasureForLine(cm, lineObj); + var widgetHeight2 = widgetTopHeight(lineObj); + var begin = 0, + end = lineObj.text.length, + ltr = true; + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)(cm, lineObj, lineNo2, preparedMeasure, order, x, y); + ltr = part.level != 1; + begin = ltr ? part.from : part.to - 1; + end = ltr ? part.to : part.from - 1; + } + var chAround = null, + boxAround = null; + var ch = findFirst(function (ch2) { + var box = measureCharPrepared(cm, preparedMeasure, ch2); + box.top += widgetHeight2; + box.bottom += widgetHeight2; + if (!boxIsAfter(box, x, y, false)) { + return false; + } + if (box.top <= y && box.left <= x) { + chAround = ch2; + boxAround = box; + } + return true; + }, begin, end); + var baseX, + sticky, + outside = false; + if (boxAround) { + var atLeft = x - boxAround.left < boxAround.right - x, + atStart = atLeft == ltr; + ch = chAround + (atStart ? 0 : 1); + sticky = atStart ? "after" : "before"; + baseX = atLeft ? boxAround.left : boxAround.right; + } else { + if (!ltr && (ch == end || ch == begin)) { + ch++; + } + sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" : measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight2 <= y == ltr ? "after" : "before"; + var coords = cursorCoords(cm, Pos(lineNo2, ch, sticky), "line", lineObj, preparedMeasure); + baseX = coords.left; + outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0; + } + ch = skipExtendingChars(lineObj.text, ch, 1); + return PosWithInfo(lineNo2, ch, sticky, outside, x - baseX); + } + function coordsBidiPart(cm, lineObj, lineNo2, preparedMeasure, order, x, y) { + var index = findFirst(function (i2) { + var part2 = order[i2], + ltr2 = part2.level != 1; + return boxIsAfter(cursorCoords(cm, Pos(lineNo2, ltr2 ? part2.to : part2.from, ltr2 ? "before" : "after"), "line", lineObj, preparedMeasure), x, y, true); + }, 0, order.length - 1); + var part = order[index]; + if (index > 0) { + var ltr = part.level != 1; + var start = cursorCoords(cm, Pos(lineNo2, ltr ? part.from : part.to, ltr ? "after" : "before"), "line", lineObj, preparedMeasure); + if (boxIsAfter(start, x, y, true) && start.top > y) { + part = order[index - 1]; + } + } + return part; + } + function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) { + var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y); + var begin = ref.begin; + var end = ref.end; + if (/\s/.test(lineObj.text.charAt(end - 1))) { + end--; + } + var part = null, + closestDist = null; + for (var i2 = 0; i2 < order.length; i2++) { + var p = order[i2]; + if (p.from >= end || p.to <= begin) { + continue; + } + var ltr = p.level != 1; + var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right; + var dist = endX < x ? x - endX + 1e9 : endX - x; + if (!part || closestDist > dist) { + part = p; + closestDist = dist; + } + } + if (!part) { + part = order[order.length - 1]; + } + if (part.from < begin) { + part = { + from: begin, + to: part.to, + level: part.level + }; + } + if (part.to > end) { + part = { + from: part.from, + to: end, + level: part.level + }; + } + return part; + } + var measureText; + function textHeight(display) { + if (display.cachedTextHeight != null) { + return display.cachedTextHeight; + } + if (measureText == null) { + measureText = elt("pre", null, "CodeMirror-line-like"); + for (var i2 = 0; i2 < 49; ++i2) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) { + display.cachedTextHeight = height; + } + removeChildren(display.measure); + return height || 1; + } + function charWidth(display) { + if (display.cachedCharWidth != null) { + return display.cachedCharWidth; + } + var anchor = elt("span", "xxxxxxxxxx"); + var pre = elt("pre", [anchor], "CodeMirror-line-like"); + removeChildrenAndAdd(display.measure, pre); + var rect = anchor.getBoundingClientRect(), + width = (rect.right - rect.left) / 10; + if (width > 2) { + display.cachedCharWidth = width; + } + return width || 10; + } + function getDimensions(cm) { + var d = cm.display, + left = {}, + width = {}; + var gutterLeft = d.gutters.clientLeft; + for (var n = d.gutters.firstChild, i2 = 0; n; n = n.nextSibling, ++i2) { + var id = cm.display.gutterSpecs[i2].className; + left[id] = n.offsetLeft + n.clientLeft + gutterLeft; + width[id] = n.clientWidth; + } + return { + fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth + }; + } + function compensateForHScroll(display) { + return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left; + } + function estimateHeight(cm) { + var th = textHeight(cm.display), + wrapping = cm.options.lineWrapping; + var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); + return function (line) { + if (lineIsHidden(cm.doc, line)) { + return 0; + } + var widgetsHeight = 0; + if (line.widgets) { + for (var i2 = 0; i2 < line.widgets.length; i2++) { + if (line.widgets[i2].height) { + widgetsHeight += line.widgets[i2].height; + } + } + } + if (wrapping) { + return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th; + } else { + return widgetsHeight + th; + } + }; + } + function estimateLineHeights(cm) { + var doc = cm.doc, + est = estimateHeight(cm); + doc.iter(function (line) { + var estHeight = est(line); + if (estHeight != line.height) { + updateLineHeight(line, estHeight); + } + }); + } + function posFromMouse(cm, e, liberal, forRect) { + var display = cm.display; + if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { + return null; + } + var x, + y, + space = display.lineSpace.getBoundingClientRect(); + try { + x = e.clientX - space.left; + y = e.clientY - space.top; + } catch (e$1) { + return null; + } + var coords = coordsChar(cm, x, y), + line; + if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { + var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; + coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); + } + return coords; + } + function findViewIndex(cm, n) { + if (n >= cm.display.viewTo) { + return null; + } + n -= cm.display.viewFrom; + if (n < 0) { + return null; + } + var view = cm.display.view; + for (var i2 = 0; i2 < view.length; i2++) { + n -= view[i2].size; + if (n < 0) { + return i2; + } + } + } + function regChange(cm, from, to, lendiff) { + if (from == null) { + from = cm.doc.first; + } + if (to == null) { + to = cm.doc.first + cm.doc.size; + } + if (!lendiff) { + lendiff = 0; + } + var display = cm.display; + if (lendiff && to < display.viewTo && (display.updateLineNumbers == null || display.updateLineNumbers > from)) { + display.updateLineNumbers = from; + } + cm.curOp.viewChanged = true; + if (from >= display.viewTo) { + if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) { + resetView(cm); + } + } else if (to <= display.viewFrom) { + if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { + resetView(cm); + } else { + display.viewFrom += lendiff; + display.viewTo += lendiff; + } + } else if (from <= display.viewFrom && to >= display.viewTo) { + resetView(cm); + } else if (from <= display.viewFrom) { + var cut = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cut) { + display.view = display.view.slice(cut.index); + display.viewFrom = cut.lineN; + display.viewTo += lendiff; + } else { + resetView(cm); + } + } else if (to >= display.viewTo) { + var cut$1 = viewCuttingPoint(cm, from, from, -1); + if (cut$1) { + display.view = display.view.slice(0, cut$1.index); + display.viewTo = cut$1.lineN; + } else { + resetView(cm); + } + } else { + var cutTop = viewCuttingPoint(cm, from, from, -1); + var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cutTop && cutBot) { + display.view = display.view.slice(0, cutTop.index).concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)).concat(display.view.slice(cutBot.index)); + display.viewTo += lendiff; + } else { + resetView(cm); + } + } + var ext = display.externalMeasured; + if (ext) { + if (to < ext.lineN) { + ext.lineN += lendiff; + } else if (from < ext.lineN + ext.size) { + display.externalMeasured = null; + } + } + } + function regLineChange(cm, line, type) { + cm.curOp.viewChanged = true; + var display = cm.display, + ext = cm.display.externalMeasured; + if (ext && line >= ext.lineN && line < ext.lineN + ext.size) { + display.externalMeasured = null; + } + if (line < display.viewFrom || line >= display.viewTo) { + return; + } + var lineView = display.view[findViewIndex(cm, line)]; + if (lineView.node == null) { + return; + } + var arr = lineView.changes || (lineView.changes = []); + if (indexOf(arr, type) == -1) { + arr.push(type); + } + } + function resetView(cm) { + cm.display.viewFrom = cm.display.viewTo = cm.doc.first; + cm.display.view = []; + cm.display.viewOffset = 0; + } + function viewCuttingPoint(cm, oldN, newN, dir) { + var index = findViewIndex(cm, oldN), + diff, + view = cm.display.view; + if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) { + return { + index, + lineN: newN + }; + } + var n = cm.display.viewFrom; + for (var i2 = 0; i2 < index; i2++) { + n += view[i2].size; + } + if (n != oldN) { + if (dir > 0) { + if (index == view.length - 1) { + return null; + } + diff = n + view[index].size - oldN; + index++; + } else { + diff = n - oldN; + } + oldN += diff; + newN += diff; + } + while (visualLineNo(cm.doc, newN) != newN) { + if (index == (dir < 0 ? 0 : view.length - 1)) { + return null; + } + newN += dir * view[index - (dir < 0 ? 1 : 0)].size; + index += dir; + } + return { + index, + lineN: newN + }; + } + function adjustView(cm, from, to) { + var display = cm.display, + view = display.view; + if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { + display.view = buildViewArray(cm, from, to); + display.viewFrom = from; + } else { + if (display.viewFrom > from) { + display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); + } else if (display.viewFrom < from) { + display.view = display.view.slice(findViewIndex(cm, from)); + } + display.viewFrom = from; + if (display.viewTo < to) { + display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); + } else if (display.viewTo > to) { + display.view = display.view.slice(0, findViewIndex(cm, to)); + } + } + display.viewTo = to; + } + function countDirtyView(cm) { + var view = cm.display.view, + dirty = 0; + for (var i2 = 0; i2 < view.length; i2++) { + var lineView = view[i2]; + if (!lineView.hidden && (!lineView.node || lineView.changes)) { + ++dirty; + } + } + return dirty; + } + function updateSelection(cm) { + cm.display.input.showSelection(cm.display.input.prepareSelection()); + } + function prepareSelection(cm, primary) { + if (primary === void 0) primary = true; + var doc = cm.doc, + result = {}; + var curFragment = result.cursors = document.createDocumentFragment(); + var selFragment = result.selection = document.createDocumentFragment(); + var customCursor = cm.options.$customCursor; + if (customCursor) { + primary = true; + } + for (var i2 = 0; i2 < doc.sel.ranges.length; i2++) { + if (!primary && i2 == doc.sel.primIndex) { + continue; + } + var range2 = doc.sel.ranges[i2]; + if (range2.from().line >= cm.display.viewTo || range2.to().line < cm.display.viewFrom) { + continue; + } + var collapsed = range2.empty(); + if (customCursor) { + var head = customCursor(cm, range2); + if (head) { + drawSelectionCursor(cm, head, curFragment); + } + } else if (collapsed || cm.options.showCursorWhenSelecting) { + drawSelectionCursor(cm, range2.head, curFragment); + } + if (!collapsed) { + drawSelectionRange(cm, range2, selFragment); + } + } + return result; + } + function drawSelectionCursor(cm, head, output) { + var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); + var cursor = output.appendChild(elt("div", " ", "CodeMirror-cursor")); + cursor.style.left = pos.left + "px"; + cursor.style.top = pos.top + "px"; + cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + if (/\bcm-fat-cursor\b/.test(cm.getWrapperElement().className)) { + var charPos = charCoords(cm, head, "div", null, null); + var width = charPos.right - charPos.left; + cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + "px"; + } + if (pos.other) { + var otherCursor = output.appendChild(elt("div", " ", "CodeMirror-cursor CodeMirror-secondarycursor")); + otherCursor.style.display = ""; + otherCursor.style.left = pos.other.left + "px"; + otherCursor.style.top = pos.other.top + "px"; + otherCursor.style.height = (pos.other.bottom - pos.other.top) * 0.85 + "px"; + } + } + function cmpCoords(a, b) { + return a.top - b.top || a.left - b.left; + } + function drawSelectionRange(cm, range2, output) { + var display = cm.display, + doc = cm.doc; + var fragment = document.createDocumentFragment(); + var padding = paddingH(cm.display), + leftSide = padding.left; + var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; + var docLTR = doc.direction == "ltr"; + function add(left, top, width, bottom) { + if (top < 0) { + top = 0; + } + top = Math.round(top); + bottom = Math.round(bottom); + fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px")); + } + function drawForLine(line, fromArg, toArg) { + var lineObj = getLine(doc, line); + var lineLen = lineObj.text.length; + var start, end; + function coords(ch, bias) { + return charCoords(cm, Pos(line, ch), "div", lineObj, bias); + } + function wrapX(pos, dir, side) { + var extent = wrappedLineExtentChar(cm, lineObj, null, pos); + var prop2 = dir == "ltr" == (side == "after") ? "left" : "right"; + var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); + return coords(ch, prop2)[prop2]; + } + var order = getOrder(lineObj, doc.direction); + iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i2) { + var ltr = dir == "ltr"; + var fromPos = coords(from, ltr ? "left" : "right"); + var toPos = coords(to - 1, ltr ? "right" : "left"); + var openStart = fromArg == null && from == 0, + openEnd = toArg == null && to == lineLen; + var first = i2 == 0, + last = !order || i2 == order.length - 1; + if (toPos.top - fromPos.top <= 3) { + var openLeft = (docLTR ? openStart : openEnd) && first; + var openRight = (docLTR ? openEnd : openStart) && last; + var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; + var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; + add(left, fromPos.top, right - left, fromPos.bottom); + } else { + var topLeft, topRight, botLeft, botRight; + if (ltr) { + topLeft = docLTR && openStart && first ? leftSide : fromPos.left; + topRight = docLTR ? rightSide : wrapX(from, dir, "before"); + botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); + botRight = docLTR && openEnd && last ? rightSide : toPos.right; + } else { + topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); + topRight = !docLTR && openStart && first ? rightSide : fromPos.right; + botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; + botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); + } + add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); + if (fromPos.bottom < toPos.top) { + add(leftSide, fromPos.bottom, null, toPos.top); + } + add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); + } + if (!start || cmpCoords(fromPos, start) < 0) { + start = fromPos; + } + if (cmpCoords(toPos, start) < 0) { + start = toPos; + } + if (!end || cmpCoords(fromPos, end) < 0) { + end = fromPos; + } + if (cmpCoords(toPos, end) < 0) { + end = toPos; + } + }); + return { + start, + end + }; + } + var sFrom = range2.from(), + sTo = range2.to(); + if (sFrom.line == sTo.line) { + drawForLine(sFrom.line, sFrom.ch, sTo.ch); + } else { + var fromLine = getLine(doc, sFrom.line), + toLine = getLine(doc, sTo.line); + var singleVLine = visualLine(fromLine) == visualLine(toLine); + var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; + var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; + if (singleVLine) { + if (leftEnd.top < rightStart.top - 2) { + add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); + add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); + } else { + add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); + } + } + if (leftEnd.bottom < rightStart.top) { + add(leftSide, leftEnd.bottom, null, rightStart.top); + } + } + output.appendChild(fragment); + } + function restartBlink(cm) { + if (!cm.state.focused) { + return; + } + var display = cm.display; + clearInterval(display.blinker); + var on2 = true; + display.cursorDiv.style.visibility = ""; + if (cm.options.cursorBlinkRate > 0) { + display.blinker = setInterval(function () { + if (!cm.hasFocus()) { + onBlur(cm); + } + display.cursorDiv.style.visibility = (on2 = !on2) ? "" : "hidden"; + }, cm.options.cursorBlinkRate); + } else if (cm.options.cursorBlinkRate < 0) { + display.cursorDiv.style.visibility = "hidden"; + } + } + function ensureFocus(cm) { + if (!cm.hasFocus()) { + cm.display.input.focus(); + if (!cm.state.focused) { + onFocus(cm); + } + } + } + function delayBlurEvent(cm) { + cm.state.delayingBlurEvent = true; + setTimeout(function () { + if (cm.state.delayingBlurEvent) { + cm.state.delayingBlurEvent = false; + if (cm.state.focused) { + onBlur(cm); + } + } + }, 100); + } + function onFocus(cm, e) { + if (cm.state.delayingBlurEvent && !cm.state.draggingText) { + cm.state.delayingBlurEvent = false; + } + if (cm.options.readOnly == "nocursor") { + return; + } + if (!cm.state.focused) { + signal(cm, "focus", cm, e); + cm.state.focused = true; + addClass(cm.display.wrapper, "CodeMirror-focused"); + if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { + cm.display.input.reset(); + if (webkit) { + setTimeout(function () { + return cm.display.input.reset(true); + }, 20); + } + } + cm.display.input.receivedFocus(); + } + restartBlink(cm); + } + function onBlur(cm, e) { + if (cm.state.delayingBlurEvent) { + return; + } + if (cm.state.focused) { + signal(cm, "blur", cm, e); + cm.state.focused = false; + rmClass(cm.display.wrapper, "CodeMirror-focused"); + } + clearInterval(cm.display.blinker); + setTimeout(function () { + if (!cm.state.focused) { + cm.display.shift = false; + } + }, 150); + } + function updateHeightsInViewport(cm) { + var display = cm.display; + var prevBottom = display.lineDiv.offsetTop; + var viewTop = Math.max(0, display.scroller.getBoundingClientRect().top); + var oldHeight = display.lineDiv.getBoundingClientRect().top; + var mustScroll = 0; + for (var i2 = 0; i2 < display.view.length; i2++) { + var cur = display.view[i2], + wrapping = cm.options.lineWrapping; + var height = void 0, + width = 0; + if (cur.hidden) { + continue; + } + oldHeight += cur.line.height; + if (ie && ie_version < 8) { + var bot = cur.node.offsetTop + cur.node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = cur.node.getBoundingClientRect(); + height = box.bottom - box.top; + if (!wrapping && cur.text.firstChild) { + width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; + } + } + var diff = cur.line.height - height; + if (diff > 5e-3 || diff < -5e-3) { + if (oldHeight < viewTop) { + mustScroll -= diff; + } + updateLineHeight(cur.line, height); + updateWidgetHeight(cur.line); + if (cur.rest) { + for (var j = 0; j < cur.rest.length; j++) { + updateWidgetHeight(cur.rest[j]); + } + } + } + if (width > cm.display.sizerWidth) { + var chWidth = Math.ceil(width / charWidth(cm.display)); + if (chWidth > cm.display.maxLineLength) { + cm.display.maxLineLength = chWidth; + cm.display.maxLine = cur.line; + cm.display.maxLineChanged = true; + } + } + } + if (Math.abs(mustScroll) > 2) { + display.scroller.scrollTop += mustScroll; + } + } + function updateWidgetHeight(line) { + if (line.widgets) { + for (var i2 = 0; i2 < line.widgets.length; ++i2) { + var w = line.widgets[i2], + parent = w.node.parentNode; + if (parent) { + w.height = parent.offsetHeight; + } + } + } + } + function visibleLines(display, doc, viewport) { + var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; + top = Math.floor(top - paddingTop(display)); + var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; + var from = lineAtHeight(doc, top), + to = lineAtHeight(doc, bottom); + if (viewport && viewport.ensure) { + var ensureFrom = viewport.ensure.from.line, + ensureTo = viewport.ensure.to.line; + if (ensureFrom < from) { + from = ensureFrom; + to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); + } else if (Math.min(ensureTo, doc.lastLine()) >= to) { + from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); + to = ensureTo; + } + } + return { + from, + to: Math.max(to, from + 1) + }; + } + function maybeScrollWindow(cm, rect) { + if (signalDOMEvent(cm, "scrollCursorIntoView")) { + return; + } + var display = cm.display, + box = display.sizer.getBoundingClientRect(), + doScroll = null; + if (rect.top + box.top < 0) { + doScroll = true; + } else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { + doScroll = false; + } + if (doScroll != null && !phantom) { + var scrollNode = elt("div", "​", null, "position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + rect.left + "px; width: " + Math.max(2, rect.right - rect.left) + "px;"); + cm.display.lineSpace.appendChild(scrollNode); + scrollNode.scrollIntoView(doScroll); + cm.display.lineSpace.removeChild(scrollNode); + } + } + function scrollPosIntoView(cm, pos, end, margin) { + if (margin == null) { + margin = 0; + } + var rect; + if (!cm.options.lineWrapping && pos == end) { + end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; + pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; + } + for (var limit = 0; limit < 5; limit++) { + var changed = false; + var coords = cursorCoords(cm, pos); + var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); + rect = { + left: Math.min(coords.left, endCoords.left), + top: Math.min(coords.top, endCoords.top) - margin, + right: Math.max(coords.left, endCoords.left), + bottom: Math.max(coords.bottom, endCoords.bottom) + margin + }; + var scrollPos = calculateScrollPos(cm, rect); + var startTop = cm.doc.scrollTop, + startLeft = cm.doc.scrollLeft; + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.doc.scrollTop - startTop) > 1) { + changed = true; + } + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { + changed = true; + } + } + if (!changed) { + break; + } + } + return rect; + } + function scrollIntoView(cm, rect) { + var scrollPos = calculateScrollPos(cm, rect); + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + } + } + function calculateScrollPos(cm, rect) { + var display = cm.display, + snapMargin = textHeight(cm.display); + if (rect.top < 0) { + rect.top = 0; + } + var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; + var screen2 = displayHeight(cm), + result = {}; + if (rect.bottom - rect.top > screen2) { + rect.bottom = rect.top + screen2; + } + var docBottom = cm.doc.height + paddingVert(display); + var atTop = rect.top < snapMargin, + atBottom = rect.bottom > docBottom - snapMargin; + if (rect.top < screentop) { + result.scrollTop = atTop ? 0 : rect.top; + } else if (rect.bottom > screentop + screen2) { + var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen2); + if (newTop != screentop) { + result.scrollTop = newTop; + } + } + var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth; + var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace; + var screenw = displayWidth(cm) - display.gutters.offsetWidth; + var tooWide = rect.right - rect.left > screenw; + if (tooWide) { + rect.right = rect.left + screenw; + } + if (rect.left < 10) { + result.scrollLeft = 0; + } else if (rect.left < screenleft) { + result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); + } else if (rect.right > screenw + screenleft - 3) { + result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; + } + return result; + } + function addToScrollTop(cm, top) { + if (top == null) { + return; + } + resolveScrollToPos(cm); + cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; + } + function ensureCursorVisible(cm) { + resolveScrollToPos(cm); + var cur = cm.getCursor(); + cm.curOp.scrollToPos = { + from: cur, + to: cur, + margin: cm.options.cursorScrollMargin + }; + } + function scrollToCoords(cm, x, y) { + if (x != null || y != null) { + resolveScrollToPos(cm); + } + if (x != null) { + cm.curOp.scrollLeft = x; + } + if (y != null) { + cm.curOp.scrollTop = y; + } + } + function scrollToRange(cm, range2) { + resolveScrollToPos(cm); + cm.curOp.scrollToPos = range2; + } + function resolveScrollToPos(cm) { + var range2 = cm.curOp.scrollToPos; + if (range2) { + cm.curOp.scrollToPos = null; + var from = estimateCoords(cm, range2.from), + to = estimateCoords(cm, range2.to); + scrollToCoordsRange(cm, from, to, range2.margin); + } + } + function scrollToCoordsRange(cm, from, to, margin) { + var sPos = calculateScrollPos(cm, { + left: Math.min(from.left, to.left), + top: Math.min(from.top, to.top) - margin, + right: Math.max(from.right, to.right), + bottom: Math.max(from.bottom, to.bottom) + margin + }); + scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); + } + function updateScrollTop(cm, val) { + if (Math.abs(cm.doc.scrollTop - val) < 2) { + return; + } + if (!gecko) { + updateDisplaySimple(cm, { + top: val + }); + } + setScrollTop(cm, val, true); + if (gecko) { + updateDisplaySimple(cm); + } + startWorker(cm, 100); + } + function setScrollTop(cm, val, forceScroll) { + val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val)); + if (cm.display.scroller.scrollTop == val && !forceScroll) { + return; + } + cm.doc.scrollTop = val; + cm.display.scrollbars.setScrollTop(val); + if (cm.display.scroller.scrollTop != val) { + cm.display.scroller.scrollTop = val; + } + } + function setScrollLeft(cm, val, isScroller, forceScroll) { + val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth)); + if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { + return; + } + cm.doc.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) { + cm.display.scroller.scrollLeft = val; + } + cm.display.scrollbars.setScrollLeft(val); + } + function measureForScrollbars(cm) { + var d = cm.display, + gutterW = d.gutters.offsetWidth; + var docH = Math.round(cm.doc.height + paddingVert(cm.display)); + return { + clientHeight: d.scroller.clientHeight, + viewHeight: d.wrapper.clientHeight, + scrollWidth: d.scroller.scrollWidth, + clientWidth: d.scroller.clientWidth, + viewWidth: d.wrapper.clientWidth, + barLeft: cm.options.fixedGutter ? gutterW : 0, + docHeight: docH, + scrollHeight: docH + scrollGap(cm) + d.barHeight, + nativeBarWidth: d.nativeBarWidth, + gutterWidth: gutterW + }; + } + var NativeScrollbars = function (place, scroll, cm) { + this.cm = cm; + var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); + var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); + vert.tabIndex = horiz.tabIndex = -1; + place(vert); + place(horiz); + on(vert, "scroll", function () { + if (vert.clientHeight) { + scroll(vert.scrollTop, "vertical"); + } + }); + on(horiz, "scroll", function () { + if (horiz.clientWidth) { + scroll(horiz.scrollLeft, "horizontal"); + } + }); + this.checkedZeroWidth = false; + if (ie && ie_version < 8) { + this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; + } + }; + NativeScrollbars.prototype.update = function (measure) { + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + var sWidth = measure.nativeBarWidth; + if (needsV) { + this.vert.style.display = "block"; + this.vert.style.bottom = needsH ? sWidth + "px" : "0"; + var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); + this.vert.firstChild.style.height = Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; + } else { + this.vert.scrollTop = 0; + this.vert.style.display = ""; + this.vert.firstChild.style.height = "0"; + } + if (needsH) { + this.horiz.style.display = "block"; + this.horiz.style.right = needsV ? sWidth + "px" : "0"; + this.horiz.style.left = measure.barLeft + "px"; + var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); + this.horiz.firstChild.style.width = Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; + } else { + this.horiz.style.display = ""; + this.horiz.firstChild.style.width = "0"; + } + if (!this.checkedZeroWidth && measure.clientHeight > 0) { + if (sWidth == 0) { + this.zeroWidthHack(); + } + this.checkedZeroWidth = true; + } + return { + right: needsV ? sWidth : 0, + bottom: needsH ? sWidth : 0 + }; + }; + NativeScrollbars.prototype.setScrollLeft = function (pos) { + if (this.horiz.scrollLeft != pos) { + this.horiz.scrollLeft = pos; + } + if (this.disableHoriz) { + this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); + } + }; + NativeScrollbars.prototype.setScrollTop = function (pos) { + if (this.vert.scrollTop != pos) { + this.vert.scrollTop = pos; + } + if (this.disableVert) { + this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); + } + }; + NativeScrollbars.prototype.zeroWidthHack = function () { + var w = mac && !mac_geMountainLion ? "12px" : "18px"; + this.horiz.style.height = this.vert.style.width = w; + this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none"; + this.disableHoriz = new Delayed(); + this.disableVert = new Delayed(); + }; + NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) { + bar.style.pointerEvents = "auto"; + function maybeDisable() { + var box = bar.getBoundingClientRect(); + var elt2 = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); + if (elt2 != bar) { + bar.style.pointerEvents = "none"; + } else { + delay.set(1e3, maybeDisable); + } + } + delay.set(1e3, maybeDisable); + }; + NativeScrollbars.prototype.clear = function () { + var parent = this.horiz.parentNode; + parent.removeChild(this.horiz); + parent.removeChild(this.vert); + }; + var NullScrollbars = function () {}; + NullScrollbars.prototype.update = function () { + return { + bottom: 0, + right: 0 + }; + }; + NullScrollbars.prototype.setScrollLeft = function () {}; + NullScrollbars.prototype.setScrollTop = function () {}; + NullScrollbars.prototype.clear = function () {}; + function updateScrollbars(cm, measure) { + if (!measure) { + measure = measureForScrollbars(cm); + } + var startWidth = cm.display.barWidth, + startHeight = cm.display.barHeight; + updateScrollbarsInner(cm, measure); + for (var i2 = 0; i2 < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i2++) { + if (startWidth != cm.display.barWidth && cm.options.lineWrapping) { + updateHeightsInViewport(cm); + } + updateScrollbarsInner(cm, measureForScrollbars(cm)); + startWidth = cm.display.barWidth; + startHeight = cm.display.barHeight; + } + } + function updateScrollbarsInner(cm, measure) { + var d = cm.display; + var sizes = d.scrollbars.update(measure); + d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; + d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; + d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; + if (sizes.right && sizes.bottom) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = sizes.bottom + "px"; + d.scrollbarFiller.style.width = sizes.right + "px"; + } else { + d.scrollbarFiller.style.display = ""; + } + if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { + d.gutterFiller.style.display = "block"; + d.gutterFiller.style.height = sizes.bottom + "px"; + d.gutterFiller.style.width = measure.gutterWidth + "px"; + } else { + d.gutterFiller.style.display = ""; + } + } + var scrollbarModel = { + "native": NativeScrollbars, + "null": NullScrollbars + }; + function initScrollbars(cm) { + if (cm.display.scrollbars) { + cm.display.scrollbars.clear(); + if (cm.display.scrollbars.addClass) { + rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); + } + } + cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { + cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); + on(node, "mousedown", function () { + if (cm.state.focused) { + setTimeout(function () { + return cm.display.input.focus(); + }, 0); + } + }); + node.setAttribute("cm-not-content", "true"); + }, function (pos, axis) { + if (axis == "horizontal") { + setScrollLeft(cm, pos); + } else { + updateScrollTop(cm, pos); + } + }, cm); + if (cm.display.scrollbars.addClass) { + addClass(cm.display.wrapper, cm.display.scrollbars.addClass); + } + } + var nextOpId = 0; + function startOperation(cm) { + cm.curOp = { + cm, + viewChanged: false, + // Flag that indicates that lines might need to be redrawn + startHeight: cm.doc.height, + // Used to detect need to update scrollbar + forceUpdate: false, + // Used to force a redraw + updateInput: 0, + // Whether to reset the input textarea + typing: false, + // Whether this reset should be careful to leave existing text (for compositing) + changeObjs: null, + // Accumulated changes, for firing change events + cursorActivityHandlers: null, + // Set of handlers to fire cursorActivity on + cursorActivityCalled: 0, + // Tracks which cursorActivity handlers have been called already + selectionChanged: false, + // Whether the selection needs to be redrawn + updateMaxLine: false, + // Set when the widest line needs to be determined anew + scrollLeft: null, + scrollTop: null, + // Intermediate scroll position, not pushed to DOM yet + scrollToPos: null, + // Used to scroll to a specific position + focus: false, + id: ++nextOpId, + // Unique ID + markArrays: null + // Used by addMarkedSpan + }; + pushOperation(cm.curOp); + } + function endOperation(cm) { + var op = cm.curOp; + if (op) { + finishOperation(op, function (group) { + for (var i2 = 0; i2 < group.ops.length; i2++) { + group.ops[i2].cm.curOp = null; + } + endOperations(group); + }); + } + } + function endOperations(group) { + var ops = group.ops; + for (var i2 = 0; i2 < ops.length; i2++) { + endOperation_R1(ops[i2]); + } + for (var i$12 = 0; i$12 < ops.length; i$12++) { + endOperation_W1(ops[i$12]); + } + for (var i$22 = 0; i$22 < ops.length; i$22++) { + endOperation_R2(ops[i$22]); + } + for (var i$3 = 0; i$3 < ops.length; i$3++) { + endOperation_W2(ops[i$3]); + } + for (var i$4 = 0; i$4 < ops.length; i$4++) { + endOperation_finish(ops[i$4]); + } + } + function endOperation_R1(op) { + var cm = op.cm, + display = cm.display; + maybeClipScrollbars(cm); + if (op.updateMaxLine) { + findMaxLine(cm); + } + op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || op.scrollToPos.to.line >= display.viewTo) || display.maxLineChanged && cm.options.lineWrapping; + op.update = op.mustUpdate && new DisplayUpdate(cm, op.mustUpdate && { + top: op.scrollTop, + ensure: op.scrollToPos + }, op.forceUpdate); + } + function endOperation_W1(op) { + op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); + } + function endOperation_R2(op) { + var cm = op.cm, + display = cm.display; + if (op.updatedDisplay) { + updateHeightsInViewport(cm); + } + op.barMeasure = measureForScrollbars(cm); + if (display.maxLineChanged && !cm.options.lineWrapping) { + op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; + cm.display.sizerWidth = op.adjustWidthTo; + op.barMeasure.scrollWidth = Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); + op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); + } + if (op.updatedDisplay || op.selectionChanged) { + op.preparedSelection = display.input.prepareSelection(); + } + } + function endOperation_W2(op) { + var cm = op.cm; + if (op.adjustWidthTo != null) { + cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; + if (op.maxScrollLeft < cm.doc.scrollLeft) { + setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); + } + cm.display.maxLineChanged = false; + } + var takeFocus = op.focus && op.focus == activeElt(); + if (op.preparedSelection) { + cm.display.input.showSelection(op.preparedSelection, takeFocus); + } + if (op.updatedDisplay || op.startHeight != cm.doc.height) { + updateScrollbars(cm, op.barMeasure); + } + if (op.updatedDisplay) { + setDocumentHeight(cm, op.barMeasure); + } + if (op.selectionChanged) { + restartBlink(cm); + } + if (cm.state.focused && op.updateInput) { + cm.display.input.reset(op.typing); + } + if (takeFocus) { + ensureFocus(op.cm); + } + } + function endOperation_finish(op) { + var cm = op.cm, + display = cm.display, + doc = cm.doc; + if (op.updatedDisplay) { + postUpdateDisplay(cm, op.update); + } + if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) { + display.wheelStartX = display.wheelStartY = null; + } + if (op.scrollTop != null) { + setScrollTop(cm, op.scrollTop, op.forceScroll); + } + if (op.scrollLeft != null) { + setScrollLeft(cm, op.scrollLeft, true, true); + } + if (op.scrollToPos) { + var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); + maybeScrollWindow(cm, rect); + } + var hidden = op.maybeHiddenMarkers, + unhidden = op.maybeUnhiddenMarkers; + if (hidden) { + for (var i2 = 0; i2 < hidden.length; ++i2) { + if (!hidden[i2].lines.length) { + signal(hidden[i2], "hide"); + } + } + } + if (unhidden) { + for (var i$12 = 0; i$12 < unhidden.length; ++i$12) { + if (unhidden[i$12].lines.length) { + signal(unhidden[i$12], "unhide"); + } + } + } + if (display.wrapper.offsetHeight) { + doc.scrollTop = cm.display.scroller.scrollTop; + } + if (op.changeObjs) { + signal(cm, "changes", cm, op.changeObjs); + } + if (op.update) { + op.update.finish(); + } + } + function runInOp(cm, f) { + if (cm.curOp) { + return f(); + } + startOperation(cm); + try { + return f(); + } finally { + endOperation(cm); + } + } + function operation(cm, f) { + return function () { + if (cm.curOp) { + return f.apply(cm, arguments); + } + startOperation(cm); + try { + return f.apply(cm, arguments); + } finally { + endOperation(cm); + } + }; + } + function methodOp(f) { + return function () { + if (this.curOp) { + return f.apply(this, arguments); + } + startOperation(this); + try { + return f.apply(this, arguments); + } finally { + endOperation(this); + } + }; + } + function docMethodOp(f) { + return function () { + var cm = this.cm; + if (!cm || cm.curOp) { + return f.apply(this, arguments); + } + startOperation(cm); + try { + return f.apply(this, arguments); + } finally { + endOperation(cm); + } + }; + } + function startWorker(cm, time) { + if (cm.doc.highlightFrontier < cm.display.viewTo) { + cm.state.highlight.set(time, bind(highlightWorker, cm)); + } + } + function highlightWorker(cm) { + var doc = cm.doc; + if (doc.highlightFrontier >= cm.display.viewTo) { + return; + } + var end = + /* @__PURE__ */new Date() + cm.options.workTime; + var context = getContextBefore(cm, doc.highlightFrontier); + var changedLines = []; + doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { + if (context.line >= cm.display.viewFrom) { + var oldStyles = line.styles; + var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null; + var highlighted = highlightLine(cm, line, context, true); + if (resetState) { + context.state = resetState; + } + line.styles = highlighted.styles; + var oldCls = line.styleClasses, + newCls = highlighted.classes; + if (newCls) { + line.styleClasses = newCls; + } else if (oldCls) { + line.styleClasses = null; + } + var ischange = !oldStyles || oldStyles.length != line.styles.length || oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); + for (var i2 = 0; !ischange && i2 < oldStyles.length; ++i2) { + ischange = oldStyles[i2] != line.styles[i2]; + } + if (ischange) { + changedLines.push(context.line); + } + line.stateAfter = context.save(); + context.nextLine(); + } else { + if (line.text.length <= cm.options.maxHighlightLength) { + processLine(cm, line.text, context); + } + line.stateAfter = context.line % 5 == 0 ? context.save() : null; + context.nextLine(); + } + if (+ /* @__PURE__ */new Date() > end) { + startWorker(cm, cm.options.workDelay); + return true; + } + }); + doc.highlightFrontier = context.line; + doc.modeFrontier = Math.max(doc.modeFrontier, context.line); + if (changedLines.length) { + runInOp(cm, function () { + for (var i2 = 0; i2 < changedLines.length; i2++) { + regLineChange(cm, changedLines[i2], "text"); + } + }); + } + } + var DisplayUpdate = function (cm, viewport, force) { + var display = cm.display; + this.viewport = viewport; + this.visible = visibleLines(display, cm.doc, viewport); + this.editorIsHidden = !display.wrapper.offsetWidth; + this.wrapperHeight = display.wrapper.clientHeight; + this.wrapperWidth = display.wrapper.clientWidth; + this.oldDisplayWidth = displayWidth(cm); + this.force = force; + this.dims = getDimensions(cm); + this.events = []; + }; + DisplayUpdate.prototype.signal = function (emitter, type) { + if (hasHandler(emitter, type)) { + this.events.push(arguments); + } + }; + DisplayUpdate.prototype.finish = function () { + for (var i2 = 0; i2 < this.events.length; i2++) { + signal.apply(null, this.events[i2]); + } + }; + function maybeClipScrollbars(cm) { + var display = cm.display; + if (!display.scrollbarsClipped && display.scroller.offsetWidth) { + display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; + display.heightForcer.style.height = scrollGap(cm) + "px"; + display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; + display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; + display.scrollbarsClipped = true; + } + } + function selectionSnapshot(cm) { + if (cm.hasFocus()) { + return null; + } + var active = activeElt(); + if (!active || !contains(cm.display.lineDiv, active)) { + return null; + } + var result = { + activeElt: active + }; + if (window.getSelection) { + var sel = window.getSelection(); + if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { + result.anchorNode = sel.anchorNode; + result.anchorOffset = sel.anchorOffset; + result.focusNode = sel.focusNode; + result.focusOffset = sel.focusOffset; + } + } + return result; + } + function restoreSelection(snapshot) { + if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { + return; + } + snapshot.activeElt.focus(); + if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) && snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { + var sel = window.getSelection(), + range2 = document.createRange(); + range2.setEnd(snapshot.anchorNode, snapshot.anchorOffset); + range2.collapse(false); + sel.removeAllRanges(); + sel.addRange(range2); + sel.extend(snapshot.focusNode, snapshot.focusOffset); + } + } + function updateDisplayIfNeeded(cm, update) { + var display = cm.display, + doc = cm.doc; + if (update.editorIsHidden) { + resetView(cm); + return false; + } + if (!update.force && update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && display.renderedView == display.view && countDirtyView(cm) == 0) { + return false; + } + if (maybeUpdateLineNumberWidth(cm)) { + resetView(cm); + update.dims = getDimensions(cm); + } + var end = doc.first + doc.size; + var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); + var to = Math.min(end, update.visible.to + cm.options.viewportMargin); + if (display.viewFrom < from && from - display.viewFrom < 20) { + from = Math.max(doc.first, display.viewFrom); + } + if (display.viewTo > to && display.viewTo - to < 20) { + to = Math.min(end, display.viewTo); + } + if (sawCollapsedSpans) { + from = visualLineNo(cm.doc, from); + to = visualLineEndNo(cm.doc, to); + } + var different = from != display.viewFrom || to != display.viewTo || display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; + adjustView(cm, from, to); + display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); + cm.display.mover.style.top = display.viewOffset + "px"; + var toUpdate = countDirtyView(cm); + if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) { + return false; + } + var selSnapshot = selectionSnapshot(cm); + if (toUpdate > 4) { + display.lineDiv.style.display = "none"; + } + patchDisplay(cm, display.updateLineNumbers, update.dims); + if (toUpdate > 4) { + display.lineDiv.style.display = ""; + } + display.renderedView = display.view; + restoreSelection(selSnapshot); + removeChildren(display.cursorDiv); + removeChildren(display.selectionDiv); + display.gutters.style.height = display.sizer.style.minHeight = 0; + if (different) { + display.lastWrapHeight = update.wrapperHeight; + display.lastWrapWidth = update.wrapperWidth; + startWorker(cm, 400); + } + display.updateLineNumbers = null; + return true; + } + function postUpdateDisplay(cm, update) { + var viewport = update.viewport; + for (var first = true;; first = false) { + if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { + if (viewport && viewport.top != null) { + viewport = { + top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top) + }; + } + update.visible = visibleLines(cm.display, cm.doc, viewport); + if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) { + break; + } + } else if (first) { + update.visible = visibleLines(cm.display, cm.doc, viewport); + } + if (!updateDisplayIfNeeded(cm, update)) { + break; + } + updateHeightsInViewport(cm); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.force = false; + } + update.signal(cm, "update", cm); + if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { + update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); + cm.display.reportedViewFrom = cm.display.viewFrom; + cm.display.reportedViewTo = cm.display.viewTo; + } + } + function updateDisplaySimple(cm, viewport) { + var update = new DisplayUpdate(cm, viewport); + if (updateDisplayIfNeeded(cm, update)) { + updateHeightsInViewport(cm); + postUpdateDisplay(cm, update); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.finish(); + } + } + function patchDisplay(cm, updateNumbersFrom, dims) { + var display = cm.display, + lineNumbers = cm.options.lineNumbers; + var container = display.lineDiv, + cur = container.firstChild; + function rm(node2) { + var next = node2.nextSibling; + if (webkit && mac && cm.display.currentWheelTarget == node2) { + node2.style.display = "none"; + } else { + node2.parentNode.removeChild(node2); + } + return next; + } + var view = display.view, + lineN = display.viewFrom; + for (var i2 = 0; i2 < view.length; i2++) { + var lineView = view[i2]; + if (lineView.hidden) ;else if (!lineView.node || lineView.node.parentNode != container) { + var node = buildLineElement(cm, lineView, lineN, dims); + container.insertBefore(node, cur); + } else { + while (cur != lineView.node) { + cur = rm(cur); + } + var updateNumber = lineNumbers && updateNumbersFrom != null && updateNumbersFrom <= lineN && lineView.lineNumber; + if (lineView.changes) { + if (indexOf(lineView.changes, "gutter") > -1) { + updateNumber = false; + } + updateLineForChanges(cm, lineView, lineN, dims); + } + if (updateNumber) { + removeChildren(lineView.lineNumber); + lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); + } + cur = lineView.node.nextSibling; + } + lineN += lineView.size; + } + while (cur) { + cur = rm(cur); + } + } + function updateGutterSpace(display) { + var width = display.gutters.offsetWidth; + display.sizer.style.marginLeft = width + "px"; + signalLater(display, "gutterChanged", display); + } + function setDocumentHeight(cm, measure) { + cm.display.sizer.style.minHeight = measure.docHeight + "px"; + cm.display.heightForcer.style.top = measure.docHeight + "px"; + cm.display.gutters.style.height = measure.docHeight + cm.display.barHeight + scrollGap(cm) + "px"; + } + function alignHorizontally(cm) { + var display = cm.display, + view = display.view; + if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { + return; + } + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; + var gutterW = display.gutters.offsetWidth, + left = comp + "px"; + for (var i2 = 0; i2 < view.length; i2++) { + if (!view[i2].hidden) { + if (cm.options.fixedGutter) { + if (view[i2].gutter) { + view[i2].gutter.style.left = left; + } + if (view[i2].gutterBackground) { + view[i2].gutterBackground.style.left = left; + } + } + var align = view[i2].alignable; + if (align) { + for (var j = 0; j < align.length; j++) { + align[j].style.left = left; + } + } + } + } + if (cm.options.fixedGutter) { + display.gutters.style.left = comp + gutterW + "px"; + } + } + function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) { + return false; + } + var doc = cm.doc, + last = lineNumberFor(cm.options, doc.first + doc.size - 1), + display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt("div", [elt("div", last)], "CodeMirror-linenumber CodeMirror-gutter-elt")); + var innerW = test.firstChild.offsetWidth, + padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + updateGutterSpace(cm.display); + return true; + } + return false; + } + function getGutters(gutters, lineNumbers) { + var result = [], + sawLineNumbers = false; + for (var i2 = 0; i2 < gutters.length; i2++) { + var name = gutters[i2], + style = null; + if (typeof name != "string") { + style = name.style; + name = name.className; + } + if (name == "CodeMirror-linenumbers") { + if (!lineNumbers) { + continue; + } else { + sawLineNumbers = true; + } + } + result.push({ + className: name, + style + }); + } + if (lineNumbers && !sawLineNumbers) { + result.push({ + className: "CodeMirror-linenumbers", + style: null + }); + } + return result; + } + function renderGutters(display) { + var gutters = display.gutters, + specs = display.gutterSpecs; + removeChildren(gutters); + display.lineGutter = null; + for (var i2 = 0; i2 < specs.length; ++i2) { + var ref = specs[i2]; + var className = ref.className; + var style = ref.style; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className)); + if (style) { + gElt.style.cssText = style; + } + if (className == "CodeMirror-linenumbers") { + display.lineGutter = gElt; + gElt.style.width = (display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = specs.length ? "" : "none"; + updateGutterSpace(display); + } + function updateGutters(cm) { + renderGutters(cm.display); + regChange(cm); + alignHorizontally(cm); + } + function Display(place, doc, input, options) { + var d = this; + this.input = input; + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + d.scrollbarFiller.setAttribute("cm-not-content", "true"); + d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); + d.gutterFiller.setAttribute("cm-not-content", "true"); + d.lineDiv = eltP("div", null, "CodeMirror-code"); + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + d.cursorDiv = elt("div", null, "CodeMirror-cursors"); + d.measure = elt("div", null, "CodeMirror-measure"); + d.lineMeasure = elt("div", null, "CodeMirror-measure"); + d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], null, "position: relative; outline: none"); + var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); + d.mover = elt("div", [lines], null, "position: relative"); + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + d.sizerWidth = null; + d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); + d.wrapper.setAttribute("translate", "no"); + if (ie && ie_version < 8) { + d.gutters.style.zIndex = -1; + d.scroller.style.paddingRight = 0; + } + if (!webkit && !(gecko && mobile)) { + d.scroller.draggable = true; + } + if (place) { + if (place.appendChild) { + place.appendChild(d.wrapper); + } else { + place(d.wrapper); + } + } + d.viewFrom = d.viewTo = doc.first; + d.reportedViewFrom = d.reportedViewTo = doc.first; + d.view = []; + d.renderedView = null; + d.externalMeasured = null; + d.viewOffset = 0; + d.lastWrapHeight = d.lastWrapWidth = 0; + d.updateLineNumbers = null; + d.nativeBarWidth = d.barHeight = d.barWidth = 0; + d.scrollbarsClipped = false; + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + d.alignWidgets = false; + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.maxLine = null; + d.maxLineLength = 0; + d.maxLineChanged = false; + d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; + d.shift = false; + d.selForContextMenu = null; + d.activeTouch = null; + d.gutterSpecs = getGutters(options.gutters, options.lineNumbers); + renderGutters(d); + input.init(d); + } + var wheelSamples = 0, + wheelPixelsPerUnit = null; + if (ie) { + wheelPixelsPerUnit = -0.53; + } else if (gecko) { + wheelPixelsPerUnit = 15; + } else if (chrome) { + wheelPixelsPerUnit = -0.7; + } else if (safari) { + wheelPixelsPerUnit = -1 / 3; + } + function wheelEventDelta(e) { + var dx = e.wheelDeltaX, + dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { + dx = e.detail; + } + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { + dy = e.detail; + } else if (dy == null) { + dy = e.wheelDelta; + } + return { + x: dx, + y: dy + }; + } + function wheelEventPixels(e) { + var delta = wheelEventDelta(e); + delta.x *= wheelPixelsPerUnit; + delta.y *= wheelPixelsPerUnit; + return delta; + } + function onScrollWheel(cm, e) { + var delta = wheelEventDelta(e), + dx = delta.x, + dy = delta.y; + var pixelsPerUnit = wheelPixelsPerUnit; + if (e.deltaMode === 0) { + dx = e.deltaX; + dy = e.deltaY; + pixelsPerUnit = 1; + } + var display = cm.display, + scroll = display.scroller; + var canScrollX = scroll.scrollWidth > scroll.clientWidth; + var canScrollY = scroll.scrollHeight > scroll.clientHeight; + if (!(dx && canScrollX || dy && canScrollY)) { + return; + } + if (dy && mac && webkit) { + outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { + for (var i2 = 0; i2 < view.length; i2++) { + if (view[i2].node == cur) { + cm.display.currentWheelTarget = cur; + break outer; + } + } + } + } + if (dx && !gecko && !presto && pixelsPerUnit != null) { + if (dy && canScrollY) { + updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit)); + } + setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit)); + if (!dy || dy && canScrollY) { + e_preventDefault(e); + } + display.wheelStartX = null; + return; + } + if (dy && pixelsPerUnit != null) { + var pixels = dy * pixelsPerUnit; + var top = cm.doc.scrollTop, + bot = top + display.wrapper.clientHeight; + if (pixels < 0) { + top = Math.max(0, top + pixels - 50); + } else { + bot = Math.min(cm.doc.height, bot + pixels + 50); + } + updateDisplaySimple(cm, { + top, + bottom: bot + }); + } + if (wheelSamples < 20 && e.deltaMode !== 0) { + if (display.wheelStartX == null) { + display.wheelStartX = scroll.scrollLeft; + display.wheelStartY = scroll.scrollTop; + display.wheelDX = dx; + display.wheelDY = dy; + setTimeout(function () { + if (display.wheelStartX == null) { + return; + } + var movedX = scroll.scrollLeft - display.wheelStartX; + var movedY = scroll.scrollTop - display.wheelStartY; + var sample = movedY && display.wheelDY && movedY / display.wheelDY || movedX && display.wheelDX && movedX / display.wheelDX; + display.wheelStartX = display.wheelStartY = null; + if (!sample) { + return; + } + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + display.wheelDX += dx; + display.wheelDY += dy; + } + } + } + var Selection = function (ranges, primIndex) { + this.ranges = ranges; + this.primIndex = primIndex; + }; + Selection.prototype.primary = function () { + return this.ranges[this.primIndex]; + }; + Selection.prototype.equals = function (other) { + if (other == this) { + return true; + } + if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { + return false; + } + for (var i2 = 0; i2 < this.ranges.length; i2++) { + var here = this.ranges[i2], + there = other.ranges[i2]; + if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { + return false; + } + } + return true; + }; + Selection.prototype.deepCopy = function () { + var out = []; + for (var i2 = 0; i2 < this.ranges.length; i2++) { + out[i2] = new Range(copyPos(this.ranges[i2].anchor), copyPos(this.ranges[i2].head)); + } + return new Selection(out, this.primIndex); + }; + Selection.prototype.somethingSelected = function () { + for (var i2 = 0; i2 < this.ranges.length; i2++) { + if (!this.ranges[i2].empty()) { + return true; + } + } + return false; + }; + Selection.prototype.contains = function (pos, end) { + if (!end) { + end = pos; + } + for (var i2 = 0; i2 < this.ranges.length; i2++) { + var range2 = this.ranges[i2]; + if (cmp(end, range2.from()) >= 0 && cmp(pos, range2.to()) <= 0) { + return i2; + } + } + return -1; + }; + var Range = function (anchor, head) { + this.anchor = anchor; + this.head = head; + }; + Range.prototype.from = function () { + return minPos(this.anchor, this.head); + }; + Range.prototype.to = function () { + return maxPos(this.anchor, this.head); + }; + Range.prototype.empty = function () { + return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch; + }; + function normalizeSelection(cm, ranges, primIndex) { + var mayTouch = cm && cm.options.selectionsMayTouch; + var prim = ranges[primIndex]; + ranges.sort(function (a, b) { + return cmp(a.from(), b.from()); + }); + primIndex = indexOf(ranges, prim); + for (var i2 = 1; i2 < ranges.length; i2++) { + var cur = ranges[i2], + prev = ranges[i2 - 1]; + var diff = cmp(prev.to(), cur.from()); + if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) { + var from = minPos(prev.from(), cur.from()), + to = maxPos(prev.to(), cur.to()); + var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; + if (i2 <= primIndex) { + --primIndex; + } + ranges.splice(--i2, 2, new Range(inv ? to : from, inv ? from : to)); + } + } + return new Selection(ranges, primIndex); + } + function simpleSelection(anchor, head) { + return new Selection([new Range(anchor, head || anchor)], 0); + } + function changeEnd(change) { + if (!change.text) { + return change.to; + } + return Pos(change.from.line + change.text.length - 1, lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)); + } + function adjustForChange(pos, change) { + if (cmp(pos, change.from) < 0) { + return pos; + } + if (cmp(pos, change.to) <= 0) { + return changeEnd(change); + } + var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, + ch = pos.ch; + if (pos.line == change.to.line) { + ch += changeEnd(change).ch - change.to.ch; + } + return Pos(line, ch); + } + function computeSelAfterChange(doc, change) { + var out = []; + for (var i2 = 0; i2 < doc.sel.ranges.length; i2++) { + var range2 = doc.sel.ranges[i2]; + out.push(new Range(adjustForChange(range2.anchor, change), adjustForChange(range2.head, change))); + } + return normalizeSelection(doc.cm, out, doc.sel.primIndex); + } + function offsetPos(pos, old, nw) { + if (pos.line == old.line) { + return Pos(nw.line, pos.ch - old.ch + nw.ch); + } else { + return Pos(nw.line + (pos.line - old.line), pos.ch); + } + } + function computeReplacedSel(doc, changes, hint) { + var out = []; + var oldPrev = Pos(doc.first, 0), + newPrev = oldPrev; + for (var i2 = 0; i2 < changes.length; i2++) { + var change = changes[i2]; + var from = offsetPos(change.from, oldPrev, newPrev); + var to = offsetPos(changeEnd(change), oldPrev, newPrev); + oldPrev = change.to; + newPrev = to; + if (hint == "around") { + var range2 = doc.sel.ranges[i2], + inv = cmp(range2.head, range2.anchor) < 0; + out[i2] = new Range(inv ? to : from, inv ? from : to); + } else { + out[i2] = new Range(from, from); + } + } + return new Selection(out, doc.sel.primIndex); + } + function loadMode(cm) { + cm.doc.mode = getMode(cm.options, cm.doc.modeOption); + resetModeState(cm); + } + function resetModeState(cm) { + cm.doc.iter(function (line) { + if (line.stateAfter) { + line.stateAfter = null; + } + if (line.styles) { + line.styles = null; + } + }); + cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; + startWorker(cm, 100); + cm.state.modeGen++; + if (cm.curOp) { + regChange(cm); + } + } + function isWholeLineUpdate(doc, change) { + return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && (!doc.cm || doc.cm.options.wholeLineUpdateBefore); + } + function updateDoc(doc, change, markedSpans, estimateHeight2) { + function spansFor(n) { + return markedSpans ? markedSpans[n] : null; + } + function update(line, text2, spans) { + updateLine(line, text2, spans, estimateHeight2); + signalLater(line, "change", line, change); + } + function linesFor(start, end) { + var result = []; + for (var i2 = start; i2 < end; ++i2) { + result.push(new Line(text[i2], spansFor(i2), estimateHeight2)); + } + return result; + } + var from = change.from, + to = change.to, + text = change.text; + var firstLine = getLine(doc, from.line), + lastLine = getLine(doc, to.line); + var lastText = lst(text), + lastSpans = spansFor(text.length - 1), + nlines = to.line - from.line; + if (change.full) { + doc.insert(0, linesFor(0, text.length)); + doc.remove(text.length, doc.size - text.length); + } else if (isWholeLineUpdate(doc, change)) { + var added = linesFor(0, text.length - 1); + update(lastLine, lastLine.text, lastSpans); + if (nlines) { + doc.remove(from.line, nlines); + } + if (added.length) { + doc.insert(from.line, added); + } + } else if (firstLine == lastLine) { + if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); + } else { + var added$1 = linesFor(1, text.length - 1); + added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight2)); + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + doc.insert(from.line + 1, added$1); + } + } else if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); + doc.remove(from.line + 1, nlines); + } else { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); + var added$2 = linesFor(1, text.length - 1); + if (nlines > 1) { + doc.remove(from.line + 1, nlines - 1); + } + doc.insert(from.line + 1, added$2); + } + signalLater(doc, "change", doc, change); + } + function linkedDocs(doc, f, sharedHistOnly) { + function propagate(doc2, skip, sharedHist) { + if (doc2.linked) { + for (var i2 = 0; i2 < doc2.linked.length; ++i2) { + var rel = doc2.linked[i2]; + if (rel.doc == skip) { + continue; + } + var shared = sharedHist && rel.sharedHist; + if (sharedHistOnly && !shared) { + continue; + } + f(rel.doc, shared); + propagate(rel.doc, doc2, shared); + } + } + } + propagate(doc, null, true); + } + function attachDoc(cm, doc) { + if (doc.cm) { + throw new Error("This document is already in use."); + } + cm.doc = doc; + doc.cm = cm; + estimateLineHeights(cm); + loadMode(cm); + setDirectionClass(cm); + cm.options.direction = doc.direction; + if (!cm.options.lineWrapping) { + findMaxLine(cm); + } + cm.options.mode = doc.modeOption; + regChange(cm); + } + function setDirectionClass(cm) { + (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); + } + function directionChanged(cm) { + runInOp(cm, function () { + setDirectionClass(cm); + regChange(cm); + }); + } + function History(prev) { + this.done = []; + this.undone = []; + this.undoDepth = prev ? prev.undoDepth : Infinity; + this.lastModTime = this.lastSelTime = 0; + this.lastOp = this.lastSelOp = null; + this.lastOrigin = this.lastSelOrigin = null; + this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1; + } + function historyChangeFromChange(doc, change) { + var histChange = { + from: copyPos(change.from), + to: changeEnd(change), + text: getBetween(doc, change.from, change.to) + }; + attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); + linkedDocs(doc, function (doc2) { + return attachLocalSpans(doc2, histChange, change.from.line, change.to.line + 1); + }, true); + return histChange; + } + function clearSelectionEvents(array) { + while (array.length) { + var last = lst(array); + if (last.ranges) { + array.pop(); + } else { + break; + } + } + } + function lastChangeEvent(hist, force) { + if (force) { + clearSelectionEvents(hist.done); + return lst(hist.done); + } else if (hist.done.length && !lst(hist.done).ranges) { + return lst(hist.done); + } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { + hist.done.pop(); + return lst(hist.done); + } + } + function addChangeToHistory(doc, change, selAfter, opId) { + var hist = doc.history; + hist.undone.length = 0; + var time = + /* @__PURE__ */new Date(), + cur; + var last; + if ((hist.lastOp == opId || hist.lastOrigin == change.origin && change.origin && (change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500) || change.origin.charAt(0) == "*")) && (cur = lastChangeEvent(hist, hist.lastOp == opId))) { + last = lst(cur.changes); + if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { + last.to = changeEnd(change); + } else { + cur.changes.push(historyChangeFromChange(doc, change)); + } + } else { + var before = lst(hist.done); + if (!before || !before.ranges) { + pushSelectionToHistory(doc.sel, hist.done); + } + cur = { + changes: [historyChangeFromChange(doc, change)], + generation: hist.generation + }; + hist.done.push(cur); + while (hist.done.length > hist.undoDepth) { + hist.done.shift(); + if (!hist.done[0].ranges) { + hist.done.shift(); + } + } + } + hist.done.push(selAfter); + hist.generation = ++hist.maxGeneration; + hist.lastModTime = hist.lastSelTime = time; + hist.lastOp = hist.lastSelOp = opId; + hist.lastOrigin = hist.lastSelOrigin = change.origin; + if (!last) { + signal(doc, "historyAdded"); + } + } + function selectionEventCanBeMerged(doc, origin, prev, sel) { + var ch = origin.charAt(0); + return ch == "*" || ch == "+" && prev.ranges.length == sel.ranges.length && prev.somethingSelected() == sel.somethingSelected() && /* @__PURE__ */new Date() - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500); + } + function addSelectionToHistory(doc, sel, opId, options) { + var hist = doc.history, + origin = options && options.origin; + if (opId == hist.lastSelOp || origin && hist.lastSelOrigin == origin && (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))) { + hist.done[hist.done.length - 1] = sel; + } else { + pushSelectionToHistory(sel, hist.done); + } + hist.lastSelTime = + /* @__PURE__ */new Date(); + hist.lastSelOrigin = origin; + hist.lastSelOp = opId; + if (options && options.clearRedo !== false) { + clearSelectionEvents(hist.undone); + } + } + function pushSelectionToHistory(sel, dest) { + var top = lst(dest); + if (!(top && top.ranges && top.equals(sel))) { + dest.push(sel); + } + } + function attachLocalSpans(doc, change, from, to) { + var existing = change["spans_" + doc.id], + n = 0; + doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { + if (line.markedSpans) { + (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; + } + ++n; + }); + } + function removeClearedSpans(spans) { + if (!spans) { + return null; + } + var out; + for (var i2 = 0; i2 < spans.length; ++i2) { + if (spans[i2].marker.explicitlyCleared) { + if (!out) { + out = spans.slice(0, i2); + } + } else if (out) { + out.push(spans[i2]); + } + } + return !out ? spans : out.length ? out : null; + } + function getOldSpans(doc, change) { + var found = change["spans_" + doc.id]; + if (!found) { + return null; + } + var nw = []; + for (var i2 = 0; i2 < change.text.length; ++i2) { + nw.push(removeClearedSpans(found[i2])); + } + return nw; + } + function mergeOldSpans(doc, change) { + var old = getOldSpans(doc, change); + var stretched = stretchSpansOverChange(doc, change); + if (!old) { + return stretched; + } + if (!stretched) { + return old; + } + for (var i2 = 0; i2 < old.length; ++i2) { + var oldCur = old[i2], + stretchCur = stretched[i2]; + if (oldCur && stretchCur) { + spans: for (var j = 0; j < stretchCur.length; ++j) { + var span = stretchCur[j]; + for (var k = 0; k < oldCur.length; ++k) { + if (oldCur[k].marker == span.marker) { + continue spans; + } + } + oldCur.push(span); + } + } else if (stretchCur) { + old[i2] = stretchCur; + } + } + return old; + } + function copyHistoryArray(events, newGroup, instantiateSel) { + var copy = []; + for (var i2 = 0; i2 < events.length; ++i2) { + var event = events[i2]; + if (event.ranges) { + copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); + continue; + } + var changes = event.changes, + newChanges = []; + copy.push({ + changes: newChanges + }); + for (var j = 0; j < changes.length; ++j) { + var change = changes[j], + m = void 0; + newChanges.push({ + from: change.from, + to: change.to, + text: change.text + }); + if (newGroup) { + for (var prop2 in change) { + if (m = prop2.match(/^spans_(\d+)$/)) { + if (indexOf(newGroup, Number(m[1])) > -1) { + lst(newChanges)[prop2] = change[prop2]; + delete change[prop2]; + } + } + } + } + } + } + return copy; + } + function extendRange(range2, head, other, extend) { + if (extend) { + var anchor = range2.anchor; + if (other) { + var posBefore = cmp(head, anchor) < 0; + if (posBefore != cmp(other, anchor) < 0) { + anchor = head; + head = other; + } else if (posBefore != cmp(head, other) < 0) { + head = other; + } + } + return new Range(anchor, head); + } else { + return new Range(other || head, head); + } + } + function extendSelection(doc, head, other, options, extend) { + if (extend == null) { + extend = doc.cm && (doc.cm.display.shift || doc.extend); + } + setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options); + } + function extendSelections(doc, heads, options) { + var out = []; + var extend = doc.cm && (doc.cm.display.shift || doc.extend); + for (var i2 = 0; i2 < doc.sel.ranges.length; i2++) { + out[i2] = extendRange(doc.sel.ranges[i2], heads[i2], null, extend); + } + var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex); + setSelection(doc, newSel, options); + } + function replaceOneSelection(doc, i2, range2, options) { + var ranges = doc.sel.ranges.slice(0); + ranges[i2] = range2; + setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options); + } + function setSimpleSelection(doc, anchor, head, options) { + setSelection(doc, simpleSelection(anchor, head), options); + } + function filterSelectionChange(doc, sel, options) { + var obj = { + ranges: sel.ranges, + update: function (ranges) { + this.ranges = []; + for (var i2 = 0; i2 < ranges.length; i2++) { + this.ranges[i2] = new Range(clipPos(doc, ranges[i2].anchor), clipPos(doc, ranges[i2].head)); + } + }, + origin: options && options.origin + }; + signal(doc, "beforeSelectionChange", doc, obj); + if (doc.cm) { + signal(doc.cm, "beforeSelectionChange", doc.cm, obj); + } + if (obj.ranges != sel.ranges) { + return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1); + } else { + return sel; + } + } + function setSelectionReplaceHistory(doc, sel, options) { + var done = doc.history.done, + last = lst(done); + if (last && last.ranges) { + done[done.length - 1] = sel; + setSelectionNoUndo(doc, sel, options); + } else { + setSelection(doc, sel, options); + } + } + function setSelection(doc, sel, options) { + setSelectionNoUndo(doc, sel, options); + addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); + } + function setSelectionNoUndo(doc, sel, options) { + if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) { + sel = filterSelectionChange(doc, sel, options); + } + var bias = options && options.bias || (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); + setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); + if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption("readOnly") != "nocursor") { + ensureCursorVisible(doc.cm); + } + } + function setSelectionInner(doc, sel) { + if (sel.equals(doc.sel)) { + return; + } + doc.sel = sel; + if (doc.cm) { + doc.cm.curOp.updateInput = 1; + doc.cm.curOp.selectionChanged = true; + signalCursorActivity(doc.cm); + } + signalLater(doc, "cursorActivity", doc); + } + function reCheckSelection(doc) { + setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false)); + } + function skipAtomicInSelection(doc, sel, bias, mayClear) { + var out; + for (var i2 = 0; i2 < sel.ranges.length; i2++) { + var range2 = sel.ranges[i2]; + var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i2]; + var newAnchor = skipAtomic(doc, range2.anchor, old && old.anchor, bias, mayClear); + var newHead = skipAtomic(doc, range2.head, old && old.head, bias, mayClear); + if (out || newAnchor != range2.anchor || newHead != range2.head) { + if (!out) { + out = sel.ranges.slice(0, i2); + } + out[i2] = new Range(newAnchor, newHead); + } + } + return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel; + } + function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { + var line = getLine(doc, pos.line); + if (line.markedSpans) { + for (var i2 = 0; i2 < line.markedSpans.length; ++i2) { + var sp = line.markedSpans[i2], + m = sp.marker; + var preventCursorLeft = "selectLeft" in m ? !m.selectLeft : m.inclusiveLeft; + var preventCursorRight = "selectRight" in m ? !m.selectRight : m.inclusiveRight; + if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) { + if (mayClear) { + signal(m, "beforeCursorEnter"); + if (m.explicitlyCleared) { + if (!line.markedSpans) { + break; + } else { + --i2; + continue; + } + } + } + if (!m.atomic) { + continue; + } + if (oldPos) { + var near = m.find(dir < 0 ? 1 : -1), + diff = void 0; + if (dir < 0 ? preventCursorRight : preventCursorLeft) { + near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); + } + if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) { + return skipAtomicInner(doc, near, pos, dir, mayClear); + } + } + var far = m.find(dir < 0 ? -1 : 1); + if (dir < 0 ? preventCursorLeft : preventCursorRight) { + far = movePos(doc, far, dir, far.line == pos.line ? line : null); + } + return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null; + } + } + } + return pos; + } + function skipAtomic(doc, pos, oldPos, bias, mayClear) { + var dir = bias || 1; + var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || !mayClear && skipAtomicInner(doc, pos, oldPos, dir, true) || skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || !mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true); + if (!found) { + doc.cantEdit = true; + return Pos(doc.first, 0); + } + return found; + } + function movePos(doc, pos, dir, line) { + if (dir < 0 && pos.ch == 0) { + if (pos.line > doc.first) { + return clipPos(doc, Pos(pos.line - 1)); + } else { + return null; + } + } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { + if (pos.line < doc.first + doc.size - 1) { + return Pos(pos.line + 1, 0); + } else { + return null; + } + } else { + return new Pos(pos.line, pos.ch + dir); + } + } + function selectAll(cm) { + cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); + } + function filterChange(doc, change, update) { + var obj = { + canceled: false, + from: change.from, + to: change.to, + text: change.text, + origin: change.origin, + cancel: function () { + return obj.canceled = true; + } + }; + if (update) { + obj.update = function (from, to, text, origin) { + if (from) { + obj.from = clipPos(doc, from); + } + if (to) { + obj.to = clipPos(doc, to); + } + if (text) { + obj.text = text; + } + if (origin !== void 0) { + obj.origin = origin; + } + }; + } + signal(doc, "beforeChange", doc, obj); + if (doc.cm) { + signal(doc.cm, "beforeChange", doc.cm, obj); + } + if (obj.canceled) { + if (doc.cm) { + doc.cm.curOp.updateInput = 2; + } + return null; + } + return { + from: obj.from, + to: obj.to, + text: obj.text, + origin: obj.origin + }; + } + function makeChange(doc, change, ignoreReadOnly) { + if (doc.cm) { + if (!doc.cm.curOp) { + return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly); + } + if (doc.cm.state.suppressEdits) { + return; + } + } + if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { + change = filterChange(doc, change, true); + if (!change) { + return; + } + } + var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); + if (split) { + for (var i2 = split.length - 1; i2 >= 0; --i2) { + makeChangeInner(doc, { + from: split[i2].from, + to: split[i2].to, + text: i2 ? [""] : change.text, + origin: change.origin + }); + } + } else { + makeChangeInner(doc, change); + } + } + function makeChangeInner(doc, change) { + if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { + return; + } + var selAfter = computeSelAfterChange(doc, change); + addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); + makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); + var rebased = []; + linkedDocs(doc, function (doc2, sharedHist) { + if (!sharedHist && indexOf(rebased, doc2.history) == -1) { + rebaseHist(doc2.history, change); + rebased.push(doc2.history); + } + makeChangeSingleDoc(doc2, change, null, stretchSpansOverChange(doc2, change)); + }); + } + function makeChangeFromHistory(doc, type, allowSelectionOnly) { + var suppress = doc.cm && doc.cm.state.suppressEdits; + if (suppress && !allowSelectionOnly) { + return; + } + var hist = doc.history, + event, + selAfter = doc.sel; + var source = type == "undo" ? hist.done : hist.undone, + dest = type == "undo" ? hist.undone : hist.done; + var i2 = 0; + for (; i2 < source.length; i2++) { + event = source[i2]; + if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) { + break; + } + } + if (i2 == source.length) { + return; + } + hist.lastOrigin = hist.lastSelOrigin = null; + for (;;) { + event = source.pop(); + if (event.ranges) { + pushSelectionToHistory(event, dest); + if (allowSelectionOnly && !event.equals(doc.sel)) { + setSelection(doc, event, { + clearRedo: false + }); + return; + } + selAfter = event; + } else if (suppress) { + source.push(event); + return; + } else { + break; + } + } + var antiChanges = []; + pushSelectionToHistory(selAfter, dest); + dest.push({ + changes: antiChanges, + generation: hist.generation + }); + hist.generation = event.generation || ++hist.maxGeneration; + var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); + var loop = function (i3) { + var change = event.changes[i3]; + change.origin = type; + if (filter && !filterChange(doc, change, false)) { + source.length = 0; + return {}; + } + antiChanges.push(historyChangeFromChange(doc, change)); + var after = i3 ? computeSelAfterChange(doc, change) : lst(source); + makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); + if (!i3 && doc.cm) { + doc.cm.scrollIntoView({ + from: change.from, + to: changeEnd(change) + }); + } + var rebased = []; + linkedDocs(doc, function (doc2, sharedHist) { + if (!sharedHist && indexOf(rebased, doc2.history) == -1) { + rebaseHist(doc2.history, change); + rebased.push(doc2.history); + } + makeChangeSingleDoc(doc2, change, null, mergeOldSpans(doc2, change)); + }); + }; + for (var i$12 = event.changes.length - 1; i$12 >= 0; --i$12) { + var returned = loop(i$12); + if (returned) return returned.v; + } + } + function shiftDoc(doc, distance) { + if (distance == 0) { + return; + } + doc.first += distance; + doc.sel = new Selection(map(doc.sel.ranges, function (range2) { + return new Range(Pos(range2.anchor.line + distance, range2.anchor.ch), Pos(range2.head.line + distance, range2.head.ch)); + }), doc.sel.primIndex); + if (doc.cm) { + regChange(doc.cm, doc.first, doc.first - distance, distance); + for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) { + regLineChange(doc.cm, l, "gutter"); + } + } + } + function makeChangeSingleDoc(doc, change, selAfter, spans) { + if (doc.cm && !doc.cm.curOp) { + return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans); + } + if (change.to.line < doc.first) { + shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); + return; + } + if (change.from.line > doc.lastLine()) { + return; + } + if (change.from.line < doc.first) { + var shift = change.text.length - 1 - (doc.first - change.from.line); + shiftDoc(doc, shift); + change = { + from: Pos(doc.first, 0), + to: Pos(change.to.line + shift, change.to.ch), + text: [lst(change.text)], + origin: change.origin + }; + } + var last = doc.lastLine(); + if (change.to.line > last) { + change = { + from: change.from, + to: Pos(last, getLine(doc, last).text.length), + text: [change.text[0]], + origin: change.origin + }; + } + change.removed = getBetween(doc, change.from, change.to); + if (!selAfter) { + selAfter = computeSelAfterChange(doc, change); + } + if (doc.cm) { + makeChangeSingleDocInEditor(doc.cm, change, spans); + } else { + updateDoc(doc, change, spans); + } + setSelectionNoUndo(doc, selAfter, sel_dontScroll); + if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0))) { + doc.cantEdit = false; + } + } + function makeChangeSingleDocInEditor(cm, change, spans) { + var doc = cm.doc, + display = cm.display, + from = change.from, + to = change.to; + var recomputeMaxLength = false, + checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); + doc.iter(checkWidthStart, to.line + 1, function (line) { + if (line == display.maxLine) { + recomputeMaxLength = true; + return true; + } + }); + } + if (doc.sel.contains(change.from, change.to) > -1) { + signalCursorActivity(cm); + } + updateDoc(doc, change, spans, estimateHeight(cm)); + if (!cm.options.lineWrapping) { + doc.iter(checkWidthStart, from.line + change.text.length, function (line) { + var len = lineLength(line); + if (len > display.maxLineLength) { + display.maxLine = line; + display.maxLineLength = len; + display.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) { + cm.curOp.updateMaxLine = true; + } + } + retreatFrontier(doc, from.line); + startWorker(cm, 400); + var lendiff = change.text.length - (to.line - from.line) - 1; + if (change.full) { + regChange(cm); + } else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) { + regLineChange(cm, from.line, "text"); + } else { + regChange(cm, from.line, to.line + 1, lendiff); + } + var changesHandler = hasHandler(cm, "changes"), + changeHandler = hasHandler(cm, "change"); + if (changeHandler || changesHandler) { + var obj = { + from, + to, + text: change.text, + removed: change.removed, + origin: change.origin + }; + if (changeHandler) { + signalLater(cm, "change", cm, obj); + } + if (changesHandler) { + (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); + } + } + cm.display.selForContextMenu = null; + } + function replaceRange(doc, code, from, to, origin) { + var assign; + if (!to) { + to = from; + } + if (cmp(to, from) < 0) { + assign = [to, from], from = assign[0], to = assign[1]; + } + if (typeof code == "string") { + code = doc.splitLines(code); + } + makeChange(doc, { + from, + to, + text: code, + origin + }); + } + function rebaseHistSelSingle(pos, from, to, diff) { + if (to < pos.line) { + pos.line += diff; + } else if (from < pos.line) { + pos.line = from; + pos.ch = 0; + } + } + function rebaseHistArray(array, from, to, diff) { + for (var i2 = 0; i2 < array.length; ++i2) { + var sub = array[i2], + ok = true; + if (sub.ranges) { + if (!sub.copied) { + sub = array[i2] = sub.deepCopy(); + sub.copied = true; + } + for (var j = 0; j < sub.ranges.length; j++) { + rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); + rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); + } + continue; + } + for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { + var cur = sub.changes[j$1]; + if (to < cur.from.line) { + cur.from = Pos(cur.from.line + diff, cur.from.ch); + cur.to = Pos(cur.to.line + diff, cur.to.ch); + } else if (from <= cur.to.line) { + ok = false; + break; + } + } + if (!ok) { + array.splice(0, i2 + 1); + i2 = 0; + } + } + } + function rebaseHist(hist, change) { + var from = change.from.line, + to = change.to.line, + diff = change.text.length - (to - from) - 1; + rebaseHistArray(hist.done, from, to, diff); + rebaseHistArray(hist.undone, from, to, diff); + } + function changeLine(doc, handle, changeType, op) { + var no = handle, + line = handle; + if (typeof handle == "number") { + line = getLine(doc, clipLine(doc, handle)); + } else { + no = lineNo(handle); + } + if (no == null) { + return null; + } + if (op(line, no) && doc.cm) { + regLineChange(doc.cm, no, changeType); + } + return line; + } + function LeafChunk(lines) { + this.lines = lines; + this.parent = null; + var height = 0; + for (var i2 = 0; i2 < lines.length; ++i2) { + lines[i2].parent = this; + height += lines[i2].height; + } + this.height = height; + } + LeafChunk.prototype = { + chunkSize: function () { + return this.lines.length; + }, + // Remove the n lines at offset 'at'. + removeInner: function (at, n) { + for (var i2 = at, e = at + n; i2 < e; ++i2) { + var line = this.lines[i2]; + this.height -= line.height; + cleanUpLine(line); + signalLater(line, "delete"); + } + this.lines.splice(at, n); + }, + // Helper used to collapse a small branch into a single leaf. + collapse: function (lines) { + lines.push.apply(lines, this.lines); + }, + // Insert the given array of lines at offset 'at', count them as + // having the given height. + insertInner: function (at, lines, height) { + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i2 = 0; i2 < lines.length; ++i2) { + lines[i2].parent = this; + } + }, + // Used to iterate over a part of the tree. + iterN: function (at, n, op) { + for (var e = at + n; at < e; ++at) { + if (op(this.lines[at])) { + return true; + } + } + } + }; + function BranchChunk(children) { + this.children = children; + var size = 0, + height = 0; + for (var i2 = 0; i2 < children.length; ++i2) { + var ch = children[i2]; + size += ch.chunkSize(); + height += ch.height; + ch.parent = this; + } + this.size = size; + this.height = height; + this.parent = null; + } + BranchChunk.prototype = { + chunkSize: function () { + return this.size; + }, + removeInner: function (at, n) { + this.size -= n; + for (var i2 = 0; i2 < this.children.length; ++i2) { + var child = this.children[i2], + sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), + oldHeight = child.height; + child.removeInner(at, rm); + this.height -= oldHeight - child.height; + if (sz == rm) { + this.children.splice(i2--, 1); + child.parent = null; + } + if ((n -= rm) == 0) { + break; + } + at = 0; + } else { + at -= sz; + } + } + if (this.size - n < 25 && (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + collapse: function (lines) { + for (var i2 = 0; i2 < this.children.length; ++i2) { + this.children[i2].collapse(lines); + } + }, + insertInner: function (at, lines, height) { + this.size += lines.length; + this.height += height; + for (var i2 = 0; i2 < this.children.length; ++i2) { + var child = this.children[i2], + sz = child.chunkSize(); + if (at <= sz) { + child.insertInner(at, lines, height); + if (child.lines && child.lines.length > 50) { + var remaining = child.lines.length % 25 + 25; + for (var pos = remaining; pos < child.lines.length;) { + var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); + child.height -= leaf.height; + this.children.splice(++i2, 0, leaf); + leaf.parent = this; + } + child.lines = child.lines.slice(0, remaining); + this.maybeSpill(); + } + break; + } + at -= sz; + } + }, + // When a node has grown, check whether it should be split. + maybeSpill: function () { + if (this.children.length <= 10) { + return; + } + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10); + me.parent.maybeSpill(); + }, + iterN: function (at, n, op) { + for (var i2 = 0; i2 < this.children.length; ++i2) { + var child = this.children[i2], + sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) { + return true; + } + if ((n -= used) == 0) { + break; + } + at = 0; + } else { + at -= sz; + } + } + } + }; + var LineWidget = function (doc, node, options) { + if (options) { + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this[opt] = options[opt]; + } + } + } + this.doc = doc; + this.node = node; + }; + LineWidget.prototype.clear = function () { + var cm = this.doc.cm, + ws = this.line.widgets, + line = this.line, + no = lineNo(line); + if (no == null || !ws) { + return; + } + for (var i2 = 0; i2 < ws.length; ++i2) { + if (ws[i2] == this) { + ws.splice(i2--, 1); + } + } + if (!ws.length) { + line.widgets = null; + } + var height = widgetHeight(this); + updateLineHeight(line, Math.max(0, line.height - height)); + if (cm) { + runInOp(cm, function () { + adjustScrollWhenAboveVisible(cm, line, -height); + regLineChange(cm, no, "widget"); + }); + signalLater(cm, "lineWidgetCleared", cm, this, no); + } + }; + LineWidget.prototype.changed = function () { + var this$1$1 = this; + var oldH = this.height, + cm = this.doc.cm, + line = this.line; + this.height = null; + var diff = widgetHeight(this) - oldH; + if (!diff) { + return; + } + if (!lineIsHidden(this.doc, line)) { + updateLineHeight(line, line.height + diff); + } + if (cm) { + runInOp(cm, function () { + cm.curOp.forceUpdate = true; + adjustScrollWhenAboveVisible(cm, line, diff); + signalLater(cm, "lineWidgetChanged", cm, this$1$1, lineNo(line)); + }); + } + }; + eventMixin(LineWidget); + function adjustScrollWhenAboveVisible(cm, line, diff) { + if (heightAtLine(line) < (cm.curOp && cm.curOp.scrollTop || cm.doc.scrollTop)) { + addToScrollTop(cm, diff); + } + } + function addLineWidget(doc, handle, node, options) { + var widget = new LineWidget(doc, node, options); + var cm = doc.cm; + if (cm && widget.noHScroll) { + cm.display.alignWidgets = true; + } + changeLine(doc, handle, "widget", function (line) { + var widgets = line.widgets || (line.widgets = []); + if (widget.insertAt == null) { + widgets.push(widget); + } else { + widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); + } + widget.line = line; + if (cm && !lineIsHidden(doc, line)) { + var aboveVisible = heightAtLine(line) < doc.scrollTop; + updateLineHeight(line, line.height + widgetHeight(widget)); + if (aboveVisible) { + addToScrollTop(cm, widget.height); + } + cm.curOp.forceUpdate = true; + } + return true; + }); + if (cm) { + signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); + } + return widget; + } + var nextMarkerId = 0; + var TextMarker = function (doc, type) { + this.lines = []; + this.type = type; + this.doc = doc; + this.id = ++nextMarkerId; + }; + TextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { + return; + } + var cm = this.doc.cm, + withOp = cm && !cm.curOp; + if (withOp) { + startOperation(cm); + } + if (hasHandler(this, "clear")) { + var found = this.find(); + if (found) { + signalLater(this, "clear", found.from, found.to); + } + } + var min = null, + max = null; + for (var i2 = 0; i2 < this.lines.length; ++i2) { + var line = this.lines[i2]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (cm && !this.collapsed) { + regLineChange(cm, lineNo(line), "text"); + } else if (cm) { + if (span.to != null) { + max = lineNo(line); + } + if (span.from != null) { + min = lineNo(line); + } + } + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm) { + updateLineHeight(line, textHeight(cm.display)); + } + } + if (cm && this.collapsed && !cm.options.lineWrapping) { + for (var i$12 = 0; i$12 < this.lines.length; ++i$12) { + var visual = visualLine(this.lines[i$12]), + len = lineLength(visual); + if (len > cm.display.maxLineLength) { + cm.display.maxLine = visual; + cm.display.maxLineLength = len; + cm.display.maxLineChanged = true; + } + } + } + if (min != null && cm && this.collapsed) { + regChange(cm, min, max + 1); + } + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.atomic && this.doc.cantEdit) { + this.doc.cantEdit = false; + if (cm) { + reCheckSelection(cm.doc); + } + } + if (cm) { + signalLater(cm, "markerCleared", cm, this, min, max); + } + if (withOp) { + endOperation(cm); + } + if (this.parent) { + this.parent.clear(); + } + }; + TextMarker.prototype.find = function (side, lineObj) { + if (side == null && this.type == "bookmark") { + side = 1; + } + var from, to; + for (var i2 = 0; i2 < this.lines.length; ++i2) { + var line = this.lines[i2]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.from != null) { + from = Pos(lineObj ? line : lineNo(line), span.from); + if (side == -1) { + return from; + } + } + if (span.to != null) { + to = Pos(lineObj ? line : lineNo(line), span.to); + if (side == 1) { + return to; + } + } + } + return from && { + from, + to + }; + }; + TextMarker.prototype.changed = function () { + var this$1$1 = this; + var pos = this.find(-1, true), + widget = this, + cm = this.doc.cm; + if (!pos || !cm) { + return; + } + runInOp(cm, function () { + var line = pos.line, + lineN = lineNo(pos.line); + var view = findViewForLine(cm, lineN); + if (view) { + clearLineMeasurementCacheFor(view); + cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; + } + cm.curOp.updateMaxLine = true; + if (!lineIsHidden(widget.doc, line) && widget.height != null) { + var oldHeight = widget.height; + widget.height = null; + var dHeight = widgetHeight(widget) - oldHeight; + if (dHeight) { + updateLineHeight(line, line.height + dHeight); + } + } + signalLater(cm, "markerChanged", cm, this$1$1); + }); + }; + TextMarker.prototype.attachLine = function (line) { + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) { + (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); + } + } + this.lines.push(line); + }; + TextMarker.prototype.detachLine = function (line) { + this.lines.splice(indexOf(this.lines, line), 1); + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); + } + }; + eventMixin(TextMarker); + function markText(doc, from, to, options, type) { + if (options && options.shared) { + return markTextShared(doc, from, to, options, type); + } + if (doc.cm && !doc.cm.curOp) { + return operation(doc.cm, markText)(doc, from, to, options, type); + } + var marker = new TextMarker(doc, type), + diff = cmp(from, to); + if (options) { + copyObj(options, marker, false); + } + if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) { + return marker; + } + if (marker.replacedWith) { + marker.collapsed = true; + marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); + if (!options.handleMouseEvents) { + marker.widgetNode.setAttribute("cm-ignore-events", "true"); + } + if (options.insertLeft) { + marker.widgetNode.insertLeft = true; + } + } + if (marker.collapsed) { + if (conflictingCollapsedRange(doc, from.line, from, to, marker) || from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) { + throw new Error("Inserting collapsed marker partially overlapping an existing one"); + } + seeCollapsedSpans(); + } + if (marker.addToHistory) { + addChangeToHistory(doc, { + from, + to, + origin: "markText" + }, doc.sel, NaN); + } + var curLine = from.line, + cm = doc.cm, + updateMaxLine; + doc.iter(curLine, to.line + 1, function (line) { + if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) { + updateMaxLine = true; + } + if (marker.collapsed && curLine != from.line) { + updateLineHeight(line, 0); + } + addMarkedSpan(line, new MarkedSpan(marker, curLine == from.line ? from.ch : null, curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp); + ++curLine; + }); + if (marker.collapsed) { + doc.iter(from.line, to.line + 1, function (line) { + if (lineIsHidden(doc, line)) { + updateLineHeight(line, 0); + } + }); + } + if (marker.clearOnEnter) { + on(marker, "beforeCursorEnter", function () { + return marker.clear(); + }); + } + if (marker.readOnly) { + seeReadOnlySpans(); + if (doc.history.done.length || doc.history.undone.length) { + doc.clearHistory(); + } + } + if (marker.collapsed) { + marker.id = ++nextMarkerId; + marker.atomic = true; + } + if (cm) { + if (updateMaxLine) { + cm.curOp.updateMaxLine = true; + } + if (marker.collapsed) { + regChange(cm, from.line, to.line + 1); + } else if (marker.className || marker.startStyle || marker.endStyle || marker.css || marker.attributes || marker.title) { + for (var i2 = from.line; i2 <= to.line; i2++) { + regLineChange(cm, i2, "text"); + } + } + if (marker.atomic) { + reCheckSelection(cm.doc); + } + signalLater(cm, "markerAdded", cm, marker); + } + return marker; + } + var SharedTextMarker = function (markers, primary) { + this.markers = markers; + this.primary = primary; + for (var i2 = 0; i2 < markers.length; ++i2) { + markers[i2].parent = this; + } + }; + SharedTextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { + return; + } + this.explicitlyCleared = true; + for (var i2 = 0; i2 < this.markers.length; ++i2) { + this.markers[i2].clear(); + } + signalLater(this, "clear"); + }; + SharedTextMarker.prototype.find = function (side, lineObj) { + return this.primary.find(side, lineObj); + }; + eventMixin(SharedTextMarker); + function markTextShared(doc, from, to, options, type) { + options = copyObj(options); + options.shared = false; + var markers = [markText(doc, from, to, options, type)], + primary = markers[0]; + var widget = options.widgetNode; + linkedDocs(doc, function (doc2) { + if (widget) { + options.widgetNode = widget.cloneNode(true); + } + markers.push(markText(doc2, clipPos(doc2, from), clipPos(doc2, to), options, type)); + for (var i2 = 0; i2 < doc2.linked.length; ++i2) { + if (doc2.linked[i2].isParent) { + return; + } + } + primary = lst(markers); + }); + return new SharedTextMarker(markers, primary); + } + function findSharedMarkers(doc) { + return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { + return m.parent; + }); + } + function copySharedMarkers(doc, markers) { + for (var i2 = 0; i2 < markers.length; i2++) { + var marker = markers[i2], + pos = marker.find(); + var mFrom = doc.clipPos(pos.from), + mTo = doc.clipPos(pos.to); + if (cmp(mFrom, mTo)) { + var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); + marker.markers.push(subMark); + subMark.parent = marker; + } + } + } + function detachSharedMarkers(markers) { + var loop = function (i3) { + var marker = markers[i3], + linked = [marker.primary.doc]; + linkedDocs(marker.primary.doc, function (d) { + return linked.push(d); + }); + for (var j = 0; j < marker.markers.length; j++) { + var subMarker = marker.markers[j]; + if (indexOf(linked, subMarker.doc) == -1) { + subMarker.parent = null; + marker.markers.splice(j--, 1); + } + } + }; + for (var i2 = 0; i2 < markers.length; i2++) loop(i2); + } + var nextDocId = 0; + var Doc = function (text, mode, firstLine, lineSep, direction) { + if (!(this instanceof Doc)) { + return new Doc(text, mode, firstLine, lineSep, direction); + } + if (firstLine == null) { + firstLine = 0; + } + BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); + this.first = firstLine; + this.scrollTop = this.scrollLeft = 0; + this.cantEdit = false; + this.cleanGeneration = 1; + this.modeFrontier = this.highlightFrontier = firstLine; + var start = Pos(firstLine, 0); + this.sel = simpleSelection(start); + this.history = new History(null); + this.id = ++nextDocId; + this.modeOption = mode; + this.lineSep = lineSep; + this.direction = direction == "rtl" ? "rtl" : "ltr"; + this.extend = false; + if (typeof text == "string") { + text = this.splitLines(text); + } + updateDoc(this, { + from: start, + to: start, + text + }); + setSelection(this, simpleSelection(start), sel_dontScroll); + }; + Doc.prototype = createObj(BranchChunk.prototype, { + constructor: Doc, + // Iterate over the document. Supports two forms -- with only one + // argument, it calls that for each line in the document. With + // three, it iterates over the range given by the first two (with + // the second being non-inclusive). + iter: function (from, to, op) { + if (op) { + this.iterN(from - this.first, to - from, op); + } else { + this.iterN(this.first, this.first + this.size, from); + } + }, + // Non-public interface for adding and removing lines. + insert: function (at, lines) { + var height = 0; + for (var i2 = 0; i2 < lines.length; ++i2) { + height += lines[i2].height; + } + this.insertInner(at - this.first, lines, height); + }, + remove: function (at, n) { + this.removeInner(at - this.first, n); + }, + // From here, the methods are part of the public interface. Most + // are also available from CodeMirror (editor) instances. + getValue: function (lineSep) { + var lines = getLines(this, this.first, this.first + this.size); + if (lineSep === false) { + return lines; + } + return lines.join(lineSep || this.lineSeparator()); + }, + setValue: docMethodOp(function (code) { + var top = Pos(this.first, 0), + last = this.first + this.size - 1; + makeChange(this, { + from: top, + to: Pos(last, getLine(this, last).text.length), + text: this.splitLines(code), + origin: "setValue", + full: true + }, true); + if (this.cm) { + scrollToCoords(this.cm, 0, 0); + } + setSelection(this, simpleSelection(top), sel_dontScroll); + }), + replaceRange: function (code, from, to, origin) { + from = clipPos(this, from); + to = to ? clipPos(this, to) : from; + replaceRange(this, code, from, to, origin); + }, + getRange: function (from, to, lineSep) { + var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); + if (lineSep === false) { + return lines; + } + if (lineSep === "") { + return lines.join(""); + } + return lines.join(lineSep || this.lineSeparator()); + }, + getLine: function (line) { + var l = this.getLineHandle(line); + return l && l.text; + }, + getLineHandle: function (line) { + if (isLine(this, line)) { + return getLine(this, line); + } + }, + getLineNumber: function (line) { + return lineNo(line); + }, + getLineHandleVisualStart: function (line) { + if (typeof line == "number") { + line = getLine(this, line); + } + return visualLine(line); + }, + lineCount: function () { + return this.size; + }, + firstLine: function () { + return this.first; + }, + lastLine: function () { + return this.first + this.size - 1; + }, + clipPos: function (pos) { + return clipPos(this, pos); + }, + getCursor: function (start) { + var range2 = this.sel.primary(), + pos; + if (start == null || start == "head") { + pos = range2.head; + } else if (start == "anchor") { + pos = range2.anchor; + } else if (start == "end" || start == "to" || start === false) { + pos = range2.to(); + } else { + pos = range2.from(); + } + return pos; + }, + listSelections: function () { + return this.sel.ranges; + }, + somethingSelected: function () { + return this.sel.somethingSelected(); + }, + setCursor: docMethodOp(function (line, ch, options) { + setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); + }), + setSelection: docMethodOp(function (anchor, head, options) { + setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); + }), + extendSelection: docMethodOp(function (head, other, options) { + extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); + }), + extendSelections: docMethodOp(function (heads, options) { + extendSelections(this, clipPosArray(this, heads), options); + }), + extendSelectionsBy: docMethodOp(function (f, options) { + var heads = map(this.sel.ranges, f); + extendSelections(this, clipPosArray(this, heads), options); + }), + setSelections: docMethodOp(function (ranges, primary, options) { + if (!ranges.length) { + return; + } + var out = []; + for (var i2 = 0; i2 < ranges.length; i2++) { + out[i2] = new Range(clipPos(this, ranges[i2].anchor), clipPos(this, ranges[i2].head || ranges[i2].anchor)); + } + if (primary == null) { + primary = Math.min(ranges.length - 1, this.sel.primIndex); + } + setSelection(this, normalizeSelection(this.cm, out, primary), options); + }), + addSelection: docMethodOp(function (anchor, head, options) { + var ranges = this.sel.ranges.slice(0); + ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); + setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options); + }), + getSelection: function (lineSep) { + var ranges = this.sel.ranges, + lines; + for (var i2 = 0; i2 < ranges.length; i2++) { + var sel = getBetween(this, ranges[i2].from(), ranges[i2].to()); + lines = lines ? lines.concat(sel) : sel; + } + if (lineSep === false) { + return lines; + } else { + return lines.join(lineSep || this.lineSeparator()); + } + }, + getSelections: function (lineSep) { + var parts = [], + ranges = this.sel.ranges; + for (var i2 = 0; i2 < ranges.length; i2++) { + var sel = getBetween(this, ranges[i2].from(), ranges[i2].to()); + if (lineSep !== false) { + sel = sel.join(lineSep || this.lineSeparator()); + } + parts[i2] = sel; + } + return parts; + }, + replaceSelection: function (code, collapse, origin) { + var dup = []; + for (var i2 = 0; i2 < this.sel.ranges.length; i2++) { + dup[i2] = code; + } + this.replaceSelections(dup, collapse, origin || "+input"); + }, + replaceSelections: docMethodOp(function (code, collapse, origin) { + var changes = [], + sel = this.sel; + for (var i2 = 0; i2 < sel.ranges.length; i2++) { + var range2 = sel.ranges[i2]; + changes[i2] = { + from: range2.from(), + to: range2.to(), + text: this.splitLines(code[i2]), + origin + }; + } + var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); + for (var i$12 = changes.length - 1; i$12 >= 0; i$12--) { + makeChange(this, changes[i$12]); + } + if (newSel) { + setSelectionReplaceHistory(this, newSel); + } else if (this.cm) { + ensureCursorVisible(this.cm); + } + }), + undo: docMethodOp(function () { + makeChangeFromHistory(this, "undo"); + }), + redo: docMethodOp(function () { + makeChangeFromHistory(this, "redo"); + }), + undoSelection: docMethodOp(function () { + makeChangeFromHistory(this, "undo", true); + }), + redoSelection: docMethodOp(function () { + makeChangeFromHistory(this, "redo", true); + }), + setExtending: function (val) { + this.extend = val; + }, + getExtending: function () { + return this.extend; + }, + historySize: function () { + var hist = this.history, + done = 0, + undone = 0; + for (var i2 = 0; i2 < hist.done.length; i2++) { + if (!hist.done[i2].ranges) { + ++done; + } + } + for (var i$12 = 0; i$12 < hist.undone.length; i$12++) { + if (!hist.undone[i$12].ranges) { + ++undone; + } + } + return { + undo: done, + redo: undone + }; + }, + clearHistory: function () { + var this$1$1 = this; + this.history = new History(this.history); + linkedDocs(this, function (doc) { + return doc.history = this$1$1.history; + }, true); + }, + markClean: function () { + this.cleanGeneration = this.changeGeneration(true); + }, + changeGeneration: function (forceSplit) { + if (forceSplit) { + this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; + } + return this.history.generation; + }, + isClean: function (gen) { + return this.history.generation == (gen || this.cleanGeneration); + }, + getHistory: function () { + return { + done: copyHistoryArray(this.history.done), + undone: copyHistoryArray(this.history.undone) + }; + }, + setHistory: function (histData) { + var hist = this.history = new History(this.history); + hist.done = copyHistoryArray(histData.done.slice(0), null, true); + hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); + }, + setGutterMarker: docMethodOp(function (line, gutterID, value) { + return changeLine(this, line, "gutter", function (line2) { + var markers = line2.gutterMarkers || (line2.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) { + line2.gutterMarkers = null; + } + return true; + }); + }), + clearGutter: docMethodOp(function (gutterID) { + var this$1$1 = this; + this.iter(function (line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + changeLine(this$1$1, line, "gutter", function () { + line.gutterMarkers[gutterID] = null; + if (isEmpty(line.gutterMarkers)) { + line.gutterMarkers = null; + } + return true; + }); + } + }); + }), + lineInfo: function (line) { + var n; + if (typeof line == "number") { + if (!isLine(this, line)) { + return null; + } + n = line; + line = getLine(this, line); + if (!line) { + return null; + } + } else { + n = lineNo(line); + if (n == null) { + return null; + } + } + return { + line: n, + handle: line, + text: line.text, + gutterMarkers: line.gutterMarkers, + textClass: line.textClass, + bgClass: line.bgClass, + wrapClass: line.wrapClass, + widgets: line.widgets + }; + }, + addLineClass: docMethodOp(function (handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop2 = where == "text" ? "textClass" : where == "background" ? "bgClass" : where == "gutter" ? "gutterClass" : "wrapClass"; + if (!line[prop2]) { + line[prop2] = cls; + } else if (classTest(cls).test(line[prop2])) { + return false; + } else { + line[prop2] += " " + cls; + } + return true; + }); + }), + removeLineClass: docMethodOp(function (handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop2 = where == "text" ? "textClass" : where == "background" ? "bgClass" : where == "gutter" ? "gutterClass" : "wrapClass"; + var cur = line[prop2]; + if (!cur) { + return false; + } else if (cls == null) { + line[prop2] = null; + } else { + var found = cur.match(classTest(cls)); + if (!found) { + return false; + } + var end = found.index + found[0].length; + line[prop2] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; + } + return true; + }); + }), + addLineWidget: docMethodOp(function (handle, node, options) { + return addLineWidget(this, handle, node, options); + }), + removeLineWidget: function (widget) { + widget.clear(); + }, + markText: function (from, to, options) { + return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range"); + }, + setBookmark: function (pos, options) { + var realOpts = { + replacedWith: options && (options.nodeType == null ? options.widget : options), + insertLeft: options && options.insertLeft, + clearWhenEmpty: false, + shared: options && options.shared, + handleMouseEvents: options && options.handleMouseEvents + }; + pos = clipPos(this, pos); + return markText(this, pos, pos, realOpts, "bookmark"); + }, + findMarksAt: function (pos) { + pos = clipPos(this, pos); + var markers = [], + spans = getLine(this, pos.line).markedSpans; + if (spans) { + for (var i2 = 0; i2 < spans.length; ++i2) { + var span = spans[i2]; + if ((span.from == null || span.from <= pos.ch) && (span.to == null || span.to >= pos.ch)) { + markers.push(span.marker.parent || span.marker); + } + } + } + return markers; + }, + findMarks: function (from, to, filter) { + from = clipPos(this, from); + to = clipPos(this, to); + var found = [], + lineNo2 = from.line; + this.iter(from.line, to.line + 1, function (line) { + var spans = line.markedSpans; + if (spans) { + for (var i2 = 0; i2 < spans.length; i2++) { + var span = spans[i2]; + if (!(span.to != null && lineNo2 == from.line && from.ch >= span.to || span.from == null && lineNo2 != from.line || span.from != null && lineNo2 == to.line && span.from >= to.ch) && (!filter || filter(span.marker))) { + found.push(span.marker.parent || span.marker); + } + } + } + ++lineNo2; + }); + return found; + }, + getAllMarks: function () { + var markers = []; + this.iter(function (line) { + var sps = line.markedSpans; + if (sps) { + for (var i2 = 0; i2 < sps.length; ++i2) { + if (sps[i2].from != null) { + markers.push(sps[i2].marker); + } + } + } + }); + return markers; + }, + posFromIndex: function (off2) { + var ch, + lineNo2 = this.first, + sepSize = this.lineSeparator().length; + this.iter(function (line) { + var sz = line.text.length + sepSize; + if (sz > off2) { + ch = off2; + return true; + } + off2 -= sz; + ++lineNo2; + }); + return clipPos(this, Pos(lineNo2, ch)); + }, + indexFromPos: function (coords) { + coords = clipPos(this, coords); + var index = coords.ch; + if (coords.line < this.first || coords.ch < 0) { + return 0; + } + var sepSize = this.lineSeparator().length; + this.iter(this.first, coords.line, function (line) { + index += line.text.length + sepSize; + }); + return index; + }, + copy: function (copyHistory) { + var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first, this.lineSep, this.direction); + doc.scrollTop = this.scrollTop; + doc.scrollLeft = this.scrollLeft; + doc.sel = this.sel; + doc.extend = false; + if (copyHistory) { + doc.history.undoDepth = this.history.undoDepth; + doc.setHistory(this.getHistory()); + } + return doc; + }, + linkedDoc: function (options) { + if (!options) { + options = {}; + } + var from = this.first, + to = this.first + this.size; + if (options.from != null && options.from > from) { + from = options.from; + } + if (options.to != null && options.to < to) { + to = options.to; + } + var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); + if (options.sharedHist) { + copy.history = this.history; + } + (this.linked || (this.linked = [])).push({ + doc: copy, + sharedHist: options.sharedHist + }); + copy.linked = [{ + doc: this, + isParent: true, + sharedHist: options.sharedHist + }]; + copySharedMarkers(copy, findSharedMarkers(this)); + return copy; + }, + unlinkDoc: function (other) { + if (other instanceof CodeMirror) { + other = other.doc; + } + if (this.linked) { + for (var i2 = 0; i2 < this.linked.length; ++i2) { + var link = this.linked[i2]; + if (link.doc != other) { + continue; + } + this.linked.splice(i2, 1); + other.unlinkDoc(this); + detachSharedMarkers(findSharedMarkers(this)); + break; + } + } + if (other.history == this.history) { + var splitIds = [other.id]; + linkedDocs(other, function (doc) { + return splitIds.push(doc.id); + }, true); + other.history = new History(null); + other.history.done = copyHistoryArray(this.history.done, splitIds); + other.history.undone = copyHistoryArray(this.history.undone, splitIds); + } + }, + iterLinkedDocs: function (f) { + linkedDocs(this, f); + }, + getMode: function () { + return this.mode; + }, + getEditor: function () { + return this.cm; + }, + splitLines: function (str) { + if (this.lineSep) { + return str.split(this.lineSep); + } + return splitLinesAuto(str); + }, + lineSeparator: function () { + return this.lineSep || "\n"; + }, + setDirection: docMethodOp(function (dir) { + if (dir != "rtl") { + dir = "ltr"; + } + if (dir == this.direction) { + return; + } + this.direction = dir; + this.iter(function (line) { + return line.order = null; + }); + if (this.cm) { + directionChanged(this.cm); + } + }) + }); + Doc.prototype.eachLine = Doc.prototype.iter; + var lastDrop = 0; + function onDrop(e) { + var cm = this; + clearDragCursor(cm); + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { + return; + } + e_preventDefault(e); + if (ie) { + lastDrop = + /* @__PURE__ */new Date(); + } + var pos = posFromMouse(cm, e, true), + files = e.dataTransfer.files; + if (!pos || cm.isReadOnly()) { + return; + } + if (files && files.length && window.FileReader && window.File) { + var n = files.length, + text = Array(n), + read = 0; + var markAsReadAndPasteIfAllFilesAreRead = function () { + if (++read == n) { + operation(cm, function () { + pos = clipPos(cm.doc, pos); + var change = { + from: pos, + to: pos, + text: cm.doc.splitLines(text.filter(function (t) { + return t != null; + }).join(cm.doc.lineSeparator())), + origin: "paste" + }; + makeChange(cm.doc, change); + setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change)))); + })(); + } + }; + var readTextFromFile = function (file, i3) { + if (cm.options.allowDropFileTypes && indexOf(cm.options.allowDropFileTypes, file.type) == -1) { + markAsReadAndPasteIfAllFilesAreRead(); + return; + } + var reader = new FileReader(); + reader.onerror = function () { + return markAsReadAndPasteIfAllFilesAreRead(); + }; + reader.onload = function () { + var content = reader.result; + if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { + markAsReadAndPasteIfAllFilesAreRead(); + return; + } + text[i3] = content; + markAsReadAndPasteIfAllFilesAreRead(); + }; + reader.readAsText(file); + }; + for (var i2 = 0; i2 < files.length; i2++) { + readTextFromFile(files[i2], i2); + } + } else { + if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { + cm.state.draggingText(e); + setTimeout(function () { + return cm.display.input.focus(); + }, 20); + return; + } + try { + var text$1 = e.dataTransfer.getData("Text"); + if (text$1) { + var selected; + if (cm.state.draggingText && !cm.state.draggingText.copy) { + selected = cm.listSelections(); + } + setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); + if (selected) { + for (var i$12 = 0; i$12 < selected.length; ++i$12) { + replaceRange(cm.doc, "", selected[i$12].anchor, selected[i$12].head, "drag"); + } + } + cm.replaceSelection(text$1, "around", "paste"); + cm.display.input.focus(); + } + } catch (e$1) {} + } + } + function onDragStart(cm, e) { + if (ie && (!cm.state.draggingText || + /* @__PURE__ */new Date() - lastDrop < 100)) { + e_stop(e); + return; + } + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { + return; + } + e.dataTransfer.setData("Text", cm.getSelection()); + e.dataTransfer.effectAllowed = "copyMove"; + if (e.dataTransfer.setDragImage && !safari) { + var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); + img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (presto) { + img.width = img.height = 1; + cm.display.wrapper.appendChild(img); + img._top = img.offsetTop; + } + e.dataTransfer.setDragImage(img, 0, 0); + if (presto) { + img.parentNode.removeChild(img); + } + } + } + function onDragOver(cm, e) { + var pos = posFromMouse(cm, e); + if (!pos) { + return; + } + var frag = document.createDocumentFragment(); + drawSelectionCursor(cm, pos, frag); + if (!cm.display.dragCursor) { + cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); + cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); + } + removeChildrenAndAdd(cm.display.dragCursor, frag); + } + function clearDragCursor(cm) { + if (cm.display.dragCursor) { + cm.display.lineSpace.removeChild(cm.display.dragCursor); + cm.display.dragCursor = null; + } + } + function forEachCodeMirror(f) { + if (!document.getElementsByClassName) { + return; + } + var byClass = document.getElementsByClassName("CodeMirror"), + editors = []; + for (var i2 = 0; i2 < byClass.length; i2++) { + var cm = byClass[i2].CodeMirror; + if (cm) { + editors.push(cm); + } + } + if (editors.length) { + editors[0].operation(function () { + for (var i3 = 0; i3 < editors.length; i3++) { + f(editors[i3]); + } + }); + } + } + var globalsRegistered = false; + function ensureGlobalHandlers() { + if (globalsRegistered) { + return; + } + registerGlobalHandlers(); + globalsRegistered = true; + } + function registerGlobalHandlers() { + var resizeTimer; + on(window, "resize", function () { + if (resizeTimer == null) { + resizeTimer = setTimeout(function () { + resizeTimer = null; + forEachCodeMirror(onResize); + }, 100); + } + }); + on(window, "blur", function () { + return forEachCodeMirror(onBlur); + }); + } + function onResize(cm) { + var d = cm.display; + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.scrollbarsClipped = false; + cm.setSize(); + } + var keyNames = { + 3: "Pause", + 8: "Backspace", + 9: "Tab", + 13: "Enter", + 16: "Shift", + 17: "Ctrl", + 18: "Alt", + 19: "Pause", + 20: "CapsLock", + 27: "Esc", + 32: "Space", + 33: "PageUp", + 34: "PageDown", + 35: "End", + 36: "Home", + 37: "Left", + 38: "Up", + 39: "Right", + 40: "Down", + 44: "PrintScrn", + 45: "Insert", + 46: "Delete", + 59: ";", + 61: "=", + 91: "Mod", + 92: "Mod", + 93: "Mod", + 106: "*", + 107: "=", + 109: "-", + 110: ".", + 111: "/", + 145: "ScrollLock", + 173: "-", + 186: ";", + 187: "=", + 188: ",", + 189: "-", + 190: ".", + 191: "/", + 192: "`", + 219: "[", + 220: "\\", + 221: "]", + 222: "'", + 224: "Mod", + 63232: "Up", + 63233: "Down", + 63234: "Left", + 63235: "Right", + 63272: "Delete", + 63273: "Home", + 63275: "End", + 63276: "PageUp", + 63277: "PageDown", + 63302: "Insert" + }; + for (var i = 0; i < 10; i++) { + keyNames[i + 48] = keyNames[i + 96] = String(i); + } + for (var i$1 = 65; i$1 <= 90; i$1++) { + keyNames[i$1] = String.fromCharCode(i$1); + } + for (var i$2 = 1; i$2 <= 12; i$2++) { + keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; + } + var keyMap = {}; + keyMap.basic = { + "Left": "goCharLeft", + "Right": "goCharRight", + "Up": "goLineUp", + "Down": "goLineDown", + "End": "goLineEnd", + "Home": "goLineStartSmart", + "PageUp": "goPageUp", + "PageDown": "goPageDown", + "Delete": "delCharAfter", + "Backspace": "delCharBefore", + "Shift-Backspace": "delCharBefore", + "Tab": "defaultTab", + "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", + "Insert": "toggleOverwrite", + "Esc": "singleSelection" + }; + keyMap.pcDefault = { + "Ctrl-A": "selectAll", + "Ctrl-D": "deleteLine", + "Ctrl-Z": "undo", + "Shift-Ctrl-Z": "redo", + "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", + "Ctrl-End": "goDocEnd", + "Ctrl-Up": "goLineUp", + "Ctrl-Down": "goLineDown", + "Ctrl-Left": "goGroupLeft", + "Ctrl-Right": "goGroupRight", + "Alt-Left": "goLineStart", + "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delGroupBefore", + "Ctrl-Delete": "delGroupAfter", + "Ctrl-S": "save", + "Ctrl-F": "find", + "Ctrl-G": "findNext", + "Shift-Ctrl-G": "findPrev", + "Shift-Ctrl-F": "replace", + "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", + "Ctrl-]": "indentMore", + "Ctrl-U": "undoSelection", + "Shift-Ctrl-U": "redoSelection", + "Alt-U": "redoSelection", + "fallthrough": "basic" + }; + keyMap.emacsy = { + "Ctrl-F": "goCharRight", + "Ctrl-B": "goCharLeft", + "Ctrl-P": "goLineUp", + "Ctrl-N": "goLineDown", + "Ctrl-A": "goLineStart", + "Ctrl-E": "goLineEnd", + "Ctrl-V": "goPageDown", + "Shift-Ctrl-V": "goPageUp", + "Ctrl-D": "delCharAfter", + "Ctrl-H": "delCharBefore", + "Alt-Backspace": "delWordBefore", + "Ctrl-K": "killLine", + "Ctrl-T": "transposeChars", + "Ctrl-O": "openLine" + }; + keyMap.macDefault = { + "Cmd-A": "selectAll", + "Cmd-D": "deleteLine", + "Cmd-Z": "undo", + "Shift-Cmd-Z": "redo", + "Cmd-Y": "redo", + "Cmd-Home": "goDocStart", + "Cmd-Up": "goDocStart", + "Cmd-End": "goDocEnd", + "Cmd-Down": "goDocEnd", + "Alt-Left": "goGroupLeft", + "Alt-Right": "goGroupRight", + "Cmd-Left": "goLineLeft", + "Cmd-Right": "goLineRight", + "Alt-Backspace": "delGroupBefore", + "Ctrl-Alt-Backspace": "delGroupAfter", + "Alt-Delete": "delGroupAfter", + "Cmd-S": "save", + "Cmd-F": "find", + "Cmd-G": "findNext", + "Shift-Cmd-G": "findPrev", + "Cmd-Alt-F": "replace", + "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", + "Cmd-]": "indentMore", + "Cmd-Backspace": "delWrappedLineLeft", + "Cmd-Delete": "delWrappedLineRight", + "Cmd-U": "undoSelection", + "Shift-Cmd-U": "redoSelection", + "Ctrl-Up": "goDocStart", + "Ctrl-Down": "goDocEnd", + "fallthrough": ["basic", "emacsy"] + }; + keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + function normalizeKeyName(name) { + var parts = name.split(/-(?!$)/); + name = parts[parts.length - 1]; + var alt, ctrl, shift, cmd; + for (var i2 = 0; i2 < parts.length - 1; i2++) { + var mod = parts[i2]; + if (/^(cmd|meta|m)$/i.test(mod)) { + cmd = true; + } else if (/^a(lt)?$/i.test(mod)) { + alt = true; + } else if (/^(c|ctrl|control)$/i.test(mod)) { + ctrl = true; + } else if (/^s(hift)?$/i.test(mod)) { + shift = true; + } else { + throw new Error("Unrecognized modifier name: " + mod); + } + } + if (alt) { + name = "Alt-" + name; + } + if (ctrl) { + name = "Ctrl-" + name; + } + if (cmd) { + name = "Cmd-" + name; + } + if (shift) { + name = "Shift-" + name; + } + return name; + } + function normalizeKeyMap(keymap) { + var copy = {}; + for (var keyname in keymap) { + if (keymap.hasOwnProperty(keyname)) { + var value = keymap[keyname]; + if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { + continue; + } + if (value == "...") { + delete keymap[keyname]; + continue; + } + var keys = map(keyname.split(" "), normalizeKeyName); + for (var i2 = 0; i2 < keys.length; i2++) { + var val = void 0, + name = void 0; + if (i2 == keys.length - 1) { + name = keys.join(" "); + val = value; + } else { + name = keys.slice(0, i2 + 1).join(" "); + val = "..."; + } + var prev = copy[name]; + if (!prev) { + copy[name] = val; + } else if (prev != val) { + throw new Error("Inconsistent bindings for " + name); + } + } + delete keymap[keyname]; + } + } + for (var prop2 in copy) { + keymap[prop2] = copy[prop2]; + } + return keymap; + } + function lookupKey(key, map2, handle, context) { + map2 = getKeyMap(map2); + var found = map2.call ? map2.call(key, context) : map2[key]; + if (found === false) { + return "nothing"; + } + if (found === "...") { + return "multi"; + } + if (found != null && handle(found)) { + return "handled"; + } + if (map2.fallthrough) { + if (Object.prototype.toString.call(map2.fallthrough) != "[object Array]") { + return lookupKey(key, map2.fallthrough, handle, context); + } + for (var i2 = 0; i2 < map2.fallthrough.length; i2++) { + var result = lookupKey(key, map2.fallthrough[i2], handle, context); + if (result) { + return result; + } + } + } + } + function isModifierKey(value) { + var name = typeof value == "string" ? value : keyNames[value.keyCode]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; + } + function addModifierNames(name, event, noShift) { + var base = name; + if (event.altKey && base != "Alt") { + name = "Alt-" + name; + } + if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { + name = "Ctrl-" + name; + } + if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Mod") { + name = "Cmd-" + name; + } + if (!noShift && event.shiftKey && base != "Shift") { + name = "Shift-" + name; + } + return name; + } + function keyName(event, noShift) { + if (presto && event.keyCode == 34 && event["char"]) { + return false; + } + var name = keyNames[event.keyCode]; + if (name == null || event.altGraphKey) { + return false; + } + if (event.keyCode == 3 && event.code) { + name = event.code; + } + return addModifierNames(name, event, noShift); + } + function getKeyMap(val) { + return typeof val == "string" ? keyMap[val] : val; + } + function deleteNearSelection(cm, compute) { + var ranges = cm.doc.sel.ranges, + kill = []; + for (var i2 = 0; i2 < ranges.length; i2++) { + var toKill = compute(ranges[i2]); + while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { + var replaced = kill.pop(); + if (cmp(replaced.from, toKill.from) < 0) { + toKill.from = replaced.from; + break; + } + } + kill.push(toKill); + } + runInOp(cm, function () { + for (var i3 = kill.length - 1; i3 >= 0; i3--) { + replaceRange(cm.doc, "", kill[i3].from, kill[i3].to, "+delete"); + } + ensureCursorVisible(cm); + }); + } + function moveCharLogically(line, ch, dir) { + var target = skipExtendingChars(line.text, ch + dir, dir); + return target < 0 || target > line.text.length ? null : target; + } + function moveLogically(line, start, dir) { + var ch = moveCharLogically(line, start.ch, dir); + return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before"); + } + function endOfLine(visually, cm, lineObj, lineNo2, dir) { + if (visually) { + if (cm.doc.direction == "rtl") { + dir = -dir; + } + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + var part = dir < 0 ? lst(order) : order[0]; + var moveInStorageOrder = dir < 0 == (part.level == 1); + var sticky = moveInStorageOrder ? "after" : "before"; + var ch; + if (part.level > 0 || cm.doc.direction == "rtl") { + var prep = prepareMeasureForLine(cm, lineObj); + ch = dir < 0 ? lineObj.text.length - 1 : 0; + var targetTop = measureCharPrepared(cm, prep, ch).top; + ch = findFirst(function (ch2) { + return measureCharPrepared(cm, prep, ch2).top == targetTop; + }, dir < 0 == (part.level == 1) ? part.from : part.to - 1, ch); + if (sticky == "before") { + ch = moveCharLogically(lineObj, ch, 1); + } + } else { + ch = dir < 0 ? part.to : part.from; + } + return new Pos(lineNo2, ch, sticky); + } + } + return new Pos(lineNo2, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after"); + } + function moveVisually(cm, line, start, dir) { + var bidi = getOrder(line, cm.doc.direction); + if (!bidi) { + return moveLogically(line, start, dir); + } + if (start.ch >= line.text.length) { + start.ch = line.text.length; + start.sticky = "before"; + } else if (start.ch <= 0) { + start.ch = 0; + start.sticky = "after"; + } + var partPos = getBidiPartAt(bidi, start.ch, start.sticky), + part = bidi[partPos]; + if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { + return moveLogically(line, start, dir); + } + var mv = function (pos, dir2) { + return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir2); + }; + var prep; + var getWrappedLineExtent = function (ch2) { + if (!cm.options.lineWrapping) { + return { + begin: 0, + end: line.text.length + }; + } + prep = prep || prepareMeasureForLine(cm, line); + return wrappedLineExtentChar(cm, line, prep, ch2); + }; + var wrappedLineExtent2 = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); + if (cm.doc.direction == "rtl" || part.level == 1) { + var moveInStorageOrder = part.level == 1 == dir < 0; + var ch = mv(start, moveInStorageOrder ? 1 : -1); + if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent2.begin : ch <= part.to && ch <= wrappedLineExtent2.end)) { + var sticky = moveInStorageOrder ? "before" : "after"; + return new Pos(start.line, ch, sticky); + } + } + var searchInVisualLine = function (partPos2, dir2, wrappedLineExtent3) { + var getRes = function (ch3, moveInStorageOrder3) { + return moveInStorageOrder3 ? new Pos(start.line, mv(ch3, 1), "before") : new Pos(start.line, ch3, "after"); + }; + for (; partPos2 >= 0 && partPos2 < bidi.length; partPos2 += dir2) { + var part2 = bidi[partPos2]; + var moveInStorageOrder2 = dir2 > 0 == (part2.level != 1); + var ch2 = moveInStorageOrder2 ? wrappedLineExtent3.begin : mv(wrappedLineExtent3.end, -1); + if (part2.from <= ch2 && ch2 < part2.to) { + return getRes(ch2, moveInStorageOrder2); + } + ch2 = moveInStorageOrder2 ? part2.from : mv(part2.to, -1); + if (wrappedLineExtent3.begin <= ch2 && ch2 < wrappedLineExtent3.end) { + return getRes(ch2, moveInStorageOrder2); + } + } + }; + var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent2); + if (res) { + return res; + } + var nextCh = dir > 0 ? wrappedLineExtent2.end : mv(wrappedLineExtent2.begin, -1); + if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { + res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); + if (res) { + return res; + } + } + return null; + } + var commands = { + selectAll, + singleSelection: function (cm) { + return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); + }, + killLine: function (cm) { + return deleteNearSelection(cm, function (range2) { + if (range2.empty()) { + var len = getLine(cm.doc, range2.head.line).text.length; + if (range2.head.ch == len && range2.head.line < cm.lastLine()) { + return { + from: range2.head, + to: Pos(range2.head.line + 1, 0) + }; + } else { + return { + from: range2.head, + to: Pos(range2.head.line, len) + }; + } + } else { + return { + from: range2.from(), + to: range2.to() + }; + } + }); + }, + deleteLine: function (cm) { + return deleteNearSelection(cm, function (range2) { + return { + from: Pos(range2.from().line, 0), + to: clipPos(cm.doc, Pos(range2.to().line + 1, 0)) + }; + }); + }, + delLineLeft: function (cm) { + return deleteNearSelection(cm, function (range2) { + return { + from: Pos(range2.from().line, 0), + to: range2.from() + }; + }); + }, + delWrappedLineLeft: function (cm) { + return deleteNearSelection(cm, function (range2) { + var top = cm.charCoords(range2.head, "div").top + 5; + var leftPos = cm.coordsChar({ + left: 0, + top + }, "div"); + return { + from: leftPos, + to: range2.from() + }; + }); + }, + delWrappedLineRight: function (cm) { + return deleteNearSelection(cm, function (range2) { + var top = cm.charCoords(range2.head, "div").top + 5; + var rightPos = cm.coordsChar({ + left: cm.display.lineDiv.offsetWidth + 100, + top + }, "div"); + return { + from: range2.from(), + to: rightPos + }; + }); + }, + undo: function (cm) { + return cm.undo(); + }, + redo: function (cm) { + return cm.redo(); + }, + undoSelection: function (cm) { + return cm.undoSelection(); + }, + redoSelection: function (cm) { + return cm.redoSelection(); + }, + goDocStart: function (cm) { + return cm.extendSelection(Pos(cm.firstLine(), 0)); + }, + goDocEnd: function (cm) { + return cm.extendSelection(Pos(cm.lastLine())); + }, + goLineStart: function (cm) { + return cm.extendSelectionsBy(function (range2) { + return lineStart(cm, range2.head.line); + }, { + origin: "+move", + bias: 1 + }); + }, + goLineStartSmart: function (cm) { + return cm.extendSelectionsBy(function (range2) { + return lineStartSmart(cm, range2.head); + }, { + origin: "+move", + bias: 1 + }); + }, + goLineEnd: function (cm) { + return cm.extendSelectionsBy(function (range2) { + return lineEnd(cm, range2.head.line); + }, { + origin: "+move", + bias: -1 + }); + }, + goLineRight: function (cm) { + return cm.extendSelectionsBy(function (range2) { + var top = cm.cursorCoords(range2.head, "div").top + 5; + return cm.coordsChar({ + left: cm.display.lineDiv.offsetWidth + 100, + top + }, "div"); + }, sel_move); + }, + goLineLeft: function (cm) { + return cm.extendSelectionsBy(function (range2) { + var top = cm.cursorCoords(range2.head, "div").top + 5; + return cm.coordsChar({ + left: 0, + top + }, "div"); + }, sel_move); + }, + goLineLeftSmart: function (cm) { + return cm.extendSelectionsBy(function (range2) { + var top = cm.cursorCoords(range2.head, "div").top + 5; + var pos = cm.coordsChar({ + left: 0, + top + }, "div"); + if (pos.ch < cm.getLine(pos.line).search(/\S/)) { + return lineStartSmart(cm, range2.head); + } + return pos; + }, sel_move); + }, + goLineUp: function (cm) { + return cm.moveV(-1, "line"); + }, + goLineDown: function (cm) { + return cm.moveV(1, "line"); + }, + goPageUp: function (cm) { + return cm.moveV(-1, "page"); + }, + goPageDown: function (cm) { + return cm.moveV(1, "page"); + }, + goCharLeft: function (cm) { + return cm.moveH(-1, "char"); + }, + goCharRight: function (cm) { + return cm.moveH(1, "char"); + }, + goColumnLeft: function (cm) { + return cm.moveH(-1, "column"); + }, + goColumnRight: function (cm) { + return cm.moveH(1, "column"); + }, + goWordLeft: function (cm) { + return cm.moveH(-1, "word"); + }, + goGroupRight: function (cm) { + return cm.moveH(1, "group"); + }, + goGroupLeft: function (cm) { + return cm.moveH(-1, "group"); + }, + goWordRight: function (cm) { + return cm.moveH(1, "word"); + }, + delCharBefore: function (cm) { + return cm.deleteH(-1, "codepoint"); + }, + delCharAfter: function (cm) { + return cm.deleteH(1, "char"); + }, + delWordBefore: function (cm) { + return cm.deleteH(-1, "word"); + }, + delWordAfter: function (cm) { + return cm.deleteH(1, "word"); + }, + delGroupBefore: function (cm) { + return cm.deleteH(-1, "group"); + }, + delGroupAfter: function (cm) { + return cm.deleteH(1, "group"); + }, + indentAuto: function (cm) { + return cm.indentSelection("smart"); + }, + indentMore: function (cm) { + return cm.indentSelection("add"); + }, + indentLess: function (cm) { + return cm.indentSelection("subtract"); + }, + insertTab: function (cm) { + return cm.replaceSelection(" "); + }, + insertSoftTab: function (cm) { + var spaces = [], + ranges = cm.listSelections(), + tabSize = cm.options.tabSize; + for (var i2 = 0; i2 < ranges.length; i2++) { + var pos = ranges[i2].from(); + var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); + spaces.push(spaceStr(tabSize - col % tabSize)); + } + cm.replaceSelections(spaces); + }, + defaultTab: function (cm) { + if (cm.somethingSelected()) { + cm.indentSelection("add"); + } else { + cm.execCommand("insertTab"); + } + }, + // Swap the two chars left and right of each selection's head. + // Move cursor behind the two swapped characters afterwards. + // + // Doesn't consider line feeds a character. + // Doesn't scan more than one line above to find a character. + // Doesn't do anything on an empty line. + // Doesn't do anything with non-empty selections. + transposeChars: function (cm) { + return runInOp(cm, function () { + var ranges = cm.listSelections(), + newSel = []; + for (var i2 = 0; i2 < ranges.length; i2++) { + if (!ranges[i2].empty()) { + continue; + } + var cur = ranges[i2].head, + line = getLine(cm.doc, cur.line).text; + if (line) { + if (cur.ch == line.length) { + cur = new Pos(cur.line, cur.ch - 1); + } + if (cur.ch > 0) { + cur = new Pos(cur.line, cur.ch + 1); + cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), Pos(cur.line, cur.ch - 2), cur, "+transpose"); + } else if (cur.line > cm.doc.first) { + var prev = getLine(cm.doc, cur.line - 1).text; + if (prev) { + cur = new Pos(cur.line, 1); + cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + prev.charAt(prev.length - 1), Pos(cur.line - 1, prev.length - 1), cur, "+transpose"); + } + } + } + newSel.push(new Range(cur, cur)); + } + cm.setSelections(newSel); + }); + }, + newlineAndIndent: function (cm) { + return runInOp(cm, function () { + var sels = cm.listSelections(); + for (var i2 = sels.length - 1; i2 >= 0; i2--) { + cm.replaceRange(cm.doc.lineSeparator(), sels[i2].anchor, sels[i2].head, "+input"); + } + sels = cm.listSelections(); + for (var i$12 = 0; i$12 < sels.length; i$12++) { + cm.indentLine(sels[i$12].from().line, null, true); + } + ensureCursorVisible(cm); + }); + }, + openLine: function (cm) { + return cm.replaceSelection("\n", "start"); + }, + toggleOverwrite: function (cm) { + return cm.toggleOverwrite(); + } + }; + function lineStart(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLine(line); + if (visual != line) { + lineN = lineNo(visual); + } + return endOfLine(true, cm, visual, lineN, 1); + } + function lineEnd(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLineEnd(line); + if (visual != line) { + lineN = lineNo(visual); + } + return endOfLine(true, cm, line, lineN, -1); + } + function lineStartSmart(cm, pos) { + var start = lineStart(cm, pos.line); + var line = getLine(cm.doc, start.line); + var order = getOrder(line, cm.doc.direction); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(start.ch, line.text.search(/\S/)); + var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; + return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky); + } + return start; + } + function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) { + return false; + } + } + cm.display.input.ensurePolled(); + var prevShift = cm.display.shift, + done = false; + try { + if (cm.isReadOnly()) { + cm.state.suppressEdits = true; + } + if (dropShift) { + cm.display.shift = false; + } + done = bound(cm) != Pass; + } finally { + cm.display.shift = prevShift; + cm.state.suppressEdits = false; + } + return done; + } + function lookupKeyForEditor(cm, name, handle) { + for (var i2 = 0; i2 < cm.state.keyMaps.length; i2++) { + var result = lookupKey(name, cm.state.keyMaps[i2], handle, cm); + if (result) { + return result; + } + } + return cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm) || lookupKey(name, cm.options.keyMap, handle, cm); + } + var stopSeq = new Delayed(); + function dispatchKey(cm, name, e, handle) { + var seq = cm.state.keySeq; + if (seq) { + if (isModifierKey(name)) { + return "handled"; + } + if (/\'$/.test(name)) { + cm.state.keySeq = null; + } else { + stopSeq.set(50, function () { + if (cm.state.keySeq == seq) { + cm.state.keySeq = null; + cm.display.input.reset(); + } + }); + } + if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { + return true; + } + } + return dispatchKeyInner(cm, name, e, handle); + } + function dispatchKeyInner(cm, name, e, handle) { + var result = lookupKeyForEditor(cm, name, handle); + if (result == "multi") { + cm.state.keySeq = name; + } + if (result == "handled") { + signalLater(cm, "keyHandled", cm, name, e); + } + if (result == "handled" || result == "multi") { + e_preventDefault(e); + restartBlink(cm); + } + return !!result; + } + function handleKeyBinding(cm, e) { + var name = keyName(e, true); + if (!name) { + return false; + } + if (e.shiftKey && !cm.state.keySeq) { + return dispatchKey(cm, "Shift-" + name, e, function (b) { + return doHandleBinding(cm, b, true); + }) || dispatchKey(cm, name, e, function (b) { + if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) { + return doHandleBinding(cm, b); + } + }); + } else { + return dispatchKey(cm, name, e, function (b) { + return doHandleBinding(cm, b); + }); + } + } + function handleCharBinding(cm, e, ch) { + return dispatchKey(cm, "'" + ch + "'", e, function (b) { + return doHandleBinding(cm, b, true); + }); + } + var lastStoppedKey = null; + function onKeyDown(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { + return; + } + cm.curOp.focus = activeElt(); + if (signalDOMEvent(cm, e)) { + return; + } + if (ie && ie_version < 11 && e.keyCode == 27) { + e.returnValue = false; + } + var code = e.keyCode; + cm.display.shift = code == 16 || e.shiftKey; + var handled = handleKeyBinding(cm, e); + if (presto) { + lastStoppedKey = handled ? code : null; + if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) { + cm.replaceSelection("", null, "cut"); + } + } + if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand) { + document.execCommand("cut"); + } + if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) { + showCrossHair(cm); + } + } + function showCrossHair(cm) { + var lineDiv = cm.display.lineDiv; + addClass(lineDiv, "CodeMirror-crosshair"); + function up(e) { + if (e.keyCode == 18 || !e.altKey) { + rmClass(lineDiv, "CodeMirror-crosshair"); + off(document, "keyup", up); + off(document, "mouseover", up); + } + } + on(document, "keyup", up); + on(document, "mouseover", up); + } + function onKeyUp(e) { + if (e.keyCode == 16) { + this.doc.sel.shift = false; + } + signalDOMEvent(this, e); + } + function onKeyPress(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { + return; + } + if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { + return; + } + var keyCode = e.keyCode, + charCode = e.charCode; + if (presto && keyCode == lastStoppedKey) { + lastStoppedKey = null; + e_preventDefault(e); + return; + } + if (presto && (!e.which || e.which < 10) && handleKeyBinding(cm, e)) { + return; + } + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + if (ch == "\b") { + return; + } + if (handleCharBinding(cm, e, ch)) { + return; + } + cm.display.input.onKeyPress(e); + } + var DOUBLECLICK_DELAY = 400; + var PastClick = function (time, pos, button) { + this.time = time; + this.pos = pos; + this.button = button; + }; + PastClick.prototype.compare = function (time, pos, button) { + return this.time + DOUBLECLICK_DELAY > time && cmp(pos, this.pos) == 0 && button == this.button; + }; + var lastClick, lastDoubleClick; + function clickRepeat(pos, button) { + var now = + /* @__PURE__ */new Date(); + if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { + lastClick = lastDoubleClick = null; + return "triple"; + } else if (lastClick && lastClick.compare(now, pos, button)) { + lastDoubleClick = new PastClick(now, pos, button); + lastClick = null; + return "double"; + } else { + lastClick = new PastClick(now, pos, button); + lastDoubleClick = null; + return "single"; + } + } + function onMouseDown(e) { + var cm = this, + display = cm.display; + if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { + return; + } + display.input.ensurePolled(); + display.shift = e.shiftKey; + if (eventInWidget(display, e)) { + if (!webkit) { + display.scroller.draggable = false; + setTimeout(function () { + return display.scroller.draggable = true; + }, 100); + } + return; + } + if (clickInGutter(cm, e)) { + return; + } + var pos = posFromMouse(cm, e), + button = e_button(e), + repeat = pos ? clickRepeat(pos, button) : "single"; + window.focus(); + if (button == 1 && cm.state.selectingText) { + cm.state.selectingText(e); + } + if (pos && handleMappedButton(cm, button, pos, repeat, e)) { + return; + } + if (button == 1) { + if (pos) { + leftButtonDown(cm, pos, repeat, e); + } else if (e_target(e) == display.scroller) { + e_preventDefault(e); + } + } else if (button == 2) { + if (pos) { + extendSelection(cm.doc, pos); + } + setTimeout(function () { + return display.input.focus(); + }, 20); + } else if (button == 3) { + if (captureRightClick) { + cm.display.input.onContextMenu(e); + } else { + delayBlurEvent(cm); + } + } + } + function handleMappedButton(cm, button, pos, repeat, event) { + var name = "Click"; + if (repeat == "double") { + name = "Double" + name; + } else if (repeat == "triple") { + name = "Triple" + name; + } + name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; + return dispatchKey(cm, addModifierNames(name, event), event, function (bound) { + if (typeof bound == "string") { + bound = commands[bound]; + } + if (!bound) { + return false; + } + var done = false; + try { + if (cm.isReadOnly()) { + cm.state.suppressEdits = true; + } + done = bound(cm, pos) != Pass; + } finally { + cm.state.suppressEdits = false; + } + return done; + }); + } + function configureMouse(cm, repeat, event) { + var option = cm.getOption("configureMouse"); + var value = option ? option(cm, repeat, event) : {}; + if (value.unit == null) { + var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; + value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; + } + if (value.extend == null || cm.doc.extend) { + value.extend = cm.doc.extend || event.shiftKey; + } + if (value.addNew == null) { + value.addNew = mac ? event.metaKey : event.ctrlKey; + } + if (value.moveOnDrag == null) { + value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); + } + return value; + } + function leftButtonDown(cm, pos, repeat, event) { + if (ie) { + setTimeout(bind(ensureFocus, cm), 0); + } else { + cm.curOp.focus = activeElt(); + } + var behavior = configureMouse(cm, repeat, event); + var sel = cm.doc.sel, + contained; + if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && repeat == "single" && (contained = sel.contains(pos)) > -1 && (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) { + leftButtonStartDrag(cm, event, pos, behavior); + } else { + leftButtonSelect(cm, event, pos, behavior); + } + } + function leftButtonStartDrag(cm, event, pos, behavior) { + var display = cm.display, + moved = false; + var dragEnd = operation(cm, function (e) { + if (webkit) { + display.scroller.draggable = false; + } + cm.state.draggingText = false; + if (cm.state.delayingBlurEvent) { + if (cm.hasFocus()) { + cm.state.delayingBlurEvent = false; + } else { + delayBlurEvent(cm); + } + } + off(display.wrapper.ownerDocument, "mouseup", dragEnd); + off(display.wrapper.ownerDocument, "mousemove", mouseMove); + off(display.scroller, "dragstart", dragStart); + off(display.scroller, "drop", dragEnd); + if (!moved) { + e_preventDefault(e); + if (!behavior.addNew) { + extendSelection(cm.doc, pos, null, null, behavior.extend); + } + if (webkit && !safari || ie && ie_version == 9) { + setTimeout(function () { + display.wrapper.ownerDocument.body.focus({ + preventScroll: true + }); + display.input.focus(); + }, 20); + } else { + display.input.focus(); + } + } + }); + var mouseMove = function (e2) { + moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; + }; + var dragStart = function () { + return moved = true; + }; + if (webkit) { + display.scroller.draggable = true; + } + cm.state.draggingText = dragEnd; + dragEnd.copy = !behavior.moveOnDrag; + on(display.wrapper.ownerDocument, "mouseup", dragEnd); + on(display.wrapper.ownerDocument, "mousemove", mouseMove); + on(display.scroller, "dragstart", dragStart); + on(display.scroller, "drop", dragEnd); + cm.state.delayingBlurEvent = true; + setTimeout(function () { + return display.input.focus(); + }, 20); + if (display.scroller.dragDrop) { + display.scroller.dragDrop(); + } + } + function rangeForUnit(cm, pos, unit) { + if (unit == "char") { + return new Range(pos, pos); + } + if (unit == "word") { + return cm.findWordAt(pos); + } + if (unit == "line") { + return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); + } + var result = unit(cm, pos); + return new Range(result.from, result.to); + } + function leftButtonSelect(cm, event, start, behavior) { + if (ie) { + delayBlurEvent(cm); + } + var display = cm.display, + doc = cm.doc; + e_preventDefault(event); + var ourRange, + ourIndex, + startSel = doc.sel, + ranges = startSel.ranges; + if (behavior.addNew && !behavior.extend) { + ourIndex = doc.sel.contains(start); + if (ourIndex > -1) { + ourRange = ranges[ourIndex]; + } else { + ourRange = new Range(start, start); + } + } else { + ourRange = doc.sel.primary(); + ourIndex = doc.sel.primIndex; + } + if (behavior.unit == "rectangle") { + if (!behavior.addNew) { + ourRange = new Range(start, start); + } + start = posFromMouse(cm, event, true, true); + ourIndex = -1; + } else { + var range2 = rangeForUnit(cm, start, behavior.unit); + if (behavior.extend) { + ourRange = extendRange(ourRange, range2.anchor, range2.head, behavior.extend); + } else { + ourRange = range2; + } + } + if (!behavior.addNew) { + ourIndex = 0; + setSelection(doc, new Selection([ourRange], 0), sel_mouse); + startSel = doc.sel; + } else if (ourIndex == -1) { + ourIndex = ranges.length; + setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex), { + scroll: false, + origin: "*mouse" + }); + } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { + setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), { + scroll: false, + origin: "*mouse" + }); + startSel = doc.sel; + } else { + replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); + } + var lastPos = start; + function extendTo(pos) { + if (cmp(lastPos, pos) == 0) { + return; + } + lastPos = pos; + if (behavior.unit == "rectangle") { + var ranges2 = [], + tabSize = cm.options.tabSize; + var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); + var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); + var left = Math.min(startCol, posCol), + right = Math.max(startCol, posCol); + for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); line <= end; line++) { + var text = getLine(doc, line).text, + leftPos = findColumn(text, left, tabSize); + if (left == right) { + ranges2.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); + } else if (text.length > leftPos) { + ranges2.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); + } + } + if (!ranges2.length) { + ranges2.push(new Range(start, start)); + } + setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges2), ourIndex), { + origin: "*mouse", + scroll: false + }); + cm.scrollIntoView(pos); + } else { + var oldRange = ourRange; + var range3 = rangeForUnit(cm, pos, behavior.unit); + var anchor = oldRange.anchor, + head; + if (cmp(range3.anchor, anchor) > 0) { + head = range3.head; + anchor = minPos(oldRange.from(), range3.anchor); + } else { + head = range3.anchor; + anchor = maxPos(oldRange.to(), range3.head); + } + var ranges$1 = startSel.ranges.slice(0); + ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head)); + setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse); + } + } + var editorSize = display.wrapper.getBoundingClientRect(); + var counter = 0; + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); + if (!cur) { + return; + } + if (cmp(cur, lastPos) != 0) { + cm.curOp.focus = activeElt(); + extendTo(cur); + var visible = visibleLines(display, doc); + if (cur.line >= visible.to || cur.line < visible.from) { + setTimeout(operation(cm, function () { + if (counter == curCount) { + extend(e); + } + }), 150); + } + } else { + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) { + setTimeout(operation(cm, function () { + if (counter != curCount) { + return; + } + display.scroller.scrollTop += outside; + extend(e); + }), 50); + } + } + } + function done(e) { + cm.state.selectingText = false; + counter = Infinity; + if (e) { + e_preventDefault(e); + display.input.focus(); + } + off(display.wrapper.ownerDocument, "mousemove", move); + off(display.wrapper.ownerDocument, "mouseup", up); + doc.history.lastSelOrigin = null; + } + var move = operation(cm, function (e) { + if (e.buttons === 0 || !e_button(e)) { + done(e); + } else { + extend(e); + } + }); + var up = operation(cm, done); + cm.state.selectingText = up; + on(display.wrapper.ownerDocument, "mousemove", move); + on(display.wrapper.ownerDocument, "mouseup", up); + } + function bidiSimplify(cm, range2) { + var anchor = range2.anchor; + var head = range2.head; + var anchorLine = getLine(cm.doc, anchor.line); + if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { + return range2; + } + var order = getOrder(anchorLine); + if (!order) { + return range2; + } + var index = getBidiPartAt(order, anchor.ch, anchor.sticky), + part = order[index]; + if (part.from != anchor.ch && part.to != anchor.ch) { + return range2; + } + var boundary = index + (part.from == anchor.ch == (part.level != 1) ? 0 : 1); + if (boundary == 0 || boundary == order.length) { + return range2; + } + var leftSide; + if (head.line != anchor.line) { + leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0; + } else { + var headIndex = getBidiPartAt(order, head.ch, head.sticky); + var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1); + if (headIndex == boundary - 1 || headIndex == boundary) { + leftSide = dir < 0; + } else { + leftSide = dir > 0; + } + } + var usePart = order[boundary + (leftSide ? -1 : 0)]; + var from = leftSide == (usePart.level == 1); + var ch = from ? usePart.from : usePart.to, + sticky = from ? "after" : "before"; + return anchor.ch == ch && anchor.sticky == sticky ? range2 : new Range(new Pos(anchor.line, ch, sticky), head); + } + function gutterEvent(cm, e, type, prevent) { + var mX, mY; + if (e.touches) { + mX = e.touches[0].clientX; + mY = e.touches[0].clientY; + } else { + try { + mX = e.clientX; + mY = e.clientY; + } catch (e$1) { + return false; + } + } + if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { + return false; + } + if (prevent) { + e_preventDefault(e); + } + var display = cm.display; + var lineBox = display.lineDiv.getBoundingClientRect(); + if (mY > lineBox.bottom || !hasHandler(cm, type)) { + return e_defaultPrevented(e); + } + mY -= lineBox.top - display.viewOffset; + for (var i2 = 0; i2 < cm.display.gutterSpecs.length; ++i2) { + var g = display.gutters.childNodes[i2]; + if (g && g.getBoundingClientRect().right >= mX) { + var line = lineAtHeight(cm.doc, mY); + var gutter = cm.display.gutterSpecs[i2]; + signal(cm, type, cm, line, gutter.className, e); + return e_defaultPrevented(e); + } + } + } + function clickInGutter(cm, e) { + return gutterEvent(cm, e, "gutterClick", true); + } + function onContextMenu(cm, e) { + if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { + return; + } + if (signalDOMEvent(cm, e, "contextmenu")) { + return; + } + if (!captureRightClick) { + cm.display.input.onContextMenu(e); + } + } + function contextMenuInGutter(cm, e) { + if (!hasHandler(cm, "gutterContextMenu")) { + return false; + } + return gutterEvent(cm, e, "gutterContextMenu", false); + } + function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); + } + var Init = { + toString: function () { + return "CodeMirror.Init"; + } + }; + var defaults = {}; + var optionHandlers = {}; + function defineOptions(CodeMirror2) { + var optionHandlers2 = CodeMirror2.optionHandlers; + function option(name, deflt, handle, notOnInit) { + CodeMirror2.defaults[name] = deflt; + if (handle) { + optionHandlers2[name] = notOnInit ? function (cm, val, old) { + if (old != Init) { + handle(cm, val, old); + } + } : handle; + } + } + CodeMirror2.defineOption = option; + CodeMirror2.Init = Init; + option("value", "", function (cm, val) { + return cm.setValue(val); + }, true); + option("mode", null, function (cm, val) { + cm.doc.modeOption = val; + loadMode(cm); + }, true); + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function (cm) { + resetModeState(cm); + clearCaches(cm); + regChange(cm); + }, true); + option("lineSeparator", null, function (cm, val) { + cm.doc.lineSep = val; + if (!val) { + return; + } + var newBreaks = [], + lineNo2 = cm.doc.first; + cm.doc.iter(function (line) { + for (var pos = 0;;) { + var found = line.text.indexOf(val, pos); + if (found == -1) { + break; + } + pos = found + val.length; + newBreaks.push(Pos(lineNo2, found)); + } + lineNo2++; + }); + for (var i2 = newBreaks.length - 1; i2 >= 0; i2--) { + replaceRange(cm.doc, val, newBreaks[i2], Pos(newBreaks[i2].line, newBreaks[i2].ch + val.length)); + } + }); + option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) { + cm.state.specialChars = new RegExp(val.source + (val.test(" ") ? "" : "| "), "g"); + if (old != Init) { + cm.refresh(); + } + }); + option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { + return cm.refresh(); + }, true); + option("electricChars", true); + option("inputStyle", mobile ? "contenteditable" : "textarea", function () { + throw new Error("inputStyle can not (yet) be changed in a running editor"); + }, true); + option("spellcheck", false, function (cm, val) { + return cm.getInputField().spellcheck = val; + }, true); + option("autocorrect", false, function (cm, val) { + return cm.getInputField().autocorrect = val; + }, true); + option("autocapitalize", false, function (cm, val) { + return cm.getInputField().autocapitalize = val; + }, true); + option("rtlMoveVisually", !windows); + option("wholeLineUpdateBefore", true); + option("theme", "default", function (cm) { + themeChanged(cm); + updateGutters(cm); + }, true); + option("keyMap", "default", function (cm, val, old) { + var next = getKeyMap(val); + var prev = old != Init && getKeyMap(old); + if (prev && prev.detach) { + prev.detach(cm, next); + } + if (next.attach) { + next.attach(cm, prev || null); + } + }); + option("extraKeys", null); + option("configureMouse", null); + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function (cm, val) { + cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers); + updateGutters(cm); + }, true); + option("fixedGutter", true, function (cm, val) { + cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; + cm.refresh(); + }, true); + option("coverGutterNextToScrollbar", false, function (cm) { + return updateScrollbars(cm); + }, true); + option("scrollbarStyle", "native", function (cm) { + initScrollbars(cm); + updateScrollbars(cm); + cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); + cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); + }, true); + option("lineNumbers", false, function (cm, val) { + cm.display.gutterSpecs = getGutters(cm.options.gutters, val); + updateGutters(cm); + }, true); + option("firstLineNumber", 1, updateGutters, true); + option("lineNumberFormatter", function (integer) { + return integer; + }, updateGutters, true); + option("showCursorWhenSelecting", false, updateSelection, true); + option("resetSelectionOnContextMenu", true); + option("lineWiseCopyCut", true); + option("pasteLinesPerSelection", true); + option("selectionsMayTouch", false); + option("readOnly", false, function (cm, val) { + if (val == "nocursor") { + onBlur(cm); + cm.display.input.blur(); + } + cm.display.input.readOnlyChanged(val); + }); + option("screenReaderLabel", null, function (cm, val) { + val = val === "" ? null : val; + cm.display.input.screenReaderLabelChanged(val); + }); + option("disableInput", false, function (cm, val) { + if (!val) { + cm.display.input.reset(); + } + }, true); + option("dragDrop", true, dragDropChanged); + option("allowDropFileTypes", null); + option("cursorBlinkRate", 530); + option("cursorScrollMargin", 0); + option("cursorHeight", 1, updateSelection, true); + option("singleCursorHeightPerLine", true, updateSelection, true); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true, resetModeState, true); + option("addModeClass", false, resetModeState, true); + option("pollInterval", 100); + option("undoDepth", 200, function (cm, val) { + return cm.doc.history.undoDepth = val; + }); + option("historyEventDelay", 1250); + option("viewportMargin", 10, function (cm) { + return cm.refresh(); + }, true); + option("maxHighlightLength", 1e4, resetModeState, true); + option("moveInputWithCursor", true, function (cm, val) { + if (!val) { + cm.display.input.resetPosition(); + } + }); + option("tabindex", null, function (cm, val) { + return cm.display.input.getField().tabIndex = val || ""; + }); + option("autofocus", null); + option("direction", "ltr", function (cm, val) { + return cm.doc.setDirection(val); + }, true); + option("phrases", null); + } + function dragDropChanged(cm, value, old) { + var wasOn = old && old != Init; + if (!value != !wasOn) { + var funcs = cm.display.dragFunctions; + var toggle = value ? on : off; + toggle(cm.display.scroller, "dragstart", funcs.start); + toggle(cm.display.scroller, "dragenter", funcs.enter); + toggle(cm.display.scroller, "dragover", funcs.over); + toggle(cm.display.scroller, "dragleave", funcs.leave); + toggle(cm.display.scroller, "drop", funcs.drop); + } + } + function wrappingChanged(cm) { + if (cm.options.lineWrapping) { + addClass(cm.display.wrapper, "CodeMirror-wrap"); + cm.display.sizer.style.minWidth = ""; + cm.display.sizerWidth = null; + } else { + rmClass(cm.display.wrapper, "CodeMirror-wrap"); + findMaxLine(cm); + } + estimateLineHeights(cm); + regChange(cm); + clearCaches(cm); + setTimeout(function () { + return updateScrollbars(cm); + }, 100); + } + function CodeMirror(place, options) { + var this$1$1 = this; + if (!(this instanceof CodeMirror)) { + return new CodeMirror(place, options); + } + this.options = options = options ? copyObj(options) : {}; + copyObj(defaults, options, false); + var doc = options.value; + if (typeof doc == "string") { + doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); + } else if (options.mode) { + doc.modeOption = options.mode; + } + this.doc = doc; + var input = new CodeMirror.inputStyles[options.inputStyle](this); + var display = this.display = new Display(place, doc, input, options); + display.wrapper.CodeMirror = this; + themeChanged(this); + if (options.lineWrapping) { + this.display.wrapper.className += " CodeMirror-wrap"; + } + initScrollbars(this); + this.state = { + keyMaps: [], + // stores maps added by addKeyMap + overlays: [], + // highlighting overlays, as added by addOverlay + modeGen: 0, + // bumped when mode/overlay changes, used to invalidate highlighting info + overwrite: false, + delayingBlurEvent: false, + focused: false, + suppressEdits: false, + // used to disable editing during key handlers when in readOnly mode + pasteIncoming: -1, + cutIncoming: -1, + // help recognize paste/cut edits in input.poll + selectingText: false, + draggingText: false, + highlight: new Delayed(), + // stores highlight worker timeout + keySeq: null, + // Unfinished key sequence + specialChars: null + }; + if (options.autofocus && !mobile) { + display.input.focus(); + } + if (ie && ie_version < 11) { + setTimeout(function () { + return this$1$1.display.input.reset(true); + }, 20); + } + registerEventHandlers(this); + ensureGlobalHandlers(); + startOperation(this); + this.curOp.forceUpdate = true; + attachDoc(this, doc); + if (options.autofocus && !mobile || this.hasFocus()) { + setTimeout(function () { + if (this$1$1.hasFocus() && !this$1$1.state.focused) { + onFocus(this$1$1); + } + }, 20); + } else { + onBlur(this); + } + for (var opt in optionHandlers) { + if (optionHandlers.hasOwnProperty(opt)) { + optionHandlers[opt](this, options[opt], Init); + } + } + maybeUpdateLineNumberWidth(this); + if (options.finishInit) { + options.finishInit(this); + } + for (var i2 = 0; i2 < initHooks.length; ++i2) { + initHooks[i2](this); + } + endOperation(this); + if (webkit && options.lineWrapping && getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") { + display.lineDiv.style.textRendering = "auto"; + } + } + CodeMirror.defaults = defaults; + CodeMirror.optionHandlers = optionHandlers; + function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + if (ie && ie_version < 11) { + on(d.scroller, "dblclick", operation(cm, function (e) { + if (signalDOMEvent(cm, e)) { + return; + } + var pos = posFromMouse(cm, e); + if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { + return; + } + e_preventDefault(e); + var word = cm.findWordAt(pos); + extendSelection(cm.doc, word.anchor, word.head); + })); + } else { + on(d.scroller, "dblclick", function (e) { + return signalDOMEvent(cm, e) || e_preventDefault(e); + }); + } + on(d.scroller, "contextmenu", function (e) { + return onContextMenu(cm, e); + }); + on(d.input.getField(), "contextmenu", function (e) { + if (!d.scroller.contains(e.target)) { + onContextMenu(cm, e); + } + }); + var touchFinished, + prevTouch = { + end: 0 + }; + function finishTouch() { + if (d.activeTouch) { + touchFinished = setTimeout(function () { + return d.activeTouch = null; + }, 1e3); + prevTouch = d.activeTouch; + prevTouch.end = + /* @__PURE__ */new Date(); + } + } + function isMouseLikeTouchEvent(e) { + if (e.touches.length != 1) { + return false; + } + var touch = e.touches[0]; + return touch.radiusX <= 1 && touch.radiusY <= 1; + } + function farAway(touch, other) { + if (other.left == null) { + return true; + } + var dx = other.left - touch.left, + dy = other.top - touch.top; + return dx * dx + dy * dy > 20 * 20; + } + on(d.scroller, "touchstart", function (e) { + if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) { + d.input.ensurePolled(); + clearTimeout(touchFinished); + var now = + /* @__PURE__ */new Date(); + d.activeTouch = { + start: now, + moved: false, + prev: now - prevTouch.end <= 300 ? prevTouch : null + }; + if (e.touches.length == 1) { + d.activeTouch.left = e.touches[0].pageX; + d.activeTouch.top = e.touches[0].pageY; + } + } + }); + on(d.scroller, "touchmove", function () { + if (d.activeTouch) { + d.activeTouch.moved = true; + } + }); + on(d.scroller, "touchend", function (e) { + var touch = d.activeTouch; + if (touch && !eventInWidget(d, e) && touch.left != null && !touch.moved && /* @__PURE__ */new Date() - touch.start < 300) { + var pos = cm.coordsChar(d.activeTouch, "page"), + range2; + if (!touch.prev || farAway(touch, touch.prev)) { + range2 = new Range(pos, pos); + } else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) { + range2 = cm.findWordAt(pos); + } else { + range2 = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); + } + cm.setSelection(range2.anchor, range2.head); + cm.focus(); + e_preventDefault(e); + } + finishTouch(); + }); + on(d.scroller, "touchcancel", finishTouch); + on(d.scroller, "scroll", function () { + if (d.scroller.clientHeight) { + updateScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + } + }); + on(d.scroller, "mousewheel", function (e) { + return onScrollWheel(cm, e); + }); + on(d.scroller, "DOMMouseScroll", function (e) { + return onScrollWheel(cm, e); + }); + on(d.wrapper, "scroll", function () { + return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; + }); + d.dragFunctions = { + enter: function (e) { + if (!signalDOMEvent(cm, e)) { + e_stop(e); + } + }, + over: function (e) { + if (!signalDOMEvent(cm, e)) { + onDragOver(cm, e); + e_stop(e); + } + }, + start: function (e) { + return onDragStart(cm, e); + }, + drop: operation(cm, onDrop), + leave: function (e) { + if (!signalDOMEvent(cm, e)) { + clearDragCursor(cm); + } + } + }; + var inp = d.input.getField(); + on(inp, "keyup", function (e) { + return onKeyUp.call(cm, e); + }); + on(inp, "keydown", operation(cm, onKeyDown)); + on(inp, "keypress", operation(cm, onKeyPress)); + on(inp, "focus", function (e) { + return onFocus(cm, e); + }); + on(inp, "blur", function (e) { + return onBlur(cm, e); + }); + } + var initHooks = []; + CodeMirror.defineInitHook = function (f) { + return initHooks.push(f); + }; + function indentLine(cm, n, how, aggressive) { + var doc = cm.doc, + state; + if (how == null) { + how = "add"; + } + if (how == "smart") { + if (!doc.mode.indent) { + how = "prev"; + } else { + state = getContextBefore(cm, n).state; + } + } + var tabSize = cm.options.tabSize; + var line = getLine(doc, n), + curSpace = countColumn(line.text, null, tabSize); + if (line.stateAfter) { + line.stateAfter = null; + } + var curSpaceString = line.text.match(/^\s*/)[0], + indentation; + if (!aggressive && !/\S/.test(line.text)) { + indentation = 0; + how = "not"; + } else if (how == "smart") { + indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass || indentation > 150) { + if (!aggressive) { + return; + } + how = "prev"; + } + } + if (how == "prev") { + if (n > doc.first) { + indentation = countColumn(getLine(doc, n - 1).text, null, tabSize); + } else { + indentation = 0; + } + } else if (how == "add") { + indentation = curSpace + cm.options.indentUnit; + } else if (how == "subtract") { + indentation = curSpace - cm.options.indentUnit; + } else if (typeof how == "number") { + indentation = curSpace + how; + } + indentation = Math.max(0, indentation); + var indentString = "", + pos = 0; + if (cm.options.indentWithTabs) { + for (var i2 = Math.floor(indentation / tabSize); i2; --i2) { + pos += tabSize; + indentString += " "; + } + } + if (pos < indentation) { + indentString += spaceStr(indentation - pos); + } + if (indentString != curSpaceString) { + replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); + line.stateAfter = null; + return true; + } else { + for (var i$12 = 0; i$12 < doc.sel.ranges.length; i$12++) { + var range2 = doc.sel.ranges[i$12]; + if (range2.head.line == n && range2.head.ch < curSpaceString.length) { + var pos$1 = Pos(n, curSpaceString.length); + replaceOneSelection(doc, i$12, new Range(pos$1, pos$1)); + break; + } + } + } + } + var lastCopied = null; + function setLastCopied(newLastCopied) { + lastCopied = newLastCopied; + } + function applyTextInput(cm, inserted, deleted, sel, origin) { + var doc = cm.doc; + cm.display.shift = false; + if (!sel) { + sel = doc.sel; + } + var recent = + /* @__PURE__ */new Date() - 200; + var paste = origin == "paste" || cm.state.pasteIncoming > recent; + var textLines = splitLinesAuto(inserted), + multiPaste = null; + if (paste && sel.ranges.length > 1) { + if (lastCopied && lastCopied.text.join("\n") == inserted) { + if (sel.ranges.length % lastCopied.text.length == 0) { + multiPaste = []; + for (var i2 = 0; i2 < lastCopied.text.length; i2++) { + multiPaste.push(doc.splitLines(lastCopied.text[i2])); + } + } + } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { + multiPaste = map(textLines, function (l) { + return [l]; + }); + } + } + var updateInput = cm.curOp.updateInput; + for (var i$12 = sel.ranges.length - 1; i$12 >= 0; i$12--) { + var range2 = sel.ranges[i$12]; + var from = range2.from(), + to = range2.to(); + if (range2.empty()) { + if (deleted && deleted > 0) { + from = Pos(from.line, from.ch - deleted); + } else if (cm.state.overwrite && !paste) { + to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); + } else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n")) { + from = to = Pos(from.line, 0); + } + } + var changeEvent = { + from, + to, + text: multiPaste ? multiPaste[i$12 % multiPaste.length] : textLines, + origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input") + }; + makeChange(cm.doc, changeEvent); + signalLater(cm, "inputRead", cm, changeEvent); + } + if (inserted && !paste) { + triggerElectric(cm, inserted); + } + ensureCursorVisible(cm); + if (cm.curOp.updateInput < 2) { + cm.curOp.updateInput = updateInput; + } + cm.curOp.typing = true; + cm.state.pasteIncoming = cm.state.cutIncoming = -1; + } + function handlePaste(e, cm) { + var pasted = e.clipboardData && e.clipboardData.getData("Text"); + if (pasted) { + e.preventDefault(); + if (!cm.isReadOnly() && !cm.options.disableInput) { + runInOp(cm, function () { + return applyTextInput(cm, pasted, 0, null, "paste"); + }); + } + return true; + } + } + function triggerElectric(cm, inserted) { + if (!cm.options.electricChars || !cm.options.smartIndent) { + return; + } + var sel = cm.doc.sel; + for (var i2 = sel.ranges.length - 1; i2 >= 0; i2--) { + var range2 = sel.ranges[i2]; + if (range2.head.ch > 100 || i2 && sel.ranges[i2 - 1].head.line == range2.head.line) { + continue; + } + var mode = cm.getModeAt(range2.head); + var indented = false; + if (mode.electricChars) { + for (var j = 0; j < mode.electricChars.length; j++) { + if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { + indented = indentLine(cm, range2.head.line, "smart"); + break; + } + } + } else if (mode.electricInput) { + if (mode.electricInput.test(getLine(cm.doc, range2.head.line).text.slice(0, range2.head.ch))) { + indented = indentLine(cm, range2.head.line, "smart"); + } + } + if (indented) { + signalLater(cm, "electricInput", cm, range2.head.line); + } + } + } + function copyableRanges(cm) { + var text = [], + ranges = []; + for (var i2 = 0; i2 < cm.doc.sel.ranges.length; i2++) { + var line = cm.doc.sel.ranges[i2].head.line; + var lineRange = { + anchor: Pos(line, 0), + head: Pos(line + 1, 0) + }; + ranges.push(lineRange); + text.push(cm.getRange(lineRange.anchor, lineRange.head)); + } + return { + text, + ranges + }; + } + function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) { + field.setAttribute("autocorrect", autocorrect ? "" : "off"); + field.setAttribute("autocapitalize", autocapitalize ? "" : "off"); + field.setAttribute("spellcheck", !!spellcheck); + } + function hiddenTextarea() { + var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none"); + var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + if (webkit) { + te.style.width = "1000px"; + } else { + te.setAttribute("wrap", "off"); + } + if (ios) { + te.style.border = "1px solid black"; + } + disableBrowserMagic(te); + return div; + } + function addEditorMethods(CodeMirror2) { + var optionHandlers2 = CodeMirror2.optionHandlers; + var helpers = CodeMirror2.helpers = {}; + CodeMirror2.prototype = { + constructor: CodeMirror2, + focus: function () { + window.focus(); + this.display.input.focus(); + }, + setOption: function (option, value) { + var options = this.options, + old = options[option]; + if (options[option] == value && option != "mode") { + return; + } + options[option] = value; + if (optionHandlers2.hasOwnProperty(option)) { + operation(this, optionHandlers2[option])(this, value, old); + } + signal(this, "optionChange", this, option); + }, + getOption: function (option) { + return this.options[option]; + }, + getDoc: function () { + return this.doc; + }, + addKeyMap: function (map2, bottom) { + this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map2)); + }, + removeKeyMap: function (map2) { + var maps = this.state.keyMaps; + for (var i2 = 0; i2 < maps.length; ++i2) { + if (maps[i2] == map2 || maps[i2].name == map2) { + maps.splice(i2, 1); + return true; + } + } + }, + addOverlay: methodOp(function (spec, options) { + var mode = spec.token ? spec : CodeMirror2.getMode(this.options, spec); + if (mode.startState) { + throw new Error("Overlays may not be stateful."); + } + insertSorted(this.state.overlays, { + mode, + modeSpec: spec, + opaque: options && options.opaque, + priority: options && options.priority || 0 + }, function (overlay) { + return overlay.priority; + }); + this.state.modeGen++; + regChange(this); + }), + removeOverlay: methodOp(function (spec) { + var overlays = this.state.overlays; + for (var i2 = 0; i2 < overlays.length; ++i2) { + var cur = overlays[i2].modeSpec; + if (cur == spec || typeof spec == "string" && cur.name == spec) { + overlays.splice(i2, 1); + this.state.modeGen++; + regChange(this); + return; + } + } + }), + indentLine: methodOp(function (n, dir, aggressive) { + if (typeof dir != "string" && typeof dir != "number") { + if (dir == null) { + dir = this.options.smartIndent ? "smart" : "prev"; + } else { + dir = dir ? "add" : "subtract"; + } + } + if (isLine(this.doc, n)) { + indentLine(this, n, dir, aggressive); + } + }), + indentSelection: methodOp(function (how) { + var ranges = this.doc.sel.ranges, + end = -1; + for (var i2 = 0; i2 < ranges.length; i2++) { + var range2 = ranges[i2]; + if (!range2.empty()) { + var from = range2.from(), + to = range2.to(); + var start = Math.max(end, from.line); + end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; + for (var j = start; j < end; ++j) { + indentLine(this, j, how); + } + var newRanges = this.doc.sel.ranges; + if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i2].from().ch > 0) { + replaceOneSelection(this.doc, i2, new Range(from, newRanges[i2].to()), sel_dontScroll); + } + } else if (range2.head.line > end) { + indentLine(this, range2.head.line, how, true); + end = range2.head.line; + if (i2 == this.doc.sel.primIndex) { + ensureCursorVisible(this); + } + } + } + }), + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function (pos, precise) { + return takeToken(this, pos, precise); + }, + getLineTokens: function (line, precise) { + return takeToken(this, Pos(line), precise, true); + }, + getTokenTypeAt: function (pos) { + pos = clipPos(this.doc, pos); + var styles = getLineStyles(this, getLine(this.doc, pos.line)); + var before = 0, + after = (styles.length - 1) / 2, + ch = pos.ch; + var type; + if (ch == 0) { + type = styles[2]; + } else { + for (;;) { + var mid = before + after >> 1; + if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { + after = mid; + } else if (styles[mid * 2 + 1] < ch) { + before = mid + 1; + } else { + type = styles[mid * 2 + 2]; + break; + } + } + } + var cut = type ? type.indexOf("overlay ") : -1; + return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1); + }, + getModeAt: function (pos) { + var mode = this.doc.mode; + if (!mode.innerMode) { + return mode; + } + return CodeMirror2.innerMode(mode, this.getTokenAt(pos).state).mode; + }, + getHelper: function (pos, type) { + return this.getHelpers(pos, type)[0]; + }, + getHelpers: function (pos, type) { + var found = []; + if (!helpers.hasOwnProperty(type)) { + return found; + } + var help = helpers[type], + mode = this.getModeAt(pos); + if (typeof mode[type] == "string") { + if (help[mode[type]]) { + found.push(help[mode[type]]); + } + } else if (mode[type]) { + for (var i2 = 0; i2 < mode[type].length; i2++) { + var val = help[mode[type][i2]]; + if (val) { + found.push(val); + } + } + } else if (mode.helperType && help[mode.helperType]) { + found.push(help[mode.helperType]); + } else if (help[mode.name]) { + found.push(help[mode.name]); + } + for (var i$12 = 0; i$12 < help._global.length; i$12++) { + var cur = help._global[i$12]; + if (cur.pred(mode, this) && indexOf(found, cur.val) == -1) { + found.push(cur.val); + } + } + return found; + }, + getStateAfter: function (line, precise) { + var doc = this.doc; + line = clipLine(doc, line == null ? doc.first + doc.size - 1 : line); + return getContextBefore(this, line + 1, precise).state; + }, + cursorCoords: function (start, mode) { + var pos, + range2 = this.doc.sel.primary(); + if (start == null) { + pos = range2.head; + } else if (typeof start == "object") { + pos = clipPos(this.doc, start); + } else { + pos = start ? range2.from() : range2.to(); + } + return cursorCoords(this, pos, mode || "page"); + }, + charCoords: function (pos, mode) { + return charCoords(this, clipPos(this.doc, pos), mode || "page"); + }, + coordsChar: function (coords, mode) { + coords = fromCoordSystem(this, coords, mode || "page"); + return coordsChar(this, coords.left, coords.top); + }, + lineAtHeight: function (height, mode) { + height = fromCoordSystem(this, { + top: height, + left: 0 + }, mode || "page").top; + return lineAtHeight(this.doc, height + this.display.viewOffset); + }, + heightAtLine: function (line, mode, includeWidgets) { + var end = false, + lineObj; + if (typeof line == "number") { + var last = this.doc.first + this.doc.size - 1; + if (line < this.doc.first) { + line = this.doc.first; + } else if (line > last) { + line = last; + end = true; + } + lineObj = getLine(this.doc, line); + } else { + lineObj = line; + } + return intoCoordSystem(this, lineObj, { + top: 0, + left: 0 + }, mode || "page", includeWidgets || end).top + (end ? this.doc.height - heightAtLine(lineObj) : 0); + }, + defaultTextHeight: function () { + return textHeight(this.display); + }, + defaultCharWidth: function () { + return charWidth(this.display); + }, + getViewport: function () { + return { + from: this.display.viewFrom, + to: this.display.viewTo + }; + }, + addWidget: function (pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.doc, pos)); + var top = pos.bottom, + left = pos.left; + node.style.position = "absolute"; + node.setAttribute("cm-ignore-events", "true"); + this.display.input.setUneditable(node); + display.sizer.appendChild(node); + if (vert == "over") { + top = pos.top; + } else if (vert == "above" || vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), + hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + if ((vert == "above" || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) { + top = pos.top - node.offsetHeight; + } else if (pos.bottom + node.offsetHeight <= vspace) { + top = pos.bottom; + } + if (left + node.offsetWidth > hspace) { + left = hspace - node.offsetWidth; + } + } + node.style.top = top + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") { + left = 0; + } else if (horiz == "middle") { + left = (display.sizer.clientWidth - node.offsetWidth) / 2; + } + node.style.left = left + "px"; + } + if (scroll) { + scrollIntoView(this, { + left, + top, + right: left + node.offsetWidth, + bottom: top + node.offsetHeight + }); + } + }, + triggerOnKeyDown: methodOp(onKeyDown), + triggerOnKeyPress: methodOp(onKeyPress), + triggerOnKeyUp: onKeyUp, + triggerOnMouseDown: methodOp(onMouseDown), + execCommand: function (cmd) { + if (commands.hasOwnProperty(cmd)) { + return commands[cmd].call(null, this); + } + }, + triggerElectric: methodOp(function (text) { + triggerElectric(this, text); + }), + findPosH: function (from, amount, unit, visually) { + var dir = 1; + if (amount < 0) { + dir = -1; + amount = -amount; + } + var cur = clipPos(this.doc, from); + for (var i2 = 0; i2 < amount; ++i2) { + cur = findPosH(this.doc, cur, dir, unit, visually); + if (cur.hitSide) { + break; + } + } + return cur; + }, + moveH: methodOp(function (dir, unit) { + var this$1$1 = this; + this.extendSelectionsBy(function (range2) { + if (this$1$1.display.shift || this$1$1.doc.extend || range2.empty()) { + return findPosH(this$1$1.doc, range2.head, dir, unit, this$1$1.options.rtlMoveVisually); + } else { + return dir < 0 ? range2.from() : range2.to(); + } + }, sel_move); + }), + deleteH: methodOp(function (dir, unit) { + var sel = this.doc.sel, + doc = this.doc; + if (sel.somethingSelected()) { + doc.replaceSelection("", null, "+delete"); + } else { + deleteNearSelection(this, function (range2) { + var other = findPosH(doc, range2.head, dir, unit, false); + return dir < 0 ? { + from: other, + to: range2.head + } : { + from: range2.head, + to: other + }; + }); + } + }), + findPosV: function (from, amount, unit, goalColumn) { + var dir = 1, + x = goalColumn; + if (amount < 0) { + dir = -1; + amount = -amount; + } + var cur = clipPos(this.doc, from); + for (var i2 = 0; i2 < amount; ++i2) { + var coords = cursorCoords(this, cur, "div"); + if (x == null) { + x = coords.left; + } else { + coords.left = x; + } + cur = findPosV(this, coords, dir, unit); + if (cur.hitSide) { + break; + } + } + return cur; + }, + moveV: methodOp(function (dir, unit) { + var this$1$1 = this; + var doc = this.doc, + goals = []; + var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected(); + doc.extendSelectionsBy(function (range2) { + if (collapse) { + return dir < 0 ? range2.from() : range2.to(); + } + var headPos = cursorCoords(this$1$1, range2.head, "div"); + if (range2.goalColumn != null) { + headPos.left = range2.goalColumn; + } + goals.push(headPos.left); + var pos = findPosV(this$1$1, headPos, dir, unit); + if (unit == "page" && range2 == doc.sel.primary()) { + addToScrollTop(this$1$1, charCoords(this$1$1, pos, "div").top - headPos.top); + } + return pos; + }, sel_move); + if (goals.length) { + for (var i2 = 0; i2 < doc.sel.ranges.length; i2++) { + doc.sel.ranges[i2].goalColumn = goals[i2]; + } + } + }), + // Find the word at the given position (as returned by coordsChar). + findWordAt: function (pos) { + var doc = this.doc, + line = getLine(doc, pos.line).text; + var start = pos.ch, + end = pos.ch; + if (line) { + var helper = this.getHelper(pos, "wordChars"); + if ((pos.sticky == "before" || end == line.length) && start) { + --start; + } else { + ++end; + } + var startChar = line.charAt(start); + var check = isWordChar(startChar, helper) ? function (ch) { + return isWordChar(ch, helper); + } : /\s/.test(startChar) ? function (ch) { + return /\s/.test(ch); + } : function (ch) { + return !/\s/.test(ch) && !isWordChar(ch); + }; + while (start > 0 && check(line.charAt(start - 1))) { + --start; + } + while (end < line.length && check(line.charAt(end))) { + ++end; + } + } + return new Range(Pos(pos.line, start), Pos(pos.line, end)); + }, + toggleOverwrite: function (value) { + if (value != null && value == this.state.overwrite) { + return; + } + if (this.state.overwrite = !this.state.overwrite) { + addClass(this.display.cursorDiv, "CodeMirror-overwrite"); + } else { + rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); + } + signal(this, "overwriteToggle", this, this.state.overwrite); + }, + hasFocus: function () { + return this.display.input.getField() == activeElt(); + }, + isReadOnly: function () { + return !!(this.options.readOnly || this.doc.cantEdit); + }, + scrollTo: methodOp(function (x, y) { + scrollToCoords(this, x, y); + }), + getScrollInfo: function () { + var scroller = this.display.scroller; + return { + left: scroller.scrollLeft, + top: scroller.scrollTop, + height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, + width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, + clientHeight: displayHeight(this), + clientWidth: displayWidth(this) + }; + }, + scrollIntoView: methodOp(function (range2, margin) { + if (range2 == null) { + range2 = { + from: this.doc.sel.primary().head, + to: null + }; + if (margin == null) { + margin = this.options.cursorScrollMargin; + } + } else if (typeof range2 == "number") { + range2 = { + from: Pos(range2, 0), + to: null + }; + } else if (range2.from == null) { + range2 = { + from: range2, + to: null + }; + } + if (!range2.to) { + range2.to = range2.from; + } + range2.margin = margin || 0; + if (range2.from.line != null) { + scrollToRange(this, range2); + } else { + scrollToCoordsRange(this, range2.from, range2.to, range2.margin); + } + }), + setSize: methodOp(function (width, height) { + var this$1$1 = this; + var interpret = function (val) { + return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; + }; + if (width != null) { + this.display.wrapper.style.width = interpret(width); + } + if (height != null) { + this.display.wrapper.style.height = interpret(height); + } + if (this.options.lineWrapping) { + clearLineMeasurementCache(this); + } + var lineNo2 = this.display.viewFrom; + this.doc.iter(lineNo2, this.display.viewTo, function (line) { + if (line.widgets) { + for (var i2 = 0; i2 < line.widgets.length; i2++) { + if (line.widgets[i2].noHScroll) { + regLineChange(this$1$1, lineNo2, "widget"); + break; + } + } + } + ++lineNo2; + }); + this.curOp.forceUpdate = true; + signal(this, "refresh", this); + }), + operation: function (f) { + return runInOp(this, f); + }, + startOperation: function () { + return startOperation(this); + }, + endOperation: function () { + return endOperation(this); + }, + refresh: methodOp(function () { + var oldHeight = this.display.cachedTextHeight; + regChange(this); + this.curOp.forceUpdate = true; + clearCaches(this); + scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); + updateGutterSpace(this.display); + if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > 0.5 || this.options.lineWrapping) { + estimateLineHeights(this); + } + signal(this, "refresh", this); + }), + swapDoc: methodOp(function (doc) { + var old = this.doc; + old.cm = null; + if (this.state.selectingText) { + this.state.selectingText(); + } + attachDoc(this, doc); + clearCaches(this); + this.display.input.reset(); + scrollToCoords(this, doc.scrollLeft, doc.scrollTop); + this.curOp.forceScroll = true; + signalLater(this, "swapDoc", this, old); + return old; + }), + phrase: function (phraseText) { + var phrases = this.options.phrases; + return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText; + }, + getInputField: function () { + return this.display.input.getField(); + }, + getWrapperElement: function () { + return this.display.wrapper; + }, + getScrollerElement: function () { + return this.display.scroller; + }, + getGutterElement: function () { + return this.display.gutters; + } + }; + eventMixin(CodeMirror2); + CodeMirror2.registerHelper = function (type, name, value) { + if (!helpers.hasOwnProperty(type)) { + helpers[type] = CodeMirror2[type] = { + _global: [] + }; + } + helpers[type][name] = value; + }; + CodeMirror2.registerGlobalHelper = function (type, name, predicate, value) { + CodeMirror2.registerHelper(type, name, value); + helpers[type]._global.push({ + pred: predicate, + val: value + }); + }; } - - // Skip content of html tag links - if (currentToken.type === 'html_inline') { - if (isLinkOpen$1(currentToken.content) && htmlLinkLevel > 0) { - htmlLinkLevel--; + function findPosH(doc, pos, dir, unit, visually) { + var oldPos = pos; + var origDir = dir; + var lineObj = getLine(doc, pos.line); + var lineDir = visually && doc.direction == "rtl" ? -dir : dir; + function findNextLine() { + var l = pos.line + lineDir; + if (l < doc.first || l >= doc.first + doc.size) { + return false; + } + pos = new Pos(l, pos.ch, pos.sticky); + return lineObj = getLine(doc, l); + } + function moveOnce(boundToLine) { + var next; + if (unit == "codepoint") { + var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1)); + if (isNaN(ch)) { + next = null; + } else { + var astral = dir > 0 ? ch >= 55296 && ch < 56320 : ch >= 56320 && ch < 57343; + next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir); + } + } else if (visually) { + next = moveVisually(doc.cm, lineObj, pos, dir); + } else { + next = moveLogically(lineObj, pos, dir); + } + if (next == null) { + if (!boundToLine && findNextLine()) { + pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); + } else { + return false; + } + } else { + pos = next; + } + return true; } - if (isLinkClose$1(currentToken.content)) { - htmlLinkLevel++; + if (unit == "char" || unit == "codepoint") { + moveOnce(); + } else if (unit == "column") { + moveOnce(true); + } else if (unit == "word" || unit == "group") { + var sawType = null, + group = unit == "group"; + var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); + for (var first = true;; first = false) { + if (dir < 0 && !moveOnce(!first)) { + break; + } + var cur = lineObj.text.charAt(pos.ch) || "\n"; + var type = isWordChar(cur, helper) ? "w" : group && cur == "\n" ? "n" : !group || /\s/.test(cur) ? null : "p"; + if (group && !first && !type) { + type = "s"; + } + if (sawType && sawType != type) { + if (dir < 0) { + dir = 1; + moveOnce(); + pos.sticky = "after"; + } + break; + } + if (type) { + sawType = type; + } + if (dir > 0 && !moveOnce(!first)) { + break; + } + } + } + var result = skipAtomic(doc, pos, oldPos, origDir, true); + if (equalCursorPos(oldPos, result)) { + result.hitSide = true; } + return result; } - if (htmlLinkLevel > 0) { - continue; + function findPosV(cm, pos, dir, unit) { + var doc = cm.doc, + x = pos.left, + y; + if (unit == "page") { + var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); + var moveAmount = Math.max(pageSize - 0.5 * textHeight(cm.display), 3); + y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + var target; + for (;;) { + target = coordsChar(cm, x, y); + if (!target.outside) { + break; + } + if (dir < 0 ? y <= 0 : y >= doc.height) { + target.hitSide = true; + break; + } + y += dir * 5; + } + return target; } - if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) { - const text = currentToken.content; - let links = state.md.linkify.match(text); - - // Now split string to nodes - const nodes = []; - let level = currentToken.level; - let lastPos = 0; - - // forbid escape sequence at the start of the string, - // this avoids http\://example.com/ from being linkified as - // http:
//example.com/ - if (links.length > 0 && links[0].index === 0 && i > 0 && tokens[i - 1].type === 'text_special') { - links = links.slice(1); + var ContentEditableInput = function (cm) { + this.cm = cm; + this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; + this.polling = new Delayed(); + this.composing = null; + this.gracePeriod = false; + this.readDOMTimeout = null; + }; + ContentEditableInput.prototype.init = function (display) { + var this$1$1 = this; + var input = this, + cm = input.cm; + var div = input.div = display.lineDiv; + div.contentEditable = true; + disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize); + function belongsToInput(e) { + for (var t = e.target; t; t = t.parentNode) { + if (t == div) { + return true; + } + if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) { + break; + } + } + return false; } - for (let ln = 0; ln < links.length; ln++) { - const url = links[ln].url; - const fullUrl = state.md.normalizeLink(url); - if (!state.md.validateLink(fullUrl)) { - continue; + on(div, "paste", function (e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { + return; } - let urlText = links[ln].text; - - // Linkifier might send raw hostnames like "example.com", where url - // starts with domain name. So we prepend http:// in those cases, - // and remove it afterwards. - // - if (!links[ln].schema) { - urlText = state.md.normalizeLinkText('http://' + urlText).replace(/^http:\/\//, ''); - } else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) { - urlText = state.md.normalizeLinkText('mailto:' + urlText).replace(/^mailto:/, ''); + if (ie_version <= 11) { + setTimeout(operation(cm, function () { + return this$1$1.updateFromDOM(); + }), 20); + } + }); + on(div, "compositionstart", function (e) { + this$1$1.composing = { + data: e.data, + done: false + }; + }); + on(div, "compositionupdate", function (e) { + if (!this$1$1.composing) { + this$1$1.composing = { + data: e.data, + done: false + }; + } + }); + on(div, "compositionend", function (e) { + if (this$1$1.composing) { + if (e.data != this$1$1.composing.data) { + this$1$1.readFromDOMSoon(); + } + this$1$1.composing.done = true; + } + }); + on(div, "touchstart", function () { + return input.forceCompositionEnd(); + }); + on(div, "input", function () { + if (!this$1$1.composing) { + this$1$1.readFromDOMSoon(); + } + }); + function onCopyCut(e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e)) { + return; + } + if (cm.somethingSelected()) { + setLastCopied({ + lineWise: false, + text: cm.getSelections() + }); + if (e.type == "cut") { + cm.replaceSelection("", null, "cut"); + } + } else if (!cm.options.lineWiseCopyCut) { + return; } else { - urlText = state.md.normalizeLinkText(urlText); + var ranges = copyableRanges(cm); + setLastCopied({ + lineWise: true, + text: ranges.text + }); + if (e.type == "cut") { + cm.operation(function () { + cm.setSelections(ranges.ranges, 0, sel_dontScroll); + cm.replaceSelection("", null, "cut"); + }); + } } - const pos = links[ln].index; - if (pos > lastPos) { - const token = new state.Token('text', '', 0); - token.content = text.slice(lastPos, pos); - token.level = level; - nodes.push(token); + if (e.clipboardData) { + e.clipboardData.clearData(); + var content = lastCopied.text.join("\n"); + e.clipboardData.setData("Text", content); + if (e.clipboardData.getData("Text") == content) { + e.preventDefault(); + return; + } } - const token_o = new state.Token('link_open', 'a', 1); - token_o.attrs = [['href', fullUrl]]; - token_o.level = level++; - token_o.markup = 'linkify'; - token_o.info = 'auto'; - nodes.push(token_o); - const token_t = new state.Token('text', '', 0); - token_t.content = urlText; - token_t.level = level; - nodes.push(token_t); - const token_c = new state.Token('link_close', 'a', -1); - token_c.level = --level; - token_c.markup = 'linkify'; - token_c.info = 'auto'; - nodes.push(token_c); - lastPos = links[ln].lastIndex; + var kludge = hiddenTextarea(), + te = kludge.firstChild; + cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); + te.value = lastCopied.text.join("\n"); + var hadFocus = activeElt(); + selectInput(te); + setTimeout(function () { + cm.display.lineSpace.removeChild(kludge); + hadFocus.focus(); + if (hadFocus == div) { + input.showPrimarySelection(); + } + }, 50); } - if (lastPos < text.length) { - const token = new state.Token('text', '', 0); - token.content = text.slice(lastPos); - token.level = level; - nodes.push(token); + on(div, "copy", onCopyCut); + on(div, "cut", onCopyCut); + }; + ContentEditableInput.prototype.screenReaderLabelChanged = function (label) { + if (label) { + this.div.setAttribute("aria-label", label); + } else { + this.div.removeAttribute("aria-label"); } - - // replace current node - blockTokens[j].children = tokens = arrayReplaceAt(tokens, i, nodes); - } - } - } -} - -// Simple typographic replacements -// -// (c) (C) → © -// (tm) (TM) → ™ -// (r) (R) → ® -// +- → ± -// ... → … (also ?.... → ?.., !.... → !..) -// ???????? → ???, !!!!! → !!!, `,,` → `,` -// -- → –, --- → — -// - -// TODO: -// - fractionals 1/2, 1/4, 3/4 -> ½, ¼, ¾ -// - multiplications 2 x 4 -> 2 × 4 - -const RARE_RE = /\+-|\.\.|\?\?\?\?|!!!!|,,|--/; - -// Workaround for phantomjs - need regex without /g flag, -// or root check will fail every second time -const SCOPED_ABBR_TEST_RE = /\((c|tm|r)\)/i; -const SCOPED_ABBR_RE = /\((c|tm|r)\)/ig; -const SCOPED_ABBR = { - c: '©', - r: '®', - tm: '™' -}; -function replaceFn(match, name) { - return SCOPED_ABBR[name.toLowerCase()]; -} -function replace_scoped(inlineTokens) { - let inside_autolink = 0; - for (let i = inlineTokens.length - 1; i >= 0; i--) { - const token = inlineTokens[i]; - if (token.type === 'text' && !inside_autolink) { - token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn); - } - if (token.type === 'link_open' && token.info === 'auto') { - inside_autolink--; - } - if (token.type === 'link_close' && token.info === 'auto') { - inside_autolink++; - } - } -} -function replace_rare(inlineTokens) { - let inside_autolink = 0; - for (let i = inlineTokens.length - 1; i >= 0; i--) { - const token = inlineTokens[i]; - if (token.type === 'text' && !inside_autolink) { - if (RARE_RE.test(token.content)) { - token.content = token.content.replace(/\+-/g, '±') - // .., ..., ....... -> … - // but ?..... & !..... -> ?.. & !.. - .replace(/\.{2,}/g, '…').replace(/([?!])…/g, '$1..').replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',') - // em-dash - .replace(/(^|[^-])---(?=[^-]|$)/mg, '$1\u2014') - // en-dash - .replace(/(^|\s)--(?=\s|$)/mg, '$1\u2013').replace(/(^|[^-\s])--(?=[^-\s]|$)/mg, '$1\u2013'); - } - } - if (token.type === 'link_open' && token.info === 'auto') { - inside_autolink--; - } - if (token.type === 'link_close' && token.info === 'auto') { - inside_autolink++; - } - } -} -function replace(state) { - let blkIdx; - if (!state.md.options.typographer) { - return; - } - for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) { - if (state.tokens[blkIdx].type !== 'inline') { - continue; - } - if (SCOPED_ABBR_TEST_RE.test(state.tokens[blkIdx].content)) { - replace_scoped(state.tokens[blkIdx].children); - } - if (RARE_RE.test(state.tokens[blkIdx].content)) { - replace_rare(state.tokens[blkIdx].children); - } - } -} - -// Convert straight quotation marks to typographic ones -// - -const QUOTE_TEST_RE = /['"]/; -const QUOTE_RE = /['"]/g; -const APOSTROPHE = '\u2019'; /* ’ */ - -function replaceAt(str, index, ch) { - return str.slice(0, index) + ch + str.slice(index + 1); -} -function process_inlines(tokens, state) { - let j; - const stack = []; - for (let i = 0; i < tokens.length; i++) { - const token = tokens[i]; - const thisLevel = tokens[i].level; - for (j = stack.length - 1; j >= 0; j--) { - if (stack[j].level <= thisLevel) { - break; - } - } - stack.length = j + 1; - if (token.type !== 'text') { - continue; - } - let text = token.content; - let pos = 0; - let max = text.length; - - /* eslint no-labels:0,block-scoped-var:0 */ - OUTER: while (pos < max) { - QUOTE_RE.lastIndex = pos; - const t = QUOTE_RE.exec(text); - if (!t) { - break; - } - let canOpen = true; - let canClose = true; - pos = t.index + 1; - const isSingle = t[0] === "'"; - - // Find previous character, - // default to space if it's the beginning of the line - // - let lastChar = 0x20; - if (t.index - 1 >= 0) { - lastChar = text.charCodeAt(t.index - 1); - } else { - for (j = i - 1; j >= 0; j--) { - if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // lastChar defaults to 0x20 - if (!tokens[j].content) continue; // should skip all tokens except 'text', 'html_inline' or 'code_inline' - - lastChar = tokens[j].content.charCodeAt(tokens[j].content.length - 1); - break; + }; + ContentEditableInput.prototype.prepareSelection = function () { + var result = prepareSelection(this.cm, false); + result.focus = activeElt() == this.div; + return result; + }; + ContentEditableInput.prototype.showSelection = function (info, takeFocus) { + if (!info || !this.cm.display.view.length) { + return; + } + if (info.focus || takeFocus) { + this.showPrimarySelection(); + } + this.showMultipleSelections(info); + }; + ContentEditableInput.prototype.getSelection = function () { + return this.cm.display.wrapper.ownerDocument.getSelection(); + }; + ContentEditableInput.prototype.showPrimarySelection = function () { + var sel = this.getSelection(), + cm = this.cm, + prim = cm.doc.sel.primary(); + var from = prim.from(), + to = prim.to(); + if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { + sel.removeAllRanges(); + return; + } + var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); + if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && cmp(minPos(curAnchor, curFocus), from) == 0 && cmp(maxPos(curAnchor, curFocus), to) == 0) { + return; + } + var view = cm.display.view; + var start = from.line >= cm.display.viewFrom && posToDOM(cm, from) || { + node: view[0].measure.map[2], + offset: 0 + }; + var end = to.line < cm.display.viewTo && posToDOM(cm, to); + if (!end) { + var measure = view[view.length - 1].measure; + var map2 = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; + end = { + node: map2[map2.length - 1], + offset: map2[map2.length - 2] - map2[map2.length - 3] + }; + } + if (!start || !end) { + sel.removeAllRanges(); + return; + } + var old = sel.rangeCount && sel.getRangeAt(0), + rng; + try { + rng = range(start.node, start.offset, end.offset, end.node); + } catch (e) {} + if (rng) { + if (!gecko && cm.state.focused) { + sel.collapse(start.node, start.offset); + if (!rng.collapsed) { + sel.removeAllRanges(); + sel.addRange(rng); + } + } else { + sel.removeAllRanges(); + sel.addRange(rng); + } + if (old && sel.anchorNode == null) { + sel.addRange(old); + } else if (gecko) { + this.startGracePeriod(); + } + } + this.rememberSelection(); + }; + ContentEditableInput.prototype.startGracePeriod = function () { + var this$1$1 = this; + clearTimeout(this.gracePeriod); + this.gracePeriod = setTimeout(function () { + this$1$1.gracePeriod = false; + if (this$1$1.selectionChanged()) { + this$1$1.cm.operation(function () { + return this$1$1.cm.curOp.selectionChanged = true; + }); + } + }, 20); + }; + ContentEditableInput.prototype.showMultipleSelections = function (info) { + removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); + removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); + }; + ContentEditableInput.prototype.rememberSelection = function () { + var sel = this.getSelection(); + this.lastAnchorNode = sel.anchorNode; + this.lastAnchorOffset = sel.anchorOffset; + this.lastFocusNode = sel.focusNode; + this.lastFocusOffset = sel.focusOffset; + }; + ContentEditableInput.prototype.selectionInEditor = function () { + var sel = this.getSelection(); + if (!sel.rangeCount) { + return false; + } + var node = sel.getRangeAt(0).commonAncestorContainer; + return contains(this.div, node); + }; + ContentEditableInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor") { + if (!this.selectionInEditor() || activeElt() != this.div) { + this.showSelection(this.prepareSelection(), true); + } + this.div.focus(); + } + }; + ContentEditableInput.prototype.blur = function () { + this.div.blur(); + }; + ContentEditableInput.prototype.getField = function () { + return this.div; + }; + ContentEditableInput.prototype.supportsTouch = function () { + return true; + }; + ContentEditableInput.prototype.receivedFocus = function () { + var this$1$1 = this; + var input = this; + if (this.selectionInEditor()) { + setTimeout(function () { + return this$1$1.pollSelection(); + }, 20); + } else { + runInOp(this.cm, function () { + return input.cm.curOp.selectionChanged = true; + }); + } + function poll() { + if (input.cm.state.focused) { + input.pollSelection(); + input.polling.set(input.cm.options.pollInterval, poll); + } + } + this.polling.set(this.cm.options.pollInterval, poll); + }; + ContentEditableInput.prototype.selectionChanged = function () { + var sel = this.getSelection(); + return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset; + }; + ContentEditableInput.prototype.pollSelection = function () { + if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { + return; + } + var sel = this.getSelection(), + cm = this.cm; + if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) { + this.cm.triggerOnKeyDown({ + type: "keydown", + keyCode: 8, + preventDefault: Math.abs + }); + this.blur(); + this.focus(); + return; + } + if (this.composing) { + return; + } + this.rememberSelection(); + var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var head = domToPos(cm, sel.focusNode, sel.focusOffset); + if (anchor && head) { + runInOp(cm, function () { + setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); + if (anchor.bad || head.bad) { + cm.curOp.selectionChanged = true; + } + }); + } + }; + ContentEditableInput.prototype.pollContent = function () { + if (this.readDOMTimeout != null) { + clearTimeout(this.readDOMTimeout); + this.readDOMTimeout = null; + } + var cm = this.cm, + display = cm.display, + sel = cm.doc.sel.primary(); + var from = sel.from(), + to = sel.to(); + if (from.ch == 0 && from.line > cm.firstLine()) { + from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); + } + if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) { + to = Pos(to.line + 1, 0); + } + if (from.line < display.viewFrom || to.line > display.viewTo - 1) { + return false; + } + var fromIndex, fromLine, fromNode; + if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { + fromLine = lineNo(display.view[0].line); + fromNode = display.view[0].node; + } else { + fromLine = lineNo(display.view[fromIndex].line); + fromNode = display.view[fromIndex - 1].node.nextSibling; + } + var toIndex = findViewIndex(cm, to.line); + var toLine, toNode; + if (toIndex == display.view.length - 1) { + toLine = display.viewTo - 1; + toNode = display.lineDiv.lastChild; + } else { + toLine = lineNo(display.view[toIndex + 1].line) - 1; + toNode = display.view[toIndex + 1].node.previousSibling; + } + if (!fromNode) { + return false; + } + var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); + var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); + while (newText.length > 1 && oldText.length > 1) { + if (lst(newText) == lst(oldText)) { + newText.pop(); + oldText.pop(); + toLine--; + } else if (newText[0] == oldText[0]) { + newText.shift(); + oldText.shift(); + fromLine++; + } else { + break; + } } - } - - // Find next character, - // default to space if it's the end of the line - // - let nextChar = 0x20; - if (pos < max) { - nextChar = text.charCodeAt(pos); - } else { - for (j = i + 1; j < tokens.length; j++) { - if (tokens[j].type === 'softbreak' || tokens[j].type === 'hardbreak') break; // nextChar defaults to 0x20 - if (!tokens[j].content) continue; // should skip all tokens except 'text', 'html_inline' or 'code_inline' - - nextChar = tokens[j].content.charCodeAt(0); - break; + var cutFront = 0, + cutEnd = 0; + var newTop = newText[0], + oldTop = oldText[0], + maxCutFront = Math.min(newTop.length, oldTop.length); + while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) { + ++cutFront; + } + var newBot = lst(newText), + oldBot = lst(oldText); + var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), oldBot.length - (oldText.length == 1 ? cutFront : 0)); + while (cutEnd < maxCutEnd && newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + ++cutEnd; + } + if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { + while (cutFront && cutFront > from.ch && newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + cutFront--; + cutEnd++; + } + } + newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); + newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); + var chFrom = Pos(fromLine, cutFront); + var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); + if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { + replaceRange(cm.doc, newText, chFrom, chTo, "+input"); + return true; + } + }; + ContentEditableInput.prototype.ensurePolled = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.reset = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.forceCompositionEnd = function () { + if (!this.composing) { + return; + } + clearTimeout(this.readDOMTimeout); + this.composing = null; + this.updateFromDOM(); + this.div.blur(); + this.div.focus(); + }; + ContentEditableInput.prototype.readFromDOMSoon = function () { + var this$1$1 = this; + if (this.readDOMTimeout != null) { + return; } + this.readDOMTimeout = setTimeout(function () { + this$1$1.readDOMTimeout = null; + if (this$1$1.composing) { + if (this$1$1.composing.done) { + this$1$1.composing = null; + } else { + return; + } + } + this$1$1.updateFromDOM(); + }, 80); + }; + ContentEditableInput.prototype.updateFromDOM = function () { + var this$1$1 = this; + if (this.cm.isReadOnly() || !this.pollContent()) { + runInOp(this.cm, function () { + return regChange(this$1$1.cm); + }); + } + }; + ContentEditableInput.prototype.setUneditable = function (node) { + node.contentEditable = "false"; + }; + ContentEditableInput.prototype.onKeyPress = function (e) { + if (e.charCode == 0 || this.composing) { + return; + } + e.preventDefault(); + if (!this.cm.isReadOnly()) { + operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); + } + }; + ContentEditableInput.prototype.readOnlyChanged = function (val) { + this.div.contentEditable = String(val != "nocursor"); + }; + ContentEditableInput.prototype.onContextMenu = function () {}; + ContentEditableInput.prototype.resetPosition = function () {}; + ContentEditableInput.prototype.needsContentAttribute = true; + function posToDOM(cm, pos) { + var view = findViewForLine(cm, pos.line); + if (!view || view.hidden) { + return null; + } + var line = getLine(cm.doc, pos.line); + var info = mapFromLineView(view, line, pos.line); + var order = getOrder(line, cm.doc.direction), + side = "left"; + if (order) { + var partPos = getBidiPartAt(order, pos.ch); + side = partPos % 2 ? "right" : "left"; + } + var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); + result.offset = result.collapse == "right" ? result.end : result.start; + return result; } - const isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar)); - const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar)); - const isLastWhiteSpace = isWhiteSpace(lastChar); - const isNextWhiteSpace = isWhiteSpace(nextChar); - if (isNextWhiteSpace) { - canOpen = false; - } else if (isNextPunctChar) { - if (!(isLastWhiteSpace || isLastPunctChar)) { - canOpen = false; + function isInGutter(node) { + for (var scan = node; scan; scan = scan.parentNode) { + if (/CodeMirror-gutter-wrapper/.test(scan.className)) { + return true; + } } + return false; } - if (isLastWhiteSpace) { - canClose = false; - } else if (isLastPunctChar) { - if (!(isNextWhiteSpace || isNextPunctChar)) { - canClose = false; + function badPos(pos, bad) { + if (bad) { + pos.bad = true; } + return pos; } - if (nextChar === 0x22 /* " */ && t[0] === '"') { - if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) { - // special case: 1"" - count first quote as an inch - canClose = canOpen = false; + function domTextBetween(cm, from, to, fromLine, toLine) { + var text = "", + closing = false, + lineSep = cm.doc.lineSeparator(), + extraLinebreak = false; + function recognizeMarker(id) { + return function (marker) { + return marker.id == id; + }; + } + function close() { + if (closing) { + text += lineSep; + if (extraLinebreak) { + text += lineSep; + } + closing = extraLinebreak = false; + } + } + function addText(str) { + if (str) { + close(); + text += str; + } + } + function walk(node) { + if (node.nodeType == 1) { + var cmText = node.getAttribute("cm-text"); + if (cmText) { + addText(cmText); + return; + } + var markerID = node.getAttribute("cm-marker"), + range2; + if (markerID) { + var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); + if (found.length && (range2 = found[0].find(0))) { + addText(getBetween(cm.doc, range2.from, range2.to).join(lineSep)); + } + return; + } + if (node.getAttribute("contenteditable") == "false") { + return; + } + var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName); + if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { + return; + } + if (isBlock) { + close(); + } + for (var i2 = 0; i2 < node.childNodes.length; i2++) { + walk(node.childNodes[i2]); + } + if (/^(pre|p)$/i.test(node.nodeName)) { + extraLinebreak = true; + } + if (isBlock) { + closing = true; + } + } else if (node.nodeType == 3) { + addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); + } + } + for (;;) { + walk(from); + if (from == to) { + break; + } + from = from.nextSibling; + extraLinebreak = false; } + return text; } - if (canOpen && canClose) { - // Replace quotes in the middle of punctuation sequence, but not - // in the middle of the words, i.e.: - // - // 1. foo " bar " baz - not replaced - // 2. foo-"-bar-"-baz - replaced - // 3. foo"bar"baz - not replaced - // - canOpen = isLastPunctChar; - canClose = isNextPunctChar; + function domToPos(cm, node, offset) { + var lineNode; + if (node == cm.display.lineDiv) { + lineNode = cm.display.lineDiv.childNodes[offset]; + if (!lineNode) { + return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true); + } + node = null; + offset = 0; + } else { + for (lineNode = node;; lineNode = lineNode.parentNode) { + if (!lineNode || lineNode == cm.display.lineDiv) { + return null; + } + if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { + break; + } + } + } + for (var i2 = 0; i2 < cm.display.view.length; i2++) { + var lineView = cm.display.view[i2]; + if (lineView.node == lineNode) { + return locateNodeInLineView(lineView, node, offset); + } + } } - if (!canOpen && !canClose) { - // middle of word - if (isSingle) { - token.content = replaceAt(token.content, t.index, APOSTROPHE); + function locateNodeInLineView(lineView, node, offset) { + var wrapper = lineView.text.firstChild, + bad = false; + if (!node || !contains(wrapper, node)) { + return badPos(Pos(lineNo(lineView.line), 0), true); + } + if (node == wrapper) { + bad = true; + node = wrapper.childNodes[offset]; + offset = 0; + if (!node) { + var line = lineView.rest ? lst(lineView.rest) : lineView.line; + return badPos(Pos(lineNo(line), line.text.length), bad); + } + } + var textNode = node.nodeType == 3 ? node : null, + topNode = node; + if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { + textNode = node.firstChild; + if (offset) { + offset = textNode.nodeValue.length; + } + } + while (topNode.parentNode != wrapper) { + topNode = topNode.parentNode; + } + var measure = lineView.measure, + maps = measure.maps; + function find(textNode2, topNode2, offset2) { + for (var i2 = -1; i2 < (maps ? maps.length : 0); i2++) { + var map2 = i2 < 0 ? measure.map : maps[i2]; + for (var j = 0; j < map2.length; j += 3) { + var curNode = map2[j + 2]; + if (curNode == textNode2 || curNode == topNode2) { + var line2 = lineNo(i2 < 0 ? lineView.line : lineView.rest[i2]); + var ch = map2[j] + offset2; + if (offset2 < 0 || curNode != textNode2) { + ch = map2[j + (offset2 ? 1 : 0)]; + } + return Pos(line2, ch); + } + } + } + } + var found = find(textNode, topNode, offset); + if (found) { + return badPos(found, bad); + } + for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { + found = find(after, after.firstChild, 0); + if (found) { + return badPos(Pos(found.line, found.ch - dist), bad); + } else { + dist += after.textContent.length; + } + } + for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { + found = find(before, before.firstChild, -1); + if (found) { + return badPos(Pos(found.line, found.ch + dist$1), bad); + } else { + dist$1 += before.textContent.length; + } } - continue; } - if (canClose) { - // this could be a closing quote, rewind the stack to get a match - for (j = stack.length - 1; j >= 0; j--) { - let item = stack[j]; - if (stack[j].level < thisLevel) { - break; + var TextareaInput = function (cm) { + this.cm = cm; + this.prevInput = ""; + this.pollingFast = false; + this.polling = new Delayed(); + this.hasSelection = false; + this.composing = null; + }; + TextareaInput.prototype.init = function (display) { + var this$1$1 = this; + var input = this, + cm = this.cm; + this.createField(display); + var te = this.textarea; + display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild); + if (ios) { + te.style.width = "0px"; + } + on(te, "input", function () { + if (ie && ie_version >= 9 && this$1$1.hasSelection) { + this$1$1.hasSelection = null; } - if (item.single === isSingle && stack[j].level === thisLevel) { - item = stack[j]; - let openQuote; - let closeQuote; - if (isSingle) { - openQuote = state.md.options.quotes[2]; - closeQuote = state.md.options.quotes[3]; + input.poll(); + }); + on(te, "paste", function (e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { + return; + } + cm.state.pasteIncoming = + /* @__PURE__ */new Date(); + input.fastPoll(); + }); + function prepareCopyCut(e) { + if (signalDOMEvent(cm, e)) { + return; + } + if (cm.somethingSelected()) { + setLastCopied({ + lineWise: false, + text: cm.getSelections() + }); + } else if (!cm.options.lineWiseCopyCut) { + return; + } else { + var ranges = copyableRanges(cm); + setLastCopied({ + lineWise: true, + text: ranges.text + }); + if (e.type == "cut") { + cm.setSelections(ranges.ranges, null, sel_dontScroll); } else { - openQuote = state.md.options.quotes[0]; - closeQuote = state.md.options.quotes[1]; - } - - // replace token.content *before* tokens[item.token].content, - // because, if they are pointing at the same token, replaceAt - // could mess up indices when quote length != 1 - token.content = replaceAt(token.content, t.index, closeQuote); - tokens[item.token].content = replaceAt(tokens[item.token].content, item.pos, openQuote); - pos += closeQuote.length - 1; - if (item.token === i) { - pos += openQuote.length - 1; + input.prevInput = ""; + te.value = ranges.text.join("\n"); + selectInput(te); } - text = token.content; - max = text.length; - stack.length = j; - continue OUTER; + } + if (e.type == "cut") { + cm.state.cutIncoming = + /* @__PURE__ */new Date(); } } - } - if (canOpen) { - stack.push({ - token: i, - pos: t.index, - single: isSingle, - level: thisLevel + on(te, "cut", prepareCopyCut); + on(te, "copy", prepareCopyCut); + on(display.scroller, "paste", function (e) { + if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { + return; + } + if (!te.dispatchEvent) { + cm.state.pasteIncoming = + /* @__PURE__ */new Date(); + input.focus(); + return; + } + var event = new Event("paste"); + event.clipboardData = e.clipboardData; + te.dispatchEvent(event); }); - } else if (canClose && isSingle) { - token.content = replaceAt(token.content, t.index, APOSTROPHE); + on(display.lineSpace, "selectstart", function (e) { + if (!eventInWidget(display, e)) { + e_preventDefault(e); + } + }); + on(te, "compositionstart", function () { + var start = cm.getCursor("from"); + if (input.composing) { + input.composing.range.clear(); + } + input.composing = { + start, + range: cm.markText(start, cm.getCursor("to"), { + className: "CodeMirror-composing" + }) + }; + }); + on(te, "compositionend", function () { + if (input.composing) { + input.poll(); + input.composing.range.clear(); + input.composing = null; + } + }); + }; + TextareaInput.prototype.createField = function (_display) { + this.wrapper = hiddenTextarea(); + this.textarea = this.wrapper.firstChild; + }; + TextareaInput.prototype.screenReaderLabelChanged = function (label) { + if (label) { + this.textarea.setAttribute("aria-label", label); + } else { + this.textarea.removeAttribute("aria-label"); + } + }; + TextareaInput.prototype.prepareSelection = function () { + var cm = this.cm, + display = cm.display, + doc = cm.doc; + var result = prepareSelection(cm); + if (cm.options.moveInputWithCursor) { + var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); + var wrapOff = display.wrapper.getBoundingClientRect(), + lineOff = display.lineDiv.getBoundingClientRect(); + result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, headPos.top + lineOff.top - wrapOff.top)); + result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, headPos.left + lineOff.left - wrapOff.left)); + } + return result; + }; + TextareaInput.prototype.showSelection = function (drawn) { + var cm = this.cm, + display = cm.display; + removeChildrenAndAdd(display.cursorDiv, drawn.cursors); + removeChildrenAndAdd(display.selectionDiv, drawn.selection); + if (drawn.teTop != null) { + this.wrapper.style.top = drawn.teTop + "px"; + this.wrapper.style.left = drawn.teLeft + "px"; + } + }; + TextareaInput.prototype.reset = function (typing) { + if (this.contextMenuPending || this.composing) { + return; + } + var cm = this.cm; + if (cm.somethingSelected()) { + this.prevInput = ""; + var content = cm.getSelection(); + this.textarea.value = content; + if (cm.state.focused) { + selectInput(this.textarea); + } + if (ie && ie_version >= 9) { + this.hasSelection = content; + } + } else if (!typing) { + this.prevInput = this.textarea.value = ""; + if (ie && ie_version >= 9) { + this.hasSelection = null; + } + } + }; + TextareaInput.prototype.getField = function () { + return this.textarea; + }; + TextareaInput.prototype.supportsTouch = function () { + return false; + }; + TextareaInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { + try { + this.textarea.focus(); + } catch (e) {} + } + }; + TextareaInput.prototype.blur = function () { + this.textarea.blur(); + }; + TextareaInput.prototype.resetPosition = function () { + this.wrapper.style.top = this.wrapper.style.left = 0; + }; + TextareaInput.prototype.receivedFocus = function () { + this.slowPoll(); + }; + TextareaInput.prototype.slowPoll = function () { + var this$1$1 = this; + if (this.pollingFast) { + return; + } + this.polling.set(this.cm.options.pollInterval, function () { + this$1$1.poll(); + if (this$1$1.cm.state.focused) { + this$1$1.slowPoll(); + } + }); + }; + TextareaInput.prototype.fastPoll = function () { + var missed = false, + input = this; + input.pollingFast = true; + function p() { + var changed = input.poll(); + if (!changed && !missed) { + missed = true; + input.polling.set(60, p); + } else { + input.pollingFast = false; + input.slowPoll(); + } + } + input.polling.set(20, p); + }; + TextareaInput.prototype.poll = function () { + var this$1$1 = this; + var cm = this.cm, + input = this.textarea, + prevInput = this.prevInput; + if (this.contextMenuPending || !cm.state.focused || hasSelection(input) && !prevInput && !this.composing || cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) { + return false; + } + var text = input.value; + if (text == prevInput && !cm.somethingSelected()) { + return false; + } + if (ie && ie_version >= 9 && this.hasSelection === text || mac && /[\uf700-\uf7ff]/.test(text)) { + cm.display.input.reset(); + return false; + } + if (cm.doc.sel == cm.display.selForContextMenu) { + var first = text.charCodeAt(0); + if (first == 8203 && !prevInput) { + prevInput = "​"; + } + if (first == 8666) { + this.reset(); + return this.cm.execCommand("undo"); + } + } + var same = 0, + l = Math.min(prevInput.length, text.length); + while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { + ++same; + } + runInOp(cm, function () { + applyTextInput(cm, text.slice(same), prevInput.length - same, null, this$1$1.composing ? "*compose" : null); + if (text.length > 1e3 || text.indexOf("\n") > -1) { + input.value = this$1$1.prevInput = ""; + } else { + this$1$1.prevInput = text; + } + if (this$1$1.composing) { + this$1$1.composing.range.clear(); + this$1$1.composing.range = cm.markText(this$1$1.composing.start, cm.getCursor("to"), { + className: "CodeMirror-composing" + }); + } + }); + return true; + }; + TextareaInput.prototype.ensurePolled = function () { + if (this.pollingFast && this.poll()) { + this.pollingFast = false; + } + }; + TextareaInput.prototype.onKeyPress = function () { + if (ie && ie_version >= 9) { + this.hasSelection = null; + } + this.fastPoll(); + }; + TextareaInput.prototype.onContextMenu = function (e) { + var input = this, + cm = input.cm, + display = cm.display, + te = input.textarea; + if (input.contextMenuPending) { + input.contextMenuPending(); + } + var pos = posFromMouse(cm, e), + scrollPos = display.scroller.scrollTop; + if (!pos || presto) { + return; + } + var reset = cm.options.resetSelectionOnContextMenu; + if (reset && cm.doc.sel.contains(pos) == -1) { + operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); + } + var oldCSS = te.style.cssText, + oldWrapperCSS = input.wrapper.style.cssText; + var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect(); + input.wrapper.style.cssText = "position: static"; + te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; + var oldScrollY; + if (webkit) { + oldScrollY = window.scrollY; + } + display.input.focus(); + if (webkit) { + window.scrollTo(null, oldScrollY); + } + display.input.reset(); + if (!cm.somethingSelected()) { + te.value = input.prevInput = " "; + } + input.contextMenuPending = rehide; + display.selForContextMenu = cm.doc.sel; + clearTimeout(display.detectingSelectAll); + function prepareSelectAllHack() { + if (te.selectionStart != null) { + var selected = cm.somethingSelected(); + var extval = "​" + (selected ? te.value : ""); + te.value = "⇚"; + te.value = extval; + input.prevInput = selected ? "" : "​"; + te.selectionStart = 1; + te.selectionEnd = extval.length; + display.selForContextMenu = cm.doc.sel; + } + } + function rehide() { + if (input.contextMenuPending != rehide) { + return; + } + input.contextMenuPending = false; + input.wrapper.style.cssText = oldWrapperCSS; + te.style.cssText = oldCSS; + if (ie && ie_version < 9) { + display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); + } + if (te.selectionStart != null) { + if (!ie || ie && ie_version < 9) { + prepareSelectAllHack(); + } + var i2 = 0, + poll = function () { + if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && te.selectionEnd > 0 && input.prevInput == "​") { + operation(cm, selectAll)(cm); + } else if (i2++ < 10) { + display.detectingSelectAll = setTimeout(poll, 500); + } else { + display.selForContextMenu = null; + display.input.reset(); + } + }; + display.detectingSelectAll = setTimeout(poll, 200); + } + } + if (ie && ie_version >= 9) { + prepareSelectAllHack(); + } + if (captureRightClick) { + e_stop(e); + var mouseup = function () { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }; + on(window, "mouseup", mouseup); + } else { + setTimeout(rehide, 50); + } + }; + TextareaInput.prototype.readOnlyChanged = function (val) { + if (!val) { + this.reset(); + } + this.textarea.disabled = val == "nocursor"; + this.textarea.readOnly = !!val; + }; + TextareaInput.prototype.setUneditable = function () {}; + TextareaInput.prototype.needsContentAttribute = false; + function fromTextArea(textarea, options) { + options = options ? copyObj(options) : {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabIndex) { + options.tabindex = textarea.tabIndex; + } + if (!options.placeholder && textarea.placeholder) { + options.placeholder = textarea.placeholder; + } + if (options.autofocus == null) { + var hasFocus = activeElt(); + options.autofocus = hasFocus == textarea || textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + function save() { + textarea.value = cm.getValue(); + } + var realSubmit; + if (textarea.form) { + on(textarea.form, "submit", save); + if (!options.leaveSubmitMethodAlone) { + var form = textarea.form; + realSubmit = form.submit; + try { + var wrappedSubmit = form.submit = function () { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch (e) {} + } + } + options.finishInit = function (cm2) { + cm2.save = save; + cm2.getTextArea = function () { + return textarea; + }; + cm2.toTextArea = function () { + cm2.toTextArea = isNaN; + save(); + textarea.parentNode.removeChild(cm2.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function") { + textarea.form.submit = realSubmit; + } + } + }; + }; + textarea.style.display = "none"; + var cm = CodeMirror(function (node) { + return textarea.parentNode.insertBefore(node, textarea.nextSibling); + }, options); + return cm; + } + function addLegacyProps(CodeMirror2) { + CodeMirror2.off = off; + CodeMirror2.on = on; + CodeMirror2.wheelEventPixels = wheelEventPixels; + CodeMirror2.Doc = Doc; + CodeMirror2.splitLines = splitLinesAuto; + CodeMirror2.countColumn = countColumn; + CodeMirror2.findColumn = findColumn; + CodeMirror2.isWordChar = isWordCharBasic; + CodeMirror2.Pass = Pass; + CodeMirror2.signal = signal; + CodeMirror2.Line = Line; + CodeMirror2.changeEnd = changeEnd; + CodeMirror2.scrollbarModel = scrollbarModel; + CodeMirror2.Pos = Pos; + CodeMirror2.cmpPos = cmp; + CodeMirror2.modes = modes; + CodeMirror2.mimeModes = mimeModes; + CodeMirror2.resolveMode = resolveMode; + CodeMirror2.getMode = getMode; + CodeMirror2.modeExtensions = modeExtensions; + CodeMirror2.extendMode = extendMode; + CodeMirror2.copyState = copyState; + CodeMirror2.startState = startState; + CodeMirror2.innerMode = innerMode; + CodeMirror2.commands = commands; + CodeMirror2.keyMap = keyMap; + CodeMirror2.keyName = keyName; + CodeMirror2.isModifierKey = isModifierKey; + CodeMirror2.lookupKey = lookupKey; + CodeMirror2.normalizeKeyMap = normalizeKeyMap; + CodeMirror2.StringStream = StringStream; + CodeMirror2.SharedTextMarker = SharedTextMarker; + CodeMirror2.TextMarker = TextMarker; + CodeMirror2.LineWidget = LineWidget; + CodeMirror2.e_preventDefault = e_preventDefault; + CodeMirror2.e_stopPropagation = e_stopPropagation; + CodeMirror2.e_stop = e_stop; + CodeMirror2.addClass = addClass; + CodeMirror2.contains = contains; + CodeMirror2.rmClass = rmClass; + CodeMirror2.keyNames = keyNames; + } + defineOptions(CodeMirror); + addEditorMethods(CodeMirror); + var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); + for (var prop in Doc.prototype) { + if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) { + CodeMirror.prototype[prop] = /* @__PURE__ */function (method) { + return function () { + return method.apply(this.doc, arguments); + }; + }(Doc.prototype[prop]); + } } - } - } -} -function smartquotes(state) { - /* eslint max-depth:0 */ - if (!state.md.options.typographer) { - return; - } - for (let blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) { - if (state.tokens[blkIdx].type !== 'inline' || !QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) { - continue; - } - process_inlines(state.tokens[blkIdx].children, state); - } + eventMixin(Doc); + CodeMirror.inputStyles = { + "textarea": TextareaInput, + "contenteditable": ContentEditableInput + }; + CodeMirror.defineMode = function (name) { + if (!CodeMirror.defaults.mode && name != "null") { + CodeMirror.defaults.mode = name; + } + defineMode.apply(this, arguments); + }; + CodeMirror.defineMIME = defineMIME; + CodeMirror.defineMode("null", function () { + return { + token: function (stream) { + return stream.skipToEnd(); + } + }; + }); + CodeMirror.defineMIME("text/plain", "null"); + CodeMirror.defineExtension = function (name, func) { + CodeMirror.prototype[name] = func; + }; + CodeMirror.defineDocExtension = function (name, func) { + Doc.prototype[name] = func; + }; + CodeMirror.fromTextArea = fromTextArea; + addLegacyProps(CodeMirror); + CodeMirror.version = "5.65.3"; + return CodeMirror; + }); + })(codemirror); + return codemirror.exports; } +exports.getDefaultExportFromCjs = getDefaultExportFromCjs; +exports.requireCodemirror = requireCodemirror; -// Join raw text tokens with the rest of the text -// -// This is set as a separate rule to provide an opportunity for plugins -// to run text replacements after text join, but before escape join. -// -// For example, `\:)` shouldn't be replaced with an emoji. -// +/***/ }), -function text_join(state) { - let curr, last; - const blockTokens = state.tokens; - const l = blockTokens.length; - for (let j = 0; j < l; j++) { - if (blockTokens[j].type !== 'inline') continue; - const tokens = blockTokens[j].children; - const max = tokens.length; - for (curr = 0; curr < max; curr++) { - if (tokens[curr].type === 'text_special') { - tokens[curr].type = 'text'; - } - } - for (curr = last = 0; curr < max; curr++) { - if (tokens[curr].type === 'text' && curr + 1 < max && tokens[curr + 1].type === 'text') { - // collapse two adjacent text nodes - tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content; - } else { - if (curr !== last) { - tokens[last] = tokens[curr]; - } - last++; - } - } - if (curr !== last) { - tokens.length = last; - } - } -} +/***/ "../../graphiql-react/dist/comment.cjs.js": +/*!************************************************!*\ + !*** ../../graphiql-react/dist/comment.cjs.js ***! + \************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -/** internal - * class Core - * - * Top-level rules executor. Glues block/inline parsers and does intermediate - * transformations. - **/ -const _rules$2 = [['normalize', normalize], ['block', block], ['inline', inline], ['linkify', linkify$1], ['replacements', replace], ['smartquotes', smartquotes], -// `text_join` finds `text_special` tokens (for escape sequences) -// and joins them with the rest of the text -['text_join', text_join]]; -/** - * new Core() - **/ -function Core() { - /** - * Core#ruler -> Ruler - * - * [[Ruler]] instance. Keep configuration of core rules. - **/ - this.ruler = new Ruler(); - for (let i = 0; i < _rules$2.length; i++) { - this.ruler.push(_rules$2[i][0], _rules$2[i][1]); +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } + } } + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); } - -/** - * Core.process(state) - * - * Executes core chain rules. - **/ -Core.prototype.process = function (state) { - const rules = this.ruler.getRules(''); - for (let i = 0, l = rules.length; i < l; i++) { - rules[i](state); - } +var comment$2 = { + exports: {} }; -Core.prototype.State = StateCore; - -// Parser state class - -function StateBlock(src, md, env, tokens) { - this.src = src; - - // link to parser instance - this.md = md; - this.env = env; - - // - // Internal state vartiables - // - - this.tokens = tokens; - this.bMarks = []; // line begin offsets for fast jumps - this.eMarks = []; // line end offsets for fast jumps - this.tShift = []; // offsets of the first non-space characters (tabs not expanded) - this.sCount = []; // indents for each line (tabs expanded) - - // An amount of virtual spaces (tabs expanded) between beginning - // of each line (bMarks) and real beginning of that line. - // - // It exists only as a hack because blockquotes override bMarks - // losing information in the process. - // - // It's used only when expanding tabs, you can think about it as - // an initial tab length, e.g. bsCount=21 applied to string `\t123` - // means first tab should be expanded to 4-21%4 === 3 spaces. - // - this.bsCount = []; - - // block parser variables - - // required block content indent (for example, if we are - // inside a list, it would be positioned after list marker) - this.blkIndent = 0; - this.line = 0; // line index in src - this.lineMax = 0; // lines count - this.tight = false; // loose/tight mode for lists - this.ddIndent = -1; // indent of the current dd block (-1 if there isn't any) - this.listIndent = -1; // indent of the current list block (-1 if there isn't any) - - // can be 'blockquote', 'list', 'root', 'paragraph' or 'reference' - // used in lists to determine if they interrupt a paragraph - this.parentType = 'root'; - this.level = 0; - - // Create caches - // Generate markers. - const s = this.src; - for (let start = 0, pos = 0, indent = 0, offset = 0, len = s.length, indent_found = false; pos < len; pos++) { - const ch = s.charCodeAt(pos); - if (!indent_found) { - if (isSpace(ch)) { - indent++; - if (ch === 0x09) { - offset += 4 - offset % 4; +(function (module2, exports2) { + (function (mod) { + mod(codemirror.requireCodemirror()); + })(function (CodeMirror) { + var noOptions = {}; + var nonWS = /[^\s\u00a0]/; + var Pos = CodeMirror.Pos, + cmp = CodeMirror.cmpPos; + function firstNonWS(str) { + var found = str.search(nonWS); + return found == -1 ? 0 : found; + } + CodeMirror.commands.toggleComment = function (cm) { + cm.toggleComment(); + }; + CodeMirror.defineExtension("toggleComment", function (options) { + if (!options) options = noOptions; + var cm = this; + var minLine = Infinity, + ranges = this.listSelections(), + mode = null; + for (var i = ranges.length - 1; i >= 0; i--) { + var from = ranges[i].from(), + to = ranges[i].to(); + if (from.line >= minLine) continue; + if (to.line >= minLine) to = Pos(minLine, 0); + minLine = from.line; + if (mode == null) { + if (cm.uncomment(from, to, options)) mode = "un";else { + cm.lineComment(from, to, options); + mode = "line"; + } + } else if (mode == "un") { + cm.uncomment(from, to, options); } else { - offset++; + cm.lineComment(from, to, options); } - continue; - } else { - indent_found = true; } - } - if (ch === 0x0A || pos === len - 1) { - if (ch !== 0x0A) { - pos++; + }); + function probablyInsideString(cm, pos, line) { + return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"\`]/.test(line); + } + function getMode(cm, pos) { + var mode = cm.getMode(); + return mode.useInnerComments === false || !mode.innerMode ? mode : cm.getModeAt(pos); + } + CodeMirror.defineExtension("lineComment", function (from, to, options) { + if (!options) options = noOptions; + var self = this, + mode = getMode(self, from); + var firstLine = self.getLine(from.line); + if (firstLine == null || probablyInsideString(self, from, firstLine)) return; + var commentString = options.lineComment || mode.lineComment; + if (!commentString) { + if (options.blockCommentStart || mode.blockCommentStart) { + options.fullLines = true; + self.blockComment(from, to, options); + } + return; } - this.bMarks.push(start); - this.eMarks.push(pos); - this.tShift.push(indent); - this.sCount.push(offset); - this.bsCount.push(0); - indent_found = false; - indent = 0; - offset = 0; - start = pos + 1; - } - } + var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1); + var pad = options.padding == null ? " " : options.padding; + var blankLines = options.commentBlankLines || from.line == to.line; + self.operation(function () { + if (options.indent) { + var baseString = null; + for (var i = from.line; i < end; ++i) { + var line = self.getLine(i); + var whitespace = line.slice(0, firstNonWS(line)); + if (baseString == null || baseString.length > whitespace.length) { + baseString = whitespace; + } + } + for (var i = from.line; i < end; ++i) { + var line = self.getLine(i), + cut = baseString.length; + if (!blankLines && !nonWS.test(line)) continue; + if (line.slice(0, cut) != baseString) cut = firstNonWS(line); + self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut)); + } + } else { + for (var i = from.line; i < end; ++i) { + if (blankLines || nonWS.test(self.getLine(i))) self.replaceRange(commentString + pad, Pos(i, 0)); + } + } + }); + }); + CodeMirror.defineExtension("blockComment", function (from, to, options) { + if (!options) options = noOptions; + var self = this, + mode = getMode(self, from); + var startString = options.blockCommentStart || mode.blockCommentStart; + var endString = options.blockCommentEnd || mode.blockCommentEnd; + if (!startString || !endString) { + if ((options.lineComment || mode.lineComment) && options.fullLines != false) self.lineComment(from, to, options); + return; + } + if (/\bcomment\b/.test(self.getTokenTypeAt(Pos(from.line, 0)))) return; + var end = Math.min(to.line, self.lastLine()); + if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end; + var pad = options.padding == null ? " " : options.padding; + if (from.line > end) return; + self.operation(function () { + if (options.fullLines != false) { + var lastLineHasText = nonWS.test(self.getLine(end)); + self.replaceRange(pad + endString, Pos(end)); + self.replaceRange(startString + pad, Pos(from.line, 0)); + var lead = options.blockCommentLead || mode.blockCommentLead; + if (lead != null) { + for (var i = from.line + 1; i <= end; ++i) if (i != end || lastLineHasText) self.replaceRange(lead + pad, Pos(i, 0)); + } + } else { + var atCursor = cmp(self.getCursor("to"), to) == 0, + empty = !self.somethingSelected(); + self.replaceRange(endString, to); + if (atCursor) self.setSelection(empty ? to : self.getCursor("from"), to); + self.replaceRange(startString, from); + } + }); + }); + CodeMirror.defineExtension("uncomment", function (from, to, options) { + if (!options) options = noOptions; + var self = this, + mode = getMode(self, from); + var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), + start = Math.min(from.line, end); + var lineString = options.lineComment || mode.lineComment, + lines = []; + var pad = options.padding == null ? " " : options.padding, + didSomething; + lineComment: { + if (!lineString) break lineComment; + for (var i = start; i <= end; ++i) { + var line = self.getLine(i); + var found = line.indexOf(lineString); + if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; + if (found == -1 && nonWS.test(line)) break lineComment; + if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; + lines.push(line); + } + self.operation(function () { + for (var i2 = start; i2 <= end; ++i2) { + var line2 = lines[i2 - start]; + var pos = line2.indexOf(lineString), + endPos = pos + lineString.length; + if (pos < 0) continue; + if (line2.slice(endPos, endPos + pad.length) == pad) endPos += pad.length; + didSomething = true; + self.replaceRange("", Pos(i2, pos), Pos(i2, endPos)); + } + }); + if (didSomething) return true; + } + var startString = options.blockCommentStart || mode.blockCommentStart; + var endString = options.blockCommentEnd || mode.blockCommentEnd; + if (!startString || !endString) return false; + var lead = options.blockCommentLead || mode.blockCommentLead; + var startLine = self.getLine(start), + open = startLine.indexOf(startString); + if (open == -1) return false; + var endLine = end == start ? startLine : self.getLine(end); + var close = endLine.indexOf(endString, end == start ? open + startString.length : 0); + var insideStart = Pos(start, open + 1), + insideEnd = Pos(end, close + 1); + if (close == -1 || !/comment/.test(self.getTokenTypeAt(insideStart)) || !/comment/.test(self.getTokenTypeAt(insideEnd)) || self.getRange(insideStart, insideEnd, "\n").indexOf(endString) > -1) return false; + var lastStart = startLine.lastIndexOf(startString, from.ch); + var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length); + if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false; + firstEnd = endLine.indexOf(endString, to.ch); + var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch); + lastStart = firstEnd == -1 || almostLastStart == -1 ? -1 : to.ch + almostLastStart; + if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false; + self.operation(function () { + self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), Pos(end, close + endString.length)); + var openEnd = open + startString.length; + if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length; + self.replaceRange("", Pos(start, open), Pos(start, openEnd)); + if (lead) for (var i2 = start + 1; i2 <= end; ++i2) { + var line2 = self.getLine(i2), + found2 = line2.indexOf(lead); + if (found2 == -1 || nonWS.test(line2.slice(0, found2))) continue; + var foundEnd = found2 + lead.length; + if (pad && line2.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length; + self.replaceRange("", Pos(i2, found2), Pos(i2, foundEnd)); + } + }); + return true; + }); + }); +})(); +var commentExports = comment$2.exports; +const comment = /* @__PURE__ */codemirror.getDefaultExportFromCjs(commentExports); +const comment$1 = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: comment +}, [commentExports]); +exports.comment = comment$1; + +/***/ }), + +/***/ "../../graphiql-react/dist/dialog.cjs.js": +/*!***********************************************!*\ + !*** ../../graphiql-react/dist/dialog.cjs.js ***! + \***********************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - // Push fake entry to simplify cache bounds checks - this.bMarks.push(s.length); - this.eMarks.push(s.length); - this.tShift.push(0); - this.sCount.push(0); - this.bsCount.push(0); - this.lineMax = this.bMarks.length - 1; // don't count last fake line -} -// Push new token to "stream". -// -StateBlock.prototype.push = function (type, tag, nesting) { - const token = new Token(type, tag, nesting); - token.block = true; - if (nesting < 0) this.level--; // closing tag - token.level = this.level; - if (nesting > 0) this.level++; // opening tag - this.tokens.push(token); - return token; -}; -StateBlock.prototype.isEmpty = function isEmpty(line) { - return this.bMarks[line] + this.tShift[line] >= this.eMarks[line]; -}; -StateBlock.prototype.skipEmptyLines = function skipEmptyLines(from) { - for (let max = this.lineMax; from < max; from++) { - if (this.bMarks[from] + this.tShift[from] < this.eMarks[from]) { - break; +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } } } - return from; + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); +} +var dialog$2 = { + exports: {} }; +(function (module2, exports2) { + (function (mod) { + mod(codemirror.requireCodemirror()); + })(function (CodeMirror) { + function dialogDiv(cm, template, bottom) { + var wrap = cm.getWrapperElement(); + var dialog2; + dialog2 = wrap.appendChild(document.createElement("div")); + if (bottom) dialog2.className = "CodeMirror-dialog CodeMirror-dialog-bottom";else dialog2.className = "CodeMirror-dialog CodeMirror-dialog-top"; + if (typeof template == "string") { + dialog2.innerHTML = template; + } else { + dialog2.appendChild(template); + } + CodeMirror.addClass(wrap, "dialog-opened"); + return dialog2; + } + function closeNotification(cm, newVal) { + if (cm.state.currentNotificationClose) cm.state.currentNotificationClose(); + cm.state.currentNotificationClose = newVal; + } + CodeMirror.defineExtension("openDialog", function (template, callback, options) { + if (!options) options = {}; + closeNotification(this, null); + var dialog2 = dialogDiv(this, template, options.bottom); + var closed = false, + me = this; + function close(newVal) { + if (typeof newVal == "string") { + inp.value = newVal; + } else { + if (closed) return; + closed = true; + CodeMirror.rmClass(dialog2.parentNode, "dialog-opened"); + dialog2.parentNode.removeChild(dialog2); + me.focus(); + if (options.onClose) options.onClose(dialog2); + } + } + var inp = dialog2.getElementsByTagName("input")[0], + button; + if (inp) { + inp.focus(); + if (options.value) { + inp.value = options.value; + if (options.selectValueOnOpen !== false) { + inp.select(); + } + } + if (options.onInput) CodeMirror.on(inp, "input", function (e) { + options.onInput(e, inp.value, close); + }); + if (options.onKeyUp) CodeMirror.on(inp, "keyup", function (e) { + options.onKeyUp(e, inp.value, close); + }); + CodeMirror.on(inp, "keydown", function (e) { + if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { + return; + } + if (e.keyCode == 27 || options.closeOnEnter !== false && e.keyCode == 13) { + inp.blur(); + CodeMirror.e_stop(e); + close(); + } + if (e.keyCode == 13) callback(inp.value, e); + }); + if (options.closeOnBlur !== false) CodeMirror.on(dialog2, "focusout", function (evt) { + if (evt.relatedTarget !== null) close(); + }); + } else if (button = dialog2.getElementsByTagName("button")[0]) { + CodeMirror.on(button, "click", function () { + close(); + me.focus(); + }); + if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); + button.focus(); + } + return close; + }); + CodeMirror.defineExtension("openConfirm", function (template, callbacks, options) { + closeNotification(this, null); + var dialog2 = dialogDiv(this, template, options && options.bottom); + var buttons = dialog2.getElementsByTagName("button"); + var closed = false, + me = this, + blurring = 1; + function close() { + if (closed) return; + closed = true; + CodeMirror.rmClass(dialog2.parentNode, "dialog-opened"); + dialog2.parentNode.removeChild(dialog2); + me.focus(); + } + buttons[0].focus(); + for (var i = 0; i < buttons.length; ++i) { + var b = buttons[i]; + (function (callback) { + CodeMirror.on(b, "click", function (e) { + CodeMirror.e_preventDefault(e); + close(); + if (callback) callback(me); + }); + })(callbacks[i]); + CodeMirror.on(b, "blur", function () { + --blurring; + setTimeout(function () { + if (blurring <= 0) close(); + }, 200); + }); + CodeMirror.on(b, "focus", function () { + ++blurring; + }); + } + }); + CodeMirror.defineExtension("openNotification", function (template, options) { + closeNotification(this, close); + var dialog2 = dialogDiv(this, template, options && options.bottom); + var closed = false, + doneTimer; + var duration = options && typeof options.duration !== "undefined" ? options.duration : 5e3; + function close() { + if (closed) return; + closed = true; + clearTimeout(doneTimer); + CodeMirror.rmClass(dialog2.parentNode, "dialog-opened"); + dialog2.parentNode.removeChild(dialog2); + } + CodeMirror.on(dialog2, "click", function (e) { + CodeMirror.e_preventDefault(e); + close(); + }); + if (duration) doneTimer = setTimeout(close, duration); + return close; + }); + }); +})(); +var dialogExports = dialog$2.exports; +const dialog = /* @__PURE__ */codemirror.getDefaultExportFromCjs(dialogExports); +const dialog$1 = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: dialog +}, [dialogExports]); +exports.dialog = dialog$1; +exports.dialogExports = dialogExports; -// Skip spaces from given position. -StateBlock.prototype.skipSpaces = function skipSpaces(pos) { - for (let max = this.src.length; pos < max; pos++) { - const ch = this.src.charCodeAt(pos); - if (!isSpace(ch)) { - break; - } - } - return pos; -}; +/***/ }), -// Skip spaces from given position in reverse. -StateBlock.prototype.skipSpacesBack = function skipSpacesBack(pos, min) { - if (pos <= min) { - return pos; - } - while (pos > min) { - if (!isSpace(this.src.charCodeAt(--pos))) { - return pos + 1; - } - } - return pos; -}; +/***/ "../../graphiql-react/dist/foldgutter.cjs.js": +/*!***************************************************!*\ + !*** ../../graphiql-react/dist/foldgutter.cjs.js ***! + \***************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -// Skip char codes from given position -StateBlock.prototype.skipChars = function skipChars(pos, code) { - for (let max = this.src.length; pos < max; pos++) { - if (this.src.charCodeAt(pos) !== code) { - break; - } - } - return pos; -}; -// Skip char codes reverse from given position - 1 -StateBlock.prototype.skipCharsBack = function skipCharsBack(pos, code, min) { - if (pos <= min) { - return pos; - } - while (pos > min) { - if (code !== this.src.charCodeAt(--pos)) { - return pos + 1; + +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } } } - return pos; + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); +} +var foldgutter$2 = { + exports: {} }; - -// cut lines range from source. -StateBlock.prototype.getLines = function getLines(begin, end, indent, keepLastLF) { - if (begin >= end) { - return ''; - } - const queue = new Array(end - begin); - for (let i = 0, line = begin; line < end; line++, i++) { - let lineIndent = 0; - const lineStart = this.bMarks[line]; - let first = lineStart; - let last; - if (line + 1 < end || keepLastLF) { - // No need for bounds check because we have fake entry on tail. - last = this.eMarks[line] + 1; - } else { - last = this.eMarks[line]; - } - while (first < last && lineIndent < indent) { - const ch = this.src.charCodeAt(first); - if (isSpace(ch)) { - if (ch === 0x09) { - lineIndent += 4 - (lineIndent + this.bsCount[line]) % 4; +var foldcode = { + exports: {} +}; +var hasRequiredFoldcode; +function requireFoldcode() { + if (hasRequiredFoldcode) return foldcode.exports; + hasRequiredFoldcode = 1; + (function (module2, exports2) { + (function (mod) { + mod(codemirror.requireCodemirror()); + })(function (CodeMirror) { + function doFold(cm, pos, options, force) { + if (options && options.call) { + var finder = options; + options = null; } else { - lineIndent++; + var finder = getOption(cm, options, "rangeFinder"); + } + if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0); + var minSize = getOption(cm, options, "minFoldSize"); + function getRange(allowFolded) { + var range2 = finder(cm, pos); + if (!range2 || range2.to.line - range2.from.line < minSize) return null; + if (force === "fold") return range2; + var marks = cm.findMarksAt(range2.from); + for (var i = 0; i < marks.length; ++i) { + if (marks[i].__isFold) { + if (!allowFolded) return null; + range2.cleared = true; + marks[i].clear(); + } + } + return range2; + } + var range = getRange(true); + if (getOption(cm, options, "scanUp")) while (!range && pos.line > cm.firstLine()) { + pos = CodeMirror.Pos(pos.line - 1, 0); + range = getRange(false); + } + if (!range || range.cleared || force === "unfold") return; + var myWidget = makeWidget(cm, options, range); + CodeMirror.on(myWidget, "mousedown", function (e) { + myRange.clear(); + CodeMirror.e_preventDefault(e); + }); + var myRange = cm.markText(range.from, range.to, { + replacedWith: myWidget, + clearOnEnter: getOption(cm, options, "clearOnEnter"), + __isFold: true + }); + myRange.on("clear", function (from, to) { + CodeMirror.signal(cm, "unfold", cm, from, to); + }); + CodeMirror.signal(cm, "fold", cm, range.from, range.to); + } + function makeWidget(cm, options, range) { + var widget = getOption(cm, options, "widget"); + if (typeof widget == "function") { + widget = widget(range.from, range.to); + } + if (typeof widget == "string") { + var text = document.createTextNode(widget); + widget = document.createElement("span"); + widget.appendChild(text); + widget.className = "CodeMirror-foldmarker"; + } else if (widget) { + widget = widget.cloneNode(true); + } + return widget; + } + CodeMirror.newFoldFunction = function (rangeFinder, widget) { + return function (cm, pos) { + doFold(cm, pos, { + rangeFinder, + widget + }); + }; + }; + CodeMirror.defineExtension("foldCode", function (pos, options, force) { + doFold(this, pos, options, force); + }); + CodeMirror.defineExtension("isFolded", function (pos) { + var marks = this.findMarksAt(pos); + for (var i = 0; i < marks.length; ++i) if (marks[i].__isFold) return true; + }); + CodeMirror.commands.toggleFold = function (cm) { + cm.foldCode(cm.getCursor()); + }; + CodeMirror.commands.fold = function (cm) { + cm.foldCode(cm.getCursor(), null, "fold"); + }; + CodeMirror.commands.unfold = function (cm) { + cm.foldCode(cm.getCursor(), { + scanUp: false + }, "unfold"); + }; + CodeMirror.commands.foldAll = function (cm) { + cm.operation(function () { + for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) cm.foldCode(CodeMirror.Pos(i, 0), { + scanUp: false + }, "fold"); + }); + }; + CodeMirror.commands.unfoldAll = function (cm) { + cm.operation(function () { + for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) cm.foldCode(CodeMirror.Pos(i, 0), { + scanUp: false + }, "unfold"); + }); + }; + CodeMirror.registerHelper("fold", "combine", function () { + var funcs = Array.prototype.slice.call(arguments, 0); + return function (cm, start) { + for (var i = 0; i < funcs.length; ++i) { + var found = funcs[i](cm, start); + if (found) return found; + } + }; + }); + CodeMirror.registerHelper("fold", "auto", function (cm, start) { + var helpers = cm.getHelpers(start, "fold"); + for (var i = 0; i < helpers.length; i++) { + var cur = helpers[i](cm, start); + if (cur) return cur; } - } else if (first - lineStart < this.tShift[line]) { - // patched tShift masked characters to look like spaces (blockquotes, list markers) - lineIndent++; - } else { - break; + }); + var defaultOptions = { + rangeFinder: CodeMirror.fold.auto, + widget: "↔", + minFoldSize: 0, + scanUp: false, + clearOnEnter: true + }; + CodeMirror.defineOption("foldOptions", null); + function getOption(cm, options, name) { + if (options && options[name] !== void 0) return options[name]; + var editorOptions = cm.options.foldOptions; + if (editorOptions && editorOptions[name] !== void 0) return editorOptions[name]; + return defaultOptions[name]; + } + CodeMirror.defineExtension("foldOption", function (options, name) { + return getOption(this, options, name); + }); + }); + })(); + return foldcode.exports; +} +(function (module2, exports2) { + (function (mod) { + mod(codemirror.requireCodemirror(), requireFoldcode()); + })(function (CodeMirror) { + CodeMirror.defineOption("foldGutter", false, function (cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.clearGutter(cm.state.foldGutter.options.gutter); + cm.state.foldGutter = null; + cm.off("gutterClick", onGutterClick); + cm.off("changes", onChange); + cm.off("viewportChange", onViewportChange); + cm.off("fold", onFold); + cm.off("unfold", onFold); + cm.off("swapDoc", onChange); + } + if (val) { + cm.state.foldGutter = new State(parseOptions(val)); + updateInViewport(cm); + cm.on("gutterClick", onGutterClick); + cm.on("changes", onChange); + cm.on("viewportChange", onViewportChange); + cm.on("fold", onFold); + cm.on("unfold", onFold); + cm.on("swapDoc", onChange); } - first++; + }); + var Pos = CodeMirror.Pos; + function State(options) { + this.options = options; + this.from = this.to = 0; + } + function parseOptions(opts) { + if (opts === true) opts = {}; + if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter"; + if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open"; + if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded"; + return opts; + } + function isFolded(cm, line) { + var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0)); + for (var i = 0; i < marks.length; ++i) { + if (marks[i].__isFold) { + var fromPos = marks[i].find(-1); + if (fromPos && fromPos.line === line) return marks[i]; + } + } + } + function marker(spec) { + if (typeof spec == "string") { + var elt = document.createElement("div"); + elt.className = spec + " CodeMirror-guttermarker-subtle"; + return elt; + } else { + return spec.cloneNode(true); + } + } + function updateFoldInfo(cm, from, to) { + var opts = cm.state.foldGutter.options, + cur = from - 1; + var minSize = cm.foldOption(opts, "minFoldSize"); + var func = cm.foldOption(opts, "rangeFinder"); + var clsFolded = typeof opts.indicatorFolded == "string" && classTest(opts.indicatorFolded); + var clsOpen = typeof opts.indicatorOpen == "string" && classTest(opts.indicatorOpen); + cm.eachLine(from, to, function (line) { + ++cur; + var mark = null; + var old = line.gutterMarkers; + if (old) old = old[opts.gutter]; + if (isFolded(cm, cur)) { + if (clsFolded && old && clsFolded.test(old.className)) return; + mark = marker(opts.indicatorFolded); + } else { + var pos = Pos(cur, 0); + var range = func && func(cm, pos); + if (range && range.to.line - range.from.line >= minSize) { + if (clsOpen && old && clsOpen.test(old.className)) return; + mark = marker(opts.indicatorOpen); + } + } + if (!mark && !old) return; + cm.setGutterMarker(line, opts.gutter, mark); + }); } - if (lineIndent > indent) { - // partially expanding tabs in code blocks, e.g '\t\tfoobar' - // with indent=2 becomes ' \tfoobar' - queue[i] = new Array(lineIndent - indent + 1).join(' ') + this.src.slice(first, last); - } else { - queue[i] = this.src.slice(first, last); + function classTest(cls) { + return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); } - } - return queue.join(''); -}; + function updateInViewport(cm) { + var vp = cm.getViewport(), + state = cm.state.foldGutter; + if (!state) return; + cm.operation(function () { + updateFoldInfo(cm, vp.from, vp.to); + }); + state.from = vp.from; + state.to = vp.to; + } + function onGutterClick(cm, line, gutter) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + if (gutter != opts.gutter) return; + var folded = isFolded(cm, line); + if (folded) folded.clear();else cm.foldCode(Pos(line, 0), opts); + } + function onChange(cm) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + state.from = state.to = 0; + clearTimeout(state.changeUpdate); + state.changeUpdate = setTimeout(function () { + updateInViewport(cm); + }, opts.foldOnChangeTimeSpan || 600); + } + function onViewportChange(cm) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + clearTimeout(state.changeUpdate); + state.changeUpdate = setTimeout(function () { + var vp = cm.getViewport(); + if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { + updateInViewport(cm); + } else { + cm.operation(function () { + if (vp.from < state.from) { + updateFoldInfo(cm, vp.from, state.from); + state.from = vp.from; + } + if (vp.to > state.to) { + updateFoldInfo(cm, state.to, vp.to); + state.to = vp.to; + } + }); + } + }, opts.updateViewportTimeSpan || 400); + } + function onFold(cm, from) { + var state = cm.state.foldGutter; + if (!state) return; + var line = from.line; + if (line >= state.from && line < state.to) updateFoldInfo(cm, line, line + 1); + } + }); +})(); +var foldgutterExports = foldgutter$2.exports; +const foldgutter = /* @__PURE__ */codemirror.getDefaultExportFromCjs(foldgutterExports); +const foldgutter$1 = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: foldgutter +}, [foldgutterExports]); +exports.foldgutter = foldgutter$1; -// re-export Token class to use in block rules -StateBlock.prototype.Token = Token; +/***/ }), -// GFM table, https://github.github.com/gfm/#tables-extension- +/***/ "../../graphiql-react/dist/forEachState.cjs.js": +/*!*****************************************************!*\ + !*** ../../graphiql-react/dist/forEachState.cjs.js ***! + \*****************************************************/ +/***/ (function(__unused_webpack_module, exports) { -// Limit the amount of empty autocompleted cells in a table, -// see https://github.com/markdown-it/markdown-it/issues/1000, -// -// Both pulldown-cmark and commonmark-hs limit the number of cells this way to ~200k. -// We set it to 65k, which can expand user input by a factor of x370 -// (256x256 square is 1.8kB expanded into 650kB). -const MAX_AUTOCOMPLETED_CELLS = 0x10000; -function getLine(state, line) { - const pos = state.bMarks[line] + state.tShift[line]; - const max = state.eMarks[line]; - return state.src.slice(pos, max); -} -function escapedSplit(str) { - const result = []; - const max = str.length; - let pos = 0; - let ch = str.charCodeAt(pos); - let isEscaped = false; - let lastPos = 0; - let current = ''; - while (pos < max) { - if (ch === 0x7c /* | */) { - if (!isEscaped) { - // pipe separating cells, '|' - result.push(current + str.substring(lastPos, pos)); - current = ''; - lastPos = pos + 1; - } else { - // escaped pipe, '\|' - current += str.substring(lastPos, pos - 1); - lastPos = pos; - } - } - isEscaped = ch === 0x5c /* \ */; - pos++; - ch = str.charCodeAt(pos); + + +function forEachState(stack, fn) { + const reverseStateStack = []; + let state = stack; + while (state === null || state === void 0 ? void 0 : state.kind) { + reverseStateStack.push(state); + state = state.prevState; + } + for (let i = reverseStateStack.length - 1; i >= 0; i--) { + fn(reverseStateStack[i]); } - result.push(current + str.substring(lastPos)); - return result; } -function table(state, startLine, endLine, silent) { - // should have at least two lines - if (startLine + 2 > endLine) { - return false; +exports.forEachState = forEachState; + +/***/ }), + +/***/ "../../graphiql-react/dist/hint.cjs.js": +/*!*********************************************!*\ + !*** ../../graphiql-react/dist/hint.cjs.js ***! + \*********************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + + + +const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); +__webpack_require__(/*! ./show-hint.cjs.js */ "../../graphiql-react/dist/show-hint.cjs.js"); +const graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); +codemirror.CodeMirror.registerHelper("hint", "graphql", (editor, options) => { + const { + schema, + externalFragments, + autocompleteOptions + } = options; + if (!schema) { + return; } - let nextLine = startLine + 1; - if (state.sCount[nextLine] < state.blkIndent) { - return false; + const cur = editor.getCursor(); + const token = editor.getTokenAt(cur); + const tokenStart = token.type !== null && /"|\w/.test(token.string[0]) ? token.start : token.end; + const position = new graphqlLanguageService.Position(cur.line, tokenStart); + const rawResults = graphqlLanguageService.getAutocompleteSuggestions(schema, editor.getValue(), position, token, externalFragments, autocompleteOptions); + const results = { + list: rawResults.map(item => { + var _a; + return { + text: (_a = item === null || item === void 0 ? void 0 : item.rawInsert) !== null && _a !== void 0 ? _a : item.label, + type: item.type, + description: item.documentation, + isDeprecated: item.isDeprecated, + deprecationReason: item.deprecationReason + }; + }), + from: { + line: cur.line, + ch: tokenStart + }, + to: { + line: cur.line, + ch: token.end + } + }; + if ((results === null || results === void 0 ? void 0 : results.list) && results.list.length > 0) { + results.from = codemirror.CodeMirror.Pos(results.from.line, results.from.ch); + results.to = codemirror.CodeMirror.Pos(results.to.line, results.to.ch); + codemirror.CodeMirror.signal(editor, "hasCompletion", editor, results, token); } + return results; +}); - // if it's indented more than 3 spaces, it should be a code block - if (state.sCount[nextLine] - state.blkIndent >= 4) { - return false; - } +/***/ }), - // first character of the second line should be '|', '-', ':', - // and no other characters are allowed but spaces; - // basically, this is the equivalent of /^[-:|][-:|\s]*$/ regexp +/***/ "../../graphiql-react/dist/hint.cjs2.js": +/*!**********************************************!*\ + !*** ../../graphiql-react/dist/hint.cjs2.js ***! + \**********************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - let pos = state.bMarks[nextLine] + state.tShift[nextLine]; - if (pos >= state.eMarks[nextLine]) { - return false; - } - const firstCh = state.src.charCodeAt(pos++); - if (firstCh !== 0x7C /* | */ && firstCh !== 0x2D /* - */ && firstCh !== 0x3A /* : */) { - return false; + + +const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); +const graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +const forEachState = __webpack_require__(/*! ./forEachState.cjs.js */ "../../graphiql-react/dist/forEachState.cjs.js"); +function hintList(cursor, token, list) { + const hints = filterAndSortList(list, normalizeText(token.string)); + if (!hints) { + return; } - if (pos >= state.eMarks[nextLine]) { - return false; + const tokenStart = token.type !== null && /"|\w/.test(token.string[0]) ? token.start : token.end; + return { + list: hints, + from: { + line: cursor.line, + ch: tokenStart + }, + to: { + line: cursor.line, + ch: token.end + } + }; +} +function filterAndSortList(list, text) { + if (!text) { + return filterNonEmpty(list, entry => !entry.isDeprecated); } - const secondCh = state.src.charCodeAt(pos++); - if (secondCh !== 0x7C /* | */ && secondCh !== 0x2D /* - */ && secondCh !== 0x3A /* : */ && !isSpace(secondCh)) { - return false; + const byProximity = list.map(entry => ({ + proximity: getProximity(normalizeText(entry.text), text), + entry + })); + const conciseMatches = filterNonEmpty(filterNonEmpty(byProximity, pair => pair.proximity <= 2), pair => !pair.entry.isDeprecated); + const sortedMatches = conciseMatches.sort((a, b) => (a.entry.isDeprecated ? 1 : 0) - (b.entry.isDeprecated ? 1 : 0) || a.proximity - b.proximity || a.entry.text.length - b.entry.text.length); + return sortedMatches.map(pair => pair.entry); +} +function filterNonEmpty(array, predicate) { + const filtered = array.filter(predicate); + return filtered.length === 0 ? array : filtered; +} +function normalizeText(text) { + return text.toLowerCase().replaceAll(/\W/g, ""); +} +function getProximity(suggestion, text) { + let proximity = lexicalDistance(text, suggestion); + if (suggestion.length > text.length) { + proximity -= suggestion.length - text.length - 1; + proximity += suggestion.indexOf(text) === 0 ? 0 : 0.5; } - - // if first character is '-', then second character must not be a space - // (due to parsing ambiguity with list) - if (firstCh === 0x2D /* - */ && isSpace(secondCh)) { - return false; + return proximity; +} +function lexicalDistance(a, b) { + let i; + let j; + const d = []; + const aLength = a.length; + const bLength = b.length; + for (i = 0; i <= aLength; i++) { + d[i] = [i]; } - while (pos < state.eMarks[nextLine]) { - const ch = state.src.charCodeAt(pos); - if (ch !== 0x7C /* | */ && ch !== 0x2D /* - */ && ch !== 0x3A /* : */ && !isSpace(ch)) { - return false; - } - pos++; + for (j = 1; j <= bLength; j++) { + d[0][j] = j; } - let lineText = getLine(state, startLine + 1); - let columns = lineText.split('|'); - const aligns = []; - for (let i = 0; i < columns.length; i++) { - const t = columns[i].trim(); - if (!t) { - // allow empty columns before and after table, but not in between columns; - // e.g. allow ` |---| `, disallow ` ---||--- ` - if (i === 0 || i === columns.length - 1) { - continue; - } else { - return false; + for (i = 1; i <= aLength; i++) { + for (j = 1; j <= bLength; j++) { + const cost = a[i - 1] === b[j - 1] ? 0 : 1; + d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost); + if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) { + d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost); } } - if (!/^:?-+:?$/.test(t)) { - return false; - } - if (t.charCodeAt(t.length - 1) === 0x3A /* : */) { - aligns.push(t.charCodeAt(0) === 0x3A /* : */ ? 'center' : 'right'); - } else if (t.charCodeAt(0) === 0x3A /* : */) { - aligns.push('left'); - } else { - aligns.push(''); - } } - lineText = getLine(state, startLine).trim(); - if (lineText.indexOf('|') === -1) { - return false; + return d[aLength][bLength]; +} +codemirror.CodeMirror.registerHelper("hint", "graphql-variables", (editor, options) => { + const cur = editor.getCursor(); + const token = editor.getTokenAt(cur); + const results = getVariablesHint(cur, token, options); + if ((results === null || results === void 0 ? void 0 : results.list) && results.list.length > 0) { + results.from = codemirror.CodeMirror.Pos(results.from.line, results.from.ch); + results.to = codemirror.CodeMirror.Pos(results.to.line, results.to.ch); + codemirror.CodeMirror.signal(editor, "hasCompletion", editor, results, token); } - if (state.sCount[startLine] - state.blkIndent >= 4) { - return false; + return results; +}); +function getVariablesHint(cur, token, options) { + const state = token.state.kind === "Invalid" ? token.state.prevState : token.state; + const { + kind, + step + } = state; + if (kind === "Document" && step === 0) { + return hintList(cur, token, [{ + text: "{" + }]); } - columns = escapedSplit(lineText); - if (columns.length && columns[0] === '') columns.shift(); - if (columns.length && columns[columns.length - 1] === '') columns.pop(); - - // header row will define an amount of columns in the entire table, - // and align row should be exactly the same (the rest of the rows can differ) - const columnCount = columns.length; - if (columnCount === 0 || columnCount !== aligns.length) { - return false; + const { + variableToType + } = options; + if (!variableToType) { + return; } - if (silent) { - return true; + const typeInfo = getTypeInfo(variableToType, token.state); + if (kind === "Document" || kind === "Variable" && step === 0) { + const variableNames = Object.keys(variableToType); + return hintList(cur, token, variableNames.map(name => ({ + text: `"${name}": `, + type: variableToType[name] + }))); } - const oldParentType = state.parentType; - state.parentType = 'table'; + if ((kind === "ObjectValue" || kind === "ObjectField" && step === 0) && typeInfo.fields) { + const inputFields = Object.keys(typeInfo.fields).map(fieldName => typeInfo.fields[fieldName]); + return hintList(cur, token, inputFields.map(field => ({ + text: `"${field.name}": `, + type: field.type, + description: field.description + }))); + } + if (kind === "StringValue" || kind === "NumberValue" || kind === "BooleanValue" || kind === "NullValue" || kind === "ListValue" && step === 1 || kind === "ObjectField" && step === 2 || kind === "Variable" && step === 2) { + const namedInputType = typeInfo.type ? graphql.getNamedType(typeInfo.type) : void 0; + if (namedInputType instanceof graphql.GraphQLInputObjectType) { + return hintList(cur, token, [{ + text: "{" + }]); + } + if (namedInputType instanceof graphql.GraphQLEnumType) { + const values = namedInputType.getValues(); + return hintList(cur, token, values.map(value => ({ + text: `"${value.name}"`, + type: namedInputType, + description: value.description + }))); + } + if (namedInputType === graphql.GraphQLBoolean) { + return hintList(cur, token, [{ + text: "true", + type: graphql.GraphQLBoolean, + description: "Not false." + }, { + text: "false", + type: graphql.GraphQLBoolean, + description: "Not true." + }]); + } + } +} +function getTypeInfo(variableToType, tokenState) { + const info = { + type: null, + fields: null + }; + forEachState.forEachState(tokenState, state => { + switch (state.kind) { + case "Variable": + { + info.type = variableToType[state.name]; + break; + } + case "ListValue": + { + const nullableType = info.type ? graphql.getNullableType(info.type) : void 0; + info.type = nullableType instanceof graphql.GraphQLList ? nullableType.ofType : null; + break; + } + case "ObjectValue": + { + const objectType = info.type ? graphql.getNamedType(info.type) : void 0; + info.fields = objectType instanceof graphql.GraphQLInputObjectType ? objectType.getFields() : null; + break; + } + case "ObjectField": + { + const objectField = state.name && info.fields ? info.fields[state.name] : null; + info.type = objectField === null || objectField === void 0 ? void 0 : objectField.type; + break; + } + } + }); + return info; +} - // use 'blockquote' lists for termination because it's - // the most similar to tables - const terminatorRules = state.md.block.ruler.getRules('blockquote'); - const token_to = state.push('table_open', 'table', 1); - const tableLines = [startLine, 0]; - token_to.map = tableLines; - const token_tho = state.push('thead_open', 'thead', 1); - token_tho.map = [startLine, startLine + 1]; - const token_htro = state.push('tr_open', 'tr', 1); - token_htro.map = [startLine, startLine + 1]; - for (let i = 0; i < columns.length; i++) { - const token_ho = state.push('th_open', 'th', 1); - if (aligns[i]) { - token_ho.attrs = [['style', 'text-align:' + aligns[i]]]; +/***/ }), + +/***/ "../../graphiql-react/dist/index.js": +/*!******************************************!*\ + !*** ../../graphiql-react/dist/index.js ***! + \******************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, Symbol.toStringTag, { + value: "Module" +}); +const jsxRuntime = __webpack_require__(/*! react/jsx-runtime */ "../../../node_modules/react/jsx-runtime.js"); +const React = __webpack_require__(/*! react */ "react"); +const clsx = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.m.js"); +const graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +const toolkit = __webpack_require__(/*! @graphiql/toolkit */ "../../graphiql-toolkit/dist/esm/index.js"); +const graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); +const setValue = __webpack_require__(/*! set-value */ "../../../node_modules/set-value/index.js"); +const getValue = __webpack_require__(/*! get-value */ "../../../node_modules/get-value/index.js"); +const copyToClipboard = __webpack_require__(/*! copy-to-clipboard */ "../../../node_modules/copy-to-clipboard/index.js"); +const D = __webpack_require__(/*! @radix-ui/react-dialog */ "../../../node_modules/@radix-ui/react-dialog/dist/index.js"); +const reactVisuallyHidden = __webpack_require__(/*! @radix-ui/react-visually-hidden */ "../../../node_modules/@radix-ui/react-visually-hidden/dist/index.js"); +const reactDropdownMenu = __webpack_require__(/*! @radix-ui/react-dropdown-menu */ "../../../node_modules/@radix-ui/react-dropdown-menu/dist/index.js"); +const MarkdownIt = __webpack_require__(/*! markdown-it */ "../../../node_modules/markdown-it/dist/index.cjs.js"); +const framerMotion = __webpack_require__(/*! framer-motion */ "../../../node_modules/framer-motion/dist/cjs/index.js"); +const T = __webpack_require__(/*! @radix-ui/react-tooltip */ "../../../node_modules/@radix-ui/react-tooltip/dist/index.js"); +const react = __webpack_require__(/*! @headlessui/react */ "../../../node_modules/@headlessui/react/dist/index.cjs"); +const ReactDOM = __webpack_require__(/*! react-dom */ "react-dom"); +function _interopNamespaceDefault(e) { + const n = Object.create(null, { + [Symbol.toStringTag]: { + value: "Module" + } + }); + if (e) { + for (const k in e) { + if (k !== "default") { + const d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } + n.default = e; + return Object.freeze(n); +} +const React__namespace = /* @__PURE__ */_interopNamespaceDefault(React); +const D__namespace = /* @__PURE__ */_interopNamespaceDefault(D); +const T__namespace = /* @__PURE__ */_interopNamespaceDefault(T); +function createNullableContext(name) { + const context = React.createContext(null); + context.displayName = name; + return context; +} +function createContextHook(context) { + function useGivenContext(options) { + var _a; + const value = React.useContext(context); + if (value === null && (options == null ? void 0 : options.nonNull)) { + throw new Error(`Tried to use \`${((_a = options.caller) == null ? void 0 : _a.name) || useGivenContext.caller.name}\` without the necessary context. Make sure to render the \`${context.displayName}Provider\` component higher up the tree.`); } - const token_il = state.push('inline', '', 0); - token_il.content = columns[i].trim(); - token_il.children = []; - state.push('th_close', 'th', -1); + return value; } - state.push('tr_close', 'tr', -1); - state.push('thead_close', 'thead', -1); - let tbodyLines; - let autocompletedCells = 0; - for (nextLine = startLine + 2; nextLine < endLine; nextLine++) { - if (state.sCount[nextLine] < state.blkIndent) { - break; + Object.defineProperty(useGivenContext, "name", { + value: `use${context.displayName}` + }); + return useGivenContext; +} +const StorageContext = createNullableContext("StorageContext"); +function StorageContextProvider(props) { + const isInitialRender = React.useRef(true); + const [storage, setStorage] = React.useState(() => new toolkit.StorageAPI(props.storage)); + React.useEffect(() => { + if (isInitialRender.current) { + isInitialRender.current = false; + } else { + setStorage(new toolkit.StorageAPI(props.storage)); } - let terminate = false; - for (let i = 0, l = terminatorRules.length; i < l; i++) { - if (terminatorRules[i](state, nextLine, endLine, true)) { - terminate = true; - break; + }, [props.storage]); + return /* @__PURE__ */jsxRuntime.jsx(StorageContext.Provider, { + value: storage, + children: props.children + }); +} +const useStorageContext = createContextHook(StorageContext); +const SvgArgument = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 14 14", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M5.0484 1.40838C6.12624 0.33054 7.87376 0.330541 8.9516 1.40838L12.5916 5.0484C13.6695 6.12624 13.6695 7.87376 12.5916 8.9516L8.9516 12.5916C7.87376 13.6695 6.12624 13.6695 5.0484 12.5916L1.40838 8.9516C0.33054 7.87376 0.330541 6.12624 1.40838 5.0484L5.0484 1.40838Z", + stroke: "currentColor", + strokeWidth: 1.2 +}), /* @__PURE__ */React__namespace.createElement("rect", { + x: 6, + y: 6, + width: 2, + height: 2, + rx: 1, + fill: "currentColor" +})); +const SvgChevronDown = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 14 9", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M1 1L7 7L13 1", + stroke: "currentColor", + strokeWidth: 1.5 +})); +const SvgChevronLeft = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 7 10", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M6 1.04819L2 5.04819L6 9.04819", + stroke: "currentColor", + strokeWidth: 1.75 +})); +const SvgChevronUp = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 14 9", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M13 8L7 2L1 8", + stroke: "currentColor", + strokeWidth: 1.5 +})); +const SvgClose = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 14 14", + stroke: "currentColor", + strokeWidth: 3, + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M1 1L12.9998 12.9997" +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M13 1L1.00079 13.0003" +})); +const SvgCopy = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "-2 -2 22 22", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M11.25 14.2105V15.235C11.25 16.3479 10.3479 17.25 9.23501 17.25H2.76499C1.65214 17.25 0.75 16.3479 0.75 15.235L0.75 8.76499C0.75 7.65214 1.65214 6.75 2.76499 6.75L3.78947 6.75", + stroke: "currentColor", + strokeWidth: 1.5 +}), /* @__PURE__ */React__namespace.createElement("rect", { + x: 6.75, + y: 0.75, + width: 10.5, + height: 10.5, + rx: 2.2069, + stroke: "currentColor", + strokeWidth: 1.5 +})); +const SvgDeprecatedArgument = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 14 14", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M5.0484 1.40838C6.12624 0.33054 7.87376 0.330541 8.9516 1.40838L12.5916 5.0484C13.6695 6.12624 13.6695 7.87376 12.5916 8.9516L8.9516 12.5916C7.87376 13.6695 6.12624 13.6695 5.0484 12.5916L1.40838 8.9516C0.33054 7.87376 0.330541 6.12624 1.40838 5.0484L5.0484 1.40838Z", + stroke: "currentColor", + strokeWidth: 1.2 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M5 9L9 5", + stroke: "currentColor", + strokeWidth: 1.2 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M5 5L9 9", + stroke: "currentColor", + strokeWidth: 1.2 +})); +const SvgDeprecatedEnumValue = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 12 12", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M4 8L8 4", + stroke: "currentColor", + strokeWidth: 1.2 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M4 4L8 8", + stroke: "currentColor", + strokeWidth: 1.2 +}), /* @__PURE__ */React__namespace.createElement("path", { + fillRule: "evenodd", + clipRule: "evenodd", + d: "M8.5 1.2H9C9.99411 1.2 10.8 2.00589 10.8 3V9C10.8 9.99411 9.99411 10.8 9 10.8H8.5V12H9C10.6569 12 12 10.6569 12 9V3C12 1.34315 10.6569 0 9 0H8.5V1.2ZM3.5 1.2V0H3C1.34315 0 0 1.34315 0 3V9C0 10.6569 1.34315 12 3 12H3.5V10.8H3C2.00589 10.8 1.2 9.99411 1.2 9V3C1.2 2.00589 2.00589 1.2 3 1.2H3.5Z", + fill: "currentColor" +})); +const SvgDeprecatedField = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 12 12", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("rect", { + x: 0.6, + y: 0.6, + width: 10.8, + height: 10.8, + rx: 3.4, + stroke: "currentColor", + strokeWidth: 1.2 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M4 8L8 4", + stroke: "currentColor", + strokeWidth: 1.2 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M4 4L8 8", + stroke: "currentColor", + strokeWidth: 1.2 +})); +const SvgDirective = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0.5 12 12", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("rect", { + x: 7, + y: 5.5, + width: 2, + height: 2, + rx: 1, + transform: "rotate(90 7 5.5)", + fill: "currentColor" +}), /* @__PURE__ */React__namespace.createElement("path", { + fillRule: "evenodd", + clipRule: "evenodd", + d: "M10.8 9L10.8 9.5C10.8 10.4941 9.99411 11.3 9 11.3L3 11.3C2.00589 11.3 1.2 10.4941 1.2 9.5L1.2 9L-3.71547e-07 9L-3.93402e-07 9.5C-4.65826e-07 11.1569 1.34314 12.5 3 12.5L9 12.5C10.6569 12.5 12 11.1569 12 9.5L12 9L10.8 9ZM10.8 4L12 4L12 3.5C12 1.84315 10.6569 0.5 9 0.5L3 0.5C1.34315 0.5 -5.87117e-08 1.84315 -1.31135e-07 3.5L-1.5299e-07 4L1.2 4L1.2 3.5C1.2 2.50589 2.00589 1.7 3 1.7L9 1.7C9.99411 1.7 10.8 2.50589 10.8 3.5L10.8 4Z", + fill: "currentColor" +})); +const SvgDocsFilled = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 20 24", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M0.75 3C0.75 1.75736 1.75736 0.75 3 0.75H17.25C17.8023 0.75 18.25 1.19772 18.25 1.75V5.25", + stroke: "currentColor", + strokeWidth: 1.5 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M0.75 3C0.75 4.24264 1.75736 5.25 3 5.25H18.25C18.8023 5.25 19.25 5.69771 19.25 6.25V22.25C19.25 22.8023 18.8023 23.25 18.25 23.25H3C1.75736 23.25 0.75 22.2426 0.75 21V3Z", + stroke: "currentColor", + strokeWidth: 1.5 +}), /* @__PURE__ */React__namespace.createElement("path", { + fillRule: "evenodd", + clipRule: "evenodd", + d: "M3 5.25C1.75736 5.25 0.75 4.24264 0.75 3V21C0.75 22.2426 1.75736 23.25 3 23.25H18.25C18.8023 23.25 19.25 22.8023 19.25 22.25V6.25C19.25 5.69771 18.8023 5.25 18.25 5.25H3ZM13 11L6 11V12.5L13 12.5V11Z", + fill: "currentColor" +})); +const SvgDocs = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 20 24", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M0.75 3C0.75 4.24264 1.75736 5.25 3 5.25H17.25M0.75 3C0.75 1.75736 1.75736 0.75 3 0.75H16.25C16.8023 0.75 17.25 1.19772 17.25 1.75V5.25M0.75 3V21C0.75 22.2426 1.75736 23.25 3 23.25H18.25C18.8023 23.25 19.25 22.8023 19.25 22.25V6.25C19.25 5.69771 18.8023 5.25 18.25 5.25H17.25", + stroke: "currentColor", + strokeWidth: 1.5 +}), /* @__PURE__ */React__namespace.createElement("line", { + x1: 13, + y1: 11.75, + x2: 6, + y2: 11.75, + stroke: "currentColor", + strokeWidth: 1.5 +})); +const SvgEnumValue = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 12 12", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("rect", { + x: 5, + y: 5, + width: 2, + height: 2, + rx: 1, + fill: "currentColor" +}), /* @__PURE__ */React__namespace.createElement("path", { + fillRule: "evenodd", + clipRule: "evenodd", + d: "M8.5 1.2H9C9.99411 1.2 10.8 2.00589 10.8 3V9C10.8 9.99411 9.99411 10.8 9 10.8H8.5V12H9C10.6569 12 12 10.6569 12 9V3C12 1.34315 10.6569 0 9 0H8.5V1.2ZM3.5 1.2V0H3C1.34315 0 0 1.34315 0 3V9C0 10.6569 1.34315 12 3 12H3.5V10.8H3C2.00589 10.8 1.2 9.99411 1.2 9V3C1.2 2.00589 2.00589 1.2 3 1.2H3.5Z", + fill: "currentColor" +})); +const SvgField = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 12 13", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("rect", { + x: 0.6, + y: 1.1, + width: 10.8, + height: 10.8, + rx: 2.4, + stroke: "currentColor", + strokeWidth: 1.2 +}), /* @__PURE__ */React__namespace.createElement("rect", { + x: 5, + y: 5.5, + width: 2, + height: 2, + rx: 1, + fill: "currentColor" +})); +const SvgHistory = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 24 20", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M1.59375 9.52344L4.87259 12.9944L8.07872 9.41249", + stroke: "currentColor", + strokeWidth: 1.5, + strokeLinecap: "square" +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M13.75 5.25V10.75H18.75", + stroke: "currentColor", + strokeWidth: 1.5, + strokeLinecap: "square" +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M4.95427 11.9332C4.55457 10.0629 4.74441 8.11477 5.49765 6.35686C6.25089 4.59894 7.5305 3.11772 9.16034 2.11709C10.7902 1.11647 12.6901 0.645626 14.5986 0.769388C16.5071 0.893151 18.3303 1.60543 19.8172 2.80818C21.3042 4.01093 22.3818 5.64501 22.9017 7.48548C23.4216 9.32595 23.3582 11.2823 22.7203 13.0853C22.0824 14.8883 20.9013 16.4492 19.3396 17.5532C17.778 18.6572 15.9125 19.25 14 19.25", + stroke: "currentColor", + strokeWidth: 1.5 +})); +const SvgImplements = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 12 12", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("circle", { + cx: 6, + cy: 6, + r: 5.4, + stroke: "currentColor", + strokeWidth: 1.2, + strokeDasharray: "4.241025 4.241025", + transform: "rotate(22.5)", + "transform-origin": "center" +}), /* @__PURE__ */React__namespace.createElement("circle", { + cx: 6, + cy: 6, + r: 1, + fill: "currentColor" +})); +const SvgKeyboardShortcut = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 19 18", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M1.5 14.5653C1.5 15.211 1.75652 15.8303 2.21314 16.2869C2.66975 16.7435 3.28905 17 3.9348 17C4.58054 17 5.19984 16.7435 5.65646 16.2869C6.11307 15.8303 6.36959 15.211 6.36959 14.5653V12.1305H3.9348C3.28905 12.1305 2.66975 12.387 2.21314 12.8437C1.75652 13.3003 1.5 13.9195 1.5 14.5653Z", + stroke: "currentColor", + strokeWidth: 1.125, + strokeLinecap: "round", + strokeLinejoin: "round" +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M3.9348 1.00063C3.28905 1.00063 2.66975 1.25715 2.21314 1.71375C1.75652 2.17035 1.5 2.78964 1.5 3.43537C1.5 4.0811 1.75652 4.70038 2.21314 5.15698C2.66975 5.61358 3.28905 5.8701 3.9348 5.8701H6.36959V3.43537C6.36959 2.78964 6.11307 2.17035 5.65646 1.71375C5.19984 1.25715 4.58054 1.00063 3.9348 1.00063Z", + stroke: "currentColor", + strokeWidth: 1.125, + strokeLinecap: "round", + strokeLinejoin: "round" +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M15.0652 12.1305H12.6304V14.5653C12.6304 15.0468 12.7732 15.5175 13.0407 15.9179C13.3083 16.3183 13.6885 16.6304 14.1334 16.8147C14.5783 16.9989 15.0679 17.0472 15.5402 16.9532C16.0125 16.8593 16.4464 16.6274 16.7869 16.2869C17.1274 15.9464 17.3593 15.5126 17.4532 15.0403C17.5472 14.568 17.4989 14.0784 17.3147 13.6335C17.1304 13.1886 16.8183 12.8084 16.4179 12.5409C16.0175 12.2733 15.5468 12.1305 15.0652 12.1305Z", + stroke: "currentColor", + strokeWidth: 1.125, + strokeLinecap: "round", + strokeLinejoin: "round" +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M12.6318 5.86775H6.36955V12.1285H12.6318V5.86775Z", + stroke: "currentColor", + strokeWidth: 1.125, + strokeLinecap: "round", + strokeLinejoin: "round" +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M17.5 3.43473C17.5 2.789 17.2435 2.16972 16.7869 1.71312C16.3303 1.25652 15.711 1 15.0652 1C14.4195 1 13.8002 1.25652 13.3435 1.71312C12.8869 2.16972 12.6304 2.789 12.6304 3.43473V5.86946H15.0652C15.711 5.86946 16.3303 5.61295 16.7869 5.15635C17.2435 4.69975 17.5 4.08046 17.5 3.43473Z", + stroke: "currentColor", + strokeWidth: 1.125, + strokeLinecap: "round", + strokeLinejoin: "round" +})); +const SvgMagnifyingGlass = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 13 13", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("circle", { + cx: 5, + cy: 5, + r: 4.35, + stroke: "currentColor", + strokeWidth: 1.3 +}), /* @__PURE__ */React__namespace.createElement("line", { + x1: 8.45962, + y1: 8.54038, + x2: 11.7525, + y2: 11.8333, + stroke: "currentColor", + strokeWidth: 1.3 +})); +const SvgMerge = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "-2 -2 22 22", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M17.2492 6V2.9569C17.2492 1.73806 16.2611 0.75 15.0423 0.75L2.9569 0.75C1.73806 0.75 0.75 1.73806 0.75 2.9569L0.75 6", + stroke: "currentColor", + strokeWidth: 1.5 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M0.749873 12V15.0431C0.749873 16.2619 1.73794 17.25 2.95677 17.25H15.0421C16.261 17.25 17.249 16.2619 17.249 15.0431V12", + stroke: "currentColor", + strokeWidth: 1.5 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M6 4.5L9 7.5L12 4.5", + stroke: "currentColor", + strokeWidth: 1.5 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M12 13.5L9 10.5L6 13.5", + stroke: "currentColor", + strokeWidth: 1.5 +})); +const SvgPen = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 14 14", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M0.75 13.25L0.0554307 12.967C-0.0593528 13.2488 0.00743073 13.5719 0.224488 13.7851C0.441545 13.9983 0.765869 14.0592 1.04549 13.9393L0.75 13.25ZM12.8214 1.83253L12.2911 2.36286L12.2911 2.36286L12.8214 1.83253ZM12.8214 3.90194L13.3517 4.43227L12.8214 3.90194ZM10.0981 1.17859L9.56773 0.648259L10.0981 1.17859ZM12.1675 1.17859L12.6978 0.648258L12.6978 0.648257L12.1675 1.17859ZM2.58049 8.75697L3.27506 9.03994L2.58049 8.75697ZM2.70066 8.57599L3.23099 9.10632L2.70066 8.57599ZM5.2479 11.4195L4.95355 10.7297L5.2479 11.4195ZM5.42036 11.303L4.89003 10.7727L5.42036 11.303ZM4.95355 10.7297C4.08882 11.0987 3.41842 11.362 2.73535 11.6308C2.05146 11.9 1.35588 12.1743 0.454511 12.5607L1.04549 13.9393C1.92476 13.5624 2.60256 13.2951 3.28469 13.0266C3.96762 12.7578 4.65585 12.4876 5.54225 12.1093L4.95355 10.7297ZM1.44457 13.533L3.27506 9.03994L1.88592 8.474L0.0554307 12.967L1.44457 13.533ZM3.23099 9.10632L10.6284 1.70892L9.56773 0.648259L2.17033 8.04566L3.23099 9.10632ZM11.6371 1.70892L12.2911 2.36286L13.3517 1.3022L12.6978 0.648258L11.6371 1.70892ZM12.2911 3.37161L4.89003 10.7727L5.95069 11.8333L13.3517 4.43227L12.2911 3.37161ZM12.2911 2.36286C12.5696 2.64142 12.5696 3.09305 12.2911 3.37161L13.3517 4.43227C14.2161 3.56792 14.2161 2.16654 13.3517 1.3022L12.2911 2.36286ZM10.6284 1.70892C10.9069 1.43036 11.3586 1.43036 11.6371 1.70892L12.6978 0.648257C11.8335 -0.216088 10.4321 -0.216084 9.56773 0.648259L10.6284 1.70892ZM3.27506 9.03994C3.26494 9.06479 3.24996 9.08735 3.23099 9.10632L2.17033 8.04566C2.04793 8.16806 1.95123 8.31369 1.88592 8.474L3.27506 9.03994ZM5.54225 12.1093C5.69431 12.0444 5.83339 11.9506 5.95069 11.8333L4.89003 10.7727C4.90863 10.7541 4.92988 10.7398 4.95355 10.7297L5.54225 12.1093Z", + fill: "currentColor" +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M11.5 4.5L9.5 2.5", + stroke: "currentColor", + strokeWidth: 1.4026, + strokeLinecap: "round", + strokeLinejoin: "round" +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M5.5 10.5L3.5 8.5", + stroke: "currentColor", + strokeWidth: 1.4026, + strokeLinecap: "round", + strokeLinejoin: "round" +})); +const SvgPlay = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 16 18", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M1.32226e-07 1.6609C7.22332e-08 0.907329 0.801887 0.424528 1.46789 0.777117L15.3306 8.11621C16.0401 8.49182 16.0401 9.50818 15.3306 9.88379L1.46789 17.2229C0.801886 17.5755 1.36076e-06 17.0927 1.30077e-06 16.3391L1.32226e-07 1.6609Z", + fill: "currentColor" +})); +const SvgPlus = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 10 16", + fill: "currentColor", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + fillRule: "evenodd", + clipRule: "evenodd", + d: "M4.25 9.25V13.5H5.75V9.25L10 9.25V7.75L5.75 7.75V3.5H4.25V7.75L0 7.75V9.25L4.25 9.25Z" +})); +const SvgPrettify = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + width: 25, + height: 25, + viewBox: "0 0 25 25", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M10.2852 24.0745L13.7139 18.0742", + stroke: "currentColor", + strokeWidth: 1.5625 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M14.5742 24.0749L17.1457 19.7891", + stroke: "currentColor", + strokeWidth: 1.5625 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M19.4868 24.0735L20.7229 21.7523C21.3259 20.6143 21.5457 19.3122 21.3496 18.0394C21.1535 16.7666 20.5519 15.591 19.6342 14.6874L23.7984 6.87853C24.0123 6.47728 24.0581 6.00748 23.9256 5.57249C23.7932 5.1375 23.4933 4.77294 23.0921 4.55901C22.6908 4.34509 22.221 4.29932 21.7861 4.43178C21.3511 4.56424 20.9865 4.86408 20.7726 5.26533L16.6084 13.0742C15.3474 12.8142 14.0362 12.9683 12.8699 13.5135C11.7035 14.0586 10.7443 14.9658 10.135 16.1L6 24.0735", + stroke: "currentColor", + strokeWidth: 1.5625 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M4 15L5 13L7 12L5 11L4 9L3 11L1 12L3 13L4 15Z", + stroke: "currentColor", + strokeWidth: 1.5625, + strokeLinejoin: "round" +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M11.5 8L12.6662 5.6662L15 4.5L12.6662 3.3338L11.5 1L10.3338 3.3338L8 4.5L10.3338 5.6662L11.5 8Z", + stroke: "currentColor", + strokeWidth: 1.5625, + strokeLinejoin: "round" +})); +const SvgReload = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 16 16", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M4.75 9.25H1.25V12.75", + stroke: "currentColor", + strokeWidth: 1, + strokeLinecap: "square" +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M11.25 6.75H14.75V3.25", + stroke: "currentColor", + strokeWidth: 1, + strokeLinecap: "square" +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M14.1036 6.65539C13.8 5.27698 13.0387 4.04193 11.9437 3.15131C10.8487 2.26069 9.48447 1.76694 8.0731 1.75043C6.66173 1.73392 5.28633 2.19563 4.17079 3.0604C3.05526 3.92516 2.26529 5.14206 1.92947 6.513", + stroke: "currentColor", + strokeWidth: 1 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M1.89635 9.34461C2.20001 10.723 2.96131 11.9581 4.05631 12.8487C5.15131 13.7393 6.51553 14.2331 7.9269 14.2496C9.33827 14.2661 10.7137 13.8044 11.8292 12.9396C12.9447 12.0748 13.7347 10.8579 14.0705 9.487", + stroke: "currentColor", + strokeWidth: 1 +})); +const SvgRootType = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 13 13", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("rect", { + x: 0.6, + y: 0.6, + width: 11.8, + height: 11.8, + rx: 5.9, + stroke: "currentColor", + strokeWidth: 1.2 +}), /* @__PURE__ */React__namespace.createElement("path", { + d: "M4.25 7.5C4.25 6 5.75 5 6.5 6.5C7.25 8 8.75 7 8.75 5.5", + stroke: "currentColor", + strokeWidth: 1.2 +})); +const SvgSettings = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 21 20", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + fillRule: "evenodd", + clipRule: "evenodd", + d: "M9.29186 1.92702C9.06924 1.82745 8.87014 1.68202 8.70757 1.50024L7.86631 0.574931C7.62496 0.309957 7.30773 0.12592 6.95791 0.0479385C6.60809 -0.0300431 6.24274 0.00182978 5.91171 0.139208C5.58068 0.276585 5.3001 0.512774 5.10828 0.815537C4.91645 1.1183 4.82272 1.47288 4.83989 1.83089L4.90388 3.08019C4.91612 3.32348 4.87721 3.56662 4.78968 3.79394C4.70215 4.02126 4.56794 4.2277 4.39571 4.39994C4.22347 4.57219 4.01704 4.7064 3.78974 4.79394C3.56243 4.88147 3.3193 4.92038 3.07603 4.90814L1.8308 4.84414C1.47162 4.82563 1.11553 4.91881 0.811445 5.11086C0.507359 5.30292 0.270203 5.58443 0.132561 5.91671C-0.00508149 6.249 -0.0364554 6.61576 0.0427496 6.9666C0.121955 7.31744 0.307852 7.63514 0.5749 7.87606L1.50016 8.71204C1.68193 8.87461 1.82735 9.07373 1.92692 9.29636C2.02648 9.51898 2.07794 9.76012 2.07794 10.004C2.07794 10.2479 2.02648 10.489 1.92692 10.7116C1.82735 10.9343 1.68193 11.1334 1.50016 11.296L0.5749 12.1319C0.309856 12.3729 0.125575 12.6898 0.0471809 13.0393C-0.0312128 13.3888 9.64098e-05 13.754 0.13684 14.0851C0.273583 14.4162 0.509106 14.6971 0.811296 14.8894C1.11349 15.0817 1.46764 15.1762 1.82546 15.1599L3.0707 15.0959C3.31397 15.0836 3.5571 15.1225 3.7844 15.2101C4.01171 15.2976 4.21814 15.4318 4.39037 15.6041C4.56261 15.7763 4.69682 15.9827 4.78435 16.2101C4.87188 16.4374 4.91078 16.6805 4.89855 16.9238L4.83455 18.1691C4.81605 18.5283 4.90921 18.8844 5.10126 19.1885C5.2933 19.4926 5.5748 19.7298 5.90707 19.8674C6.23934 20.0051 6.60608 20.0365 6.9569 19.9572C7.30772 19.878 7.6254 19.6921 7.86631 19.4251L8.7129 18.4998C8.87547 18.318 9.07458 18.1725 9.29719 18.073C9.51981 17.9734 9.76093 17.9219 10.0048 17.9219C10.2487 17.9219 10.4898 17.9734 10.7124 18.073C10.935 18.1725 11.1341 18.318 11.2967 18.4998L12.1326 19.4251C12.3735 19.6921 12.6912 19.878 13.042 19.9572C13.3929 20.0365 13.7596 20.0051 14.0919 19.8674C14.4241 19.7298 14.7056 19.4926 14.8977 19.1885C15.0897 18.8844 15.1829 18.5283 15.1644 18.1691L15.1004 16.9238C15.0882 16.6805 15.1271 16.4374 15.2146 16.2101C15.3021 15.9827 15.4363 15.7763 15.6086 15.6041C15.7808 15.4318 15.9872 15.2976 16.2145 15.2101C16.4418 15.1225 16.685 15.0836 16.9282 15.0959L18.1735 15.1599C18.5326 15.1784 18.8887 15.0852 19.1928 14.8931C19.4969 14.7011 19.7341 14.4196 19.8717 14.0873C20.0093 13.755 20.0407 13.3882 19.9615 13.0374C19.8823 12.6866 19.6964 12.3689 19.4294 12.1279L18.5041 11.292C18.3223 11.1294 18.1769 10.9303 18.0774 10.7076C17.9778 10.485 17.9263 10.2439 17.9263 10C17.9263 9.75612 17.9778 9.51499 18.0774 9.29236C18.1769 9.06973 18.3223 8.87062 18.5041 8.70804L19.4294 7.87206C19.6964 7.63114 19.8823 7.31344 19.9615 6.9626C20.0407 6.61176 20.0093 6.245 19.8717 5.91271C19.7341 5.58043 19.4969 5.29892 19.1928 5.10686C18.8887 4.91481 18.5326 4.82163 18.1735 4.84014L16.9282 4.90414C16.685 4.91638 16.4418 4.87747 16.2145 4.78994C15.9872 4.7024 15.7808 4.56818 15.6086 4.39594C15.4363 4.2237 15.3021 4.01726 15.2146 3.78994C15.1271 3.56262 15.0882 3.31948 15.1004 3.07619L15.1644 1.83089C15.1829 1.4717 15.0897 1.11559 14.8977 0.811487C14.7056 0.507385 14.4241 0.270217 14.0919 0.132568C13.7596 -0.00508182 13.3929 -0.0364573 13.042 0.0427519C12.6912 0.121961 12.3735 0.307869 12.1326 0.574931L11.2914 1.50024C11.1288 1.68202 10.9297 1.82745 10.7071 1.92702C10.4845 2.02659 10.2433 2.07805 9.99947 2.07805C9.7556 2.07805 9.51448 2.02659 9.29186 1.92702ZM14.3745 10C14.3745 12.4162 12.4159 14.375 9.99977 14.375C7.58365 14.375 5.625 12.4162 5.625 10C5.625 7.58375 7.58365 5.625 9.99977 5.625C12.4159 5.625 14.3745 7.58375 14.3745 10Z", + fill: "currentColor" +})); +const SvgStarFilled = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 14 14", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M6.5782 1.07092C6.71096 0.643026 7.28904 0.643027 7.4218 1.07092L8.59318 4.84622C8.65255 5.03758 8.82284 5.16714 9.01498 5.16714L12.8056 5.16714C13.2353 5.16714 13.4139 5.74287 13.0663 6.00732L9.99962 8.34058C9.84418 8.45885 9.77913 8.66848 9.83851 8.85984L11.0099 12.6351C11.1426 13.063 10.675 13.4189 10.3274 13.1544L7.26069 10.8211C7.10524 10.7029 6.89476 10.7029 6.73931 10.8211L3.6726 13.1544C3.32502 13.4189 2.85735 13.063 2.99012 12.6351L4.16149 8.85984C4.22087 8.66848 4.15582 8.45885 4.00038 8.34058L0.933671 6.00732C0.586087 5.74287 0.764722 5.16714 1.19436 5.16714L4.98502 5.16714C5.17716 5.16714 5.34745 5.03758 5.40682 4.84622L6.5782 1.07092Z", + fill: "currentColor", + stroke: "currentColor" +})); +const SvgStar = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 14 14", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M6.5782 1.07092C6.71096 0.643026 7.28904 0.643027 7.4218 1.07092L8.59318 4.84622C8.65255 5.03758 8.82284 5.16714 9.01498 5.16714L12.8056 5.16714C13.2353 5.16714 13.4139 5.74287 13.0663 6.00732L9.99962 8.34058C9.84418 8.45885 9.77913 8.66848 9.83851 8.85984L11.0099 12.6351C11.1426 13.063 10.675 13.4189 10.3274 13.1544L7.26069 10.8211C7.10524 10.7029 6.89476 10.7029 6.73931 10.8211L3.6726 13.1544C3.32502 13.4189 2.85735 13.063 2.99012 12.6351L4.16149 8.85984C4.22087 8.66848 4.15582 8.45885 4.00038 8.34058L0.933671 6.00732C0.586087 5.74287 0.764722 5.16714 1.19436 5.16714L4.98502 5.16714C5.17716 5.16714 5.34745 5.03758 5.40682 4.84622L6.5782 1.07092Z", + stroke: "currentColor", + strokeWidth: 1.5 +})); +const SvgStop = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 16 16", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("rect", { + width: 16, + height: 16, + rx: 2, + fill: "currentColor" +})); +const SvgTrash = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + width: "1em", + height: "5em", + xmlns: "http://www.w3.org/2000/svg", + fillRule: "evenodd", + "aria-hidden": "true", + viewBox: "0 0 23 23", + style: { + height: "1.5em" + }, + clipRule: "evenodd", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("path", { + d: "M19 24h-14c-1.104 0-2-.896-2-2v-17h-1v-2h6v-1.5c0-.827.673-1.5 1.5-1.5h5c.825 0 1.5.671 1.5 1.5v1.5h6v2h-1v17c0 1.104-.896 2-2 2zm0-19h-14v16.5c0 .276.224.5.5.5h13c.276 0 .5-.224.5-.5v-16.5zm-7 7.586l3.293-3.293 1.414 1.414-3.293 3.293 3.293 3.293-1.414 1.414-3.293-3.293-3.293 3.293-1.414-1.414 3.293-3.293-3.293-3.293 1.414-1.414 3.293 3.293zm2-10.586h-4v1h4v-1z", + fill: "currentColor", + strokeWidth: 0.25, + stroke: "currentColor" +})); +const SvgType = ({ + title, + titleId, + ...props +}) => /* @__PURE__ */React__namespace.createElement("svg", { + height: "1em", + viewBox: "0 0 13 13", + fill: "none", + xmlns: "http://www.w3.org/2000/svg", + "aria-labelledby": titleId, + ...props +}, title ? /* @__PURE__ */React__namespace.createElement("title", { + id: titleId +}, title) : null, /* @__PURE__ */React__namespace.createElement("rect", { + x: 0.6, + y: 0.6, + width: 11.8, + height: 11.8, + rx: 5.9, + stroke: "currentColor", + strokeWidth: 1.2 +}), /* @__PURE__ */React__namespace.createElement("rect", { + x: 5.5, + y: 5.5, + width: 2, + height: 2, + rx: 1, + fill: "currentColor" +})); +const ArgumentIcon = generateIcon(SvgArgument); +const ChevronDownIcon = generateIcon(SvgChevronDown); +const ChevronLeftIcon = generateIcon(SvgChevronLeft); +const ChevronUpIcon = generateIcon(SvgChevronUp); +const CloseIcon = generateIcon(SvgClose); +const CopyIcon = generateIcon(SvgCopy); +const DeprecatedArgumentIcon = generateIcon(SvgDeprecatedArgument); +const DeprecatedEnumValueIcon = generateIcon(SvgDeprecatedEnumValue); +const DeprecatedFieldIcon = generateIcon(SvgDeprecatedField); +const DirectiveIcon = generateIcon(SvgDirective); +const DocsFilledIcon = generateIcon(SvgDocsFilled); +const DocsIcon = generateIcon(SvgDocs); +const EnumValueIcon = generateIcon(SvgEnumValue); +const FieldIcon = generateIcon(SvgField); +const HistoryIcon = generateIcon(SvgHistory); +const ImplementsIcon = generateIcon(SvgImplements); +const KeyboardShortcutIcon = generateIcon(SvgKeyboardShortcut); +const MagnifyingGlassIcon = generateIcon(SvgMagnifyingGlass); +const MergeIcon = generateIcon(SvgMerge); +const PenIcon = generateIcon(SvgPen); +const PlayIcon = generateIcon(SvgPlay); +const PlusIcon = generateIcon(SvgPlus); +const PrettifyIcon = generateIcon(SvgPrettify); +const ReloadIcon = generateIcon(SvgReload); +const RootTypeIcon = generateIcon(SvgRootType); +const SettingsIcon = generateIcon(SvgSettings); +const StarFilledIcon = generateIcon(SvgStarFilled); +const StarIcon = generateIcon(SvgStar); +const StopIcon = generateIcon(SvgStop); +const TrashIcon = generateIcon(SvgTrash); +const TypeIcon = generateIcon(SvgType); +function generateIcon(RawComponent) { + const title = RawComponent.name.replace("Svg", "").replaceAll(/([A-Z])/g, " $1").trimStart().toLowerCase() + " icon"; + function IconComponent(props) { + return /* @__PURE__ */jsxRuntime.jsx(RawComponent, { + title, + ...props + }); + } + IconComponent.displayName = RawComponent.name; + return IconComponent; +} +const UnStyledButton = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx("button", { + ...props, + ref, + className: clsx.clsx("graphiql-un-styled", props.className) +})); +UnStyledButton.displayName = "UnStyledButton"; +const Button$1 = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx("button", { + ...props, + ref, + className: clsx.clsx("graphiql-button", { + success: "graphiql-button-success", + error: "graphiql-button-error" + }[props.state], props.className) +})); +Button$1.displayName = "Button"; +const ButtonGroup = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx("div", { + ...props, + ref, + className: clsx.clsx("graphiql-button-group", props.className) +})); +ButtonGroup.displayName = "ButtonGroup"; +const createComponentGroup = (root, children) => Object.entries(children).reduce((r, [key, value]) => { + r[key] = value; + return r; +}, root); +const DialogClose = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx(D__namespace.Close, { + asChild: true, + children: /* @__PURE__ */jsxRuntime.jsxs(UnStyledButton, { + ...props, + ref, + type: "button", + className: clsx.clsx("graphiql-dialog-close", props.className), + children: [/* @__PURE__ */jsxRuntime.jsx(reactVisuallyHidden.Root, { + children: "Close dialog" + }), /* @__PURE__ */jsxRuntime.jsx(CloseIcon, {})] + }) +})); +DialogClose.displayName = "Dialog.Close"; +function DialogRoot({ + children, + ...props +}) { + return /* @__PURE__ */jsxRuntime.jsx(D__namespace.Root, { + ...props, + children: /* @__PURE__ */jsxRuntime.jsxs(D__namespace.Portal, { + children: [/* @__PURE__ */jsxRuntime.jsx(D__namespace.Overlay, { + className: "graphiql-dialog-overlay" + }), /* @__PURE__ */jsxRuntime.jsx(D__namespace.Content, { + className: "graphiql-dialog", + children + })] + }) + }); +} +const Dialog = createComponentGroup(DialogRoot, { + Close: DialogClose, + Title: D__namespace.Title, + Trigger: D__namespace.Trigger, + Description: D__namespace.Description +}); +const Button = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx(reactDropdownMenu.Trigger, { + asChild: true, + children: /* @__PURE__ */jsxRuntime.jsx("button", { + ...props, + ref, + className: clsx.clsx("graphiql-un-styled", props.className) + }) +})); +Button.displayName = "DropdownMenuButton"; +function Content({ + children, + align = "start", + sideOffset = 5, + className, + ...props +}) { + return /* @__PURE__ */jsxRuntime.jsx(reactDropdownMenu.Portal, { + children: /* @__PURE__ */jsxRuntime.jsx(reactDropdownMenu.Content, { + align, + sideOffset, + className: clsx.clsx("graphiql-dropdown-content", className), + ...props, + children + }) + }); +} +const Item = ({ + className, + children, + ...props +}) => /* @__PURE__ */jsxRuntime.jsx(reactDropdownMenu.Item, { + className: clsx.clsx("graphiql-dropdown-item", className), + ...props, + children +}); +const DropdownMenu = createComponentGroup(reactDropdownMenu.Root, { + Button, + Item, + Content +}); +const markdown = new MarkdownIt({ + breaks: true, + linkify: true +}); +const MarkdownContent = React.forwardRef(({ + children, + onlyShowFirstChild, + type, + ...props +}, ref) => /* @__PURE__ */jsxRuntime.jsx("div", { + ...props, + ref, + className: clsx.clsx(`graphiql-markdown-${type}`, onlyShowFirstChild && "graphiql-markdown-preview", props.className), + dangerouslySetInnerHTML: { + __html: markdown.render(children) + } +})); +MarkdownContent.displayName = "MarkdownContent"; +const Spinner = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx("div", { + ...props, + ref, + className: clsx.clsx("graphiql-spinner", props.className) +})); +Spinner.displayName = "Spinner"; +function TooltipRoot({ + children, + align = "start", + side = "bottom", + sideOffset = 5, + label +}) { + return /* @__PURE__ */jsxRuntime.jsxs(T__namespace.Root, { + children: [/* @__PURE__ */jsxRuntime.jsx(T__namespace.Trigger, { + asChild: true, + children + }), /* @__PURE__ */jsxRuntime.jsx(T__namespace.Portal, { + children: /* @__PURE__ */jsxRuntime.jsx(T__namespace.Content, { + className: "graphiql-tooltip", + align, + side, + sideOffset, + children: label + }) + })] + }); +} +const Tooltip = createComponentGroup(TooltipRoot, { + Provider: T__namespace.Provider +}); +const TabRoot = React.forwardRef(({ + isActive, + value, + children, + className, + ...props +}, ref) => /* @__PURE__ */jsxRuntime.jsx(framerMotion.Reorder.Item, { + ...props, + ref, + value, + "aria-selected": isActive ? "true" : void 0, + role: "tab", + className: clsx.clsx("graphiql-tab", isActive && "graphiql-tab-active", className), + children +})); +TabRoot.displayName = "Tab"; +const TabButton = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { + ...props, + ref, + type: "button", + className: clsx.clsx("graphiql-tab-button", props.className), + children: props.children +})); +TabButton.displayName = "Tab.Button"; +const TabClose = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx(Tooltip, { + label: "Close Tab", + children: /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { + "aria-label": "Close Tab", + ...props, + ref, + type: "button", + className: clsx.clsx("graphiql-tab-close", props.className), + children: /* @__PURE__ */jsxRuntime.jsx(CloseIcon, {}) + }) +})); +TabClose.displayName = "Tab.Close"; +const Tab = createComponentGroup(TabRoot, { + Button: TabButton, + Close: TabClose +}); +const Tabs = React.forwardRef(({ + values, + onReorder, + children, + className, + ...props +}, ref) => /* @__PURE__ */jsxRuntime.jsx(framerMotion.Reorder.Group, { + ...props, + ref, + values, + onReorder, + axis: "x", + role: "tablist", + className: clsx.clsx("graphiql-tabs", className), + children +})); +Tabs.displayName = "Tabs"; +const HistoryContext = createNullableContext("HistoryContext"); +function HistoryContextProvider({ + maxHistoryLength = DEFAULT_HISTORY_LENGTH, + children +}) { + const storage = useStorageContext(); + const [historyStore] = React.useState(() => + // Fall back to a noop storage when the StorageContext is empty + new toolkit.HistoryStore(storage || new toolkit.StorageAPI(null), maxHistoryLength)); + const [items, setItems] = React.useState(() => historyStore.queries || []); + const value = React.useMemo(() => ({ + addToHistory(operation) { + historyStore.updateHistory(operation); + setItems(historyStore.queries); + }, + editLabel(operation, index) { + historyStore.editLabel(operation, index); + setItems(historyStore.queries); + }, + items, + toggleFavorite(operation) { + historyStore.toggleFavorite(operation); + setItems(historyStore.queries); + }, + setActive: item => item, + deleteFromHistory(item, clearFavorites) { + historyStore.deleteHistory(item, clearFavorites); + setItems(historyStore.queries); + } + }), [items, historyStore]); + return /* @__PURE__ */jsxRuntime.jsx(HistoryContext.Provider, { + value, + children + }); +} +const useHistoryContext = createContextHook(HistoryContext); +const DEFAULT_HISTORY_LENGTH = 20; +function History() { + const { + items: all, + deleteFromHistory + } = useHistoryContext({ + nonNull: true + }); + let items = all.slice().map((item, i) => ({ + ...item, + index: i + })).reverse(); + const favorites = items.filter(item => item.favorite); + if (favorites.length) { + items = items.filter(item => !item.favorite); + } + const [clearStatus, setClearStatus] = React.useState(null); + React.useEffect(() => { + if (clearStatus) { + setTimeout(() => { + setClearStatus(null); + }, 2e3); + } + }, [clearStatus]); + const handleClearStatus = React.useCallback(() => { + try { + for (const item of items) { + deleteFromHistory(item, true); } + setClearStatus("success"); + } catch { + setClearStatus("error"); } - if (terminate) { - break; + }, [deleteFromHistory, items]); + return /* @__PURE__ */jsxRuntime.jsxs("section", { + "aria-label": "History", + className: "graphiql-history", + children: [/* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-history-header", + children: ["History", (clearStatus || items.length > 0) && /* @__PURE__ */jsxRuntime.jsx(Button$1, { + type: "button", + state: clearStatus || void 0, + disabled: !items.length, + onClick: handleClearStatus, + children: { + success: "Cleared", + error: "Failed to Clear" + }[clearStatus] || "Clear" + })] + }), Boolean(favorites.length) && /* @__PURE__ */jsxRuntime.jsx("ul", { + className: "graphiql-history-items", + children: favorites.map(item => /* @__PURE__ */jsxRuntime.jsx(HistoryItem, { + item + }, item.index)) + }), Boolean(favorites.length) && Boolean(items.length) && /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-history-item-spacer" + }), Boolean(items.length) && /* @__PURE__ */jsxRuntime.jsx("ul", { + className: "graphiql-history-items", + children: items.map(item => /* @__PURE__ */jsxRuntime.jsx(HistoryItem, { + item + }, item.index)) + })] + }); +} +function HistoryItem(props) { + const { + editLabel, + toggleFavorite, + deleteFromHistory, + setActive + } = useHistoryContext({ + nonNull: true, + caller: HistoryItem + }); + const { + headerEditor, + queryEditor, + variableEditor + } = useEditorContext({ + nonNull: true, + caller: HistoryItem + }); + const inputRef = React.useRef(null); + const buttonRef = React.useRef(null); + const [isEditable, setIsEditable] = React.useState(false); + React.useEffect(() => { + var _a; + if (isEditable) { + (_a = inputRef.current) == null ? void 0 : _a.focus(); } - lineText = getLine(state, nextLine).trim(); - if (!lineText) { - break; + }, [isEditable]); + const displayName = props.item.label || props.item.operationName || formatQuery(props.item.query); + const handleSave = React.useCallback(() => { + var _a; + setIsEditable(false); + const { + index, + ...item + } = props.item; + editLabel({ + ...item, + label: (_a = inputRef.current) == null ? void 0 : _a.value + }, index); + }, [editLabel, props.item]); + const handleClose = React.useCallback(() => { + setIsEditable(false); + }, []); + const handleEditLabel = React.useCallback(e => { + e.stopPropagation(); + setIsEditable(true); + }, []); + const handleHistoryItemClick = React.useCallback(() => { + const { + query, + variables, + headers + } = props.item; + queryEditor == null ? void 0 : queryEditor.setValue(query !== null && query !== void 0 ? query : ""); + variableEditor == null ? void 0 : variableEditor.setValue(variables !== null && variables !== void 0 ? variables : ""); + headerEditor == null ? void 0 : headerEditor.setValue(headers !== null && headers !== void 0 ? headers : ""); + setActive(props.item); + }, [headerEditor, props.item, queryEditor, setActive, variableEditor]); + const handleDeleteItemFromHistory = React.useCallback(e => { + e.stopPropagation(); + deleteFromHistory(props.item); + }, [props.item, deleteFromHistory]); + const handleToggleFavorite = React.useCallback(e => { + e.stopPropagation(); + toggleFavorite(props.item); + }, [props.item, toggleFavorite]); + return /* @__PURE__ */jsxRuntime.jsx("li", { + className: clsx.clsx("graphiql-history-item", isEditable && "editable"), + children: isEditable ? /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [/* @__PURE__ */jsxRuntime.jsx("input", { + type: "text", + defaultValue: props.item.label, + ref: inputRef, + onKeyDown: e => { + if (e.key === "Esc") { + setIsEditable(false); + } else if (e.key === "Enter") { + setIsEditable(false); + editLabel({ + ...props.item, + label: e.currentTarget.value + }); + } + }, + placeholder: "Type a label" + }), /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { + type: "button", + ref: buttonRef, + onClick: handleSave, + children: "Save" + }), /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { + type: "button", + ref: buttonRef, + onClick: handleClose, + children: /* @__PURE__ */jsxRuntime.jsx(CloseIcon, {}) + })] + }) : /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [/* @__PURE__ */jsxRuntime.jsx(Tooltip, { + label: "Set active", + children: /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { + type: "button", + className: "graphiql-history-item-label", + onClick: handleHistoryItemClick, + "aria-label": "Set active", + children: displayName + }) + }), /* @__PURE__ */jsxRuntime.jsx(Tooltip, { + label: "Edit label", + children: /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { + type: "button", + className: "graphiql-history-item-action", + onClick: handleEditLabel, + "aria-label": "Edit label", + children: /* @__PURE__ */jsxRuntime.jsx(PenIcon, { + "aria-hidden": "true" + }) + }) + }), /* @__PURE__ */jsxRuntime.jsx(Tooltip, { + label: props.item.favorite ? "Remove favorite" : "Add favorite", + children: /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { + type: "button", + className: "graphiql-history-item-action", + onClick: handleToggleFavorite, + "aria-label": props.item.favorite ? "Remove favorite" : "Add favorite", + children: props.item.favorite ? /* @__PURE__ */jsxRuntime.jsx(StarFilledIcon, { + "aria-hidden": "true" + }) : /* @__PURE__ */jsxRuntime.jsx(StarIcon, { + "aria-hidden": "true" + }) + }) + }), /* @__PURE__ */jsxRuntime.jsx(Tooltip, { + label: "Delete from history", + children: /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { + type: "button", + className: "graphiql-history-item-action", + onClick: handleDeleteItemFromHistory, + "aria-label": "Delete from history", + children: /* @__PURE__ */jsxRuntime.jsx(TrashIcon, { + "aria-hidden": "true" + }) + }) + })] + }) + }); +} +function formatQuery(query) { + return query == null ? void 0 : query.split("\n").map(line => line.replace(/#(.*)/, "")).join(" ").replaceAll("{", " { ").replaceAll("}", " } ").replaceAll(/[\s]{2,}/g, " "); +} +const ExecutionContext = createNullableContext("ExecutionContext"); +function ExecutionContextProvider({ + fetcher, + getDefaultFieldNames, + children, + operationName +}) { + if (!fetcher) { + throw new TypeError("The `ExecutionContextProvider` component requires a `fetcher` function to be passed as prop."); + } + const { + externalFragments, + headerEditor, + queryEditor, + responseEditor, + variableEditor, + updateActiveTabValues + } = useEditorContext({ + nonNull: true, + caller: ExecutionContextProvider + }); + const history = useHistoryContext(); + const autoCompleteLeafs = useAutoCompleteLeafs({ + getDefaultFieldNames, + caller: ExecutionContextProvider + }); + const [isFetching, setIsFetching] = React.useState(false); + const [subscription, setSubscription] = React.useState(null); + const queryIdRef = React.useRef(0); + const stop = React.useCallback(() => { + subscription == null ? void 0 : subscription.unsubscribe(); + setIsFetching(false); + setSubscription(null); + }, [subscription]); + const run = React.useCallback(async () => { + var _ref; + if (!queryEditor || !responseEditor) { + return; } - if (state.sCount[nextLine] - state.blkIndent >= 4) { - break; + if (subscription) { + stop(); + return; } - columns = escapedSplit(lineText); - if (columns.length && columns[0] === '') columns.shift(); - if (columns.length && columns[columns.length - 1] === '') columns.pop(); - - // note: autocomplete count can be negative if user specifies more columns than header, - // but that does not affect intended use (which is limiting expansion) - autocompletedCells += columnCount - columns.length; - if (autocompletedCells > MAX_AUTOCOMPLETED_CELLS) { - break; + const setResponse = value2 => { + responseEditor.setValue(value2); + updateActiveTabValues({ + response: value2 + }); + }; + queryIdRef.current += 1; + const queryId = queryIdRef.current; + let query = autoCompleteLeafs() || queryEditor.getValue(); + const variablesString = variableEditor == null ? void 0 : variableEditor.getValue(); + let variables; + try { + variables = tryParseJsonObject({ + json: variablesString, + errorMessageParse: "Variables are invalid JSON", + errorMessageType: "Variables are not a JSON object." + }); + } catch (error) { + setResponse(error instanceof Error ? error.message : `${error}`); + return; } - if (nextLine === startLine + 2) { - const token_tbo = state.push('tbody_open', 'tbody', 1); - token_tbo.map = tbodyLines = [startLine + 2, 0]; + const headersString = headerEditor == null ? void 0 : headerEditor.getValue(); + let headers; + try { + headers = tryParseJsonObject({ + json: headersString, + errorMessageParse: "Headers are invalid JSON", + errorMessageType: "Headers are not a JSON object." + }); + } catch (error) { + setResponse(error instanceof Error ? error.message : `${error}`); + return; } - const token_tro = state.push('tr_open', 'tr', 1); - token_tro.map = [nextLine, nextLine + 1]; - for (let i = 0; i < columnCount; i++) { - const token_tdo = state.push('td_open', 'td', 1); - if (aligns[i]) { - token_tdo.attrs = [['style', 'text-align:' + aligns[i]]]; + if (externalFragments) { + const fragmentDependencies = queryEditor.documentAST ? graphqlLanguageService.getFragmentDependenciesForAST(queryEditor.documentAST, externalFragments) : []; + if (fragmentDependencies.length > 0) { + query += "\n" + fragmentDependencies.map(node => graphql.print(node)).join("\n"); } - const token_il = state.push('inline', '', 0); - token_il.content = columns[i] ? columns[i].trim() : ''; - token_il.children = []; - state.push('td_close', 'td', -1); } - state.push('tr_close', 'tr', -1); + setResponse(""); + setIsFetching(true); + const opName = (_ref = operationName !== null && operationName !== void 0 ? operationName : queryEditor.operationName) !== null && _ref !== void 0 ? _ref : void 0; + history == null ? void 0 : history.addToHistory({ + query, + variables: variablesString, + headers: headersString, + operationName: opName + }); + try { + var _headers, _queryEditor$document; + const fullResponse = {}; + const handleResponse = result => { + if (queryId !== queryIdRef.current) { + return; + } + let maybeMultipart = Array.isArray(result) ? result : false; + if (!maybeMultipart && typeof result === "object" && result !== null && "hasNext" in result) { + maybeMultipart = [result]; + } + if (maybeMultipart) { + for (const part of maybeMultipart) { + mergeIncrementalResult(fullResponse, part); + } + setIsFetching(false); + setResponse(toolkit.formatResult(fullResponse)); + } else { + const response = toolkit.formatResult(result); + setIsFetching(false); + setResponse(response); + } + }; + const fetch2 = fetcher({ + query, + variables, + operationName: opName + }, { + headers: (_headers = headers) !== null && _headers !== void 0 ? _headers : void 0, + documentAST: (_queryEditor$document = queryEditor.documentAST) !== null && _queryEditor$document !== void 0 ? _queryEditor$document : void 0 + }); + const value2 = await Promise.resolve(fetch2); + if (toolkit.isObservable(value2)) { + setSubscription(value2.subscribe({ + next(result) { + handleResponse(result); + }, + error(error) { + setIsFetching(false); + if (error) { + setResponse(toolkit.formatError(error)); + } + setSubscription(null); + }, + complete() { + setIsFetching(false); + setSubscription(null); + } + })); + } else if (toolkit.isAsyncIterable(value2)) { + setSubscription({ + unsubscribe: () => { + var _a, _b; + return (_b = (_a = value2[Symbol.asyncIterator]()).return) == null ? void 0 : _b.call(_a); + } + }); + for await (const result of value2) { + handleResponse(result); + } + setIsFetching(false); + setSubscription(null); + } else { + handleResponse(value2); + } + } catch (error) { + setIsFetching(false); + setResponse(toolkit.formatError(error)); + setSubscription(null); + } + }, [autoCompleteLeafs, externalFragments, fetcher, headerEditor, history, operationName, queryEditor, responseEditor, stop, subscription, updateActiveTabValues, variableEditor]); + const isSubscribed = Boolean(subscription); + const value = React.useMemo(() => ({ + isFetching, + isSubscribed, + operationName: operationName !== null && operationName !== void 0 ? operationName : null, + run, + stop + }), [isFetching, isSubscribed, operationName, run, stop]); + return /* @__PURE__ */jsxRuntime.jsx(ExecutionContext.Provider, { + value, + children + }); +} +const useExecutionContext = createContextHook(ExecutionContext); +function tryParseJsonObject({ + json, + errorMessageParse, + errorMessageType +}) { + let parsed; + try { + parsed = json && json.trim() !== "" ? JSON.parse(json) : void 0; + } catch (error) { + throw new Error(`${errorMessageParse}: ${error instanceof Error ? error.message : error}.`); } - if (tbodyLines) { - state.push('tbody_close', 'tbody', -1); - tbodyLines[1] = nextLine; + const isObject = typeof parsed === "object" && parsed !== null && !Array.isArray(parsed); + if (parsed !== void 0 && !isObject) { + throw new Error(errorMessageType); } - state.push('table_close', 'table', -1); - tableLines[1] = nextLine; - state.parentType = oldParentType; - state.line = nextLine; - return true; + return parsed; } - -// Code block (4 spaces padded) - -function code(state, startLine, endLine /*, silent */) { - if (state.sCount[startLine] - state.blkIndent < 4) { - return false; - } - let nextLine = startLine + 1; - let last = nextLine; - while (nextLine < endLine) { - if (state.isEmpty(nextLine)) { - nextLine++; - continue; - } - if (state.sCount[nextLine] - state.blkIndent >= 4) { - nextLine++; - last = nextLine; - continue; +const pathsMap = /* @__PURE__ */new WeakMap(); +function mergeIncrementalResult(executionResult, incrementalResult) { + var _incrementalResult$pa; + var _a, _b, _c; + let path = ["data", ...((_incrementalResult$pa = incrementalResult.path) !== null && _incrementalResult$pa !== void 0 ? _incrementalResult$pa : [])]; + for (const result of [executionResult, incrementalResult]) { + if (result.pending) { + let paths = pathsMap.get(executionResult); + if (paths === void 0) { + paths = /* @__PURE__ */new Map(); + pathsMap.set(executionResult, paths); + } + for (const { + id, + path: pendingPath + } of result.pending) { + paths.set(id, ["data", ...pendingPath]); + } } - break; } - state.line = last; - const token = state.push('code_block', 'code', 0); - token.content = state.getLines(startLine, last, 4 + state.blkIndent, false) + '\n'; - token.map = [startLine, state.line]; - return true; -} - -// fences (``` lang, ~~~ lang) - -function fence(state, startLine, endLine, silent) { - let pos = state.bMarks[startLine] + state.tShift[startLine]; - let max = state.eMarks[startLine]; - - // if it's indented more than 3 spaces, it should be a code block - if (state.sCount[startLine] - state.blkIndent >= 4) { - return false; + const { + items + } = incrementalResult; + if (items) { + const { + id + } = incrementalResult; + if (id) { + path = (_a = pathsMap.get(executionResult)) == null ? void 0 : _a.get(id); + if (path === void 0) { + throw new Error("Invalid incremental delivery format."); + } + const list = getValue(executionResult, path.join(".")); + list.push(...items); + } else { + var _incrementalResult$pa2; + path = ["data", ...((_incrementalResult$pa2 = incrementalResult.path) !== null && _incrementalResult$pa2 !== void 0 ? _incrementalResult$pa2 : [])]; + for (const item of items) { + setValue(executionResult, path.join("."), item); + path[path.length - 1]++; + } + } } - if (pos + 3 > max) { - return false; + const { + data + } = incrementalResult; + if (data) { + const { + id + } = incrementalResult; + if (id) { + path = (_b = pathsMap.get(executionResult)) == null ? void 0 : _b.get(id); + if (path === void 0) { + throw new Error("Invalid incremental delivery format."); + } + const { + subPath + } = incrementalResult; + if (subPath !== void 0) { + path = [...path, ...subPath]; + } + } + setValue(executionResult, path.join("."), data, { + merge: true + }); } - const marker = state.src.charCodeAt(pos); - if (marker !== 0x7E /* ~ */ && marker !== 0x60 /* ` */) { - return false; + if (incrementalResult.errors) { + executionResult.errors || (executionResult.errors = []); + executionResult.errors.push(...incrementalResult.errors); } - - // scan marker length - let mem = pos; - pos = state.skipChars(pos, marker); - let len = pos - mem; - if (len < 3) { - return false; + if (incrementalResult.extensions) { + setValue(executionResult, "extensions", incrementalResult.extensions, { + merge: true + }); } - const markup = state.src.slice(mem, pos); - const params = state.src.slice(pos, max); - if (marker === 0x60 /* ` */) { - if (params.indexOf(String.fromCharCode(marker)) >= 0) { - return false; + if (incrementalResult.incremental) { + for (const incrementalSubResult of incrementalResult.incremental) { + mergeIncrementalResult(executionResult, incrementalSubResult); } } - - // Since start is found, we can report success here in validation mode - if (silent) { - return true; - } - - // search end of block - let nextLine = startLine; - let haveEndMarker = false; - for (;;) { - nextLine++; - if (nextLine >= endLine) { - // unclosed block should be autoclosed by end of document. - // also block seems to be autoclosed by end of parent - break; - } - pos = mem = state.bMarks[nextLine] + state.tShift[nextLine]; - max = state.eMarks[nextLine]; - if (pos < max && state.sCount[nextLine] < state.blkIndent) { - // non-empty line with negative indent should stop the list: - // - ``` - // test - break; - } - if (state.src.charCodeAt(pos) !== marker) { - continue; - } - if (state.sCount[nextLine] - state.blkIndent >= 4) { - // closing fence should be indented less than 4 spaces - continue; - } - pos = state.skipChars(pos, marker); - - // closing code fence must be at least as long as the opening one - if (pos - mem < len) { - continue; - } - - // make sure tail has spaces only - pos = state.skipSpaces(pos); - if (pos < max) { - continue; + if (incrementalResult.completed) { + for (const { + id, + errors + } of incrementalResult.completed) { + (_c = pathsMap.get(executionResult)) == null ? void 0 : _c.delete(id); + if (errors) { + executionResult.errors || (executionResult.errors = []); + executionResult.errors.push(...errors); + } } - haveEndMarker = true; - // found! - break; } - - // If a fence has heading spaces, they should be removed from its inner block - len = state.sCount[startLine]; - state.line = nextLine + (haveEndMarker ? 1 : 0); - const token = state.push('fence', 'code', 0); - token.info = params; - token.content = state.getLines(startLine + 1, nextLine, len, true); - token.markup = markup; - token.map = [startLine, state.line]; - return true; } - -// Block quotes - -function blockquote(state, startLine, endLine, silent) { - let pos = state.bMarks[startLine] + state.tShift[startLine]; - let max = state.eMarks[startLine]; - const oldLineMax = state.lineMax; - - // if it's indented more than 3 spaces, it should be a code block - if (state.sCount[startLine] - state.blkIndent >= 4) { - return false; +const isMacOs = typeof navigator !== "undefined" && navigator.userAgent.includes("Mac"); +const DEFAULT_EDITOR_THEME = "graphiql"; +const DEFAULT_KEY_MAP = "sublime"; +const commonKeys = { + // Persistent search box in Query Editor + [isMacOs ? "Cmd-F" : "Ctrl-F"]: "findPersistent", + "Cmd-G": "findPersistent", + "Ctrl-G": "findPersistent", + // Editor improvements + "Ctrl-Left": "goSubwordLeft", + "Ctrl-Right": "goSubwordRight", + "Alt-Left": "goGroupLeft", + "Alt-Right": "goGroupRight" +}; +async function importCodeMirror(addons, options) { + const CodeMirror = await Promise.resolve().then(() => __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js")).then(n => n.codemirror).then(c => + // Depending on bundler and settings the dynamic import either returns a + // function (e.g. parcel) or an object containing a `default` property + typeof c === "function" ? c : c.default); + await Promise.all((options == null ? void 0 : options.useCommonAddons) === false ? addons : [Promise.resolve().then(() => __webpack_require__(/*! ./show-hint.cjs.js */ "../../graphiql-react/dist/show-hint.cjs.js")).then(n => n.showHint), Promise.resolve().then(() => __webpack_require__(/*! ./matchbrackets.cjs.js */ "../../graphiql-react/dist/matchbrackets.cjs.js")).then(n => n.matchbrackets), Promise.resolve().then(() => __webpack_require__(/*! ./closebrackets.cjs.js */ "../../graphiql-react/dist/closebrackets.cjs.js")).then(n => n.closebrackets), Promise.resolve().then(() => __webpack_require__(/*! ./brace-fold.cjs.js */ "../../graphiql-react/dist/brace-fold.cjs.js")).then(n => n.braceFold), Promise.resolve().then(() => __webpack_require__(/*! ./foldgutter.cjs.js */ "../../graphiql-react/dist/foldgutter.cjs.js")).then(n => n.foldgutter), Promise.resolve().then(() => __webpack_require__(/*! ./lint.cjs.js */ "../../graphiql-react/dist/lint.cjs.js")).then(n => n.lint), Promise.resolve().then(() => __webpack_require__(/*! ./searchcursor.cjs.js */ "../../graphiql-react/dist/searchcursor.cjs.js")).then(n => n.searchcursor), Promise.resolve().then(() => __webpack_require__(/*! ./jump-to-line.cjs.js */ "../../graphiql-react/dist/jump-to-line.cjs.js")).then(n => n.jumpToLine), Promise.resolve().then(() => __webpack_require__(/*! ./dialog.cjs.js */ "../../graphiql-react/dist/dialog.cjs.js")).then(n => n.dialog), + // @ts-expect-error + Promise.resolve().then(() => __webpack_require__(/*! ./sublime.cjs.js */ "../../graphiql-react/dist/sublime.cjs.js")).then(n => n.sublime), ...addons]); + return CodeMirror; +} +const printDefault = ast => { + if (!ast) { + return ""; } - - // check the block quote marker - if (state.src.charCodeAt(pos) !== 0x3E /* > */) { - return false; + return graphql.print(ast); +}; +function DefaultValue({ + field +}) { + if (!("defaultValue" in field) || field.defaultValue === void 0) { + return null; } - - // we know that it's going to be a valid blockquote, - // so no point trying to find the end of it in silent mode - if (silent) { - return true; + const ast = graphql.astFromValue(field.defaultValue, field.type); + if (!ast) { + return null; } - const oldBMarks = []; - const oldBSCount = []; - const oldSCount = []; - const oldTShift = []; - const terminatorRules = state.md.block.ruler.getRules('blockquote'); - const oldParentType = state.parentType; - state.parentType = 'blockquote'; - let lastLineEmpty = false; - let nextLine; - - // Search the end of the block - // - // Block ends with either: - // 1. an empty line outside: - // ``` - // > test - // - // ``` - // 2. an empty line inside: - // ``` - // > - // test - // ``` - // 3. another tag: - // ``` - // > test - // - - - - // ``` - for (nextLine = startLine; nextLine < endLine; nextLine++) { - // check if it's outdented, i.e. it's inside list item and indented - // less than said list item: - // - // ``` - // 1. anything - // > current blockquote - // 2. checking this line - // ``` - const isOutdented = state.sCount[nextLine] < state.blkIndent; - pos = state.bMarks[nextLine] + state.tShift[nextLine]; - max = state.eMarks[nextLine]; - if (pos >= max) { - // Case 1: line is not inside the blockquote, and this line is empty. - break; + return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [" = ", /* @__PURE__ */jsxRuntime.jsx("span", { + className: "graphiql-doc-explorer-default-value", + children: printDefault(ast) + })] + }); +} +const SchemaContext = createNullableContext("SchemaContext"); +function SchemaContextProvider(props) { + if (!props.fetcher) { + throw new TypeError("The `SchemaContextProvider` component requires a `fetcher` function to be passed as prop."); + } + const { + initialHeaders, + headerEditor + } = useEditorContext({ + nonNull: true, + caller: SchemaContextProvider + }); + const [schema, setSchema] = React.useState(); + const [isFetching, setIsFetching] = React.useState(false); + const [fetchError, setFetchError] = React.useState(null); + const counterRef = React.useRef(0); + React.useEffect(() => { + setSchema(graphql.isSchema(props.schema) || props.schema === null || props.schema === void 0 ? props.schema : void 0); + counterRef.current++; + }, [props.schema]); + const headersRef = React.useRef(initialHeaders); + React.useEffect(() => { + if (headerEditor) { + headersRef.current = headerEditor.getValue(); } - if (state.src.charCodeAt(pos++) === 0x3E /* > */ && !isOutdented) { - // This line is inside the blockquote. - - // set offset past spaces and ">" - let initial = state.sCount[nextLine] + 1; - let spaceAfterMarker; - let adjustTab; - - // skip one optional space after '>' - if (state.src.charCodeAt(pos) === 0x20 /* space */) { - // ' > test ' - // ^ -- position start of line here: - pos++; - initial++; - adjustTab = false; - spaceAfterMarker = true; - } else if (state.src.charCodeAt(pos) === 0x09 /* tab */) { - spaceAfterMarker = true; - if ((state.bsCount[nextLine] + initial) % 4 === 3) { - // ' >\t test ' - // ^ -- position start of line here (tab has width===1) - pos++; - initial++; - adjustTab = false; - } else { - // ' >\t test ' - // ^ -- position start of line here + shift bsCount slightly - // to make extra space appear - adjustTab = true; - } - } else { - spaceAfterMarker = false; + }); + const { + introspectionQuery, + introspectionQueryName, + introspectionQuerySansSubscriptions + } = useIntrospectionQuery({ + inputValueDeprecation: props.inputValueDeprecation, + introspectionQueryName: props.introspectionQueryName, + schemaDescription: props.schemaDescription + }); + const { + fetcher, + onSchemaChange, + dangerouslyAssumeSchemaIsValid, + children + } = props; + const introspect = React.useCallback(() => { + if (graphql.isSchema(props.schema) || props.schema === null) { + return; + } + const counter = ++counterRef.current; + const maybeIntrospectionData = props.schema; + async function fetchIntrospectionData() { + if (maybeIntrospectionData) { + return maybeIntrospectionData; + } + const parsedHeaders = parseHeaderString(headersRef.current); + if (!parsedHeaders.isValidJSON) { + setFetchError("Introspection failed as headers are invalid."); + return; + } + const fetcherOpts = parsedHeaders.headers ? { + headers: parsedHeaders.headers + } : {}; + const fetch2 = toolkit.fetcherReturnToPromise(fetcher({ + query: introspectionQuery, + operationName: introspectionQueryName + }, fetcherOpts)); + if (!toolkit.isPromise(fetch2)) { + setFetchError("Fetcher did not return a Promise for introspection."); + return; } - let offset = initial; - oldBMarks.push(state.bMarks[nextLine]); - state.bMarks[nextLine] = pos; - while (pos < max) { - const ch = state.src.charCodeAt(pos); - if (isSpace(ch)) { - if (ch === 0x09) { - offset += 4 - (offset + state.bsCount[nextLine] + (adjustTab ? 1 : 0)) % 4; - } else { - offset++; - } - } else { - break; + setIsFetching(true); + setFetchError(null); + let result = await fetch2; + if (typeof result !== "object" || result === null || !("data" in result)) { + const fetch22 = toolkit.fetcherReturnToPromise(fetcher({ + query: introspectionQuerySansSubscriptions, + operationName: introspectionQueryName + }, fetcherOpts)); + if (!toolkit.isPromise(fetch22)) { + throw new Error("Fetcher did not return a Promise for introspection."); } - pos++; + result = await fetch22; } - lastLineEmpty = pos >= max; - oldBSCount.push(state.bsCount[nextLine]); - state.bsCount[nextLine] = state.sCount[nextLine] + 1 + (spaceAfterMarker ? 1 : 0); - oldSCount.push(state.sCount[nextLine]); - state.sCount[nextLine] = offset - initial; - oldTShift.push(state.tShift[nextLine]); - state.tShift[nextLine] = pos - state.bMarks[nextLine]; - continue; - } - - // Case 2: line is not inside the blockquote, and the last line was empty. - if (lastLineEmpty) { - break; - } - - // Case 3: another tag found. - let terminate = false; - for (let i = 0, l = terminatorRules.length; i < l; i++) { - if (terminatorRules[i](state, nextLine, endLine, true)) { - terminate = true; - break; + setIsFetching(false); + if ((result == null ? void 0 : result.data) && "__schema" in result.data) { + return result.data; } + const responseString = typeof result === "string" ? result : toolkit.formatResult(result); + setFetchError(responseString); } - if (terminate) { - // Quirk to enforce "hard termination mode" for paragraphs; - // normally if you call `tokenize(state, startLine, nextLine)`, - // paragraphs will look below nextLine for paragraph continuation, - // but if blockquote is terminated by another tag, they shouldn't - state.lineMax = nextLine; - if (state.blkIndent !== 0) { - // state.blkIndent was non-zero, we now set it to zero, - // so we need to re-calculate all offsets to appear as - // if indent wasn't changed - oldBMarks.push(state.bMarks[nextLine]); - oldBSCount.push(state.bsCount[nextLine]); - oldTShift.push(state.tShift[nextLine]); - oldSCount.push(state.sCount[nextLine]); - state.sCount[nextLine] -= state.blkIndent; + fetchIntrospectionData().then(introspectionData => { + if (counter !== counterRef.current || !introspectionData) { + return; } - break; + try { + const newSchema = graphql.buildClientSchema(introspectionData); + setSchema(newSchema); + onSchemaChange == null ? void 0 : onSchemaChange(newSchema); + } catch (error) { + setFetchError(toolkit.formatError(error)); + } + }).catch(error => { + if (counter !== counterRef.current) { + return; + } + setFetchError(toolkit.formatError(error)); + setIsFetching(false); + }); + }, [fetcher, introspectionQueryName, introspectionQuery, introspectionQuerySansSubscriptions, onSchemaChange, props.schema]); + React.useEffect(() => { + introspect(); + }, [introspect]); + React.useEffect(() => { + function triggerIntrospection(event) { + if (event.ctrlKey && event.key === "R") { + introspect(); + } + } + window.addEventListener("keydown", triggerIntrospection); + return () => window.removeEventListener("keydown", triggerIntrospection); + }); + const validationErrors = React.useMemo(() => { + if (!schema || dangerouslyAssumeSchemaIsValid) { + return []; } - oldBMarks.push(state.bMarks[nextLine]); - oldBSCount.push(state.bsCount[nextLine]); - oldTShift.push(state.tShift[nextLine]); - oldSCount.push(state.sCount[nextLine]); - - // A negative indentation means that this is a paragraph continuation - // - state.sCount[nextLine] = -1; - } - const oldIndent = state.blkIndent; - state.blkIndent = 0; - const token_o = state.push('blockquote_open', 'blockquote', 1); - token_o.markup = '>'; - const lines = [startLine, 0]; - token_o.map = lines; - state.md.block.tokenize(state, startLine, nextLine); - const token_c = state.push('blockquote_close', 'blockquote', -1); - token_c.markup = '>'; - state.lineMax = oldLineMax; - state.parentType = oldParentType; - lines[1] = state.line; - - // Restore original tShift; this might not be necessary since the parser - // has already been here, but just to make sure we can do that. - for (let i = 0; i < oldTShift.length; i++) { - state.bMarks[i + startLine] = oldBMarks[i]; - state.tShift[i + startLine] = oldTShift[i]; - state.sCount[i + startLine] = oldSCount[i]; - state.bsCount[i + startLine] = oldBSCount[i]; - } - state.blkIndent = oldIndent; - return true; + return graphql.validateSchema(schema); + }, [schema, dangerouslyAssumeSchemaIsValid]); + const value = React.useMemo(() => ({ + fetchError, + introspect, + isFetching, + schema, + validationErrors + }), [fetchError, introspect, isFetching, schema, validationErrors]); + return /* @__PURE__ */jsxRuntime.jsx(SchemaContext.Provider, { + value, + children + }); } - -// Horizontal rule - -function hr(state, startLine, endLine, silent) { - const max = state.eMarks[startLine]; - // if it's indented more than 3 spaces, it should be a code block - if (state.sCount[startLine] - state.blkIndent >= 4) { - return false; - } - let pos = state.bMarks[startLine] + state.tShift[startLine]; - const marker = state.src.charCodeAt(pos++); - - // Check hr marker - if (marker !== 0x2A /* * */ && marker !== 0x2D /* - */ && marker !== 0x5F /* _ */) { - return false; - } - - // markers can be mixed with spaces, but there should be at least 3 of them - - let cnt = 1; - while (pos < max) { - const ch = state.src.charCodeAt(pos++); - if (ch !== marker && !isSpace(ch)) { - return false; +const useSchemaContext = createContextHook(SchemaContext); +function useIntrospectionQuery({ + inputValueDeprecation, + introspectionQueryName, + schemaDescription +}) { + return React.useMemo(() => { + const queryName = introspectionQueryName || "IntrospectionQuery"; + let query = graphql.getIntrospectionQuery({ + inputValueDeprecation, + schemaDescription + }); + if (introspectionQueryName) { + query = query.replace("query IntrospectionQuery", `query ${queryName}`); } - if (ch === marker) { - cnt++; + const querySansSubscriptions = query.replace("subscriptionType { name }", ""); + return { + introspectionQueryName: queryName, + introspectionQuery: query, + introspectionQuerySansSubscriptions: querySansSubscriptions + }; + }, [inputValueDeprecation, introspectionQueryName, schemaDescription]); +} +function parseHeaderString(headersString) { + let headers = null; + let isValidJSON = true; + try { + if (headersString) { + headers = JSON.parse(headersString); } + } catch { + isValidJSON = false; } - if (cnt < 3) { - return false; + return { + headers, + isValidJSON + }; +} +const initialNavStackItem = { + name: "Docs" +}; +const ExplorerContext = createNullableContext("ExplorerContext"); +function ExplorerContextProvider(props) { + const { + schema, + validationErrors + } = useSchemaContext({ + nonNull: true, + caller: ExplorerContextProvider + }); + const [navStack, setNavStack] = React.useState([initialNavStackItem]); + const push = React.useCallback(item => { + setNavStack(currentState => { + const lastItem = currentState.at(-1); + return lastItem.def === item.def ? + // Avoid pushing duplicate items + currentState : [...currentState, item]; + }); + }, []); + const pop = React.useCallback(() => { + setNavStack(currentState => currentState.length > 1 ? currentState.slice(0, -1) : currentState); + }, []); + const reset = React.useCallback(() => { + setNavStack(currentState => currentState.length === 1 ? currentState : [initialNavStackItem]); + }, []); + React.useEffect(() => { + if (schema == null || validationErrors.length > 0) { + reset(); + } else { + setNavStack(oldNavStack => { + if (oldNavStack.length === 1) { + return oldNavStack; + } + const newNavStack = [initialNavStackItem]; + let lastEntity = null; + for (const item of oldNavStack) { + if (item === initialNavStackItem) { + continue; + } + if (item.def) { + if (graphql.isNamedType(item.def)) { + const newType = schema.getType(item.def.name); + if (newType) { + newNavStack.push({ + name: item.name, + def: newType + }); + lastEntity = newType; + } else { + break; + } + } else if (lastEntity === null) { + break; + } else if (graphql.isObjectType(lastEntity) || graphql.isInputObjectType(lastEntity)) { + const field = lastEntity.getFields()[item.name]; + if (field) { + newNavStack.push({ + name: item.name, + def: field + }); + } else { + break; + } + } else if (graphql.isScalarType(lastEntity) || graphql.isEnumType(lastEntity) || graphql.isInterfaceType(lastEntity) || graphql.isUnionType(lastEntity)) { + break; + } else { + const field = lastEntity; + const arg = field.args.find(a => a.name === item.name); + if (arg) { + newNavStack.push({ + name: item.name, + def: field + }); + } else { + break; + } + } + } else { + lastEntity = null; + newNavStack.push(item); + } + } + return newNavStack; + }); + } + }, [reset, schema, validationErrors]); + const value = React.useMemo(() => ({ + explorerNavStack: navStack, + push, + pop, + reset + }), [navStack, push, pop, reset]); + return /* @__PURE__ */jsxRuntime.jsx(ExplorerContext.Provider, { + value, + children: props.children + }); +} +const useExplorerContext = createContextHook(ExplorerContext); +function renderType(type, renderNamedType) { + if (graphql.isNonNullType(type)) { + return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [renderType(type.ofType, renderNamedType), "!"] + }); } - if (silent) { - return true; + if (graphql.isListType(type)) { + return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: ["[", renderType(type.ofType, renderNamedType), "]"] + }); } - state.line = startLine + 1; - const token = state.push('hr', 'hr', 0); - token.map = [startLine, state.line]; - token.markup = Array(cnt + 1).join(String.fromCharCode(marker)); - return true; + return renderNamedType(type); } - -// Lists - -// Search `[-+*][\n ]`, returns next pos after marker on success -// or -1 on fail. -function skipBulletListMarker(state, startLine) { - const max = state.eMarks[startLine]; - let pos = state.bMarks[startLine] + state.tShift[startLine]; - const marker = state.src.charCodeAt(pos++); - // Check bullet - if (marker !== 0x2A /* * */ && marker !== 0x2D /* - */ && marker !== 0x2B /* + */) { - return -1; +function TypeLink(props) { + const { + push + } = useExplorerContext({ + nonNull: true, + caller: TypeLink + }); + if (!props.type) { + return null; } - if (pos < max) { - const ch = state.src.charCodeAt(pos); - if (!isSpace(ch)) { - // " -test " - is not a list item - return -1; - } + return renderType(props.type, namedType => /* @__PURE__ */jsxRuntime.jsx("a", { + className: "graphiql-doc-explorer-type-name", + onClick: event => { + event.preventDefault(); + push({ + name: namedType.name, + def: namedType + }); + }, + href: "#", + children: namedType.name + })); +} +function Argument({ + arg, + showDefaultValue, + inline +}) { + const definition = /* @__PURE__ */jsxRuntime.jsxs("span", { + children: [/* @__PURE__ */jsxRuntime.jsx("span", { + className: "graphiql-doc-explorer-argument-name", + children: arg.name + }), ": ", /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + type: arg.type + }), showDefaultValue !== false && /* @__PURE__ */jsxRuntime.jsx(DefaultValue, { + field: arg + })] + }); + if (inline) { + return definition; } - return pos; + return /* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-argument", + children: [definition, arg.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + type: "description", + children: arg.description + }) : null, arg.deprecationReason ? /* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-argument-deprecation", + children: [/* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-argument-deprecation-label", + children: "Deprecated" + }), /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + type: "deprecation", + children: arg.deprecationReason + })] + }) : null] + }); } - -// Search `\d+[.)][\n ]`, returns next pos after marker on success -// or -1 on fail. -function skipOrderedListMarker(state, startLine) { - const start = state.bMarks[startLine] + state.tShift[startLine]; - const max = state.eMarks[startLine]; - let pos = start; - - // List marker should have at least 2 chars (digit + dot) - if (pos + 1 >= max) { - return -1; +function DeprecationReason(props) { + var _props$preview; + return props.children ? /* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-deprecation", + children: [/* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-deprecation-label", + children: "Deprecated" + }), /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + type: "deprecation", + onlyShowFirstChild: (_props$preview = props.preview) !== null && _props$preview !== void 0 ? _props$preview : true, + children: props.children + })] + }) : null; +} +function Directive({ + directive +}) { + return /* @__PURE__ */jsxRuntime.jsxs("span", { + className: "graphiql-doc-explorer-directive", + children: ["@", directive.name.value] + }); +} +function ExplorerSection(props) { + const Icon2 = TYPE_TO_ICON[props.title]; + return /* @__PURE__ */jsxRuntime.jsxs("div", { + children: [/* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-section-title", + children: [/* @__PURE__ */jsxRuntime.jsx(Icon2, {}), props.title] + }), /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-section-content", + children: props.children + })] + }); +} +const TYPE_TO_ICON = { + Arguments: ArgumentIcon, + "Deprecated Arguments": DeprecatedArgumentIcon, + "Deprecated Enum Values": DeprecatedEnumValueIcon, + "Deprecated Fields": DeprecatedFieldIcon, + Directives: DirectiveIcon, + "Enum Values": EnumValueIcon, + Fields: FieldIcon, + Implements: ImplementsIcon, + Implementations: TypeIcon, + "Possible Types": TypeIcon, + "Root Types": RootTypeIcon, + Type: TypeIcon, + "All Schema Types": TypeIcon +}; +function FieldDocumentation(props) { + return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [props.field.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + type: "description", + children: props.field.description + }) : null, /* @__PURE__ */jsxRuntime.jsx(DeprecationReason, { + preview: false, + children: props.field.deprecationReason + }), /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: "Type", + children: /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + type: props.field.type + }) + }), /* @__PURE__ */jsxRuntime.jsx(Arguments, { + field: props.field + }), /* @__PURE__ */jsxRuntime.jsx(Directives, { + field: props.field + })] + }); +} +function Arguments({ + field +}) { + const [showDeprecated, setShowDeprecated] = React.useState(false); + const handleShowDeprecated = React.useCallback(() => { + setShowDeprecated(true); + }, []); + if (!("args" in field)) { + return null; } - let ch = state.src.charCodeAt(pos++); - if (ch < 0x30 /* 0 */ || ch > 0x39 /* 9 */) { - return -1; + const args = []; + const deprecatedArgs = []; + for (const argument of field.args) { + if (argument.deprecationReason) { + deprecatedArgs.push(argument); + } else { + args.push(argument); + } } - for (;;) { - // EOL -> fail - if (pos >= max) { - return -1; + return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [args.length > 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: "Arguments", + children: args.map(arg => /* @__PURE__ */jsxRuntime.jsx(Argument, { + arg + }, arg.name)) + }) : null, deprecatedArgs.length > 0 ? showDeprecated || args.length === 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: "Deprecated Arguments", + children: deprecatedArgs.map(arg => /* @__PURE__ */jsxRuntime.jsx(Argument, { + arg + }, arg.name)) + }) : /* @__PURE__ */jsxRuntime.jsx(Button$1, { + type: "button", + onClick: handleShowDeprecated, + children: "Show Deprecated Arguments" + }) : null] + }); +} +function Directives({ + field +}) { + var _a; + const directives = ((_a = field.astNode) == null ? void 0 : _a.directives) || []; + if (!directives || directives.length === 0) { + return null; + } + return /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: "Directives", + children: directives.map(directive => /* @__PURE__ */jsxRuntime.jsx("div", { + children: /* @__PURE__ */jsxRuntime.jsx(Directive, { + directive + }) + }, directive.name.value)) + }); +} +function SchemaDocumentation(props) { + var _a, _b, _c, _d; + const queryType = props.schema.getQueryType(); + const mutationType = (_b = (_a = props.schema).getMutationType) == null ? void 0 : _b.call(_a); + const subscriptionType = (_d = (_c = props.schema).getSubscriptionType) == null ? void 0 : _d.call(_c); + const typeMap = props.schema.getTypeMap(); + const ignoreTypesInAllSchema = [queryType == null ? void 0 : queryType.name, mutationType == null ? void 0 : mutationType.name, subscriptionType == null ? void 0 : subscriptionType.name]; + return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [/* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + type: "description", + children: props.schema.description || "A GraphQL schema provides a root type for each kind of operation." + }), /* @__PURE__ */jsxRuntime.jsxs(ExplorerSection, { + title: "Root Types", + children: [queryType ? /* @__PURE__ */jsxRuntime.jsxs("div", { + children: [/* @__PURE__ */jsxRuntime.jsx("span", { + className: "graphiql-doc-explorer-root-type", + children: "query" + }), ": ", /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + type: queryType + })] + }) : null, mutationType && /* @__PURE__ */jsxRuntime.jsxs("div", { + children: [/* @__PURE__ */jsxRuntime.jsx("span", { + className: "graphiql-doc-explorer-root-type", + children: "mutation" + }), ": ", /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + type: mutationType + })] + }), subscriptionType && /* @__PURE__ */jsxRuntime.jsxs("div", { + children: [/* @__PURE__ */jsxRuntime.jsx("span", { + className: "graphiql-doc-explorer-root-type", + children: "subscription" + }), ": ", /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + type: subscriptionType + })] + })] + }), /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: "All Schema Types", + children: typeMap && /* @__PURE__ */jsxRuntime.jsx("div", { + children: Object.values(typeMap).map(type => { + if (ignoreTypesInAllSchema.includes(type.name) || type.name.startsWith("__")) { + return null; + } + return /* @__PURE__ */jsxRuntime.jsx("div", { + children: /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + type + }) + }, type.name); + }) + }) + })] + }); +} +function debounce(duration, fn) { + let timeout; + return function (...args) { + if (timeout) { + window.clearTimeout(timeout); } - ch = state.src.charCodeAt(pos++); - if (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) { - // List marker should have no more than 9 digits - // (prevents integer overflow in browsers) - if (pos - start >= 10) { - return -1; + timeout = window.setTimeout(() => { + timeout = null; + fn(...args); + }, duration); + }; +} +function Search() { + const { + explorerNavStack, + push + } = useExplorerContext({ + nonNull: true, + caller: Search + }); + const inputRef = React.useRef(null); + const getSearchResults = useSearchResults(); + const [searchValue, setSearchValue] = React.useState(""); + const [results, setResults] = React.useState(getSearchResults(searchValue)); + const debouncedGetSearchResults = React.useMemo(() => debounce(200, search => { + setResults(getSearchResults(search)); + }), [getSearchResults]); + React.useEffect(() => { + debouncedGetSearchResults(searchValue); + }, [debouncedGetSearchResults, searchValue]); + React.useEffect(() => { + function handleKeyDown(event) { + var _a; + if (event.metaKey && event.key === "k") { + (_a = inputRef.current) == null ? void 0 : _a.focus(); } - continue; - } - - // found valid marker - if (ch === 0x29 /* ) */ || ch === 0x2e /* . */) { - break; - } - return -1; - } - if (pos < max) { - ch = state.src.charCodeAt(pos); - if (!isSpace(ch)) { - // " 1.test " - is not a list item - return -1; } + window.addEventListener("keydown", handleKeyDown); + return () => window.removeEventListener("keydown", handleKeyDown); + }, []); + const navItem = explorerNavStack.at(-1); + const onSelect = React.useCallback(def => { + push("field" in def ? { + name: def.field.name, + def: def.field + } : { + name: def.type.name, + def: def.type + }); + }, [push]); + const isFocused = React.useRef(false); + const handleFocus = React.useCallback(e => { + isFocused.current = e.type === "focus"; + }, []); + const shouldSearchBoxAppear = explorerNavStack.length === 1 || graphql.isObjectType(navItem.def) || graphql.isInterfaceType(navItem.def) || graphql.isInputObjectType(navItem.def); + if (!shouldSearchBoxAppear) { + return null; } - return pos; + return /* @__PURE__ */jsxRuntime.jsxs(react.Combobox, { + as: "div", + className: "graphiql-doc-explorer-search", + onChange: onSelect, + "data-state": isFocused ? void 0 : "idle", + "aria-label": `Search ${navItem.name}...`, + children: [/* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-search-input", + onClick: () => { + var _a; + (_a = inputRef.current) == null ? void 0 : _a.focus(); + }, + children: [/* @__PURE__ */jsxRuntime.jsx(MagnifyingGlassIcon, {}), /* @__PURE__ */jsxRuntime.jsx(react.Combobox.Input, { + autoComplete: "off", + onFocus: handleFocus, + onBlur: handleFocus, + onChange: event => setSearchValue(event.target.value), + placeholder: `${isMacOs ? "⌘" : "Ctrl"} K`, + ref: inputRef, + value: searchValue, + "data-cy": "doc-explorer-input" + })] + }), isFocused.current && /* @__PURE__ */jsxRuntime.jsxs(react.Combobox.Options, { + "data-cy": "doc-explorer-list", + children: [results.within.length + results.types.length + results.fields.length === 0 ? /* @__PURE__ */jsxRuntime.jsx("li", { + className: "graphiql-doc-explorer-search-empty", + children: "No results found" + }) : results.within.map((result, i) => /* @__PURE__ */jsxRuntime.jsx(react.Combobox.Option, { + value: result, + "data-cy": "doc-explorer-option", + children: /* @__PURE__ */jsxRuntime.jsx(Field$1, { + field: result.field, + argument: result.argument + }) + }, `within-${i}`)), results.within.length > 0 && results.types.length + results.fields.length > 0 ? /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-search-divider", + children: "Other results" + }) : null, results.types.map((result, i) => /* @__PURE__ */jsxRuntime.jsx(react.Combobox.Option, { + value: result, + "data-cy": "doc-explorer-option", + children: /* @__PURE__ */jsxRuntime.jsx(Type, { + type: result.type + }) + }, `type-${i}`)), results.fields.map((result, i) => /* @__PURE__ */jsxRuntime.jsxs(react.Combobox.Option, { + value: result, + "data-cy": "doc-explorer-option", + children: [/* @__PURE__ */jsxRuntime.jsx(Type, { + type: result.type + }), ".", /* @__PURE__ */jsxRuntime.jsx(Field$1, { + field: result.field, + argument: result.argument + })] + }, `field-${i}`))] + })] + }); } -function markTightParagraphs(state, idx) { - const level = state.level + 2; - for (let i = idx + 2, l = state.tokens.length - 2; i < l; i++) { - if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') { - state.tokens[i + 2].hidden = true; - state.tokens[i].hidden = true; - i += 2; +function useSearchResults(caller) { + const { + explorerNavStack + } = useExplorerContext({ + nonNull: true, + caller: caller || useSearchResults + }); + const { + schema + } = useSchemaContext({ + nonNull: true, + caller: caller || useSearchResults + }); + const navItem = explorerNavStack.at(-1); + return React.useCallback(searchValue => { + const matches = { + within: [], + types: [], + fields: [] + }; + if (!schema) { + return matches; + } + const withinType = navItem.def; + const typeMap = schema.getTypeMap(); + let typeNames = Object.keys(typeMap); + if (withinType) { + typeNames = typeNames.filter(n => n !== withinType.name); + typeNames.unshift(withinType.name); + } + for (const typeName of typeNames) { + if (matches.within.length + matches.types.length + matches.fields.length >= 100) { + break; + } + const type = typeMap[typeName]; + if (withinType !== type && isMatch(typeName, searchValue)) { + matches.types.push({ + type + }); + } + if (!graphql.isObjectType(type) && !graphql.isInterfaceType(type) && !graphql.isInputObjectType(type)) { + continue; + } + const fields = type.getFields(); + for (const fieldName in fields) { + const field = fields[fieldName]; + let matchingArgs; + if (!isMatch(fieldName, searchValue)) { + if ("args" in field) { + matchingArgs = field.args.filter(arg => isMatch(arg.name, searchValue)); + if (matchingArgs.length === 0) { + continue; + } + } else { + continue; + } + } + matches[withinType === type ? "within" : "fields"].push(...(matchingArgs ? matchingArgs.map(argument => ({ + type, + field, + argument + })) : [{ + type, + field + }])); + } } + return matches; + }, [navItem.def, schema]); +} +function isMatch(sourceText, searchValue) { + try { + const escaped = searchValue.replaceAll(/[^_0-9A-Za-z]/g, ch => "\\" + ch); + return sourceText.search(new RegExp(escaped, "i")) !== -1; + } catch { + return sourceText.toLowerCase().includes(searchValue.toLowerCase()); } } -function list(state, startLine, endLine, silent) { - let max, pos, start, token; - let nextLine = startLine; - let tight = true; - - // if it's indented more than 3 spaces, it should be a code block - if (state.sCount[nextLine] - state.blkIndent >= 4) { - return false; +function Type(props) { + return /* @__PURE__ */jsxRuntime.jsx("span", { + className: "graphiql-doc-explorer-search-type", + children: props.type.name + }); +} +function Field$1({ + field, + argument +}) { + return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [/* @__PURE__ */jsxRuntime.jsx("span", { + className: "graphiql-doc-explorer-search-field", + children: field.name + }), argument ? /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: ["(", /* @__PURE__ */jsxRuntime.jsx("span", { + className: "graphiql-doc-explorer-search-argument", + children: argument.name + }), ":", " ", renderType(argument.type, namedType => /* @__PURE__ */jsxRuntime.jsx(Type, { + type: namedType + })), ")"] + }) : null] + }); +} +function FieldLink(props) { + const { + push + } = useExplorerContext({ + nonNull: true + }); + return /* @__PURE__ */jsxRuntime.jsx("a", { + className: "graphiql-doc-explorer-field-name", + onClick: event => { + event.preventDefault(); + push({ + name: props.field.name, + def: props.field + }); + }, + href: "#", + children: props.field.name + }); +} +function TypeDocumentation(props) { + return graphql.isNamedType(props.type) ? /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [props.type.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + type: "description", + children: props.type.description + }) : null, /* @__PURE__ */jsxRuntime.jsx(ImplementsInterfaces, { + type: props.type + }), /* @__PURE__ */jsxRuntime.jsx(Fields, { + type: props.type + }), /* @__PURE__ */jsxRuntime.jsx(EnumValues, { + type: props.type + }), /* @__PURE__ */jsxRuntime.jsx(PossibleTypes, { + type: props.type + })] + }) : null; +} +function ImplementsInterfaces({ + type +}) { + if (!graphql.isObjectType(type)) { + return null; } - - // Special case: - // - item 1 - // - item 2 - // - item 3 - // - item 4 - // - this one is a paragraph continuation - if (state.listIndent >= 0 && state.sCount[nextLine] - state.listIndent >= 4 && state.sCount[nextLine] < state.blkIndent) { - return false; + const interfaces = type.getInterfaces(); + return interfaces.length > 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: "Implements", + children: type.getInterfaces().map(implementedInterface => /* @__PURE__ */jsxRuntime.jsx("div", { + children: /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + type: implementedInterface + }) + }, implementedInterface.name)) + }) : null; +} +function Fields({ + type +}) { + const [showDeprecated, setShowDeprecated] = React.useState(false); + const handleShowDeprecated = React.useCallback(() => { + setShowDeprecated(true); + }, []); + if (!graphql.isObjectType(type) && !graphql.isInterfaceType(type) && !graphql.isInputObjectType(type)) { + return null; } - let isTerminatingParagraph = false; - - // limit conditions when list can interrupt - // a paragraph (validation mode only) - if (silent && state.parentType === 'paragraph') { - // Next list item should still terminate previous list item; - // - // This code can fail if plugins use blkIndent as well as lists, - // but I hope the spec gets fixed long before that happens. - // - if (state.sCount[nextLine] >= state.blkIndent) { - isTerminatingParagraph = true; + const fieldMap = type.getFields(); + const fields = []; + const deprecatedFields = []; + for (const field of Object.keys(fieldMap).map(name => fieldMap[name])) { + if (field.deprecationReason) { + deprecatedFields.push(field); + } else { + fields.push(field); } } - - // Detect list type and position after marker - let isOrdered; - let markerValue; - let posAfterMarker; - if ((posAfterMarker = skipOrderedListMarker(state, nextLine)) >= 0) { - isOrdered = true; - start = state.bMarks[nextLine] + state.tShift[nextLine]; - markerValue = Number(state.src.slice(start, posAfterMarker - 1)); - - // If we're starting a new ordered list right after - // a paragraph, it should start with 1. - if (isTerminatingParagraph && markerValue !== 1) return false; - } else if ((posAfterMarker = skipBulletListMarker(state, nextLine)) >= 0) { - isOrdered = false; - } else { - return false; + return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [fields.length > 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: "Fields", + children: fields.map(field => /* @__PURE__ */jsxRuntime.jsx(Field, { + field + }, field.name)) + }) : null, deprecatedFields.length > 0 ? showDeprecated || fields.length === 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: "Deprecated Fields", + children: deprecatedFields.map(field => /* @__PURE__ */jsxRuntime.jsx(Field, { + field + }, field.name)) + }) : /* @__PURE__ */jsxRuntime.jsx(Button$1, { + type: "button", + onClick: handleShowDeprecated, + children: "Show Deprecated Fields" + }) : null] + }); +} +function Field({ + field +}) { + const args = "args" in field ? field.args.filter(arg => !arg.deprecationReason) : []; + return /* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-item", + children: [/* @__PURE__ */jsxRuntime.jsxs("div", { + children: [/* @__PURE__ */jsxRuntime.jsx(FieldLink, { + field + }), args.length > 0 ? /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: ["(", /* @__PURE__ */jsxRuntime.jsx("span", { + children: args.map(arg => args.length === 1 ? /* @__PURE__ */jsxRuntime.jsx(Argument, { + arg, + inline: true + }, arg.name) : /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-argument-multiple", + children: /* @__PURE__ */jsxRuntime.jsx(Argument, { + arg, + inline: true + }) + }, arg.name)) + }), ")"] + }) : null, ": ", /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + type: field.type + }), /* @__PURE__ */jsxRuntime.jsx(DefaultValue, { + field + })] + }), field.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + type: "description", + onlyShowFirstChild: true, + children: field.description + }) : null, /* @__PURE__ */jsxRuntime.jsx(DeprecationReason, { + children: field.deprecationReason + })] + }); +} +function EnumValues({ + type +}) { + const [showDeprecated, setShowDeprecated] = React.useState(false); + const handleShowDeprecated = React.useCallback(() => { + setShowDeprecated(true); + }, []); + if (!graphql.isEnumType(type)) { + return null; } - - // If we're starting a new unordered list right after - // a paragraph, first line should not be empty. - if (isTerminatingParagraph) { - if (state.skipSpaces(posAfterMarker) >= state.eMarks[nextLine]) return false; + const values = []; + const deprecatedValues = []; + for (const value of type.getValues()) { + if (value.deprecationReason) { + deprecatedValues.push(value); + } else { + values.push(value); + } + } + return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [values.length > 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: "Enum Values", + children: values.map(value => /* @__PURE__ */jsxRuntime.jsx(EnumValue, { + value + }, value.name)) + }) : null, deprecatedValues.length > 0 ? showDeprecated || values.length === 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: "Deprecated Enum Values", + children: deprecatedValues.map(value => /* @__PURE__ */jsxRuntime.jsx(EnumValue, { + value + }, value.name)) + }) : /* @__PURE__ */jsxRuntime.jsx(Button$1, { + type: "button", + onClick: handleShowDeprecated, + children: "Show Deprecated Values" + }) : null] + }); +} +function EnumValue({ + value +}) { + return /* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-item", + children: [/* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-enum-value", + children: value.name + }), value.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + type: "description", + children: value.description + }) : null, value.deprecationReason ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + type: "deprecation", + children: value.deprecationReason + }) : null] + }); +} +function PossibleTypes({ + type +}) { + const { + schema + } = useSchemaContext({ + nonNull: true + }); + if (!schema || !graphql.isAbstractType(type)) { + return null; } - - // For validation mode we can terminate immediately - if (silent) { - return true; + return /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: graphql.isInterfaceType(type) ? "Implementations" : "Possible Types", + children: schema.getPossibleTypes(type).map(possibleType => /* @__PURE__ */jsxRuntime.jsx("div", { + children: /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + type: possibleType + }) + }, possibleType.name)) + }); +} +function DocExplorer() { + const { + fetchError, + isFetching, + schema, + validationErrors + } = useSchemaContext({ + nonNull: true, + caller: DocExplorer + }); + const { + explorerNavStack, + pop + } = useExplorerContext({ + nonNull: true, + caller: DocExplorer + }); + const navItem = explorerNavStack.at(-1); + let content = null; + if (fetchError) { + content = /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-error", + children: "Error fetching schema" + }); + } else if (validationErrors.length > 0) { + content = /* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-error", + children: ["Schema is invalid: ", validationErrors[0].message] + }); + } else if (isFetching) { + content = /* @__PURE__ */jsxRuntime.jsx(Spinner, {}); + } else if (!schema) { + content = /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-error", + children: "No GraphQL schema available" + }); + } else if (explorerNavStack.length === 1) { + content = /* @__PURE__ */jsxRuntime.jsx(SchemaDocumentation, { + schema + }); + } else if (graphql.isType(navItem.def)) { + content = /* @__PURE__ */jsxRuntime.jsx(TypeDocumentation, { + type: navItem.def + }); + } else if (navItem.def) { + content = /* @__PURE__ */jsxRuntime.jsx(FieldDocumentation, { + field: navItem.def + }); } - - // We should terminate list on style change. Remember first one to compare. - const markerCharCode = state.src.charCodeAt(posAfterMarker - 1); - - // Start list - const listTokIdx = state.tokens.length; - if (isOrdered) { - token = state.push('ordered_list_open', 'ol', 1); - if (markerValue !== 1) { - token.attrs = [['start', markerValue]]; - } - } else { - token = state.push('bullet_list_open', 'ul', 1); + let prevName; + if (explorerNavStack.length > 1) { + prevName = explorerNavStack.at(-2).name; } - const listLines = [nextLine, 0]; - token.map = listLines; - token.markup = String.fromCharCode(markerCharCode); - - // - // Iterate list items - // - - let prevEmptyEnd = false; - const terminatorRules = state.md.block.ruler.getRules('list'); - const oldParentType = state.parentType; - state.parentType = 'list'; - while (nextLine < endLine) { - pos = posAfterMarker; - max = state.eMarks[nextLine]; - const initial = state.sCount[nextLine] + posAfterMarker - (state.bMarks[nextLine] + state.tShift[nextLine]); - let offset = initial; - while (pos < max) { - const ch = state.src.charCodeAt(pos); - if (ch === 0x09) { - offset += 4 - (offset + state.bsCount[nextLine]) % 4; - } else if (ch === 0x20) { - offset++; + return /* @__PURE__ */jsxRuntime.jsxs("section", { + className: "graphiql-doc-explorer", + "aria-label": "Documentation Explorer", + children: [/* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-header", + children: [/* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-header-content", + children: [prevName && /* @__PURE__ */jsxRuntime.jsxs("a", { + href: "#", + className: "graphiql-doc-explorer-back", + onClick: event => { + event.preventDefault(); + pop(); + }, + "aria-label": `Go back to ${prevName}`, + children: [/* @__PURE__ */jsxRuntime.jsx(ChevronLeftIcon, {}), prevName] + }), /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-title", + children: navItem.name + })] + }), /* @__PURE__ */jsxRuntime.jsx(Search, {}, navItem.name)] + }), /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-content", + children: content + })] + }); +} +const DOC_EXPLORER_PLUGIN = { + title: "Documentation Explorer", + icon: function Icon() { + const pluginContext = usePluginContext(); + return (pluginContext == null ? void 0 : pluginContext.visiblePlugin) === DOC_EXPLORER_PLUGIN ? /* @__PURE__ */jsxRuntime.jsx(DocsFilledIcon, {}) : /* @__PURE__ */jsxRuntime.jsx(DocsIcon, {}); + }, + content: DocExplorer +}; +const HISTORY_PLUGIN = { + title: "History", + icon: HistoryIcon, + content: History +}; +const PluginContext = createNullableContext("PluginContext"); +function PluginContextProvider(props) { + const storage = useStorageContext(); + const explorerContext = useExplorerContext(); + const historyContext = useHistoryContext(); + const hasExplorerContext = Boolean(explorerContext); + const hasHistoryContext = Boolean(historyContext); + const plugins = React.useMemo(() => { + const pluginList = []; + const pluginTitles = {}; + if (hasExplorerContext) { + pluginList.push(DOC_EXPLORER_PLUGIN); + pluginTitles[DOC_EXPLORER_PLUGIN.title] = true; + } + if (hasHistoryContext) { + pluginList.push(HISTORY_PLUGIN); + pluginTitles[HISTORY_PLUGIN.title] = true; + } + for (const plugin of props.plugins || []) { + if (typeof plugin.title !== "string" || !plugin.title) { + throw new Error("All GraphiQL plugins must have a unique title"); + } + if (pluginTitles[plugin.title]) { + throw new Error(`All GraphiQL plugins must have a unique title, found two plugins with the title '${plugin.title}'`); } else { - break; + pluginList.push(plugin); + pluginTitles[plugin.title] = true; } - pos++; } - const contentStart = pos; - let indentAfterMarker; - if (contentStart >= max) { - // trimming space in "- \n 3" case, indent is 1 here - indentAfterMarker = 1; - } else { - indentAfterMarker = offset - initial; + return pluginList; + }, [hasExplorerContext, hasHistoryContext, props.plugins]); + const [visiblePlugin, internalSetVisiblePlugin] = React.useState(() => { + const storedValue = storage == null ? void 0 : storage.get(STORAGE_KEY$4); + const pluginForStoredValue = plugins.find(plugin => plugin.title === storedValue); + if (pluginForStoredValue) { + return pluginForStoredValue; } - - // If we have more than 4 spaces, the indent is 1 - // (the rest is just indented code block) - if (indentAfterMarker > 4) { - indentAfterMarker = 1; + if (storedValue) { + storage == null ? void 0 : storage.set(STORAGE_KEY$4, ""); } - - // " - test" - // ^^^^^ - calculating total length of this thing - const indent = initial + indentAfterMarker; - - // Run subparser & write tokens - token = state.push('list_item_open', 'li', 1); - token.markup = String.fromCharCode(markerCharCode); - const itemLines = [nextLine, 0]; - token.map = itemLines; - if (isOrdered) { - token.info = state.src.slice(start, posAfterMarker - 1); + if (!props.visiblePlugin) { + return null; } - - // change current state, then restore it after parser subcall - const oldTight = state.tight; - const oldTShift = state.tShift[nextLine]; - const oldSCount = state.sCount[nextLine]; - - // - example list - // ^ listIndent position will be here - // ^ blkIndent position will be here - // - const oldListIndent = state.listIndent; - state.listIndent = state.blkIndent; - state.blkIndent = indent; - state.tight = true; - state.tShift[nextLine] = contentStart - state.bMarks[nextLine]; - state.sCount[nextLine] = offset; - if (contentStart >= max && state.isEmpty(nextLine + 1)) { - // workaround for this case - // (list item is empty, list terminates before "foo"): - // ~~~~~~~~ - // - - // - // foo - // ~~~~~~~~ - state.line = Math.min(state.line + 2, endLine); - } else { - state.md.block.tokenize(state, nextLine, endLine, true); + return plugins.find(plugin => (typeof props.visiblePlugin === "string" ? plugin.title : plugin) === props.visiblePlugin) || null; + }); + const { + onTogglePluginVisibility, + children + } = props; + const setVisiblePlugin = React.useCallback(plugin => { + const newVisiblePlugin = plugin ? plugins.find(p => (typeof plugin === "string" ? p.title : p) === plugin) || null : null; + internalSetVisiblePlugin(current => { + if (newVisiblePlugin === current) { + return current; + } + onTogglePluginVisibility == null ? void 0 : onTogglePluginVisibility(newVisiblePlugin); + return newVisiblePlugin; + }); + }, [onTogglePluginVisibility, plugins]); + React.useEffect(() => { + if (props.visiblePlugin) { + setVisiblePlugin(props.visiblePlugin); } - - // If any of list item is tight, mark list as tight - if (!state.tight || prevEmptyEnd) { - tight = false; + }, [plugins, props.visiblePlugin, setVisiblePlugin]); + const value = React.useMemo(() => ({ + plugins, + setVisiblePlugin, + visiblePlugin + }), [plugins, setVisiblePlugin, visiblePlugin]); + return /* @__PURE__ */jsxRuntime.jsx(PluginContext.Provider, { + value, + children + }); +} +const usePluginContext = createContextHook(PluginContext); +const STORAGE_KEY$4 = "visiblePlugin"; +function onHasCompletion(_cm, data, schema, explorer, plugin, callback) { + void importCodeMirror([], { + useCommonAddons: false + }).then(CodeMirror => { + let information; + let fieldName; + let typeNamePill; + let typeNamePrefix; + let typeName; + let typeNameSuffix; + let description; + let deprecation; + let deprecationReason; + CodeMirror.on(data, "select", + // @ts-expect-error + (ctx, el) => { + if (!information) { + const hintsUl = el.parentNode; + information = document.createElement("div"); + information.className = "CodeMirror-hint-information"; + hintsUl.append(information); + const header = document.createElement("header"); + header.className = "CodeMirror-hint-information-header"; + information.append(header); + fieldName = document.createElement("span"); + fieldName.className = "CodeMirror-hint-information-field-name"; + header.append(fieldName); + typeNamePill = document.createElement("span"); + typeNamePill.className = "CodeMirror-hint-information-type-name-pill"; + header.append(typeNamePill); + typeNamePrefix = document.createElement("span"); + typeNamePill.append(typeNamePrefix); + typeName = document.createElement("a"); + typeName.className = "CodeMirror-hint-information-type-name"; + typeName.href = "javascript:void 0"; + typeName.addEventListener("click", onClickHintInformation); + typeNamePill.append(typeName); + typeNameSuffix = document.createElement("span"); + typeNamePill.append(typeNameSuffix); + description = document.createElement("div"); + description.className = "CodeMirror-hint-information-description"; + information.append(description); + deprecation = document.createElement("div"); + deprecation.className = "CodeMirror-hint-information-deprecation"; + information.append(deprecation); + const deprecationLabel = document.createElement("span"); + deprecationLabel.className = "CodeMirror-hint-information-deprecation-label"; + deprecationLabel.textContent = "Deprecated"; + deprecation.append(deprecationLabel); + deprecationReason = document.createElement("div"); + deprecationReason.className = "CodeMirror-hint-information-deprecation-reason"; + deprecation.append(deprecationReason); + const defaultInformationPadding = parseInt(window.getComputedStyle(information).paddingBottom.replace(/px$/, ""), 10) || 0; + const defaultInformationMaxHeight = parseInt(window.getComputedStyle(information).maxHeight.replace(/px$/, ""), 10) || 0; + const handleScroll = () => { + if (information) { + information.style.paddingTop = hintsUl.scrollTop + defaultInformationPadding + "px"; + information.style.maxHeight = hintsUl.scrollTop + defaultInformationMaxHeight + "px"; + } + }; + hintsUl.addEventListener("scroll", handleScroll); + let onRemoveFn; + hintsUl.addEventListener("DOMNodeRemoved", onRemoveFn = event => { + if (event.target !== hintsUl) { + return; + } + hintsUl.removeEventListener("scroll", handleScroll); + hintsUl.removeEventListener("DOMNodeRemoved", onRemoveFn); + if (information) { + information.removeEventListener("click", onClickHintInformation); + } + information = null; + fieldName = null; + typeNamePill = null; + typeNamePrefix = null; + typeName = null; + typeNameSuffix = null; + description = null; + deprecation = null; + deprecationReason = null; + onRemoveFn = null; + }); + } + if (fieldName) { + fieldName.textContent = ctx.text; + } + if (typeNamePill && typeNamePrefix && typeName && typeNameSuffix) { + if (ctx.type) { + typeNamePill.style.display = "inline"; + const renderType2 = type => { + if (graphql.isNonNullType(type)) { + typeNameSuffix.textContent = "!" + typeNameSuffix.textContent; + renderType2(type.ofType); + } else if (graphql.isListType(type)) { + typeNamePrefix.textContent += "["; + typeNameSuffix.textContent = "]" + typeNameSuffix.textContent; + renderType2(type.ofType); + } else { + typeName.textContent = type.name; + } + }; + typeNamePrefix.textContent = ""; + typeNameSuffix.textContent = ""; + renderType2(ctx.type); + } else { + typeNamePrefix.textContent = ""; + typeName.textContent = ""; + typeNameSuffix.textContent = ""; + typeNamePill.style.display = "none"; + } + } + if (description) { + if (ctx.description) { + description.style.display = "block"; + description.innerHTML = markdown.render(ctx.description); + } else { + description.style.display = "none"; + description.innerHTML = ""; + } + } + if (deprecation && deprecationReason) { + if (ctx.deprecationReason) { + deprecation.style.display = "block"; + deprecationReason.innerHTML = markdown.render(ctx.deprecationReason); + } else { + deprecation.style.display = "none"; + deprecationReason.innerHTML = ""; + } + } + }); + }); + function onClickHintInformation(event) { + if (!schema || !explorer || !plugin || !(event.currentTarget instanceof HTMLElement)) { + return; } - // Item become loose if finish with empty line, - // but we should filter last element, because it means list finish - prevEmptyEnd = state.line - nextLine > 1 && state.isEmpty(state.line - 1); - state.blkIndent = state.listIndent; - state.listIndent = oldListIndent; - state.tShift[nextLine] = oldTShift; - state.sCount[nextLine] = oldSCount; - state.tight = oldTight; - token = state.push('list_item_close', 'li', -1); - token.markup = String.fromCharCode(markerCharCode); - nextLine = state.line; - itemLines[1] = nextLine; - if (nextLine >= endLine) { - break; + const typeName = event.currentTarget.textContent || ""; + const type = schema.getType(typeName); + if (type) { + plugin.setVisiblePlugin(DOC_EXPLORER_PLUGIN); + explorer.push({ + name: type.name, + def: type + }); + callback == null ? void 0 : callback(type); } - - // - // Try to check if list is terminated or continued. - // - if (state.sCount[nextLine] < state.blkIndent) { - break; + } +} +function useSynchronizeValue(editor, value) { + React.useEffect(() => { + if (editor && typeof value === "string" && value !== editor.getValue()) { + editor.setValue(value); } - - // if it's indented more than 3 spaces, it should be a code block - if (state.sCount[nextLine] - state.blkIndent >= 4) { - break; + }, [editor, value]); +} +function useSynchronizeOption(editor, option, value) { + React.useEffect(() => { + if (editor) { + editor.setOption(option, value); } - - // fail if terminating block found - let terminate = false; - for (let i = 0, l = terminatorRules.length; i < l; i++) { - if (terminatorRules[i](state, nextLine, endLine, true)) { - terminate = true; - break; + }, [editor, option, value]); +} +function useChangeHandler(editor, callback, storageKey, tabProperty, caller) { + const { + updateActiveTabValues + } = useEditorContext({ + nonNull: true, + caller + }); + const storage = useStorageContext(); + React.useEffect(() => { + if (!editor) { + return; + } + const store = debounce(500, value => { + if (!storage || storageKey === null) { + return; } + storage.set(storageKey, value); + }); + const updateTab = debounce(100, value => { + updateActiveTabValues({ + [tabProperty]: value + }); + }); + const handleChange = (editorInstance, changeObj) => { + if (!changeObj) { + return; + } + const newValue = editorInstance.getValue(); + store(newValue); + updateTab(newValue); + callback == null ? void 0 : callback(newValue); + }; + editor.on("change", handleChange); + return () => editor.off("change", handleChange); + }, [callback, editor, storage, storageKey, tabProperty, updateActiveTabValues]); +} +function useCompletion(editor, callback, caller) { + const { + schema + } = useSchemaContext({ + nonNull: true, + caller + }); + const explorer = useExplorerContext(); + const plugin = usePluginContext(); + React.useEffect(() => { + if (!editor) { + return; } - if (terminate) { - break; + const handleCompletion = (instance, changeObj) => { + onHasCompletion(instance, changeObj, schema, explorer, plugin, type => { + callback == null ? void 0 : callback({ + kind: "Type", + type, + schema: schema || void 0 + }); + }); + }; + editor.on( + // @ts-expect-error @TODO additional args for hasCompletion event + "hasCompletion", handleCompletion); + return () => editor.off( + // @ts-expect-error @TODO additional args for hasCompletion event + "hasCompletion", handleCompletion); + }, [callback, editor, explorer, plugin, schema]); +} +function useKeyMap(editor, keys, callback) { + React.useEffect(() => { + if (!editor) { + return; } - - // fail if list has another type - if (isOrdered) { - posAfterMarker = skipOrderedListMarker(state, nextLine); - if (posAfterMarker < 0) { - break; - } - start = state.bMarks[nextLine] + state.tShift[nextLine]; - } else { - posAfterMarker = skipBulletListMarker(state, nextLine); - if (posAfterMarker < 0) { - break; + for (const key of keys) { + editor.removeKeyMap(key); + } + if (callback) { + const keyMap = {}; + for (const key of keys) { + keyMap[key] = () => callback(); } + editor.addKeyMap(keyMap); } - if (markerCharCode !== state.src.charCodeAt(posAfterMarker - 1)) { - break; + }, [editor, keys, callback]); +} +function useCopyQuery({ + caller, + onCopyQuery +} = {}) { + const { + queryEditor + } = useEditorContext({ + nonNull: true, + caller: caller || useCopyQuery + }); + return React.useCallback(() => { + if (!queryEditor) { + return; } - } - - // Finalize list - if (isOrdered) { - token = state.push('ordered_list_close', 'ol', -1); - } else { - token = state.push('bullet_list_close', 'ul', -1); - } - token.markup = String.fromCharCode(markerCharCode); - listLines[1] = nextLine; - state.line = nextLine; - state.parentType = oldParentType; - - // mark paragraphs tight if needed - if (tight) { - markTightParagraphs(state, listTokIdx); - } - return true; + const query = queryEditor.getValue(); + copyToClipboard(query); + onCopyQuery == null ? void 0 : onCopyQuery(query); + }, [queryEditor, onCopyQuery]); } -function reference(state, startLine, _endLine, silent) { - let pos = state.bMarks[startLine] + state.tShift[startLine]; - let max = state.eMarks[startLine]; - let nextLine = startLine + 1; - - // if it's indented more than 3 spaces, it should be a code block - if (state.sCount[startLine] - state.blkIndent >= 4) { - return false; - } - if (state.src.charCodeAt(pos) !== 0x5B /* [ */) { - return false; - } - function getNextLine(nextLine) { - const endLine = state.lineMax; - if (nextLine >= endLine || state.isEmpty(nextLine)) { - // empty line or end of input - return null; +function useMergeQuery({ + caller +} = {}) { + const { + queryEditor + } = useEditorContext({ + nonNull: true, + caller: caller || useMergeQuery + }); + const { + schema + } = useSchemaContext({ + nonNull: true, + caller: useMergeQuery + }); + return React.useCallback(() => { + const documentAST = queryEditor == null ? void 0 : queryEditor.documentAST; + const query = queryEditor == null ? void 0 : queryEditor.getValue(); + if (!documentAST || !query) { + return; } - let isContinuation = false; - - // this would be a code block normally, but after paragraph - // it's considered a lazy continuation regardless of what's there - if (state.sCount[nextLine] - state.blkIndent > 3) { - isContinuation = true; + queryEditor.setValue(graphql.print(toolkit.mergeAst(documentAST, schema))); + }, [queryEditor, schema]); +} +function usePrettifyEditors({ + caller +} = {}) { + const { + queryEditor, + headerEditor, + variableEditor + } = useEditorContext({ + nonNull: true, + caller: caller || usePrettifyEditors + }); + return React.useCallback(() => { + if (variableEditor) { + const variableEditorContent = variableEditor.getValue(); + try { + const prettifiedVariableEditorContent = JSON.stringify(JSON.parse(variableEditorContent), null, 2); + if (prettifiedVariableEditorContent !== variableEditorContent) { + variableEditor.setValue(prettifiedVariableEditorContent); + } + } catch {} } - - // quirk for blockquotes, this line should already be checked by that rule - if (state.sCount[nextLine] < 0) { - isContinuation = true; + if (headerEditor) { + const headerEditorContent = headerEditor.getValue(); + try { + const prettifiedHeaderEditorContent = JSON.stringify(JSON.parse(headerEditorContent), null, 2); + if (prettifiedHeaderEditorContent !== headerEditorContent) { + headerEditor.setValue(prettifiedHeaderEditorContent); + } + } catch {} } - if (!isContinuation) { - const terminatorRules = state.md.block.ruler.getRules('reference'); - const oldParentType = state.parentType; - state.parentType = 'reference'; - - // Some tags can terminate paragraph without empty line. - let terminate = false; - for (let i = 0, l = terminatorRules.length; i < l; i++) { - if (terminatorRules[i](state, nextLine, endLine, true)) { - terminate = true; - break; + if (queryEditor) { + const editorContent = queryEditor.getValue(); + const prettifiedEditorContent = graphql.print(graphql.parse(editorContent)); + if (prettifiedEditorContent !== editorContent) { + queryEditor.setValue(prettifiedEditorContent); + } + } + }, [queryEditor, variableEditor, headerEditor]); +} +function useAutoCompleteLeafs({ + getDefaultFieldNames, + caller +} = {}) { + const { + schema + } = useSchemaContext({ + nonNull: true, + caller: caller || useAutoCompleteLeafs + }); + const { + queryEditor + } = useEditorContext({ + nonNull: true, + caller: caller || useAutoCompleteLeafs + }); + return React.useCallback(() => { + if (!queryEditor) { + return; + } + const query = queryEditor.getValue(); + const { + insertions, + result + } = toolkit.fillLeafs(schema, query, getDefaultFieldNames); + if (insertions && insertions.length > 0) { + queryEditor.operation(() => { + const cursor = queryEditor.getCursor(); + const cursorIndex = queryEditor.indexFromPos(cursor); + queryEditor.setValue(result || ""); + let added = 0; + const markers = insertions.map(({ + index, + string + }) => queryEditor.markText(queryEditor.posFromIndex(index + added), queryEditor.posFromIndex(index + (added += string.length)), { + className: "auto-inserted-leaf", + clearOnEnter: true, + title: "Automatically added leaf fields" + })); + setTimeout(() => { + for (const marker of markers) { + marker.clear(); + } + }, 7e3); + let newCursorIndex = cursorIndex; + for (const { + index, + string + } of insertions) { + if (index < cursorIndex) { + newCursorIndex += string.length; + } + } + queryEditor.setCursor(queryEditor.posFromIndex(newCursorIndex)); + }); + } + return result; + }, [getDefaultFieldNames, queryEditor, schema]); +} +const useEditorState = editor => { + var _ref2; + const context = useEditorContext({ + nonNull: true + }); + const editorInstance = context[`${editor}Editor`]; + let valueString = ""; + const editorValue = (_ref2 = editorInstance == null ? void 0 : editorInstance.getValue()) !== null && _ref2 !== void 0 ? _ref2 : false; + if (editorValue && editorValue.length > 0) { + valueString = editorValue; + } + const handleEditorValue = React.useCallback(value => editorInstance == null ? void 0 : editorInstance.setValue(value), [editorInstance]); + return React.useMemo(() => [valueString, handleEditorValue], [valueString, handleEditorValue]); +}; +const useOperationsEditorState = () => { + return useEditorState("query"); +}; +const useVariablesEditorState = () => { + return useEditorState("variable"); +}; +const useHeadersEditorState = () => { + return useEditorState("header"); +}; +function useOptimisticState([upstreamState, upstreamSetState]) { + const lastStateRef = React.useRef({ + /** The last thing that we sent upstream; we're expecting this back */ + pending: null, + /** The last thing we received from upstream */ + last: upstreamState + }); + const [state, setOperationsText] = React.useState(upstreamState); + React.useEffect(() => { + if (lastStateRef.current.last === upstreamState) ;else { + lastStateRef.current.last = upstreamState; + if (lastStateRef.current.pending === null) { + setOperationsText(upstreamState); + } else if (lastStateRef.current.pending === upstreamState) { + lastStateRef.current.pending = null; + if (upstreamState !== state) { + lastStateRef.current.pending = state; + upstreamSetState(state); } + } else { + lastStateRef.current.pending = null; + setOperationsText(upstreamState); + } + } + }, [upstreamState, state, upstreamSetState]); + const setState = React.useCallback(newState => { + setOperationsText(newState); + if (lastStateRef.current.pending === null && lastStateRef.current.last !== newState) { + lastStateRef.current.pending = newState; + upstreamSetState(newState); + } + }, [upstreamSetState]); + return React.useMemo(() => [state, setState], [state, setState]); +} +function useHeaderEditor({ + editorTheme = DEFAULT_EDITOR_THEME, + keyMap = DEFAULT_KEY_MAP, + onEdit, + readOnly = false +} = {}, caller) { + const { + initialHeaders, + headerEditor, + setHeaderEditor, + shouldPersistHeaders + } = useEditorContext({ + nonNull: true, + caller: caller || useHeaderEditor + }); + const executionContext = useExecutionContext(); + const merge = useMergeQuery({ + caller: caller || useHeaderEditor + }); + const prettify = usePrettifyEditors({ + caller: caller || useHeaderEditor + }); + const ref = React.useRef(null); + React.useEffect(() => { + let isActive = true; + void importCodeMirror([ + // @ts-expect-error + Promise.resolve().then(() => __webpack_require__(/*! ./javascript.cjs.js */ "../../graphiql-react/dist/javascript.cjs.js")).then(n => n.javascript)]).then(CodeMirror => { + if (!isActive) { + return; } - state.parentType = oldParentType; - if (terminate) { - // terminated by another block - return null; + const container = ref.current; + if (!container) { + return; } - } - const pos = state.bMarks[nextLine] + state.tShift[nextLine]; - const max = state.eMarks[nextLine]; - - // max + 1 explicitly includes the newline - return state.src.slice(pos, max + 1); - } - let str = state.src.slice(pos, max + 1); - max = str.length; - let labelEnd = -1; - for (pos = 1; pos < max; pos++) { - const ch = str.charCodeAt(pos); - if (ch === 0x5B /* [ */) { - return false; - } else if (ch === 0x5D /* ] */) { - labelEnd = pos; - break; - } else if (ch === 0x0A /* \n */) { - const lineContent = getNextLine(nextLine); - if (lineContent !== null) { - str += lineContent; - max = str.length; - nextLine++; + const newEditor = CodeMirror(container, { + value: initialHeaders, + lineNumbers: true, + tabSize: 2, + mode: { + name: "javascript", + json: true + }, + theme: editorTheme, + autoCloseBrackets: true, + matchBrackets: true, + showCursorWhenSelecting: true, + readOnly: readOnly ? "nocursor" : false, + foldGutter: true, + gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], + extraKeys: commonKeys + }); + newEditor.addKeyMap({ + "Cmd-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + }, + "Ctrl-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + }, + "Alt-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + }, + "Shift-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + } + }); + newEditor.on("keyup", (editorInstance, event) => { + const { + code, + key, + shiftKey + } = event; + const isLetter = code.startsWith("Key"); + const isNumber = !shiftKey && code.startsWith("Digit"); + if (isLetter || isNumber || key === "_" || key === '"') { + editorInstance.execCommand("autocomplete"); + } + }); + setHeaderEditor(newEditor); + }); + return () => { + isActive = false; + }; + }, [editorTheme, initialHeaders, readOnly, setHeaderEditor]); + useSynchronizeOption(headerEditor, "keyMap", keyMap); + useChangeHandler(headerEditor, onEdit, shouldPersistHeaders ? STORAGE_KEY$3 : null, "headers", useHeaderEditor); + useKeyMap(headerEditor, ["Cmd-Enter", "Ctrl-Enter"], executionContext == null ? void 0 : executionContext.run); + useKeyMap(headerEditor, ["Shift-Ctrl-P"], prettify); + useKeyMap(headerEditor, ["Shift-Ctrl-M"], merge); + return ref; +} +const STORAGE_KEY$3 = "headers"; +const invalidCharacters = Array.from({ + length: 11 +}, (_, i) => { + return String.fromCharCode(8192 + i); +}).concat(["\u2028", "\u2029", " ", " "]); +const sanitizeRegex = new RegExp("[" + invalidCharacters.join("") + "]", "g"); +function normalizeWhitespace(line) { + return line.replace(sanitizeRegex, " "); +} +function useQueryEditor({ + editorTheme = DEFAULT_EDITOR_THEME, + keyMap = DEFAULT_KEY_MAP, + onClickReference, + onCopyQuery, + onEdit, + readOnly = false +} = {}, caller) { + const { + schema + } = useSchemaContext({ + nonNull: true, + caller: caller || useQueryEditor + }); + const { + externalFragments, + initialQuery, + queryEditor, + setOperationName, + setQueryEditor, + validationRules, + variableEditor, + updateActiveTabValues + } = useEditorContext({ + nonNull: true, + caller: caller || useQueryEditor + }); + const executionContext = useExecutionContext(); + const storage = useStorageContext(); + const explorer = useExplorerContext(); + const plugin = usePluginContext(); + const copy = useCopyQuery({ + caller: caller || useQueryEditor, + onCopyQuery + }); + const merge = useMergeQuery({ + caller: caller || useQueryEditor + }); + const prettify = usePrettifyEditors({ + caller: caller || useQueryEditor + }); + const ref = React.useRef(null); + const codeMirrorRef = React.useRef(); + const onClickReferenceRef = React.useRef(() => {}); + React.useEffect(() => { + onClickReferenceRef.current = reference => { + if (!explorer || !plugin) { + return; } - } else if (ch === 0x5C /* \ */) { - pos++; - if (pos < max && str.charCodeAt(pos) === 0x0A) { - const lineContent = getNextLine(nextLine); - if (lineContent !== null) { - str += lineContent; - max = str.length; - nextLine++; + plugin.setVisiblePlugin(DOC_EXPLORER_PLUGIN); + switch (reference.kind) { + case "Type": + { + explorer.push({ + name: reference.type.name, + def: reference.type + }); + break; + } + case "Field": + { + explorer.push({ + name: reference.field.name, + def: reference.field + }); + break; + } + case "Argument": + { + if (reference.field) { + explorer.push({ + name: reference.field.name, + def: reference.field + }); + } + break; + } + case "EnumValue": + { + if (reference.type) { + explorer.push({ + name: reference.type.name, + def: reference.type + }); + } + break; + } + } + onClickReference == null ? void 0 : onClickReference(reference); + }; + }, [explorer, onClickReference, plugin]); + React.useEffect(() => { + let isActive = true; + void importCodeMirror([Promise.resolve().then(() => __webpack_require__(/*! ./comment.cjs.js */ "../../graphiql-react/dist/comment.cjs.js")).then(n => n.comment), Promise.resolve().then(() => __webpack_require__(/*! ./search.cjs.js */ "../../graphiql-react/dist/search.cjs.js")).then(n => n.search), Promise.resolve().then(() => __webpack_require__(/*! ./hint.cjs.js */ "../../graphiql-react/dist/hint.cjs.js")), Promise.resolve().then(() => __webpack_require__(/*! ./lint.cjs2.js */ "../../graphiql-react/dist/lint.cjs2.js")), Promise.resolve().then(() => __webpack_require__(/*! ./info.cjs.js */ "../../graphiql-react/dist/info.cjs.js")), Promise.resolve().then(() => __webpack_require__(/*! ./jump.cjs.js */ "../../graphiql-react/dist/jump.cjs.js")), Promise.resolve().then(() => __webpack_require__(/*! ./mode.cjs.js */ "../../graphiql-react/dist/mode.cjs.js"))]).then(CodeMirror => { + if (!isActive) { + return; + } + codeMirrorRef.current = CodeMirror; + const container = ref.current; + if (!container) { + return; + } + const newEditor = CodeMirror(container, { + value: initialQuery, + lineNumbers: true, + tabSize: 2, + foldGutter: true, + mode: "graphql", + theme: editorTheme, + autoCloseBrackets: true, + matchBrackets: true, + showCursorWhenSelecting: true, + readOnly: readOnly ? "nocursor" : false, + lint: { + // @ts-expect-error + schema: void 0, + validationRules: null, + // linting accepts string or FragmentDefinitionNode[] + externalFragments: void 0 + }, + hintOptions: { + // @ts-expect-error + schema: void 0, + closeOnUnfocus: false, + completeSingle: false, + container, + externalFragments: void 0, + autocompleteOptions: { + // for the query editor, restrict to executable type definitions + mode: graphqlLanguageService.GraphQLDocumentMode.EXECUTABLE + } + }, + info: { + schema: void 0, + renderDescription: text => markdown.render(text), + onClick(reference) { + onClickReferenceRef.current(reference); + } + }, + jump: { + schema: void 0, + onClick(reference) { + onClickReferenceRef.current(reference); + } + }, + gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], + extraKeys: { + ...commonKeys, + "Cmd-S"() {}, + "Ctrl-S"() {} + } + }); + newEditor.addKeyMap({ + "Cmd-Space"() { + newEditor.showHint({ + completeSingle: true, + container + }); + }, + "Ctrl-Space"() { + newEditor.showHint({ + completeSingle: true, + container + }); + }, + "Alt-Space"() { + newEditor.showHint({ + completeSingle: true, + container + }); + }, + "Shift-Space"() { + newEditor.showHint({ + completeSingle: true, + container + }); + }, + "Shift-Alt-Space"() { + newEditor.showHint({ + completeSingle: true, + container + }); } - } + }); + newEditor.on("keyup", (editorInstance, event) => { + if (AUTO_COMPLETE_AFTER_KEY.test(event.key)) { + editorInstance.execCommand("autocomplete"); + } + }); + let showingHints = false; + newEditor.on("startCompletion", () => { + showingHints = true; + }); + newEditor.on("endCompletion", () => { + showingHints = false; + }); + newEditor.on("keydown", (editorInstance, event) => { + if (event.key === "Escape" && showingHints) { + event.stopPropagation(); + } + }); + newEditor.on("beforeChange", (editorInstance, change) => { + var _a; + if (change.origin === "paste") { + const text = change.text.map(normalizeWhitespace); + (_a = change.update) == null ? void 0 : _a.call(change, change.from, change.to, text); + } + }); + newEditor.documentAST = null; + newEditor.operationName = null; + newEditor.operations = null; + newEditor.variableToType = null; + setQueryEditor(newEditor); + }); + return () => { + isActive = false; + }; + }, [editorTheme, initialQuery, readOnly, setQueryEditor]); + useSynchronizeOption(queryEditor, "keyMap", keyMap); + React.useEffect(() => { + if (!queryEditor) { + return; } - } - if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A /* : */) { - return false; - } - - // [label]: destination 'title' - // ^^^ skip optional whitespace here - for (pos = labelEnd + 2; pos < max; pos++) { - const ch = str.charCodeAt(pos); - if (ch === 0x0A) { - const lineContent = getNextLine(nextLine); - if (lineContent !== null) { - str += lineContent; - max = str.length; - nextLine++; + function getAndUpdateOperationFacts(editorInstance) { + var _editorInstance$opera, _editorInstance$opera2, _ref3, _ref4; + var _a; + const operationFacts = graphqlLanguageService.getOperationFacts(schema, editorInstance.getValue()); + const operationName = toolkit.getSelectedOperationName((_editorInstance$opera = editorInstance.operations) !== null && _editorInstance$opera !== void 0 ? _editorInstance$opera : void 0, (_editorInstance$opera2 = editorInstance.operationName) !== null && _editorInstance$opera2 !== void 0 ? _editorInstance$opera2 : void 0, operationFacts == null ? void 0 : operationFacts.operations); + editorInstance.documentAST = (_ref3 = operationFacts == null ? void 0 : operationFacts.documentAST) !== null && _ref3 !== void 0 ? _ref3 : null; + editorInstance.operationName = operationName !== null && operationName !== void 0 ? operationName : null; + editorInstance.operations = (_ref4 = operationFacts == null ? void 0 : operationFacts.operations) !== null && _ref4 !== void 0 ? _ref4 : null; + if (variableEditor) { + variableEditor.state.lint.linterOptions.variableToType = operationFacts == null ? void 0 : operationFacts.variableToType; + variableEditor.options.lint.variableToType = operationFacts == null ? void 0 : operationFacts.variableToType; + variableEditor.options.hintOptions.variableToType = operationFacts == null ? void 0 : operationFacts.variableToType; + (_a = codeMirrorRef.current) == null ? void 0 : _a.signal(variableEditor, "change", variableEditor); + } + return operationFacts ? { + ...operationFacts, + operationName + } : null; + } + const handleChange = debounce(100, editorInstance => { + var _ref5; + const query = editorInstance.getValue(); + storage == null ? void 0 : storage.set(STORAGE_KEY_QUERY, query); + const currentOperationName = editorInstance.operationName; + const operationFacts = getAndUpdateOperationFacts(editorInstance); + if ((operationFacts == null ? void 0 : operationFacts.operationName) !== void 0) { + storage == null ? void 0 : storage.set(STORAGE_KEY_OPERATION_NAME, operationFacts.operationName); } - } else if (isSpace(ch)) ;else { - break; + onEdit == null ? void 0 : onEdit(query, operationFacts == null ? void 0 : operationFacts.documentAST); + if ((operationFacts == null ? void 0 : operationFacts.operationName) && currentOperationName !== operationFacts.operationName) { + setOperationName(operationFacts.operationName); + } + updateActiveTabValues({ + query, + operationName: (_ref5 = operationFacts == null ? void 0 : operationFacts.operationName) !== null && _ref5 !== void 0 ? _ref5 : null + }); + }); + getAndUpdateOperationFacts(queryEditor); + queryEditor.on("change", handleChange); + return () => queryEditor.off("change", handleChange); + }, [onEdit, queryEditor, schema, setOperationName, storage, variableEditor, updateActiveTabValues]); + useSynchronizeSchema(queryEditor, schema !== null && schema !== void 0 ? schema : null, codeMirrorRef); + useSynchronizeValidationRules(queryEditor, validationRules !== null && validationRules !== void 0 ? validationRules : null, codeMirrorRef); + useSynchronizeExternalFragments(queryEditor, externalFragments, codeMirrorRef); + useCompletion(queryEditor, onClickReference || null, useQueryEditor); + const run = executionContext == null ? void 0 : executionContext.run; + const runAtCursor = React.useCallback(() => { + var _a; + if (!run || !queryEditor || !queryEditor.operations || !queryEditor.hasFocus()) { + run == null ? void 0 : run(); + return; } - } - - // [label]: destination 'title' - // ^^^^^^^^^^^ parse this - const destRes = state.md.helpers.parseLinkDestination(str, pos, max); - if (!destRes.ok) { - return false; - } - const href = state.md.normalizeLink(destRes.str); - if (!state.md.validateLink(href)) { - return false; - } - pos = destRes.pos; - - // save cursor state, we could require to rollback later - const destEndPos = pos; - const destEndLineNo = nextLine; - - // [label]: destination 'title' - // ^^^ skipping those spaces - const start = pos; - for (; pos < max; pos++) { - const ch = str.charCodeAt(pos); - if (ch === 0x0A) { - const lineContent = getNextLine(nextLine); - if (lineContent !== null) { - str += lineContent; - max = str.length; - nextLine++; + const cursorIndex = queryEditor.indexFromPos(queryEditor.getCursor()); + let operationName; + for (const operation of queryEditor.operations) { + if (operation.loc && operation.loc.start <= cursorIndex && operation.loc.end >= cursorIndex) { + operationName = (_a = operation.name) == null ? void 0 : _a.value; } - } else if (isSpace(ch)) ;else { - break; } - } - - // [label]: destination 'title' - // ^^^^^^^ parse this - let titleRes = state.md.helpers.parseLinkTitle(str, pos, max); - while (titleRes.can_continue) { - const lineContent = getNextLine(nextLine); - if (lineContent === null) break; - str += lineContent; - pos = max; - max = str.length; - nextLine++; - titleRes = state.md.helpers.parseLinkTitle(str, pos, max, titleRes); - } - let title; - if (pos < max && start !== pos && titleRes.ok) { - title = titleRes.str; - pos = titleRes.pos; - } else { - title = ''; - pos = destEndPos; - nextLine = destEndLineNo; - } - - // skip trailing spaces until the rest of the line - while (pos < max) { - const ch = str.charCodeAt(pos); - if (!isSpace(ch)) { - break; + if (operationName && operationName !== queryEditor.operationName) { + setOperationName(operationName); } - pos++; - } - if (pos < max && str.charCodeAt(pos) !== 0x0A) { - if (title) { - // garbage at the end of the line after title, - // but it could still be a valid reference if we roll back - title = ''; - pos = destEndPos; - nextLine = destEndLineNo; - while (pos < max) { - const ch = str.charCodeAt(pos); - if (!isSpace(ch)) { - break; + run(); + }, [queryEditor, run, setOperationName]); + useKeyMap(queryEditor, ["Cmd-Enter", "Ctrl-Enter"], runAtCursor); + useKeyMap(queryEditor, ["Shift-Ctrl-C"], copy); + useKeyMap(queryEditor, ["Shift-Ctrl-P", + // Shift-Ctrl-P is hard coded in Firefox for private browsing so adding an alternative to prettify + "Shift-Ctrl-F"], prettify); + useKeyMap(queryEditor, ["Shift-Ctrl-M"], merge); + return ref; +} +function useSynchronizeSchema(editor, schema, codeMirrorRef) { + React.useEffect(() => { + if (!editor) { + return; + } + const didChange = editor.options.lint.schema !== schema; + editor.state.lint.linterOptions.schema = schema; + editor.options.lint.schema = schema; + editor.options.hintOptions.schema = schema; + editor.options.info.schema = schema; + editor.options.jump.schema = schema; + if (didChange && codeMirrorRef.current) { + codeMirrorRef.current.signal(editor, "change", editor); + } + }, [editor, schema, codeMirrorRef]); +} +function useSynchronizeValidationRules(editor, validationRules, codeMirrorRef) { + React.useEffect(() => { + if (!editor) { + return; + } + const didChange = editor.options.lint.validationRules !== validationRules; + editor.state.lint.linterOptions.validationRules = validationRules; + editor.options.lint.validationRules = validationRules; + if (didChange && codeMirrorRef.current) { + codeMirrorRef.current.signal(editor, "change", editor); + } + }, [editor, validationRules, codeMirrorRef]); +} +function useSynchronizeExternalFragments(editor, externalFragments, codeMirrorRef) { + const externalFragmentList = React.useMemo(() => [...externalFragments.values()], [externalFragments]); + React.useEffect(() => { + if (!editor) { + return; + } + const didChange = editor.options.lint.externalFragments !== externalFragmentList; + editor.state.lint.linterOptions.externalFragments = externalFragmentList; + editor.options.lint.externalFragments = externalFragmentList; + editor.options.hintOptions.externalFragments = externalFragmentList; + if (didChange && codeMirrorRef.current) { + codeMirrorRef.current.signal(editor, "change", editor); + } + }, [editor, externalFragmentList, codeMirrorRef]); +} +const AUTO_COMPLETE_AFTER_KEY = /^[a-zA-Z0-9_@(]$/; +const STORAGE_KEY_QUERY = "query"; +const STORAGE_KEY_OPERATION_NAME = "operationName"; +function getDefaultTabState({ + defaultQuery, + defaultHeaders, + headers, + defaultTabs, + query, + variables, + storage, + shouldPersistHeaders +}) { + const storedState = storage == null ? void 0 : storage.get(STORAGE_KEY$2); + try { + if (!storedState) { + throw new Error("Storage for tabs is empty"); + } + const parsed = JSON.parse(storedState); + const headersForHash = shouldPersistHeaders ? headers : void 0; + if (isTabsState(parsed)) { + const expectedHash = hashFromTabContents({ + query, + variables, + headers: headersForHash + }); + let matchingTabIndex = -1; + for (let index = 0; index < parsed.tabs.length; index++) { + const tab = parsed.tabs[index]; + tab.hash = hashFromTabContents({ + query: tab.query, + variables: tab.variables, + headers: tab.headers + }); + if (tab.hash === expectedHash) { + matchingTabIndex = index; } - pos++; } + if (matchingTabIndex >= 0) { + parsed.activeTabIndex = matchingTabIndex; + } else { + const operationName = query ? fuzzyExtractOperationName(query) : null; + parsed.tabs.push({ + id: guid(), + hash: expectedHash, + title: operationName || DEFAULT_TITLE, + query, + variables, + headers, + operationName, + response: null + }); + parsed.activeTabIndex = parsed.tabs.length - 1; + } + return parsed; } - } - if (pos < max && str.charCodeAt(pos) !== 0x0A) { - // garbage at the end of the line - return false; - } - const label = normalizeReference(str.slice(1, labelEnd)); - if (!label) { - // CommonMark 0.20 disallows empty labels - return false; - } - - // Reference can not terminate anything. This check is for safety only. - /* istanbul ignore if */ - if (silent) { - return true; - } - if (typeof state.env.references === 'undefined') { - state.env.references = {}; - } - if (typeof state.env.references[label] === 'undefined') { - state.env.references[label] = { - title, - href + throw new Error("Storage for tabs is invalid"); + } catch { + return { + activeTabIndex: 0, + tabs: (defaultTabs || [{ + query: query !== null && query !== void 0 ? query : defaultQuery, + variables, + headers: headers !== null && headers !== void 0 ? headers : defaultHeaders + }]).map(createTab) }; } - state.line = nextLine; - return true; } +function isTabsState(obj) { + return obj && typeof obj === "object" && !Array.isArray(obj) && hasNumberKey(obj, "activeTabIndex") && "tabs" in obj && Array.isArray(obj.tabs) && obj.tabs.every(isTabState); +} +function isTabState(obj) { + return obj && typeof obj === "object" && !Array.isArray(obj) && hasStringKey(obj, "id") && hasStringKey(obj, "title") && hasStringOrNullKey(obj, "query") && hasStringOrNullKey(obj, "variables") && hasStringOrNullKey(obj, "headers") && hasStringOrNullKey(obj, "operationName") && hasStringOrNullKey(obj, "response"); +} +function hasNumberKey(obj, key) { + return key in obj && typeof obj[key] === "number"; +} +function hasStringKey(obj, key) { + return key in obj && typeof obj[key] === "string"; +} +function hasStringOrNullKey(obj, key) { + return key in obj && (typeof obj[key] === "string" || obj[key] === null); +} +function useSynchronizeActiveTabValues({ + queryEditor, + variableEditor, + headerEditor, + responseEditor +}) { + return React.useCallback(state => { + var _ref6, _ref7, _ref8, _ref9, _ref10; + const query = (_ref6 = queryEditor == null ? void 0 : queryEditor.getValue()) !== null && _ref6 !== void 0 ? _ref6 : null; + const variables = (_ref7 = variableEditor == null ? void 0 : variableEditor.getValue()) !== null && _ref7 !== void 0 ? _ref7 : null; + const headers = (_ref8 = headerEditor == null ? void 0 : headerEditor.getValue()) !== null && _ref8 !== void 0 ? _ref8 : null; + const operationName = (_ref9 = queryEditor == null ? void 0 : queryEditor.operationName) !== null && _ref9 !== void 0 ? _ref9 : null; + const response = (_ref10 = responseEditor == null ? void 0 : responseEditor.getValue()) !== null && _ref10 !== void 0 ? _ref10 : null; + return setPropertiesInActiveTab(state, { + query, + variables, + headers, + response, + operationName + }); + }, [queryEditor, variableEditor, headerEditor, responseEditor]); +} +function serializeTabState(tabState, shouldPersistHeaders = false) { + return JSON.stringify(tabState, (key, value) => key === "hash" || key === "response" || !shouldPersistHeaders && key === "headers" ? null : value); +} +function useStoreTabs({ + storage, + shouldPersistHeaders +}) { + const store = React.useMemo(() => debounce(500, value => { + storage == null ? void 0 : storage.set(STORAGE_KEY$2, value); + }), [storage]); + return React.useCallback(currentState => { + store(serializeTabState(currentState, shouldPersistHeaders)); + }, [shouldPersistHeaders, store]); +} +function useSetEditorValues({ + queryEditor, + variableEditor, + headerEditor, + responseEditor, + defaultHeaders +}) { + return React.useCallback(({ + query, + variables, + headers, + response + }) => { + var _ref11; + queryEditor == null ? void 0 : queryEditor.setValue(query !== null && query !== void 0 ? query : ""); + variableEditor == null ? void 0 : variableEditor.setValue(variables !== null && variables !== void 0 ? variables : ""); + headerEditor == null ? void 0 : headerEditor.setValue((_ref11 = headers !== null && headers !== void 0 ? headers : defaultHeaders) !== null && _ref11 !== void 0 ? _ref11 : ""); + responseEditor == null ? void 0 : responseEditor.setValue(response !== null && response !== void 0 ? response : ""); + }, [headerEditor, queryEditor, responseEditor, variableEditor, defaultHeaders]); +} +function createTab({ + query = null, + variables = null, + headers = null +} = {}) { + return { + id: guid(), + hash: hashFromTabContents({ + query, + variables, + headers + }), + title: query && fuzzyExtractOperationName(query) || DEFAULT_TITLE, + query, + variables, + headers, + operationName: null, + response: null + }; +} +function setPropertiesInActiveTab(state, partialTab) { + return { + ...state, + tabs: state.tabs.map((tab, index) => { + if (index !== state.activeTabIndex) { + return tab; + } + const newTab = { + ...tab, + ...partialTab + }; + return { + ...newTab, + hash: hashFromTabContents(newTab), + title: newTab.operationName || (newTab.query ? fuzzyExtractOperationName(newTab.query) : void 0) || DEFAULT_TITLE + }; + }) + }; +} +function guid() { + const s4 = () => { + return Math.floor((1 + Math.random()) * 65536).toString(16).slice(1); + }; + return `${s4()}${s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`; +} +function hashFromTabContents(args) { + var _args$query, _args$variables, _args$headers; + return [(_args$query = args.query) !== null && _args$query !== void 0 ? _args$query : "", (_args$variables = args.variables) !== null && _args$variables !== void 0 ? _args$variables : "", (_args$headers = args.headers) !== null && _args$headers !== void 0 ? _args$headers : ""].join("|"); +} +function fuzzyExtractOperationName(str) { + var _ref12; + const regex = /^(?!#).*(query|subscription|mutation)\s+([a-zA-Z0-9_]+)/m; + const match = regex.exec(str); + return (_ref12 = match == null ? void 0 : match[2]) !== null && _ref12 !== void 0 ? _ref12 : null; +} +function clearHeadersFromTabs(storage) { + const persistedTabs = storage == null ? void 0 : storage.get(STORAGE_KEY$2); + if (persistedTabs) { + const parsedTabs = JSON.parse(persistedTabs); + storage == null ? void 0 : storage.set(STORAGE_KEY$2, JSON.stringify(parsedTabs, (key, value) => key === "headers" ? null : value)); + } +} +const DEFAULT_TITLE = ""; +const STORAGE_KEY$2 = "tabState"; +function useVariableEditor({ + editorTheme = DEFAULT_EDITOR_THEME, + keyMap = DEFAULT_KEY_MAP, + onClickReference, + onEdit, + readOnly = false +} = {}, caller) { + const { + initialVariables, + variableEditor, + setVariableEditor + } = useEditorContext({ + nonNull: true, + caller: caller || useVariableEditor + }); + const executionContext = useExecutionContext(); + const merge = useMergeQuery({ + caller: caller || useVariableEditor + }); + const prettify = usePrettifyEditors({ + caller: caller || useVariableEditor + }); + const ref = React.useRef(null); + const codeMirrorRef = React.useRef(); + React.useEffect(() => { + let isActive = true; + void importCodeMirror([Promise.resolve().then(() => __webpack_require__(/*! ./hint.cjs2.js */ "../../graphiql-react/dist/hint.cjs2.js")), Promise.resolve().then(() => __webpack_require__(/*! ./lint.cjs3.js */ "../../graphiql-react/dist/lint.cjs3.js")), Promise.resolve().then(() => __webpack_require__(/*! ./mode.cjs2.js */ "../../graphiql-react/dist/mode.cjs2.js"))]).then(CodeMirror => { + if (!isActive) { + return; + } + codeMirrorRef.current = CodeMirror; + const container = ref.current; + if (!container) { + return; + } + const newEditor = CodeMirror(container, { + value: initialVariables, + lineNumbers: true, + tabSize: 2, + mode: "graphql-variables", + theme: editorTheme, + autoCloseBrackets: true, + matchBrackets: true, + showCursorWhenSelecting: true, + readOnly: readOnly ? "nocursor" : false, + foldGutter: true, + lint: { + // @ts-expect-error + variableToType: void 0 + }, + hintOptions: { + closeOnUnfocus: false, + completeSingle: false, + container, + // @ts-expect-error + variableToType: void 0 + }, + gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], + extraKeys: commonKeys + }); + newEditor.addKeyMap({ + "Cmd-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + }, + "Ctrl-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + }, + "Alt-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + }, + "Shift-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + } + }); + newEditor.on("keyup", (editorInstance, event) => { + const { + code, + key, + shiftKey + } = event; + const isLetter = code.startsWith("Key"); + const isNumber = !shiftKey && code.startsWith("Digit"); + if (isLetter || isNumber || key === "_" || key === '"') { + editorInstance.execCommand("autocomplete"); + } + }); + setVariableEditor(newEditor); + }); + return () => { + isActive = false; + }; + }, [editorTheme, initialVariables, readOnly, setVariableEditor]); + useSynchronizeOption(variableEditor, "keyMap", keyMap); + useChangeHandler(variableEditor, onEdit, STORAGE_KEY$1, "variables", useVariableEditor); + useCompletion(variableEditor, onClickReference || null, useVariableEditor); + useKeyMap(variableEditor, ["Cmd-Enter", "Ctrl-Enter"], executionContext == null ? void 0 : executionContext.run); + useKeyMap(variableEditor, ["Shift-Ctrl-P"], prettify); + useKeyMap(variableEditor, ["Shift-Ctrl-M"], merge); + return ref; +} +const STORAGE_KEY$1 = "variables"; +const EditorContext = createNullableContext("EditorContext"); +function EditorContextProvider(props) { + const storage = useStorageContext(); + const [headerEditor, setHeaderEditor] = React.useState(null); + const [queryEditor, setQueryEditor] = React.useState(null); + const [responseEditor, setResponseEditor] = React.useState(null); + const [variableEditor, setVariableEditor] = React.useState(null); + const [shouldPersistHeaders, setShouldPersistHeadersInternal] = React.useState(() => { + const isStored = (storage == null ? void 0 : storage.get(PERSIST_HEADERS_STORAGE_KEY)) !== null; + return props.shouldPersistHeaders !== false && isStored ? (storage == null ? void 0 : storage.get(PERSIST_HEADERS_STORAGE_KEY)) === "true" : Boolean(props.shouldPersistHeaders); + }); + useSynchronizeValue(headerEditor, props.headers); + useSynchronizeValue(queryEditor, props.query); + useSynchronizeValue(responseEditor, props.response); + useSynchronizeValue(variableEditor, props.variables); + const storeTabs = useStoreTabs({ + storage, + shouldPersistHeaders + }); + const [initialState] = React.useState(() => { + var _ref13, _props$query, _ref14, _props$variables, _ref15, _props$headers, _props$response, _ref16, _ref17; + const query = (_ref13 = (_props$query = props.query) !== null && _props$query !== void 0 ? _props$query : storage == null ? void 0 : storage.get(STORAGE_KEY_QUERY)) !== null && _ref13 !== void 0 ? _ref13 : null; + const variables = (_ref14 = (_props$variables = props.variables) !== null && _props$variables !== void 0 ? _props$variables : storage == null ? void 0 : storage.get(STORAGE_KEY$1)) !== null && _ref14 !== void 0 ? _ref14 : null; + const headers = (_ref15 = (_props$headers = props.headers) !== null && _props$headers !== void 0 ? _props$headers : storage == null ? void 0 : storage.get(STORAGE_KEY$3)) !== null && _ref15 !== void 0 ? _ref15 : null; + const response = (_props$response = props.response) !== null && _props$response !== void 0 ? _props$response : ""; + const tabState2 = getDefaultTabState({ + query, + variables, + headers, + defaultTabs: props.defaultTabs, + defaultQuery: props.defaultQuery || DEFAULT_QUERY, + defaultHeaders: props.defaultHeaders, + storage, + shouldPersistHeaders + }); + storeTabs(tabState2); + return { + query: (_ref16 = query !== null && query !== void 0 ? query : tabState2.activeTabIndex === 0 ? tabState2.tabs[0].query : null) !== null && _ref16 !== void 0 ? _ref16 : "", + variables: variables !== null && variables !== void 0 ? variables : "", + headers: (_ref17 = headers !== null && headers !== void 0 ? headers : props.defaultHeaders) !== null && _ref17 !== void 0 ? _ref17 : "", + response, + tabState: tabState2 + }; + }); + const [tabState, setTabState] = React.useState(initialState.tabState); + const setShouldPersistHeaders = React.useCallback(persist => { + if (persist) { + var _ref18; + storage == null ? void 0 : storage.set(STORAGE_KEY$3, (_ref18 = headerEditor == null ? void 0 : headerEditor.getValue()) !== null && _ref18 !== void 0 ? _ref18 : ""); + const serializedTabs = serializeTabState(tabState, true); + storage == null ? void 0 : storage.set(STORAGE_KEY$2, serializedTabs); + } else { + storage == null ? void 0 : storage.set(STORAGE_KEY$3, ""); + clearHeadersFromTabs(storage); + } + setShouldPersistHeadersInternal(persist); + storage == null ? void 0 : storage.set(PERSIST_HEADERS_STORAGE_KEY, persist.toString()); + }, [storage, tabState, headerEditor]); + const lastShouldPersistHeadersProp = React.useRef(); + React.useEffect(() => { + const propValue = Boolean(props.shouldPersistHeaders); + if ((lastShouldPersistHeadersProp == null ? void 0 : lastShouldPersistHeadersProp.current) !== propValue) { + setShouldPersistHeaders(propValue); + lastShouldPersistHeadersProp.current = propValue; + } + }, [props.shouldPersistHeaders, setShouldPersistHeaders]); + const synchronizeActiveTabValues = useSynchronizeActiveTabValues({ + queryEditor, + variableEditor, + headerEditor, + responseEditor + }); + const { + onTabChange, + defaultHeaders, + defaultQuery, + children + } = props; + const setEditorValues = useSetEditorValues({ + queryEditor, + variableEditor, + headerEditor, + responseEditor, + defaultHeaders + }); + const addTab = React.useCallback(() => { + setTabState(current => { + const updatedValues = synchronizeActiveTabValues(current); + const updated = { + tabs: [...updatedValues.tabs, createTab({ + headers: defaultHeaders, + query: defaultQuery !== null && defaultQuery !== void 0 ? defaultQuery : DEFAULT_QUERY + })], + activeTabIndex: updatedValues.tabs.length + }; + storeTabs(updated); + setEditorValues(updated.tabs[updated.activeTabIndex]); + onTabChange == null ? void 0 : onTabChange(updated); + return updated; + }); + }, [defaultHeaders, defaultQuery, onTabChange, setEditorValues, storeTabs, synchronizeActiveTabValues]); + const changeTab = React.useCallback(index => { + setTabState(current => { + const updated = { + ...current, + activeTabIndex: index + }; + storeTabs(updated); + setEditorValues(updated.tabs[updated.activeTabIndex]); + onTabChange == null ? void 0 : onTabChange(updated); + return updated; + }); + }, [onTabChange, setEditorValues, storeTabs]); + const moveTab = React.useCallback(newOrder => { + setTabState(current => { + const activeTab = current.tabs[current.activeTabIndex]; + const updated = { + tabs: newOrder, + activeTabIndex: newOrder.indexOf(activeTab) + }; + storeTabs(updated); + setEditorValues(updated.tabs[updated.activeTabIndex]); + onTabChange == null ? void 0 : onTabChange(updated); + return updated; + }); + }, [onTabChange, setEditorValues, storeTabs]); + const closeTab = React.useCallback(index => { + setTabState(current => { + const updated = { + tabs: current.tabs.filter((_tab, i) => index !== i), + activeTabIndex: Math.max(current.activeTabIndex - 1, 0) + }; + storeTabs(updated); + setEditorValues(updated.tabs[updated.activeTabIndex]); + onTabChange == null ? void 0 : onTabChange(updated); + return updated; + }); + }, [onTabChange, setEditorValues, storeTabs]); + const updateActiveTabValues = React.useCallback(partialTab => { + setTabState(current => { + const updated = setPropertiesInActiveTab(current, partialTab); + storeTabs(updated); + onTabChange == null ? void 0 : onTabChange(updated); + return updated; + }); + }, [onTabChange, storeTabs]); + const { + onEditOperationName + } = props; + const setOperationName = React.useCallback(operationName => { + if (!queryEditor) { + return; + } + queryEditor.operationName = operationName; + updateActiveTabValues({ + operationName + }); + onEditOperationName == null ? void 0 : onEditOperationName(operationName); + }, [onEditOperationName, queryEditor, updateActiveTabValues]); + const externalFragments = React.useMemo(() => { + const map = /* @__PURE__ */new Map(); + if (Array.isArray(props.externalFragments)) { + for (const fragment of props.externalFragments) { + map.set(fragment.name.value, fragment); + } + } else if (typeof props.externalFragments === "string") { + graphql.visit(graphql.parse(props.externalFragments, {}), { + FragmentDefinition(fragment) { + map.set(fragment.name.value, fragment); + } + }); + } else if (props.externalFragments) { + throw new Error("The `externalFragments` prop must either be a string that contains the fragment definitions in SDL or a list of FragmentDefinitionNode objects."); + } + return map; + }, [props.externalFragments]); + const validationRules = React.useMemo(() => props.validationRules || [], [props.validationRules]); + const value = React.useMemo(() => ({ + ...tabState, + addTab, + changeTab, + moveTab, + closeTab, + updateActiveTabValues, + headerEditor, + queryEditor, + responseEditor, + variableEditor, + setHeaderEditor, + setQueryEditor, + setResponseEditor, + setVariableEditor, + setOperationName, + initialQuery: initialState.query, + initialVariables: initialState.variables, + initialHeaders: initialState.headers, + initialResponse: initialState.response, + externalFragments, + validationRules, + shouldPersistHeaders, + setShouldPersistHeaders + }), [tabState, addTab, changeTab, moveTab, closeTab, updateActiveTabValues, headerEditor, queryEditor, responseEditor, variableEditor, setOperationName, initialState, externalFragments, validationRules, shouldPersistHeaders, setShouldPersistHeaders]); + return /* @__PURE__ */jsxRuntime.jsx(EditorContext.Provider, { + value, + children + }); +} +const useEditorContext = createContextHook(EditorContext); +const PERSIST_HEADERS_STORAGE_KEY = "shouldPersistHeaders"; +const DEFAULT_QUERY = `# Welcome to GraphiQL +# +# GraphiQL is an in-browser tool for writing, validating, and +# testing GraphQL queries. +# +# Type queries into this side of the screen, and you will see intelligent +# typeaheads aware of the current GraphQL type schema and live syntax and +# validation errors highlighted within the text. +# +# GraphQL queries typically start with a "{" character. Lines that start +# with a # are ignored. +# +# An example GraphQL query might look like: +# +# { +# field(arg: "value") { +# subField +# } +# } +# +# Keyboard shortcuts: +# +# Prettify query: Shift-Ctrl-P (or press the prettify button) +# +# Merge fragments: Shift-Ctrl-M (or press the merge button) +# +# Run Query: Ctrl-Enter (or press the play button) +# +# Auto Complete: Ctrl-Space (or just start typing) +# -// List of valid html blocks names, according to commonmark spec -// https://spec.commonmark.org/0.30/#html-blocks - -var block_names = ['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', 'search', 'section', 'summary', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul']; - -// Regexps to match html elements - -const attr_name = '[a-zA-Z_:][a-zA-Z0-9:._-]*'; -const unquoted = '[^"\'=<>`\\x00-\\x20]+'; -const single_quoted = "'[^']*'"; -const double_quoted = '"[^"]*"'; -const attr_value = '(?:' + unquoted + '|' + single_quoted + '|' + double_quoted + ')'; -const attribute = '(?:\\s+' + attr_name + '(?:\\s*=\\s*' + attr_value + ')?)'; -const open_tag = '<[A-Za-z][A-Za-z0-9\\-]*' + attribute + '*\\s*\\/?>'; -const close_tag = '<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>'; -const comment = ''; -const processing = '<[?][\\s\\S]*?[?]>'; -const declaration = ']*>'; -const cdata = ''; -const HTML_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + '|' + comment + '|' + processing + '|' + declaration + '|' + cdata + ')'); -const HTML_OPEN_CLOSE_TAG_RE = new RegExp('^(?:' + open_tag + '|' + close_tag + ')'); - -// HTML block - -// An array of opening and corresponding closing sequences for html tags, -// last argument defines whether it can terminate a paragraph or not -// -const HTML_SEQUENCES = [[/^<(script|pre|style|textarea)(?=(\s|>|$))/i, /<\/(script|pre|style|textarea)>/i, true], [/^/, true], [/^<\?/, /\?>/, true], [/^/, true], [/^/, true], [new RegExp('^|$))', 'i'), /^$/, true], [new RegExp(HTML_OPEN_CLOSE_TAG_RE.source + '\\s*$'), /^$/, false]]; -function html_block(state, startLine, endLine, silent) { - let pos = state.bMarks[startLine] + state.tShift[startLine]; - let max = state.eMarks[startLine]; - - // if it's indented more than 3 spaces, it should be a code block - if (state.sCount[startLine] - state.blkIndent >= 4) { - return false; - } - if (!state.md.options.html) { - return false; - } - if (state.src.charCodeAt(pos) !== 0x3C /* < */) { - return false; - } - let lineText = state.src.slice(pos, max); - let i = 0; - for (; i < HTML_SEQUENCES.length; i++) { - if (HTML_SEQUENCES[i][0].test(lineText)) { - break; +`; +function HeaderEditor({ + isHidden, + ...hookArgs +}) { + const { + headerEditor + } = useEditorContext({ + nonNull: true, + caller: HeaderEditor + }); + const ref = useHeaderEditor(hookArgs, HeaderEditor); + React.useEffect(() => { + if (!isHidden) { + headerEditor == null ? void 0 : headerEditor.refresh(); + } + }, [headerEditor, isHidden]); + return /* @__PURE__ */jsxRuntime.jsx("div", { + className: clsx.clsx("graphiql-editor", isHidden && "hidden"), + ref + }); +} +function ImagePreview(props) { + var _a; + const [dimensions, setDimensions] = React.useState({ + width: null, + height: null + }); + const [mime, setMime] = React.useState(null); + const ref = React.useRef(null); + const src = (_a = tokenToURL(props.token)) == null ? void 0 : _a.href; + React.useEffect(() => { + if (!ref.current) { + return; } + if (!src) { + setDimensions({ + width: null, + height: null + }); + setMime(null); + return; + } + fetch(src, { + method: "HEAD" + }).then(response => { + setMime(response.headers.get("Content-Type")); + }).catch(() => { + setMime(null); + }); + }, [src]); + const dims = dimensions.width !== null && dimensions.height !== null ? /* @__PURE__ */jsxRuntime.jsxs("div", { + children: [dimensions.width, "x", dimensions.height, mime === null ? null : " " + mime] + }) : null; + return /* @__PURE__ */jsxRuntime.jsxs("div", { + children: [/* @__PURE__ */jsxRuntime.jsx("img", { + onLoad: () => { + var _ref19, _ref20; + var _a2, _b; + setDimensions({ + width: (_ref19 = (_a2 = ref.current) == null ? void 0 : _a2.naturalWidth) !== null && _ref19 !== void 0 ? _ref19 : null, + height: (_ref20 = (_b = ref.current) == null ? void 0 : _b.naturalHeight) !== null && _ref20 !== void 0 ? _ref20 : null + }); + }, + ref, + src + }), dims] + }); +} +ImagePreview.shouldRender = function shouldRender(token) { + const url = tokenToURL(token); + return url ? isImageURL(url) : false; +}; +function tokenToURL(token) { + if (token.type !== "string") { + return; } - if (i === HTML_SEQUENCES.length) { - return false; - } - if (silent) { - // true if this sequence can be a terminator, false otherwise - return HTML_SEQUENCES[i][2]; + const value = token.string.slice(1).slice(0, -1).trim(); + try { + const { + location + } = window; + return new URL(value, location.protocol + "//" + location.host); + } catch { + return; } - let nextLine = startLine + 1; - - // If we are here - we detected HTML block. - // Let's roll down till block end. - if (!HTML_SEQUENCES[i][1].test(lineText)) { - for (; nextLine < endLine; nextLine++) { - if (state.sCount[nextLine] < state.blkIndent) { - break; +} +function isImageURL(url) { + return /\.(bmp|gif|jpe?g|png|svg|webp)$/.test(url.pathname); +} +function QueryEditor(props) { + const ref = useQueryEditor(props, QueryEditor); + return /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-editor", + ref + }); +} +function useResponseEditor({ + responseTooltip, + editorTheme = DEFAULT_EDITOR_THEME, + keyMap = DEFAULT_KEY_MAP +} = {}, caller) { + const { + fetchError, + validationErrors + } = useSchemaContext({ + nonNull: true, + caller: caller || useResponseEditor + }); + const { + initialResponse, + responseEditor, + setResponseEditor + } = useEditorContext({ + nonNull: true, + caller: caller || useResponseEditor + }); + const ref = React.useRef(null); + const responseTooltipRef = React.useRef(responseTooltip); + React.useEffect(() => { + responseTooltipRef.current = responseTooltip; + }, [responseTooltip]); + React.useEffect(() => { + let isActive = true; + void importCodeMirror([Promise.resolve().then(() => __webpack_require__(/*! ./foldgutter.cjs.js */ "../../graphiql-react/dist/foldgutter.cjs.js")).then(n => n.foldgutter), Promise.resolve().then(() => __webpack_require__(/*! ./brace-fold.cjs.js */ "../../graphiql-react/dist/brace-fold.cjs.js")).then(n => n.braceFold), Promise.resolve().then(() => __webpack_require__(/*! ./dialog.cjs.js */ "../../graphiql-react/dist/dialog.cjs.js")).then(n => n.dialog), Promise.resolve().then(() => __webpack_require__(/*! ./search.cjs.js */ "../../graphiql-react/dist/search.cjs.js")).then(n => n.search), Promise.resolve().then(() => __webpack_require__(/*! ./searchcursor.cjs.js */ "../../graphiql-react/dist/searchcursor.cjs.js")).then(n => n.searchcursor), Promise.resolve().then(() => __webpack_require__(/*! ./jump-to-line.cjs.js */ "../../graphiql-react/dist/jump-to-line.cjs.js")).then(n => n.jumpToLine), + // @ts-expect-error + Promise.resolve().then(() => __webpack_require__(/*! ./sublime.cjs.js */ "../../graphiql-react/dist/sublime.cjs.js")).then(n => n.sublime), Promise.resolve().then(() => __webpack_require__(/*! ./mode.cjs3.js */ "../../graphiql-react/dist/mode.cjs3.js")), Promise.resolve().then(() => __webpack_require__(/*! ./info-addon.cjs.js */ "../../graphiql-react/dist/info-addon.cjs.js"))], { + useCommonAddons: false + }).then(CodeMirror => { + if (!isActive) { + return; } - pos = state.bMarks[nextLine] + state.tShift[nextLine]; - max = state.eMarks[nextLine]; - lineText = state.src.slice(pos, max); - if (HTML_SEQUENCES[i][1].test(lineText)) { - if (lineText.length !== 0) { - nextLine++; + const tooltipDiv = document.createElement("div"); + CodeMirror.registerHelper("info", "graphql-results", (token, _options, _cm, pos) => { + const infoElements = []; + const ResponseTooltipComponent = responseTooltipRef.current; + if (ResponseTooltipComponent) { + infoElements.push( /* @__PURE__ */jsxRuntime.jsx(ResponseTooltipComponent, { + pos, + token + })); } - break; + if (ImagePreview.shouldRender(token)) { + infoElements.push( /* @__PURE__ */jsxRuntime.jsx(ImagePreview, { + token + }, "image-preview")); + } + if (!infoElements.length) { + ReactDOM.unmountComponentAtNode(tooltipDiv); + return null; + } + ReactDOM.render(infoElements, tooltipDiv); + return tooltipDiv; + }); + const container = ref.current; + if (!container) { + return; } + const newEditor = CodeMirror(container, { + value: initialResponse, + lineWrapping: true, + readOnly: true, + theme: editorTheme, + mode: "graphql-results", + foldGutter: true, + gutters: ["CodeMirror-foldgutter"], + // @ts-expect-error + info: true, + extraKeys: commonKeys + }); + setResponseEditor(newEditor); + }); + return () => { + isActive = false; + }; + }, [editorTheme, initialResponse, setResponseEditor]); + useSynchronizeOption(responseEditor, "keyMap", keyMap); + React.useEffect(() => { + if (fetchError) { + responseEditor == null ? void 0 : responseEditor.setValue(fetchError); } - } - state.line = nextLine; - const token = state.push('html_block', '', 0); - token.map = [startLine, nextLine]; - token.content = state.getLines(startLine, nextLine, state.blkIndent, true); - return true; + if (validationErrors.length > 0) { + responseEditor == null ? void 0 : responseEditor.setValue(toolkit.formatError(validationErrors)); + } + }, [responseEditor, fetchError, validationErrors]); + return ref; } - -// heading (#, ##, ...) - -function heading(state, startLine, endLine, silent) { - let pos = state.bMarks[startLine] + state.tShift[startLine]; - let max = state.eMarks[startLine]; - - // if it's indented more than 3 spaces, it should be a code block - if (state.sCount[startLine] - state.blkIndent >= 4) { - return false; - } - let ch = state.src.charCodeAt(pos); - if (ch !== 0x23 /* # */ || pos >= max) { - return false; - } - - // count heading level - let level = 1; - ch = state.src.charCodeAt(++pos); - while (ch === 0x23 /* # */ && pos < max && level <= 6) { - level++; - ch = state.src.charCodeAt(++pos); - } - if (level > 6 || pos < max && !isSpace(ch)) { - return false; - } - if (silent) { - return true; - } - - // Let's cut tails like ' ### ' from the end of string - - max = state.skipSpacesBack(max, pos); - const tmp = state.skipCharsBack(max, 0x23, pos); // # - if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1))) { - max = tmp; - } - state.line = startLine + 1; - const token_o = state.push('heading_open', 'h' + String(level), 1); - token_o.markup = '########'.slice(0, level); - token_o.map = [startLine, state.line]; - const token_i = state.push('inline', '', 0); - token_i.content = state.src.slice(pos, max).trim(); - token_i.map = [startLine, state.line]; - token_i.children = []; - const token_c = state.push('heading_close', 'h' + String(level), -1); - token_c.markup = '########'.slice(0, level); - return true; +function ResponseEditor(props) { + const ref = useResponseEditor(props, ResponseEditor); + return /* @__PURE__ */jsxRuntime.jsx("section", { + className: "result-window", + "aria-label": "Result Window", + "aria-live": "polite", + "aria-atomic": "true", + ref + }); +} +function VariableEditor({ + isHidden, + ...hookArgs +}) { + const { + variableEditor + } = useEditorContext({ + nonNull: true, + caller: VariableEditor + }); + const ref = useVariableEditor(hookArgs, VariableEditor); + React.useEffect(() => { + if (variableEditor && !isHidden) { + variableEditor.refresh(); + } + }, [variableEditor, isHidden]); + return /* @__PURE__ */jsxRuntime.jsx("div", { + className: clsx.clsx("graphiql-editor", isHidden && "hidden"), + ref + }); +} +function GraphiQLProvider({ + children, + dangerouslyAssumeSchemaIsValid, + defaultQuery, + defaultHeaders, + defaultTabs, + externalFragments, + fetcher, + getDefaultFieldNames, + headers, + inputValueDeprecation, + introspectionQueryName, + maxHistoryLength, + onEditOperationName, + onSchemaChange, + onTabChange, + onTogglePluginVisibility, + operationName, + plugins, + query, + response, + schema, + schemaDescription, + shouldPersistHeaders, + storage, + validationRules, + variables, + visiblePlugin +}) { + return /* @__PURE__ */jsxRuntime.jsx(StorageContextProvider, { + storage, + children: /* @__PURE__ */jsxRuntime.jsx(HistoryContextProvider, { + maxHistoryLength, + children: /* @__PURE__ */jsxRuntime.jsx(EditorContextProvider, { + defaultQuery, + defaultHeaders, + defaultTabs, + externalFragments, + headers, + onEditOperationName, + onTabChange, + query, + response, + shouldPersistHeaders, + validationRules, + variables, + children: /* @__PURE__ */jsxRuntime.jsx(SchemaContextProvider, { + dangerouslyAssumeSchemaIsValid, + fetcher, + inputValueDeprecation, + introspectionQueryName, + onSchemaChange, + schema, + schemaDescription, + children: /* @__PURE__ */jsxRuntime.jsx(ExecutionContextProvider, { + getDefaultFieldNames, + fetcher, + operationName, + children: /* @__PURE__ */jsxRuntime.jsx(ExplorerContextProvider, { + children: /* @__PURE__ */jsxRuntime.jsx(PluginContextProvider, { + onTogglePluginVisibility, + plugins, + visiblePlugin, + children + }) + }) + }) + }) + }) + }) + }); } - -// lheading (---, ===) - -function lheading(state, startLine, endLine /*, silent */) { - const terminatorRules = state.md.block.ruler.getRules('paragraph'); - - // if it's indented more than 3 spaces, it should be a code block - if (state.sCount[startLine] - state.blkIndent >= 4) { - return false; - } - const oldParentType = state.parentType; - state.parentType = 'paragraph'; // use paragraph to match terminatorRules - - // jump line-by-line until empty one or EOF - let level = 0; - let marker; - let nextLine = startLine + 1; - for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) { - // this would be a code block normally, but after paragraph - // it's considered a lazy continuation regardless of what's there - if (state.sCount[nextLine] - state.blkIndent > 3) { - continue; +function useTheme(defaultTheme = null) { + const storageContext = useStorageContext(); + const [theme, setThemeInternal] = React.useState(() => { + if (!storageContext) { + return null; } - - // - // Check for underline in setext header - // - if (state.sCount[nextLine] >= state.blkIndent) { - let pos = state.bMarks[nextLine] + state.tShift[nextLine]; - const max = state.eMarks[nextLine]; - if (pos < max) { - marker = state.src.charCodeAt(pos); - if (marker === 0x2D /* - */ || marker === 0x3D /* = */) { - pos = state.skipChars(pos, marker); - pos = state.skipSpaces(pos); - if (pos >= max) { - level = marker === 0x3D /* = */ ? 1 : 2; - break; - } + const stored = storageContext.get(STORAGE_KEY); + switch (stored) { + case "light": + return "light"; + case "dark": + return "dark"; + default: + if (typeof stored === "string") { + storageContext.set(STORAGE_KEY, ""); } - } + return defaultTheme; } - - // quirk for blockquotes, this line should already be checked by that rule - if (state.sCount[nextLine] < 0) { - continue; + }); + React.useLayoutEffect(() => { + if (typeof window === "undefined") { + return; } - - // Some tags can terminate paragraph without empty line. - let terminate = false; - for (let i = 0, l = terminatorRules.length; i < l; i++) { - if (terminatorRules[i](state, nextLine, endLine, true)) { - terminate = true; - break; - } + document.body.classList.remove("graphiql-light", "graphiql-dark"); + if (theme) { + document.body.classList.add(`graphiql-${theme}`); } - if (terminate) { - break; + }, [theme]); + const setTheme = React.useCallback(newTheme => { + storageContext == null ? void 0 : storageContext.set(STORAGE_KEY, newTheme || ""); + setThemeInternal(newTheme); + }, [storageContext]); + return React.useMemo(() => ({ + theme, + setTheme + }), [theme, setTheme]); +} +const STORAGE_KEY = "theme"; +function useDragResize({ + defaultSizeRelation = DEFAULT_FLEX, + direction, + initiallyHidden, + onHiddenElementChange, + sizeThresholdFirst = 100, + sizeThresholdSecond = 100, + storageKey +}) { + const storage = useStorageContext(); + const store = React.useMemo(() => debounce(500, value => { + if (storageKey) { + storage == null ? void 0 : storage.set(storageKey, value); } - } - if (!level) { - // Didn't find valid underline - return false; - } - const content = state.getLines(startLine, nextLine, state.blkIndent, false).trim(); - state.line = nextLine + 1; - const token_o = state.push('heading_open', 'h' + String(level), 1); - token_o.markup = String.fromCharCode(marker); - token_o.map = [startLine, state.line]; - const token_i = state.push('inline', '', 0); - token_i.content = content; - token_i.map = [startLine, state.line - 1]; - token_i.children = []; - const token_c = state.push('heading_close', 'h' + String(level), -1); - token_c.markup = String.fromCharCode(marker); - state.parentType = oldParentType; - return true; -} - -// Paragraph - -function paragraph(state, startLine, endLine) { - const terminatorRules = state.md.block.ruler.getRules('paragraph'); - const oldParentType = state.parentType; - let nextLine = startLine + 1; - state.parentType = 'paragraph'; - - // jump line-by-line until empty one or EOF - for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) { - // this would be a code block normally, but after paragraph - // it's considered a lazy continuation regardless of what's there - if (state.sCount[nextLine] - state.blkIndent > 3) { - continue; + }), [storage, storageKey]); + const [hiddenElement, setHiddenElement] = React.useState(() => { + const storedValue = storageKey && (storage == null ? void 0 : storage.get(storageKey)); + if (storedValue === HIDE_FIRST || initiallyHidden === "first") { + return "first"; } - - // quirk for blockquotes, this line should already be checked by that rule - if (state.sCount[nextLine] < 0) { - continue; + if (storedValue === HIDE_SECOND || initiallyHidden === "second") { + return "second"; } - - // Some tags can terminate paragraph without empty line. - let terminate = false; - for (let i = 0, l = terminatorRules.length; i < l; i++) { - if (terminatorRules[i](state, nextLine, endLine, true)) { - terminate = true; - break; + return null; + }); + const setHiddenElementWithCallback = React.useCallback(element => { + if (element !== hiddenElement) { + setHiddenElement(element); + onHiddenElementChange == null ? void 0 : onHiddenElementChange(element); + } + }, [hiddenElement, onHiddenElementChange]); + const firstRef = React.useRef(null); + const dragBarRef = React.useRef(null); + const secondRef = React.useRef(null); + const defaultFlexRef = React.useRef(`${defaultSizeRelation}`); + React.useLayoutEffect(() => { + const storedValue = storageKey && (storage == null ? void 0 : storage.get(storageKey)) || defaultFlexRef.current; + if (firstRef.current) { + firstRef.current.style.display = "flex"; + firstRef.current.style.flex = storedValue === HIDE_FIRST || storedValue === HIDE_SECOND ? defaultFlexRef.current : storedValue; + } + if (secondRef.current) { + secondRef.current.style.display = "flex"; + secondRef.current.style.flex = "1"; + } + if (dragBarRef.current) { + dragBarRef.current.style.display = "flex"; + } + }, [direction, storage, storageKey]); + const hide = React.useCallback(resizableElement => { + const element = resizableElement === "first" ? firstRef.current : secondRef.current; + if (!element) { + return; + } + element.style.left = "-1000px"; + element.style.position = "absolute"; + element.style.opacity = "0"; + element.style.height = "500px"; + element.style.width = "500px"; + if (firstRef.current) { + const flex = parseFloat(firstRef.current.style.flex); + if (!Number.isFinite(flex) || flex < 1) { + firstRef.current.style.flex = "1"; } } - if (terminate) { - break; + }, []); + const show = React.useCallback(resizableElement => { + const element = resizableElement === "first" ? firstRef.current : secondRef.current; + if (!element) { + return; } - } - const content = state.getLines(startLine, nextLine, state.blkIndent, false).trim(); - state.line = nextLine; - const token_o = state.push('paragraph_open', 'p', 1); - token_o.map = [startLine, state.line]; - const token_i = state.push('inline', '', 0); - token_i.content = content; - token_i.map = [startLine, state.line]; - token_i.children = []; - state.push('paragraph_close', 'p', -1); - state.parentType = oldParentType; - return true; -} - -/** internal - * class ParserBlock - * - * Block-level tokenizer. - **/ - -const _rules$1 = [ -// First 2 params - rule name & source. Secondary array - list of rules, -// which can be terminated by this one. -['table', table, ['paragraph', 'reference']], ['code', code], ['fence', fence, ['paragraph', 'reference', 'blockquote', 'list']], ['blockquote', blockquote, ['paragraph', 'reference', 'blockquote', 'list']], ['hr', hr, ['paragraph', 'reference', 'blockquote', 'list']], ['list', list, ['paragraph', 'reference', 'blockquote']], ['reference', reference], ['html_block', html_block, ['paragraph', 'reference', 'blockquote']], ['heading', heading, ['paragraph', 'reference', 'blockquote']], ['lheading', lheading], ['paragraph', paragraph]]; - -/** - * new ParserBlock() - **/ -function ParserBlock() { - /** - * ParserBlock#ruler -> Ruler - * - * [[Ruler]] instance. Keep configuration of block rules. - **/ - this.ruler = new Ruler(); - for (let i = 0; i < _rules$1.length; i++) { - this.ruler.push(_rules$1[i][0], _rules$1[i][1], { - alt: (_rules$1[i][2] || []).slice() - }); - } -} - -// Generate tokens for input range -// -ParserBlock.prototype.tokenize = function (state, startLine, endLine) { - const rules = this.ruler.getRules(''); - const len = rules.length; - const maxNesting = state.md.options.maxNesting; - let line = startLine; - let hasEmptyLines = false; - while (line < endLine) { - state.line = line = state.skipEmptyLines(line); - if (line >= endLine) { - break; + element.style.width = ""; + element.style.height = ""; + element.style.opacity = ""; + element.style.position = ""; + element.style.left = ""; + if (storage && storageKey) { + const storedValue = storage.get(storageKey); + if (firstRef.current && storedValue !== HIDE_FIRST && storedValue !== HIDE_SECOND) { + firstRef.current.style.flex = storedValue || defaultFlexRef.current; + } + } + }, [storage, storageKey]); + React.useLayoutEffect(() => { + if (hiddenElement === "first") { + hide("first"); + } else { + show("first"); } - - // Termination condition for nested calls. - // Nested calls currently used for blockquotes & lists - if (state.sCount[line] < state.blkIndent) { - break; + if (hiddenElement === "second") { + hide("second"); + } else { + show("second"); } - - // If nesting level exceeded - skip tail to the end. That's not ordinary - // situation and we should not care about content. - if (state.level >= maxNesting) { - state.line = endLine; - break; + }, [hiddenElement, hide, show]); + React.useEffect(() => { + if (!dragBarRef.current || !firstRef.current || !secondRef.current) { + return; } - - // Try all possible rules. - // On success, rule should: - // - // - update `state.line` - // - update `state.tokens` - // - return true - const prevLine = state.line; - let ok = false; - for (let i = 0; i < len; i++) { - ok = rules[i](state, line, endLine, false); - if (ok) { - if (prevLine >= state.line) { - throw new Error("block rule didn't increment state.line"); + const dragBarContainer = dragBarRef.current; + const firstContainer = firstRef.current; + const wrapper = firstContainer.parentElement; + const eventProperty = direction === "horizontal" ? "clientX" : "clientY"; + const rectProperty = direction === "horizontal" ? "left" : "top"; + const adjacentRectProperty = direction === "horizontal" ? "right" : "bottom"; + const sizeProperty = direction === "horizontal" ? "clientWidth" : "clientHeight"; + function handleMouseDown(downEvent) { + downEvent.preventDefault(); + const offset = downEvent[eventProperty] - dragBarContainer.getBoundingClientRect()[rectProperty]; + function handleMouseMove(moveEvent) { + if (moveEvent.buttons === 0) { + return handleMouseUp(); + } + const firstSize = moveEvent[eventProperty] - wrapper.getBoundingClientRect()[rectProperty] - offset; + const secondSize = wrapper.getBoundingClientRect()[adjacentRectProperty] - moveEvent[eventProperty] + offset - dragBarContainer[sizeProperty]; + if (firstSize < sizeThresholdFirst) { + setHiddenElementWithCallback("first"); + store(HIDE_FIRST); + } else if (secondSize < sizeThresholdSecond) { + setHiddenElementWithCallback("second"); + store(HIDE_SECOND); + } else { + setHiddenElementWithCallback(null); + const newFlex = `${firstSize / secondSize}`; + firstContainer.style.flex = newFlex; + store(newFlex); } - break; } + function handleMouseUp() { + document.removeEventListener("mousemove", handleMouseMove); + document.removeEventListener("mouseup", handleMouseUp); + } + document.addEventListener("mousemove", handleMouseMove); + document.addEventListener("mouseup", handleMouseUp); } - - // this can only happen if user disables paragraph rule - if (!ok) throw new Error('none of the block rules matched'); - - // set state.tight if we had an empty line before current tag - // i.e. latest empty line should not count - state.tight = !hasEmptyLines; - - // paragraph might "eat" one newline after it in nested lists - if (state.isEmpty(state.line - 1)) { - hasEmptyLines = true; - } - line = state.line; - if (line < endLine && state.isEmpty(line)) { - hasEmptyLines = true; - line++; - state.line = line; + dragBarContainer.addEventListener("mousedown", handleMouseDown); + function reset() { + if (firstRef.current) { + firstRef.current.style.flex = defaultFlexRef.current; + } + store(defaultFlexRef.current); + setHiddenElementWithCallback(null); } - } -}; - -/** - * ParserBlock.parse(str, md, env, outTokens) - * - * Process input string and push block tokens into `outTokens` - **/ -ParserBlock.prototype.parse = function (src, md, env, outTokens) { - if (!src) { - return; - } - const state = new this.State(src, md, env, outTokens); - this.tokenize(state, state.line, state.lineMax); -}; -ParserBlock.prototype.State = StateBlock; - -// Inline parser state - -function StateInline(src, md, env, outTokens) { - this.src = src; - this.env = env; - this.md = md; - this.tokens = outTokens; - this.tokens_meta = Array(outTokens.length); - this.pos = 0; - this.posMax = this.src.length; - this.level = 0; - this.pending = ''; - this.pendingLevel = 0; - - // Stores { start: end } pairs. Useful for backtrack - // optimization of pairs parse (emphasis, strikes). - this.cache = {}; - - // List of emphasis-like delimiters for current tag - this.delimiters = []; - - // Stack of delimiter lists for upper level tags - this._prev_delimiters = []; - - // backtick length => last seen position - this.backticks = {}; - this.backticksScanned = false; - - // Counter used to disable inline linkify-it execution - // inside and markdown links - this.linkLevel = 0; -} - -// Flush pending text -// -StateInline.prototype.pushPending = function () { - const token = new Token('text', '', 0); - token.content = this.pending; - token.level = this.pendingLevel; - this.tokens.push(token); - this.pending = ''; - return token; -}; - -// Push new token to "stream". -// If pending text exists - flush it as text token -// -StateInline.prototype.push = function (type, tag, nesting) { - if (this.pending) { - this.pushPending(); - } - const token = new Token(type, tag, nesting); - let token_meta = null; - if (nesting < 0) { - // closing tag - this.level--; - this.delimiters = this._prev_delimiters.pop(); - } - token.level = this.level; - if (nesting > 0) { - // opening tag - this.level++; - this._prev_delimiters.push(this.delimiters); - this.delimiters = []; - token_meta = { - delimiters: this.delimiters + dragBarContainer.addEventListener("dblclick", reset); + return () => { + dragBarContainer.removeEventListener("mousedown", handleMouseDown); + dragBarContainer.removeEventListener("dblclick", reset); }; - } - this.pendingLevel = this.level; - this.tokens.push(token); - this.tokens_meta.push(token_meta); - return token; -}; - -// Scan a sequence of emphasis-like markers, and determine whether -// it can start an emphasis sequence or end an emphasis sequence. -// -// - start - position to scan from (it should point at a valid marker); -// - canSplitWord - determine if these markers can be found inside a word -// -StateInline.prototype.scanDelims = function (start, canSplitWord) { - const max = this.posMax; - const marker = this.src.charCodeAt(start); - - // treat beginning of the line as a whitespace - const lastChar = start > 0 ? this.src.charCodeAt(start - 1) : 0x20; - let pos = start; - while (pos < max && this.src.charCodeAt(pos) === marker) { - pos++; - } - const count = pos - start; - - // treat end of the line as a whitespace - const nextChar = pos < max ? this.src.charCodeAt(pos) : 0x20; - const isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar)); - const isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar)); - const isLastWhiteSpace = isWhiteSpace(lastChar); - const isNextWhiteSpace = isWhiteSpace(nextChar); - const left_flanking = !isNextWhiteSpace && (!isNextPunctChar || isLastWhiteSpace || isLastPunctChar); - const right_flanking = !isLastWhiteSpace && (!isLastPunctChar || isNextWhiteSpace || isNextPunctChar); - const can_open = left_flanking && (canSplitWord || !right_flanking || isLastPunctChar); - const can_close = right_flanking && (canSplitWord || !left_flanking || isNextPunctChar); - return { - can_open, - can_close, - length: count + }, [direction, setHiddenElementWithCallback, sizeThresholdFirst, sizeThresholdSecond, store]); + return React.useMemo(() => ({ + dragBarRef, + hiddenElement, + firstRef, + setHiddenElement, + secondRef + }), [hiddenElement, setHiddenElement]); +} +const DEFAULT_FLEX = 1; +const HIDE_FIRST = "hide-first"; +const HIDE_SECOND = "hide-second"; +const ToolbarButton = React.forwardRef(({ + label, + onClick, + ...props +}, ref) => { + const [error, setError] = React.useState(null); + const handleClick = React.useCallback(event => { + try { + onClick == null ? void 0 : onClick(event); + setError(null); + } catch (err) { + setError(err instanceof Error ? err : new Error(`Toolbar button click failed: ${err}`)); + } + }, [onClick]); + return /* @__PURE__ */jsxRuntime.jsx(Tooltip, { + label, + children: /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { + ...props, + ref, + type: "button", + className: clsx.clsx("graphiql-toolbar-button", error && "error", props.className), + onClick: handleClick, + "aria-label": error ? error.message : label, + "aria-invalid": error ? "true" : props["aria-invalid"] + }) + }); +}); +ToolbarButton.displayName = "ToolbarButton"; +function ExecuteButton() { + const { + queryEditor, + setOperationName + } = useEditorContext({ + nonNull: true, + caller: ExecuteButton + }); + const { + isFetching, + isSubscribed, + operationName, + run, + stop + } = useExecutionContext({ + nonNull: true, + caller: ExecuteButton + }); + const operations = (queryEditor == null ? void 0 : queryEditor.operations) || []; + const hasOptions = operations.length > 1 && typeof operationName !== "string"; + const isRunning = isFetching || isSubscribed; + const label = `${isRunning ? "Stop" : "Execute"} query (Ctrl-Enter)`; + const buttonProps = { + type: "button", + className: "graphiql-execute-button", + children: isRunning ? /* @__PURE__ */jsxRuntime.jsx(StopIcon, {}) : /* @__PURE__ */jsxRuntime.jsx(PlayIcon, {}), + "aria-label": label }; -}; - -// re-export Token class to use in block rules -StateInline.prototype.Token = Token; - -// Skip text characters for text token, place those to pending buffer -// and increment current pos - -// Rule to skip pure text -// '{}$%@~+=:' reserved for extentions - -// !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \, ], ^, _, `, {, |, }, or ~ - -// !!!! Don't confuse with "Markdown ASCII Punctuation" chars -// http://spec.commonmark.org/0.15/#ascii-punctuation-character -function isTerminatorChar(ch) { - switch (ch) { - case 0x0A /* \n */: - case 0x21 /* ! */: - case 0x23 /* # */: - case 0x24 /* $ */: - case 0x25 /* % */: - case 0x26 /* & */: - case 0x2A /* * */: - case 0x2B /* + */: - case 0x2D /* - */: - case 0x3A /* : */: - case 0x3C /* < */: - case 0x3D /* = */: - case 0x3E /* > */: - case 0x40 /* @ */: - case 0x5B /* [ */: - case 0x5C /* \ */: - case 0x5D /* ] */: - case 0x5E /* ^ */: - case 0x5F /* _ */: - case 0x60 /* ` */: - case 0x7B /* { */: - case 0x7D /* } */: - case 0x7E /* ~ */: - return true; - default: - return false; - } -} -function text(state, silent) { - let pos = state.pos; - while (pos < state.posMax && !isTerminatorChar(state.src.charCodeAt(pos))) { - pos++; - } - if (pos === state.pos) { - return false; - } - if (!silent) { - state.pending += state.src.slice(state.pos, pos); - } - state.pos = pos; - return true; + return hasOptions && !isRunning ? /* @__PURE__ */jsxRuntime.jsxs(DropdownMenu, { + children: [/* @__PURE__ */jsxRuntime.jsx(Tooltip, { + label, + children: /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Button, { + ...buttonProps + }) + }), /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Content, { + children: operations.map((operation, i) => { + const opName = operation.name ? operation.name.value : ``; + return /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Item, { + onSelect: () => { + var _a; + const selectedOperationName = (_a = operation.name) == null ? void 0 : _a.value; + if (queryEditor && selectedOperationName && selectedOperationName !== queryEditor.operationName) { + setOperationName(selectedOperationName); + } + run(); + }, + children: opName + }, `${opName}-${i}`); + }) + })] + }) : /* @__PURE__ */jsxRuntime.jsx(Tooltip, { + label, + children: /* @__PURE__ */jsxRuntime.jsx("button", { + ...buttonProps, + onClick: () => { + if (isRunning) { + stop(); + } else { + run(); + } + } + }) + }); } +const ToolbarMenuRoot = ({ + button, + children, + label, + ...props +}) => /* @__PURE__ */jsxRuntime.jsxs(DropdownMenu, { + ...props, + children: [/* @__PURE__ */jsxRuntime.jsx(Tooltip, { + label, + children: /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Button, { + className: clsx.clsx("graphiql-un-styled graphiql-toolbar-menu", props.className), + "aria-label": label, + children: button + }) + }), /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Content, { + children + })] +}); +const ToolbarMenu = createComponentGroup(ToolbarMenuRoot, { + Item: DropdownMenu.Item +}); +exports.Argument = Argument; +exports.ArgumentIcon = ArgumentIcon; +exports.Button = Button$1; +exports.ButtonGroup = ButtonGroup; +exports.ChevronDownIcon = ChevronDownIcon; +exports.ChevronLeftIcon = ChevronLeftIcon; +exports.ChevronUpIcon = ChevronUpIcon; +exports.CloseIcon = CloseIcon; +exports.CopyIcon = CopyIcon; +exports.DOC_EXPLORER_PLUGIN = DOC_EXPLORER_PLUGIN; +exports.DefaultValue = DefaultValue; +exports.DeprecatedArgumentIcon = DeprecatedArgumentIcon; +exports.DeprecatedEnumValueIcon = DeprecatedEnumValueIcon; +exports.DeprecatedFieldIcon = DeprecatedFieldIcon; +exports.DeprecationReason = DeprecationReason; +exports.Dialog = Dialog; +exports.DialogRoot = DialogRoot; +exports.Directive = Directive; +exports.DirectiveIcon = DirectiveIcon; +exports.DocExplorer = DocExplorer; +exports.DocsFilledIcon = DocsFilledIcon; +exports.DocsIcon = DocsIcon; +exports.DropdownMenu = DropdownMenu; +exports.EditorContext = EditorContext; +exports.EditorContextProvider = EditorContextProvider; +exports.EnumValueIcon = EnumValueIcon; +exports.ExecuteButton = ExecuteButton; +exports.ExecutionContext = ExecutionContext; +exports.ExecutionContextProvider = ExecutionContextProvider; +exports.ExplorerContext = ExplorerContext; +exports.ExplorerContextProvider = ExplorerContextProvider; +exports.ExplorerSection = ExplorerSection; +exports.FieldDocumentation = FieldDocumentation; +exports.FieldIcon = FieldIcon; +exports.FieldLink = FieldLink; +exports.GraphiQLProvider = GraphiQLProvider; +exports.HISTORY_PLUGIN = HISTORY_PLUGIN; +exports.HeaderEditor = HeaderEditor; +exports.History = History; +exports.HistoryContext = HistoryContext; +exports.HistoryContextProvider = HistoryContextProvider; +exports.HistoryIcon = HistoryIcon; +exports.ImagePreview = ImagePreview; +exports.ImplementsIcon = ImplementsIcon; +exports.KeyboardShortcutIcon = KeyboardShortcutIcon; +exports.MagnifyingGlassIcon = MagnifyingGlassIcon; +exports.MarkdownContent = MarkdownContent; +exports.MergeIcon = MergeIcon; +exports.PenIcon = PenIcon; +exports.PlayIcon = PlayIcon; +exports.PluginContext = PluginContext; +exports.PluginContextProvider = PluginContextProvider; +exports.PlusIcon = PlusIcon; +exports.PrettifyIcon = PrettifyIcon; +exports.QueryEditor = QueryEditor; +exports.ReloadIcon = ReloadIcon; +exports.ResponseEditor = ResponseEditor; +exports.RootTypeIcon = RootTypeIcon; +exports.SchemaContext = SchemaContext; +exports.SchemaContextProvider = SchemaContextProvider; +exports.SchemaDocumentation = SchemaDocumentation; +exports.Search = Search; +exports.SettingsIcon = SettingsIcon; +exports.Spinner = Spinner; +exports.StarFilledIcon = StarFilledIcon; +exports.StarIcon = StarIcon; +exports.StopIcon = StopIcon; +exports.StorageContext = StorageContext; +exports.StorageContextProvider = StorageContextProvider; +exports.Tab = Tab; +exports.Tabs = Tabs; +exports.ToolbarButton = ToolbarButton; +exports.ToolbarMenu = ToolbarMenu; +exports.Tooltip = Tooltip; +exports.TooltipRoot = TooltipRoot; +exports.TrashIcon = TrashIcon; +exports.TypeDocumentation = TypeDocumentation; +exports.TypeIcon = TypeIcon; +exports.TypeLink = TypeLink; +exports.UnStyledButton = UnStyledButton; +exports.VariableEditor = VariableEditor; +exports.isMacOs = isMacOs; +exports.useAutoCompleteLeafs = useAutoCompleteLeafs; +exports.useCopyQuery = useCopyQuery; +exports.useDragResize = useDragResize; +exports.useEditorContext = useEditorContext; +exports.useEditorState = useEditorState; +exports.useExecutionContext = useExecutionContext; +exports.useExplorerContext = useExplorerContext; +exports.useHeaderEditor = useHeaderEditor; +exports.useHeadersEditorState = useHeadersEditorState; +exports.useHistoryContext = useHistoryContext; +exports.useMergeQuery = useMergeQuery; +exports.useOperationsEditorState = useOperationsEditorState; +exports.useOptimisticState = useOptimisticState; +exports.usePluginContext = usePluginContext; +exports.usePrettifyEditors = usePrettifyEditors; +exports.useQueryEditor = useQueryEditor; +exports.useResponseEditor = useResponseEditor; +exports.useSchemaContext = useSchemaContext; +exports.useStorageContext = useStorageContext; +exports.useTheme = useTheme; +exports.useVariableEditor = useVariableEditor; +exports.useVariablesEditorState = useVariablesEditorState; -// Alternative implementation, for memory. -// -// It costs 10% of performance, but allows extend terminators list, if place it -// to `ParserInline` property. Probably, will switch to it sometime, such -// flexibility required. +/***/ }), -/* -var TERMINATOR_RE = /[\n!#$%&*+\-:<=>@[\\\]^_`{}~]/; +/***/ "../../graphiql-react/dist/info-addon.cjs.js": +/*!***************************************************!*\ + !*** ../../graphiql-react/dist/info-addon.cjs.js ***! + \***************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { -module.exports = function text(state, silent) { - var pos = state.pos, - idx = state.src.slice(pos).search(TERMINATOR_RE); - // first char is terminator -> empty text - if (idx === 0) { return false; } - // no terminator -> text till end of string - if (idx < 0) { - if (!silent) { state.pending += state.src.slice(pos); } - state.pos = state.src.length; - return true; +const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); +codemirror.CodeMirror.defineOption("info", false, (cm, options, old) => { + if (old && old !== codemirror.CodeMirror.Init) { + const oldOnMouseOver = cm.state.info.onMouseOver; + codemirror.CodeMirror.off(cm.getWrapperElement(), "mouseover", oldOnMouseOver); + clearTimeout(cm.state.info.hoverTimeout); + delete cm.state.info; } - - if (!silent) { state.pending += state.src.slice(pos, pos + idx); } - - state.pos += idx; - - return true; -}; */ - -// Process links like https://example.org/ - -// RFC3986: scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) -const SCHEME_RE = /(?:^|[^a-z0-9.+-])([a-z][a-z0-9.+-]*)$/i; -function linkify(state, silent) { - if (!state.md.options.linkify) return false; - if (state.linkLevel > 0) return false; - const pos = state.pos; - const max = state.posMax; - if (pos + 3 > max) return false; - if (state.src.charCodeAt(pos) !== 0x3A /* : */) return false; - if (state.src.charCodeAt(pos + 1) !== 0x2F /* / */) return false; - if (state.src.charCodeAt(pos + 2) !== 0x2F /* / */) return false; - const match = state.pending.match(SCHEME_RE); - if (!match) return false; - const proto = match[1]; - const link = state.md.linkify.matchAtStart(state.src.slice(pos - proto.length)); - if (!link) return false; - let url = link.url; - - // invalid link, but still detected by linkify somehow; - // need to check to prevent infinite loop below - if (url.length <= proto.length) return false; - - // disallow '*' at the end of the link (conflicts with emphasis) - url = url.replace(/\*+$/, ''); - const fullUrl = state.md.normalizeLink(url); - if (!state.md.validateLink(fullUrl)) return false; - if (!silent) { - state.pending = state.pending.slice(0, -proto.length); - const token_o = state.push('link_open', 'a', 1); - token_o.attrs = [['href', fullUrl]]; - token_o.markup = 'linkify'; - token_o.info = 'auto'; - const token_t = state.push('text', '', 0); - token_t.content = state.md.normalizeLinkText(url); - const token_c = state.push('link_close', 'a', -1); - token_c.markup = 'linkify'; - token_c.info = 'auto'; + if (options) { + const state = cm.state.info = createState(options); + state.onMouseOver = onMouseOver.bind(null, cm); + codemirror.CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); + } +}); +function createState(options) { + return { + options: options instanceof Function ? { + render: options + } : options === true ? {} : options + }; +} +function getHoverTime(cm) { + const { + options + } = cm.state.info; + return (options === null || options === void 0 ? void 0 : options.hoverTime) || 500; +} +function onMouseOver(cm, e) { + const state = cm.state.info; + const target = e.target || e.srcElement; + if (!(target instanceof HTMLElement)) { + return; } - state.pos += url.length - proto.length; - return true; + if (target.nodeName !== "SPAN" || state.hoverTimeout !== void 0) { + return; + } + const box = target.getBoundingClientRect(); + const onMouseMove = function () { + clearTimeout(state.hoverTimeout); + state.hoverTimeout = setTimeout(onHover, hoverTime); + }; + const onMouseOut = function () { + codemirror.CodeMirror.off(document, "mousemove", onMouseMove); + codemirror.CodeMirror.off(cm.getWrapperElement(), "mouseout", onMouseOut); + clearTimeout(state.hoverTimeout); + state.hoverTimeout = void 0; + }; + const onHover = function () { + codemirror.CodeMirror.off(document, "mousemove", onMouseMove); + codemirror.CodeMirror.off(cm.getWrapperElement(), "mouseout", onMouseOut); + state.hoverTimeout = void 0; + onMouseHover(cm, box); + }; + const hoverTime = getHoverTime(cm); + state.hoverTimeout = setTimeout(onHover, hoverTime); + codemirror.CodeMirror.on(document, "mousemove", onMouseMove); + codemirror.CodeMirror.on(cm.getWrapperElement(), "mouseout", onMouseOut); +} +function onMouseHover(cm, box) { + const pos = cm.coordsChar({ + left: (box.left + box.right) / 2, + top: (box.top + box.bottom) / 2 + }, "window"); + const state = cm.state.info; + const { + options + } = state; + const render = options.render || cm.getHelper(pos, "info"); + if (render) { + const token = cm.getTokenAt(pos, true); + if (token) { + const info = render(token, options, cm, pos); + if (info) { + showPopup(cm, box, info); + } + } + } +} +function showPopup(cm, box, info) { + const popup = document.createElement("div"); + popup.className = "CodeMirror-info"; + popup.append(info); + document.body.append(popup); + const popupBox = popup.getBoundingClientRect(); + const popupStyle = window.getComputedStyle(popup); + const popupWidth = popupBox.right - popupBox.left + parseFloat(popupStyle.marginLeft) + parseFloat(popupStyle.marginRight); + const popupHeight = popupBox.bottom - popupBox.top + parseFloat(popupStyle.marginTop) + parseFloat(popupStyle.marginBottom); + let topPos = box.bottom; + if (popupHeight > window.innerHeight - box.bottom - 15 && box.top > window.innerHeight - box.bottom) { + topPos = box.top - popupHeight; + } + if (topPos < 0) { + topPos = box.bottom; + } + let leftPos = Math.max(0, window.innerWidth - popupWidth - 15); + if (leftPos > box.left) { + leftPos = box.left; + } + popup.style.opacity = "1"; + popup.style.top = topPos + "px"; + popup.style.left = leftPos + "px"; + let popupTimeout; + const onMouseOverPopup = function () { + clearTimeout(popupTimeout); + }; + const onMouseOut = function () { + clearTimeout(popupTimeout); + popupTimeout = setTimeout(hidePopup, 200); + }; + const hidePopup = function () { + codemirror.CodeMirror.off(popup, "mouseover", onMouseOverPopup); + codemirror.CodeMirror.off(popup, "mouseout", onMouseOut); + codemirror.CodeMirror.off(cm.getWrapperElement(), "mouseout", onMouseOut); + if (popup.style.opacity) { + popup.style.opacity = "0"; + setTimeout(() => { + if (popup.parentNode) { + popup.remove(); + } + }, 600); + } else if (popup.parentNode) { + popup.remove(); + } + }; + codemirror.CodeMirror.on(popup, "mouseover", onMouseOverPopup); + codemirror.CodeMirror.on(popup, "mouseout", onMouseOut); + codemirror.CodeMirror.on(cm.getWrapperElement(), "mouseout", onMouseOut); } -// Proceess '\n' +/***/ }), -function newline(state, silent) { - let pos = state.pos; - if (state.src.charCodeAt(pos) !== 0x0A /* \n */) { - return false; - } - const pmax = state.pending.length - 1; - const max = state.posMax; +/***/ "../../graphiql-react/dist/info.cjs.js": +/*!*********************************************!*\ + !*** ../../graphiql-react/dist/info.cjs.js ***! + \*********************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - // ' \n' -> hardbreak - // Lookup in pending chars is bad practice! Don't copy to other rules! - // Pending string is stored in concat mode, indexed lookups will cause - // convertion to flat mode. - if (!silent) { - if (pmax >= 0 && state.pending.charCodeAt(pmax) === 0x20) { - if (pmax >= 1 && state.pending.charCodeAt(pmax - 1) === 0x20) { - // Find whitespaces tail of pending chars. - let ws = pmax - 1; - while (ws >= 1 && state.pending.charCodeAt(ws - 1) === 0x20) ws--; - state.pending = state.pending.slice(0, ws); - state.push('hardbreak', 'br', 0); - } else { - state.pending = state.pending.slice(0, -1); - state.push('softbreak', 'br', 0); - } - } else { - state.push('softbreak', 'br', 0); - } - } - pos++; - // skip heading spaces for next line - while (pos < max && isSpace(state.src.charCodeAt(pos))) { - pos++; + +const graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); +const SchemaReference = __webpack_require__(/*! ./SchemaReference.cjs.js */ "../../graphiql-react/dist/SchemaReference.cjs.js"); +__webpack_require__(/*! ./info-addon.cjs.js */ "../../graphiql-react/dist/info-addon.cjs.js"); +codemirror.CodeMirror.registerHelper("info", "graphql", (token, options) => { + var _a; + if (!options.schema || !token.state) { + return; } - state.pos = pos; - return true; + const { + kind, + step + } = token.state; + const typeInfo = SchemaReference.getTypeInfo(options.schema, token.state); + if (kind === "Field" && step === 0 && typeInfo.fieldDef || kind === "AliasedField" && step === 2 && typeInfo.fieldDef || kind === "ObjectField" && step === 0 && typeInfo.fieldDef) { + const header = document.createElement("div"); + header.className = "CodeMirror-info-header"; + renderField(header, typeInfo, options); + const into = document.createElement("div"); + into.append(header); + renderDescription(into, options, typeInfo.fieldDef); + return into; + } + if (kind === "Directive" && step === 1 && typeInfo.directiveDef) { + const header = document.createElement("div"); + header.className = "CodeMirror-info-header"; + renderDirective(header, typeInfo, options); + const into = document.createElement("div"); + into.append(header); + renderDescription(into, options, typeInfo.directiveDef); + return into; + } + if (kind === "Argument" && step === 0 && typeInfo.argDef) { + const header = document.createElement("div"); + header.className = "CodeMirror-info-header"; + renderArg(header, typeInfo, options); + const into = document.createElement("div"); + into.append(header); + renderDescription(into, options, typeInfo.argDef); + return into; + } + if (kind === "EnumValue" && ((_a = typeInfo.enumValue) === null || _a === void 0 ? void 0 : _a.description)) { + const header = document.createElement("div"); + header.className = "CodeMirror-info-header"; + renderEnumValue(header, typeInfo, options); + const into = document.createElement("div"); + into.append(header); + renderDescription(into, options, typeInfo.enumValue); + return into; + } + if (kind === "NamedType" && typeInfo.type && typeInfo.type.description) { + const header = document.createElement("div"); + header.className = "CodeMirror-info-header"; + renderType(header, typeInfo, options, typeInfo.type); + const into = document.createElement("div"); + into.append(header); + renderDescription(into, options, typeInfo.type); + return into; + } +}); +function renderField(into, typeInfo, options) { + renderQualifiedField(into, typeInfo, options); + renderTypeAnnotation(into, typeInfo, options, typeInfo.type); } - -// Process escaped chars and hardbreaks - -const ESCAPED = []; -for (let i = 0; i < 256; i++) { - ESCAPED.push(0); +function renderQualifiedField(into, typeInfo, options) { + var _a; + const fieldName = ((_a = typeInfo.fieldDef) === null || _a === void 0 ? void 0 : _a.name) || ""; + text(into, fieldName, "field-name", options, SchemaReference.getFieldReference(typeInfo)); } -'\\!"#$%&\'()*+,./:;<=>?@[]^_`{|}~-'.split('').forEach(function (ch) { - ESCAPED[ch.charCodeAt(0)] = 1; -}); -function escape(state, silent) { - let pos = state.pos; - const max = state.posMax; - if (state.src.charCodeAt(pos) !== 0x5C /* \ */) return false; - pos++; - - // '\' at the end of the inline block - if (pos >= max) return false; - let ch1 = state.src.charCodeAt(pos); - if (ch1 === 0x0A) { - if (!silent) { - state.push('hardbreak', 'br', 0); - } - pos++; - // skip leading whitespaces from next line - while (pos < max) { - ch1 = state.src.charCodeAt(pos); - if (!isSpace(ch1)) break; - pos++; +function renderDirective(into, typeInfo, options) { + var _a; + const name = "@" + (((_a = typeInfo.directiveDef) === null || _a === void 0 ? void 0 : _a.name) || ""); + text(into, name, "directive-name", options, SchemaReference.getDirectiveReference(typeInfo)); +} +function renderArg(into, typeInfo, options) { + var _a; + const name = ((_a = typeInfo.argDef) === null || _a === void 0 ? void 0 : _a.name) || ""; + text(into, name, "arg-name", options, SchemaReference.getArgumentReference(typeInfo)); + renderTypeAnnotation(into, typeInfo, options, typeInfo.inputType); +} +function renderEnumValue(into, typeInfo, options) { + var _a; + const name = ((_a = typeInfo.enumValue) === null || _a === void 0 ? void 0 : _a.name) || ""; + renderType(into, typeInfo, options, typeInfo.inputType); + text(into, "."); + text(into, name, "enum-value", options, SchemaReference.getEnumValueReference(typeInfo)); +} +function renderTypeAnnotation(into, typeInfo, options, t) { + const typeSpan = document.createElement("span"); + typeSpan.className = "type-name-pill"; + if (t instanceof graphql.GraphQLNonNull) { + renderType(typeSpan, typeInfo, options, t.ofType); + text(typeSpan, "!"); + } else if (t instanceof graphql.GraphQLList) { + text(typeSpan, "["); + renderType(typeSpan, typeInfo, options, t.ofType); + text(typeSpan, "]"); + } else { + text(typeSpan, (t === null || t === void 0 ? void 0 : t.name) || "", "type-name", options, SchemaReference.getTypeReference(typeInfo, t)); + } + into.append(typeSpan); +} +function renderType(into, typeInfo, options, t) { + if (t instanceof graphql.GraphQLNonNull) { + renderType(into, typeInfo, options, t.ofType); + text(into, "!"); + } else if (t instanceof graphql.GraphQLList) { + text(into, "["); + renderType(into, typeInfo, options, t.ofType); + text(into, "]"); + } else { + text(into, (t === null || t === void 0 ? void 0 : t.name) || "", "type-name", options, SchemaReference.getTypeReference(typeInfo, t)); + } +} +function renderDescription(into, options, def) { + const { + description + } = def; + if (description) { + const descriptionDiv = document.createElement("div"); + descriptionDiv.className = "info-description"; + if (options.renderDescription) { + descriptionDiv.innerHTML = options.renderDescription(description); + } else { + descriptionDiv.append(document.createTextNode(description)); } - state.pos = pos; - return true; + into.append(descriptionDiv); } - let escapedStr = state.src[pos]; - if (ch1 >= 0xD800 && ch1 <= 0xDBFF && pos + 1 < max) { - const ch2 = state.src.charCodeAt(pos + 1); - if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) { - escapedStr += state.src[pos + 1]; - pos++; + renderDeprecation(into, options, def); +} +function renderDeprecation(into, options, def) { + const reason = def.deprecationReason; + if (reason) { + const deprecationDiv = document.createElement("div"); + deprecationDiv.className = "info-deprecation"; + into.append(deprecationDiv); + const label = document.createElement("span"); + label.className = "info-deprecation-label"; + label.append(document.createTextNode("Deprecated")); + deprecationDiv.append(label); + const reasonDiv = document.createElement("div"); + reasonDiv.className = "info-deprecation-reason"; + if (options.renderDescription) { + reasonDiv.innerHTML = options.renderDescription(reason); + } else { + reasonDiv.append(document.createTextNode(reason)); } + deprecationDiv.append(reasonDiv); } - const origStr = '\\' + escapedStr; - if (!silent) { - const token = state.push('text_special', '', 0); - if (ch1 < 256 && ESCAPED[ch1] !== 0) { - token.content = escapedStr; +} +function text(into, content, className = "", options = { + onClick: null +}, ref = null) { + if (className) { + const { + onClick + } = options; + let node; + if (onClick) { + node = document.createElement("a"); + node.href = "javascript:void 0"; + node.addEventListener("click", e => { + e.preventDefault(); + onClick(ref, e); + }); } else { - token.content = origStr; + node = document.createElement("span"); } - token.markup = origStr; - token.info = 'escape'; + node.className = className; + node.append(document.createTextNode(content)); + into.append(node); + } else { + into.append(document.createTextNode(content)); } - state.pos = pos + 1; - return true; } -// Parse backticks +/***/ }), -function backtick(state, silent) { - let pos = state.pos; - const ch = state.src.charCodeAt(pos); - if (ch !== 0x60 /* ` */) { - return false; - } - const start = pos; - pos++; - const max = state.posMax; +/***/ "../../graphiql-react/dist/javascript.cjs.js": +/*!***************************************************!*\ + !*** ../../graphiql-react/dist/javascript.cjs.js ***! + \***************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - // scan marker length - while (pos < max && state.src.charCodeAt(pos) === 0x60 /* ` */) { - pos++; - } - const marker = state.src.slice(start, pos); - const openerLength = marker.length; - if (state.backticksScanned && (state.backticks[openerLength] || 0) <= start) { - if (!silent) state.pending += marker; - state.pos += openerLength; - return true; - } - let matchEnd = pos; - let matchStart; - // Nothing found in the cache, scan until the end of the line (or until marker is found) - while ((matchStart = state.src.indexOf('`', matchEnd)) !== -1) { - matchEnd = matchStart + 1; - // scan marker length - while (matchEnd < max && state.src.charCodeAt(matchEnd) === 0x60 /* ` */) { - matchEnd++; - } - const closerLength = matchEnd - matchStart; - if (closerLength === openerLength) { - // Found matching closer length. - if (!silent) { - const token = state.push('code_inline', 'code', 0); - token.markup = marker; - token.content = state.src.slice(pos, matchStart).replace(/\n/g, ' ').replace(/^ (.+) $/, '$1'); +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } } - state.pos = matchEnd; - return true; } - - // Some different length found, put it in cache as upper limit of where closer can be found - state.backticks[closerLength] = matchStart; } - - // Scanned through the end, didn't find anything - state.backticksScanned = true; - if (!silent) state.pending += marker; - state.pos += openerLength; - return true; + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); } +var javascript$2 = { + exports: {} +}; +(function (module2, exports2) { + (function (mod) { + mod(codemirror.requireCodemirror()); + })(function (CodeMirror) { + CodeMirror.defineMode("javascript", function (config, parserConfig) { + var indentUnit = config.indentUnit; + var statementIndent = parserConfig.statementIndent; + var jsonldMode = parserConfig.jsonld; + var jsonMode = parserConfig.json || jsonldMode; + var trackScope = parserConfig.trackScope !== false; + var isTS = parserConfig.typescript; + var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; + var keywords = function () { + function kw(type2) { + return { + type: type2, + style: "keyword" + }; + } + var A = kw("keyword a"), + B = kw("keyword b"), + C = kw("keyword c"), + D = kw("keyword d"); + var operator = kw("operator"), + atom = { + type: "atom", + style: "atom" + }; + return { + "if": kw("if"), + "while": A, + "with": A, + "else": B, + "do": B, + "try": B, + "finally": B, + "return": D, + "break": D, + "continue": D, + "new": kw("new"), + "delete": C, + "void": C, + "throw": C, + "debugger": kw("debugger"), + "var": kw("var"), + "const": kw("var"), + "let": kw("var"), + "function": kw("function"), + "catch": kw("catch"), + "for": kw("for"), + "switch": kw("switch"), + "case": kw("case"), + "default": kw("default"), + "in": operator, + "typeof": operator, + "instanceof": operator, + "true": atom, + "false": atom, + "null": atom, + "undefined": atom, + "NaN": atom, + "Infinity": atom, + "this": kw("this"), + "class": kw("class"), + "super": kw("atom"), + "yield": C, + "export": kw("export"), + "import": kw("import"), + "extends": C, + "await": C + }; + }(); + var isOperatorChar = /[+\-*&%=<>!?|~^@]/; + var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; + function readRegexp(stream) { + var escaped = false, + next, + inSet = false; + while ((next = stream.next()) != null) { + if (!escaped) { + if (next == "/" && !inSet) return; + if (next == "[") inSet = true;else if (inSet && next == "]") inSet = false; + } + escaped = !escaped && next == "\\"; + } + } + var type, content; + function ret(tp, style, cont2) { + type = tp; + content = cont2; + return style; + } + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (ch == "." && stream.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/)) { + return ret("number", "number"); + } else if (ch == "." && stream.match("..")) { + return ret("spread", "meta"); + } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + return ret(ch); + } else if (ch == "=" && stream.eat(">")) { + return ret("=>", "operator"); + } else if (ch == "0" && stream.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) { + return ret("number", "number"); + } else if (/\d/.test(ch)) { + stream.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/); + return ret("number", "number"); + } else if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } else if (stream.eat("/")) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else if (expressionAllowed(stream, state, 1)) { + readRegexp(stream); + stream.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/); + return ret("regexp", "string-2"); + } else { + stream.eat("="); + return ret("operator", "operator", stream.current()); + } + } else if (ch == "`") { + state.tokenize = tokenQuasi; + return tokenQuasi(stream, state); + } else if (ch == "#" && stream.peek() == "!") { + stream.skipToEnd(); + return ret("meta", "meta"); + } else if (ch == "#" && stream.eatWhile(wordRE)) { + return ret("variable", "property"); + } else if (ch == "<" && stream.match("!--") || ch == "-" && stream.match("->") && !/\S/.test(stream.string.slice(0, stream.start))) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else if (isOperatorChar.test(ch)) { + if (ch != ">" || !state.lexical || state.lexical.type != ">") { + if (stream.eat("=")) { + if (ch == "!" || ch == "=") stream.eat("="); + } else if (/[<>*+\-|&?]/.test(ch)) { + stream.eat(ch); + if (ch == ">") stream.eat(ch); + } + } + if (ch == "?" && stream.eat(".")) return ret("."); + return ret("operator", "operator", stream.current()); + } else if (wordRE.test(ch)) { + stream.eatWhile(wordRE); + var word = stream.current(); + if (state.lastType != ".") { + if (keywords.propertyIsEnumerable(word)) { + var kw = keywords[word]; + return ret(kw.type, kw.style, word); + } + if (word == "async" && stream.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/, false)) return ret("async", "keyword", word); + } + return ret("variable", "variable", word); + } + } + function tokenString(quote) { + return function (stream, state) { + var escaped = false, + next; + if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)) { + state.tokenize = tokenBase; + return ret("jsonld-keyword", "meta"); + } + while ((next = stream.next()) != null) { + if (next == quote && !escaped) break; + escaped = !escaped && next == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return ret("string", "string"); + }; + } + function tokenComment(stream, state) { + var maybeEnd = false, + ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = ch == "*"; + } + return ret("comment", "comment"); + } + function tokenQuasi(stream, state) { + var escaped = false, + next; + while ((next = stream.next()) != null) { + if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && next == "\\"; + } + return ret("quasi", "string-2", stream.current()); + } + var brackets = "([{}])"; + function findFatArrow(stream, state) { + if (state.fatArrowAt) state.fatArrowAt = null; + var arrow = stream.string.indexOf("=>", stream.start); + if (arrow < 0) return; + if (isTS) { + var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow)); + if (m) arrow = m.index; + } + var depth = 0, + sawSomething = false; + for (var pos = arrow - 1; pos >= 0; --pos) { + var ch = stream.string.charAt(pos); + var bracket = brackets.indexOf(ch); + if (bracket >= 0 && bracket < 3) { + if (!depth) { + ++pos; + break; + } + if (--depth == 0) { + if (ch == "(") sawSomething = true; + break; + } + } else if (bracket >= 3 && bracket < 6) { + ++depth; + } else if (wordRE.test(ch)) { + sawSomething = true; + } else if (/["'\/`]/.test(ch)) { + for (;; --pos) { + if (pos == 0) return; + var next = stream.string.charAt(pos - 1); + if (next == ch && stream.string.charAt(pos - 2) != "\\") { + pos--; + break; + } + } + } else if (sawSomething && !depth) { + ++pos; + break; + } + } + if (sawSomething && !depth) state.fatArrowAt = pos; + } + var atomicTypes = { + "atom": true, + "number": true, + "variable": true, + "string": true, + "regexp": true, + "this": true, + "import": true, + "jsonld-keyword": true + }; + function JSLexical(indented, column, type2, align, prev, info) { + this.indented = indented; + this.column = column; + this.type = type2; + this.prev = prev; + this.info = info; + if (align != null) this.align = align; + } + function inScope(state, varname) { + if (!trackScope) return false; + for (var v = state.localVars; v; v = v.next) if (v.name == varname) return true; + for (var cx2 = state.context; cx2; cx2 = cx2.prev) { + for (var v = cx2.vars; v; v = v.next) if (v.name == varname) return true; + } + } + function parseJS(state, style, type2, content2, stream) { + var cc = state.cc; + cx.state = state; + cx.stream = stream; + cx.marked = null, cx.cc = cc; + cx.style = style; + if (!state.lexical.hasOwnProperty("align")) state.lexical.align = true; + while (true) { + var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; + if (combinator(type2, content2)) { + while (cc.length && cc[cc.length - 1].lex) cc.pop()(); + if (cx.marked) return cx.marked; + if (type2 == "variable" && inScope(state, content2)) return "variable-2"; + return style; + } + } + } + var cx = { + state: null, + column: null, + marked: null, + cc: null + }; + function pass() { + for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + function inList(name, list) { + for (var v = list; v; v = v.next) if (v.name == name) return true; + return false; + } + function register(varname) { + var state = cx.state; + cx.marked = "def"; + if (!trackScope) return; + if (state.context) { + if (state.lexical.info == "var" && state.context && state.context.block) { + var newContext = registerVarScoped(varname, state.context); + if (newContext != null) { + state.context = newContext; + return; + } + } else if (!inList(varname, state.localVars)) { + state.localVars = new Var(varname, state.localVars); + return; + } + } + if (parserConfig.globalVars && !inList(varname, state.globalVars)) state.globalVars = new Var(varname, state.globalVars); + } + function registerVarScoped(varname, context) { + if (!context) { + return null; + } else if (context.block) { + var inner = registerVarScoped(varname, context.prev); + if (!inner) return null; + if (inner == context.prev) return context; + return new Context(inner, context.vars, true); + } else if (inList(varname, context.vars)) { + return context; + } else { + return new Context(context.prev, new Var(varname, context.vars), false); + } + } + function isModifier(name) { + return name == "public" || name == "private" || name == "protected" || name == "abstract" || name == "readonly"; + } + function Context(prev, vars, block2) { + this.prev = prev; + this.vars = vars; + this.block = block2; + } + function Var(name, next) { + this.name = name; + this.next = next; + } + var defaultVars = new Var("this", new Var("arguments", null)); + function pushcontext() { + cx.state.context = new Context(cx.state.context, cx.state.localVars, false); + cx.state.localVars = defaultVars; + } + function pushblockcontext() { + cx.state.context = new Context(cx.state.context, cx.state.localVars, true); + cx.state.localVars = null; + } + pushcontext.lex = pushblockcontext.lex = true; + function popcontext() { + cx.state.localVars = cx.state.context.vars; + cx.state.context = cx.state.context.prev; + } + popcontext.lex = true; + function pushlex(type2, info) { + var result = function () { + var state = cx.state, + indent = state.indented; + if (state.lexical.type == "stat") indent = state.lexical.indented;else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) indent = outer.indented; + state.lexical = new JSLexical(indent, cx.stream.column(), type2, null, state.lexical, info); + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + poplex.lex = true; + function expect(wanted) { + function exp(type2) { + if (type2 == wanted) return cont();else if (wanted == ";" || type2 == "}" || type2 == ")" || type2 == "]") return pass();else return cont(exp); + } + return exp; + } + function statement(type2, value) { + if (type2 == "var") return cont(pushlex("vardef", value), vardef, expect(";"), poplex); + if (type2 == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex); + if (type2 == "keyword b") return cont(pushlex("form"), statement, poplex); + if (type2 == "keyword d") return cx.stream.match(/^\s*$/, false) ? cont() : cont(pushlex("stat"), maybeexpression, expect(";"), poplex); + if (type2 == "debugger") return cont(expect(";")); + if (type2 == "{") return cont(pushlex("}"), pushblockcontext, block, poplex, popcontext); + if (type2 == ";") return cont(); + if (type2 == "if") { + if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) cx.state.cc.pop()(); + return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse); + } + if (type2 == "function") return cont(functiondef); + if (type2 == "for") return cont(pushlex("form"), pushblockcontext, forspec, statement, popcontext, poplex); + if (type2 == "class" || isTS && value == "interface") { + cx.marked = "keyword"; + return cont(pushlex("form", type2 == "class" ? type2 : value), className, poplex); + } + if (type2 == "variable") { + if (isTS && value == "declare") { + cx.marked = "keyword"; + return cont(statement); + } else if (isTS && (value == "module" || value == "enum" || value == "type") && cx.stream.match(/^\s*\w/, false)) { + cx.marked = "keyword"; + if (value == "enum") return cont(enumdef);else if (value == "type") return cont(typename, expect("operator"), typeexpr, expect(";"));else return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex); + } else if (isTS && value == "namespace") { + cx.marked = "keyword"; + return cont(pushlex("form"), expression, statement, poplex); + } else if (isTS && value == "abstract") { + cx.marked = "keyword"; + return cont(statement); + } else { + return cont(pushlex("stat"), maybelabel); + } + } + if (type2 == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"), pushblockcontext, block, poplex, poplex, popcontext); + if (type2 == "case") return cont(expression, expect(":")); + if (type2 == "default") return cont(expect(":")); + if (type2 == "catch") return cont(pushlex("form"), pushcontext, maybeCatchBinding, statement, poplex, popcontext); + if (type2 == "export") return cont(pushlex("stat"), afterExport, poplex); + if (type2 == "import") return cont(pushlex("stat"), afterImport, poplex); + if (type2 == "async") return cont(statement); + if (value == "@") return cont(expression, statement); + return pass(pushlex("stat"), expression, expect(";"), poplex); + } + function maybeCatchBinding(type2) { + if (type2 == "(") return cont(funarg, expect(")")); + } + function expression(type2, value) { + return expressionInner(type2, value, false); + } + function expressionNoComma(type2, value) { + return expressionInner(type2, value, true); + } + function parenExpr(type2) { + if (type2 != "(") return pass(); + return cont(pushlex(")"), maybeexpression, expect(")"), poplex); + } + function expressionInner(type2, value, noComma) { + if (cx.state.fatArrowAt == cx.stream.start) { + var body = noComma ? arrowBodyNoComma : arrowBody; + if (type2 == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, expect("=>"), body, popcontext);else if (type2 == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); + } + var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; + if (atomicTypes.hasOwnProperty(type2)) return cont(maybeop); + if (type2 == "function") return cont(functiondef, maybeop); + if (type2 == "class" || isTS && value == "interface") { + cx.marked = "keyword"; + return cont(pushlex("form"), classExpression, poplex); + } + if (type2 == "keyword c" || type2 == "async") return cont(noComma ? expressionNoComma : expression); + if (type2 == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); + if (type2 == "operator" || type2 == "spread") return cont(noComma ? expressionNoComma : expression); + if (type2 == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); + if (type2 == "{") return contCommasep(objprop, "}", null, maybeop); + if (type2 == "quasi") return pass(quasi, maybeop); + if (type2 == "new") return cont(maybeTarget(noComma)); + return cont(); + } + function maybeexpression(type2) { + if (type2.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + function maybeoperatorComma(type2, value) { + if (type2 == ",") return cont(maybeexpression); + return maybeoperatorNoComma(type2, value, false); + } + function maybeoperatorNoComma(type2, value, noComma) { + var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; + var expr = noComma == false ? expression : expressionNoComma; + if (type2 == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); + if (type2 == "operator") { + if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me); + if (isTS && value == "<" && cx.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/, false)) return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, me); + if (value == "?") return cont(expression, expect(":"), expr); + return cont(expr); + } + if (type2 == "quasi") { + return pass(quasi, me); + } + if (type2 == ";") return; + if (type2 == "(") return contCommasep(expressionNoComma, ")", "call", me); + if (type2 == ".") return cont(property, me); + if (type2 == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); + if (isTS && value == "as") { + cx.marked = "keyword"; + return cont(typeexpr, me); + } + if (type2 == "regexp") { + cx.state.lastType = cx.marked = "operator"; + cx.stream.backUp(cx.stream.pos - cx.stream.start - 1); + return cont(expr); + } + } + function quasi(type2, value) { + if (type2 != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasi); + return cont(maybeexpression, continueQuasi); + } + function continueQuasi(type2) { + if (type2 == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasi); + } + } + function arrowBody(type2) { + findFatArrow(cx.stream, cx.state); + return pass(type2 == "{" ? statement : expression); + } + function arrowBodyNoComma(type2) { + findFatArrow(cx.stream, cx.state); + return pass(type2 == "{" ? statement : expressionNoComma); + } + function maybeTarget(noComma) { + return function (type2) { + if (type2 == ".") return cont(noComma ? targetNoComma : target);else if (type2 == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma);else return pass(noComma ? expressionNoComma : expression); + }; + } + function target(_, value) { + if (value == "target") { + cx.marked = "keyword"; + return cont(maybeoperatorComma); + } + } + function targetNoComma(_, value) { + if (value == "target") { + cx.marked = "keyword"; + return cont(maybeoperatorNoComma); + } + } + function maybelabel(type2) { + if (type2 == ":") return cont(poplex, statement); + return pass(maybeoperatorComma, expect(";"), poplex); + } + function property(type2) { + if (type2 == "variable") { + cx.marked = "property"; + return cont(); + } + } + function objprop(type2, value) { + if (type2 == "async") { + cx.marked = "property"; + return cont(objprop); + } else if (type2 == "variable" || cx.style == "keyword") { + cx.marked = "property"; + if (value == "get" || value == "set") return cont(getterSetter); + var m; + if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\s*:\s*/, false))) cx.state.fatArrowAt = cx.stream.pos + m[0].length; + return cont(afterprop); + } else if (type2 == "number" || type2 == "string") { + cx.marked = jsonldMode ? "property" : cx.style + " property"; + return cont(afterprop); + } else if (type2 == "jsonld-keyword") { + return cont(afterprop); + } else if (isTS && isModifier(value)) { + cx.marked = "keyword"; + return cont(objprop); + } else if (type2 == "[") { + return cont(expression, maybetype, expect("]"), afterprop); + } else if (type2 == "spread") { + return cont(expressionNoComma, afterprop); + } else if (value == "*") { + cx.marked = "keyword"; + return cont(objprop); + } else if (type2 == ":") { + return pass(afterprop); + } + } + function getterSetter(type2) { + if (type2 != "variable") return pass(afterprop); + cx.marked = "property"; + return cont(functiondef); + } + function afterprop(type2) { + if (type2 == ":") return cont(expressionNoComma); + if (type2 == "(") return pass(functiondef); + } + function commasep(what, end, sep) { + function proceed(type2, value) { + if (sep ? sep.indexOf(type2) > -1 : type2 == ",") { + var lex = cx.state.lexical; + if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; + return cont(function (type3, value2) { + if (type3 == end || value2 == end) return pass(); + return pass(what); + }, proceed); + } + if (type2 == end || value == end) return cont(); + if (sep && sep.indexOf(";") > -1) return pass(what); + return cont(expect(end)); + } + return function (type2, value) { + if (type2 == end || value == end) return cont(); + return pass(what, proceed); + }; + } + function contCommasep(what, end, info) { + for (var i = 3; i < arguments.length; i++) cx.cc.push(arguments[i]); + return cont(pushlex(end, info), commasep(what, end), poplex); + } + function block(type2) { + if (type2 == "}") return cont(); + return pass(statement, block); + } + function maybetype(type2, value) { + if (isTS) { + if (type2 == ":") return cont(typeexpr); + if (value == "?") return cont(maybetype); + } + } + function maybetypeOrIn(type2, value) { + if (isTS && (type2 == ":" || value == "in")) return cont(typeexpr); + } + function mayberettype(type2) { + if (isTS && type2 == ":") { + if (cx.stream.match(/^\s*\w+\s+is\b/, false)) return cont(expression, isKW, typeexpr);else return cont(typeexpr); + } + } + function isKW(_, value) { + if (value == "is") { + cx.marked = "keyword"; + return cont(); + } + } + function typeexpr(type2, value) { + if (value == "keyof" || value == "typeof" || value == "infer" || value == "readonly") { + cx.marked = "keyword"; + return cont(value == "typeof" ? expressionNoComma : typeexpr); + } + if (type2 == "variable" || value == "void") { + cx.marked = "type"; + return cont(afterType); + } + if (value == "|" || value == "&") return cont(typeexpr); + if (type2 == "string" || type2 == "number" || type2 == "atom") return cont(afterType); + if (type2 == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType); + if (type2 == "{") return cont(pushlex("}"), typeprops, poplex, afterType); + if (type2 == "(") return cont(commasep(typearg, ")"), maybeReturnType, afterType); + if (type2 == "<") return cont(commasep(typeexpr, ">"), typeexpr); + if (type2 == "quasi") { + return pass(quasiType, afterType); + } + } + function maybeReturnType(type2) { + if (type2 == "=>") return cont(typeexpr); + } + function typeprops(type2) { + if (type2.match(/[\}\)\]]/)) return cont(); + if (type2 == "," || type2 == ";") return cont(typeprops); + return pass(typeprop, typeprops); + } + function typeprop(type2, value) { + if (type2 == "variable" || cx.style == "keyword") { + cx.marked = "property"; + return cont(typeprop); + } else if (value == "?" || type2 == "number" || type2 == "string") { + return cont(typeprop); + } else if (type2 == ":") { + return cont(typeexpr); + } else if (type2 == "[") { + return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop); + } else if (type2 == "(") { + return pass(functiondecl, typeprop); + } else if (!type2.match(/[;\}\)\],]/)) { + return cont(); + } + } + function quasiType(type2, value) { + if (type2 != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasiType); + return cont(typeexpr, continueQuasiType); + } + function continueQuasiType(type2) { + if (type2 == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasiType); + } + } + function typearg(type2, value) { + if (type2 == "variable" && cx.stream.match(/^\s*[?:]/, false) || value == "?") return cont(typearg); + if (type2 == ":") return cont(typeexpr); + if (type2 == "spread") return cont(typearg); + return pass(typeexpr); + } + function afterType(type2, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType); + if (value == "|" || type2 == "." || value == "&") return cont(typeexpr); + if (type2 == "[") return cont(typeexpr, expect("]"), afterType); + if (value == "extends" || value == "implements") { + cx.marked = "keyword"; + return cont(typeexpr); + } + if (value == "?") return cont(typeexpr, expect(":"), typeexpr); + } + function maybeTypeArgs(_, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType); + } + function typeparam() { + return pass(typeexpr, maybeTypeDefault); + } + function maybeTypeDefault(_, value) { + if (value == "=") return cont(typeexpr); + } + function vardef(_, value) { + if (value == "enum") { + cx.marked = "keyword"; + return cont(enumdef); + } + return pass(pattern, maybetype, maybeAssign, vardefCont); + } + function pattern(type2, value) { + if (isTS && isModifier(value)) { + cx.marked = "keyword"; + return cont(pattern); + } + if (type2 == "variable") { + register(value); + return cont(); + } + if (type2 == "spread") return cont(pattern); + if (type2 == "[") return contCommasep(eltpattern, "]"); + if (type2 == "{") return contCommasep(proppattern, "}"); + } + function proppattern(type2, value) { + if (type2 == "variable" && !cx.stream.match(/^\s*:/, false)) { + register(value); + return cont(maybeAssign); + } + if (type2 == "variable") cx.marked = "property"; + if (type2 == "spread") return cont(pattern); + if (type2 == "}") return pass(); + if (type2 == "[") return cont(expression, expect("]"), expect(":"), proppattern); + return cont(expect(":"), pattern, maybeAssign); + } + function eltpattern() { + return pass(pattern, maybeAssign); + } + function maybeAssign(_type, value) { + if (value == "=") return cont(expressionNoComma); + } + function vardefCont(type2) { + if (type2 == ",") return cont(vardef); + } + function maybeelse(type2, value) { + if (type2 == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); + } + function forspec(type2, value) { + if (value == "await") return cont(forspec); + if (type2 == "(") return cont(pushlex(")"), forspec1, poplex); + } + function forspec1(type2) { + if (type2 == "var") return cont(vardef, forspec2); + if (type2 == "variable") return cont(forspec2); + return pass(forspec2); + } + function forspec2(type2, value) { + if (type2 == ")") return cont(); + if (type2 == ";") return cont(forspec2); + if (value == "in" || value == "of") { + cx.marked = "keyword"; + return cont(expression, forspec2); + } + return pass(expression, forspec2); + } + function functiondef(type2, value) { + if (value == "*") { + cx.marked = "keyword"; + return cont(functiondef); + } + if (type2 == "variable") { + register(value); + return cont(functiondef); + } + if (type2 == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, statement, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondef); + } + function functiondecl(type2, value) { + if (value == "*") { + cx.marked = "keyword"; + return cont(functiondecl); + } + if (type2 == "variable") { + register(value); + return cont(functiondecl); + } + if (type2 == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondecl); + } + function typename(type2, value) { + if (type2 == "keyword" || type2 == "variable") { + cx.marked = "type"; + return cont(typename); + } else if (value == "<") { + return cont(pushlex(">"), commasep(typeparam, ">"), poplex); + } + } + function funarg(type2, value) { + if (value == "@") cont(expression, funarg); + if (type2 == "spread") return cont(funarg); + if (isTS && isModifier(value)) { + cx.marked = "keyword"; + return cont(funarg); + } + if (isTS && type2 == "this") return cont(maybetype, maybeAssign); + return pass(pattern, maybetype, maybeAssign); + } + function classExpression(type2, value) { + if (type2 == "variable") return className(type2, value); + return classNameAfter(type2, value); + } + function className(type2, value) { + if (type2 == "variable") { + register(value); + return cont(classNameAfter); + } + } + function classNameAfter(type2, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, classNameAfter); + if (value == "extends" || value == "implements" || isTS && type2 == ",") { + if (value == "implements") cx.marked = "keyword"; + return cont(isTS ? typeexpr : expression, classNameAfter); + } + if (type2 == "{") return cont(pushlex("}"), classBody, poplex); + } + function classBody(type2, value) { + if (type2 == "async" || type2 == "variable" && (value == "static" || value == "get" || value == "set" || isTS && isModifier(value)) && cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false)) { + cx.marked = "keyword"; + return cont(classBody); + } + if (type2 == "variable" || cx.style == "keyword") { + cx.marked = "property"; + return cont(classfield, classBody); + } + if (type2 == "number" || type2 == "string") return cont(classfield, classBody); + if (type2 == "[") return cont(expression, maybetype, expect("]"), classfield, classBody); + if (value == "*") { + cx.marked = "keyword"; + return cont(classBody); + } + if (isTS && type2 == "(") return pass(functiondecl, classBody); + if (type2 == ";" || type2 == ",") return cont(classBody); + if (type2 == "}") return cont(); + if (value == "@") return cont(expression, classBody); + } + function classfield(type2, value) { + if (value == "!") return cont(classfield); + if (value == "?") return cont(classfield); + if (type2 == ":") return cont(typeexpr, maybeAssign); + if (value == "=") return cont(expressionNoComma); + var context = cx.state.lexical.prev, + isInterface = context && context.info == "interface"; + return pass(isInterface ? functiondecl : functiondef); + } + function afterExport(type2, value) { + if (value == "*") { + cx.marked = "keyword"; + return cont(maybeFrom, expect(";")); + } + if (value == "default") { + cx.marked = "keyword"; + return cont(expression, expect(";")); + } + if (type2 == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";")); + return pass(statement); + } + function exportField(type2, value) { + if (value == "as") { + cx.marked = "keyword"; + return cont(expect("variable")); + } + if (type2 == "variable") return pass(expressionNoComma, exportField); + } + function afterImport(type2) { + if (type2 == "string") return cont(); + if (type2 == "(") return pass(expression); + if (type2 == ".") return pass(maybeoperatorComma); + return pass(importSpec, maybeMoreImports, maybeFrom); + } + function importSpec(type2, value) { + if (type2 == "{") return contCommasep(importSpec, "}"); + if (type2 == "variable") register(value); + if (value == "*") cx.marked = "keyword"; + return cont(maybeAs); + } + function maybeMoreImports(type2) { + if (type2 == ",") return cont(importSpec, maybeMoreImports); + } + function maybeAs(_type, value) { + if (value == "as") { + cx.marked = "keyword"; + return cont(importSpec); + } + } + function maybeFrom(_type, value) { + if (value == "from") { + cx.marked = "keyword"; + return cont(expression); + } + } + function arrayLiteral(type2) { + if (type2 == "]") return cont(); + return pass(commasep(expressionNoComma, "]")); + } + function enumdef() { + return pass(pushlex("form"), pattern, expect("{"), pushlex("}"), commasep(enummember, "}"), poplex, poplex); + } + function enummember() { + return pass(pattern, maybeAssign); + } + function isContinuedStatement(state, textAfter) { + return state.lastType == "operator" || state.lastType == "," || isOperatorChar.test(textAfter.charAt(0)) || /[,.]/.test(textAfter.charAt(0)); + } + function expressionAllowed(stream, state, backUp) { + return state.tokenize == tokenBase && /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(state.lastType) || state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))); + } + return { + startState: function (basecolumn) { + var state = { + tokenize: tokenBase, + lastType: "sof", + cc: [], + lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + context: parserConfig.localVars && new Context(null, null, false), + indented: basecolumn || 0 + }; + if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") state.globalVars = parserConfig.globalVars; + return state; + }, + token: function (stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) state.lexical.align = false; + state.indented = stream.indentation(); + findFatArrow(stream, state); + } + if (state.tokenize != tokenComment && stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (type == "comment") return style; + state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; + return parseJS(state, style, type, content, stream); + }, + indent: function (state, textAfter) { + if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass; + if (state.tokenize != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), + lexical = state.lexical, + top; + if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { + var c = state.cc[i]; + if (c == poplex) lexical = lexical.prev;else if (c != maybeelse && c != popcontext) break; + } + while ((lexical.type == "stat" || lexical.type == "form") && (firstChar == "}" || (top = state.cc[state.cc.length - 1]) && (top == maybeoperatorComma || top == maybeoperatorNoComma) && !/^[,\.=+\-*:?[\(]/.test(textAfter))) lexical = lexical.prev; + if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") lexical = lexical.prev; + var type2 = lexical.type, + closing = firstChar == type2; + if (type2 == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info.length + 1 : 0);else if (type2 == "form" && firstChar == "{") return lexical.indented;else if (type2 == "form") return lexical.indented + indentUnit;else if (type2 == "stat") return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);else if (lexical.align) return lexical.column + (closing ? 0 : 1);else return lexical.indented + (closing ? 0 : indentUnit); + }, + electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, + blockCommentStart: jsonMode ? null : "/*", + blockCommentEnd: jsonMode ? null : "*/", + blockCommentContinue: jsonMode ? null : " * ", + lineComment: jsonMode ? null : "//", + fold: "brace", + closeBrackets: "()[]{}''\"\"``", + helperType: jsonMode ? "json" : "javascript", + jsonldMode, + jsonMode, + expressionAllowed, + skipExpression: function (state) { + parseJS(state, "atom", "atom", "true", new CodeMirror.StringStream("", 2, null)); + } + }; + }); + CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); + CodeMirror.defineMIME("text/javascript", "javascript"); + CodeMirror.defineMIME("text/ecmascript", "javascript"); + CodeMirror.defineMIME("application/javascript", "javascript"); + CodeMirror.defineMIME("application/x-javascript", "javascript"); + CodeMirror.defineMIME("application/ecmascript", "javascript"); + CodeMirror.defineMIME("application/json", { + name: "javascript", + json: true + }); + CodeMirror.defineMIME("application/x-json", { + name: "javascript", + json: true + }); + CodeMirror.defineMIME("application/manifest+json", { + name: "javascript", + json: true + }); + CodeMirror.defineMIME("application/ld+json", { + name: "javascript", + jsonld: true + }); + CodeMirror.defineMIME("text/typescript", { + name: "javascript", + typescript: true + }); + CodeMirror.defineMIME("application/typescript", { + name: "javascript", + typescript: true + }); + }); +})(); +var javascriptExports = javascript$2.exports; +const javascript = /* @__PURE__ */codemirror.getDefaultExportFromCjs(javascriptExports); +const javascript$1 = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: javascript +}, [javascriptExports]); +exports.javascript = javascript$1; -// ~~strike through~~ -// +/***/ }), -// Insert each marker as a separate text token, and add it to delimiter list -// -function strikethrough_tokenize(state, silent) { - const start = state.pos; - const marker = state.src.charCodeAt(start); - if (silent) { - return false; - } - if (marker !== 0x7E /* ~ */) { - return false; - } - const scanned = state.scanDelims(state.pos, true); - let len = scanned.length; - const ch = String.fromCharCode(marker); - if (len < 2) { - return false; - } - let token; - if (len % 2) { - token = state.push('text', '', 0); - token.content = ch; - len--; - } - for (let i = 0; i < len; i += 2) { - token = state.push('text', '', 0); - token.content = ch + ch; - state.delimiters.push({ - marker, - length: 0, - // disable "rule of 3" length checks meant for emphasis - token: state.tokens.length - 1, - end: -1, - open: scanned.can_open, - close: scanned.can_close - }); - } - state.pos += scanned.length; - return true; -} -function postProcess$1(state, delimiters) { - let token; - const loneMarkers = []; - const max = delimiters.length; - for (let i = 0; i < max; i++) { - const startDelim = delimiters[i]; - if (startDelim.marker !== 0x7E /* ~ */) { - continue; - } - if (startDelim.end === -1) { - continue; - } - const endDelim = delimiters[startDelim.end]; - token = state.tokens[startDelim.token]; - token.type = 's_open'; - token.tag = 's'; - token.nesting = 1; - token.markup = '~~'; - token.content = ''; - token = state.tokens[endDelim.token]; - token.type = 's_close'; - token.tag = 's'; - token.nesting = -1; - token.markup = '~~'; - token.content = ''; - if (state.tokens[endDelim.token - 1].type === 'text' && state.tokens[endDelim.token - 1].content === '~') { - loneMarkers.push(endDelim.token - 1); - } - } +/***/ "../../graphiql-react/dist/jump-to-line.cjs.js": +/*!*****************************************************!*\ + !*** ../../graphiql-react/dist/jump-to-line.cjs.js ***! + \*****************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - // If a marker sequence has an odd number of characters, it's splitted - // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the - // start of the sequence. - // - // So, we have to move all those markers after subsequent s_close tags. - // - while (loneMarkers.length) { - const i = loneMarkers.pop(); - let j = i + 1; - while (j < state.tokens.length && state.tokens[j].type === 's_close') { - j++; - } - j--; - if (i !== j) { - token = state.tokens[j]; - state.tokens[j] = state.tokens[i]; - state.tokens[i] = token; - } - } -} -// Walk through delimiter list and replace text tokens with tags -// -function strikethrough_postProcess(state) { - const tokens_meta = state.tokens_meta; - const max = state.tokens_meta.length; - postProcess$1(state, state.delimiters); - for (let curr = 0; curr < max; curr++) { - if (tokens_meta[curr] && tokens_meta[curr].delimiters) { - postProcess$1(state, tokens_meta[curr].delimiters); + +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +const dialog = __webpack_require__(/*! ./dialog.cjs.js */ "../../graphiql-react/dist/dialog.cjs.js"); +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } } } + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); } -var r_strikethrough = { - tokenize: strikethrough_tokenize, - postProcess: strikethrough_postProcess +var jumpToLine$2 = { + exports: {} }; +(function (module2, exports2) { + (function (mod) { + mod(codemirror.requireCodemirror(), dialog.dialogExports); + })(function (CodeMirror) { + CodeMirror.defineOption("search", { + bottom: false + }); + function dialog2(cm, text, shortText, deflt, f) { + if (cm.openDialog) cm.openDialog(text, f, { + value: deflt, + selectValueOnOpen: true, + bottom: cm.options.search.bottom + });else f(prompt(shortText, deflt)); + } + function getJumpDialog(cm) { + return cm.phrase("Jump to line:") + ' ' + cm.phrase("(Use line:column or scroll% syntax)") + ""; + } + function interpretLine(cm, string) { + var num = Number(string); + if (/^[-+]/.test(string)) return cm.getCursor().line + num;else return num - 1; + } + CodeMirror.commands.jumpToLine = function (cm) { + var cur = cm.getCursor(); + dialog2(cm, getJumpDialog(cm), cm.phrase("Jump to line:"), cur.line + 1 + ":" + cur.ch, function (posStr) { + if (!posStr) return; + var match; + if (match = /^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(posStr)) { + cm.setCursor(interpretLine(cm, match[1]), Number(match[2])); + } else if (match = /^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(posStr)) { + var line = Math.round(cm.lineCount() * Number(match[1]) / 100); + if (/^[-+]/.test(match[1])) line = cur.line + line + 1; + cm.setCursor(line - 1, cur.ch); + } else if (match = /^\s*\:?\s*([\+\-]?\d+)\s*/.exec(posStr)) { + cm.setCursor(interpretLine(cm, match[1]), cur.ch); + } + }); + }; + CodeMirror.keyMap["default"]["Alt-G"] = "jumpToLine"; + }); +})(); +var jumpToLineExports = jumpToLine$2.exports; +const jumpToLine = /* @__PURE__ */codemirror.getDefaultExportFromCjs(jumpToLineExports); +const jumpToLine$1 = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: jumpToLine +}, [jumpToLineExports]); +exports.jumpToLine = jumpToLine$1; -// Process *this* and _that_ -// +/***/ }), -// Insert each marker as a separate text token, and add it to delimiter list -// -function emphasis_tokenize(state, silent) { - const start = state.pos; - const marker = state.src.charCodeAt(start); - if (silent) { - return false; +/***/ "../../graphiql-react/dist/jump.cjs.js": +/*!*********************************************!*\ + !*** ../../graphiql-react/dist/jump.cjs.js ***! + \*********************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + + + +const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); +const SchemaReference = __webpack_require__(/*! ./SchemaReference.cjs.js */ "../../graphiql-react/dist/SchemaReference.cjs.js"); +codemirror.CodeMirror.defineOption("jump", false, (cm, options, old) => { + if (old && old !== codemirror.CodeMirror.Init) { + const oldOnMouseOver = cm.state.jump.onMouseOver; + codemirror.CodeMirror.off(cm.getWrapperElement(), "mouseover", oldOnMouseOver); + const oldOnMouseOut = cm.state.jump.onMouseOut; + codemirror.CodeMirror.off(cm.getWrapperElement(), "mouseout", oldOnMouseOut); + codemirror.CodeMirror.off(document, "keydown", cm.state.jump.onKeyDown); + delete cm.state.jump; } - if (marker !== 0x5F /* _ */ && marker !== 0x2A /* * */) { - return false; + if (options) { + const state = cm.state.jump = { + options, + onMouseOver: onMouseOver.bind(null, cm), + onMouseOut: onMouseOut.bind(null, cm), + onKeyDown: onKeyDown.bind(null, cm) + }; + codemirror.CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); + codemirror.CodeMirror.on(cm.getWrapperElement(), "mouseout", state.onMouseOut); + codemirror.CodeMirror.on(document, "keydown", state.onKeyDown); + } +}); +function onMouseOver(cm, event) { + const target = event.target || event.srcElement; + if (!(target instanceof HTMLElement)) { + return; + } + if ((target === null || target === void 0 ? void 0 : target.nodeName) !== "SPAN") { + return; + } + const box = target.getBoundingClientRect(); + const cursor = { + left: (box.left + box.right) / 2, + top: (box.top + box.bottom) / 2 + }; + cm.state.jump.cursor = cursor; + if (cm.state.jump.isHoldingModifier) { + enableJumpMode(cm); + } +} +function onMouseOut(cm) { + if (!cm.state.jump.isHoldingModifier && cm.state.jump.cursor) { + cm.state.jump.cursor = null; + return; } - const scanned = state.scanDelims(state.pos, marker === 0x2A); - for (let i = 0; i < scanned.length; i++) { - const token = state.push('text', '', 0); - token.content = String.fromCharCode(marker); - state.delimiters.push({ - // Char code of the starting marker (number). - // - marker, - // Total length of these series of delimiters. - // - length: scanned.length, - // A position of the token this delimiter corresponds to. - // - token: state.tokens.length - 1, - // If this delimiter is matched as a valid opener, `end` will be - // equal to its position, otherwise it's `-1`. - // - end: -1, - // Boolean flags that determine if this delimiter could open or close - // an emphasis. - // - open: scanned.can_open, - close: scanned.can_close - }); + if (cm.state.jump.isHoldingModifier && cm.state.jump.marker) { + disableJumpMode(cm); } - state.pos += scanned.length; - return true; } -function postProcess(state, delimiters) { - const max = delimiters.length; - for (let i = max - 1; i >= 0; i--) { - const startDelim = delimiters[i]; - if (startDelim.marker !== 0x5F /* _ */ && startDelim.marker !== 0x2A /* * */) { - continue; +function onKeyDown(cm, event) { + if (cm.state.jump.isHoldingModifier || !isJumpModifier(event.key)) { + return; + } + cm.state.jump.isHoldingModifier = true; + if (cm.state.jump.cursor) { + enableJumpMode(cm); + } + const onKeyUp = upEvent => { + if (upEvent.code !== event.code) { + return; } - - // Process only opening markers - if (startDelim.end === -1) { - continue; + cm.state.jump.isHoldingModifier = false; + if (cm.state.jump.marker) { + disableJumpMode(cm); } - const endDelim = delimiters[startDelim.end]; - - // If the previous delimiter has the same marker and is adjacent to this one, - // merge those into one strong delimiter. - // - // `whatever` -> `whatever` - // - const isStrong = i > 0 && delimiters[i - 1].end === startDelim.end + 1 && - // check that first two markers match and adjacent - delimiters[i - 1].marker === startDelim.marker && delimiters[i - 1].token === startDelim.token - 1 && - // check that last two markers are adjacent (we can safely assume they match) - delimiters[startDelim.end + 1].token === endDelim.token + 1; - const ch = String.fromCharCode(startDelim.marker); - const token_o = state.tokens[startDelim.token]; - token_o.type = isStrong ? 'strong_open' : 'em_open'; - token_o.tag = isStrong ? 'strong' : 'em'; - token_o.nesting = 1; - token_o.markup = isStrong ? ch + ch : ch; - token_o.content = ''; - const token_c = state.tokens[endDelim.token]; - token_c.type = isStrong ? 'strong_close' : 'em_close'; - token_c.tag = isStrong ? 'strong' : 'em'; - token_c.nesting = -1; - token_c.markup = isStrong ? ch + ch : ch; - token_c.content = ''; - if (isStrong) { - state.tokens[delimiters[i - 1].token].content = ''; - state.tokens[delimiters[startDelim.end + 1].token].content = ''; - i--; + codemirror.CodeMirror.off(document, "keyup", onKeyUp); + codemirror.CodeMirror.off(document, "click", onClick); + cm.off("mousedown", onMouseDown); + }; + const onClick = clickEvent => { + const { + destination, + options + } = cm.state.jump; + if (destination) { + options.onClick(destination, clickEvent); } - } + }; + const onMouseDown = (_, downEvent) => { + if (cm.state.jump.destination) { + downEvent.codemirrorIgnore = true; + } + }; + codemirror.CodeMirror.on(document, "keyup", onKeyUp); + codemirror.CodeMirror.on(document, "click", onClick); + cm.on("mousedown", onMouseDown); } - -// Walk through delimiter list and replace text tokens with tags -// -function emphasis_post_process(state) { - const tokens_meta = state.tokens_meta; - const max = state.tokens_meta.length; - postProcess(state, state.delimiters); - for (let curr = 0; curr < max; curr++) { - if (tokens_meta[curr] && tokens_meta[curr].delimiters) { - postProcess(state, tokens_meta[curr].delimiters); +const isMac = typeof navigator !== "undefined" && navigator.userAgent.includes("Mac"); +function isJumpModifier(key) { + return key === (isMac ? "Meta" : "Control"); +} +function enableJumpMode(cm) { + if (cm.state.jump.marker) { + return; + } + const { + cursor, + options + } = cm.state.jump; + const pos = cm.coordsChar(cursor); + const token = cm.getTokenAt(pos, true); + const getDestination = options.getDestination || cm.getHelper(pos, "jump"); + if (getDestination) { + const destination = getDestination(token, options, cm); + if (destination) { + const marker = cm.markText({ + line: pos.line, + ch: token.start + }, { + line: pos.line, + ch: token.end + }, { + className: "CodeMirror-jump-token" + }); + cm.state.jump.marker = marker; + cm.state.jump.destination = destination; } } } -var r_emphasis = { - tokenize: emphasis_tokenize, - postProcess: emphasis_post_process -}; - -// Process [link]( "stuff") - -function link(state, silent) { - let code, label, res, ref; - let href = ''; - let title = ''; - let start = state.pos; - let parseReference = true; - if (state.src.charCodeAt(state.pos) !== 0x5B /* [ */) { - return false; +function disableJumpMode(cm) { + const { + marker + } = cm.state.jump; + cm.state.jump.marker = null; + cm.state.jump.destination = null; + marker.clear(); +} +codemirror.CodeMirror.registerHelper("jump", "graphql", (token, options) => { + if (!options.schema || !options.onClick || !token.state) { + return; } - const oldPos = state.pos; - const max = state.posMax; - const labelStart = state.pos + 1; - const labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true); - - // parser failed to find ']', so it's not a valid link - if (labelEnd < 0) { - return false; + const { + state + } = token; + const { + kind, + step + } = state; + const typeInfo = SchemaReference.getTypeInfo(options.schema, state); + if (kind === "Field" && step === 0 && typeInfo.fieldDef || kind === "AliasedField" && step === 2 && typeInfo.fieldDef) { + return SchemaReference.getFieldReference(typeInfo); } - let pos = labelEnd + 1; - if (pos < max && state.src.charCodeAt(pos) === 0x28 /* ( */) { - // - // Inline link - // + if (kind === "Directive" && step === 1 && typeInfo.directiveDef) { + return SchemaReference.getDirectiveReference(typeInfo); + } + if (kind === "Argument" && step === 0 && typeInfo.argDef) { + return SchemaReference.getArgumentReference(typeInfo); + } + if (kind === "EnumValue" && typeInfo.enumValue) { + return SchemaReference.getEnumValueReference(typeInfo); + } + if (kind === "NamedType" && typeInfo.type) { + return SchemaReference.getTypeReference(typeInfo); + } +}); - // might have found a valid shortcut link, disable reference parsing - parseReference = false; +/***/ }), - // [link]( "title" ) - // ^^ skipping these spaces - pos++; - for (; pos < max; pos++) { - code = state.src.charCodeAt(pos); - if (!isSpace(code) && code !== 0x0A) { - break; - } - } - if (pos >= max) { - return false; - } +/***/ "../../graphiql-react/dist/lint.cjs.js": +/*!*********************************************!*\ + !*** ../../graphiql-react/dist/lint.cjs.js ***! + \*********************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - // [link]( "title" ) - // ^^^^^^ parsing link destination - start = pos; - res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax); - if (res.ok) { - href = state.md.normalizeLink(res.str); - if (state.md.validateLink(href)) { - pos = res.pos; - } else { - href = ''; - } - // [link]( "title" ) - // ^^ skipping these spaces - start = pos; - for (; pos < max; pos++) { - code = state.src.charCodeAt(pos); - if (!isSpace(code) && code !== 0x0A) { - break; + +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } } } - - // [link]( "title" ) - // ^^^^^^^ parsing link title - res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax); - if (pos < max && start !== pos && res.ok) { - title = res.str; - pos = res.pos; - - // [link]( "title" ) - // ^^ skipping these spaces - for (; pos < max; pos++) { - code = state.src.charCodeAt(pos); - if (!isSpace(code) && code !== 0x0A) { + } + } + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); +} +var lint$2 = { + exports: {} +}; +(function (module2, exports2) { + (function (mod) { + mod(codemirror.requireCodemirror()); + })(function (CodeMirror) { + var GUTTER_ID = "CodeMirror-lint-markers"; + var LINT_LINE_ID = "CodeMirror-lint-line-"; + function showTooltip(cm, e, content) { + var tt = document.createElement("div"); + tt.className = "CodeMirror-lint-tooltip cm-s-" + cm.options.theme; + tt.appendChild(content.cloneNode(true)); + if (cm.state.lint.options.selfContain) cm.getWrapperElement().appendChild(tt);else document.body.appendChild(tt); + function position(e2) { + if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position); + tt.style.top = Math.max(0, e2.clientY - tt.offsetHeight - 5) + "px"; + tt.style.left = e2.clientX + 5 + "px"; + } + CodeMirror.on(document, "mousemove", position); + position(e); + if (tt.style.opacity != null) tt.style.opacity = 1; + return tt; + } + function rm(elt) { + if (elt.parentNode) elt.parentNode.removeChild(elt); + } + function hideTooltip(tt) { + if (!tt.parentNode) return; + if (tt.style.opacity == null) rm(tt); + tt.style.opacity = 0; + setTimeout(function () { + rm(tt); + }, 600); + } + function showTooltipFor(cm, e, content, node) { + var tooltip = showTooltip(cm, e, content); + function hide() { + CodeMirror.off(node, "mouseout", hide); + if (tooltip) { + hideTooltip(tooltip); + tooltip = null; + } + } + var poll = setInterval(function () { + if (tooltip) for (var n = node;; n = n.parentNode) { + if (n && n.nodeType == 11) n = n.host; + if (n == document.body) return; + if (!n) { + hide(); break; } } - } + if (!tooltip) return clearInterval(poll); + }, 400); + CodeMirror.on(node, "mouseout", hide); } - if (pos >= max || state.src.charCodeAt(pos) !== 0x29 /* ) */) { - // parsing a valid shortcut link failed, fallback to reference - parseReference = true; + function LintState(cm, conf, hasGutter) { + this.marked = []; + if (conf instanceof Function) conf = { + getAnnotations: conf + }; + if (!conf || conf === true) conf = {}; + this.options = {}; + this.linterOptions = conf.options || {}; + for (var prop in defaults) this.options[prop] = defaults[prop]; + for (var prop in conf) { + if (defaults.hasOwnProperty(prop)) { + if (conf[prop] != null) this.options[prop] = conf[prop]; + } else if (!conf.options) { + this.linterOptions[prop] = conf[prop]; + } + } + this.timeout = null; + this.hasGutter = hasGutter; + this.onMouseOver = function (e) { + onMouseOver(cm, e); + }; + this.waitingFor = 0; } - pos++; - } - if (parseReference) { - // - // Link reference - // - if (typeof state.env.references === 'undefined') { - return false; + var defaults = { + highlightLines: false, + tooltips: true, + delay: 500, + lintOnChange: true, + getAnnotations: null, + async: false, + selfContain: null, + formatAnnotation: null, + onUpdateLinting: null + }; + function clearMarks(cm) { + var state = cm.state.lint; + if (state.hasGutter) cm.clearGutter(GUTTER_ID); + if (state.options.highlightLines) clearErrorLines(cm); + for (var i = 0; i < state.marked.length; ++i) state.marked[i].clear(); + state.marked.length = 0; + } + function clearErrorLines(cm) { + cm.eachLine(function (line) { + var has = line.wrapClass && /\bCodeMirror-lint-line-\w+\b/.exec(line.wrapClass); + if (has) cm.removeLineClass(line, "wrap", has[0]); + }); } - if (pos < max && state.src.charCodeAt(pos) === 0x5B /* [ */) { - start = pos + 1; - pos = state.md.helpers.parseLinkLabel(state, pos); - if (pos >= 0) { - label = state.src.slice(start, pos++); + function makeMarker(cm, labels, severity, multiple, tooltips) { + var marker = document.createElement("div"), + inner = marker; + marker.className = "CodeMirror-lint-marker CodeMirror-lint-marker-" + severity; + if (multiple) { + inner = marker.appendChild(document.createElement("div")); + inner.className = "CodeMirror-lint-marker CodeMirror-lint-marker-multiple"; + } + if (tooltips != false) CodeMirror.on(inner, "mouseover", function (e) { + showTooltipFor(cm, e, labels, inner); + }); + return marker; + } + function getMaxSeverity(a, b) { + if (a == "error") return a;else return b; + } + function groupByLine(annotations) { + var lines = []; + for (var i = 0; i < annotations.length; ++i) { + var ann = annotations[i], + line = ann.from.line; + (lines[line] || (lines[line] = [])).push(ann); + } + return lines; + } + function annotationTooltip(ann) { + var severity = ann.severity; + if (!severity) severity = "error"; + var tip = document.createElement("div"); + tip.className = "CodeMirror-lint-message CodeMirror-lint-message-" + severity; + if (typeof ann.messageHTML != "undefined") { + tip.innerHTML = ann.messageHTML; } else { - pos = labelEnd + 1; + tip.appendChild(document.createTextNode(ann.message)); + } + return tip; + } + function lintAsync(cm, getAnnotations) { + var state = cm.state.lint; + var id = ++state.waitingFor; + function abort() { + id = -1; + cm.off("change", abort); + } + cm.on("change", abort); + getAnnotations(cm.getValue(), function (annotations, arg2) { + cm.off("change", abort); + if (state.waitingFor != id) return; + if (arg2 && annotations instanceof CodeMirror) annotations = arg2; + cm.operation(function () { + updateLinting(cm, annotations); + }); + }, state.linterOptions, cm); + } + function startLinting(cm) { + var state = cm.state.lint; + if (!state) return; + var options = state.options; + var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), "lint"); + if (!getAnnotations) return; + if (options.async || getAnnotations.async) { + lintAsync(cm, getAnnotations); + } else { + var annotations = getAnnotations(cm.getValue(), state.linterOptions, cm); + if (!annotations) return; + if (annotations.then) annotations.then(function (issues) { + cm.operation(function () { + updateLinting(cm, issues); + }); + });else cm.operation(function () { + updateLinting(cm, annotations); + }); } - } else { - pos = labelEnd + 1; } + function updateLinting(cm, annotationsNotSorted) { + var state = cm.state.lint; + if (!state) return; + var options = state.options; + clearMarks(cm); + var annotations = groupByLine(annotationsNotSorted); + for (var line = 0; line < annotations.length; ++line) { + var anns = annotations[line]; + if (!anns) continue; + var message = []; + anns = anns.filter(function (item) { + return message.indexOf(item.message) > -1 ? false : message.push(item.message); + }); + var maxSeverity = null; + var tipLabel = state.hasGutter && document.createDocumentFragment(); + for (var i = 0; i < anns.length; ++i) { + var ann = anns[i]; + var severity = ann.severity; + if (!severity) severity = "error"; + maxSeverity = getMaxSeverity(maxSeverity, severity); + if (options.formatAnnotation) ann = options.formatAnnotation(ann); + if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann)); + if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, { + className: "CodeMirror-lint-mark CodeMirror-lint-mark-" + severity, + __annotation: ann + })); + } + if (state.hasGutter) cm.setGutterMarker(line, GUTTER_ID, makeMarker(cm, tipLabel, maxSeverity, annotations[line].length > 1, options.tooltips)); + if (options.highlightLines) cm.addLineClass(line, "wrap", LINT_LINE_ID + maxSeverity); + } + if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm); + } + function onChange(cm) { + var state = cm.state.lint; + if (!state) return; + clearTimeout(state.timeout); + state.timeout = setTimeout(function () { + startLinting(cm); + }, state.options.delay); + } + function popupTooltips(cm, annotations, e) { + var target = e.target || e.srcElement; + var tooltip = document.createDocumentFragment(); + for (var i = 0; i < annotations.length; i++) { + var ann = annotations[i]; + tooltip.appendChild(annotationTooltip(ann)); + } + showTooltipFor(cm, e, tooltip, target); + } + function onMouseOver(cm, e) { + var target = e.target || e.srcElement; + if (!/\bCodeMirror-lint-mark-/.test(target.className)) return; + var box = target.getBoundingClientRect(), + x = (box.left + box.right) / 2, + y = (box.top + box.bottom) / 2; + var spans = cm.findMarksAt(cm.coordsChar({ + left: x, + top: y + }, "client")); + var annotations = []; + for (var i = 0; i < spans.length; ++i) { + var ann = spans[i].__annotation; + if (ann) annotations.push(ann); + } + if (annotations.length) popupTooltips(cm, annotations, e); + } + CodeMirror.defineOption("lint", false, function (cm, val, old) { + if (old && old != CodeMirror.Init) { + clearMarks(cm); + if (cm.state.lint.options.lintOnChange !== false) cm.off("change", onChange); + CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver); + clearTimeout(cm.state.lint.timeout); + delete cm.state.lint; + } + if (val) { + var gutters = cm.getOption("gutters"), + hasLintGutter = false; + for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true; + var state = cm.state.lint = new LintState(cm, val, hasLintGutter); + if (state.options.lintOnChange) cm.on("change", onChange); + if (state.options.tooltips != false && state.options.tooltips != "gutter") CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); + startLinting(cm); + } + }); + CodeMirror.defineExtension("performLint", function () { + startLinting(this); + }); + }); +})(); +var lintExports = lint$2.exports; +const lint = /* @__PURE__ */codemirror.getDefaultExportFromCjs(lintExports); +const lint$1 = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: lint +}, [lintExports]); +exports.lint = lint$1; - // covers label === '' and label === undefined - // (collapsed reference link and shortcut reference link respectively) - if (!label) { - label = state.src.slice(labelStart, labelEnd); - } - ref = state.env.references[normalizeReference(label)]; - if (!ref) { - state.pos = oldPos; - return false; - } - href = ref.href; - title = ref.title; - } +/***/ }), - // - // We found the end of the link, and know for a fact it's a valid link; - // so all that's left to do is to call tokenizer. - // - if (!silent) { - state.pos = labelStart; - state.posMax = labelEnd; - const token_o = state.push('link_open', 'a', 1); - const attrs = [['href', href]]; - token_o.attrs = attrs; - if (title) { - attrs.push(['title', title]); - } - state.linkLevel++; - state.md.inline.tokenize(state); - state.linkLevel--; - state.push('link_close', 'a', -1); - } - state.pos = pos; - state.posMax = max; - return true; -} +/***/ "../../graphiql-react/dist/lint.cjs2.js": +/*!**********************************************!*\ + !*** ../../graphiql-react/dist/lint.cjs2.js ***! + \**********************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { -// Process ![image]( "title") -function image(state, silent) { - let code, content, label, pos, ref, res, title, start; - let href = ''; - const oldPos = state.pos; - const max = state.posMax; - if (state.src.charCodeAt(state.pos) !== 0x21 /* ! */) { - return false; + +const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); +const graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); +const SEVERITY = ["error", "warning", "information", "hint"]; +const TYPE = { + "GraphQL: Validation": "validation", + "GraphQL: Deprecation": "deprecation", + "GraphQL: Syntax": "syntax" +}; +codemirror.CodeMirror.registerHelper("lint", "graphql", (text, options) => { + const { + schema, + validationRules, + externalFragments + } = options; + const rawResults = graphqlLanguageService.getDiagnostics(text, schema, validationRules, void 0, externalFragments); + const results = rawResults.map(error => ({ + message: error.message, + severity: error.severity ? SEVERITY[error.severity - 1] : SEVERITY[0], + type: error.source ? TYPE[error.source] : void 0, + from: codemirror.CodeMirror.Pos(error.range.start.line, error.range.start.character), + to: codemirror.CodeMirror.Pos(error.range.end.line, error.range.end.character) + })); + return results; +}); + +/***/ }), + +/***/ "../../graphiql-react/dist/lint.cjs3.js": +/*!**********************************************!*\ + !*** ../../graphiql-react/dist/lint.cjs3.js ***! + \**********************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + + + +const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); +const graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +function jsonParse(str) { + string = str; + strLen = str.length; + start = end = lastEnd = -1; + ch(); + lex(); + const ast = parseObj(); + expect("EOF"); + return ast; +} +let string; +let strLen; +let start; +let end; +let lastEnd; +let code; +let kind; +function parseObj() { + const nodeStart = start; + const members = []; + expect("{"); + if (!skip("}")) { + do { + members.push(parseMember()); + } while (skip(",")); + expect("}"); } - if (state.src.charCodeAt(state.pos + 1) !== 0x5B /* [ */) { - return false; + return { + kind: "Object", + start: nodeStart, + end: lastEnd, + members + }; +} +function parseMember() { + const nodeStart = start; + const key = kind === "String" ? curToken() : null; + expect("String"); + expect(":"); + const value = parseVal(); + return { + kind: "Member", + start: nodeStart, + end: lastEnd, + key, + value + }; +} +function parseArr() { + const nodeStart = start; + const values = []; + expect("["); + if (!skip("]")) { + do { + values.push(parseVal()); + } while (skip(",")); + expect("]"); } - const labelStart = state.pos + 2; - const labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false); - - // parser failed to find ']', so it's not a valid link - if (labelEnd < 0) { - return false; + return { + kind: "Array", + start: nodeStart, + end: lastEnd, + values + }; +} +function parseVal() { + switch (kind) { + case "[": + return parseArr(); + case "{": + return parseObj(); + case "String": + case "Number": + case "Boolean": + case "Null": + const token = curToken(); + lex(); + return token; } - pos = labelEnd + 1; - if (pos < max && state.src.charCodeAt(pos) === 0x28 /* ( */) { - // - // Inline link - // - - // [link]( "title" ) - // ^^ skipping these spaces - pos++; - for (; pos < max; pos++) { - code = state.src.charCodeAt(pos); - if (!isSpace(code) && code !== 0x0A) { + expect("Value"); +} +function curToken() { + return { + kind, + start, + end, + value: JSON.parse(string.slice(start, end)) + }; +} +function expect(str) { + if (kind === str) { + lex(); + return; + } + let found; + if (kind === "EOF") { + found = "[end of file]"; + } else if (end - start > 1) { + found = "`" + string.slice(start, end) + "`"; + } else { + const match = string.slice(start).match(/^.+?\b/); + found = "`" + (match ? match[0] : string[start]) + "`"; + } + throw syntaxError(`Expected ${str} but found ${found}.`); +} +class JSONSyntaxError extends Error { + constructor(message, position) { + super(message); + this.position = position; + } +} +function syntaxError(message) { + return new JSONSyntaxError(message, { + start, + end + }); +} +function skip(k) { + if (kind === k) { + lex(); + return true; + } +} +function ch() { + if (end < strLen) { + end++; + code = end === strLen ? 0 : string.charCodeAt(end); + } + return code; +} +function lex() { + lastEnd = end; + while (code === 9 || code === 10 || code === 13 || code === 32) { + ch(); + } + if (code === 0) { + kind = "EOF"; + return; + } + start = end; + switch (code) { + case 34: + kind = "String"; + return readString(); + case 45: + case 48: + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + kind = "Number"; + return readNumber(); + case 102: + if (string.slice(start, start + 5) !== "false") { break; } - } - if (pos >= max) { - return false; - } - - // [link]( "title" ) - // ^^^^^^ parsing link destination - start = pos; - res = state.md.helpers.parseLinkDestination(state.src, pos, state.posMax); - if (res.ok) { - href = state.md.normalizeLink(res.str); - if (state.md.validateLink(href)) { - pos = res.pos; - } else { - href = ''; + end += 4; + ch(); + kind = "Boolean"; + return; + case 110: + if (string.slice(start, start + 4) !== "null") { + break; } - } - - // [link]( "title" ) - // ^^ skipping these spaces - start = pos; - for (; pos < max; pos++) { - code = state.src.charCodeAt(pos); - if (!isSpace(code) && code !== 0x0A) { + end += 3; + ch(); + kind = "Null"; + return; + case 116: + if (string.slice(start, start + 4) !== "true") { break; } - } - - // [link]( "title" ) - // ^^^^^^^ parsing link title - res = state.md.helpers.parseLinkTitle(state.src, pos, state.posMax); - if (pos < max && start !== pos && res.ok) { - title = res.str; - pos = res.pos; - - // [link]( "title" ) - // ^^ skipping these spaces - for (; pos < max; pos++) { - code = state.src.charCodeAt(pos); - if (!isSpace(code) && code !== 0x0A) { + end += 3; + ch(); + kind = "Boolean"; + return; + } + kind = string[start]; + ch(); +} +function readString() { + ch(); + while (code !== 34 && code > 31) { + if (code === 92) { + code = ch(); + switch (code) { + case 34: + case 47: + case 92: + case 98: + case 102: + case 110: + case 114: + case 116: + ch(); break; - } + case 117: + ch(); + readHex(); + readHex(); + readHex(); + readHex(); + break; + default: + throw syntaxError("Bad character escape sequence."); } + } else if (end === strLen) { + throw syntaxError("Unterminated string."); } else { - title = ''; - } - if (pos >= max || state.src.charCodeAt(pos) !== 0x29 /* ) */) { - state.pos = oldPos; - return false; + ch(); } - pos++; + } + if (code === 34) { + ch(); + return; + } + throw syntaxError("Unterminated string."); +} +function readHex() { + if (code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102) { + return ch(); + } + throw syntaxError("Expected hexadecimal digit."); +} +function readNumber() { + if (code === 45) { + ch(); + } + if (code === 48) { + ch(); } else { - // - // Link reference - // - if (typeof state.env.references === 'undefined') { - return false; - } - if (pos < max && state.src.charCodeAt(pos) === 0x5B /* [ */) { - start = pos + 1; - pos = state.md.helpers.parseLinkLabel(state, pos); - if (pos >= 0) { - label = state.src.slice(start, pos++); - } else { - pos = labelEnd + 1; - } - } else { - pos = labelEnd + 1; - } - - // covers label === '' and label === undefined - // (collapsed reference link and shortcut reference link respectively) - if (!label) { - label = state.src.slice(labelStart, labelEnd); - } - ref = state.env.references[normalizeReference(label)]; - if (!ref) { - state.pos = oldPos; - return false; + readDigits(); + } + if (code === 46) { + ch(); + readDigits(); + } + if (code === 69 || code === 101) { + code = ch(); + if (code === 43 || code === 45) { + ch(); } - href = ref.href; - title = ref.title; + readDigits(); } - - // - // We found the end of the link, and know for a fact it's a valid link; - // so all that's left to do is to call tokenizer. - // - if (!silent) { - content = state.src.slice(labelStart, labelEnd); - const tokens = []; - state.md.inline.parse(content, state.md, state.env, tokens); - const token = state.push('image', 'img', 0); - const attrs = [['src', href], ['alt', '']]; - token.attrs = attrs; - token.children = tokens; - token.content = content; - if (title) { - attrs.push(['title', title]); +} +function readDigits() { + if (code < 48 || code > 57) { + throw syntaxError("Expected decimal digit."); + } + do { + ch(); + } while (code >= 48 && code <= 57); +} +codemirror.CodeMirror.registerHelper("lint", "graphql-variables", (text, options, editor) => { + if (!text) { + return []; + } + let ast; + try { + ast = jsonParse(text); + } catch (error) { + if (error instanceof JSONSyntaxError) { + return [lintError(editor, error.position, error.message)]; + } + throw error; + } + const { + variableToType + } = options; + if (!variableToType) { + return []; + } + return validateVariables(editor, variableToType, ast); +}); +function validateVariables(editor, variableToType, variablesAST) { + var _a; + const errors = []; + for (const member of variablesAST.members) { + if (member) { + const variableName = (_a = member.key) === null || _a === void 0 ? void 0 : _a.value; + const type = variableToType[variableName]; + if (type) { + for (const [node, message] of validateValue(type, member.value)) { + errors.push(lintError(editor, node, message)); + } + } else { + errors.push(lintError(editor, member.key, `Variable "$${variableName}" does not appear in any GraphQL query.`)); + } } } - state.pos = pos; - state.posMax = max; - return true; + return errors; } - -// Process autolinks '' - -/* eslint max-len:0 */ -const EMAIL_RE = /^([a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/; -/* eslint-disable-next-line no-control-regex */ -const AUTOLINK_RE = /^([a-zA-Z][a-zA-Z0-9+.-]{1,31}):([^<>\x00-\x20]*)$/; -function autolink(state, silent) { - let pos = state.pos; - if (state.src.charCodeAt(pos) !== 0x3C /* < */) { - return false; - } - const start = state.pos; - const max = state.posMax; - for (;;) { - if (++pos >= max) return false; - const ch = state.src.charCodeAt(pos); - if (ch === 0x3C /* < */) return false; - if (ch === 0x3E /* > */) break; +function validateValue(type, valueAST) { + if (!type || !valueAST) { + return []; } - const url = state.src.slice(start + 1, pos); - if (AUTOLINK_RE.test(url)) { - const fullUrl = state.md.normalizeLink(url); - if (!state.md.validateLink(fullUrl)) { - return false; + if (type instanceof graphql.GraphQLNonNull) { + if (valueAST.kind === "Null") { + return [[valueAST, `Type "${type}" is non-nullable and cannot be null.`]]; } - if (!silent) { - const token_o = state.push('link_open', 'a', 1); - token_o.attrs = [['href', fullUrl]]; - token_o.markup = 'autolink'; - token_o.info = 'auto'; - const token_t = state.push('text', '', 0); - token_t.content = state.md.normalizeLinkText(url); - const token_c = state.push('link_close', 'a', -1); - token_c.markup = 'autolink'; - token_c.info = 'auto'; + return validateValue(type.ofType, valueAST); + } + if (valueAST.kind === "Null") { + return []; + } + if (type instanceof graphql.GraphQLList) { + const itemType = type.ofType; + if (valueAST.kind === "Array") { + const values = valueAST.values || []; + return mapCat(values, item => validateValue(itemType, item)); } - state.pos += url.length + 2; - return true; + return validateValue(itemType, valueAST); } - if (EMAIL_RE.test(url)) { - const fullUrl = state.md.normalizeLink('mailto:' + url); - if (!state.md.validateLink(fullUrl)) { - return false; + if (type instanceof graphql.GraphQLInputObjectType) { + if (valueAST.kind !== "Object") { + return [[valueAST, `Type "${type}" must be an Object.`]]; } - if (!silent) { - const token_o = state.push('link_open', 'a', 1); - token_o.attrs = [['href', fullUrl]]; - token_o.markup = 'autolink'; - token_o.info = 'auto'; - const token_t = state.push('text', '', 0); - token_t.content = state.md.normalizeLinkText(url); - const token_c = state.push('link_close', 'a', -1); - token_c.markup = 'autolink'; - token_c.info = 'auto'; + const providedFields = /* @__PURE__ */Object.create(null); + const fieldErrors = mapCat(valueAST.members, member => { + var _a; + const fieldName = (_a = member === null || member === void 0 ? void 0 : member.key) === null || _a === void 0 ? void 0 : _a.value; + providedFields[fieldName] = true; + const inputField = type.getFields()[fieldName]; + if (!inputField) { + return [[member.key, `Type "${type}" does not have a field "${fieldName}".`]]; + } + const fieldType = inputField ? inputField.type : void 0; + return validateValue(fieldType, member.value); + }); + for (const fieldName of Object.keys(type.getFields())) { + const field = type.getFields()[fieldName]; + if (!providedFields[fieldName] && field.type instanceof graphql.GraphQLNonNull && !field.defaultValue) { + fieldErrors.push([valueAST, `Object of type "${type}" is missing required field "${fieldName}".`]); + } } - state.pos += url.length + 2; - return true; + return fieldErrors; } - return false; + if (type.name === "Boolean" && valueAST.kind !== "Boolean" || type.name === "String" && valueAST.kind !== "String" || type.name === "ID" && valueAST.kind !== "Number" && valueAST.kind !== "String" || type.name === "Float" && valueAST.kind !== "Number" || type.name === "Int" && (valueAST.kind !== "Number" || (valueAST.value | 0) !== valueAST.value)) { + return [[valueAST, `Expected value of type "${type}".`]]; + } + if ((type instanceof graphql.GraphQLEnumType || type instanceof graphql.GraphQLScalarType) && (valueAST.kind !== "String" && valueAST.kind !== "Number" && valueAST.kind !== "Boolean" && valueAST.kind !== "Null" || isNullish(type.parseValue(valueAST.value)))) { + return [[valueAST, `Expected value of type "${type}".`]]; + } + return []; } - -// Process html tags - -function isLinkOpen(str) { - return /^\s]/i.test(str); +function lintError(editor, node, message) { + return { + message, + severity: "error", + type: "validation", + from: editor.posFromIndex(node.start), + to: editor.posFromIndex(node.end) + }; } -function isLinkClose(str) { - return /^<\/a\s*>/i.test(str); +function isNullish(value) { + return value === null || value === void 0 || value !== value; } -function isLetter(ch) { - /* eslint no-bitwise:0 */ - const lc = ch | 0x20; // to lower case - return lc >= 0x61 /* a */ && lc <= 0x7a /* z */; +function mapCat(array, mapper) { + return Array.prototype.concat.apply([], array.map(mapper)); } -function html_inline(state, silent) { - if (!state.md.options.html) { - return false; - } +/***/ }), - // Check start - const max = state.posMax; - const pos = state.pos; - if (state.src.charCodeAt(pos) !== 0x3C /* < */ || pos + 2 >= max) { - return false; - } +/***/ "../../graphiql-react/dist/matchbrackets.cjs.js": +/*!******************************************************!*\ + !*** ../../graphiql-react/dist/matchbrackets.cjs.js ***! + \******************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - // Quick fail on second char - const ch = state.src.charCodeAt(pos + 1); - if (ch !== 0x21 /* ! */ && ch !== 0x3F /* ? */ && ch !== 0x2F /* / */ && !isLetter(ch)) { - return false; - } - const match = state.src.slice(pos).match(HTML_TAG_RE); - if (!match) { - return false; - } - if (!silent) { - const token = state.push('html_inline', '', 0); - token.content = match[0]; - if (isLinkOpen(token.content)) state.linkLevel++; - if (isLinkClose(token.content)) state.linkLevel--; + + +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +const matchbrackets$2 = __webpack_require__(/*! ./matchbrackets.cjs2.js */ "../../graphiql-react/dist/matchbrackets.cjs2.js"); +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } + } } - state.pos += match[0].length; - return true; + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); } +var matchbracketsExports = matchbrackets$2.requireMatchbrackets(); +const matchbrackets = /* @__PURE__ */codemirror.getDefaultExportFromCjs(matchbracketsExports); +const matchbrackets$1 = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: matchbrackets +}, [matchbracketsExports]); +exports.matchbrackets = matchbrackets$1; -// Process html entity - {, ¯, ", ... +/***/ }), -const DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i; -const NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i; -function entity(state, silent) { - const pos = state.pos; - const max = state.posMax; - if (state.src.charCodeAt(pos) !== 0x26 /* & */) return false; - if (pos + 1 >= max) return false; - const ch = state.src.charCodeAt(pos + 1); - if (ch === 0x23 /* # */) { - const match = state.src.slice(pos).match(DIGITAL_RE); - if (match) { - if (!silent) { - const code = match[1][0].toLowerCase() === 'x' ? parseInt(match[1].slice(1), 16) : parseInt(match[1], 10); - const token = state.push('text_special', '', 0); - token.content = isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD); - token.markup = match[0]; - token.info = 'entity'; +/***/ "../../graphiql-react/dist/matchbrackets.cjs2.js": +/*!*******************************************************!*\ + !*** ../../graphiql-react/dist/matchbrackets.cjs2.js ***! + \*******************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +var matchbrackets = { + exports: {} +}; +var hasRequiredMatchbrackets; +function requireMatchbrackets() { + if (hasRequiredMatchbrackets) return matchbrackets.exports; + hasRequiredMatchbrackets = 1; + (function (module2, exports2) { + (function (mod) { + mod(codemirror.requireCodemirror()); + })(function (CodeMirror) { + var ie_lt8 = /MSIE \d/.test(navigator.userAgent) && (document.documentMode == null || document.documentMode < 8); + var Pos = CodeMirror.Pos; + var matching = { + "(": ")>", + ")": "(<", + "[": "]>", + "]": "[<", + "{": "}>", + "}": "{<", + "<": ">>", + ">": "<<" + }; + function bracketRegex(config) { + return config && config.bracketRegex || /[(){}[\]]/; + } + function findMatchingBracket(cm, where, config) { + var line = cm.getLineHandle(where.line), + pos = where.ch - 1; + var afterCursor = config && config.afterCursor; + if (afterCursor == null) afterCursor = /(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className); + var re = bracketRegex(config); + var match = !afterCursor && pos >= 0 && re.test(line.text.charAt(pos)) && matching[line.text.charAt(pos)] || re.test(line.text.charAt(pos + 1)) && matching[line.text.charAt(++pos)]; + if (!match) return null; + var dir = match.charAt(1) == ">" ? 1 : -1; + if (config && config.strict && dir > 0 != (pos == where.ch)) return null; + var style = cm.getTokenTypeAt(Pos(where.line, pos + 1)); + var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style, config); + if (found == null) return null; + return { + from: Pos(where.line, pos), + to: found && found.pos, + match: found && found.ch == match.charAt(0), + forward: dir > 0 + }; } - state.pos += match[0].length; - return true; - } - } else { - const match = state.src.slice(pos).match(NAMED_RE); - if (match) { - const decoded = entities.decodeHTML(match[0]); - if (decoded !== match[0]) { - if (!silent) { - const token = state.push('text_special', '', 0); - token.content = decoded; - token.markup = match[0]; - token.info = 'entity'; + function scanForBracket(cm, where, dir, style, config) { + var maxScanLen = config && config.maxScanLineLength || 1e4; + var maxScanLines = config && config.maxScanLines || 1e3; + var stack = []; + var re = bracketRegex(config); + var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1) : Math.max(cm.firstLine() - 1, where.line - maxScanLines); + for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) { + var line = cm.getLine(lineNo); + if (!line) continue; + var pos = dir > 0 ? 0 : line.length - 1, + end = dir > 0 ? line.length : -1; + if (line.length > maxScanLen) continue; + if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0); + for (; pos != end; pos += dir) { + var ch = line.charAt(pos); + if (re.test(ch) && (style === void 0 || (cm.getTokenTypeAt(Pos(lineNo, pos + 1)) || "") == (style || ""))) { + var match = matching[ch]; + if (match && match.charAt(1) == ">" == dir > 0) stack.push(ch);else if (!stack.length) return { + pos: Pos(lineNo, pos), + ch + };else stack.pop(); + } + } + } + return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null; + } + function matchBrackets(cm, autoclear, config) { + var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1e3, + highlightNonMatching = config && config.highlightNonMatching; + var marks = [], + ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config); + if (match && (match.match || highlightNonMatching !== false) && cm.getLine(match.from.line).length <= maxHighlightLen) { + var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; + marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), { + className: style + })); + if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen) marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), { + className: style + })); + } + } + if (marks.length) { + if (ie_lt8 && cm.state.focused) cm.focus(); + var clear = function () { + cm.operation(function () { + for (var i2 = 0; i2 < marks.length; i2++) marks[i2].clear(); + }); + }; + if (autoclear) setTimeout(clear, 800);else return clear; } - state.pos += match[0].length; - return true; } - } - } - return false; + function doMatchBrackets(cm) { + cm.operation(function () { + if (cm.state.matchBrackets.currentlyHighlighted) { + cm.state.matchBrackets.currentlyHighlighted(); + cm.state.matchBrackets.currentlyHighlighted = null; + } + cm.state.matchBrackets.currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets); + }); + } + function clearHighlighted(cm) { + if (cm.state.matchBrackets && cm.state.matchBrackets.currentlyHighlighted) { + cm.state.matchBrackets.currentlyHighlighted(); + cm.state.matchBrackets.currentlyHighlighted = null; + } + } + CodeMirror.defineOption("matchBrackets", false, function (cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.off("cursorActivity", doMatchBrackets); + cm.off("focus", doMatchBrackets); + cm.off("blur", clearHighlighted); + clearHighlighted(cm); + } + if (val) { + cm.state.matchBrackets = typeof val == "object" ? val : {}; + cm.on("cursorActivity", doMatchBrackets); + cm.on("focus", doMatchBrackets); + cm.on("blur", clearHighlighted); + } + }); + CodeMirror.defineExtension("matchBrackets", function () { + matchBrackets(this, true); + }); + CodeMirror.defineExtension("findMatchingBracket", function (pos, config, oldConfig) { + if (oldConfig || typeof config == "boolean") { + if (!oldConfig) { + config = config ? { + strict: true + } : null; + } else { + oldConfig.strict = config; + config = oldConfig; + } + } + return findMatchingBracket(this, pos, config); + }); + CodeMirror.defineExtension("scanForBracket", function (pos, dir, style, config) { + return scanForBracket(this, pos, dir, style, config); + }); + }); + })(); + return matchbrackets.exports; } +exports.requireMatchbrackets = requireMatchbrackets; -// For each opening emphasis-like marker find a matching closing one -// +/***/ }), -function processDelimiters(delimiters) { - const openersBottom = {}; - const max = delimiters.length; - if (!max) return; +/***/ "../../graphiql-react/dist/mode-indent.cjs.js": +/*!****************************************************!*\ + !*** ../../graphiql-react/dist/mode-indent.cjs.js ***! + \****************************************************/ +/***/ (function(__unused_webpack_module, exports) { - // headerIdx is the first delimiter of the current (where closer is) delimiter run - let headerIdx = 0; - let lastTokenIdx = -2; // needs any value lower than -1 - const jumps = []; - for (let closerIdx = 0; closerIdx < max; closerIdx++) { - const closer = delimiters[closerIdx]; - jumps.push(0); - // markers belong to same delimiter run if: - // - they have adjacent tokens - // - AND markers are the same - // - if (delimiters[headerIdx].marker !== closer.marker || lastTokenIdx !== closer.token - 1) { - headerIdx = closerIdx; - } - lastTokenIdx = closer.token; - // Length is only used for emphasis-specific "rule of 3", - // if it's not defined (in strikethrough or 3rd party plugins), - // we can default it to 0 to disable those checks. - // - closer.length = closer.length || 0; - if (!closer.close) continue; +function indent(state, textAfter) { + var _a, _b; + const { + levels, + indentLevel + } = state; + const level = !levels || levels.length === 0 ? indentLevel : levels.at(-1) - (((_a = this.electricInput) === null || _a === void 0 ? void 0 : _a.test(textAfter)) ? 1 : 0); + return (level || 0) * (((_b = this.config) === null || _b === void 0 ? void 0 : _b.indentUnit) || 0); +} +exports.indent = indent; - // Previously calculated lower bounds (previous fails) - // for each marker, each delimiter length modulo 3, - // and for whether this closer can be an opener; - // https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460 - /* eslint-disable-next-line no-prototype-builtins */ - if (!openersBottom.hasOwnProperty(closer.marker)) { - openersBottom[closer.marker] = [-1, -1, -1, -1, -1, -1]; +/***/ }), + +/***/ "../../graphiql-react/dist/mode.cjs.js": +/*!*********************************************!*\ + !*** ../../graphiql-react/dist/mode.cjs.js ***! + \*********************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + + + +const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); +const graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); +const modeIndent = __webpack_require__(/*! ./mode-indent.cjs.js */ "../../graphiql-react/dist/mode-indent.cjs.js"); +const graphqlModeFactory = config => { + const parser = graphqlLanguageService.onlineParser({ + eatWhitespace: stream => stream.eatWhile(graphqlLanguageService.isIgnored), + lexRules: graphqlLanguageService.LexRules, + parseRules: graphqlLanguageService.ParseRules, + editorConfig: { + tabSize: config.tabSize } - const minOpenerIdx = openersBottom[closer.marker][(closer.open ? 3 : 0) + closer.length % 3]; - let openerIdx = headerIdx - jumps[headerIdx] - 1; - let newMinOpenerIdx = openerIdx; - for (; openerIdx > minOpenerIdx; openerIdx -= jumps[openerIdx] + 1) { - const opener = delimiters[openerIdx]; - if (opener.marker !== closer.marker) continue; - if (opener.open && opener.end < 0) { - let isOddMatch = false; + }); + return { + config, + startState: parser.startState, + token: parser.token, + indent: modeIndent.indent, + electricInput: /^\s*[})\]]/, + fold: "brace", + lineComment: "#", + closeBrackets: { + pairs: '()[]{}""', + explode: "()[]{}" + } + }; +}; +codemirror.CodeMirror.defineMode("graphql", graphqlModeFactory); - // from spec: - // - // If one of the delimiters can both open and close emphasis, then the - // sum of the lengths of the delimiter runs containing the opening and - // closing delimiters must not be a multiple of 3 unless both lengths - // are multiples of 3. - // - if (opener.close || closer.open) { - if ((opener.length + closer.length) % 3 === 0) { - if (opener.length % 3 !== 0 || closer.length % 3 !== 0) { - isOddMatch = true; - } - } +/***/ }), + +/***/ "../../graphiql-react/dist/mode.cjs2.js": +/*!**********************************************!*\ + !*** ../../graphiql-react/dist/mode.cjs2.js ***! + \**********************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + + + +const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); +const graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); +const modeIndent = __webpack_require__(/*! ./mode-indent.cjs.js */ "../../graphiql-react/dist/mode-indent.cjs.js"); +codemirror.CodeMirror.defineMode("graphql-variables", config => { + const parser = graphqlLanguageService.onlineParser({ + eatWhitespace: stream => stream.eatSpace(), + lexRules: LexRules, + parseRules: ParseRules, + editorConfig: { + tabSize: config.tabSize + } + }); + return { + config, + startState: parser.startState, + token: parser.token, + indent: modeIndent.indent, + electricInput: /^\s*[}\]]/, + fold: "brace", + closeBrackets: { + pairs: '[]{}""', + explode: "[]{}" + } + }; +}); +const LexRules = { + Punctuation: /^\[|]|\{|\}|:|,/, + Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/, + String: /^"(?:[^"\\]|\\(?:"|\/|\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*"?/, + Keyword: /^true|false|null/ +}; +const ParseRules = { + Document: [graphqlLanguageService.p("{"), graphqlLanguageService.list("Variable", graphqlLanguageService.opt(graphqlLanguageService.p(","))), graphqlLanguageService.p("}")], + Variable: [namedKey("variable"), graphqlLanguageService.p(":"), "Value"], + Value(token) { + switch (token.kind) { + case "Number": + return "NumberValue"; + case "String": + return "StringValue"; + case "Punctuation": + switch (token.value) { + case "[": + return "ListValue"; + case "{": + return "ObjectValue"; } - if (!isOddMatch) { - // If previous delimiter cannot be an opener, we can safely skip - // the entire sequence in future checks. This is required to make - // sure algorithm has linear complexity (see *_*_*_*_*_... case). - // - const lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open ? jumps[openerIdx - 1] + 1 : 0; - jumps[closerIdx] = closerIdx - openerIdx + lastJump; - jumps[openerIdx] = lastJump; - closer.open = false; - opener.end = closerIdx; - opener.close = false; - newMinOpenerIdx = -1; - // treat next token as start of run, - // it optimizes skips in **<...>**a**<...>** pathological case - lastTokenIdx = -2; - break; + return null; + case "Keyword": + switch (token.value) { + case "true": + case "false": + return "BooleanValue"; + case "null": + return "NullValue"; } - } + return null; } - if (newMinOpenerIdx !== -1) { - // If match for this delimiter run failed, we want to set lower bound for - // future lookups. This is required to make sure algorithm has linear - // complexity. - // - // See details here: - // https://github.com/commonmark/cmark/issues/178#issuecomment-270417442 - // - openersBottom[closer.marker][(closer.open ? 3 : 0) + (closer.length || 0) % 3] = newMinOpenerIdx; + }, + NumberValue: [graphqlLanguageService.t("Number", "number")], + StringValue: [graphqlLanguageService.t("String", "string")], + BooleanValue: [graphqlLanguageService.t("Keyword", "builtin")], + NullValue: [graphqlLanguageService.t("Keyword", "keyword")], + ListValue: [graphqlLanguageService.p("["), graphqlLanguageService.list("Value", graphqlLanguageService.opt(graphqlLanguageService.p(","))), graphqlLanguageService.p("]")], + ObjectValue: [graphqlLanguageService.p("{"), graphqlLanguageService.list("ObjectField", graphqlLanguageService.opt(graphqlLanguageService.p(","))), graphqlLanguageService.p("}")], + ObjectField: [namedKey("attribute"), graphqlLanguageService.p(":"), "Value"] +}; +function namedKey(style) { + return { + style, + match: token => token.kind === "String", + update(state, token) { + state.name = token.value.slice(1, -1); } - } + }; } -function link_pairs(state) { - const tokens_meta = state.tokens_meta; - const max = state.tokens_meta.length; - processDelimiters(state.delimiters); - for (let curr = 0; curr < max; curr++) { - if (tokens_meta[curr] && tokens_meta[curr].delimiters) { - processDelimiters(tokens_meta[curr].delimiters); + +/***/ }), + +/***/ "../../graphiql-react/dist/mode.cjs3.js": +/*!**********************************************!*\ + !*** ../../graphiql-react/dist/mode.cjs3.js ***! + \**********************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + + + +const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); +const graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); +const modeIndent = __webpack_require__(/*! ./mode-indent.cjs.js */ "../../graphiql-react/dist/mode-indent.cjs.js"); +codemirror.CodeMirror.defineMode("graphql-results", config => { + const parser = graphqlLanguageService.onlineParser({ + eatWhitespace: stream => stream.eatSpace(), + lexRules: LexRules, + parseRules: ParseRules, + editorConfig: { + tabSize: config.tabSize + } + }); + return { + config, + startState: parser.startState, + token: parser.token, + indent: modeIndent.indent, + electricInput: /^\s*[}\]]/, + fold: "brace", + closeBrackets: { + pairs: '[]{}""', + explode: "[]{}" + } + }; +}); +const LexRules = { + Punctuation: /^\[|]|\{|\}|:|,/, + Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/, + String: /^"(?:[^"\\]|\\(?:"|\/|\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*"?/, + Keyword: /^true|false|null/ +}; +const ParseRules = { + Document: [graphqlLanguageService.p("{"), graphqlLanguageService.list("Entry", graphqlLanguageService.p(",")), graphqlLanguageService.p("}")], + Entry: [graphqlLanguageService.t("String", "def"), graphqlLanguageService.p(":"), "Value"], + Value(token) { + switch (token.kind) { + case "Number": + return "NumberValue"; + case "String": + return "StringValue"; + case "Punctuation": + switch (token.value) { + case "[": + return "ListValue"; + case "{": + return "ObjectValue"; + } + return null; + case "Keyword": + switch (token.value) { + case "true": + case "false": + return "BooleanValue"; + case "null": + return "NullValue"; + } + return null; + } + }, + NumberValue: [graphqlLanguageService.t("Number", "number")], + StringValue: [graphqlLanguageService.t("String", "string")], + BooleanValue: [graphqlLanguageService.t("Keyword", "builtin")], + NullValue: [graphqlLanguageService.t("Keyword", "keyword")], + ListValue: [graphqlLanguageService.p("["), graphqlLanguageService.list("Value", graphqlLanguageService.p(",")), graphqlLanguageService.p("]")], + ObjectValue: [graphqlLanguageService.p("{"), graphqlLanguageService.list("ObjectField", graphqlLanguageService.p(",")), graphqlLanguageService.p("}")], + ObjectField: [graphqlLanguageService.t("String", "property"), graphqlLanguageService.p(":"), "Value"] +}; + +/***/ }), + +/***/ "../../graphiql-react/dist/search.cjs.js": +/*!***********************************************!*\ + !*** ../../graphiql-react/dist/search.cjs.js ***! + \***********************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +const searchcursor = __webpack_require__(/*! ./searchcursor.cjs2.js */ "../../graphiql-react/dist/searchcursor.cjs2.js"); +const dialog = __webpack_require__(/*! ./dialog.cjs.js */ "../../graphiql-react/dist/dialog.cjs.js"); +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } } } + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); } +var search$2 = { + exports: {} +}; +(function (module2, exports2) { + (function (mod) { + mod(codemirror.requireCodemirror(), searchcursor.requireSearchcursor(), dialog.dialogExports); + })(function (CodeMirror) { + CodeMirror.defineOption("search", { + bottom: false + }); + function searchOverlay(query, caseInsensitive) { + if (typeof query == "string") query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), caseInsensitive ? "gi" : "g");else if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "gi" : "g"); + return { + token: function (stream) { + query.lastIndex = stream.pos; + var match = query.exec(stream.string); + if (match && match.index == stream.pos) { + stream.pos += match[0].length || 1; + return "searching"; + } else if (match) { + stream.pos = match.index; + } else { + stream.skipToEnd(); + } + } + }; + } + function SearchState() { + this.posFrom = this.posTo = this.lastQuery = this.query = null; + this.overlay = null; + } + function getSearchState(cm) { + return cm.state.search || (cm.state.search = new SearchState()); + } + function queryCaseInsensitive(query) { + return typeof query == "string" && query == query.toLowerCase(); + } + function getSearchCursor(cm, query, pos) { + return cm.getSearchCursor(query, pos, { + caseFold: queryCaseInsensitive(query), + multiline: true + }); + } + function persistentDialog(cm, text, deflt, onEnter, onKeyDown) { + cm.openDialog(text, onEnter, { + value: deflt, + selectValueOnOpen: true, + closeOnEnter: false, + onClose: function () { + clearSearch(cm); + }, + onKeyDown, + bottom: cm.options.search.bottom + }); + } + function dialog2(cm, text, shortText, deflt, f) { + if (cm.openDialog) cm.openDialog(text, f, { + value: deflt, + selectValueOnOpen: true, + bottom: cm.options.search.bottom + });else f(prompt(shortText, deflt)); + } + function confirmDialog(cm, text, shortText, fs) { + if (cm.openConfirm) cm.openConfirm(text, fs);else if (confirm(shortText)) fs[0](); + } + function parseString(string) { + return string.replace(/\\([nrt\\])/g, function (match, ch) { + if (ch == "n") return "\n"; + if (ch == "r") return "\r"; + if (ch == "t") return " "; + if (ch == "\\") return "\\"; + return match; + }); + } + function parseQuery(query) { + var isRE = query.match(/^\/(.*)\/([a-z]*)$/); + if (isRE) { + try { + query = new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i"); + } catch (e) {} + } else { + query = parseString(query); + } + if (typeof query == "string" ? query == "" : query.test("")) query = /x^/; + return query; + } + function startSearch(cm, state, query) { + state.queryText = query; + state.query = parseQuery(query); + cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query)); + state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query)); + cm.addOverlay(state.overlay); + if (cm.showMatchesOnScrollbar) { + if (state.annotate) { + state.annotate.clear(); + state.annotate = null; + } + state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query)); + } + } + function doSearch(cm, rev, persistent, immediate) { + var state = getSearchState(cm); + if (state.query) return findNext(cm, rev); + var q = cm.getSelection() || state.lastQuery; + if (q instanceof RegExp && q.source == "x^") q = null; + if (persistent && cm.openDialog) { + var hiding = null; + var searchNext = function (query, event) { + CodeMirror.e_stop(event); + if (!query) return; + if (query != state.queryText) { + startSearch(cm, state, query); + state.posFrom = state.posTo = cm.getCursor(); + } + if (hiding) hiding.style.opacity = 1; + findNext(cm, event.shiftKey, function (_, to) { + var dialog3; + if (to.line < 3 && document.querySelector && (dialog3 = cm.display.wrapper.querySelector(".CodeMirror-dialog")) && dialog3.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, "window").top) (hiding = dialog3).style.opacity = 0.4; + }); + }; + persistentDialog(cm, getQueryDialog(cm), q, searchNext, function (event, query) { + var keyName = CodeMirror.keyName(event); + var extra = cm.getOption("extraKeys"), + cmd = extra && extra[keyName] || CodeMirror.keyMap[cm.getOption("keyMap")][keyName]; + if (cmd == "findNext" || cmd == "findPrev" || cmd == "findPersistentNext" || cmd == "findPersistentPrev") { + CodeMirror.e_stop(event); + startSearch(cm, getSearchState(cm), query); + cm.execCommand(cmd); + } else if (cmd == "find" || cmd == "findPersistent") { + CodeMirror.e_stop(event); + searchNext(query, event); + } + }); + if (immediate && q) { + startSearch(cm, state, q); + findNext(cm, rev); + } + } else { + dialog2(cm, getQueryDialog(cm), "Search for:", q, function (query) { + if (query && !state.query) cm.operation(function () { + startSearch(cm, state, query); + state.posFrom = state.posTo = cm.getCursor(); + findNext(cm, rev); + }); + }); + } + } + function findNext(cm, rev, callback) { + cm.operation(function () { + var state = getSearchState(cm); + var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo); + if (!cursor.find(rev)) { + cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0)); + if (!cursor.find(rev)) return; + } + cm.setSelection(cursor.from(), cursor.to()); + cm.scrollIntoView({ + from: cursor.from(), + to: cursor.to() + }, 20); + state.posFrom = cursor.from(); + state.posTo = cursor.to(); + if (callback) callback(cursor.from(), cursor.to()); + }); + } + function clearSearch(cm) { + cm.operation(function () { + var state = getSearchState(cm); + state.lastQuery = state.query; + if (!state.query) return; + state.query = state.queryText = null; + cm.removeOverlay(state.overlay); + if (state.annotate) { + state.annotate.clear(); + state.annotate = null; + } + }); + } + function el(tag, attrs) { + var element = tag ? document.createElement(tag) : document.createDocumentFragment(); + for (var key in attrs) { + element[key] = attrs[key]; + } + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i]; + element.appendChild(typeof child == "string" ? document.createTextNode(child) : child); + } + return element; + } + function getQueryDialog(cm) { + return el("", null, el("span", { + className: "CodeMirror-search-label" + }, cm.phrase("Search:")), " ", el("input", { + type: "text", + "style": "width: 10em", + className: "CodeMirror-search-field" + }), " ", el("span", { + style: "color: #888", + className: "CodeMirror-search-hint" + }, cm.phrase("(Use /re/ syntax for regexp search)"))); + } + function getReplaceQueryDialog(cm) { + return el("", null, " ", el("input", { + type: "text", + "style": "width: 10em", + className: "CodeMirror-search-field" + }), " ", el("span", { + style: "color: #888", + className: "CodeMirror-search-hint" + }, cm.phrase("(Use /re/ syntax for regexp search)"))); + } + function getReplacementQueryDialog(cm) { + return el("", null, el("span", { + className: "CodeMirror-search-label" + }, cm.phrase("With:")), " ", el("input", { + type: "text", + "style": "width: 10em", + className: "CodeMirror-search-field" + })); + } + function getDoReplaceConfirm(cm) { + return el("", null, el("span", { + className: "CodeMirror-search-label" + }, cm.phrase("Replace?")), " ", el("button", {}, cm.phrase("Yes")), " ", el("button", {}, cm.phrase("No")), " ", el("button", {}, cm.phrase("All")), " ", el("button", {}, cm.phrase("Stop"))); + } + function replaceAll(cm, query, text) { + cm.operation(function () { + for (var cursor = getSearchCursor(cm, query); cursor.findNext();) { + if (typeof query != "string") { + var match = cm.getRange(cursor.from(), cursor.to()).match(query); + cursor.replace(text.replace(/\$(\d)/g, function (_, i) { + return match[i]; + })); + } else cursor.replace(text); + } + }); + } + function replace(cm, all) { + if (cm.getOption("readOnly")) return; + var query = cm.getSelection() || getSearchState(cm).lastQuery; + var dialogText = all ? cm.phrase("Replace all:") : cm.phrase("Replace:"); + var fragment = el("", null, el("span", { + className: "CodeMirror-search-label" + }, dialogText), getReplaceQueryDialog(cm)); + dialog2(cm, fragment, dialogText, query, function (query2) { + if (!query2) return; + query2 = parseQuery(query2); + dialog2(cm, getReplacementQueryDialog(cm), cm.phrase("Replace with:"), "", function (text) { + text = parseString(text); + if (all) { + replaceAll(cm, query2, text); + } else { + clearSearch(cm); + var cursor = getSearchCursor(cm, query2, cm.getCursor("from")); + var advance = function () { + var start = cursor.from(), + match; + if (!(match = cursor.findNext())) { + cursor = getSearchCursor(cm, query2); + if (!(match = cursor.findNext()) || start && cursor.from().line == start.line && cursor.from().ch == start.ch) return; + } + cm.setSelection(cursor.from(), cursor.to()); + cm.scrollIntoView({ + from: cursor.from(), + to: cursor.to() + }); + confirmDialog(cm, getDoReplaceConfirm(cm), cm.phrase("Replace?"), [function () { + doReplace(match); + }, advance, function () { + replaceAll(cm, query2, text); + }]); + }; + var doReplace = function (match) { + cursor.replace(typeof query2 == "string" ? text : text.replace(/\$(\d)/g, function (_, i) { + return match[i]; + })); + advance(); + }; + advance(); + } + }); + }); + } + CodeMirror.commands.find = function (cm) { + clearSearch(cm); + doSearch(cm); + }; + CodeMirror.commands.findPersistent = function (cm) { + clearSearch(cm); + doSearch(cm, false, true); + }; + CodeMirror.commands.findPersistentNext = function (cm) { + doSearch(cm, false, true, true); + }; + CodeMirror.commands.findPersistentPrev = function (cm) { + doSearch(cm, true, true, true); + }; + CodeMirror.commands.findNext = doSearch; + CodeMirror.commands.findPrev = function (cm) { + doSearch(cm, true); + }; + CodeMirror.commands.clearSearch = clearSearch; + CodeMirror.commands.replace = replace; + CodeMirror.commands.replaceAll = function (cm) { + replace(cm, true); + }; + }); +})(); +var searchExports = search$2.exports; +const search = /* @__PURE__ */codemirror.getDefaultExportFromCjs(searchExports); +const search$1 = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: search +}, [searchExports]); +exports.search = search$1; -// Clean up tokens after emphasis and strikethrough postprocessing: -// merge adjacent text nodes into one and re-calculate all token levels -// -// This is necessary because initially emphasis delimiter markers (*, _, ~) -// are treated as their own separate text tokens. Then emphasis rule either -// leaves them as text (needed to merge with adjacent text) or turns them -// into opening/closing tags (which messes up levels inside). -// +/***/ }), -function fragments_join(state) { - let curr, last; - let level = 0; - const tokens = state.tokens; - const max = state.tokens.length; - for (curr = last = 0; curr < max; curr++) { - // re-calculate levels after emphasis/strikethrough turns some text nodes - // into opening/closing tags - if (tokens[curr].nesting < 0) level--; // closing tag - tokens[curr].level = level; - if (tokens[curr].nesting > 0) level++; // opening tag +/***/ "../../graphiql-react/dist/searchcursor.cjs.js": +/*!*****************************************************!*\ + !*** ../../graphiql-react/dist/searchcursor.cjs.js ***! + \*****************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - if (tokens[curr].type === 'text' && curr + 1 < max && tokens[curr + 1].type === 'text') { - // collapse two adjacent text nodes - tokens[curr + 1].content = tokens[curr].content + tokens[curr + 1].content; - } else { - if (curr !== last) { - tokens[last] = tokens[curr]; + + +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +const searchcursor$2 = __webpack_require__(/*! ./searchcursor.cjs2.js */ "../../graphiql-react/dist/searchcursor.cjs2.js"); +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } } - last++; } } - if (curr !== last) { - tokens.length = last; - } + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); } +var searchcursorExports = searchcursor$2.requireSearchcursor(); +const searchcursor = /* @__PURE__ */codemirror.getDefaultExportFromCjs(searchcursorExports); +const searchcursor$1 = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: searchcursor +}, [searchcursorExports]); +exports.searchcursor = searchcursor$1; -/** internal - * class ParserInline - * - * Tokenizes paragraph content. - **/ - -// Parser rules - -const _rules = [['text', text], ['linkify', linkify], ['newline', newline], ['escape', escape], ['backticks', backtick], ['strikethrough', r_strikethrough.tokenize], ['emphasis', r_emphasis.tokenize], ['link', link], ['image', image], ['autolink', autolink], ['html_inline', html_inline], ['entity', entity]]; +/***/ }), -// `rule2` ruleset was created specifically for emphasis/strikethrough -// post-processing and may be changed in the future. -// -// Don't use this for anything except pairs (plugins working with `balance_pairs`). -// -const _rules2 = [['balance_pairs', link_pairs], ['strikethrough', r_strikethrough.postProcess], ['emphasis', r_emphasis.postProcess], -// rules for pairs separate '**' into its own text tokens, which may be left unused, -// rule below merges unused segments back with the rest of the text -['fragments_join', fragments_join]]; +/***/ "../../graphiql-react/dist/searchcursor.cjs2.js": +/*!******************************************************!*\ + !*** ../../graphiql-react/dist/searchcursor.cjs2.js ***! + \******************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -/** - * new ParserInline() - **/ -function ParserInline() { - /** - * ParserInline#ruler -> Ruler - * - * [[Ruler]] instance. Keep configuration of inline rules. - **/ - this.ruler = new Ruler(); - for (let i = 0; i < _rules.length; i++) { - this.ruler.push(_rules[i][0], _rules[i][1]); - } - /** - * ParserInline#ruler2 -> Ruler - * - * [[Ruler]] instance. Second ruler used for post-processing - * (e.g. in emphasis-like rules). - **/ - this.ruler2 = new Ruler(); - for (let i = 0; i < _rules2.length; i++) { - this.ruler2.push(_rules2[i][0], _rules2[i][1]); - } -} -// Skip single token by running all rules in validation mode; -// returns `true` if any rule reported success -// -ParserInline.prototype.skipToken = function (state) { - const pos = state.pos; - const rules = this.ruler.getRules(''); - const len = rules.length; - const maxNesting = state.md.options.maxNesting; - const cache = state.cache; - if (typeof cache[pos] !== 'undefined') { - state.pos = cache[pos]; - return; - } - let ok = false; - if (state.level < maxNesting) { - for (let i = 0; i < len; i++) { - // Increment state.level and decrement it later to limit recursion. - // It's harmless to do here, because no tokens are created. But ideally, - // we'd need a separate private state variable for this purpose. - // - state.level++; - ok = rules[i](state, true); - state.level--; - if (ok) { - if (pos >= state.pos) { - throw new Error("inline rule didn't increment state.pos"); +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +var searchcursor = { + exports: {} +}; +var hasRequiredSearchcursor; +function requireSearchcursor() { + if (hasRequiredSearchcursor) return searchcursor.exports; + hasRequiredSearchcursor = 1; + (function (module2, exports2) { + (function (mod) { + mod(codemirror.requireCodemirror()); + })(function (CodeMirror) { + var Pos = CodeMirror.Pos; + function regexpFlags(regexp) { + var flags = regexp.flags; + return flags != null ? flags : (regexp.ignoreCase ? "i" : "") + (regexp.global ? "g" : "") + (regexp.multiline ? "m" : ""); + } + function ensureFlags(regexp, flags) { + var current = regexpFlags(regexp), + target = current; + for (var i = 0; i < flags.length; i++) if (target.indexOf(flags.charAt(i)) == -1) target += flags.charAt(i); + return current == target ? regexp : new RegExp(regexp.source, target); + } + function maybeMultiline(regexp) { + return /\\s|\\n|\n|\\W|\\D|\[\^/.test(regexp.source); + } + function searchRegexpForward(doc, regexp, start) { + regexp = ensureFlags(regexp, "g"); + for (var line = start.line, ch = start.ch, last = doc.lastLine(); line <= last; line++, ch = 0) { + regexp.lastIndex = ch; + var string = doc.getLine(line), + match = regexp.exec(string); + if (match) return { + from: Pos(line, match.index), + to: Pos(line, match.index + match[0].length), + match + }; } - break; } - } - } else { - // Too much nesting, just skip until the end of the paragraph. - // - // NOTE: this will cause links to behave incorrectly in the following case, - // when an amount of `[` is exactly equal to `maxNesting + 1`: - // - // [[[[[[[[[[[[[[[[[[[[[foo]() - // - // TODO: remove this workaround when CM standard will allow nested links - // (we can replace it by preventing links from being parsed in - // validation mode) - // - state.pos = state.posMax; - } - if (!ok) { - state.pos++; - } - cache[pos] = state.pos; -}; - -// Generate tokens for input range -// -ParserInline.prototype.tokenize = function (state) { - const rules = this.ruler.getRules(''); - const len = rules.length; - const end = state.posMax; - const maxNesting = state.md.options.maxNesting; - while (state.pos < end) { - // Try all possible rules. - // On success, rule should: - // - // - update `state.pos` - // - update `state.tokens` - // - return true - const prevPos = state.pos; - let ok = false; - if (state.level < maxNesting) { - for (let i = 0; i < len; i++) { - ok = rules[i](state, false); - if (ok) { - if (prevPos >= state.pos) { - throw new Error("inline rule didn't increment state.pos"); + function searchRegexpForwardMultiline(doc, regexp, start) { + if (!maybeMultiline(regexp)) return searchRegexpForward(doc, regexp, start); + regexp = ensureFlags(regexp, "gm"); + var string, + chunk = 1; + for (var line = start.line, last = doc.lastLine(); line <= last;) { + for (var i = 0; i < chunk; i++) { + if (line > last) break; + var curLine = doc.getLine(line++); + string = string == null ? curLine : string + "\n" + curLine; + } + chunk = chunk * 2; + regexp.lastIndex = start.ch; + var match = regexp.exec(string); + if (match) { + var before = string.slice(0, match.index).split("\n"), + inside = match[0].split("\n"); + var startLine = start.line + before.length - 1, + startCh = before[before.length - 1].length; + return { + from: Pos(startLine, startCh), + to: Pos(startLine + inside.length - 1, inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length), + match + }; } - break; } } - } - if (ok) { - if (state.pos >= end) { - break; + function lastMatchIn(string, regexp, endMargin) { + var match, + from = 0; + while (from <= string.length) { + regexp.lastIndex = from; + var newMatch = regexp.exec(string); + if (!newMatch) break; + var end = newMatch.index + newMatch[0].length; + if (end > string.length - endMargin) break; + if (!match || end > match.index + match[0].length) match = newMatch; + from = newMatch.index + 1; + } + return match; } - continue; - } - state.pending += state.src[state.pos++]; - } - if (state.pending) { - state.pushPending(); - } -}; - -/** - * ParserInline.parse(str, md, env, outTokens) - * - * Process input string and push inline tokens into `outTokens` - **/ -ParserInline.prototype.parse = function (str, md, env, outTokens) { - const state = new this.State(str, md, env, outTokens); - this.tokenize(state); - const rules = this.ruler2.getRules(''); - const len = rules.length; - for (let i = 0; i < len; i++) { - rules[i](state); - } -}; -ParserInline.prototype.State = StateInline; - -// markdown-it default options + function searchRegexpBackward(doc, regexp, start) { + regexp = ensureFlags(regexp, "g"); + for (var line = start.line, ch = start.ch, first = doc.firstLine(); line >= first; line--, ch = -1) { + var string = doc.getLine(line); + var match = lastMatchIn(string, regexp, ch < 0 ? 0 : string.length - ch); + if (match) return { + from: Pos(line, match.index), + to: Pos(line, match.index + match[0].length), + match + }; + } + } + function searchRegexpBackwardMultiline(doc, regexp, start) { + if (!maybeMultiline(regexp)) return searchRegexpBackward(doc, regexp, start); + regexp = ensureFlags(regexp, "gm"); + var string, + chunkSize = 1, + endMargin = doc.getLine(start.line).length - start.ch; + for (var line = start.line, first = doc.firstLine(); line >= first;) { + for (var i = 0; i < chunkSize && line >= first; i++) { + var curLine = doc.getLine(line--); + string = string == null ? curLine : curLine + "\n" + string; + } + chunkSize *= 2; + var match = lastMatchIn(string, regexp, endMargin); + if (match) { + var before = string.slice(0, match.index).split("\n"), + inside = match[0].split("\n"); + var startLine = line + before.length, + startCh = before[before.length - 1].length; + return { + from: Pos(startLine, startCh), + to: Pos(startLine + inside.length - 1, inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length), + match + }; + } + } + } + var doFold, noFold; + if (String.prototype.normalize) { + doFold = function (str) { + return str.normalize("NFD").toLowerCase(); + }; + noFold = function (str) { + return str.normalize("NFD"); + }; + } else { + doFold = function (str) { + return str.toLowerCase(); + }; + noFold = function (str) { + return str; + }; + } + function adjustPos(orig, folded, pos, foldFunc) { + if (orig.length == folded.length) return pos; + for (var min = 0, max = pos + Math.max(0, orig.length - folded.length);;) { + if (min == max) return min; + var mid = min + max >> 1; + var len = foldFunc(orig.slice(0, mid)).length; + if (len == pos) return mid;else if (len > pos) max = mid;else min = mid + 1; + } + } + function searchStringForward(doc, query, start, caseFold) { + if (!query.length) return null; + var fold = caseFold ? doFold : noFold; + var lines = fold(query).split(/\r|\n\r?/); + search: for (var line = start.line, ch = start.ch, last = doc.lastLine() + 1 - lines.length; line <= last; line++, ch = 0) { + var orig = doc.getLine(line).slice(ch), + string = fold(orig); + if (lines.length == 1) { + var found = string.indexOf(lines[0]); + if (found == -1) continue search; + var start = adjustPos(orig, string, found, fold) + ch; + return { + from: Pos(line, adjustPos(orig, string, found, fold) + ch), + to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold) + ch) + }; + } else { + var cutFrom = string.length - lines[0].length; + if (string.slice(cutFrom) != lines[0]) continue search; + for (var i = 1; i < lines.length - 1; i++) if (fold(doc.getLine(line + i)) != lines[i]) continue search; + var end = doc.getLine(line + lines.length - 1), + endString = fold(end), + lastLine = lines[lines.length - 1]; + if (endString.slice(0, lastLine.length) != lastLine) continue search; + return { + from: Pos(line, adjustPos(orig, string, cutFrom, fold) + ch), + to: Pos(line + lines.length - 1, adjustPos(end, endString, lastLine.length, fold)) + }; + } + } + } + function searchStringBackward(doc, query, start, caseFold) { + if (!query.length) return null; + var fold = caseFold ? doFold : noFold; + var lines = fold(query).split(/\r|\n\r?/); + search: for (var line = start.line, ch = start.ch, first = doc.firstLine() - 1 + lines.length; line >= first; line--, ch = -1) { + var orig = doc.getLine(line); + if (ch > -1) orig = orig.slice(0, ch); + var string = fold(orig); + if (lines.length == 1) { + var found = string.lastIndexOf(lines[0]); + if (found == -1) continue search; + return { + from: Pos(line, adjustPos(orig, string, found, fold)), + to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold)) + }; + } else { + var lastLine = lines[lines.length - 1]; + if (string.slice(0, lastLine.length) != lastLine) continue search; + for (var i = 1, start = line - lines.length + 1; i < lines.length - 1; i++) if (fold(doc.getLine(start + i)) != lines[i]) continue search; + var top = doc.getLine(line + 1 - lines.length), + topString = fold(top); + if (topString.slice(topString.length - lines[0].length) != lines[0]) continue search; + return { + from: Pos(line + 1 - lines.length, adjustPos(top, topString, top.length - lines[0].length, fold)), + to: Pos(line, adjustPos(orig, string, lastLine.length, fold)) + }; + } + } + } + function SearchCursor(doc, query, pos, options) { + this.atOccurrence = false; + this.afterEmptyMatch = false; + this.doc = doc; + pos = pos ? doc.clipPos(pos) : Pos(0, 0); + this.pos = { + from: pos, + to: pos + }; + var caseFold; + if (typeof options == "object") { + caseFold = options.caseFold; + } else { + caseFold = options; + options = null; + } + if (typeof query == "string") { + if (caseFold == null) caseFold = false; + this.matches = function (reverse, pos2) { + return (reverse ? searchStringBackward : searchStringForward)(doc, query, pos2, caseFold); + }; + } else { + query = ensureFlags(query, "gm"); + if (!options || options.multiline !== false) this.matches = function (reverse, pos2) { + return (reverse ? searchRegexpBackwardMultiline : searchRegexpForwardMultiline)(doc, query, pos2); + };else this.matches = function (reverse, pos2) { + return (reverse ? searchRegexpBackward : searchRegexpForward)(doc, query, pos2); + }; + } + } + SearchCursor.prototype = { + findNext: function () { + return this.find(false); + }, + findPrevious: function () { + return this.find(true); + }, + find: function (reverse) { + var head = this.doc.clipPos(reverse ? this.pos.from : this.pos.to); + if (this.afterEmptyMatch && this.atOccurrence) { + head = Pos(head.line, head.ch); + if (reverse) { + head.ch--; + if (head.ch < 0) { + head.line--; + head.ch = (this.doc.getLine(head.line) || "").length; + } + } else { + head.ch++; + if (head.ch > (this.doc.getLine(head.line) || "").length) { + head.ch = 0; + head.line++; + } + } + if (CodeMirror.cmpPos(head, this.doc.clipPos(head)) != 0) { + return this.atOccurrence = false; + } + } + var result = this.matches(reverse, head); + this.afterEmptyMatch = result && CodeMirror.cmpPos(result.from, result.to) == 0; + if (result) { + this.pos = result; + this.atOccurrence = true; + return this.pos.match || true; + } else { + var end = Pos(reverse ? this.doc.firstLine() : this.doc.lastLine() + 1, 0); + this.pos = { + from: end, + to: end + }; + return this.atOccurrence = false; + } + }, + from: function () { + if (this.atOccurrence) return this.pos.from; + }, + to: function () { + if (this.atOccurrence) return this.pos.to; + }, + replace: function (newText, origin) { + if (!this.atOccurrence) return; + var lines = CodeMirror.splitLines(newText); + this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin); + this.pos.to = Pos(this.pos.from.line + lines.length - 1, lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0)); + } + }; + CodeMirror.defineExtension("getSearchCursor", function (query, pos, caseFold) { + return new SearchCursor(this.doc, query, pos, caseFold); + }); + CodeMirror.defineDocExtension("getSearchCursor", function (query, pos, caseFold) { + return new SearchCursor(this, query, pos, caseFold); + }); + CodeMirror.defineExtension("selectMatches", function (query, caseFold) { + var ranges = []; + var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold); + while (cur.findNext()) { + if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break; + ranges.push({ + anchor: cur.from(), + head: cur.to() + }); + } + if (ranges.length) this.setSelections(ranges, 0); + }); + }); + })(); + return searchcursor.exports; +} +exports.requireSearchcursor = requireSearchcursor; -var cfg_default = { - options: { - // Enable HTML tags in source - html: false, - // Use '/' to close single tags (
) - xhtmlOut: false, - // Convert '\n' in paragraphs into
- breaks: false, - // CSS language prefix for fenced blocks - langPrefix: 'language-', - // autoconvert URL-like texts to links - linkify: false, - // Enable some language-neutral replacements + quotes beautification - typographer: false, - // Double + single quotes replacement pairs, when typographer enabled, - // and smartquotes on. Could be either a String or an Array. - // - // For example, you can use '«»„“' for Russian, '„“‚‘' for German, - // and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp). - quotes: '\u201c\u201d\u2018\u2019', - /* “”‘’ */ +/***/ }), - // Highlighter function. Should return escaped HTML, - // or '' if the source string is not changed and should be escaped externaly. - // If result starts with ) - xhtmlOut: false, - // Convert '\n' in paragraphs into
- breaks: false, - // CSS language prefix for fenced blocks - langPrefix: 'language-', - // autoconvert URL-like texts to links - linkify: false, - // Enable some language-neutral replacements + quotes beautification - typographer: false, - // Double + single quotes replacement pairs, when typographer enabled, - // and smartquotes on. Could be either a String or an Array. - // - // For example, you can use '«»„“' for Russian, '„“‚‘' for German, - // and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp). - quotes: '\u201c\u201d\u2018\u2019', - /* “”‘’ */ - // Highlighter function. Should return escaped HTML, - // or '' if the source string is not changed and should be escaped externaly. - // If result starts with e[k] + }); + } + } + } } } + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); +} +var showHint$2 = { + exports: {} }; - -// Commonmark default options - -var cfg_commonmark = { - options: { - // Enable HTML tags in source - html: true, - // Use '/' to close single tags (
) - xhtmlOut: true, - // Convert '\n' in paragraphs into
- breaks: false, - // CSS language prefix for fenced blocks - langPrefix: 'language-', - // autoconvert URL-like texts to links - linkify: false, - // Enable some language-neutral replacements + quotes beautification - typographer: false, - // Double + single quotes replacement pairs, when typographer enabled, - // and smartquotes on. Could be either a String or an Array. - // - // For example, you can use '«»„“' for Russian, '„“‚‘' for German, - // and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp). - quotes: '\u201c\u201d\u2018\u2019', - /* “”‘’ */ - - // Highlighter function. Should return escaped HTML, - // or '' if the source string is not changed and should be escaped externaly. - // If result starts with 1) return; + if (this.somethingSelected()) { + if (!options.hint.supportsSelection) return; + for (var i = 0; i < selections.length; i++) if (selections[i].head.line != selections[i].anchor.line) return; + } + if (this.state.completionActive) this.state.completionActive.close(); + var completion = this.state.completionActive = new Completion(this, options); + if (!completion.options.hint) return; + CodeMirror.signal(this, "startCompletion", this); + completion.update(true); + }); + CodeMirror.defineExtension("closeHint", function () { + if (this.state.completionActive) this.state.completionActive.close(); + }); + function Completion(cm, options) { + this.cm = cm; + this.options = options; + this.widget = null; + this.debounce = 0; + this.tick = 0; + this.startPos = this.cm.getCursor("start"); + this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length; + if (this.options.updateOnCursorActivity) { + var self = this; + cm.on("cursorActivity", this.activityFunc = function () { + self.cursorActivity(); + }); + } + } + var requestAnimationFrame = window.requestAnimationFrame || function (fn) { + return setTimeout(fn, 1e3 / 60); + }; + var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout; + Completion.prototype = { + close: function () { + if (!this.active()) return; + this.cm.state.completionActive = null; + this.tick = null; + if (this.options.updateOnCursorActivity) { + this.cm.off("cursorActivity", this.activityFunc); + } + if (this.widget && this.data) CodeMirror.signal(this.data, "close"); + if (this.widget) this.widget.close(); + CodeMirror.signal(this.cm, "endCompletion", this.cm); + }, + active: function () { + return this.cm.state.completionActive == this; + }, + pick: function (data, i) { + var completion = data.list[i], + self = this; + this.cm.operation(function () { + if (completion.hint) completion.hint(self.cm, data, completion);else self.cm.replaceRange(getText(completion), completion.from || data.from, completion.to || data.to, "complete"); + CodeMirror.signal(data, "pick", completion); + self.cm.scrollIntoView(); + }); + if (this.options.closeOnPick) { + this.close(); + } + }, + cursorActivity: function () { + if (this.debounce) { + cancelAnimationFrame(this.debounce); + this.debounce = 0; + } + var identStart = this.startPos; + if (this.data) { + identStart = this.data.from; + } + var pos = this.cm.getCursor(), + line = this.cm.getLine(pos.line); + if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch || pos.ch < identStart.ch || this.cm.somethingSelected() || !pos.ch || this.options.closeCharacters.test(line.charAt(pos.ch - 1))) { + this.close(); + } else { + var self = this; + this.debounce = requestAnimationFrame(function () { + self.update(); + }); + if (this.widget) this.widget.disable(); + } + }, + update: function (first) { + if (this.tick == null) return; + var self = this, + myTick = ++this.tick; + fetchHints(this.options.hint, this.cm, this.options, function (data) { + if (self.tick == myTick) self.finishUpdate(data, first); + }); + }, + finishUpdate: function (data, first) { + if (this.data) CodeMirror.signal(this.data, "update"); + var picked = this.widget && this.widget.picked || first && this.options.completeSingle; + if (this.widget) this.widget.close(); + this.data = data; + if (data && data.list.length) { + if (picked && data.list.length == 1) { + this.pick(data, 0); + } else { + this.widget = new Widget(this, data); + CodeMirror.signal(data, "shown"); + } + } + } + }; + function parseOptions(cm, pos, options) { + var editor = cm.options.hintOptions; + var out = {}; + for (var prop in defaultOptions) out[prop] = defaultOptions[prop]; + if (editor) { + for (var prop in editor) if (editor[prop] !== void 0) out[prop] = editor[prop]; + } + if (options) { + for (var prop in options) if (options[prop] !== void 0) out[prop] = options[prop]; + } + if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos); + return out; + } + function getText(completion) { + if (typeof completion == "string") return completion;else return completion.text; + } + function buildKeyMap(completion, handle) { + var baseMap = { + Up: function () { + handle.moveFocus(-1); + }, + Down: function () { + handle.moveFocus(1); + }, + PageUp: function () { + handle.moveFocus(-handle.menuSize() + 1, true); + }, + PageDown: function () { + handle.moveFocus(handle.menuSize() - 1, true); + }, + Home: function () { + handle.setFocus(0); + }, + End: function () { + handle.setFocus(handle.length - 1); + }, + Enter: handle.pick, + Tab: handle.pick, + Esc: handle.close + }; + var mac = /Mac/.test(navigator.platform); + if (mac) { + baseMap["Ctrl-P"] = function () { + handle.moveFocus(-1); + }; + baseMap["Ctrl-N"] = function () { + handle.moveFocus(1); + }; + } + var custom = completion.options.customKeys; + var ourMap = custom ? {} : baseMap; + function addBinding(key2, val) { + var bound; + if (typeof val != "string") bound = function (cm) { + return val(cm, handle); + };else if (baseMap.hasOwnProperty(val)) bound = baseMap[val];else bound = val; + ourMap[key2] = bound; + } + if (custom) { + for (var key in custom) if (custom.hasOwnProperty(key)) addBinding(key, custom[key]); + } + var extra = completion.options.extraKeys; + if (extra) { + for (var key in extra) if (extra.hasOwnProperty(key)) addBinding(key, extra[key]); + } + return ourMap; + } + function getHintElement(hintsElement, el) { + while (el && el != hintsElement) { + if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el; + el = el.parentNode; + } + } + function Widget(completion, data) { + this.id = "cm-complete-" + Math.floor(Math.random(1e6)); + this.completion = completion; + this.data = data; + this.picked = false; + var widget = this, + cm = completion.cm; + var ownerDocument = cm.getInputField().ownerDocument; + var parentWindow = ownerDocument.defaultView || ownerDocument.parentWindow; + var hints = this.hints = ownerDocument.createElement("ul"); + hints.setAttribute("role", "listbox"); + hints.setAttribute("aria-expanded", "true"); + hints.id = this.id; + var theme = completion.cm.options.theme; + hints.className = "CodeMirror-hints " + theme; + this.selectedHint = data.selectedHint || 0; + var completions = data.list; + for (var i = 0; i < completions.length; ++i) { + var elt = hints.appendChild(ownerDocument.createElement("li")), + cur = completions[i]; + var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS); + if (cur.className != null) className = cur.className + " " + className; + elt.className = className; + if (i == this.selectedHint) elt.setAttribute("aria-selected", "true"); + elt.id = this.id + "-" + i; + elt.setAttribute("role", "option"); + if (cur.render) cur.render(elt, data, cur);else elt.appendChild(ownerDocument.createTextNode(cur.displayText || getText(cur))); + elt.hintId = i; + } + var container = completion.options.container || ownerDocument.body; + var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null); + var left = pos.left, + top = pos.bottom, + below = true; + var offsetLeft = 0, + offsetTop = 0; + if (container !== ownerDocument.body) { + var isContainerPositioned = ["absolute", "relative", "fixed"].indexOf(parentWindow.getComputedStyle(container).position) !== -1; + var offsetParent = isContainerPositioned ? container : container.offsetParent; + var offsetParentPosition = offsetParent.getBoundingClientRect(); + var bodyPosition = ownerDocument.body.getBoundingClientRect(); + offsetLeft = offsetParentPosition.left - bodyPosition.left - offsetParent.scrollLeft; + offsetTop = offsetParentPosition.top - bodyPosition.top - offsetParent.scrollTop; + } + hints.style.left = left - offsetLeft + "px"; + hints.style.top = top - offsetTop + "px"; + var winW = parentWindow.innerWidth || Math.max(ownerDocument.body.offsetWidth, ownerDocument.documentElement.offsetWidth); + var winH = parentWindow.innerHeight || Math.max(ownerDocument.body.offsetHeight, ownerDocument.documentElement.offsetHeight); + container.appendChild(hints); + cm.getInputField().setAttribute("aria-autocomplete", "list"); + cm.getInputField().setAttribute("aria-owns", this.id); + cm.getInputField().setAttribute("aria-activedescendant", this.id + "-" + this.selectedHint); + var box = completion.options.moveOnOverlap ? hints.getBoundingClientRect() : new DOMRect(); + var scrolls = completion.options.paddingForScrollbar ? hints.scrollHeight > hints.clientHeight + 1 : false; + var startScroll; + setTimeout(function () { + startScroll = cm.getScrollInfo(); + }); + var overlapY = box.bottom - winH; + if (overlapY > 0) { + var height = box.bottom - box.top, + curTop = pos.top - (pos.bottom - box.top); + if (curTop - height > 0) { + hints.style.top = (top = pos.top - height - offsetTop) + "px"; + below = false; + } else if (height > winH) { + hints.style.height = winH - 5 + "px"; + hints.style.top = (top = pos.bottom - box.top - offsetTop) + "px"; + var cursor = cm.getCursor(); + if (data.from.ch != cursor.ch) { + pos = cm.cursorCoords(cursor); + hints.style.left = (left = pos.left - offsetLeft) + "px"; + box = hints.getBoundingClientRect(); + } + } + } + var overlapX = box.right - winW; + if (scrolls) overlapX += cm.display.nativeBarWidth; + if (overlapX > 0) { + if (box.right - box.left > winW) { + hints.style.width = winW - 5 + "px"; + overlapX -= box.right - box.left - winW; + } + hints.style.left = (left = pos.left - overlapX - offsetLeft) + "px"; + } + if (scrolls) for (var node = hints.firstChild; node; node = node.nextSibling) node.style.paddingRight = cm.display.nativeBarWidth + "px"; + cm.addKeyMap(this.keyMap = buildKeyMap(completion, { + moveFocus: function (n, avoidWrap) { + widget.changeActive(widget.selectedHint + n, avoidWrap); + }, + setFocus: function (n) { + widget.changeActive(n); + }, + menuSize: function () { + return widget.screenAmount(); + }, + length: completions.length, + close: function () { + completion.close(); + }, + pick: function () { + widget.pick(); + }, + data + })); + if (completion.options.closeOnUnfocus) { + var closingOnBlur; + cm.on("blur", this.onBlur = function () { + closingOnBlur = setTimeout(function () { + completion.close(); + }, 100); + }); + cm.on("focus", this.onFocus = function () { + clearTimeout(closingOnBlur); + }); + } + cm.on("scroll", this.onScroll = function () { + var curScroll = cm.getScrollInfo(), + editor = cm.getWrapperElement().getBoundingClientRect(); + if (!startScroll) startScroll = cm.getScrollInfo(); + var newTop = top + startScroll.top - curScroll.top; + var point = newTop - (parentWindow.pageYOffset || (ownerDocument.documentElement || ownerDocument.body).scrollTop); + if (!below) point += hints.offsetHeight; + if (point <= editor.top || point >= editor.bottom) return completion.close(); + hints.style.top = newTop + "px"; + hints.style.left = left + startScroll.left - curScroll.left + "px"; + }); + CodeMirror.on(hints, "dblclick", function (e) { + var t = getHintElement(hints, e.target || e.srcElement); + if (t && t.hintId != null) { + widget.changeActive(t.hintId); + widget.pick(); + } + }); + CodeMirror.on(hints, "click", function (e) { + var t = getHintElement(hints, e.target || e.srcElement); + if (t && t.hintId != null) { + widget.changeActive(t.hintId); + if (completion.options.completeOnSingleClick) widget.pick(); + } + }); + CodeMirror.on(hints, "mousedown", function () { + setTimeout(function () { + cm.focus(); + }, 20); + }); + var selectedHintRange = this.getSelectedHintRange(); + if (selectedHintRange.from !== 0 || selectedHintRange.to !== 0) { + this.scrollToActive(); + } + CodeMirror.signal(data, "select", completions[this.selectedHint], hints.childNodes[this.selectedHint]); + return true; + } + Widget.prototype = { + close: function () { + if (this.completion.widget != this) return; + this.completion.widget = null; + if (this.hints.parentNode) this.hints.parentNode.removeChild(this.hints); + this.completion.cm.removeKeyMap(this.keyMap); + var input = this.completion.cm.getInputField(); + input.removeAttribute("aria-activedescendant"); + input.removeAttribute("aria-owns"); + var cm = this.completion.cm; + if (this.completion.options.closeOnUnfocus) { + cm.off("blur", this.onBlur); + cm.off("focus", this.onFocus); + } + cm.off("scroll", this.onScroll); + }, + disable: function () { + this.completion.cm.removeKeyMap(this.keyMap); + var widget = this; + this.keyMap = { + Enter: function () { + widget.picked = true; + } + }; + this.completion.cm.addKeyMap(this.keyMap); + }, + pick: function () { + this.completion.pick(this.data, this.selectedHint); + }, + changeActive: function (i, avoidWrap) { + if (i >= this.data.list.length) i = avoidWrap ? this.data.list.length - 1 : 0;else if (i < 0) i = avoidWrap ? 0 : this.data.list.length - 1; + if (this.selectedHint == i) return; + var node = this.hints.childNodes[this.selectedHint]; + if (node) { + node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, ""); + node.removeAttribute("aria-selected"); + } + node = this.hints.childNodes[this.selectedHint = i]; + node.className += " " + ACTIVE_HINT_ELEMENT_CLASS; + node.setAttribute("aria-selected", "true"); + this.completion.cm.getInputField().setAttribute("aria-activedescendant", node.id); + this.scrollToActive(); + CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node); + }, + scrollToActive: function () { + var selectedHintRange = this.getSelectedHintRange(); + var node1 = this.hints.childNodes[selectedHintRange.from]; + var node2 = this.hints.childNodes[selectedHintRange.to]; + var firstNode = this.hints.firstChild; + if (node1.offsetTop < this.hints.scrollTop) this.hints.scrollTop = node1.offsetTop - firstNode.offsetTop;else if (node2.offsetTop + node2.offsetHeight > this.hints.scrollTop + this.hints.clientHeight) this.hints.scrollTop = node2.offsetTop + node2.offsetHeight - this.hints.clientHeight + firstNode.offsetTop; + }, + screenAmount: function () { + return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1; + }, + getSelectedHintRange: function () { + var margin = this.completion.options.scrollMargin || 0; + return { + from: Math.max(0, this.selectedHint - margin), + to: Math.min(this.data.list.length - 1, this.selectedHint + margin) + }; + } + }; + function applicableHelpers(cm, helpers) { + if (!cm.somethingSelected()) return helpers; + var result = []; + for (var i = 0; i < helpers.length; i++) if (helpers[i].supportsSelection) result.push(helpers[i]); + return result; + } + function fetchHints(hint, cm, options, callback) { + if (hint.async) { + hint(cm, callback, options); + } else { + var result = hint(cm, options); + if (result && result.then) result.then(callback);else callback(result); + } + } + function resolveAutoHints(cm, pos) { + var helpers = cm.getHelpers(pos, "hint"), + words; + if (helpers.length) { + var resolved = function (cm2, callback, options) { + var app = applicableHelpers(cm2, helpers); + function run(i) { + if (i == app.length) return callback(null); + fetchHints(app[i], cm2, options, function (result) { + if (result && result.list.length > 0) callback(result);else run(i + 1); + }); + } + run(0); + }; + resolved.async = true; + resolved.supportsSelection = true; + return resolved; + } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) { + return function (cm2) { + return CodeMirror.hint.fromList(cm2, { + words + }); + }; + } else if (CodeMirror.hint.anyword) { + return function (cm2, options) { + return CodeMirror.hint.anyword(cm2, options); + }; + } else { + return function () {}; + } } - } -}; + CodeMirror.registerHelper("hint", "auto", { + resolve: resolveAutoHints + }); + CodeMirror.registerHelper("hint", "fromList", function (cm, options) { + var cur = cm.getCursor(), + token = cm.getTokenAt(cur); + var term, + from = CodeMirror.Pos(cur.line, token.start), + to = cur; + if (token.start < cur.ch && /\w/.test(token.string.charAt(cur.ch - token.start - 1))) { + term = token.string.substr(0, cur.ch - token.start); + } else { + term = ""; + from = cur; + } + var found = []; + for (var i = 0; i < options.words.length; i++) { + var word = options.words[i]; + if (word.slice(0, term.length) == term) found.push(word); + } + if (found.length) return { + list: found, + from, + to + }; + }); + CodeMirror.commands.autocomplete = CodeMirror.showHint; + var defaultOptions = { + hint: CodeMirror.hint.auto, + completeSingle: true, + alignWithWord: true, + closeCharacters: /[\s()\[\]{};:>,]/, + closeOnPick: true, + closeOnUnfocus: true, + updateOnCursorActivity: true, + completeOnSingleClick: true, + container: null, + customKeys: null, + extraKeys: null, + paddingForScrollbar: true, + moveOnOverlap: true + }; + CodeMirror.defineOption("hintOptions", null); + }); +})(); +var showHintExports = showHint$2.exports; +const showHint = /* @__PURE__ */codemirror.getDefaultExportFromCjs(showHintExports); +const showHint$1 = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: showHint +}, [showHintExports]); +exports.showHint = showHint$1; -// Main parser class +/***/ }), -const config = { - default: cfg_default, - zero: cfg_zero, - commonmark: cfg_commonmark -}; +/***/ "../../graphiql-react/dist/sublime.cjs.js": +/*!************************************************!*\ + !*** ../../graphiql-react/dist/sublime.cjs.js ***! + \************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -// -// This validator can prohibit more than really needed to prevent XSS. It's a -// tradeoff to keep code simple and to be secure by default. -// -// If you need different setup - override validator method as you wish. Or -// replace it with dummy function and use external sanitizer. -// -const BAD_PROTO_RE = /^(vbscript|javascript|file|data):/; -const GOOD_DATA_RE = /^data:image\/(gif|png|jpeg|webp);/; -function validateLink(url) { - // url should be normalized at this point, and existing entities are decoded - const str = url.trim().toLowerCase(); - return BAD_PROTO_RE.test(str) ? GOOD_DATA_RE.test(str) : true; -} -const RECODE_HOSTNAME_FOR = ['http:', 'https:', 'mailto:']; -function normalizeLink(url) { - const parsed = mdurl__namespace.parse(url, true); - if (parsed.hostname) { - // Encode hostnames in urls like: - // `http://host/`, `https://host/`, `mailto:user@host`, `//host/` - // - // We don't encode unknown schemas, because it's likely that we encode - // something we shouldn't (e.g. `skype:name` treated as `skype:host`) - // - if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) { - try { - parsed.hostname = punycode.toASCII(parsed.hostname); - } catch (er) {/**/} + +const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); +const searchcursor = __webpack_require__(/*! ./searchcursor.cjs2.js */ "../../graphiql-react/dist/searchcursor.cjs2.js"); +const matchbrackets = __webpack_require__(/*! ./matchbrackets.cjs2.js */ "../../graphiql-react/dist/matchbrackets.cjs2.js"); +function _mergeNamespaces(n, m) { + for (var i = 0; i < m.length; i++) { + const e = m[i]; + if (typeof e !== "string" && !Array.isArray(e)) { + for (const k in e) { + if (k !== "default" && !(k in n)) { + const d = Object.getOwnPropertyDescriptor(e, k); + if (d) { + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } } } - return mdurl__namespace.encode(mdurl__namespace.format(parsed)); + return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { + value: "Module" + })); } -function normalizeLinkText(url) { - const parsed = mdurl__namespace.parse(url, true); - if (parsed.hostname) { - // Encode hostnames in urls like: - // `http://host/`, `https://host/`, `mailto:user@host`, `//host/` - // - // We don't encode unknown schemas, because it's likely that we encode - // something we shouldn't (e.g. `skype:name` treated as `skype:host`) - // - if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) { - try { - parsed.hostname = punycode.toUnicode(parsed.hostname); - } catch (er) {/**/} +var sublime$2 = { + exports: {} +}; +(function (module2, exports2) { + (function (mod) { + mod(codemirror.requireCodemirror(), searchcursor.requireSearchcursor(), matchbrackets.requireMatchbrackets()); + })(function (CodeMirror) { + var cmds = CodeMirror.commands; + var Pos = CodeMirror.Pos; + function findPosSubword(doc, start, dir) { + if (dir < 0 && start.ch == 0) return doc.clipPos(Pos(start.line - 1)); + var line = doc.getLine(start.line); + if (dir > 0 && start.ch >= line.length) return doc.clipPos(Pos(start.line + 1, 0)); + var state = "start", + type, + startPos = start.ch; + for (var pos = startPos, e = dir < 0 ? 0 : line.length, i = 0; pos != e; pos += dir, i++) { + var next = line.charAt(dir < 0 ? pos - 1 : pos); + var cat = next != "_" && CodeMirror.isWordChar(next) ? "w" : "o"; + if (cat == "w" && next.toUpperCase() == next) cat = "W"; + if (state == "start") { + if (cat != "o") { + state = "in"; + type = cat; + } else startPos = pos + dir; + } else if (state == "in") { + if (type != cat) { + if (type == "w" && cat == "W" && dir < 0) pos--; + if (type == "W" && cat == "w" && dir > 0) { + if (pos == startPos + 1) { + type = "w"; + continue; + } else pos--; + } + break; + } + } + } + return Pos(start.line, pos); } - } + function moveSubword(cm, dir) { + cm.extendSelectionsBy(function (range) { + if (cm.display.shift || cm.doc.extend || range.empty()) return findPosSubword(cm.doc, range.head, dir);else return dir < 0 ? range.from() : range.to(); + }); + } + cmds.goSubwordLeft = function (cm) { + moveSubword(cm, -1); + }; + cmds.goSubwordRight = function (cm) { + moveSubword(cm, 1); + }; + cmds.scrollLineUp = function (cm) { + var info = cm.getScrollInfo(); + if (!cm.somethingSelected()) { + var visibleBottomLine = cm.lineAtHeight(info.top + info.clientHeight, "local"); + if (cm.getCursor().line >= visibleBottomLine) cm.execCommand("goLineUp"); + } + cm.scrollTo(null, info.top - cm.defaultTextHeight()); + }; + cmds.scrollLineDown = function (cm) { + var info = cm.getScrollInfo(); + if (!cm.somethingSelected()) { + var visibleTopLine = cm.lineAtHeight(info.top, "local") + 1; + if (cm.getCursor().line <= visibleTopLine) cm.execCommand("goLineDown"); + } + cm.scrollTo(null, info.top + cm.defaultTextHeight()); + }; + cmds.splitSelectionByLine = function (cm) { + var ranges = cm.listSelections(), + lineRanges = []; + for (var i = 0; i < ranges.length; i++) { + var from = ranges[i].from(), + to = ranges[i].to(); + for (var line = from.line; line <= to.line; ++line) if (!(to.line > from.line && line == to.line && to.ch == 0)) lineRanges.push({ + anchor: line == from.line ? from : Pos(line, 0), + head: line == to.line ? to : Pos(line) + }); + } + cm.setSelections(lineRanges, 0); + }; + cmds.singleSelectionTop = function (cm) { + var range = cm.listSelections()[0]; + cm.setSelection(range.anchor, range.head, { + scroll: false + }); + }; + cmds.selectLine = function (cm) { + var ranges = cm.listSelections(), + extended = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + extended.push({ + anchor: Pos(range.from().line, 0), + head: Pos(range.to().line + 1, 0) + }); + } + cm.setSelections(extended); + }; + function insertLine(cm, above) { + if (cm.isReadOnly()) return CodeMirror.Pass; + cm.operation(function () { + var len = cm.listSelections().length, + newSelection = [], + last = -1; + for (var i = 0; i < len; i++) { + var head = cm.listSelections()[i].head; + if (head.line <= last) continue; + var at = Pos(head.line + (above ? 0 : 1), 0); + cm.replaceRange("\n", at, null, "+insertLine"); + cm.indentLine(at.line, null, true); + newSelection.push({ + head: at, + anchor: at + }); + last = head.line + 1; + } + cm.setSelections(newSelection); + }); + cm.execCommand("indentAuto"); + } + cmds.insertLineAfter = function (cm) { + return insertLine(cm, false); + }; + cmds.insertLineBefore = function (cm) { + return insertLine(cm, true); + }; + function wordAt(cm, pos) { + var start = pos.ch, + end = start, + line = cm.getLine(pos.line); + while (start && CodeMirror.isWordChar(line.charAt(start - 1))) --start; + while (end < line.length && CodeMirror.isWordChar(line.charAt(end))) ++end; + return { + from: Pos(pos.line, start), + to: Pos(pos.line, end), + word: line.slice(start, end) + }; + } + cmds.selectNextOccurrence = function (cm) { + var from = cm.getCursor("from"), + to = cm.getCursor("to"); + var fullWord = cm.state.sublimeFindFullWord == cm.doc.sel; + if (CodeMirror.cmpPos(from, to) == 0) { + var word = wordAt(cm, from); + if (!word.word) return; + cm.setSelection(word.from, word.to); + fullWord = true; + } else { + var text = cm.getRange(from, to); + var query = fullWord ? new RegExp("\\b" + text + "\\b") : text; + var cur = cm.getSearchCursor(query, to); + var found = cur.findNext(); + if (!found) { + cur = cm.getSearchCursor(query, Pos(cm.firstLine(), 0)); + found = cur.findNext(); + } + if (!found || isSelectedRange(cm.listSelections(), cur.from(), cur.to())) return; + cm.addSelection(cur.from(), cur.to()); + } + if (fullWord) cm.state.sublimeFindFullWord = cm.doc.sel; + }; + cmds.skipAndSelectNextOccurrence = function (cm) { + var prevAnchor = cm.getCursor("anchor"), + prevHead = cm.getCursor("head"); + cmds.selectNextOccurrence(cm); + if (CodeMirror.cmpPos(prevAnchor, prevHead) != 0) { + cm.doc.setSelections(cm.doc.listSelections().filter(function (sel) { + return sel.anchor != prevAnchor || sel.head != prevHead; + })); + } + }; + function addCursorToSelection(cm, dir) { + var ranges = cm.listSelections(), + newRanges = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + var newAnchor = cm.findPosV(range.anchor, dir, "line", range.anchor.goalColumn); + var newHead = cm.findPosV(range.head, dir, "line", range.head.goalColumn); + newAnchor.goalColumn = range.anchor.goalColumn != null ? range.anchor.goalColumn : cm.cursorCoords(range.anchor, "div").left; + newHead.goalColumn = range.head.goalColumn != null ? range.head.goalColumn : cm.cursorCoords(range.head, "div").left; + var newRange = { + anchor: newAnchor, + head: newHead + }; + newRanges.push(range); + newRanges.push(newRange); + } + cm.setSelections(newRanges); + } + cmds.addCursorToPrevLine = function (cm) { + addCursorToSelection(cm, -1); + }; + cmds.addCursorToNextLine = function (cm) { + addCursorToSelection(cm, 1); + }; + function isSelectedRange(ranges, from, to) { + for (var i = 0; i < ranges.length; i++) if (CodeMirror.cmpPos(ranges[i].from(), from) == 0 && CodeMirror.cmpPos(ranges[i].to(), to) == 0) return true; + return false; + } + var mirror = "(){}[]"; + function selectBetweenBrackets(cm) { + var ranges = cm.listSelections(), + newRanges = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i], + pos = range.head, + opening = cm.scanForBracket(pos, -1); + if (!opening) return false; + for (;;) { + var closing = cm.scanForBracket(pos, 1); + if (!closing) return false; + if (closing.ch == mirror.charAt(mirror.indexOf(opening.ch) + 1)) { + var startPos = Pos(opening.pos.line, opening.pos.ch + 1); + if (CodeMirror.cmpPos(startPos, range.from()) == 0 && CodeMirror.cmpPos(closing.pos, range.to()) == 0) { + opening = cm.scanForBracket(opening.pos, -1); + if (!opening) return false; + } else { + newRanges.push({ + anchor: startPos, + head: closing.pos + }); + break; + } + } + pos = Pos(closing.pos.line, closing.pos.ch + 1); + } + } + cm.setSelections(newRanges); + return true; + } + cmds.selectScope = function (cm) { + selectBetweenBrackets(cm) || cm.execCommand("selectAll"); + }; + cmds.selectBetweenBrackets = function (cm) { + if (!selectBetweenBrackets(cm)) return CodeMirror.Pass; + }; + function puncType(type) { + return !type ? null : /\bpunctuation\b/.test(type) ? type : void 0; + } + cmds.goToBracket = function (cm) { + cm.extendSelectionsBy(function (range) { + var next = cm.scanForBracket(range.head, 1, puncType(cm.getTokenTypeAt(range.head))); + if (next && CodeMirror.cmpPos(next.pos, range.head) != 0) return next.pos; + var prev = cm.scanForBracket(range.head, -1, puncType(cm.getTokenTypeAt(Pos(range.head.line, range.head.ch + 1)))); + return prev && Pos(prev.pos.line, prev.pos.ch + 1) || range.head; + }); + }; + cmds.swapLineUp = function (cm) { + if (cm.isReadOnly()) return CodeMirror.Pass; + var ranges = cm.listSelections(), + linesToMove = [], + at = cm.firstLine() - 1, + newSels = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i], + from = range.from().line - 1, + to = range.to().line; + newSels.push({ + anchor: Pos(range.anchor.line - 1, range.anchor.ch), + head: Pos(range.head.line - 1, range.head.ch) + }); + if (range.to().ch == 0 && !range.empty()) --to; + if (from > at) linesToMove.push(from, to);else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to; + at = to; + } + cm.operation(function () { + for (var i2 = 0; i2 < linesToMove.length; i2 += 2) { + var from2 = linesToMove[i2], + to2 = linesToMove[i2 + 1]; + var line = cm.getLine(from2); + cm.replaceRange("", Pos(from2, 0), Pos(from2 + 1, 0), "+swapLine"); + if (to2 > cm.lastLine()) cm.replaceRange("\n" + line, Pos(cm.lastLine()), null, "+swapLine");else cm.replaceRange(line + "\n", Pos(to2, 0), null, "+swapLine"); + } + cm.setSelections(newSels); + cm.scrollIntoView(); + }); + }; + cmds.swapLineDown = function (cm) { + if (cm.isReadOnly()) return CodeMirror.Pass; + var ranges = cm.listSelections(), + linesToMove = [], + at = cm.lastLine() + 1; + for (var i = ranges.length - 1; i >= 0; i--) { + var range = ranges[i], + from = range.to().line + 1, + to = range.from().line; + if (range.to().ch == 0 && !range.empty()) from--; + if (from < at) linesToMove.push(from, to);else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to; + at = to; + } + cm.operation(function () { + for (var i2 = linesToMove.length - 2; i2 >= 0; i2 -= 2) { + var from2 = linesToMove[i2], + to2 = linesToMove[i2 + 1]; + var line = cm.getLine(from2); + if (from2 == cm.lastLine()) cm.replaceRange("", Pos(from2 - 1), Pos(from2), "+swapLine");else cm.replaceRange("", Pos(from2, 0), Pos(from2 + 1, 0), "+swapLine"); + cm.replaceRange(line + "\n", Pos(to2, 0), null, "+swapLine"); + } + cm.scrollIntoView(); + }); + }; + cmds.toggleCommentIndented = function (cm) { + cm.toggleComment({ + indent: true + }); + }; + cmds.joinLines = function (cm) { + var ranges = cm.listSelections(), + joined = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i], + from = range.from(); + var start = from.line, + end = range.to().line; + while (i < ranges.length - 1 && ranges[i + 1].from().line == end) end = ranges[++i].to().line; + joined.push({ + start, + end, + anchor: !range.empty() && from + }); + } + cm.operation(function () { + var offset = 0, + ranges2 = []; + for (var i2 = 0; i2 < joined.length; i2++) { + var obj = joined[i2]; + var anchor = obj.anchor && Pos(obj.anchor.line - offset, obj.anchor.ch), + head; + for (var line = obj.start; line <= obj.end; line++) { + var actual = line - offset; + if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1); + if (actual < cm.lastLine()) { + cm.replaceRange(" ", Pos(actual), Pos(actual + 1, /^\s*/.exec(cm.getLine(actual + 1))[0].length)); + ++offset; + } + } + ranges2.push({ + anchor: anchor || head, + head + }); + } + cm.setSelections(ranges2, 0); + }); + }; + cmds.duplicateLine = function (cm) { + cm.operation(function () { + var rangeCount = cm.listSelections().length; + for (var i = 0; i < rangeCount; i++) { + var range = cm.listSelections()[i]; + if (range.empty()) cm.replaceRange(cm.getLine(range.head.line) + "\n", Pos(range.head.line, 0));else cm.replaceRange(cm.getRange(range.from(), range.to()), range.from()); + } + cm.scrollIntoView(); + }); + }; + function sortLines(cm, caseSensitive, direction) { + if (cm.isReadOnly()) return CodeMirror.Pass; + var ranges = cm.listSelections(), + toSort = [], + selected; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (range.empty()) continue; + var from = range.from().line, + to = range.to().line; + while (i < ranges.length - 1 && ranges[i + 1].from().line == to) to = ranges[++i].to().line; + if (!ranges[i].to().ch) to--; + toSort.push(from, to); + } + if (toSort.length) selected = true;else toSort.push(cm.firstLine(), cm.lastLine()); + cm.operation(function () { + var ranges2 = []; + for (var i2 = 0; i2 < toSort.length; i2 += 2) { + var from2 = toSort[i2], + to2 = toSort[i2 + 1]; + var start = Pos(from2, 0), + end = Pos(to2); + var lines = cm.getRange(start, end, false); + if (caseSensitive) lines.sort(function (a, b) { + return a < b ? -direction : a == b ? 0 : direction; + });else lines.sort(function (a, b) { + var au = a.toUpperCase(), + bu = b.toUpperCase(); + if (au != bu) { + a = au; + b = bu; + } + return a < b ? -direction : a == b ? 0 : direction; + }); + cm.replaceRange(lines, start, end); + if (selected) ranges2.push({ + anchor: start, + head: Pos(to2 + 1, 0) + }); + } + if (selected) cm.setSelections(ranges2, 0); + }); + } + cmds.sortLines = function (cm) { + sortLines(cm, true, 1); + }; + cmds.reverseSortLines = function (cm) { + sortLines(cm, true, -1); + }; + cmds.sortLinesInsensitive = function (cm) { + sortLines(cm, false, 1); + }; + cmds.reverseSortLinesInsensitive = function (cm) { + sortLines(cm, false, -1); + }; + cmds.nextBookmark = function (cm) { + var marks = cm.state.sublimeBookmarks; + if (marks) while (marks.length) { + var current = marks.shift(); + var found = current.find(); + if (found) { + marks.push(current); + return cm.setSelection(found.from, found.to); + } + } + }; + cmds.prevBookmark = function (cm) { + var marks = cm.state.sublimeBookmarks; + if (marks) while (marks.length) { + marks.unshift(marks.pop()); + var found = marks[marks.length - 1].find(); + if (!found) marks.pop();else return cm.setSelection(found.from, found.to); + } + }; + cmds.toggleBookmark = function (cm) { + var ranges = cm.listSelections(); + var marks = cm.state.sublimeBookmarks || (cm.state.sublimeBookmarks = []); + for (var i = 0; i < ranges.length; i++) { + var from = ranges[i].from(), + to = ranges[i].to(); + var found = ranges[i].empty() ? cm.findMarksAt(from) : cm.findMarks(from, to); + for (var j = 0; j < found.length; j++) { + if (found[j].sublimeBookmark) { + found[j].clear(); + for (var k = 0; k < marks.length; k++) if (marks[k] == found[j]) marks.splice(k--, 1); + break; + } + } + if (j == found.length) marks.push(cm.markText(from, to, { + sublimeBookmark: true, + clearWhenEmpty: false + })); + } + }; + cmds.clearBookmarks = function (cm) { + var marks = cm.state.sublimeBookmarks; + if (marks) for (var i = 0; i < marks.length; i++) marks[i].clear(); + marks.length = 0; + }; + cmds.selectBookmarks = function (cm) { + var marks = cm.state.sublimeBookmarks, + ranges = []; + if (marks) for (var i = 0; i < marks.length; i++) { + var found = marks[i].find(); + if (!found) marks.splice(i--, 0);else ranges.push({ + anchor: found.from, + head: found.to + }); + } + if (ranges.length) cm.setSelections(ranges, 0); + }; + function modifyWordOrSelection(cm, mod) { + cm.operation(function () { + var ranges = cm.listSelections(), + indices = [], + replacements = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (range.empty()) { + indices.push(i); + replacements.push(""); + } else replacements.push(mod(cm.getRange(range.from(), range.to()))); + } + cm.replaceSelections(replacements, "around", "case"); + for (var i = indices.length - 1, at; i >= 0; i--) { + var range = ranges[indices[i]]; + if (at && CodeMirror.cmpPos(range.head, at) > 0) continue; + var word = wordAt(cm, range.head); + at = word.from; + cm.replaceRange(mod(word.word), word.from, word.to); + } + }); + } + cmds.smartBackspace = function (cm) { + if (cm.somethingSelected()) return CodeMirror.Pass; + cm.operation(function () { + var cursors = cm.listSelections(); + var indentUnit = cm.getOption("indentUnit"); + for (var i = cursors.length - 1; i >= 0; i--) { + var cursor = cursors[i].head; + var toStartOfLine = cm.getRange({ + line: cursor.line, + ch: 0 + }, cursor); + var column = CodeMirror.countColumn(toStartOfLine, null, cm.getOption("tabSize")); + var deletePos = cm.findPosH(cursor, -1, "char", false); + if (toStartOfLine && !/\S/.test(toStartOfLine) && column % indentUnit == 0) { + var prevIndent = new Pos(cursor.line, CodeMirror.findColumn(toStartOfLine, column - indentUnit, indentUnit)); + if (prevIndent.ch != cursor.ch) deletePos = prevIndent; + } + cm.replaceRange("", deletePos, cursor, "+delete"); + } + }); + }; + cmds.delLineRight = function (cm) { + cm.operation(function () { + var ranges = cm.listSelections(); + for (var i = ranges.length - 1; i >= 0; i--) cm.replaceRange("", ranges[i].anchor, Pos(ranges[i].to().line), "+delete"); + cm.scrollIntoView(); + }); + }; + cmds.upcaseAtCursor = function (cm) { + modifyWordOrSelection(cm, function (str) { + return str.toUpperCase(); + }); + }; + cmds.downcaseAtCursor = function (cm) { + modifyWordOrSelection(cm, function (str) { + return str.toLowerCase(); + }); + }; + cmds.setSublimeMark = function (cm) { + if (cm.state.sublimeMark) cm.state.sublimeMark.clear(); + cm.state.sublimeMark = cm.setBookmark(cm.getCursor()); + }; + cmds.selectToSublimeMark = function (cm) { + var found = cm.state.sublimeMark && cm.state.sublimeMark.find(); + if (found) cm.setSelection(cm.getCursor(), found); + }; + cmds.deleteToSublimeMark = function (cm) { + var found = cm.state.sublimeMark && cm.state.sublimeMark.find(); + if (found) { + var from = cm.getCursor(), + to = found; + if (CodeMirror.cmpPos(from, to) > 0) { + var tmp = to; + to = from; + from = tmp; + } + cm.state.sublimeKilled = cm.getRange(from, to); + cm.replaceRange("", from, to); + } + }; + cmds.swapWithSublimeMark = function (cm) { + var found = cm.state.sublimeMark && cm.state.sublimeMark.find(); + if (found) { + cm.state.sublimeMark.clear(); + cm.state.sublimeMark = cm.setBookmark(cm.getCursor()); + cm.setCursor(found); + } + }; + cmds.sublimeYank = function (cm) { + if (cm.state.sublimeKilled != null) cm.replaceSelection(cm.state.sublimeKilled, null, "paste"); + }; + cmds.showInCenter = function (cm) { + var pos = cm.cursorCoords(null, "local"); + cm.scrollTo(null, (pos.top + pos.bottom) / 2 - cm.getScrollInfo().clientHeight / 2); + }; + function getTarget(cm) { + var from = cm.getCursor("from"), + to = cm.getCursor("to"); + if (CodeMirror.cmpPos(from, to) == 0) { + var word = wordAt(cm, from); + if (!word.word) return; + from = word.from; + to = word.to; + } + return { + from, + to, + query: cm.getRange(from, to), + word + }; + } + function findAndGoTo(cm, forward) { + var target = getTarget(cm); + if (!target) return; + var query = target.query; + var cur = cm.getSearchCursor(query, forward ? target.to : target.from); + if (forward ? cur.findNext() : cur.findPrevious()) { + cm.setSelection(cur.from(), cur.to()); + } else { + cur = cm.getSearchCursor(query, forward ? Pos(cm.firstLine(), 0) : cm.clipPos(Pos(cm.lastLine()))); + if (forward ? cur.findNext() : cur.findPrevious()) cm.setSelection(cur.from(), cur.to());else if (target.word) cm.setSelection(target.from, target.to); + } + } + cmds.findUnder = function (cm) { + findAndGoTo(cm, true); + }; + cmds.findUnderPrevious = function (cm) { + findAndGoTo(cm, false); + }; + cmds.findAllUnder = function (cm) { + var target = getTarget(cm); + if (!target) return; + var cur = cm.getSearchCursor(target.query); + var matches = []; + var primaryIndex = -1; + while (cur.findNext()) { + matches.push({ + anchor: cur.from(), + head: cur.to() + }); + if (cur.from().line <= target.from.line && cur.from().ch <= target.from.ch) primaryIndex++; + } + cm.setSelections(matches, primaryIndex); + }; + var keyMap = CodeMirror.keyMap; + keyMap.macSublime = { + "Cmd-Left": "goLineStartSmart", + "Shift-Tab": "indentLess", + "Shift-Ctrl-K": "deleteLine", + "Alt-Q": "wrapLines", + "Ctrl-Left": "goSubwordLeft", + "Ctrl-Right": "goSubwordRight", + "Ctrl-Alt-Up": "scrollLineUp", + "Ctrl-Alt-Down": "scrollLineDown", + "Cmd-L": "selectLine", + "Shift-Cmd-L": "splitSelectionByLine", + "Esc": "singleSelectionTop", + "Cmd-Enter": "insertLineAfter", + "Shift-Cmd-Enter": "insertLineBefore", + "Cmd-D": "selectNextOccurrence", + "Shift-Cmd-Space": "selectScope", + "Shift-Cmd-M": "selectBetweenBrackets", + "Cmd-M": "goToBracket", + "Cmd-Ctrl-Up": "swapLineUp", + "Cmd-Ctrl-Down": "swapLineDown", + "Cmd-/": "toggleCommentIndented", + "Cmd-J": "joinLines", + "Shift-Cmd-D": "duplicateLine", + "F5": "sortLines", + "Shift-F5": "reverseSortLines", + "Cmd-F5": "sortLinesInsensitive", + "Shift-Cmd-F5": "reverseSortLinesInsensitive", + "F2": "nextBookmark", + "Shift-F2": "prevBookmark", + "Cmd-F2": "toggleBookmark", + "Shift-Cmd-F2": "clearBookmarks", + "Alt-F2": "selectBookmarks", + "Backspace": "smartBackspace", + "Cmd-K Cmd-D": "skipAndSelectNextOccurrence", + "Cmd-K Cmd-K": "delLineRight", + "Cmd-K Cmd-U": "upcaseAtCursor", + "Cmd-K Cmd-L": "downcaseAtCursor", + "Cmd-K Cmd-Space": "setSublimeMark", + "Cmd-K Cmd-A": "selectToSublimeMark", + "Cmd-K Cmd-W": "deleteToSublimeMark", + "Cmd-K Cmd-X": "swapWithSublimeMark", + "Cmd-K Cmd-Y": "sublimeYank", + "Cmd-K Cmd-C": "showInCenter", + "Cmd-K Cmd-G": "clearBookmarks", + "Cmd-K Cmd-Backspace": "delLineLeft", + "Cmd-K Cmd-1": "foldAll", + "Cmd-K Cmd-0": "unfoldAll", + "Cmd-K Cmd-J": "unfoldAll", + "Ctrl-Shift-Up": "addCursorToPrevLine", + "Ctrl-Shift-Down": "addCursorToNextLine", + "Cmd-F3": "findUnder", + "Shift-Cmd-F3": "findUnderPrevious", + "Alt-F3": "findAllUnder", + "Shift-Cmd-[": "fold", + "Shift-Cmd-]": "unfold", + "Cmd-I": "findIncremental", + "Shift-Cmd-I": "findIncrementalReverse", + "Cmd-H": "replace", + "F3": "findNext", + "Shift-F3": "findPrev", + "fallthrough": "macDefault" + }; + CodeMirror.normalizeKeyMap(keyMap.macSublime); + keyMap.pcSublime = { + "Shift-Tab": "indentLess", + "Shift-Ctrl-K": "deleteLine", + "Alt-Q": "wrapLines", + "Ctrl-T": "transposeChars", + "Alt-Left": "goSubwordLeft", + "Alt-Right": "goSubwordRight", + "Ctrl-Up": "scrollLineUp", + "Ctrl-Down": "scrollLineDown", + "Ctrl-L": "selectLine", + "Shift-Ctrl-L": "splitSelectionByLine", + "Esc": "singleSelectionTop", + "Ctrl-Enter": "insertLineAfter", + "Shift-Ctrl-Enter": "insertLineBefore", + "Ctrl-D": "selectNextOccurrence", + "Shift-Ctrl-Space": "selectScope", + "Shift-Ctrl-M": "selectBetweenBrackets", + "Ctrl-M": "goToBracket", + "Shift-Ctrl-Up": "swapLineUp", + "Shift-Ctrl-Down": "swapLineDown", + "Ctrl-/": "toggleCommentIndented", + "Ctrl-J": "joinLines", + "Shift-Ctrl-D": "duplicateLine", + "F9": "sortLines", + "Shift-F9": "reverseSortLines", + "Ctrl-F9": "sortLinesInsensitive", + "Shift-Ctrl-F9": "reverseSortLinesInsensitive", + "F2": "nextBookmark", + "Shift-F2": "prevBookmark", + "Ctrl-F2": "toggleBookmark", + "Shift-Ctrl-F2": "clearBookmarks", + "Alt-F2": "selectBookmarks", + "Backspace": "smartBackspace", + "Ctrl-K Ctrl-D": "skipAndSelectNextOccurrence", + "Ctrl-K Ctrl-K": "delLineRight", + "Ctrl-K Ctrl-U": "upcaseAtCursor", + "Ctrl-K Ctrl-L": "downcaseAtCursor", + "Ctrl-K Ctrl-Space": "setSublimeMark", + "Ctrl-K Ctrl-A": "selectToSublimeMark", + "Ctrl-K Ctrl-W": "deleteToSublimeMark", + "Ctrl-K Ctrl-X": "swapWithSublimeMark", + "Ctrl-K Ctrl-Y": "sublimeYank", + "Ctrl-K Ctrl-C": "showInCenter", + "Ctrl-K Ctrl-G": "clearBookmarks", + "Ctrl-K Ctrl-Backspace": "delLineLeft", + "Ctrl-K Ctrl-1": "foldAll", + "Ctrl-K Ctrl-0": "unfoldAll", + "Ctrl-K Ctrl-J": "unfoldAll", + "Ctrl-Alt-Up": "addCursorToPrevLine", + "Ctrl-Alt-Down": "addCursorToNextLine", + "Ctrl-F3": "findUnder", + "Shift-Ctrl-F3": "findUnderPrevious", + "Alt-F3": "findAllUnder", + "Shift-Ctrl-[": "fold", + "Shift-Ctrl-]": "unfold", + "Ctrl-I": "findIncremental", + "Shift-Ctrl-I": "findIncrementalReverse", + "Ctrl-H": "replace", + "F3": "findNext", + "Shift-F3": "findPrev", + "fallthrough": "pcDefault" + }; + CodeMirror.normalizeKeyMap(keyMap.pcSublime); + var mac = keyMap.default == keyMap.macDefault; + keyMap.sublime = mac ? keyMap.macSublime : keyMap.pcSublime; + }); +})(); +var sublimeExports = sublime$2.exports; +const sublime = /* @__PURE__ */codemirror.getDefaultExportFromCjs(sublimeExports); +const sublime$1 = /* @__PURE__ */_mergeNamespaces({ + __proto__: null, + default: sublime +}, [sublimeExports]); +exports.sublime = sublime$1; - // add '%' to exclude list because of https://github.com/markdown-it/markdown-it/issues/720 - return mdurl__namespace.decode(mdurl__namespace.format(parsed), mdurl__namespace.decode.defaultChars + '%'); -} +/***/ }), -/** - * class MarkdownIt - * - * Main parser/renderer class. - * - * ##### Usage - * - * ```javascript - * // node.js, "classic" way: - * var MarkdownIt = require('markdown-it'), - * md = new MarkdownIt(); - * var result = md.render('# markdown-it rulezz!'); - * - * // node.js, the same, but with sugar: - * var md = require('markdown-it')(); - * var result = md.render('# markdown-it rulezz!'); - * - * // browser without AMD, added to "window" on script load - * // Note, there are no dash. - * var md = window.markdownit(); - * var result = md.render('# markdown-it rulezz!'); - * ``` - * - * Single line rendering, without paragraph wrap: - * - * ```javascript - * var md = require('markdown-it')(); - * var result = md.renderInline('__markdown-it__ rulezz!'); - * ``` - **/ +/***/ "../../graphiql-toolkit/dist/esm/async-helpers/index.js": +/*!**************************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/async-helpers/index.js ***! + \**************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -/** - * new MarkdownIt([presetName, options]) - * - presetName (String): optional, `commonmark` / `zero` - * - options (Object) - * - * Creates parser instanse with given config. Can be called without `new`. - * - * ##### presetName - * - * MarkdownIt provides named presets as a convenience to quickly - * enable/disable active syntax rules and options for common use cases. - * - * - ["commonmark"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/commonmark.mjs) - - * configures parser to strict [CommonMark](http://commonmark.org/) mode. - * - [default](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/default.mjs) - - * similar to GFM, used when no preset name given. Enables all available rules, - * but still without html, typographer & autolinker. - * - ["zero"](https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.mjs) - - * all rules disabled. Useful to quickly setup your config via `.enable()`. - * For example, when you need only `bold` and `italic` markup and nothing else. - * - * ##### options: - * - * - __html__ - `false`. Set `true` to enable HTML tags in source. Be careful! - * That's not safe! You may need external sanitizer to protect output from XSS. - * It's better to extend features via plugins, instead of enabling HTML. - * - __xhtmlOut__ - `false`. Set `true` to add '/' when closing single tags - * (`
`). This is needed only for full CommonMark compatibility. In real - * world you will need HTML output. - * - __breaks__ - `false`. Set `true` to convert `\n` in paragraphs into `
`. - * - __langPrefix__ - `language-`. CSS language class prefix for fenced blocks. - * Can be useful for external highlighters. - * - __linkify__ - `false`. Set `true` to autoconvert URL-like text to links. - * - __typographer__ - `false`. Set `true` to enable [some language-neutral - * replacement](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.mjs) + - * quotes beautification (smartquotes). - * - __quotes__ - `“”‘’`, String or Array. Double + single quotes replacement - * pairs, when typographer enabled and smartquotes on. For example, you can - * use `'«»„“'` for Russian, `'„“‚‘'` for German, and - * `['«\xA0', '\xA0»', '‹\xA0', '\xA0›']` for French (including nbsp). - * - __highlight__ - `null`. Highlighter function for fenced code blocks. - * Highlighter `function (str, lang)` should return escaped HTML. It can also - * return empty string if the source was not changed and should be escaped - * externaly. If result starts with ` or ``): - * - * ```javascript - * var hljs = require('highlight.js') // https://highlightjs.org/ - * - * // Actual default values - * var md = require('markdown-it')({ - * highlight: function (str, lang) { - * if (lang && hljs.getLanguage(lang)) { - * try { - * return '
' +
- *                hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +
- *                '
'; - * } catch (__) {} - * } - * - * return '
' + md.utils.escapeHtml(str) + '
'; - * } - * }); - * ``` - * - **/ -function MarkdownIt(presetName, options) { - if (!(this instanceof MarkdownIt)) { - return new MarkdownIt(presetName, options); - } - if (!options) { - if (!isString(presetName)) { - options = presetName || {}; - presetName = 'default'; - } - } - /** - * MarkdownIt#inline -> ParserInline - * - * Instance of [[ParserInline]]. You may need it to add new rules when - * writing plugins. For simple rules control use [[MarkdownIt.disable]] and - * [[MarkdownIt.enable]]. - **/ - this.inline = new ParserInline(); - /** - * MarkdownIt#block -> ParserBlock - * - * Instance of [[ParserBlock]]. You may need it to add new rules when - * writing plugins. For simple rules control use [[MarkdownIt.disable]] and - * [[MarkdownIt.enable]]. - **/ - this.block = new ParserBlock(); +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.fetcherReturnToPromise = fetcherReturnToPromise; +exports.isAsyncIterable = isAsyncIterable; +exports.isObservable = isObservable; +exports.isPromise = isPromise; +__webpack_require__(/*! ../chunk-LMOQIXV4.js */ "../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js"); +function isPromise(value) { + return typeof value == "object" && value !== null && typeof value.then == "function"; +} +function observableToPromise(observable) { + return new Promise((resolve, reject) => { + const subscription = observable.subscribe({ + next(v) { + resolve(v), subscription.unsubscribe(); + }, + error: reject, + complete() { + reject(new Error("no value resolved")); + } + }); + }); +} +function isObservable(value) { + return typeof value == "object" && value !== null && "subscribe" in value && typeof value.subscribe == "function"; +} +function isAsyncIterable(input) { + return typeof input == "object" && input !== null && ( + // Some browsers still don't have Symbol.asyncIterator implemented (iOS Safari) + // That means every custom AsyncIterable must be built using a AsyncGeneratorFunction (async function * () {}) + input[Symbol.toStringTag] === "AsyncGenerator" || Symbol.asyncIterator in input); +} +async function asyncIterableToPromise(input) { + var _a; + const iteratorReturn = (_a = ("return" in input ? input : input[Symbol.asyncIterator]()).return) == null ? void 0 : _a.bind(input), + result = await ("next" in input ? input : input[Symbol.asyncIterator]()).next.bind(input)(); + return iteratorReturn == null || iteratorReturn(), result.value; +} +async function fetcherReturnToPromise(fetcherResult) { + const result = await fetcherResult; + return isAsyncIterable(result) ? asyncIterableToPromise(result) : isObservable(result) ? observableToPromise(result) : result; +} + +/***/ }), - /** - * MarkdownIt#core -> Core - * - * Instance of [[Core]] chain executor. You may need it to add new rules when - * writing plugins. For simple rules control use [[MarkdownIt.disable]] and - * [[MarkdownIt.enable]]. - **/ - this.core = new Core(); +/***/ "../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js": +/*!*********************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js ***! + \*********************************************************/ +/***/ (function(__unused_webpack_module, exports) { - /** - * MarkdownIt#renderer -> Renderer - * - * Instance of [[Renderer]]. Use it to modify output look. Or to add rendering - * rules for new token types, generated by plugins. - * - * ##### Example - * - * ```javascript - * var md = require('markdown-it')(); - * - * function myToken(tokens, idx, options, env, self) { - * //... - * return result; - * }; - * - * md.renderer.rules['my_token'] = myToken - * ``` - * - * See [[Renderer]] docs and [source code](https://github.com/markdown-it/markdown-it/blob/master/lib/renderer.mjs). - **/ - this.renderer = new Renderer(); - /** - * MarkdownIt#linkify -> LinkifyIt - * - * [linkify-it](https://github.com/markdown-it/linkify-it) instance. - * Used by [linkify](https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/linkify.mjs) - * rule. - **/ - this.linkify = new LinkifyIt(); - /** - * MarkdownIt#validateLink(url) -> Boolean - * - * Link validation function. CommonMark allows too much in links. By default - * we disable `javascript:`, `vbscript:`, `file:` schemas, and almost all `data:...` schemas - * except some embedded image types. - * - * You can change this behaviour: - * - * ```javascript - * var md = require('markdown-it')(); - * // enable everything - * md.validateLink = function () { return true; } - * ``` - **/ - this.validateLink = validateLink; +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.__spreadValues = exports.__spreadProps = exports.__forAwait = exports.__await = exports.__asyncGenerator = void 0; +var __defProp = Object.defineProperty, + __defProps = Object.defineProperties; +var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __hasOwnProp = Object.prototype.hasOwnProperty, + __propIsEnum = Object.prototype.propertyIsEnumerable; +var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name); +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { + enumerable: !0, + configurable: !0, + writable: !0, + value + }) : obj[key] = value, + __spreadValues = (a, b) => { + for (var prop in b || (b = {})) __hasOwnProp.call(b, prop) && __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) __propIsEnum.call(b, prop) && __defNormalProp(a, prop, b[prop]); + return a; + }, + __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); +exports.__spreadProps = __spreadProps; +exports.__spreadValues = __spreadValues; +var __await = function (promise, isYieldStar) { + this[0] = promise, this[1] = isYieldStar; + }, + __asyncGenerator = (__this, __arguments, generator) => { + var resume = (k, v, yes, no) => { + try { + var x = generator[k](v), + isAwait = (v = x.value) instanceof __await, + done = x.done; + Promise.resolve(isAwait ? v[0] : v).then(y => isAwait ? resume(k === "return" ? k : "next", v[1] ? { + done: y.done, + value: y.value + } : y, yes, no) : yes({ + value: y, + done + })).catch(e => resume("throw", e, yes, no)); + } catch (e) { + no(e); + } + }, + method = k => it[k] = x => new Promise((yes, no) => resume(k, x, yes, no)), + it = {}; + return generator = generator.apply(__this, __arguments), it[__knownSymbol("asyncIterator")] = () => it, method("next"), method("throw"), method("return"), it; + }; +exports.__asyncGenerator = __asyncGenerator; +exports.__await = __await; +var __forAwait = (obj, it, method) => (it = obj[__knownSymbol("asyncIterator")]) ? it.call(obj) : (obj = obj[__knownSymbol("iterator")](), it = {}, method = (key, fn) => (fn = obj[key]) && (it[key] = arg => new Promise((yes, no, done) => (arg = fn.call(obj, arg), done = arg.done, Promise.resolve(arg.value).then(value => yes({ + value, + done +}), no)))), method("next"), method("return"), it); +exports.__forAwait = __forAwait; - /** - * MarkdownIt#normalizeLink(url) -> String - * - * Function used to encode link url to a machine-readable format, - * which includes url-encoding, punycode, etc. - **/ - this.normalizeLink = normalizeLink; +/***/ }), - /** - * MarkdownIt#normalizeLinkText(url) -> String - * - * Function used to decode link url to a human-readable format` - **/ - this.normalizeLinkText = normalizeLinkText; +/***/ "../../graphiql-toolkit/dist/esm/create-fetcher/createFetcher.js": +/*!***********************************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/create-fetcher/createFetcher.js ***! + \***********************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - // Expose utils & helpers for easy acces from plugins - /** - * MarkdownIt#utils -> utils - * - * Assorted utility functions, useful to write plugins. See details - * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/common/utils.mjs). - **/ - this.utils = utils; - /** - * MarkdownIt#helpers -> helpers - * - * Link components parser functions, useful to write plugins. See details - * [here](https://github.com/markdown-it/markdown-it/blob/master/lib/helpers). - **/ - this.helpers = assign({}, helpers); - this.options = {}; - this.configure(presetName); - if (options) { - this.set(options); - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.createGraphiQLFetcher = createGraphiQLFetcher; +__webpack_require__(/*! ../chunk-LMOQIXV4.js */ "../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js"); +var _lib = __webpack_require__(/*! ./lib */ "../../graphiql-toolkit/dist/esm/create-fetcher/lib.js"); +function createGraphiQLFetcher(options) { + const httpFetch = options.fetch || typeof window != "undefined" && window.fetch; + if (!httpFetch) throw new Error("No valid fetcher implementation available"); + options.enableIncrementalDelivery = options.enableIncrementalDelivery !== !1; + const simpleFetcher = (0, _lib.createSimpleFetcher)(options, httpFetch), + httpFetcher = options.enableIncrementalDelivery ? (0, _lib.createMultipartFetcher)(options, httpFetch) : simpleFetcher; + return async (graphQLParams, fetcherOpts) => { + if (graphQLParams.operationName === "IntrospectionQuery") return (options.schemaFetcher || simpleFetcher)(graphQLParams, fetcherOpts); + if (fetcherOpts != null && fetcherOpts.documentAST ? (0, _lib.isSubscriptionWithName)(fetcherOpts.documentAST, graphQLParams.operationName || void 0) : !1) { + const wsFetcher = await (0, _lib.getWsFetcher)(options, fetcherOpts); + if (!wsFetcher) throw new Error(`Your GraphiQL createFetcher is not properly configured for websocket subscriptions yet. ${options.subscriptionUrl ? `Provided URL ${options.subscriptionUrl} failed` : "Please provide subscriptionUrl, wsClient or legacyClient option first."}`); + return wsFetcher(graphQLParams); + } + return httpFetcher(graphQLParams, fetcherOpts); + }; } -/** chainable - * MarkdownIt.set(options) - * - * Set parser options (in the same format as in constructor). Probably, you - * will never need it, but you can change options after constructor call. - * - * ##### Example - * - * ```javascript - * var md = require('markdown-it')() - * .set({ html: true, breaks: true }) - * .set({ typographer, true }); - * ``` - * - * __Note:__ To achieve the best possible performance, don't modify a - * `markdown-it` instance options on the fly. If you need multiple configurations - * it's best to create multiple instances and initialize each with separate - * config. - **/ -MarkdownIt.prototype.set = function (options) { - assign(this.options, options); - return this; -}; +/***/ }), -/** chainable, internal - * MarkdownIt.configure(presets) - * - * Batch load of all options and compenent settings. This is internal method, - * and you probably will not need it. But if you will - see available presets - * and data structure [here](https://github.com/markdown-it/markdown-it/tree/master/lib/presets) - * - * We strongly recommend to use presets instead of direct config loads. That - * will give better compatibility with next versions. - **/ -MarkdownIt.prototype.configure = function (presets) { - const self = this; - if (isString(presets)) { - const presetName = presets; - presets = config[presetName]; - if (!presets) { - throw new Error('Wrong `markdown-it` preset "' + presetName + '", check name'); - } - } - if (!presets) { - throw new Error('Wrong `markdown-it` preset, can\'t be empty'); - } - if (presets.options) { - self.set(presets.options); +/***/ "../../graphiql-toolkit/dist/esm/create-fetcher/index.js": +/*!***************************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/create-fetcher/index.js ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +var _exportNames = { + createGraphiQLFetcher: true +}; +Object.defineProperty(exports, "createGraphiQLFetcher", ({ + enumerable: true, + get: function () { + return _createFetcher.createGraphiQLFetcher; } - if (presets.components) { - Object.keys(presets.components).forEach(function (name) { - if (presets.components[name].rules) { - self[name].ruler.enableOnly(presets.components[name].rules); +})); +__webpack_require__(/*! ../chunk-LMOQIXV4.js */ "../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js"); +var _types = __webpack_require__(/*! ./types */ "../../graphiql-toolkit/dist/esm/create-fetcher/types.js"); +Object.keys(_types).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; + if (key in exports && exports[key] === _types[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _types[key]; + } + }); +}); +var _createFetcher = __webpack_require__(/*! ./createFetcher */ "../../graphiql-toolkit/dist/esm/create-fetcher/createFetcher.js"); + +/***/ }), + +/***/ "../../graphiql-toolkit/dist/esm/create-fetcher/lib.js": +/*!*************************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/create-fetcher/lib.js ***! + \*************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.createWebsocketsFetcherFromClient = exports.createSimpleFetcher = exports.createMultipartFetcher = exports.createLegacyWebsocketsFetcher = void 0; +exports.createWebsocketsFetcherFromUrl = createWebsocketsFetcherFromUrl; +exports.getWsFetcher = getWsFetcher; +exports.isSubscriptionWithName = void 0; +var _chunkLMOQIXV = __webpack_require__(/*! ../chunk-LMOQIXV4.js */ "../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js"); +var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +var _meros = __webpack_require__(/*! meros */ "../../../node_modules/meros/browser/index.js"); +var _pushPullAsyncIterableIterator = __webpack_require__(/*! @n1ru4l/push-pull-async-iterable-iterator */ "../../../node_modules/@n1ru4l/push-pull-async-iterable-iterator/index.js"); +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +const errorHasCode = err => typeof err == "object" && err !== null && "code" in err, + isSubscriptionWithName = (document, name) => { + let isSubscription = !1; + return (0, _graphql.visit)(document, { + OperationDefinition(node) { + var _a; + name === ((_a = node.name) == null ? void 0 : _a.value) && node.operation === "subscription" && (isSubscription = !0); } - if (presets.components[name].rules2) { - self[name].ruler2.enableOnly(presets.components[name].rules2); + }), isSubscription; + }, + createSimpleFetcher = (options, httpFetch) => async (graphQLParams, fetcherOpts) => (await httpFetch(options.url, { + method: "POST", + body: JSON.stringify(graphQLParams), + headers: (0, _chunkLMOQIXV.__spreadValues)((0, _chunkLMOQIXV.__spreadValues)({ + "content-type": "application/json" + }, options.headers), fetcherOpts == null ? void 0 : fetcherOpts.headers) + })).json(); +exports.createSimpleFetcher = createSimpleFetcher; +exports.isSubscriptionWithName = isSubscriptionWithName; +async function createWebsocketsFetcherFromUrl(url, connectionParams) { + let wsClient; + try { + const { + createClient + } = await Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! graphql-ws */ "../../../node_modules/graphql-ws/lib/index.js"))); + return wsClient = createClient({ + url, + connectionParams + }), createWebsocketsFetcherFromClient(wsClient); + } catch (err) { + if (errorHasCode(err) && err.code === "MODULE_NOT_FOUND") throw new Error("You need to install the 'graphql-ws' package to use websockets when passing a 'subscriptionUrl'"); + console.error(`Error creating websocket client for ${url}`, err); + } +} +const createWebsocketsFetcherFromClient = wsClient => graphQLParams => (0, _pushPullAsyncIterableIterator.makeAsyncIterableIteratorFromSink)(sink => wsClient.subscribe(graphQLParams, (0, _chunkLMOQIXV.__spreadProps)((0, _chunkLMOQIXV.__spreadValues)({}, sink), { + error(err) { + err instanceof CloseEvent ? sink.error(new Error(`Socket closed with event ${err.code} ${err.reason || ""}`.trim())) : sink.error(err); + } + }))), + createLegacyWebsocketsFetcher = legacyWsClient => graphQLParams => { + const observable = legacyWsClient.request(graphQLParams); + return (0, _pushPullAsyncIterableIterator.makeAsyncIterableIteratorFromSink)( + // @ts-ignore + sink => observable.subscribe(sink).unsubscribe); + }, + createMultipartFetcher = (options, httpFetch) => function (graphQLParams, fetcherOpts) { + return (0, _chunkLMOQIXV.__asyncGenerator)(this, null, function* () { + const response = yield new _chunkLMOQIXV.__await(httpFetch(options.url, { + method: "POST", + body: JSON.stringify(graphQLParams), + headers: (0, _chunkLMOQIXV.__spreadValues)((0, _chunkLMOQIXV.__spreadValues)({ + "content-type": "application/json", + accept: "application/json, multipart/mixed" + }, options.headers), fetcherOpts == null ? void 0 : fetcherOpts.headers) + }).then(r => (0, _meros.meros)(r, { + multiple: !0 + }))); + if (!(0, _pushPullAsyncIterableIterator.isAsyncIterable)(response)) return yield response.json(); + try { + for (var iter = (0, _chunkLMOQIXV.__forAwait)(response), more, temp, error; more = !(temp = yield new _chunkLMOQIXV.__await(iter.next())).done; more = !1) { + const chunk = temp.value; + if (chunk.some(part => !part.json)) { + const message = chunk.map(part => `Headers:: +${part.headers} + +Body:: +${part.body}`); + throw new Error(`Expected multipart chunks to be of json type. got: +${message}`); + } + yield chunk.map(part => part.body); + } + } catch (temp) { + error = [temp]; + } finally { + try { + more && (temp = iter.return) && (yield new _chunkLMOQIXV.__await(temp.call(iter))); + } finally { + if (error) throw error[0]; + } } }); - } - return this; -}; + }; +exports.createMultipartFetcher = createMultipartFetcher; +exports.createLegacyWebsocketsFetcher = createLegacyWebsocketsFetcher; +exports.createWebsocketsFetcherFromClient = createWebsocketsFetcherFromClient; +async function getWsFetcher(options, fetcherOpts) { + if (options.wsClient) return createWebsocketsFetcherFromClient(options.wsClient); + if (options.subscriptionUrl) return createWebsocketsFetcherFromUrl(options.subscriptionUrl, (0, _chunkLMOQIXV.__spreadValues)((0, _chunkLMOQIXV.__spreadValues)({}, options.wsConnectionParams), fetcherOpts == null ? void 0 : fetcherOpts.headers)); + const legacyWebsocketsClient = options.legacyClient || options.legacyWsClient; + if (legacyWebsocketsClient) return createLegacyWebsocketsFetcher(legacyWebsocketsClient); +} -/** chainable - * MarkdownIt.enable(list, ignoreInvalid) - * - list (String|Array): rule name or list of rule names to enable - * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found. - * - * Enable list or rules. It will automatically find appropriate components, - * containing rules with given names. If rule not found, and `ignoreInvalid` - * not set - throws exception. - * - * ##### Example - * - * ```javascript - * var md = require('markdown-it')() - * .enable(['sub', 'sup']) - * .disable('smartquotes'); - * ``` - **/ -MarkdownIt.prototype.enable = function (list, ignoreInvalid) { - let result = []; - if (!Array.isArray(list)) { - list = [list]; - } - ['core', 'block', 'inline'].forEach(function (chain) { - result = result.concat(this[chain].ruler.enable(list, true)); - }, this); - result = result.concat(this.inline.ruler2.enable(list, true)); - const missed = list.filter(function (name) { - return result.indexOf(name) < 0; - }); - if (missed.length && !ignoreInvalid) { - throw new Error('MarkdownIt. Failed to enable unknown rule(s): ' + missed); - } - return this; -}; +/***/ }), -/** chainable - * MarkdownIt.disable(list, ignoreInvalid) - * - list (String|Array): rule name or list of rule names to disable. - * - ignoreInvalid (Boolean): set `true` to ignore errors when rule not found. - * - * The same as [[MarkdownIt.enable]], but turn specified rules off. - **/ -MarkdownIt.prototype.disable = function (list, ignoreInvalid) { - let result = []; - if (!Array.isArray(list)) { - list = [list]; - } - ['core', 'block', 'inline'].forEach(function (chain) { - result = result.concat(this[chain].ruler.disable(list, true)); - }, this); - result = result.concat(this.inline.ruler2.disable(list, true)); - const missed = list.filter(function (name) { - return result.indexOf(name) < 0; +/***/ "../../graphiql-toolkit/dist/esm/create-fetcher/types.js": +/*!***************************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/create-fetcher/types.js ***! + \***************************************************************/ +/***/ (function() { + + + +/***/ }), + +/***/ "../../graphiql-toolkit/dist/esm/format/index.js": +/*!*******************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/format/index.js ***! + \*******************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.formatError = formatError; +exports.formatResult = formatResult; +var _chunkLMOQIXV = __webpack_require__(/*! ../chunk-LMOQIXV4.js */ "../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js"); +function stringify(obj) { + return JSON.stringify(obj, null, 2); +} +function formatSingleError(error) { + return (0, _chunkLMOQIXV.__spreadProps)((0, _chunkLMOQIXV.__spreadValues)({}, error), { + // Raise these details even if they're non-enumerable + message: error.message, + stack: error.stack }); - if (missed.length && !ignoreInvalid) { - throw new Error('MarkdownIt. Failed to disable unknown rule(s): ' + missed); - } - return this; -}; +} +function handleSingleError(error) { + return error instanceof Error ? formatSingleError(error) : error; +} +function formatError(error) { + return Array.isArray(error) ? stringify({ + errors: error.map(e => handleSingleError(e)) + }) : stringify({ + errors: [handleSingleError(error)] + }); +} +function formatResult(result) { + return stringify(result); +} -/** chainable - * MarkdownIt.use(plugin, params) - * - * Load specified plugin with given params into current parser instance. - * It's just a sugar to call `plugin(md, params)` with curring. - * - * ##### Example - * - * ```javascript - * var iterator = require('markdown-it-for-inline'); - * var md = require('markdown-it')() - * .use(iterator, 'foo_replace', 'text', function (tokens, idx) { - * tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar'); - * }); - * ``` - **/ -MarkdownIt.prototype.use = function (plugin /*, params, ... */) { - const args = [this].concat(Array.prototype.slice.call(arguments, 1)); - plugin.apply(plugin, args); - return this; -}; +/***/ }), -/** internal - * MarkdownIt.parse(src, env) -> Array - * - src (String): source string - * - env (Object): environment sandbox - * - * Parse input string and return list of block tokens (special token type - * "inline" will contain list of inline tokens). You should not call this - * method directly, until you write custom renderer (for example, to produce - * AST). - * - * `env` is used to pass data between "distributed" rules and return additional - * metadata like reference info, needed for the renderer. It also can be used to - * inject data in specific cases. Usually, you will be ok to pass `{}`, - * and then pass updated object to renderer. - **/ -MarkdownIt.prototype.parse = function (src, env) { - if (typeof src !== 'string') { - throw new Error('Input data should be a String'); - } - const state = new this.core.State(src, this, env); - this.core.process(state); - return state.tokens; -}; +/***/ "../../graphiql-toolkit/dist/esm/graphql-helpers/auto-complete.js": +/*!************************************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/graphql-helpers/auto-complete.js ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -/** - * MarkdownIt.render(src [, env]) -> String - * - src (String): source string - * - env (Object): environment sandbox - * - * Render markdown string into html. It does all magic for you :). - * - * `env` can be used to inject additional metadata (`{}` by default). - * But you will not need it with high probability. See also comment - * in [[MarkdownIt.parse]]. - **/ -MarkdownIt.prototype.render = function (src, env) { - env = env || {}; - return this.renderer.render(this.parse(src, env), this.options, env); -}; -/** internal - * MarkdownIt.parseInline(src, env) -> Array - * - src (String): source string - * - env (Object): environment sandbox - * - * The same as [[MarkdownIt.parse]] but skip all block rules. It returns the - * block tokens list with the single `inline` element, containing parsed inline - * tokens in `children` property. Also updates `env` object. - **/ -MarkdownIt.prototype.parseInline = function (src, env) { - const state = new this.core.State(src, this, env); - state.inlineMode = true; - this.core.process(state); - return state.tokens; -}; -/** - * MarkdownIt.renderInline(src [, env]) -> String - * - src (String): source string - * - env (Object): environment sandbox - * - * Similar to [[MarkdownIt.render]] but for single paragraph content. Result - * will NOT be wrapped into `

` tags. - **/ -MarkdownIt.prototype.renderInline = function (src, env) { - env = env || {}; - return this.renderer.render(this.parseInline(src, env), this.options, env); -}; -module.exports = MarkdownIt; +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.fillLeafs = fillLeafs; +__webpack_require__(/*! ../chunk-LMOQIXV4.js */ "../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js"); +var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +function fillLeafs(schema, docString, getDefaultFieldNames) { + const insertions = []; + if (!schema || !docString) return { + insertions, + result: docString + }; + let ast; + try { + ast = (0, _graphql.parse)(docString); + } catch (e) { + return { + insertions, + result: docString + }; + } + const fieldNameFn = getDefaultFieldNames || defaultGetDefaultFieldNames, + typeInfo = new _graphql.TypeInfo(schema); + return (0, _graphql.visit)(ast, { + leave(node) { + typeInfo.leave(node); + }, + enter(node) { + if (typeInfo.enter(node), node.kind === "Field" && !node.selectionSet) { + const fieldType = typeInfo.getType(), + selectionSet = buildSelectionSet(isFieldType(fieldType), fieldNameFn); + if (selectionSet && node.loc) { + const indent = getIndentation(docString, node.loc.start); + insertions.push({ + index: node.loc.end, + string: " " + (0, _graphql.print)(selectionSet).replaceAll(` +`, ` +` + indent) + }); + } + } + } + }), { + insertions, + result: withInsertions(docString, insertions) + }; +} +function defaultGetDefaultFieldNames(type) { + if (!("getFields" in type)) return []; + const fields = type.getFields(); + if (fields.id) return ["id"]; + if (fields.edges) return ["edges"]; + if (fields.node) return ["node"]; + const leafFieldNames = []; + for (const fieldName of Object.keys(fields)) (0, _graphql.isLeafType)(fields[fieldName].type) && leafFieldNames.push(fieldName); + return leafFieldNames; +} +function buildSelectionSet(type, getDefaultFieldNames) { + const namedType = (0, _graphql.getNamedType)(type); + if (!type || (0, _graphql.isLeafType)(type)) return; + const fieldNames = getDefaultFieldNames(namedType); + if (!(!Array.isArray(fieldNames) || fieldNames.length === 0 || !("getFields" in namedType))) return { + kind: _graphql.Kind.SELECTION_SET, + selections: fieldNames.map(fieldName => { + const fieldDef = namedType.getFields()[fieldName], + fieldType = fieldDef ? fieldDef.type : null; + return { + kind: _graphql.Kind.FIELD, + name: { + kind: _graphql.Kind.NAME, + value: fieldName + }, + // we can use as here, because we already know that fieldType + // comes from an origin parameter + selectionSet: buildSelectionSet(fieldType, getDefaultFieldNames) + }; + }) + }; +} +function withInsertions(initial, insertions) { + if (insertions.length === 0) return initial; + let edited = "", + prevIndex = 0; + for (const { + index, + string + } of insertions) edited += initial.slice(prevIndex, index) + string, prevIndex = index; + return edited += initial.slice(prevIndex), edited; +} +function getIndentation(str, index) { + let indentStart = index, + indentEnd = index; + for (; indentStart;) { + const c = str.charCodeAt(indentStart - 1); + if (c === 10 || c === 13 || c === 8232 || c === 8233) break; + indentStart--, c !== 9 && c !== 11 && c !== 12 && c !== 32 && c !== 160 && (indentEnd = indentStart); + } + return str.slice(indentStart, indentEnd); +} +function isFieldType(fieldType) { + if (fieldType) return fieldType; +} + +/***/ }), + +/***/ "../../graphiql-toolkit/dist/esm/graphql-helpers/index.js": +/*!****************************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/graphql-helpers/index.js ***! + \****************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +var _autoComplete = __webpack_require__(/*! ./auto-complete */ "../../graphiql-toolkit/dist/esm/graphql-helpers/auto-complete.js"); +Object.keys(_autoComplete).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in exports && exports[key] === _autoComplete[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _autoComplete[key]; + } + }); +}); +var _mergeAst = __webpack_require__(/*! ./merge-ast */ "../../graphiql-toolkit/dist/esm/graphql-helpers/merge-ast.js"); +Object.keys(_mergeAst).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in exports && exports[key] === _mergeAst[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _mergeAst[key]; + } + }); +}); +var _operationName = __webpack_require__(/*! ./operation-name */ "../../graphiql-toolkit/dist/esm/graphql-helpers/operation-name.js"); +Object.keys(_operationName).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in exports && exports[key] === _operationName[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _operationName[key]; + } + }); +}); /***/ }), -/***/ "../node_modules/mdurl/build/index.cjs.js": -/*!************************************************!*\ - !*** ../node_modules/mdurl/build/index.cjs.js ***! - \************************************************/ -/***/ (function(__unused_webpack_module, exports) { +/***/ "../../graphiql-toolkit/dist/esm/graphql-helpers/merge-ast.js": +/*!********************************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/graphql-helpers/merge-ast.js ***! + \********************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -/* eslint-disable no-bitwise */ -const decodeCache = {}; -function getDecodeCache(exclude) { - let cache = decodeCache[exclude]; - if (cache) { - return cache; - } - cache = decodeCache[exclude] = []; - for (let i = 0; i < 128; i++) { - const ch = String.fromCharCode(i); - cache.push(ch); - } - for (let i = 0; i < exclude.length; i++) { - const ch = exclude.charCodeAt(i); - cache[ch] = '%' + ('0' + ch.toString(16).toUpperCase()).slice(-2); - } - return cache; +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.mergeAst = mergeAst; +var _chunkLMOQIXV = __webpack_require__(/*! ../chunk-LMOQIXV4.js */ "../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js"); +var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +function uniqueBy(array, iteratee) { + var _a; + const FilteredMap = /* @__PURE__ */new Map(), + result = []; + for (const item of array) if (item.kind === "Field") { + const uniqueValue = iteratee(item), + existing = FilteredMap.get(uniqueValue); + if ((_a = item.directives) != null && _a.length) { + const itemClone = (0, _chunkLMOQIXV.__spreadValues)({}, item); + result.push(itemClone); + } else if (existing != null && existing.selectionSet && item.selectionSet) existing.selectionSet.selections = [...existing.selectionSet.selections, ...item.selectionSet.selections];else if (!existing) { + const itemClone = (0, _chunkLMOQIXV.__spreadValues)({}, item); + FilteredMap.set(uniqueValue, itemClone), result.push(itemClone); + } + } else result.push(item); + return result; } - -// Decode percent-encoded string. -// -function decode(string, exclude) { - if (typeof exclude !== 'string') { - exclude = decode.defaultChars; - } - const cache = getDecodeCache(exclude); - return string.replace(/(%[a-f0-9]{2})+/gi, function (seq) { - let result = ''; - for (let i = 0, l = seq.length; i < l; i += 3) { - const b1 = parseInt(seq.slice(i + 1, i + 3), 16); - if (b1 < 0x80) { - result += cache[b1]; - continue; +function inlineRelevantFragmentSpreads(fragmentDefinitions, selections, selectionSetType) { + var _a; + const selectionSetTypeName = selectionSetType ? (0, _graphql.getNamedType)(selectionSetType).name : null, + outputSelections = [], + seenSpreads = []; + for (let selection of selections) { + if (selection.kind === "FragmentSpread") { + const fragmentName = selection.name.value; + if (!selection.directives || selection.directives.length === 0) { + if (seenSpreads.includes(fragmentName)) continue; + seenSpreads.push(fragmentName); } - if ((b1 & 0xE0) === 0xC0 && i + 3 < l) { - // 110xxxxx 10xxxxxx - const b2 = parseInt(seq.slice(i + 4, i + 6), 16); - if ((b2 & 0xC0) === 0x80) { - const chr = b1 << 6 & 0x7C0 | b2 & 0x3F; - if (chr < 0x80) { - result += '\ufffd\ufffd'; - } else { - result += String.fromCharCode(chr); - } - i += 3; - continue; - } + const fragmentDefinition = fragmentDefinitions[selection.name.value]; + if (fragmentDefinition) { + const { + typeCondition, + directives, + selectionSet + } = fragmentDefinition; + selection = { + kind: _graphql.Kind.INLINE_FRAGMENT, + typeCondition, + directives, + selectionSet + }; } - if ((b1 & 0xF0) === 0xE0 && i + 6 < l) { - // 1110xxxx 10xxxxxx 10xxxxxx - const b2 = parseInt(seq.slice(i + 4, i + 6), 16); - const b3 = parseInt(seq.slice(i + 7, i + 9), 16); - if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) { - const chr = b1 << 12 & 0xF000 | b2 << 6 & 0xFC0 | b3 & 0x3F; - if (chr < 0x800 || chr >= 0xD800 && chr <= 0xDFFF) { - result += '\ufffd\ufffd\ufffd'; - } else { - result += String.fromCharCode(chr); - } - i += 6; - continue; - } + } + if (selection.kind === _graphql.Kind.INLINE_FRAGMENT && ( + // Cannot inline if there are directives + !selection.directives || ((_a = selection.directives) == null ? void 0 : _a.length) === 0)) { + const fragmentTypeName = selection.typeCondition ? selection.typeCondition.name.value : null; + if (!fragmentTypeName || fragmentTypeName === selectionSetTypeName) { + outputSelections.push(...inlineRelevantFragmentSpreads(fragmentDefinitions, selection.selectionSet.selections, selectionSetType)); + continue; } - if ((b1 & 0xF8) === 0xF0 && i + 9 < l) { - // 111110xx 10xxxxxx 10xxxxxx 10xxxxxx - const b2 = parseInt(seq.slice(i + 4, i + 6), 16); - const b3 = parseInt(seq.slice(i + 7, i + 9), 16); - const b4 = parseInt(seq.slice(i + 10, i + 12), 16); - if ((b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80 && (b4 & 0xC0) === 0x80) { - let chr = b1 << 18 & 0x1C0000 | b2 << 12 & 0x3F000 | b3 << 6 & 0xFC0 | b4 & 0x3F; - if (chr < 0x10000 || chr > 0x10FFFF) { - result += '\ufffd\ufffd\ufffd\ufffd'; - } else { - chr -= 0x10000; - result += String.fromCharCode(0xD800 + (chr >> 10), 0xDC00 + (chr & 0x3FF)); - } - i += 9; - continue; - } + } + outputSelections.push(selection); + } + return outputSelections; +} +function mergeAst(documentAST, schema) { + const typeInfo = schema ? new _graphql.TypeInfo(schema) : null, + fragmentDefinitions = /* @__PURE__ */Object.create(null); + for (const definition of documentAST.definitions) definition.kind === _graphql.Kind.FRAGMENT_DEFINITION && (fragmentDefinitions[definition.name.value] = definition); + const flattenVisitors = { + SelectionSet(node) { + const selectionSetType = typeInfo ? typeInfo.getParentType() : null; + let { + selections + } = node; + return selections = inlineRelevantFragmentSpreads(fragmentDefinitions, selections, selectionSetType), (0, _chunkLMOQIXV.__spreadProps)((0, _chunkLMOQIXV.__spreadValues)({}, node), { + selections + }); + }, + FragmentDefinition() { + return null; } - result += '\ufffd'; + }, + flattenedAST = (0, _graphql.visit)(documentAST, typeInfo ? (0, _graphql.visitWithTypeInfo)(typeInfo, flattenVisitors) : flattenVisitors); + return (0, _graphql.visit)(flattenedAST, { + SelectionSet(node) { + let { + selections + } = node; + return selections = uniqueBy(selections, selection => selection.alias ? selection.alias.value : selection.name.value), (0, _chunkLMOQIXV.__spreadProps)((0, _chunkLMOQIXV.__spreadValues)({}, node), { + selections + }); + }, + FragmentDefinition() { + return null; } - return result; }); } -decode.defaultChars = ';/?:@&=+$,#'; -decode.componentChars = ''; -const encodeCache = {}; -// Create a lookup array where anything but characters in `chars` string -// and alphanumeric chars is percent-encoded. -// -function getEncodeCache(exclude) { - let cache = encodeCache[exclude]; - if (cache) { - return cache; - } - cache = encodeCache[exclude] = []; - for (let i = 0; i < 128; i++) { - const ch = String.fromCharCode(i); - if (/^[0-9a-z]$/i.test(ch)) { - // always allow unencoded alphanumeric characters - cache.push(ch); - } else { - cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2)); - } - } - for (let i = 0; i < exclude.length; i++) { - cache[exclude.charCodeAt(i)] = exclude[i]; +/***/ }), + +/***/ "../../graphiql-toolkit/dist/esm/graphql-helpers/operation-name.js": +/*!*************************************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/graphql-helpers/operation-name.js ***! + \*************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.getSelectedOperationName = getSelectedOperationName; +__webpack_require__(/*! ../chunk-LMOQIXV4.js */ "../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js"); +function getSelectedOperationName(prevOperations, prevSelectedOperationName, operations) { + if (!operations || operations.length < 1) return; + const names = operations.map(op => { + var _a; + return (_a = op.name) == null ? void 0 : _a.value; + }); + if (prevSelectedOperationName && names.includes(prevSelectedOperationName)) return prevSelectedOperationName; + if (prevSelectedOperationName && prevOperations) { + const prevIndex = prevOperations.map(op => { + var _a; + return (_a = op.name) == null ? void 0 : _a.value; + }).indexOf(prevSelectedOperationName); + if (prevIndex !== -1 && prevIndex < names.length) return names[prevIndex]; } - return cache; + return names[0]; } -// Encode unsafe characters with percent-encoding, skipping already -// encoded sequences. -// -// - string - string to encode -// - exclude - list of characters to ignore (in addition to a-zA-Z0-9) -// - keepEscaped - don't encode '%' in a correct escape sequence (default: true) -// -function encode(string, exclude, keepEscaped) { - if (typeof exclude !== 'string') { - // encode(string, keepEscaped) - keepEscaped = exclude; - exclude = encode.defaultChars; - } - if (typeof keepEscaped === 'undefined') { - keepEscaped = true; - } - const cache = getEncodeCache(exclude); - let result = ''; - for (let i = 0, l = string.length; i < l; i++) { - const code = string.charCodeAt(i); - if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) { - if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) { - result += string.slice(i, i + 3); - i += 2; - continue; - } +/***/ }), + +/***/ "../../graphiql-toolkit/dist/esm/index.js": +/*!************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/index.js ***! + \************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +var _asyncHelpers = __webpack_require__(/*! ./async-helpers */ "../../graphiql-toolkit/dist/esm/async-helpers/index.js"); +Object.keys(_asyncHelpers).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in exports && exports[key] === _asyncHelpers[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _asyncHelpers[key]; } - if (code < 128) { - result += cache[code]; - continue; + }); +}); +var _createFetcher = __webpack_require__(/*! ./create-fetcher */ "../../graphiql-toolkit/dist/esm/create-fetcher/index.js"); +Object.keys(_createFetcher).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in exports && exports[key] === _createFetcher[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _createFetcher[key]; } - if (code >= 0xD800 && code <= 0xDFFF) { - if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) { - const nextCode = string.charCodeAt(i + 1); - if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) { - result += encodeURIComponent(string[i] + string[i + 1]); - i++; - continue; - } + }); +}); +var _format = __webpack_require__(/*! ./format */ "../../graphiql-toolkit/dist/esm/format/index.js"); +Object.keys(_format).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in exports && exports[key] === _format[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _format[key]; + } + }); +}); +var _graphqlHelpers = __webpack_require__(/*! ./graphql-helpers */ "../../graphiql-toolkit/dist/esm/graphql-helpers/index.js"); +Object.keys(_graphqlHelpers).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in exports && exports[key] === _graphqlHelpers[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _graphqlHelpers[key]; + } + }); +}); +var _storage = __webpack_require__(/*! ./storage */ "../../graphiql-toolkit/dist/esm/storage/index.js"); +Object.keys(_storage).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in exports && exports[key] === _storage[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _storage[key]; + } + }); +}); + +/***/ }), + +/***/ "../../graphiql-toolkit/dist/esm/storage/base.js": +/*!*******************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/storage/base.js ***! + \*******************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.StorageAPI = void 0; +__webpack_require__(/*! ../chunk-LMOQIXV4.js */ "../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js"); +function isQuotaError(storage, e) { + return e instanceof DOMException && ( + // everything except Firefox + e.code === 22 || + // Firefox + e.code === 1014 || + // test name field too, because code might not be present + // everything except Firefox + e.name === "QuotaExceededError" || + // Firefox + e.name === "NS_ERROR_DOM_QUOTA_REACHED") && + // acknowledge QuotaExceededError only if there's something already stored + storage.length !== 0; +} +class StorageAPI { + constructor(storage) { + storage ? this.storage = storage : storage === null ? this.storage = null : typeof window == "undefined" ? this.storage = null : this.storage = { + getItem: localStorage.getItem.bind(localStorage), + setItem: localStorage.setItem.bind(localStorage), + removeItem: localStorage.removeItem.bind(localStorage), + get length() { + let keys = 0; + for (const key in localStorage) key.indexOf(`${STORAGE_NAMESPACE}:`) === 0 && (keys += 1); + return keys; + }, + clear() { + for (const key in localStorage) key.indexOf(`${STORAGE_NAMESPACE}:`) === 0 && localStorage.removeItem(key); } - result += '%EF%BF%BD'; - continue; + }; + } + get(name) { + if (!this.storage) return null; + const key = `${STORAGE_NAMESPACE}:${name}`, + value = this.storage.getItem(key); + return value === "null" || value === "undefined" ? (this.storage.removeItem(key), null) : value || null; + } + set(name, value) { + let quotaError = !1, + error = null; + if (this.storage) { + const key = `${STORAGE_NAMESPACE}:${name}`; + if (value) try { + this.storage.setItem(key, value); + } catch (e) { + error = e instanceof Error ? e : new Error(`${e}`), quotaError = isQuotaError(this.storage, e); + } else this.storage.removeItem(key); } - result += encodeURIComponent(string[i]); + return { + isQuotaError: quotaError, + error + }; } - return result; -} -encode.defaultChars = ";/?:@&=+$,-_.!~*'()#"; -encode.componentChars = "-_.!~*'()"; -function format(url) { - let result = ''; - result += url.protocol || ''; - result += url.slashes ? '//' : ''; - result += url.auth ? url.auth + '@' : ''; - if (url.hostname && url.hostname.indexOf(':') !== -1) { - // ipv6 address - result += '[' + url.hostname + ']'; - } else { - result += url.hostname || ''; + clear() { + this.storage && this.storage.clear(); } - result += url.port ? ':' + url.port : ''; - result += url.pathname || ''; - result += url.search || ''; - result += url.hash || ''; - return result; } +exports.StorageAPI = StorageAPI; +const STORAGE_NAMESPACE = "graphiql"; -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. +/***/ }), -// -// Changes from joyent/node: -// -// 1. No leading slash in paths, -// e.g. in `url.parse('http://foo?bar')` pathname is ``, not `/` -// -// 2. Backslashes are not replaced with slashes, -// so `http:\\example.org\` is treated like a relative path -// -// 3. Trailing colon is treated like a part of the path, -// i.e. in `http://example.org:foo` pathname is `:foo` -// -// 4. Nothing is URL-encoded in the resulting object, -// (in joyent/node some chars in auth and paths are encoded) -// -// 5. `url.parse()` does not have `parseQueryString` argument -// -// 6. Removed extraneous result properties: `host`, `path`, `query`, etc., -// which can be constructed using other parts of the url. -// +/***/ "../../graphiql-toolkit/dist/esm/storage/custom.js": +/*!*********************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/storage/custom.js ***! + \*********************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -function Url() { - this.protocol = null; - this.slashes = null; - this.auth = null; - this.port = null; - this.hostname = null; - this.hash = null; - this.search = null; - this.pathname = null; -} -// Reference: RFC 3986, RFC 1808, RFC 2396 -// define these here so at least they only have to be -// compiled once on the first module load. -const protocolPattern = /^([a-z0-9.+-]+:)/i; -const portPattern = /:[0-9]*$/; +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.createLocalStorage = createLocalStorage; +__webpack_require__(/*! ../chunk-LMOQIXV4.js */ "../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js"); +function createLocalStorage({ + namespace +}) { + const storageKeyPrefix = `${namespace}:`, + getStorageKey = key => `${storageKeyPrefix}${key}`; + return { + setItem: (key, value) => localStorage.setItem(getStorageKey(key), value), + getItem: key => localStorage.getItem(getStorageKey(key)), + removeItem: key => localStorage.removeItem(getStorageKey(key)), + get length() { + let keys = 0; + for (const key in localStorage) key.indexOf(storageKeyPrefix) === 0 && (keys += 1); + return keys; + }, + clear() { + for (const key in localStorage) key.indexOf(storageKeyPrefix) === 0 && localStorage.removeItem(key); + } + }; +} -// Special case for a simple path URL -/* eslint-disable-next-line no-useless-escape */ -const simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/; +/***/ }), -// RFC 2396: characters reserved for delimiting URLs. -// We actually just auto-escape these. -const delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t']; +/***/ "../../graphiql-toolkit/dist/esm/storage/history.js": +/*!**********************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/storage/history.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { -// RFC 2396: characters not allowed for various reasons. -const unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims); -// Allowed by RFCs, but cause of XSS attacks. Always escape these. -const autoEscape = ['\''].concat(unwise); -// Characters that are never ever allowed in a hostname. -// Note that any invalid chars are also handled, but these -// are the ones that are *expected* to be seen, so we fast-path -// them. -const nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape); -const hostEndingChars = ['/', '?', '#']; -const hostnameMaxLen = 255; -const hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/; -const hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/; -// protocols that can allow "unsafe" and "unwise" chars. -// protocols that never have a hostname. -const hostlessProtocol = { - javascript: true, - 'javascript:': true -}; -// protocols that always contain a // bit. -const slashedProtocol = { - http: true, - https: true, - ftp: true, - gopher: true, - file: true, - 'http:': true, - 'https:': true, - 'ftp:': true, - 'gopher:': true, - 'file:': true -}; -function urlParse(url, slashesDenoteHost) { - if (url && url instanceof Url) return url; - const u = new Url(); - u.parse(url, slashesDenoteHost); - return u; -} -Url.prototype.parse = function (url, slashesDenoteHost) { - let lowerProto, hec, slashes; - let rest = url; - // trim before proceeding. - // This is to support parse stuff like " http://foo.com \n" - rest = rest.trim(); - if (!slashesDenoteHost && url.split('#').length === 1) { - // Try fast path regexp - const simplePath = simplePathPattern.exec(rest); - if (simplePath) { - this.pathname = simplePath[1]; - if (simplePath[2]) { - this.search = simplePath[2]; +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.HistoryStore = void 0; +var _chunkLMOQIXV = __webpack_require__(/*! ../chunk-LMOQIXV4.js */ "../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js"); +var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +var _query = __webpack_require__(/*! ./query */ "../../graphiql-toolkit/dist/esm/storage/query.js"); +const MAX_QUERY_SIZE = 1e5; +class HistoryStore { + constructor(storage, maxHistoryLength) { + this.storage = storage; + this.maxHistoryLength = maxHistoryLength; + this.updateHistory = ({ + query, + variables, + headers, + operationName + }) => { + if (!this.shouldSaveQuery(query, variables, headers, this.history.fetchRecent())) return; + this.history.push({ + query, + variables, + headers, + operationName + }); + const historyQueries = this.history.items, + favoriteQueries = this.favorite.items; + this.queries = historyQueries.concat(favoriteQueries); + }; + this.deleteHistory = ({ + query, + variables, + headers, + operationName, + favorite + }, clearFavorites = !1) => { + function deleteFromStore(store) { + const found = store.items.find(x => x.query === query && x.variables === variables && x.headers === headers && x.operationName === operationName); + found && store.delete(found); } - return this; + (favorite || clearFavorites) && deleteFromStore(this.favorite), (!favorite || clearFavorites) && deleteFromStore(this.history), this.queries = [...this.history.items, ...this.favorite.items]; + }; + this.history = new _query.QueryStore("queries", this.storage, this.maxHistoryLength), this.favorite = new _query.QueryStore("favorites", this.storage, null), this.queries = [...this.history.fetchAll(), ...this.favorite.fetchAll()]; + } + shouldSaveQuery(query, variables, headers, lastQuerySaved) { + if (!query) return !1; + try { + (0, _graphql.parse)(query); + } catch (e) { + return !1; } + return query.length > MAX_QUERY_SIZE ? !1 : lastQuerySaved ? !(JSON.stringify(query) === JSON.stringify(lastQuerySaved.query) && (JSON.stringify(variables) === JSON.stringify(lastQuerySaved.variables) && (JSON.stringify(headers) === JSON.stringify(lastQuerySaved.headers) || headers && !lastQuerySaved.headers) || variables && !lastQuerySaved.variables)) : !0; } - let proto = protocolPattern.exec(rest); - if (proto) { - proto = proto[0]; - lowerProto = proto.toLowerCase(); - this.protocol = proto; - rest = rest.substr(proto.length); + toggleFavorite({ + query, + variables, + headers, + operationName, + label, + favorite + }) { + const item = { + query, + variables, + headers, + operationName, + label + }; + favorite ? (item.favorite = !1, this.favorite.delete(item), this.history.push(item)) : (item.favorite = !0, this.favorite.push(item), this.history.delete(item)), this.queries = [...this.history.items, ...this.favorite.items]; } - - // figure out if it's got a host - // user@server is *always* interpreted as a hostname, and url - // resolution will treat //foo/bar as host=foo,path=bar because that's - // how the browser resolves relative URLs. - /* eslint-disable-next-line no-useless-escape */ - if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) { - slashes = rest.substr(0, 2) === '//'; - if (slashes && !(proto && hostlessProtocol[proto])) { - rest = rest.substr(2); - this.slashes = true; - } + editLabel({ + query, + variables, + headers, + operationName, + label, + favorite + }, index) { + const item = { + query, + variables, + headers, + operationName, + label + }; + favorite ? this.favorite.edit((0, _chunkLMOQIXV.__spreadProps)((0, _chunkLMOQIXV.__spreadValues)({}, item), { + favorite + }), index) : this.history.edit(item, index), this.queries = [...this.history.items, ...this.favorite.items]; } - if (!hostlessProtocol[proto] && (slashes || proto && !slashedProtocol[proto])) { - // there's a hostname. - // the first instance of /, ?, ;, or # ends the host. - // - // If there is an @ in the hostname, then non-host chars *are* allowed - // to the left of the last @ sign, unless some host-ending character - // comes *before* the @-sign. - // URLs are obnoxious. - // - // ex: - // http://a@b@c/ => user:a@b host:c - // http://a@b?@c => user:a host:c path:/?@c +} +exports.HistoryStore = HistoryStore; - // v0.12 TODO(isaacs): This is not quite how Chrome does things. - // Review our test case against browsers more comprehensively. +/***/ }), - // find the first instance of any hostEndingChars - let hostEnd = -1; - for (let i = 0; i < hostEndingChars.length; i++) { - hec = rest.indexOf(hostEndingChars[i]); - if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) { - hostEnd = hec; - } - } +/***/ "../../graphiql-toolkit/dist/esm/storage/index.js": +/*!********************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/storage/index.js ***! + \********************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - // at this point, either we have an explicit point where the - // auth portion cannot go past, or the last @ char is the decider. - let auth, atSign; - if (hostEnd === -1) { - // atSign can be anywhere. - atSign = rest.lastIndexOf('@'); - } else { - // atSign must be in auth portion. - // http://a@b/c@d => host:b auth:a path:/c@d - atSign = rest.lastIndexOf('@', hostEnd); - } - // Now we have a portion which is definitely the auth. - // Pull that off. - if (atSign !== -1) { - auth = rest.slice(0, atSign); - rest = rest.slice(atSign + 1); - this.auth = auth; - } - // the host is the remaining to the left of the first non-host char - hostEnd = -1; - for (let i = 0; i < nonHostChars.length; i++) { - hec = rest.indexOf(nonHostChars[i]); - if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) { - hostEnd = hec; - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +var _base = __webpack_require__(/*! ./base */ "../../graphiql-toolkit/dist/esm/storage/base.js"); +Object.keys(_base).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in exports && exports[key] === _base[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _base[key]; } - // if we still have not hit it, then the entire thing is a host. - if (hostEnd === -1) { - hostEnd = rest.length; + }); +}); +var _history = __webpack_require__(/*! ./history */ "../../graphiql-toolkit/dist/esm/storage/history.js"); +Object.keys(_history).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in exports && exports[key] === _history[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _history[key]; } - if (rest[hostEnd - 1] === ':') { - hostEnd--; + }); +}); +var _query = __webpack_require__(/*! ./query */ "../../graphiql-toolkit/dist/esm/storage/query.js"); +Object.keys(_query).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in exports && exports[key] === _query[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _query[key]; } - const host = rest.slice(0, hostEnd); - rest = rest.slice(hostEnd); + }); +}); +var _custom = __webpack_require__(/*! ./custom */ "../../graphiql-toolkit/dist/esm/storage/custom.js"); +Object.keys(_custom).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + if (key in exports && exports[key] === _custom[key]) return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _custom[key]; + } + }); +}); - // pull out port. - this.parseHost(host); +/***/ }), - // we've indicated that there is a hostname, - // so even if it's empty, it has to be present. - this.hostname = this.hostname || ''; +/***/ "../../graphiql-toolkit/dist/esm/storage/query.js": +/*!********************************************************!*\ + !*** ../../graphiql-toolkit/dist/esm/storage/query.js ***! + \********************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - // if hostname begins with [ and ends with ] - // assume that it's an IPv6 address. - const ipv6Hostname = this.hostname[0] === '[' && this.hostname[this.hostname.length - 1] === ']'; - // validate a little. - if (!ipv6Hostname) { - const hostparts = this.hostname.split(/\./); - for (let i = 0, l = hostparts.length; i < l; i++) { - const part = hostparts[i]; - if (!part) { - continue; - } - if (!part.match(hostnamePartPattern)) { - let newpart = ''; - for (let j = 0, k = part.length; j < k; j++) { - if (part.charCodeAt(j) > 127) { - // we replace non-ASCII char with a temporary placeholder - // we need this to make sure size of hostname is not - // broken by replacing non-ASCII by nothing - newpart += 'x'; - } else { - newpart += part[j]; - } - } - // we test again with ASCII char only - if (!newpart.match(hostnamePartPattern)) { - const validParts = hostparts.slice(0, i); - const notHost = hostparts.slice(i + 1); - const bit = part.match(hostnamePartStart); - if (bit) { - validParts.push(bit[1]); - notHost.unshift(bit[2]); - } - if (notHost.length) { - rest = notHost.join('.') + rest; - } - this.hostname = validParts.join('.'); - break; - } - } - } - } - if (this.hostname.length > hostnameMaxLen) { - this.hostname = ''; - } - // strip [ and ] from the hostname - // the host field still retains them, though - if (ipv6Hostname) { - this.hostname = this.hostname.substr(1, this.hostname.length - 2); - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.QueryStore = void 0; +__webpack_require__(/*! ../chunk-LMOQIXV4.js */ "../../graphiql-toolkit/dist/esm/chunk-LMOQIXV4.js"); +class QueryStore { + constructor(key, storage, maxSize = null) { + this.key = key; + this.storage = storage; + this.maxSize = maxSize; + this.items = this.fetchAll(); } - - // chop off from the tail first. - const hash = rest.indexOf('#'); - if (hash !== -1) { - // got a fragment string. - this.hash = rest.substr(hash); - rest = rest.slice(0, hash); + get length() { + return this.items.length; } - const qm = rest.indexOf('?'); - if (qm !== -1) { - this.search = rest.substr(qm); - rest = rest.slice(0, qm); + contains(item) { + return this.items.some(x => x.query === item.query && x.variables === item.variables && x.headers === item.headers && x.operationName === item.operationName); } - if (rest) { - this.pathname = rest; + edit(item, index) { + if (typeof index == "number" && this.items[index]) { + const found = this.items[index]; + if (found.query === item.query && found.variables === item.variables && found.headers === item.headers && found.operationName === item.operationName) { + this.items.splice(index, 1, item), this.save(); + return; + } + } + const itemIndex = this.items.findIndex(x => x.query === item.query && x.variables === item.variables && x.headers === item.headers && x.operationName === item.operationName); + itemIndex !== -1 && (this.items.splice(itemIndex, 1, item), this.save()); } - if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) { - this.pathname = ''; + delete(item) { + const itemIndex = this.items.findIndex(x => x.query === item.query && x.variables === item.variables && x.headers === item.headers && x.operationName === item.operationName); + itemIndex !== -1 && (this.items.splice(itemIndex, 1), this.save()); } - return this; -}; -Url.prototype.parseHost = function (host) { - let port = portPattern.exec(host); - if (port) { - port = port[0]; - if (port !== ':') { - this.port = port.substr(1); + fetchRecent() { + return this.items.at(-1); + } + fetchAll() { + const raw = this.storage.get(this.key); + return raw ? JSON.parse(raw)[this.key] : []; + } + push(item) { + const items = [...this.items, item]; + this.maxSize && items.length > this.maxSize && items.shift(); + for (let attempts = 0; attempts < 5; attempts++) { + const response = this.storage.set(this.key, JSON.stringify({ + [this.key]: items + })); + if (!(response != null && response.error)) this.items = items;else if (response.isQuotaError && this.maxSize) items.shift();else return; } - host = host.substr(0, host.length - port.length); } - if (host) { - this.hostname = host; + save() { + this.storage.set(this.key, JSON.stringify({ + [this.key]: this.items + })); } -}; -exports.decode = decode; -exports.encode = encode; -exports.format = format; -exports.parse = urlParse; - -/***/ }), - -/***/ "../node_modules/uc.micro/build/index.cjs.js": -/*!***************************************************!*\ - !*** ../node_modules/uc.micro/build/index.cjs.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -var regex$5 = /[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; -var regex$4 = /[\0-\x1F\x7F-\x9F]/; -var regex$3 = /[\xAD\u0600-\u0605\u061C\u06DD\u070F\u0890\u0891\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC3F]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/; -var regex$2 = /[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\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\u1B7D\u1B7E\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-\u2E5D\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]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/; -var regex$1 = /[\$\+<->\^`\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFF\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uAB6A\uAB6B\uFB29\uFBB2-\uFBC2\uFD40-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC5\uDECE-\uDEDB\uDEE0-\uDEE8\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFCA]/; -var regex = /[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/; -exports.Any = regex$5; -exports.Cc = regex$4; -exports.Cf = regex$3; -exports.P = regex$2; -exports.S = regex$1; -exports.Z = regex; +} +exports.QueryStore = QueryStore; /***/ }), @@ -72912,14 +80107,14 @@ exports.GraphiQL = GraphiQL; exports.GraphiQLInterface = GraphiQLInterface; var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); var _react2 = __webpack_require__(/*! @graphiql/react */ "../../graphiql-react/dist/index.js"); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } /** - * Copyright (c) 2020 GraphQL Contributors. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ + * Copyright (c) 2020 GraphQL Contributors. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ const majorVersion = parseInt(_react.default.version.slice(0, 2), 10); if (majorVersion < 16) { throw new Error(['GraphiQL 0.18.0 and after is not compatible with React 15 or below.', 'If you are using a CDN source (jsdelivr, unpkg, etc), follow this example:', 'https://github.com/graphql/graphiql/blob/master/examples/graphiql-cdn/index.html#L49'].join('\n')); @@ -72937,38 +80132,37 @@ if (majorVersion < 16) { * * @see https://github.com/graphql/graphiql#usage */ - -function GraphiQL(_ref) { +function GraphiQL({ + dangerouslyAssumeSchemaIsValid, + confirmCloseTab, + defaultQuery, + defaultTabs, + externalFragments, + fetcher, + getDefaultFieldNames, + headers, + inputValueDeprecation, + introspectionQueryName, + maxHistoryLength, + onEditOperationName, + onSchemaChange, + onTabChange, + onTogglePluginVisibility, + operationName, + plugins, + query, + response, + schema, + schemaDescription, + shouldPersistHeaders, + storage, + validationRules, + variables, + visiblePlugin, + defaultHeaders, + ...props +}) { var _props$disableTabs; - let { - dangerouslyAssumeSchemaIsValid, - defaultQuery, - defaultTabs, - externalFragments, - fetcher, - getDefaultFieldNames, - headers, - inputValueDeprecation, - introspectionQueryName, - maxHistoryLength, - onEditOperationName, - onSchemaChange, - onTabChange, - onTogglePluginVisibility, - operationName, - plugins, - query, - response, - schema, - schemaDescription, - shouldPersistHeaders, - storage, - validationRules, - variables, - visiblePlugin, - defaultHeaders, - ...props - } = _ref; // Ensure props are correct if (typeof fetcher !== 'function') { throw new TypeError('The `GraphiQL` component requires a `fetcher` function to be passed as prop.'); @@ -73001,8 +80195,10 @@ function GraphiQL(_ref) { validationRules: validationRules, variables: variables }, /*#__PURE__*/_react.default.createElement(GraphiQLInterface, _extends({ + confirmCloseTab: confirmCloseTab, showPersistHeadersSettings: shouldPersistHeaders !== false, - disableTabs: (_props$disableTabs = props.disableTabs) !== null && _props$disableTabs !== void 0 ? _props$disableTabs : false + disableTabs: (_props$disableTabs = props.disableTabs) !== null && _props$disableTabs !== void 0 ? _props$disableTabs : false, + forcedTheme: props.forcedTheme }, props))); } @@ -73010,6 +80206,8 @@ function GraphiQL(_ref) { GraphiQL.Logo = GraphiQLLogo; GraphiQL.Toolbar = GraphiQLToolbar; GraphiQL.Footer = GraphiQLFooter; +const THEMES = ['light', 'dark', 'system']; +const TAB_CLASS_PREFIX = 'graphiql-session-tab-'; function GraphiQLInterface(props) { var _props$isHeadersEdito, _pluginContext$visibl, _props$toolbar, _props$toolbar2; const isHeadersEditorEnabled = (_props$isHeadersEdito = props.isHeadersEditorEnabled) !== null && _props$isHeadersEdito !== void 0 ? _props$isHeadersEdito : true; @@ -73024,6 +80222,7 @@ function GraphiQLInterface(props) { }); const storageContext = (0, _react2.useStorageContext)(); const pluginContext = (0, _react2.usePluginContext)(); + const forcedTheme = (0, _react.useMemo)(() => props.forcedTheme && THEMES.includes(props.forcedTheme) ? props.forcedTheme : undefined, [props.forcedTheme]); const copy = (0, _react2.useCopyQuery)({ onCopyQuery: props.onCopyQuery }); @@ -73032,7 +80231,14 @@ function GraphiQLInterface(props) { const { theme, setTheme - } = (0, _react2.useTheme)(); + } = (0, _react2.useTheme)(props.defaultTheme); + (0, _react.useEffect)(() => { + if (forcedTheme === 'system') { + setTheme(null); + } else if (forcedTheme === 'light' || forcedTheme === 'dark') { + setTheme(forcedTheme); + } + }, [forcedTheme, setTheme]); const PluginContent = pluginContext === null || pluginContext === void 0 ? void 0 : (_pluginContext$visibl = pluginContext.visiblePlugin) === null || _pluginContext$visibl === void 0 ? void 0 : _pluginContext$visibl.content; const pluginResize = (0, _react2.useDragResize)({ defaultSizeRelation: 1 / 3, @@ -73093,7 +80299,7 @@ function GraphiQLInterface(props) { }, /*#__PURE__*/_react.default.createElement(_react2.CopyIcon, { className: "graphiql-toolbar-icon", "aria-hidden": "true" - })), ((_props$toolbar = props.toolbar) === null || _props$toolbar === void 0 ? void 0 : _props$toolbar.additionalContent) && props.toolbar.additionalContent, ((_props$toolbar2 = props.toolbar) === null || _props$toolbar2 === void 0 ? void 0 : _props$toolbar2.additionalComponent) && /*#__PURE__*/_react.default.createElement(props.toolbar.additionalComponent, null)); + })), (_props$toolbar = props.toolbar) === null || _props$toolbar === void 0 ? void 0 : _props$toolbar.additionalContent, ((_props$toolbar2 = props.toolbar) === null || _props$toolbar2 === void 0 ? void 0 : _props$toolbar2.additionalComponent) && /*#__PURE__*/_react.default.createElement(props.toolbar.additionalComponent, null)); const footer = children.find(child => isChildComponentType(child, GraphiQL.Footer)); const onClickReference = (0, _react.useCallback)(() => { if (pluginResize.hiddenElement === 'first') { @@ -73121,9 +80327,9 @@ function GraphiQLInterface(props) { const handleShowDialog = (0, _react.useCallback)(event => { setShowDialog(event.currentTarget.dataset.value); }, []); - const handlePluginClick = (0, _react.useCallback)(e => { + const handlePluginClick = (0, _react.useCallback)(event => { const context = pluginContext; - const pluginIndex = Number(e.currentTarget.dataset.index); + const pluginIndex = Number(event.currentTarget.dataset.index); const plugin = context.plugins.find((_, index) => pluginIndex === index); const isVisible = plugin === context.visiblePlugin; if (isVisible) { @@ -73164,9 +80370,39 @@ function GraphiQLInterface(props) { }, /*#__PURE__*/_react.default.createElement(_react2.PlusIcon, { "aria-hidden": "true" }))); + const className = props.className ? ` ${props.className}` : ''; + const confirmClose = props.confirmCloseTab; + const handleTabClose = (0, _react.useCallback)(async event => { + const tabButton = event.currentTarget.previousSibling; + const index = Number(tabButton.id.replace(TAB_CLASS_PREFIX, '')); + + /** TODO: + * Move everything after into `editorContext.closeTab` once zustand will be used instead of + * React context, since now we can't use execution context inside editor context, since editor + * context is used in execution context. + */ + const shouldCloseTab = confirmClose ? await confirmClose(index) : true; + if (!shouldCloseTab) { + return; + } + if (editorContext.activeTabIndex === index) { + executionContext.stop(); + } + editorContext.closeTab(index); + }, [confirmClose, editorContext, executionContext]); + const handleTabClick = (0, _react.useCallback)(event => { + const index = Number(event.currentTarget.id.replace(TAB_CLASS_PREFIX, '')); + /** TODO: + * Move everything after into `editorContext.changeTab` once zustand will be used instead of + * React context, since now we can't use execution context inside editor context, since editor + * context is used in execution context. + */ + executionContext.stop(); + editorContext.changeTab(index); + }, [editorContext, executionContext]); return /*#__PURE__*/_react.default.createElement(_react2.Tooltip.Provider, null, /*#__PURE__*/_react.default.createElement("div", { "data-testid": "graphiql-container", - className: "graphiql-container" + className: `graphiql-container${className}` }, /*#__PURE__*/_react.default.createElement("div", { className: "graphiql-sidebar" }, /*#__PURE__*/_react.default.createElement("div", { @@ -73174,7 +80410,6 @@ function GraphiQLInterface(props) { }, pluginContext === null || pluginContext === void 0 ? void 0 : pluginContext.plugins.map((plugin, index) => { const isVisible = plugin === pluginContext.visiblePlugin; const label = `${isVisible ? 'Hide' : 'Show'} ${plugin.title}`; - const Icon = plugin.icon; return /*#__PURE__*/_react.default.createElement(_react2.Tooltip, { key: plugin.title, label: label @@ -73184,7 +80419,7 @@ function GraphiQLInterface(props) { onClick: handlePluginClick, "data-index": index, "aria-label": label - }, /*#__PURE__*/_react.default.createElement(Icon, { + }, /*#__PURE__*/_react.default.createElement(plugin.icon, { "aria-hidden": "true" }))); })), /*#__PURE__*/_react.default.createElement("div", { @@ -73236,7 +80471,7 @@ function GraphiQLInterface(props) { className: "graphiql-sessions" }, /*#__PURE__*/_react.default.createElement("div", { className: "graphiql-session-header" - }, props.disableTabs ? null : /*#__PURE__*/_react.default.createElement(_react2.Tabs, { + }, !props.disableTabs && /*#__PURE__*/_react.default.createElement(_react2.Tabs, { values: editorContext.tabs, onReorder: handleReorder, "aria-label": "Select active operation" @@ -73246,25 +80481,18 @@ function GraphiQLInterface(props) { isActive: index === editorContext.activeTabIndex }, /*#__PURE__*/_react.default.createElement(_react2.Tab.Button, { "aria-controls": "graphiql-session", - id: `graphiql-session-tab-${index}`, - onClick: () => { - executionContext.stop(); - editorContext.changeTab(index); - } + id: `${TAB_CLASS_PREFIX}${index}`, + onClick: handleTabClick }, tab.title), /*#__PURE__*/_react.default.createElement(_react2.Tab.Close, { - onClick: () => { - if (editorContext.activeTabIndex === index) { - executionContext.stop(); - } - editorContext.closeTab(index); - } + onClick: handleTabClose }))), addTab)), /*#__PURE__*/_react.default.createElement("div", { className: "graphiql-session-header-right" }, editorContext.tabs.length === 1 && addTab, logo)), /*#__PURE__*/_react.default.createElement("div", { role: "tabpanel", - id: "graphiql-session", + id: "graphiql-session" // used by aria-controls="graphiql-session" + , className: "graphiql-session", - "aria-labelledby": `graphiql-session-tab-${editorContext.activeTabIndex}` + "aria-labelledby": `${TAB_CLASS_PREFIX}${editorContext.activeTabIndex}` }, /*#__PURE__*/_react.default.createElement("div", { ref: editorResize.firstRef }, /*#__PURE__*/_react.default.createElement("div", { @@ -73378,13 +80606,13 @@ function GraphiQLInterface(props) { id: "disable-persist-headers", className: editorContext.shouldPersistHeaders ? '' : 'active', onClick: handlePersistHeaders - }, "Off"))) : null, /*#__PURE__*/_react.default.createElement("div", { + }, "Off"))) : null, !forcedTheme && /*#__PURE__*/_react.default.createElement("div", { className: "graphiql-dialog-section" }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", { className: "graphiql-dialog-section-title" }, "Theme"), /*#__PURE__*/_react.default.createElement("div", { className: "graphiql-dialog-section-caption" - }, "Adjust how the interface looks like.")), /*#__PURE__*/_react.default.createElement(_react2.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(_react2.Button, { + }, "Adjust how the interface appears.")), /*#__PURE__*/_react.default.createElement(_react2.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(_react2.Button, { type: "button", className: theme === null ? 'active' : '', onClick: handleChangeTheme @@ -73414,7 +80642,7 @@ function GraphiQLInterface(props) { error: 'Failed' }[clearStorageStatus] || 'Clear data')) : null))); } -const modifier = typeof window !== 'undefined' && window.navigator.platform.toLowerCase().indexOf('mac') === 0 ? 'Cmd' : 'Ctrl'; +const modifier = _react2.isMacOs ? '⌘' : 'Ctrl'; const SHORT_KEYS = Object.entries({ 'Search in editor': [modifier, 'F'], 'Search in documentation': [modifier, 'K'], @@ -73424,22 +80652,18 @@ const SHORT_KEYS = Object.entries({ 'Copy query': ['Ctrl', 'Shift', 'C'], 'Re-fetch schema using introspection': ['Ctrl', 'Shift', 'R'] }); -function ShortKeys(_ref2) { - let { - keyMap - } = _ref2; +function ShortKeys({ + keyMap +}) { return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("table", { className: "graphiql-table" - }, /*#__PURE__*/_react.default.createElement("thead", null, /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("th", null, "Short Key"), /*#__PURE__*/_react.default.createElement("th", null, "Function"))), /*#__PURE__*/_react.default.createElement("tbody", null, SHORT_KEYS.map(_ref3 => { - let [title, keys] = _ref3; - return /*#__PURE__*/_react.default.createElement("tr", { - key: title - }, /*#__PURE__*/_react.default.createElement("td", null, keys.map((key, index, array) => /*#__PURE__*/_react.default.createElement(_react.Fragment, { - key: key - }, /*#__PURE__*/_react.default.createElement("code", { - className: "graphiql-key" - }, key), index !== array.length - 1 && ' + '))), /*#__PURE__*/_react.default.createElement("td", null, title)); - }))), /*#__PURE__*/_react.default.createElement("p", null, "The editors use", ' ', /*#__PURE__*/_react.default.createElement("a", { + }, /*#__PURE__*/_react.default.createElement("thead", null, /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("th", null, "Short Key"), /*#__PURE__*/_react.default.createElement("th", null, "Function"))), /*#__PURE__*/_react.default.createElement("tbody", null, SHORT_KEYS.map(([title, keys]) => /*#__PURE__*/_react.default.createElement("tr", { + key: title + }, /*#__PURE__*/_react.default.createElement("td", null, keys.map((key, index, array) => /*#__PURE__*/_react.default.createElement(_react.Fragment, { + key: key + }, /*#__PURE__*/_react.default.createElement("code", { + className: "graphiql-key" + }, key), index !== array.length - 1 && ' + '))), /*#__PURE__*/_react.default.createElement("td", null, title))))), /*#__PURE__*/_react.default.createElement("p", null, "The editors use", ' ', /*#__PURE__*/_react.default.createElement("a", { href: "https://codemirror.net/5/doc/manual.html#keymaps", target: "_blank", rel: "noopener noreferrer" @@ -73520,6 +80744,12 @@ Object.defineProperty(exports, "FileChangeTypeKind", ({ return _types.FileChangeTypeKind; } })); +Object.defineProperty(exports, "GraphQLDocumentMode", ({ + enumerable: true, + get: function () { + return _parser.GraphQLDocumentMode; + } +})); Object.defineProperty(exports, "LexRules", ({ enumerable: true, get: function () { @@ -73586,6 +80816,12 @@ Object.defineProperty(exports, "getAutocompleteSuggestions", ({ return _interface.getAutocompleteSuggestions; } })); +Object.defineProperty(exports, "getDefinitionQueryResultForArgument", ({ + enumerable: true, + get: function () { + return _interface.getDefinitionQueryResultForArgument; + } +})); Object.defineProperty(exports, "getDefinitionQueryResultForDefinitionNode", ({ enumerable: true, get: function () { @@ -73613,7 +80849,7 @@ Object.defineProperty(exports, "getDefinitionQueryResultForNamedType", ({ Object.defineProperty(exports, "getDefinitionState", ({ enumerable: true, get: function () { - return _interface.getDefinitionState; + return _parser.getDefinitionState; } })); Object.defineProperty(exports, "getDiagnostics", ({ @@ -73625,7 +80861,7 @@ Object.defineProperty(exports, "getDiagnostics", ({ Object.defineProperty(exports, "getFieldDef", ({ enumerable: true, get: function () { - return _interface.getFieldDef; + return _parser.getFieldDef; } })); Object.defineProperty(exports, "getFragmentDefinitions", ({ @@ -73685,7 +80921,7 @@ Object.defineProperty(exports, "getRange", ({ Object.defineProperty(exports, "getTokenAtPosition", ({ enumerable: true, get: function () { - return _interface.getTokenAtPosition; + return _parser.getTokenAtPosition; } })); Object.defineProperty(exports, "getTypeInfo", ({ @@ -73784,53 +81020,10 @@ var _utils = __webpack_require__(/*! ./utils */ "../../graphql-language-service/ Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.forEachState = forEachState; -exports.getDefinitionState = getDefinitionState; -exports.getFieldDef = getFieldDef; +exports.getInsertText = exports.getInputInsertText = exports.getFieldInsertText = void 0; exports.hintList = hintList; exports.objectValues = objectValues; var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -function getDefinitionState(tokenState) { - let definitionState; - forEachState(tokenState, state => { - switch (state.kind) { - case 'Query': - case 'ShortQuery': - case 'Mutation': - case 'Subscription': - case 'FragmentDefinition': - definitionState = state; - break; - } - }); - return definitionState; -} -function getFieldDef(schema, type, fieldName) { - if (fieldName === _graphql.SchemaMetaFieldDef.name && schema.getQueryType() === type) { - return _graphql.SchemaMetaFieldDef; - } - if (fieldName === _graphql.TypeMetaFieldDef.name && schema.getQueryType() === type) { - return _graphql.TypeMetaFieldDef; - } - if (fieldName === _graphql.TypeNameMetaFieldDef.name && (0, _graphql.isCompositeType)(type)) { - return _graphql.TypeNameMetaFieldDef; - } - if ('getFields' in type) { - return type.getFields()[fieldName]; - } - return null; -} -function forEachState(stack, fn) { - const reverseStateStack = []; - let state = stack; - while (state === null || state === void 0 ? void 0 : state.kind) { - reverseStateStack.push(state); - state = state.prevState; - } - for (let i = reverseStateStack.length - 1; i >= 0; i--) { - fn(reverseStateStack[i]); - } -} function objectValues(object) { const keys = Object.keys(object); const len = keys.length; @@ -73844,7 +81037,7 @@ function hintList(token, list) { return filterAndSortList(list, normalizeText(token.string)); } function filterAndSortList(list, text) { - if (!text) { + if (!text || text.trim() === '' || text.trim() === ':' || text.trim() === '{') { return filterNonEmpty(list, entry => !entry.isDeprecated); } const byProximity = list.map(entry => ({ @@ -73891,6 +81084,34 @@ function lexicalDistance(a, b) { } return d[aLength][bLength]; } +const insertSuffix = n => ` {\n $${n !== null && n !== void 0 ? n : 1}\n}`; +const getInsertText = (prefix, type, fallback) => { + if (!type) { + return fallback !== null && fallback !== void 0 ? fallback : prefix; + } + const namedType = (0, _graphql.getNamedType)(type); + if ((0, _graphql.isObjectType)(namedType) || (0, _graphql.isInputObjectType)(namedType) || (0, _graphql.isListType)(namedType) || (0, _graphql.isAbstractType)(namedType)) { + return prefix + insertSuffix(); + } + return fallback !== null && fallback !== void 0 ? fallback : prefix; +}; +exports.getInsertText = getInsertText; +const getInputInsertText = (prefix, type, fallback) => { + if ((0, _graphql.isListType)(type)) { + const baseType = (0, _graphql.getNamedType)(type.ofType); + return prefix + `[${getInsertText('', baseType, '$1')}]`; + } + return getInsertText(prefix, type, fallback); +}; +exports.getInputInsertText = getInputInsertText; +const getFieldInsertText = field => { + const requiredArgs = field.args.filter(arg => arg.type.toString().endsWith('!')); + if (!requiredArgs.length) { + return; + } + return field.name + `(${requiredArgs.map((arg, i) => `${arg.name}: $${i + 1}`)}) ${getInsertText('', field.type, '\n')}`; +}; +exports.getFieldInsertText = getFieldInsertText; /***/ }), @@ -73905,23 +81126,32 @@ function lexicalDistance(a, b) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.SuggestionCommand = exports.GraphQLDocumentMode = void 0; +exports.SuggestionCommand = void 0; exports.canUseDirective = canUseDirective; exports.getAutocompleteSuggestions = getAutocompleteSuggestions; exports.getFragmentDefinitions = getFragmentDefinitions; -exports.getTokenAtPosition = getTokenAtPosition; -exports.getTypeInfo = getTypeInfo; +Object.defineProperty(exports, "getTypeInfo", ({ + enumerable: true, + get: function () { + return _parser.getTypeInfo; + } +})); exports.getVariableCompletions = getVariableCompletions; -exports.runOnlineParser = runOnlineParser; +Object.defineProperty(exports, "runOnlineParser", ({ + enumerable: true, + get: function () { + return _parser.runOnlineParser; + } +})); var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); var _types = __webpack_require__(/*! ../types */ "../../graphql-language-service/esm/types.js"); var _parser = __webpack_require__(/*! ../parser */ "../../graphql-language-service/esm/parser/index.js"); var _autocompleteUtils = __webpack_require__(/*! ./autocompleteUtils */ "../../graphql-language-service/esm/interface/autocompleteUtils.js"); -const SuggestionCommand = { +var _vscodeLanguageserverTypes = __webpack_require__(/*! vscode-languageserver-types */ "../../../node_modules/vscode-languageserver-types/lib/esm/main.js"); +const SuggestionCommand = exports.SuggestionCommand = { command: 'editor.action.triggerSuggest', title: 'Suggestions' }; -exports.SuggestionCommand = SuggestionCommand; const collectFragmentDefs = op => { const externalFragments = []; if (op) { @@ -73937,51 +81167,34 @@ const collectFragmentDefs = op => { } return externalFragments; }; -const typeSystemKinds = [_graphql.Kind.SCHEMA_DEFINITION, _graphql.Kind.OPERATION_TYPE_DEFINITION, _graphql.Kind.SCALAR_TYPE_DEFINITION, _graphql.Kind.OBJECT_TYPE_DEFINITION, _graphql.Kind.INTERFACE_TYPE_DEFINITION, _graphql.Kind.UNION_TYPE_DEFINITION, _graphql.Kind.ENUM_TYPE_DEFINITION, _graphql.Kind.INPUT_OBJECT_TYPE_DEFINITION, _graphql.Kind.DIRECTIVE_DEFINITION, _graphql.Kind.SCHEMA_EXTENSION, _graphql.Kind.SCALAR_TYPE_EXTENSION, _graphql.Kind.OBJECT_TYPE_EXTENSION, _graphql.Kind.INTERFACE_TYPE_EXTENSION, _graphql.Kind.UNION_TYPE_EXTENSION, _graphql.Kind.ENUM_TYPE_EXTENSION, _graphql.Kind.INPUT_OBJECT_TYPE_EXTENSION]; -const hasTypeSystemDefinitions = sdl => { - let hasTypeSystemDef = false; - if (sdl) { - try { - (0, _graphql.visit)((0, _graphql.parse)(sdl), { - enter(node) { - if (node.kind === 'Document') { - return; - } - if (typeSystemKinds.includes(node.kind)) { - hasTypeSystemDef = true; - return _graphql.BREAK; - } - return false; - } - }); - } catch (_a) { - return hasTypeSystemDef; - } - } - return hasTypeSystemDef; -}; function getAutocompleteSuggestions(schema, queryText, cursor, contextToken, fragmentDefs, options) { var _a; const opts = Object.assign(Object.assign({}, options), { schema }); - const token = contextToken || getTokenAtPosition(queryText, cursor, 1); - const state = token.state.kind === 'Invalid' ? token.state.prevState : token.state; - const mode = (options === null || options === void 0 ? void 0 : options.mode) || getDocumentMode(queryText, options === null || options === void 0 ? void 0 : options.uri); - if (!state) { + const context = (0, _parser.getContextAtPosition)(queryText, cursor, schema, contextToken, options); + if (!context) { return []; } + const { + state, + typeInfo, + mode, + token + } = context; const { kind, step, prevState } = state; - const typeInfo = getTypeInfo(schema, token.state); if (kind === _parser.RuleKinds.DOCUMENT) { - if (mode === GraphQLDocumentMode.TYPE_SYSTEM) { + if (mode === _parser.GraphQLDocumentMode.TYPE_SYSTEM) { return getSuggestionsForTypeSystemDefinitions(token); } - return getSuggestionsForExecutableDefinitions(token); + if (mode === _parser.GraphQLDocumentMode.EXECUTABLE) { + return getSuggestionsForExecutableDefinitions(token); + } + return getSuggestionsForUnknownDocumentMode(token); } if (kind === _parser.RuleKinds.EXTEND_DEF) { return getSuggestionsForExtensionDefinitions(token); @@ -74040,9 +81253,13 @@ function getAutocompleteSuggestions(schema, queryText, cursor, contextToken, fra var _a; return { label: argDef.name, - insertText: argDef.name + ': ', + insertText: (0, _autocompleteUtils.getInputInsertText)(argDef.name + ': ', argDef.type), + insertTextMode: _vscodeLanguageserverTypes.InsertTextMode.adjustIndentation, + insertTextFormat: _types.InsertTextFormat.Snippet, command: SuggestionCommand, - detail: String(argDef.type), + labelDetails: { + detail: ' ' + String(argDef.type) + }, documentation: (_a = argDef.description) !== null && _a !== void 0 ? _a : undefined, kind: _types.CompletionItemKind.Variable, type: argDef.type @@ -74058,9 +81275,13 @@ function getAutocompleteSuggestions(schema, queryText, cursor, contextToken, fra return { label: field.name, detail: String(field.type), - documentation: (_a = field.description) !== null && _a !== void 0 ? _a : undefined, + documentation: (_a = field === null || field === void 0 ? void 0 : field.description) !== null && _a !== void 0 ? _a : undefined, kind: completionKind, - type: field.type + type: field.type, + insertText: (0, _autocompleteUtils.getInputInsertText)(field.name + ': ', field.type), + insertTextMode: _vscodeLanguageserverTypes.InsertTextMode.adjustIndentation, + insertTextFormat: _types.InsertTextFormat.Snippet, + command: SuggestionCommand }; })); } @@ -74079,19 +81300,22 @@ function getAutocompleteSuggestions(schema, queryText, cursor, contextToken, fra return getSuggestionsForFragmentSpread(token, typeInfo, schema, queryText, Array.isArray(fragmentDefs) ? fragmentDefs : collectFragmentDefs(fragmentDefs)); } const unwrappedState = unwrapType(state); - if (mode === GraphQLDocumentMode.TYPE_SYSTEM && !unwrappedState.needsAdvance && kind === _parser.RuleKinds.NAMED_TYPE || kind === _parser.RuleKinds.LIST_TYPE) { - if (unwrappedState.kind === _parser.RuleKinds.FIELD_DEF) { - return (0, _autocompleteUtils.hintList)(token, Object.values(schema.getTypeMap()).filter(type => (0, _graphql.isOutputType)(type) && !type.name.startsWith('__')).map(type => ({ - label: type.name, - kind: _types.CompletionItemKind.Function - }))); - } - if (unwrappedState.kind === _parser.RuleKinds.INPUT_VALUE_DEF) { - return (0, _autocompleteUtils.hintList)(token, Object.values(schema.getTypeMap()).filter(type => (0, _graphql.isInputType)(type) && !type.name.startsWith('__')).map(type => ({ - label: type.name, - kind: _types.CompletionItemKind.Function - }))); - } + if (unwrappedState.kind === _parser.RuleKinds.FIELD_DEF) { + return (0, _autocompleteUtils.hintList)(token, Object.values(schema.getTypeMap()).filter(type => (0, _graphql.isOutputType)(type) && !type.name.startsWith('__')).map(type => ({ + label: type.name, + kind: _types.CompletionItemKind.Function, + insertText: (options === null || options === void 0 ? void 0 : options.fillLeafsOnComplete) ? type.name + '\n' : type.name, + insertTextMode: _vscodeLanguageserverTypes.InsertTextMode.adjustIndentation + }))); + } + if (unwrappedState.kind === _parser.RuleKinds.INPUT_VALUE_DEF && step === 2) { + return (0, _autocompleteUtils.hintList)(token, Object.values(schema.getTypeMap()).filter(type => (0, _graphql.isInputType)(type) && !type.name.startsWith('__')).map(type => ({ + label: type.name, + kind: _types.CompletionItemKind.Function, + insertText: (options === null || options === void 0 ? void 0 : options.fillLeafsOnComplete) ? type.name + '\n$1' : type.name, + insertTextMode: _vscodeLanguageserverTypes.InsertTextMode.adjustIndentation, + insertTextFormat: _types.InsertTextFormat.Snippet + }))); } if (kind === _parser.RuleKinds.VARIABLE_DEFINITION && step === 2 || kind === _parser.RuleKinds.LIST_TYPE && step === 1 || kind === _parser.RuleKinds.NAMED_TYPE && prevState && (prevState.kind === _parser.RuleKinds.VARIABLE_DEFINITION || prevState.kind === _parser.RuleKinds.LIST_TYPE || prevState.kind === _parser.RuleKinds.NON_NULL_TYPE)) { return getSuggestionsForVariableDefinition(token, schema, kind); @@ -74099,91 +81323,63 @@ function getAutocompleteSuggestions(schema, queryText, cursor, contextToken, fra if (kind === _parser.RuleKinds.DIRECTIVE) { return getSuggestionsForDirective(token, state, schema, kind); } + if (kind === _parser.RuleKinds.DIRECTIVE_DEF) { + return getSuggestionsForDirectiveArguments(token, state, schema, kind); + } return []; } -const insertSuffix = ' {\n $1\n}'; -const getInsertText = field => { - const { - type - } = field; - if ((0, _graphql.isCompositeType)(type)) { - return insertSuffix; - } - if ((0, _graphql.isListType)(type) && (0, _graphql.isCompositeType)(type.ofType)) { - return insertSuffix; - } - if ((0, _graphql.isNonNullType)(type)) { - if ((0, _graphql.isCompositeType)(type.ofType)) { - return insertSuffix; - } - if ((0, _graphql.isListType)(type.ofType) && (0, _graphql.isCompositeType)(type.ofType.ofType)) { - return insertSuffix; - } - } - return null; -}; +const typeSystemCompletionItems = [{ + label: 'type', + kind: _types.CompletionItemKind.Function +}, { + label: 'interface', + kind: _types.CompletionItemKind.Function +}, { + label: 'union', + kind: _types.CompletionItemKind.Function +}, { + label: 'input', + kind: _types.CompletionItemKind.Function +}, { + label: 'scalar', + kind: _types.CompletionItemKind.Function +}, { + label: 'schema', + kind: _types.CompletionItemKind.Function +}]; +const executableCompletionItems = [{ + label: 'query', + kind: _types.CompletionItemKind.Function +}, { + label: 'mutation', + kind: _types.CompletionItemKind.Function +}, { + label: 'subscription', + kind: _types.CompletionItemKind.Function +}, { + label: 'fragment', + kind: _types.CompletionItemKind.Function +}, { + label: '{', + kind: _types.CompletionItemKind.Constructor +}]; function getSuggestionsForTypeSystemDefinitions(token) { return (0, _autocompleteUtils.hintList)(token, [{ label: 'extend', kind: _types.CompletionItemKind.Function - }, { - label: 'type', - kind: _types.CompletionItemKind.Function - }, { - label: 'interface', - kind: _types.CompletionItemKind.Function - }, { - label: 'union', - kind: _types.CompletionItemKind.Function - }, { - label: 'input', - kind: _types.CompletionItemKind.Function - }, { - label: 'scalar', - kind: _types.CompletionItemKind.Function - }, { - label: 'schema', - kind: _types.CompletionItemKind.Function - }]); + }, ...typeSystemCompletionItems]); } function getSuggestionsForExecutableDefinitions(token) { + return (0, _autocompleteUtils.hintList)(token, executableCompletionItems); +} +function getSuggestionsForUnknownDocumentMode(token) { return (0, _autocompleteUtils.hintList)(token, [{ - label: 'query', - kind: _types.CompletionItemKind.Function - }, { - label: 'mutation', - kind: _types.CompletionItemKind.Function - }, { - label: 'subscription', - kind: _types.CompletionItemKind.Function - }, { - label: 'fragment', + label: 'extend', kind: _types.CompletionItemKind.Function - }, { - label: '{', - kind: _types.CompletionItemKind.Constructor - }]); + }, ...executableCompletionItems, ...typeSystemCompletionItems]); } function getSuggestionsForExtensionDefinitions(token) { - return (0, _autocompleteUtils.hintList)(token, [{ - label: 'type', - kind: _types.CompletionItemKind.Function - }, { - label: 'interface', - kind: _types.CompletionItemKind.Function - }, { - label: 'union', - kind: _types.CompletionItemKind.Function - }, { - label: 'input', - kind: _types.CompletionItemKind.Function - }, { - label: 'scalar', - kind: _types.CompletionItemKind.Function - }, { - label: 'schema', - kind: _types.CompletionItemKind.Function - }]); + return (0, _autocompleteUtils.hintList)(token, typeSystemCompletionItems); } function getSuggestionsForFieldNames(token, typeInfo, options) { var _a; @@ -74212,13 +81408,19 @@ function getSuggestionsForFieldNames(token, typeInfo, options) { isDeprecated: Boolean(field.deprecationReason), deprecationReason: field.deprecationReason, kind: _types.CompletionItemKind.Field, + labelDetails: { + detail: ' ' + field.type.toString() + }, type: field.type }; if (options === null || options === void 0 ? void 0 : options.fillLeafsOnComplete) { - const insertText = getInsertText(field); - if (insertText) { - suggestion.insertText = field.name + insertText; + suggestion.insertText = (0, _autocompleteUtils.getFieldInsertText)(field); + if (!suggestion.insertText) { + suggestion.insertText = (0, _autocompleteUtils.getInsertText)(field.name, field.type, field.name + (token.state.needsAdvance ? '' : '\n')); + } + if (suggestion.insertText) { suggestion.insertTextFormat = _types.InsertTextFormat.Snippet; + suggestion.insertTextMode = _vscodeLanguageserverTypes.InsertTextMode.adjustIndentation; suggestion.command = SuggestionCommand; } } @@ -74229,7 +81431,7 @@ function getSuggestionsForFieldNames(token, typeInfo, options) { } function getSuggestionsForInputValues(token, typeInfo, queryText, schema) { const namedInputType = (0, _graphql.getNamedType)(typeInfo.inputType); - const queryVariables = getVariableCompletions(queryText, schema, token).filter(v => v.detail === namedInputType.name); + const queryVariables = getVariableCompletions(queryText, schema, token).filter(v => v.detail === (namedInputType === null || namedInputType === void 0 ? void 0 : namedInputType.name)); if (namedInputType instanceof _graphql.GraphQLEnumType) { const values = namedInputType.getValues(); return (0, _autocompleteUtils.hintList)(token, values.map(value => { @@ -74269,14 +81471,11 @@ function getSuggestionsForImplements(token, tokenState, schema, documentText, ty } const typeMap = schema.getTypeMap(); const schemaInterfaces = (0, _autocompleteUtils.objectValues)(typeMap).filter(_graphql.isInterfaceType); - const schemaInterfaceNames = schemaInterfaces.map(_ref => { - let { - name - } = _ref; - return name; - }); + const schemaInterfaceNames = schemaInterfaces.map(({ + name + }) => name); const inlineInterfaces = new Set(); - runOnlineParser(documentText, (_, state) => { + (0, _parser.runOnlineParser)(documentText, (_, state) => { var _a, _b, _c, _d, _e; if (state.name) { if (state.kind === _parser.RuleKinds.INTERFACE_DEF && !schemaInterfaceNames.includes(state.name)) { @@ -74284,12 +81483,9 @@ function getSuggestionsForImplements(token, tokenState, schema, documentText, ty } if (state.kind === _parser.RuleKinds.NAMED_TYPE && ((_a = state.prevState) === null || _a === void 0 ? void 0 : _a.kind) === _parser.RuleKinds.IMPLEMENTS) { if (typeInfo.interfaceDef) { - const existingType = (_b = typeInfo.interfaceDef) === null || _b === void 0 ? void 0 : _b.getInterfaces().find(_ref2 => { - let { - name - } = _ref2; - return name === state.name; - }); + const existingType = (_b = typeInfo.interfaceDef) === null || _b === void 0 ? void 0 : _b.getInterfaces().find(({ + name + }) => name === state.name); if (existingType) { return; } @@ -74302,12 +81498,9 @@ function getSuggestionsForImplements(token, tokenState, schema, documentText, ty })] })); } else if (typeInfo.objectTypeDef) { - const existingType = (_d = typeInfo.objectTypeDef) === null || _d === void 0 ? void 0 : _d.getInterfaces().find(_ref3 => { - let { - name - } = _ref3; - return name === state.name; - }); + const existingType = (_d = typeInfo.objectTypeDef) === null || _d === void 0 ? void 0 : _d.getInterfaces().find(({ + name + }) => name === state.name); if (existingType) { return; } @@ -74325,20 +81518,14 @@ function getSuggestionsForImplements(token, tokenState, schema, documentText, ty }); const currentTypeToExtend = typeInfo.interfaceDef || typeInfo.objectTypeDef; const siblingInterfaces = (currentTypeToExtend === null || currentTypeToExtend === void 0 ? void 0 : currentTypeToExtend.getInterfaces()) || []; - const siblingInterfaceNames = siblingInterfaces.map(_ref4 => { - let { - name - } = _ref4; - return name; - }); + const siblingInterfaceNames = siblingInterfaces.map(({ + name + }) => name); const possibleInterfaces = schemaInterfaces.concat([...inlineInterfaces].map(name => ({ name - }))).filter(_ref5 => { - let { - name - } = _ref5; - return name !== (currentTypeToExtend === null || currentTypeToExtend === void 0 ? void 0 : currentTypeToExtend.name) && !siblingInterfaceNames.includes(name); - }); + }))).filter(({ + name + }) => name !== (currentTypeToExtend === null || currentTypeToExtend === void 0 ? void 0 : currentTypeToExtend.name) && !siblingInterfaceNames.includes(name)); return (0, _autocompleteUtils.hintList)(token, possibleInterfaces.map(type => { const result = { label: type.name, @@ -74385,7 +81572,7 @@ function getSuggestionsForFragmentSpread(token, typeInfo, schema, queryText, fra return []; } const typeMap = schema.getTypeMap(); - const defState = (0, _autocompleteUtils.getDefinitionState)(token.state); + const defState = (0, _parser.getDefinitionState)(token.state); const fragments = getFragmentDefinitions(queryText); if (fragmentDefs && fragmentDefs.length > 0) { fragments.push(...fragmentDefs); @@ -74395,6 +81582,9 @@ function getSuggestionsForFragmentSpread(token, typeInfo, schema, queryText, fra label: frag.name.value, detail: String(typeMap[frag.typeCondition.name.value]), documentation: `fragment ${frag.name.value} on ${frag.typeCondition.name.value}`, + labelDetails: { + detail: `fragment ${frag.name.value} on ${frag.typeCondition.name.value}` + }, kind: _types.CompletionItemKind.Field, type: typeMap[frag.typeCondition.name.value] }))); @@ -74418,7 +81608,8 @@ function getVariableCompletions(queryText, schema, token) { let variableName = null; let variableType; const definitions = Object.create({}); - runOnlineParser(queryText, (_, state) => { + (0, _parser.runOnlineParser)(queryText, (_, state) => { + var _a; if ((state === null || state === void 0 ? void 0 : state.kind) === _parser.RuleKinds.VARIABLE && state.name) { variableName = state.name; } @@ -74429,10 +81620,12 @@ function getVariableCompletions(queryText, schema, token) { } } if (variableName && variableType && !definitions[variableName]) { + const replaceString = token.string === '$' || ((_a = token === null || token === void 0 ? void 0 : token.state) === null || _a === void 0 ? void 0 : _a.kind) === 'Variable' ? variableName : '$' + variableName; definitions[variableName] = { detail: variableType.toString(), - insertText: token.string === '$' ? variableName : '$' + variableName, - label: variableName, + insertText: replaceString, + label: '$' + variableName, + rawInsert: replaceString, type: variableType, kind: _types.CompletionItemKind.Variable }; @@ -74444,7 +81637,7 @@ function getVariableCompletions(queryText, schema, token) { } function getFragmentDefinitions(queryText) { const fragmentDefs = []; - runOnlineParser(queryText, (_, state) => { + (0, _parser.runOnlineParser)(queryText, (_, state) => { if (state.kind === _parser.RuleKinds.FRAGMENT_DEFINITION && state.name && state.type) { fragmentDefs.push({ kind: _parser.RuleKinds.FRAGMENT_DEFINITION, @@ -74473,7 +81666,7 @@ function getSuggestionsForVariableDefinition(token, schema, _kind) { const inputTypes = (0, _autocompleteUtils.objectValues)(inputTypeMap).filter(_graphql.isInputType); return (0, _autocompleteUtils.hintList)(token, inputTypes.map(type => ({ label: type.name, - documentation: type.description, + documentation: (type === null || type === void 0 ? void 0 : type.description) || '', kind: _types.CompletionItemKind.Variable }))); } @@ -74483,61 +81676,19 @@ function getSuggestionsForDirective(token, state, schema, _kind) { const directives = schema.getDirectives().filter(directive => canUseDirective(state.prevState, directive)); return (0, _autocompleteUtils.hintList)(token, directives.map(directive => ({ label: directive.name, - documentation: directive.description || '', + documentation: (directive === null || directive === void 0 ? void 0 : directive.description) || '', kind: _types.CompletionItemKind.Function }))); } return []; } -function getTokenAtPosition(queryText, cursor) { - let offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; - let styleAtCursor = null; - let stateAtCursor = null; - let stringAtCursor = null; - const token = runOnlineParser(queryText, (stream, state, style, index) => { - if (index !== cursor.line || stream.getCurrentPosition() + offset < cursor.character + 1) { - return; - } - styleAtCursor = style; - stateAtCursor = Object.assign({}, state); - stringAtCursor = stream.current(); - return 'BREAK'; - }); - return { - start: token.start, - end: token.end, - string: stringAtCursor || token.string, - state: stateAtCursor || token.state, - style: styleAtCursor || token.style - }; -} -function runOnlineParser(queryText, callback) { - const lines = queryText.split('\n'); - const parser = (0, _parser.onlineParser)(); - let state = parser.startState(); - let style = ''; - let stream = new _parser.CharacterStream(''); - for (let i = 0; i < lines.length; i++) { - stream = new _parser.CharacterStream(lines[i]); - while (!stream.eol()) { - style = parser.token(stream, state); - const code = callback(stream, state, style, i); - if (code === 'BREAK') { - break; - } - } - callback(stream, state, style, i); - if (!state.kind) { - state = parser.startState(); - } - } - return { - start: stream.getStartOfToken(), - end: stream.getCurrentPosition(), - string: stream.current(), - state, - style - }; +function getSuggestionsForDirectiveArguments(token, state, schema, _kind) { + const directive = schema.getDirectives().find(d => d.name === state.name); + return (0, _autocompleteUtils.hintList)(token, (directive === null || directive === void 0 ? void 0 : directive.args.map(arg => ({ + label: arg.name, + documentation: arg.description || '', + kind: _types.CompletionItemKind.Field + }))) || []); } function canUseDirective(state, directive) { if (!(state === null || state === void 0 ? void 0 : state.kind)) { @@ -74595,168 +81746,6 @@ function canUseDirective(state, directive) { } return false; } -function getTypeInfo(schema, tokenState) { - let argDef; - let argDefs; - let directiveDef; - let enumValue; - let fieldDef; - let inputType; - let objectTypeDef; - let objectFieldDefs; - let parentType; - let type; - let interfaceDef; - (0, _autocompleteUtils.forEachState)(tokenState, state => { - var _a; - switch (state.kind) { - case _parser.RuleKinds.QUERY: - case 'ShortQuery': - type = schema.getQueryType(); - break; - case _parser.RuleKinds.MUTATION: - type = schema.getMutationType(); - break; - case _parser.RuleKinds.SUBSCRIPTION: - type = schema.getSubscriptionType(); - break; - case _parser.RuleKinds.INLINE_FRAGMENT: - case _parser.RuleKinds.FRAGMENT_DEFINITION: - if (state.type) { - type = schema.getType(state.type); - } - break; - case _parser.RuleKinds.FIELD: - case _parser.RuleKinds.ALIASED_FIELD: - { - if (!type || !state.name) { - fieldDef = null; - } else { - fieldDef = parentType ? (0, _autocompleteUtils.getFieldDef)(schema, parentType, state.name) : null; - type = fieldDef ? fieldDef.type : null; - } - break; - } - case _parser.RuleKinds.SELECTION_SET: - parentType = (0, _graphql.getNamedType)(type); - break; - case _parser.RuleKinds.DIRECTIVE: - directiveDef = state.name ? schema.getDirective(state.name) : null; - break; - case _parser.RuleKinds.INTERFACE_DEF: - if (state.name) { - objectTypeDef = null; - interfaceDef = new _graphql.GraphQLInterfaceType({ - name: state.name, - interfaces: [], - fields: {} - }); - } - break; - case _parser.RuleKinds.OBJECT_TYPE_DEF: - if (state.name) { - interfaceDef = null; - objectTypeDef = new _graphql.GraphQLObjectType({ - name: state.name, - interfaces: [], - fields: {} - }); - } - break; - case _parser.RuleKinds.ARGUMENTS: - { - if (state.prevState) { - switch (state.prevState.kind) { - case _parser.RuleKinds.FIELD: - argDefs = fieldDef && fieldDef.args; - break; - case _parser.RuleKinds.DIRECTIVE: - argDefs = directiveDef && directiveDef.args; - break; - case _parser.RuleKinds.ALIASED_FIELD: - { - const name = (_a = state.prevState) === null || _a === void 0 ? void 0 : _a.name; - if (!name) { - argDefs = null; - break; - } - const field = parentType ? (0, _autocompleteUtils.getFieldDef)(schema, parentType, name) : null; - if (!field) { - argDefs = null; - break; - } - argDefs = field.args; - break; - } - default: - argDefs = null; - break; - } - } else { - argDefs = null; - } - break; - } - case _parser.RuleKinds.ARGUMENT: - if (argDefs) { - for (let i = 0; i < argDefs.length; i++) { - if (argDefs[i].name === state.name) { - argDef = argDefs[i]; - break; - } - } - } - inputType = argDef === null || argDef === void 0 ? void 0 : argDef.type; - break; - case _parser.RuleKinds.ENUM_VALUE: - const enumType = (0, _graphql.getNamedType)(inputType); - enumValue = enumType instanceof _graphql.GraphQLEnumType ? enumType.getValues().find(val => val.value === state.name) : null; - break; - case _parser.RuleKinds.LIST_VALUE: - const nullableType = (0, _graphql.getNullableType)(inputType); - inputType = nullableType instanceof _graphql.GraphQLList ? nullableType.ofType : null; - break; - case _parser.RuleKinds.OBJECT_VALUE: - const objectType = (0, _graphql.getNamedType)(inputType); - objectFieldDefs = objectType instanceof _graphql.GraphQLInputObjectType ? objectType.getFields() : null; - break; - case _parser.RuleKinds.OBJECT_FIELD: - const objectField = state.name && objectFieldDefs ? objectFieldDefs[state.name] : null; - inputType = objectField === null || objectField === void 0 ? void 0 : objectField.type; - break; - case _parser.RuleKinds.NAMED_TYPE: - if (state.name) { - type = schema.getType(state.name); - } - break; - } - }); - return { - argDef, - argDefs, - directiveDef, - enumValue, - fieldDef, - inputType, - objectFieldDefs, - parentType, - type, - interfaceDef, - objectTypeDef - }; -} -var GraphQLDocumentMode; -exports.GraphQLDocumentMode = GraphQLDocumentMode; -(function (GraphQLDocumentMode) { - GraphQLDocumentMode["TYPE_SYSTEM"] = "TYPE_SYSTEM"; - GraphQLDocumentMode["EXECUTABLE"] = "EXECUTABLE"; -})(GraphQLDocumentMode || (exports.GraphQLDocumentMode = GraphQLDocumentMode = {})); -function getDocumentMode(documentText, uri) { - if (uri === null || uri === void 0 ? void 0 : uri.endsWith('.graphqls')) { - return GraphQLDocumentMode.TYPE_SYSTEM; - } - return hasTypeSystemDefinitions(documentText) ? GraphQLDocumentMode.TYPE_SYSTEM : GraphQLDocumentMode.EXECUTABLE; -} function unwrapType(state) { if (state.prevState && state.kind && [_parser.RuleKinds.NAMED_TYPE, _parser.RuleKinds.LIST_TYPE, _parser.RuleKinds.TYPE, _parser.RuleKinds.NON_NULL_TYPE].includes(state.kind)) { return unwrapType(state.prevState); @@ -74778,6 +81767,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.LANGUAGE = void 0; +exports.getDefinitionQueryResultForArgument = getDefinitionQueryResultForArgument; exports.getDefinitionQueryResultForDefinitionNode = getDefinitionQueryResultForDefinitionNode; exports.getDefinitionQueryResultForField = getDefinitionQueryResultForField; exports.getDefinitionQueryResultForFragmentSpread = getDefinitionQueryResultForFragmentSpread; @@ -74810,8 +81800,7 @@ var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; -const LANGUAGE = 'GraphQL'; -exports.LANGUAGE = LANGUAGE; +const LANGUAGE = exports.LANGUAGE = 'GraphQL'; function assert(value, message) { if (!value) { throw new Error(message); @@ -74830,38 +81819,30 @@ function getPosition(text, node) { function getDefinitionQueryResultForNamedType(text, node, dependencies) { return __awaiter(this, void 0, void 0, function* () { const name = node.name.value; - const defNodes = dependencies.filter(_ref => { - let { - definition - } = _ref; - return definition.name && definition.name.value === name; - }); + const defNodes = dependencies.filter(({ + definition + }) => definition.name && definition.name.value === name); if (defNodes.length === 0) { throw new Error(`Definition not found for GraphQL type ${name}`); } - const definitions = defNodes.map(_ref2 => { - let { - filePath, - content, - definition - } = _ref2; - return getDefinitionForNodeDefinition(filePath || '', content, definition); - }); + const definitions = defNodes.map(({ + filePath, + content, + definition + }) => getDefinitionForNodeDefinition(filePath || '', content, definition)); return { definitions, - queryRange: definitions.map(_ => getRange(text, node)) + queryRange: definitions.map(_ => getRange(text, node)), + printedName: name }; }); } function getDefinitionQueryResultForField(fieldName, typeName, dependencies) { var _a; return __awaiter(this, void 0, void 0, function* () { - const defNodes = dependencies.filter(_ref3 => { - let { - definition - } = _ref3; - return definition.name && definition.name.value === typeName; - }); + const defNodes = dependencies.filter(({ + definition + }) => definition.name && definition.name.value === typeName); if (defNodes.length === 0) { throw new Error(`Definition not found for GraphQL type ${typeName}`); } @@ -74879,40 +81860,60 @@ function getDefinitionQueryResultForField(fieldName, typeName, dependencies) { } return { definitions, - queryRange: [] + queryRange: [], + printedName: [typeName, fieldName].join('.') + }; + }); +} +function getDefinitionQueryResultForArgument(argumentName, fieldName, typeName, dependencies) { + var _a, _b, _c; + return __awaiter(this, void 0, void 0, function* () { + const definitions = []; + for (const { + filePath, + content, + definition + } of dependencies) { + const argDefinition = (_c = (_b = (_a = definition.fields) === null || _a === void 0 ? void 0 : _a.find(item => item.name.value === fieldName)) === null || _b === void 0 ? void 0 : _b.arguments) === null || _c === void 0 ? void 0 : _c.find(item => item.name.value === argumentName); + if (argDefinition == null) { + continue; + } + definitions.push(getDefinitionForArgumentDefinition(filePath || '', content, argDefinition)); + } + return { + definitions, + queryRange: [], + printedName: `${[typeName, fieldName].join('.')}(${argumentName})` }; }); } function getDefinitionQueryResultForFragmentSpread(text, fragment, dependencies) { return __awaiter(this, void 0, void 0, function* () { const name = fragment.name.value; - const defNodes = dependencies.filter(_ref4 => { - let { - definition - } = _ref4; - return definition.name.value === name; - }); + const defNodes = dependencies.filter(({ + definition + }) => definition.name.value === name); if (defNodes.length === 0) { throw new Error(`Definition not found for GraphQL fragment ${name}`); } - const definitions = defNodes.map(_ref5 => { - let { - filePath, - content, - definition - } = _ref5; - return getDefinitionForFragmentDefinition(filePath || '', content, definition); - }); + const definitions = defNodes.map(({ + filePath, + content, + definition + }) => getDefinitionForFragmentDefinition(filePath || '', content, definition)); return { definitions, - queryRange: definitions.map(_ => getRange(text, fragment)) + queryRange: definitions.map(_ => getRange(text, fragment)), + printedName: name }; }); } function getDefinitionQueryResultForDefinitionNode(path, text, definition) { + var _a; return { definitions: [getDefinitionForFragmentDefinition(path, text, definition)], - queryRange: definition.name ? [getRange(text, definition.name)] : [] + queryRange: definition.name ? [getRange(text, definition.name)] : [], + printedName: (_a = definition.name) === null || _a === void 0 ? void 0 : _a.value }; } function getDefinitionForFragmentDefinition(path, text, definition) { @@ -74959,6 +81960,20 @@ function getDefinitionForFieldDefinition(path, text, definition) { projectRoot: path }; } +function getDefinitionForArgumentDefinition(path, text, definition) { + const { + name + } = definition; + assert(name, 'Expected ASTNode to have a Name.'); + return { + path, + position: getPosition(text, definition), + range: getRange(text, definition), + name: name.value || '', + language: LANGUAGE, + projectRoot: path + }; +} /***/ }), @@ -74980,30 +81995,24 @@ exports.validateQuery = validateQuery; var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); var _parser = __webpack_require__(/*! ../parser */ "../../graphql-language-service/esm/parser/index.js"); var _utils = __webpack_require__(/*! ../utils */ "../../graphql-language-service/esm/utils/index.js"); -const SEVERITY = { +const SEVERITY = exports.SEVERITY = { Error: 'Error', Warning: 'Warning', Information: 'Information', Hint: 'Hint' }; -exports.SEVERITY = SEVERITY; -const DIAGNOSTIC_SEVERITY = { +const DIAGNOSTIC_SEVERITY = exports.DIAGNOSTIC_SEVERITY = { [SEVERITY.Error]: 1, [SEVERITY.Warning]: 2, [SEVERITY.Information]: 3, [SEVERITY.Hint]: 4 }; -exports.DIAGNOSTIC_SEVERITY = DIAGNOSTIC_SEVERITY; const invariant = (condition, message) => { if (!condition) { throw new Error(message); } }; -function getDiagnostics(query) { - let schema = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - let customRules = arguments.length > 2 ? arguments[2] : undefined; - let isRelayCompatMode = arguments.length > 3 ? arguments[3] : undefined; - let externalFragments = arguments.length > 4 ? arguments[4] : undefined; +function getDiagnostics(query, schema = null, customRules, isRelayCompatMode, externalFragments) { var _a, _b; let ast = null; let fragments = ''; @@ -75030,10 +82039,7 @@ function getDiagnostics(query) { } return validateQuery(ast, schema, customRules, isRelayCompatMode); } -function validateQuery(ast) { - let schema = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - let customRules = arguments.length > 2 ? arguments[2] : undefined; - let isRelayCompatMode = arguments.length > 3 ? arguments[3] : undefined; +function validateQuery(ast, schema = null, customRules, isRelayCompatMode) { if (!schema) { return []; } @@ -75105,22 +82111,30 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getHoverInformation = getHoverInformation; +exports.renderArg = renderArg; +exports.renderDirective = renderDirective; +exports.renderEnumValue = renderEnumValue; +exports.renderField = renderField; +exports.renderType = renderType; var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -var _getAutocompleteSuggestions = __webpack_require__(/*! ./getAutocompleteSuggestions */ "../../graphql-language-service/esm/interface/getAutocompleteSuggestions.js"); +var _parser = __webpack_require__(/*! ../parser */ "../../graphql-language-service/esm/parser/index.js"); function getHoverInformation(schema, queryText, cursor, contextToken, config) { - const token = contextToken || (0, _getAutocompleteSuggestions.getTokenAtPosition)(queryText, cursor); - if (!schema || !token || !token.state) { + const options = Object.assign(Object.assign({}, config), { + schema + }); + const context = (0, _parser.getContextAtPosition)(queryText, cursor, schema, contextToken); + if (!context) { return ''; } + const { + typeInfo, + token + } = context; const { kind, step } = token.state; - const typeInfo = (0, _getAutocompleteSuggestions.getTypeInfo)(schema, token.state); - const options = Object.assign(Object.assign({}, config), { - schema - }); - if (kind === 'Field' && step === 0 && typeInfo.fieldDef || kind === 'AliasedField' && step === 2 && typeInfo.fieldDef) { + if (kind === 'Field' && step === 0 && typeInfo.fieldDef || kind === 'AliasedField' && step === 2 && typeInfo.fieldDef || kind === 'ObjectField' && step === 0 && typeInfo.fieldDef) { const into = []; renderMdCodeStart(into, options); renderField(into, typeInfo, options); @@ -75136,6 +82150,14 @@ function getHoverInformation(schema, queryText, cursor, contextToken, config) { renderDescription(into, options, typeInfo.directiveDef); return into.join('').trim(); } + if (kind === 'Variable' && typeInfo.type) { + const into = []; + renderMdCodeStart(into, options); + renderType(into, typeInfo, options, typeInfo.type); + renderMdCodeEnd(into, options); + renderDescription(into, options, typeInfo.type); + return into.join('').trim(); + } if (kind === 'Argument' && step === 0 && typeInfo.argDef) { const into = []; renderMdCodeStart(into, options); @@ -75499,7 +82521,6 @@ Object.defineProperty(exports, "__esModule", ({ exports["default"] = void 0; class CharacterStream { constructor(sourceText) { - var _this = this; this._start = 0; this._pos = 0; this.getStartOfToken = () => this._start; @@ -75544,24 +82565,22 @@ class CharacterStream { this.skipTo = position => { this._pos = position; }; - this.match = function (pattern) { - let consume = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - let caseFold = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + this.match = (pattern, consume = true, caseFold = false) => { let token = null; let match = null; if (typeof pattern === 'string') { const regex = new RegExp(pattern, caseFold ? 'i' : 'g'); - match = regex.test(_this._sourceText.slice(_this._pos, _this._pos + pattern.length)); + match = regex.test(this._sourceText.slice(this._pos, this._pos + pattern.length)); token = pattern; } else if (pattern instanceof RegExp) { - match = _this._sourceText.slice(_this._pos).match(pattern); + match = this._sourceText.slice(this._pos).match(pattern); token = match === null || match === void 0 ? void 0 : match[0]; } - if (match != null && (typeof pattern === 'string' || match instanceof Array && _this._sourceText.startsWith(match[0], _this._pos))) { + if (match != null && (typeof pattern === 'string' || match instanceof Array && this._sourceText.startsWith(match[0], this._pos))) { if (consume) { - _this._start = _this._pos; + this._start = this._pos; if (token && token.length) { - _this._pos += token.length; + this._pos += token.length; } } return match; @@ -75677,15 +82696,14 @@ var _RuleHelpers = __webpack_require__(/*! ./RuleHelpers */ "../../graphql-langu var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); const isIgnored = ch => ch === ' ' || ch === '\t' || ch === ',' || ch === '\n' || ch === '\r' || ch === '\uFEFF' || ch === '\u00A0'; exports.isIgnored = isIgnored; -const LexRules = { +const LexRules = exports.LexRules = { Name: /^[_A-Za-z][_0-9A-Za-z]*/, Punctuation: /^(?:!|\$|\(|\)|\.\.\.|:|=|&|@|\[|]|\{|\||\})/, Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/, String: /^(?:"""(?:\\"""|[^"]|"[^"]|""[^"])*(?:""")?|"(?:[^"\\]|\\(?:"|\/|\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*"?)/, Comment: /^#.*/ }; -exports.LexRules = LexRules; -const ParseRules = { +const ParseRules = exports.ParseRules = { Document: [(0, _RuleHelpers.list)('Definition')], Definition(token) { switch (token.value) { @@ -75835,7 +82853,6 @@ const ParseRules = { [_graphql.Kind.ENUM_TYPE_EXTENSION]: ['EnumDef'], [_graphql.Kind.INPUT_OBJECT_TYPE_EXTENSION]: ['InputDef'] }; -exports.ParseRules = ParseRules; function word(value) { return { style: 'keyword', @@ -75867,6 +82884,347 @@ function type(style) { /***/ }), +/***/ "../../graphql-language-service/esm/parser/api.js": +/*!********************************************************!*\ + !*** ../../graphql-language-service/esm/parser/api.js ***! + \********************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.TYPE_SYSTEM_KINDS = exports.GraphQLDocumentMode = void 0; +exports.getContextAtPosition = getContextAtPosition; +exports.getDocumentMode = getDocumentMode; +exports.getTokenAtPosition = getTokenAtPosition; +exports.runOnlineParser = runOnlineParser; +var _ = __webpack_require__(/*! . */ "../../graphql-language-service/esm/parser/index.js"); +var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +function runOnlineParser(queryText, callback) { + const lines = queryText.split('\n'); + const parser = (0, _.onlineParser)(); + let state = parser.startState(); + let style = ''; + let stream = new _.CharacterStream(''); + for (let i = 0; i < lines.length; i++) { + stream = new _.CharacterStream(lines[i]); + while (!stream.eol()) { + style = parser.token(stream, state); + const code = callback(stream, state, style, i); + if (code === 'BREAK') { + break; + } + } + callback(stream, state, style, i); + if (!state.kind) { + state = parser.startState(); + } + } + return { + start: stream.getStartOfToken(), + end: stream.getCurrentPosition(), + string: stream.current(), + state, + style + }; +} +var GraphQLDocumentMode; +(function (GraphQLDocumentMode) { + GraphQLDocumentMode["TYPE_SYSTEM"] = "TYPE_SYSTEM"; + GraphQLDocumentMode["EXECUTABLE"] = "EXECUTABLE"; + GraphQLDocumentMode["UNKNOWN"] = "UNKNOWN"; +})(GraphQLDocumentMode || (exports.GraphQLDocumentMode = GraphQLDocumentMode = {})); +const TYPE_SYSTEM_KINDS = exports.TYPE_SYSTEM_KINDS = [_graphql.Kind.SCHEMA_DEFINITION, _graphql.Kind.OPERATION_TYPE_DEFINITION, _graphql.Kind.SCALAR_TYPE_DEFINITION, _graphql.Kind.OBJECT_TYPE_DEFINITION, _graphql.Kind.INTERFACE_TYPE_DEFINITION, _graphql.Kind.UNION_TYPE_DEFINITION, _graphql.Kind.ENUM_TYPE_DEFINITION, _graphql.Kind.INPUT_OBJECT_TYPE_DEFINITION, _graphql.Kind.DIRECTIVE_DEFINITION, _graphql.Kind.SCHEMA_EXTENSION, _graphql.Kind.SCALAR_TYPE_EXTENSION, _graphql.Kind.OBJECT_TYPE_EXTENSION, _graphql.Kind.INTERFACE_TYPE_EXTENSION, _graphql.Kind.UNION_TYPE_EXTENSION, _graphql.Kind.ENUM_TYPE_EXTENSION, _graphql.Kind.INPUT_OBJECT_TYPE_EXTENSION]; +const getParsedMode = sdl => { + let mode = GraphQLDocumentMode.UNKNOWN; + if (sdl) { + try { + (0, _graphql.visit)((0, _graphql.parse)(sdl), { + enter(node) { + if (node.kind === 'Document') { + mode = GraphQLDocumentMode.EXECUTABLE; + return; + } + if (TYPE_SYSTEM_KINDS.includes(node.kind)) { + mode = GraphQLDocumentMode.TYPE_SYSTEM; + return _graphql.BREAK; + } + return false; + } + }); + } catch (_a) { + return mode; + } + } + return mode; +}; +function getDocumentMode(documentText, uri) { + if (uri === null || uri === void 0 ? void 0 : uri.endsWith('.graphqls')) { + return GraphQLDocumentMode.TYPE_SYSTEM; + } + return getParsedMode(documentText); +} +function getTokenAtPosition(queryText, cursor, offset = 0) { + let styleAtCursor = null; + let stateAtCursor = null; + let stringAtCursor = null; + const token = runOnlineParser(queryText, (stream, state, style, index) => { + if (index !== cursor.line || stream.getCurrentPosition() + offset < cursor.character + 1) { + return; + } + styleAtCursor = style; + stateAtCursor = Object.assign({}, state); + stringAtCursor = stream.current(); + return 'BREAK'; + }); + return { + start: token.start, + end: token.end, + string: stringAtCursor || token.string, + state: stateAtCursor || token.state, + style: styleAtCursor || token.style + }; +} +function getContextAtPosition(queryText, cursor, schema, contextToken, options) { + const token = contextToken || getTokenAtPosition(queryText, cursor, 1); + if (!token) { + return null; + } + const state = token.state.kind === 'Invalid' ? token.state.prevState : token.state; + if (!state) { + return null; + } + const typeInfo = (0, _.getTypeInfo)(schema, token.state); + const mode = (options === null || options === void 0 ? void 0 : options.mode) || getDocumentMode(queryText, options === null || options === void 0 ? void 0 : options.uri); + return { + token, + state, + typeInfo, + mode + }; +} + +/***/ }), + +/***/ "../../graphql-language-service/esm/parser/getTypeInfo.js": +/*!****************************************************************!*\ + !*** ../../graphql-language-service/esm/parser/getTypeInfo.js ***! + \****************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.forEachState = forEachState; +exports.getDefinitionState = getDefinitionState; +exports.getFieldDef = getFieldDef; +exports.getTypeInfo = getTypeInfo; +var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +var _ = __webpack_require__(/*! . */ "../../graphql-language-service/esm/parser/index.js"); +function getFieldDef(schema, type, fieldName) { + if (fieldName === _graphql.SchemaMetaFieldDef.name && schema.getQueryType() === type) { + return _graphql.SchemaMetaFieldDef; + } + if (fieldName === _graphql.TypeMetaFieldDef.name && schema.getQueryType() === type) { + return _graphql.TypeMetaFieldDef; + } + if (fieldName === _graphql.TypeNameMetaFieldDef.name && (0, _graphql.isCompositeType)(type)) { + return _graphql.TypeNameMetaFieldDef; + } + if ('getFields' in type) { + return type.getFields()[fieldName]; + } + return null; +} +function forEachState(stack, fn) { + const reverseStateStack = []; + let state = stack; + while (state === null || state === void 0 ? void 0 : state.kind) { + reverseStateStack.push(state); + state = state.prevState; + } + for (let i = reverseStateStack.length - 1; i >= 0; i--) { + fn(reverseStateStack[i]); + } +} +function getDefinitionState(tokenState) { + let definitionState; + forEachState(tokenState, state => { + switch (state.kind) { + case 'Query': + case 'ShortQuery': + case 'Mutation': + case 'Subscription': + case 'FragmentDefinition': + definitionState = state; + break; + } + }); + return definitionState; +} +function getTypeInfo(schema, tokenState) { + let argDef; + let argDefs; + let directiveDef; + let enumValue; + let fieldDef; + let inputType; + let objectTypeDef; + let objectFieldDefs; + let parentType; + let type; + let interfaceDef; + forEachState(tokenState, state => { + var _a; + switch (state.kind) { + case _.RuleKinds.QUERY: + case 'ShortQuery': + type = schema.getQueryType(); + break; + case _.RuleKinds.MUTATION: + type = schema.getMutationType(); + break; + case _.RuleKinds.SUBSCRIPTION: + type = schema.getSubscriptionType(); + break; + case _.RuleKinds.INLINE_FRAGMENT: + case _.RuleKinds.FRAGMENT_DEFINITION: + if (state.type) { + type = schema.getType(state.type); + } + break; + case _.RuleKinds.FIELD: + case _.RuleKinds.ALIASED_FIELD: + { + if (!type || !state.name) { + fieldDef = null; + } else { + fieldDef = parentType ? getFieldDef(schema, parentType, state.name) : null; + type = fieldDef ? fieldDef.type : null; + } + break; + } + case _.RuleKinds.SELECTION_SET: + parentType = (0, _graphql.getNamedType)(type); + break; + case _.RuleKinds.DIRECTIVE: + directiveDef = state.name ? schema.getDirective(state.name) : null; + break; + case _.RuleKinds.INTERFACE_DEF: + if (state.name) { + objectTypeDef = null; + interfaceDef = new _graphql.GraphQLInterfaceType({ + name: state.name, + interfaces: [], + fields: {} + }); + } + break; + case _.RuleKinds.OBJECT_TYPE_DEF: + if (state.name) { + interfaceDef = null; + objectTypeDef = new _graphql.GraphQLObjectType({ + name: state.name, + interfaces: [], + fields: {} + }); + } + break; + case _.RuleKinds.ARGUMENTS: + { + if (state.prevState) { + switch (state.prevState.kind) { + case _.RuleKinds.FIELD: + argDefs = fieldDef && fieldDef.args; + break; + case _.RuleKinds.DIRECTIVE: + argDefs = directiveDef && directiveDef.args; + break; + case _.RuleKinds.ALIASED_FIELD: + { + const name = (_a = state.prevState) === null || _a === void 0 ? void 0 : _a.name; + if (!name) { + argDefs = null; + break; + } + const field = parentType ? getFieldDef(schema, parentType, name) : null; + if (!field) { + argDefs = null; + break; + } + argDefs = field.args; + break; + } + default: + argDefs = null; + break; + } + } else { + argDefs = null; + } + break; + } + case _.RuleKinds.ARGUMENT: + if (argDefs) { + for (let i = 0; i < argDefs.length; i++) { + if (argDefs[i].name === state.name) { + argDef = argDefs[i]; + break; + } + } + } + inputType = argDef === null || argDef === void 0 ? void 0 : argDef.type; + break; + case _.RuleKinds.VARIABLE_DEFINITION: + case _.RuleKinds.VARIABLE: + type = inputType; + break; + case _.RuleKinds.ENUM_VALUE: + const enumType = (0, _graphql.getNamedType)(inputType); + enumValue = enumType instanceof _graphql.GraphQLEnumType ? enumType.getValues().find(val => val.value === state.name) : null; + break; + case _.RuleKinds.LIST_VALUE: + const nullableType = (0, _graphql.getNullableType)(inputType); + inputType = nullableType instanceof _graphql.GraphQLList ? nullableType.ofType : null; + break; + case _.RuleKinds.OBJECT_VALUE: + const objectType = (0, _graphql.getNamedType)(inputType); + objectFieldDefs = objectType instanceof _graphql.GraphQLInputObjectType ? objectType.getFields() : null; + break; + case _.RuleKinds.OBJECT_FIELD: + const objectField = state.name && objectFieldDefs ? objectFieldDefs[state.name] : null; + inputType = objectField === null || objectField === void 0 ? void 0 : objectField.type; + fieldDef = objectField; + type = fieldDef ? fieldDef.type : null; + break; + case _.RuleKinds.NAMED_TYPE: + if (state.name) { + type = schema.getType(state.name); + } + break; + } + }); + return { + argDef, + argDefs, + directiveDef, + enumValue, + fieldDef, + inputType, + objectFieldDefs, + parentType, + type, + interfaceDef, + objectTypeDef + }; +} + +/***/ }), + /***/ "../../graphql-language-service/esm/parser/index.js": /*!**********************************************************!*\ !*** ../../graphql-language-service/esm/parser/index.js ***! @@ -75888,7 +83246,15 @@ var _exportNames = { opt: true, p: true, t: true, - onlineParser: true + onlineParser: true, + runOnlineParser: true, + getTokenAtPosition: true, + getContextAtPosition: true, + GraphQLDocumentMode: true, + getDocumentMode: true, + getTypeInfo: true, + getDefinitionState: true, + getFieldDef: true }; Object.defineProperty(exports, "CharacterStream", ({ enumerable: true, @@ -75896,6 +83262,12 @@ Object.defineProperty(exports, "CharacterStream", ({ return _CharacterStream.default; } })); +Object.defineProperty(exports, "GraphQLDocumentMode", ({ + enumerable: true, + get: function () { + return _api.GraphQLDocumentMode; + } +})); Object.defineProperty(exports, "LexRules", ({ enumerable: true, get: function () { @@ -75914,6 +83286,42 @@ Object.defineProperty(exports, "butNot", ({ return _RuleHelpers.butNot; } })); +Object.defineProperty(exports, "getContextAtPosition", ({ + enumerable: true, + get: function () { + return _api.getContextAtPosition; + } +})); +Object.defineProperty(exports, "getDefinitionState", ({ + enumerable: true, + get: function () { + return _getTypeInfo.getDefinitionState; + } +})); +Object.defineProperty(exports, "getDocumentMode", ({ + enumerable: true, + get: function () { + return _api.getDocumentMode; + } +})); +Object.defineProperty(exports, "getFieldDef", ({ + enumerable: true, + get: function () { + return _getTypeInfo.getFieldDef; + } +})); +Object.defineProperty(exports, "getTokenAtPosition", ({ + enumerable: true, + get: function () { + return _api.getTokenAtPosition; + } +})); +Object.defineProperty(exports, "getTypeInfo", ({ + enumerable: true, + get: function () { + return _getTypeInfo.getTypeInfo; + } +})); Object.defineProperty(exports, "isIgnored", ({ enumerable: true, get: function () { @@ -75944,6 +83352,12 @@ Object.defineProperty(exports, "p", ({ return _RuleHelpers.p; } })); +Object.defineProperty(exports, "runOnlineParser", ({ + enumerable: true, + get: function () { + return _api.runOnlineParser; + } +})); Object.defineProperty(exports, "t", ({ enumerable: true, get: function () { @@ -75954,6 +83368,8 @@ var _CharacterStream = _interopRequireDefault(__webpack_require__(/*! ./Characte var _Rules = __webpack_require__(/*! ./Rules */ "../../graphql-language-service/esm/parser/Rules.js"); var _RuleHelpers = __webpack_require__(/*! ./RuleHelpers */ "../../graphql-language-service/esm/parser/RuleHelpers.js"); var _onlineParser = _interopRequireDefault(__webpack_require__(/*! ./onlineParser */ "../../graphql-language-service/esm/parser/onlineParser.js")); +var _api = __webpack_require__(/*! ./api */ "../../graphql-language-service/esm/parser/api.js"); +var _getTypeInfo = __webpack_require__(/*! ./getTypeInfo */ "../../graphql-language-service/esm/parser/getTypeInfo.js"); var _types = __webpack_require__(/*! ./types */ "../../graphql-language-service/esm/parser/types.js"); Object.keys(_types).forEach(function (key) { if (key === "default" || key === "__esModule") return; @@ -75984,13 +83400,12 @@ Object.defineProperty(exports, "__esModule", ({ exports["default"] = onlineParser; var _Rules = __webpack_require__(/*! ./Rules */ "../../graphql-language-service/esm/parser/Rules.js"); var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -function onlineParser() { - let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { - eatWhitespace: stream => stream.eatWhile(_Rules.isIgnored), - lexRules: _Rules.LexRules, - parseRules: _Rules.ParseRules, - editorConfig: {} - }; +function onlineParser(options = { + eatWhitespace: stream => stream.eatWhile(_Rules.isIgnored), + lexRules: _Rules.LexRules, + parseRules: _Rules.ParseRules, + editorConfig: {} +}) { return { startState() { const initialState = { @@ -76205,7 +83620,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.RuleKinds = exports.AdditionalRuleKinds = void 0; var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -const AdditionalRuleKinds = { +const AdditionalRuleKinds = exports.AdditionalRuleKinds = { ALIASED_FIELD: 'AliasedField', ARGUMENTS: 'Arguments', SHORT_QUERY: 'ShortQuery', @@ -76233,11 +83648,10 @@ const AdditionalRuleKinds = { DIRECTIVE_DEF: 'DirectiveDef', IMPLEMENTS: 'Implements', VARIABLE_DEFINITIONS: 'VariableDefinitions', - TYPE: 'Type' + TYPE: 'Type', + VARIABLE: 'Variable' }; -exports.AdditionalRuleKinds = AdditionalRuleKinds; -const RuleKinds = Object.assign(Object.assign({}, _graphql.Kind), AdditionalRuleKinds); -exports.RuleKinds = RuleKinds; +const RuleKinds = exports.RuleKinds = Object.assign(Object.assign({}, _graphql.Kind), AdditionalRuleKinds); /***/ }), @@ -76253,6 +83667,12 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.FileChangeTypeKind = exports.CompletionItemKind = void 0; +Object.defineProperty(exports, "GraphQLDocumentMode", ({ + enumerable: true, + get: function () { + return _parser.GraphQLDocumentMode; + } +})); Object.defineProperty(exports, "InsertTextFormat", ({ enumerable: true, get: function () { @@ -76260,14 +83680,13 @@ Object.defineProperty(exports, "InsertTextFormat", ({ } })); var _vscodeLanguageserverTypes = __webpack_require__(/*! vscode-languageserver-types */ "../../../node_modules/vscode-languageserver-types/lib/esm/main.js"); -const FileChangeTypeKind = { +var _parser = __webpack_require__(/*! ./parser */ "../../graphql-language-service/esm/parser/index.js"); +const FileChangeTypeKind = exports.FileChangeTypeKind = { Created: 1, Changed: 2, Deleted: 3 }; -exports.FileChangeTypeKind = FileChangeTypeKind; var CompletionItemKind; -exports.CompletionItemKind = CompletionItemKind; (function (CompletionItemKind) { CompletionItemKind.Text = 1; CompletionItemKind.Method = 2; @@ -76555,8 +83974,7 @@ function getOperationFacts(schema, documentString) { return; } } -const getQueryFacts = getOperationFacts; -exports.getQueryFacts = getQueryFacts; +const getQueryFacts = exports.getQueryFacts = getOperationFacts; /***/ }), @@ -76574,10 +83992,9 @@ Object.defineProperty(exports, "__esModule", ({ exports.defaultJSONSchemaOptions = void 0; exports.getVariablesJSONSchema = getVariablesJSONSchema; var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -const defaultJSONSchemaOptions = { +const defaultJSONSchemaOptions = exports.defaultJSONSchemaOptions = { useMarkdownDescription: false }; -exports.defaultJSONSchemaOptions = defaultJSONSchemaOptions; function text(into, newText) { into.push(newText); } @@ -76902,8 +84319,8 @@ var _Range = __webpack_require__(/*! ./Range */ "../../graphql-language-service/ var _validateWithCustomRules = __webpack_require__(/*! ./validateWithCustomRules */ "../../graphql-language-service/esm/utils/validateWithCustomRules.js"); var _collectVariables = __webpack_require__(/*! ./collectVariables */ "../../graphql-language-service/esm/utils/collectVariables.js"); var _getOperationFacts = _interopRequireWildcard(__webpack_require__(/*! ./getOperationFacts */ "../../graphql-language-service/esm/utils/getOperationFacts.js")); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /***/ }), @@ -76920,7 +84337,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.validateWithCustomRules = validateWithCustomRules; var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -const specifiedSDLRules = [_graphql.LoneSchemaDefinitionRule, _graphql.UniqueOperationTypesRule, _graphql.UniqueTypeNamesRule, _graphql.UniqueEnumValueNamesRule, _graphql.UniqueFieldDefinitionNamesRule, _graphql.UniqueDirectiveNamesRule, _graphql.KnownTypeNamesRule, _graphql.KnownDirectivesRule, _graphql.UniqueDirectivesPerLocationRule, _graphql.PossibleTypeExtensionsRule, _graphql.UniqueArgumentNamesRule, _graphql.UniqueInputFieldNamesRule]; +const specifiedSDLRules = [_graphql.LoneSchemaDefinitionRule, _graphql.UniqueOperationTypesRule, _graphql.UniqueTypeNamesRule, _graphql.UniqueEnumValueNamesRule, _graphql.UniqueFieldDefinitionNamesRule, _graphql.UniqueDirectiveNamesRule, _graphql.KnownTypeNamesRule, _graphql.KnownDirectivesRule, _graphql.UniqueDirectivesPerLocationRule, _graphql.PossibleTypeExtensionsRule, _graphql.UniqueArgumentNamesRule, _graphql.UniqueInputFieldNamesRule, _graphql.UniqueVariableNamesRule, _graphql.FragmentsOnCompositeTypesRule, _graphql.ProvidedRequiredArgumentsRule]; function validateWithCustomRules(schema, ast, customRules, isRelayCompatMode, isSchemaDocument) { const rules = _graphql.specifiedRules.filter(rule => { if (rule === _graphql.NoUnusedFragmentsRule || rule === _graphql.ExecutableDefinitionsRule) { @@ -84294,15 +91711,15 @@ Object.defineProperty(exports, "__esModule", ({ })); exports["default"] = void 0; var GraphiQLReact = _interopRequireWildcard(__webpack_require__(/*! @graphiql/react */ "../../graphiql-react/dist/index.js")); -var _toolkit = __webpack_require__(/*! @graphiql/toolkit */ "../../graphiql-toolkit/esm/index.js"); +var _toolkit = __webpack_require__(/*! @graphiql/toolkit */ "../../graphiql-toolkit/dist/esm/index.js"); var GraphQL = _interopRequireWildcard(__webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs")); var _GraphiQL = __webpack_require__(/*! ./components/GraphiQL */ "./components/GraphiQL.tsx"); __webpack_require__(/*! @graphiql/react/font/roboto.css */ "../../graphiql-react/font/roboto.css"); __webpack_require__(/*! @graphiql/react/font/fira-code.css */ "../../graphiql-react/font/fira-code.css"); __webpack_require__(/*! @graphiql/react/dist/style.css */ "../../graphiql-react/dist/style.css"); __webpack_require__(/*! ./style.css */ "./style.css"); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /** * Copyright (c) 2021 GraphQL Contributors. * @@ -84341,8 +91758,7 @@ _GraphiQL.GraphiQL.GraphQL = GraphQL; */ // @ts-expect-error _GraphiQL.GraphiQL.React = GraphiQLReact; -var _default = _GraphiQL.GraphiQL; -exports["default"] = _default; +var _default = exports["default"] = _GraphiQL.GraphiQL; }(); window.GraphiQL = __webpack_exports__["default"]; /******/ })() diff --git a/netbox/project-static/dist/graphiql/index.umd.js b/netbox/project-static/dist/graphiql/index.umd.js index 5089eab847..5b7ff2e200 100644 --- a/netbox/project-static/dist/graphiql/index.umd.js +++ b/netbox/project-static/dist/graphiql/index.umd.js @@ -1 +1 @@ -(function(z,G){typeof exports=="object"&&typeof module<"u"?G(exports,require("@graphiql/react"),require("react"),require("graphql")):typeof define=="function"&&define.amd?define(["exports","@graphiql/react","react","graphql"],G):(z=typeof globalThis<"u"?globalThis:z||self,G(z.GraphiQLPluginExplorer={},z.GraphiQL.React,z.React,z.GraphiQL.GraphQL))})(this,function(z,G,N,De){"use strict";function ve(i){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(i){for(const s in i)if(s!=="default"){const n=Object.getOwnPropertyDescriptor(i,s);Object.defineProperty(t,s,n.get?n:{enumerable:!0,get:()=>i[s]})}}return t.default=i,Object.freeze(t)}const Te=ve(N),Ne=ve(De);function ge(i){return i&&Object.prototype.hasOwnProperty.call(i,"default")&&Object.keys(i).length===1?i.default:i}var re={},ie={};const Le=ge(Te),Me=ge(Ne);Object.defineProperty(ie,"__esModule",{value:!0});var je=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(i){return typeof i}:function(i){return i&&typeof Symbol=="function"&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},ye=function(){function i(t,s){var n=[],e=!0,l=!1,c=void 0;try{for(var f=t[Symbol.iterator](),u;!(e=(u=f.next()).done)&&(n.push(u.value),!(s&&n.length===s));e=!0);}catch(r){l=!0,c=r}finally{try{!e&&f.return&&f.return()}finally{if(l)throw c}}return n}return function(t,s){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return i(t,s);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),k=Object.assign||function(i){for(var t=1;t"u"?p=!0:typeof r.kind=="string"&&(h=!0)}catch{}var F=e.props.selection,d=e._getArgSelection();if(!d){console.error("missing arg selection when setting arg value");return}var b=Q(e.props.arg.type),g=(0,v.isLeafType)(b)||m||p||h;if(!g){console.warn("Unable to handle non leaf types in InputArgView.setArgValue",r);return}var C=void 0,_=void 0;r===null||typeof r>"u"?_=null:!r.target&&r.kind&&r.kind==="VariableDefinition"?(C=r,_=C.variable):typeof r.kind=="string"?_=r:r.target&&typeof r.target.value=="string"&&(C=r.target.value,_=ke(b,C));var A=e.props.modifyFields((F.fields||[]).map(function(D){var B=D===d,j=B?k({},D,{value:_}):D;return j}),o);return A},e._modifyChildFields=function(r){return e.props.modifyFields(e.props.selection.fields.map(function(o){return o.name.value===e.props.arg.name?k({},o,{value:{kind:"ObjectValue",fields:r}}):o}),!0)},n),w(e,l)}return P(t,[{key:"render",value:function(){var n=this.props,e=n.arg,l=n.parentField,c=this._getArgSelection();return a.createElement(Ee,{argValue:c?c.value:null,arg:e,parentField:l,addArg:this._addArg,removeArg:this._removeArg,setArgFields:this._modifyChildFields,setArgValue:this._setArgValue,getDefaultScalarArgValue:this.props.getDefaultScalarArgValue,makeDefaultArg:this.props.makeDefaultArg,onRunOperation:this.props.onRunOperation,styleConfig:this.props.styleConfig,onCommit:this.props.onCommit,definition:this.props.definition})}}]),t}(a.PureComponent);function ue(i){if((0,v.isEnumType)(i))return{kind:"EnumValue",value:i.getValues()[0].name};switch(i.name){case"String":return{kind:"StringValue",value:""};case"Float":return{kind:"FloatValue",value:"1.5"};case"Int":return{kind:"IntValue",value:"10"};case"Boolean":return{kind:"BooleanValue",value:!1};default:return{kind:"StringValue",value:""}}}function Ce(i,t,s){return ue(s)}var We=function(i){R(t,i);function t(){var s,n,e,l;q(this,t);for(var c=arguments.length,f=Array(c),u=0;u"u"?p=!0:typeof r.kind=="string"&&(h=!0)}catch{}var F=e.props.selection,d=e._getArgSelection();if(!d&&!m){console.error("missing arg selection when setting arg value");return}var b=Q(e.props.arg.type),g=(0,v.isLeafType)(b)||m||p||h;if(!g){console.warn("Unable to handle non leaf types in ArgView._setArgValue");return}var C=void 0,_=void 0;return r===null||typeof r>"u"?_=null:r.target&&typeof r.target.value=="string"?(C=r.target.value,_=ke(b,C)):!r.target&&r.kind==="VariableDefinition"?(C=r,_=C.variable):typeof r.kind=="string"&&(_=r),e.props.modifyArguments((F.arguments||[]).map(function(A){return A===d?k({},A,{value:_}):A}),o)},e._setArgFields=function(r,o){var p=e.props.selection,m=e._getArgSelection();if(!m){console.error("missing arg selection when setting arg value");return}return e.props.modifyArguments((p.arguments||[]).map(function(h){return h===m?k({},h,{value:{kind:"ObjectValue",fields:r}}):h}),o)},n),w(e,l)}return P(t,[{key:"render",value:function(){var n=this.props,e=n.arg,l=n.parentField,c=this._getArgSelection();return a.createElement(Ee,{argValue:c?c.value:null,arg:e,parentField:l,addArg:this._addArg,removeArg:this._removeArg,setArgFields:this._setArgFields,setArgValue:this._setArgValue,getDefaultScalarArgValue:this.props.getDefaultScalarArgValue,makeDefaultArg:this.props.makeDefaultArg,onRunOperation:this.props.onRunOperation,styleConfig:this.props.styleConfig,onCommit:this.props.onCommit,definition:this.props.definition})}}]),t}(a.PureComponent);function Qe(i){return i.ctrlKey&&i.key==="Enter"}function Ze(i){return i!=="FragmentDefinition"}var Ke=function(i){R(t,i);function t(){var s,n,e,l;q(this,t);for(var c=arguments.length,f=Array(c),u=0;u0?C=""+b+g:C=b;var _=c.type.toString(),A=(0,v.parseType)(_),D={kind:"VariableDefinition",variable:{kind:"Variable",name:{kind:"Name",value:C}},type:A,directives:[]},B=function(x){return(n.props.definition.variableDefinitions||[]).find(function(T){return T.variable.name.value===x})},j=void 0,W={};if(typeof l<"u"&&l!==null){var U=(0,v.visit)(l,{Variable:function(x){var T=x.name.value,J=B(T);if(W[T]=W[T]+1||1,!!J)return J.defaultValue}}),K=D.type.kind==="NonNullType",M=K?k({},D,{type:D.type.type}):D;j=k({},M,{defaultValue:U})}else j=D;var $=Object.entries(W).filter(function(E){var x=ye(E,2);x[0];var T=x[1];return T<2}).map(function(E){var x=ye(E,2),T=x[0];return x[1],T});if(j){var X=n.props.setArgValue(j,!1);if(X){var ee=X.definitions.find(function(E){return E.operation&&E.name&&E.name.value&&n.props.definition.name&&n.props.definition.name.value?E.name.value===n.props.definition.name.value:!1}),y=[].concat(I(ee.variableDefinitions||[]),[j]).filter(function(E){return $.indexOf(E.variable.name.value)===-1}),S=k({},ee,{variableDefinitions:y}),O=X.definitions,V=O.map(function(E){return ee===E?S:E}),L=k({},X,{definitions:V});n.props.onCommit(L)}}},m=function(){if(!(!l||!l.name||!l.name.value)){var b=l.name.value,g=(n.props.definition.variableDefinitions||[]).find(function(M){return M.variable.name.value===b});if(g){var C=g.defaultValue,_=n.props.setArgValue(C,{commit:!1});if(_){var A=_.definitions.find(function(M){return M.name.value===n.props.definition.name.value});if(!A)return;var D=0;(0,v.visit)(A,{Variable:function($){$.name.value===b&&(D=D+1)}});var B=A.variableDefinitions||[];D<2&&(B=B.filter(function(M){return M.variable.name.value!==b}));var j=k({},A,{variableDefinitions:B}),W=_.definitions,U=W.map(function(M){return A===M?j:M}),K=k({},_,{definitions:U});n.props.onCommit(K)}}}},h=l&&l.kind==="Variable",F=this.state.displayArgActions?a.createElement("button",{type:"submit",className:"toolbar-button",title:h?"Remove the variable":"Extract the current value into a GraphQL variable",onClick:function(b){b.preventDefault(),b.stopPropagation(),h?m():p()},style:f.styles.actionButtonStyle},a.createElement("span",{style:{color:f.colors.variable}},"$")):null;return a.createElement("div",{style:{cursor:"pointer",minHeight:"16px",WebkitUserSelect:"none",userSelect:"none"},"data-arg-name":c.name,"data-arg-type":u.name,className:"graphiql-explorer-"+c.name},a.createElement("span",{style:{cursor:"pointer"},onClick:function(b){var g=!l;g?n.props.addArg(!0):n.props.removeArg(!0),n.setState({displayArgActions:g})}},(0,v.isInputObjectType)(u)?a.createElement("span",null,l?this.props.styleConfig.arrowOpen:this.props.styleConfig.arrowClosed):a.createElement(ae,{checked:!!l,styleConfig:this.props.styleConfig}),a.createElement("span",{style:{color:f.colors.attribute},title:c.description,onMouseEnter:function(){l!==null&&typeof l<"u"&&n.setState({displayArgActions:!0})},onMouseLeave:function(){return n.setState({displayArgActions:!1})}},c.name,Se(c)?"*":"",": ",F," ")," "),r||a.createElement("span",null)," ")}}]),t}(a.PureComponent),Je=function(i){R(t,i);function t(){var s,n,e,l;q(this,t);for(var c=arguments.length,f=Array(c),u=0;u0;C&&n.setState({displayFieldActions:!0})},onMouseLeave:function(){return n.setState({displayFieldActions:!1})}},(0,v.isObjectType)(o)?a.createElement("span",null,r?this.props.styleConfig.arrowOpen:this.props.styleConfig.arrowClosed):null,(0,v.isObjectType)(o)?null:a.createElement(ae,{checked:!!r,styleConfig:this.props.styleConfig}),a.createElement("span",{style:{color:u.colors.property},className:"graphiql-explorer-field-view"},l.name),this.state.displayFieldActions?a.createElement("button",{type:"submit",className:"toolbar-button",title:"Extract selections into a new reusable fragment",onClick:function(C){C.preventDefault(),C.stopPropagation();var _=o.name,A=_+"Fragment",D=(h||[]).filter(function(M){return M.name.value.startsWith(A)}).length;D>0&&(A=""+A+D);var B=r?r.selectionSet?r.selectionSet.selections:[]:[],j=[{kind:"FragmentSpread",name:{kind:"Name",value:A},directives:[]}],W={kind:"FragmentDefinition",name:{kind:"Name",value:A},typeCondition:{kind:"NamedType",name:{kind:"Name",value:o.name}},directives:[],selectionSet:{kind:"SelectionSet",selections:B}},U=n._modifyChildSelections(j,!1);if(U){var K=k({},U,{definitions:[].concat(I(U.definitions),[W])});n.props.onCommit(K)}else console.warn("Unable to complete extractFragment operation")},style:k({},u.styles.actionButtonStyle)},a.createElement("span",null,"…")):null),r&&p.length?a.createElement("div",{style:{marginLeft:16},className:"graphiql-explorer-graphql-arguments"},p.map(function(g){return a.createElement(We,{key:g.name,parentField:l,arg:g,selection:r,modifyArguments:n._setArguments,getDefaultScalarArgValue:n.props.getDefaultScalarArgValue,makeDefaultArg:n.props.makeDefaultArg,onRunOperation:n.props.onRunOperation,styleConfig:n.props.styleConfig,onCommit:n.props.onCommit,definition:n.props.definition})})):null);if(r&&((0,v.isObjectType)(o)||(0,v.isInterfaceType)(o)||(0,v.isUnionType)(o))){var d=(0,v.isUnionType)(o)?{}:o.getFields(),b=r?r.selectionSet?r.selectionSet.selections:[]:[];return a.createElement("div",{className:"graphiql-explorer-"+l.name},F,a.createElement("div",{style:{marginLeft:16}},h?h.map(function(g){var C=c.getType(g.typeCondition.name.value),_=g.name.value;return C?a.createElement(Ye,{key:_,fragment:g,selections:b,modifySelections:n._modifyChildSelections,schema:c,styleConfig:n.props.styleConfig,onCommit:n.props.onCommit}):null}):null,Object.keys(d).sort().map(function(g){return a.createElement(t,{key:g,field:d[g],selections:b,modifySelections:n._modifyChildSelections,schema:c,getDefaultFieldNames:f,getDefaultScalarArgValue:n.props.getDefaultScalarArgValue,makeDefaultArg:n.props.makeDefaultArg,onRunOperation:n.props.onRunOperation,styleConfig:n.props.styleConfig,onCommit:n.props.onCommit,definition:n.props.definition,availableFragments:n.props.availableFragments})}),(0,v.isInterfaceType)(o)||(0,v.isUnionType)(o)?c.getPossibleTypes(o).map(function(g){return a.createElement(Je,{key:g.name,implementingType:g,selections:b,modifySelections:n._modifyChildSelections,schema:c,getDefaultFieldNames:f,getDefaultScalarArgValue:n.props.getDefaultScalarArgValue,makeDefaultArg:n.props.makeDefaultArg,onRunOperation:n.props.onRunOperation,styleConfig:n.props.styleConfig,onCommit:n.props.onCommit,definition:n.props.definition})}):null))}return F}}]),t}(a.PureComponent);function Xe(i){try{return i.trim()?(0,v.parse)(i,{noLocation:!0}):null}catch(t){return new Error(t)}}var $e={kind:"OperationDefinition",operation:"query",variableDefinitions:[],name:{kind:"Name",value:"MyQuery"},directives:[],selectionSet:{kind:"SelectionSet",selections:[]}},le={kind:"Document",definitions:[$e]},Y=null;function et(i){if(Y&&Y[0]===i)return Y[1];var t=Xe(i);return t?t instanceof Error?Y?Y[1]:le:(Y=[i,t],t):le}var Oe={buttonStyle:{fontSize:"1.2em",padding:"0px",backgroundColor:"white",border:"none",margin:"5px 0px",height:"40px",width:"100%",display:"block",maxWidth:"none"},actionButtonStyle:{padding:"0px",backgroundColor:"white",border:"none",margin:"0px",maxWidth:"none",height:"15px",width:"15px",display:"inline-block",fontSize:"smaller"},explorerActionsStyle:{margin:"4px -8px -8px",paddingLeft:"8px",bottom:"0px",width:"100%",textAlign:"center",background:"none",borderTop:"none",borderBottom:"none"}},tt=function(i){R(t,i);function t(){var s,n,e,l;q(this,t);for(var c=arguments.length,f=Array(c),u=0;u"u"?"undefined":je(Z))==="object"&&typeof Z.commit<"u"?me=Z.commit:me=!0,H){var de=k({},d,{definitions:d.definitions.map(function(Ve){return Ve===y?H:Ve})});return me&&te(de),de}else return d},schema:l,getDefaultFieldNames:b,getDefaultScalarArgValue:g,makeDefaultArg:f,onRunOperation:function(){n.props.onRunOperation&&n.props.onRunOperation(O)},styleConfig:u,availableFragments:X})}),ee),K)}}]),t}(a.PureComponent);we.defaultProps={getDefaultFieldNames:be,getDefaultScalarArgValue:Ce};var rt=function(i){R(t,i);function t(){var s,n,e,l;q(this,t);for(var c=arguments.length,f=Array(c),u=0;u{f&&t(f),n()},[n,t]),[l,c]=G.useOptimisticState(G.useOperationsEditorState());return N.createElement(Fe,{schema:s,onRunOperation:e,explorerIsOpen:!0,colors:ot,arrowOpen:lt,arrowClosed:st,checkboxUnchecked:ut,checkboxChecked:pt,styles:ct,query:l,onEdit:c,...i})}function mt(i){return{title:"GraphiQL Explorer",icon:()=>N.createElement("svg",{height:"1em",strokeWidth:"1.5",viewBox:"0 0 24 24",fill:"none"},N.createElement("path",{d:"M18 6H20M22 6H20M20 6V4M20 6V8",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"}),N.createElement("path",{d:"M21.4 20H2.6C2.26863 20 2 19.7314 2 19.4V11H21.4C21.7314 11 22 11.2686 22 11.6V19.4C22 19.7314 21.7314 20 21.4 20Z",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"}),N.createElement("path",{d:"M2 11V4.6C2 4.26863 2.26863 4 2.6 4H8.77805C8.92127 4 9.05977 4.05124 9.16852 4.14445L12.3315 6.85555C12.4402 6.94876 12.5787 7 12.722 7H14",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"})),content:()=>N.createElement(ft,{...i})}}z.explorerPlugin=mt,Object.defineProperty(z,Symbol.toStringTag,{value:"Module"})}); +(function(z,P){typeof exports=="object"&&typeof module<"u"?P(exports,require("react"),require("@graphiql/react"),require("graphql")):typeof define=="function"&&define.amd?define(["exports","react","@graphiql/react","graphql"],P):(z=typeof globalThis<"u"?globalThis:z||self,P(z.GraphiQLPluginExplorer={},z.React,z.GraphiQL.React,z.GraphiQL.GraphQL))})(this,function(z,P,X,Ne){"use strict";function ve(i){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(i){for(const l in i)if(l!=="default"){const n=Object.getOwnPropertyDescriptor(i,l);Object.defineProperty(t,l,n.get?n:{enumerable:!0,get:()=>i[l]})}}return t.default=i,Object.freeze(t)}const N=ve(P),Me=ve(Ne);function ye(i){return i&&Object.prototype.hasOwnProperty.call(i,"default")&&Object.keys(i).length===1?i.default:i}var ie={},ae={};const Le=ye(N),je=ye(Me);Object.defineProperty(ae,"__esModule",{value:!0});var Pe=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(i){return typeof i}:function(i){return i&&typeof Symbol=="function"&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},he=function(){function i(t,l){var n=[],e=!0,s=!1,c=void 0;try{for(var f=t[Symbol.iterator](),u;!(e=(u=f.next()).done)&&(n.push(u.value),!(l&&n.length===l));e=!0);}catch(r){s=!0,c=r}finally{try{!e&&f.return&&f.return()}finally{if(s)throw c}}return n}return function(t,l){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return i(t,l);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),k=Object.assign||function(i){for(var t=1;t"u"?p=!0:typeof r.kind=="string"&&(h=!0)}catch{}var F=e.props.selection,d=e._getArgSelection();if(!d){console.error("missing arg selection when setting arg value");return}var b=Q(e.props.arg.type),v=(0,g.isLeafType)(b)||m||p||h;if(!v){console.warn("Unable to handle non leaf types in InputArgView.setArgValue",r);return}var E=void 0,_=void 0;r===null||typeof r>"u"?_=null:!r.target&&r.kind&&r.kind==="VariableDefinition"?(E=r,_=E.variable):typeof r.kind=="string"?_=r:r.target&&typeof r.target.value=="string"&&(E=r.target.value,_=Ee(b,E));var A=e.props.modifyFields((F.fields||[]).map(function(D){var U=D===d,j=U?k({},D,{value:_}):D;return j}),o);return A},e._modifyChildFields=function(r){return e.props.modifyFields(e.props.selection.fields.map(function(o){return o.name.value===e.props.arg.name?k({},o,{value:{kind:"ObjectValue",fields:r}}):o}),!0)},n),O(e,s)}return I(t,[{key:"render",value:function(){var n=this.props,e=n.arg,s=n.parentField,c=this._getArgSelection();return a.createElement(_e,{argValue:c?c.value:null,arg:e,parentField:s,addArg:this._addArg,removeArg:this._removeArg,setArgFields:this._modifyChildFields,setArgValue:this._setArgValue,getDefaultScalarArgValue:this.props.getDefaultScalarArgValue,makeDefaultArg:this.props.makeDefaultArg,onRunOperation:this.props.onRunOperation,styleConfig:this.props.styleConfig,onCommit:this.props.onCommit,definition:this.props.definition})}}]),t}(a.PureComponent);function pe(i){if((0,g.isEnumType)(i))return{kind:"EnumValue",value:i.getValues()[0].name};switch(i.name){case"String":return{kind:"StringValue",value:""};case"Float":return{kind:"FloatValue",value:"1.5"};case"Int":return{kind:"IntValue",value:"10"};case"Boolean":return{kind:"BooleanValue",value:!1};default:return{kind:"StringValue",value:""}}}function Ce(i,t,l){return pe(l)}var Qe=function(i){B(t,i);function t(){var l,n,e,s;q(this,t);for(var c=arguments.length,f=Array(c),u=0;u"u"?p=!0:typeof r.kind=="string"&&(h=!0)}catch{}var F=e.props.selection,d=e._getArgSelection();if(!d&&!m){console.error("missing arg selection when setting arg value");return}var b=Q(e.props.arg.type),v=(0,g.isLeafType)(b)||m||p||h;if(!v){console.warn("Unable to handle non leaf types in ArgView._setArgValue");return}var E=void 0,_=void 0;return r===null||typeof r>"u"?_=null:r.target&&typeof r.target.value=="string"?(E=r.target.value,_=Ee(b,E)):!r.target&&r.kind==="VariableDefinition"?(E=r,_=E.variable):typeof r.kind=="string"&&(_=r),e.props.modifyArguments((F.arguments||[]).map(function(A){return A===d?k({},A,{value:_}):A}),o)},e._setArgFields=function(r,o){var p=e.props.selection,m=e._getArgSelection();if(!m){console.error("missing arg selection when setting arg value");return}return e.props.modifyArguments((p.arguments||[]).map(function(h){return h===m?k({},h,{value:{kind:"ObjectValue",fields:r}}):h}),o)},n),O(e,s)}return I(t,[{key:"render",value:function(){var n=this.props,e=n.arg,s=n.parentField,c=this._getArgSelection();return a.createElement(_e,{argValue:c?c.value:null,arg:e,parentField:s,addArg:this._addArg,removeArg:this._removeArg,setArgFields:this._setArgFields,setArgValue:this._setArgValue,getDefaultScalarArgValue:this.props.getDefaultScalarArgValue,makeDefaultArg:this.props.makeDefaultArg,onRunOperation:this.props.onRunOperation,styleConfig:this.props.styleConfig,onCommit:this.props.onCommit,definition:this.props.definition})}}]),t}(a.PureComponent);function Ze(i){return i.ctrlKey&&i.key==="Enter"}function Ke(i){return i!=="FragmentDefinition"}var $e=function(i){B(t,i);function t(){var l,n,e,s;q(this,t);for(var c=arguments.length,f=Array(c),u=0;u0?E=""+b+v:E=b;var _=c.type.toString(),A=(0,g.parseType)(_),D={kind:"VariableDefinition",variable:{kind:"Variable",name:{kind:"Name",value:E}},type:A,directives:[]},U=function(x){return(n.props.definition.variableDefinitions||[]).find(function(T){return T.variable.name.value===x})},j=void 0,W={};if(typeof s<"u"&&s!==null){var H=(0,g.visit)(s,{Variable:function(x){var T=x.name.value,$=U(T);if(W[T]=W[T]+1||1,!!$)return $.defaultValue}}),K=D.type.kind==="NonNullType",L=K?k({},D,{type:D.type.type}):D;j=k({},L,{defaultValue:H})}else j=D;var ee=Object.entries(W).filter(function(C){var x=he(C,2);x[0];var T=x[1];return T<2}).map(function(C){var x=he(C,2),T=x[0];return x[1],T});if(j){var Y=n.props.setArgValue(j,!1);if(Y){var te=Y.definitions.find(function(C){return C.operation&&C.name&&C.name.value&&n.props.definition.name&&n.props.definition.name.value?C.name.value===n.props.definition.name.value:!1}),y=[].concat(R(te.variableDefinitions||[]),[j]).filter(function(C){return ee.indexOf(C.variable.name.value)===-1}),S=k({},te,{variableDefinitions:y}),w=Y.definitions,V=w.map(function(C){return te===C?S:C}),M=k({},Y,{definitions:V});n.props.onCommit(M)}}},m=function(){if(!(!s||!s.name||!s.name.value)){var b=s.name.value,v=(n.props.definition.variableDefinitions||[]).find(function(L){return L.variable.name.value===b});if(v){var E=v.defaultValue,_=n.props.setArgValue(E,{commit:!1});if(_){var A=_.definitions.find(function(L){return L.name.value===n.props.definition.name.value});if(!A)return;var D=0;(0,g.visit)(A,{Variable:function(ee){ee.name.value===b&&(D=D+1)}});var U=A.variableDefinitions||[];D<2&&(U=U.filter(function(L){return L.variable.name.value!==b}));var j=k({},A,{variableDefinitions:U}),W=_.definitions,H=W.map(function(L){return A===L?j:L}),K=k({},_,{definitions:H});n.props.onCommit(K)}}}},h=s&&s.kind==="Variable",F=this.state.displayArgActions?a.createElement("button",{type:"submit",className:"toolbar-button",title:h?"Remove the variable":"Extract the current value into a GraphQL variable",onClick:function(b){b.preventDefault(),b.stopPropagation(),h?m():p()},style:f.styles.actionButtonStyle},a.createElement("span",{style:{color:f.colors.variable}},"$")):null;return a.createElement("div",{style:{cursor:"pointer",minHeight:"16px",WebkitUserSelect:"none",userSelect:"none"},"data-arg-name":c.name,"data-arg-type":u.name,className:"graphiql-explorer-"+c.name},a.createElement("span",{style:{cursor:"pointer"},onClick:function(b){var v=!s;v?n.props.addArg(!0):n.props.removeArg(!0),n.setState({displayArgActions:v})}},(0,g.isInputObjectType)(u)?a.createElement("span",null,s?this.props.styleConfig.arrowOpen:this.props.styleConfig.arrowClosed):a.createElement(oe,{checked:!!s,styleConfig:this.props.styleConfig}),a.createElement("span",{style:{color:f.colors.attribute},title:c.description,onMouseEnter:function(){s!==null&&typeof s<"u"&&n.setState({displayArgActions:!0})},onMouseLeave:function(){return n.setState({displayArgActions:!1})}},c.name,ke(c)?"*":"",": ",F," ")," "),r||a.createElement("span",null)," ")}}]),t}(a.PureComponent),Je=function(i){B(t,i);function t(){var l,n,e,s;q(this,t);for(var c=arguments.length,f=Array(c),u=0;u0;E&&n.setState({displayFieldActions:!0})},onMouseLeave:function(){return n.setState({displayFieldActions:!1})}},(0,g.isObjectType)(o)?a.createElement("span",null,r?this.props.styleConfig.arrowOpen:this.props.styleConfig.arrowClosed):null,(0,g.isObjectType)(o)?null:a.createElement(oe,{checked:!!r,styleConfig:this.props.styleConfig}),a.createElement("span",{style:{color:u.colors.property},className:"graphiql-explorer-field-view"},s.name),this.state.displayFieldActions?a.createElement("button",{type:"submit",className:"toolbar-button",title:"Extract selections into a new reusable fragment",onClick:function(E){E.preventDefault(),E.stopPropagation();var _=o.name,A=_+"Fragment",D=(h||[]).filter(function(L){return L.name.value.startsWith(A)}).length;D>0&&(A=""+A+D);var U=r?r.selectionSet?r.selectionSet.selections:[]:[],j=[{kind:"FragmentSpread",name:{kind:"Name",value:A},directives:[]}],W={kind:"FragmentDefinition",name:{kind:"Name",value:A},typeCondition:{kind:"NamedType",name:{kind:"Name",value:o.name}},directives:[],selectionSet:{kind:"SelectionSet",selections:U}},H=n._modifyChildSelections(j,!1);if(H){var K=k({},H,{definitions:[].concat(R(H.definitions),[W])});n.props.onCommit(K)}else console.warn("Unable to complete extractFragment operation")},style:k({},u.styles.actionButtonStyle)},a.createElement("span",null,"…")):null),r&&p.length?a.createElement("div",{style:{marginLeft:16},className:"graphiql-explorer-graphql-arguments"},p.map(function(v){return a.createElement(Qe,{key:v.name,parentField:s,arg:v,selection:r,modifyArguments:n._setArguments,getDefaultScalarArgValue:n.props.getDefaultScalarArgValue,makeDefaultArg:n.props.makeDefaultArg,onRunOperation:n.props.onRunOperation,styleConfig:n.props.styleConfig,onCommit:n.props.onCommit,definition:n.props.definition})})):null);if(r&&((0,g.isObjectType)(o)||(0,g.isInterfaceType)(o)||(0,g.isUnionType)(o))){var d=(0,g.isUnionType)(o)?{}:o.getFields(),b=r?r.selectionSet?r.selectionSet.selections:[]:[];return a.createElement("div",{className:"graphiql-explorer-"+s.name},F,a.createElement("div",{style:{marginLeft:16}},h?h.map(function(v){var E=c.getType(v.typeCondition.name.value),_=v.name.value;return E?a.createElement(Ye,{key:_,fragment:v,selections:b,modifySelections:n._modifyChildSelections,schema:c,styleConfig:n.props.styleConfig,onCommit:n.props.onCommit}):null}):null,Object.keys(d).sort().map(function(v){return a.createElement(t,{key:v,field:d[v],selections:b,modifySelections:n._modifyChildSelections,schema:c,getDefaultFieldNames:f,getDefaultScalarArgValue:n.props.getDefaultScalarArgValue,makeDefaultArg:n.props.makeDefaultArg,onRunOperation:n.props.onRunOperation,styleConfig:n.props.styleConfig,onCommit:n.props.onCommit,definition:n.props.definition,availableFragments:n.props.availableFragments})}),(0,g.isInterfaceType)(o)||(0,g.isUnionType)(o)?c.getPossibleTypes(o).map(function(v){return a.createElement(Je,{key:v.name,implementingType:v,selections:b,modifySelections:n._modifyChildSelections,schema:c,getDefaultFieldNames:f,getDefaultScalarArgValue:n.props.getDefaultScalarArgValue,makeDefaultArg:n.props.makeDefaultArg,onRunOperation:n.props.onRunOperation,styleConfig:n.props.styleConfig,onCommit:n.props.onCommit,definition:n.props.definition})}):null))}return F}}]),t}(a.PureComponent);function Xe(i){try{return i.trim()?(0,g.parse)(i,{noLocation:!0}):null}catch(t){return new Error(t)}}var et={kind:"OperationDefinition",operation:"query",variableDefinitions:[],name:{kind:"Name",value:"MyQuery"},directives:[],selectionSet:{kind:"SelectionSet",selections:[]}},se={kind:"Document",definitions:[et]},J=null;function tt(i){if(J&&J[0]===i)return J[1];var t=Xe(i);return t?t instanceof Error?J?J[1]:se:(J=[i,t],t):se}var Oe={buttonStyle:{fontSize:"1.2em",padding:"0px",backgroundColor:"white",border:"none",margin:"5px 0px",height:"40px",width:"100%",display:"block",maxWidth:"none"},actionButtonStyle:{padding:"0px",backgroundColor:"white",border:"none",margin:"0px",maxWidth:"none",height:"15px",width:"15px",display:"inline-block",fontSize:"smaller"},explorerActionsStyle:{margin:"4px -8px -8px",paddingLeft:"8px",bottom:"0px",width:"100%",textAlign:"center",background:"none",borderTop:"none",borderBottom:"none"}},nt=function(i){B(t,i);function t(){var l,n,e,s;q(this,t);for(var c=arguments.length,f=Array(c),u=0;u"u"?"undefined":Pe(Z))==="object"&&typeof Z.commit<"u"?de=Z.commit:de=!0,G){var ge=k({},d,{definitions:d.definitions.map(function(Te){return Te===y?G:Te})});return de&&ne(ge),ge}else return d},schema:s,getDefaultFieldNames:b,getDefaultScalarArgValue:v,makeDefaultArg:f,onRunOperation:function(){n.props.onRunOperation&&n.props.onRunOperation(w)},styleConfig:u,availableFragments:Y})}),te),K)}}]),t}(a.PureComponent);Fe.defaultProps={getDefaultFieldNames:Se,getDefaultScalarArgValue:Ce};var it=function(i){B(t,i);function t(){var l,n,e,s;q(this,t);for(var c=arguments.length,f=Array(c),u=0;uN.createElement("svg",{width:5,height:8,viewBox:"0 0 5 8",fill:"currentColor",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...l},i?N.createElement("title",{id:t},i):null,N.createElement("path",{d:"M0.910453 6.86965L3.88955 3.89061C4.09782 3.68233 4.09782 3.34465 3.88955 3.13637L0.910453 0.157278C0.574475 -0.178701 0 0.0592511 0 0.534408V6.49259C0 6.96768 0.574475 7.20565 0.910453 6.86965Z"})),lt=({title:i,titleId:t,...l})=>N.createElement("svg",{height:"1em",strokeWidth:1.5,viewBox:"0 0 24 24",stroke:"currentColor",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...l},i?N.createElement("title",{id:t},i):null,N.createElement("path",{d:"M18 6H20M22 6H20M20 6V4M20 6V8",strokeLinecap:"round",strokeLinejoin:"round"}),N.createElement("path",{d:"M21.4 20H2.6C2.26863 20 2 19.7314 2 19.4V11H21.4C21.7314 11 22 11.2686 22 11.6V19.4C22 19.7314 21.7314 20 21.4 20Z",strokeLinecap:"round",strokeLinejoin:"round"}),N.createElement("path",{d:"M2 11V4.6C2 4.26863 2.26863 4 2.6 4H8.77805C8.92127 4 9.05977 4.05124 9.16852 4.14445L12.3315 6.85555C12.4402 6.94876 12.5787 7 12.722 7H14",strokeLinecap:"round",strokeLinejoin:"round"})),st=({title:i,titleId:t,...l})=>N.createElement("svg",{width:15,height:15,viewBox:"0 0 15 15",xmlns:"http://www.w3.org/2000/svg",stroke:"currentColor",fill:"none","aria-labelledby":t,...l},i?N.createElement("title",{id:t},i):null,N.createElement("circle",{cx:7.5,cy:7.5,r:6,strokeWidth:2})),ut=({title:i,titleId:t,...l})=>N.createElement("svg",{width:15,height:15,viewBox:"0 0 15 15",xmlns:"http://www.w3.org/2000/svg",fill:"currentColor","aria-labelledby":t,...l},i?N.createElement("title",{id:t},i):null,N.createElement("circle",{cx:7.5,cy:7.5,r:7.5}),N.createElement("path",{d:"M4.64641 7.00106L6.8801 9.23256L10.5017 5.61325",stroke:"white",strokeWidth:1.5})),pt={keyword:"hsl(var(--color-primary))",def:"hsl(var(--color-tertiary))",property:"hsl(var(--color-info))",qualifier:"hsl(var(--color-secondary))",attribute:"hsl(var(--color-tertiary))",number:"hsl(var(--color-success))",string:"hsl(var(--color-warning))",builtin:"hsl(var(--color-success))",string2:"hsl(var(--color-secondary))",variable:"hsl(var(--color-secondary))",atom:"hsl(var(--color-tertiary))"},ct=P.createElement(De,{style:{width:"var(--px-16)",transform:"rotate(90deg)"}}),ft=P.createElement(De,{style:{width:"var(--px-16)"}}),mt=P.createElement(st,{style:{marginRight:"var(--px-4)"}}),dt=P.createElement(ut,{style:{fill:"hsl(var(--color-info))",marginRight:"var(--px-4)"}}),gt={buttonStyle:{cursor:"pointer",fontSize:"2em",lineHeight:0},explorerActionsStyle:{paddingTop:"var(--px-16)"},actionButtonStyle:{}};function vt(i){const{setOperationName:t}=X.useEditorContext({nonNull:!0}),{schema:l}=X.useSchemaContext({nonNull:!0}),{run:n}=X.useExecutionContext({nonNull:!0}),e=P.useCallback(f=>{f&&t(f),n()},[n,t]),[s,c]=X.useOptimisticState(X.useOperationsEditorState());return P.createElement(xe,{schema:l,onRunOperation:e,explorerIsOpen:!0,colors:pt,arrowOpen:ct,arrowClosed:ft,checkboxUnchecked:mt,checkboxChecked:dt,styles:gt,query:s,onEdit:c,...i})}function yt(i){return{title:"GraphiQL Explorer",icon:lt,content:()=>P.createElement(vt,{...i})}}z.explorerPlugin=yt,Object.defineProperty(z,Symbol.toStringTag,{value:"Module"})}); diff --git a/netbox/project-static/dist/graphiql/plugin-explorer-style.css b/netbox/project-static/dist/graphiql/plugin-explorer-style.css index 3900a4d36a..69beae9ec3 100644 --- a/netbox/project-static/dist/graphiql/plugin-explorer-style.css +++ b/netbox/project-static/dist/graphiql/plugin-explorer-style.css @@ -1 +1 @@ -.docExplorerWrap{height:unset!important;min-width:unset!important;width:unset!important}.doc-explorer-title{font-size:var(--font-size-h2);font-weight:var(--font-weight-medium)}.doc-explorer-rhs{display:none}.graphiql-explorer-root{font-family:var(--font-family-mono)!important;font-size:var(--font-size-body)!important;padding:0!important}.graphiql-explorer-root>div:first-child{padding-left:var(--px-8);overflow:hidden!important}.graphiql-explorer-root input{background:hsl(var(--color-base))}.graphiql-explorer-root select{background-color:hsl(var(--color-base));border:1px solid hsla(var(--color-neutral),var(--alpha-secondary));border-radius:var(--border-radius-4);color:hsl(var(--color-neutral));margin:0 var(--px-4);padding:var(--px-4) var(--px-6)} +.docExplorerWrap{height:unset!important;min-width:unset!important;width:unset!important}.docExplorerWrap svg{display:unset}.doc-explorer-title{font-size:var(--font-size-h2);font-weight:var(--font-weight-medium)}.doc-explorer-rhs{display:none}.graphiql-explorer-root{font-family:var(--font-family-mono)!important;font-size:var(--font-size-body)!important;padding:0!important}.graphiql-explorer-root>div>div{border-color:hsla(var(--color-neutral),var(--alpha-background-heavy))!important;padding-top:var(--px-16)}.graphiql-explorer-root input{background:unset}.graphiql-explorer-root select{background:hsl(var(--color-base))!important;border:1px solid hsla(var(--color-neutral),var(--alpha-secondary));border-radius:var(--border-radius-4);color:hsl(var(--color-neutral))!important;margin:0 var(--px-8);padding:var(--px-4) var(--px-6)}.graphiql-operation-title-bar .toolbar-button{line-height:0;margin-left:var(--px-8);color:hsla(var(--color-neutral),var(--alpha-secondary, .6));font-size:var(--font-size-h3);vertical-align:middle}.graphiql-explorer-graphql-arguments input{line-height:0}.graphiql-explorer-actions{border-color:hsla(var(--color-neutral),var(--alpha-background-heavy))!important} diff --git a/netbox/project-static/dist/netbox-external.css b/netbox/project-static/dist/netbox-external.css index 72d40bc923..7952f0e1e0 100644 --- a/netbox/project-static/dist/netbox-external.css +++ b/netbox/project-static/dist/netbox-external.css @@ -1 +1 @@ -@font-face{font-family:Material Design Icons;src:url("./materialdesignicons-webfont-A5TO3SM5.eot?v=7.4.47");src:url("./materialdesignicons-webfont-A5TO3SM5.eot?#iefix&v=7.4.47") format("embedded-opentype"),url("./materialdesignicons-webfont-7OXPFKOV.woff2?v=7.4.47") format("woff2"),url("./materialdesignicons-webfont-4ZM36VVG.woff?v=7.4.47") format("woff"),url("./materialdesignicons-webfont-OFFE53R5.ttf?v=7.4.47") format("truetype");font-weight:400;font-style:normal}.mdi:before,.mdi-set{display:inline-block;font: 24px/1 Material Design Icons;font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-ab-testing:before{content:"\f01c9"}.mdi-abacus:before{content:"\f16e0"}.mdi-abjad-arabic:before{content:"\f1328"}.mdi-abjad-hebrew:before{content:"\f1329"}.mdi-abugida-devanagari:before{content:"\f132a"}.mdi-abugida-thai:before{content:"\f132b"}.mdi-access-point:before{content:"\f0003"}.mdi-access-point-check:before{content:"\f1538"}.mdi-access-point-minus:before{content:"\f1539"}.mdi-access-point-network:before{content:"\f0002"}.mdi-access-point-network-off:before{content:"\f0be1"}.mdi-access-point-off:before{content:"\f1511"}.mdi-access-point-plus:before{content:"\f153a"}.mdi-access-point-remove:before{content:"\f153b"}.mdi-account:before{content:"\f0004"}.mdi-account-alert:before{content:"\f0005"}.mdi-account-alert-outline:before{content:"\f0b50"}.mdi-account-arrow-down:before{content:"\f1868"}.mdi-account-arrow-down-outline:before{content:"\f1869"}.mdi-account-arrow-left:before{content:"\f0b51"}.mdi-account-arrow-left-outline:before{content:"\f0b52"}.mdi-account-arrow-right:before{content:"\f0b53"}.mdi-account-arrow-right-outline:before{content:"\f0b54"}.mdi-account-arrow-up:before{content:"\f1867"}.mdi-account-arrow-up-outline:before{content:"\f186a"}.mdi-account-badge:before{content:"\f1b0a"}.mdi-account-badge-outline:before{content:"\f1b0b"}.mdi-account-box:before{content:"\f0006"}.mdi-account-box-edit-outline:before{content:"\f1cc8"}.mdi-account-box-minus-outline:before{content:"\f1cc9"}.mdi-account-box-multiple:before{content:"\f0934"}.mdi-account-box-multiple-outline:before{content:"\f100a"}.mdi-account-box-outline:before{content:"\f0007"}.mdi-account-box-plus-outline:before{content:"\f1cca"}.mdi-account-cancel:before{content:"\f12df"}.mdi-account-cancel-outline:before{content:"\f12e0"}.mdi-account-card:before{content:"\f1ba4"}.mdi-account-card-outline:before{content:"\f1ba5"}.mdi-account-cash:before{content:"\f1097"}.mdi-account-cash-outline:before{content:"\f1098"}.mdi-account-check:before{content:"\f0008"}.mdi-account-check-outline:before{content:"\f0be2"}.mdi-account-child:before{content:"\f0a89"}.mdi-account-child-circle:before{content:"\f0a8a"}.mdi-account-child-outline:before{content:"\f10c8"}.mdi-account-circle:before{content:"\f0009"}.mdi-account-circle-outline:before{content:"\f0b55"}.mdi-account-clock:before{content:"\f0b56"}.mdi-account-clock-outline:before{content:"\f0b57"}.mdi-account-cog:before{content:"\f1370"}.mdi-account-cog-outline:before{content:"\f1371"}.mdi-account-convert:before{content:"\f000a"}.mdi-account-convert-outline:before{content:"\f1301"}.mdi-account-cowboy-hat:before{content:"\f0e9b"}.mdi-account-cowboy-hat-outline:before{content:"\f17f3"}.mdi-account-credit-card:before{content:"\f1ba6"}.mdi-account-credit-card-outline:before{content:"\f1ba7"}.mdi-account-details:before{content:"\f0631"}.mdi-account-details-outline:before{content:"\f1372"}.mdi-account-edit:before{content:"\f06bc"}.mdi-account-edit-outline:before{content:"\f0ffb"}.mdi-account-eye:before{content:"\f0420"}.mdi-account-eye-outline:before{content:"\f127b"}.mdi-account-file:before{content:"\f1ca7"}.mdi-account-file-outline:before{content:"\f1ca8"}.mdi-account-file-text:before{content:"\f1ca9"}.mdi-account-file-text-outline:before{content:"\f1caa"}.mdi-account-filter:before{content:"\f0936"}.mdi-account-filter-outline:before{content:"\f0f9d"}.mdi-account-group:before{content:"\f0849"}.mdi-account-group-outline:before{content:"\f0b58"}.mdi-account-hard-hat:before{content:"\f05b5"}.mdi-account-hard-hat-outline:before{content:"\f1a1f"}.mdi-account-heart:before{content:"\f0899"}.mdi-account-heart-outline:before{content:"\f0be3"}.mdi-account-injury:before{content:"\f1815"}.mdi-account-injury-outline:before{content:"\f1816"}.mdi-account-key:before{content:"\f000b"}.mdi-account-key-outline:before{content:"\f0be4"}.mdi-account-lock:before{content:"\f115e"}.mdi-account-lock-open:before{content:"\f1960"}.mdi-account-lock-open-outline:before{content:"\f1961"}.mdi-account-lock-outline:before{content:"\f115f"}.mdi-account-minus:before{content:"\f000d"}.mdi-account-minus-outline:before{content:"\f0aec"}.mdi-account-multiple:before{content:"\f000e"}.mdi-account-multiple-check:before{content:"\f08c5"}.mdi-account-multiple-check-outline:before{content:"\f11fe"}.mdi-account-multiple-minus:before{content:"\f05d3"}.mdi-account-multiple-minus-outline:before{content:"\f0be5"}.mdi-account-multiple-outline:before{content:"\f000f"}.mdi-account-multiple-plus:before{content:"\f0010"}.mdi-account-multiple-plus-outline:before{content:"\f0800"}.mdi-account-multiple-remove:before{content:"\f120a"}.mdi-account-multiple-remove-outline:before{content:"\f120b"}.mdi-account-music:before{content:"\f0803"}.mdi-account-music-outline:before{content:"\f0ce9"}.mdi-account-network:before{content:"\f0011"}.mdi-account-network-off:before{content:"\f1af1"}.mdi-account-network-off-outline:before{content:"\f1af2"}.mdi-account-network-outline:before{content:"\f0be6"}.mdi-account-off:before{content:"\f0012"}.mdi-account-off-outline:before{content:"\f0be7"}.mdi-account-outline:before{content:"\f0013"}.mdi-account-plus:before{content:"\f0014"}.mdi-account-plus-outline:before{content:"\f0801"}.mdi-account-question:before{content:"\f0b59"}.mdi-account-question-outline:before{content:"\f0b5a"}.mdi-account-reactivate:before{content:"\f152b"}.mdi-account-reactivate-outline:before{content:"\f152c"}.mdi-account-remove:before{content:"\f0015"}.mdi-account-remove-outline:before{content:"\f0aed"}.mdi-account-school:before{content:"\f1a20"}.mdi-account-school-outline:before{content:"\f1a21"}.mdi-account-search:before{content:"\f0016"}.mdi-account-search-outline:before{content:"\f0935"}.mdi-account-settings:before{content:"\f0630"}.mdi-account-settings-outline:before{content:"\f10c9"}.mdi-account-star:before{content:"\f0017"}.mdi-account-star-outline:before{content:"\f0be8"}.mdi-account-supervisor:before{content:"\f0a8b"}.mdi-account-supervisor-circle:before{content:"\f0a8c"}.mdi-account-supervisor-circle-outline:before{content:"\f14ec"}.mdi-account-supervisor-outline:before{content:"\f112d"}.mdi-account-switch:before{content:"\f0019"}.mdi-account-switch-outline:before{content:"\f04cb"}.mdi-account-sync:before{content:"\f191b"}.mdi-account-sync-outline:before{content:"\f191c"}.mdi-account-tag:before{content:"\f1c1b"}.mdi-account-tag-outline:before{content:"\f1c1c"}.mdi-account-tie:before{content:"\f0ce3"}.mdi-account-tie-hat:before{content:"\f1898"}.mdi-account-tie-hat-outline:before{content:"\f1899"}.mdi-account-tie-outline:before{content:"\f10ca"}.mdi-account-tie-voice:before{content:"\f1308"}.mdi-account-tie-voice-off:before{content:"\f130a"}.mdi-account-tie-voice-off-outline:before{content:"\f130b"}.mdi-account-tie-voice-outline:before{content:"\f1309"}.mdi-account-tie-woman:before{content:"\f1a8c"}.mdi-account-voice:before{content:"\f05cb"}.mdi-account-voice-off:before{content:"\f0ed4"}.mdi-account-wrench:before{content:"\f189a"}.mdi-account-wrench-outline:before{content:"\f189b"}.mdi-adjust:before{content:"\f001a"}.mdi-advertisements:before{content:"\f192a"}.mdi-advertisements-off:before{content:"\f192b"}.mdi-air-conditioner:before{content:"\f001b"}.mdi-air-filter:before{content:"\f0d43"}.mdi-air-horn:before{content:"\f0dac"}.mdi-air-humidifier:before{content:"\f1099"}.mdi-air-humidifier-off:before{content:"\f1466"}.mdi-air-purifier:before{content:"\f0d44"}.mdi-air-purifier-off:before{content:"\f1b57"}.mdi-airbag:before{content:"\f0be9"}.mdi-airballoon:before{content:"\f001c"}.mdi-airballoon-outline:before{content:"\f100b"}.mdi-airplane:before{content:"\f001d"}.mdi-airplane-alert:before{content:"\f187a"}.mdi-airplane-check:before{content:"\f187b"}.mdi-airplane-clock:before{content:"\f187c"}.mdi-airplane-cog:before{content:"\f187d"}.mdi-airplane-edit:before{content:"\f187e"}.mdi-airplane-landing:before{content:"\f05d4"}.mdi-airplane-marker:before{content:"\f187f"}.mdi-airplane-minus:before{content:"\f1880"}.mdi-airplane-off:before{content:"\f001e"}.mdi-airplane-plus:before{content:"\f1881"}.mdi-airplane-remove:before{content:"\f1882"}.mdi-airplane-search:before{content:"\f1883"}.mdi-airplane-settings:before{content:"\f1884"}.mdi-airplane-takeoff:before{content:"\f05d5"}.mdi-airport:before{content:"\f084b"}.mdi-alarm:before{content:"\f0020"}.mdi-alarm-bell:before{content:"\f078e"}.mdi-alarm-check:before{content:"\f0021"}.mdi-alarm-light:before{content:"\f078f"}.mdi-alarm-light-off:before{content:"\f171e"}.mdi-alarm-light-off-outline:before{content:"\f171f"}.mdi-alarm-light-outline:before{content:"\f0bea"}.mdi-alarm-multiple:before{content:"\f0022"}.mdi-alarm-note:before{content:"\f0e71"}.mdi-alarm-note-off:before{content:"\f0e72"}.mdi-alarm-off:before{content:"\f0023"}.mdi-alarm-panel:before{content:"\f15c4"}.mdi-alarm-panel-outline:before{content:"\f15c5"}.mdi-alarm-plus:before{content:"\f0024"}.mdi-alarm-snooze:before{content:"\f068e"}.mdi-album:before{content:"\f0025"}.mdi-alert:before{content:"\f0026"}.mdi-alert-box:before{content:"\f0027"}.mdi-alert-box-outline:before{content:"\f0ce4"}.mdi-alert-circle:before{content:"\f0028"}.mdi-alert-circle-check:before{content:"\f11ed"}.mdi-alert-circle-check-outline:before{content:"\f11ee"}.mdi-alert-circle-outline:before{content:"\f05d6"}.mdi-alert-decagram:before{content:"\f06bd"}.mdi-alert-decagram-outline:before{content:"\f0ce5"}.mdi-alert-minus:before{content:"\f14bb"}.mdi-alert-minus-outline:before{content:"\f14be"}.mdi-alert-octagon:before{content:"\f0029"}.mdi-alert-octagon-outline:before{content:"\f0ce6"}.mdi-alert-octagram:before{content:"\f0767"}.mdi-alert-octagram-outline:before{content:"\f0ce7"}.mdi-alert-outline:before{content:"\f002a"}.mdi-alert-plus:before{content:"\f14ba"}.mdi-alert-plus-outline:before{content:"\f14bd"}.mdi-alert-remove:before{content:"\f14bc"}.mdi-alert-remove-outline:before{content:"\f14bf"}.mdi-alert-rhombus:before{content:"\f11ce"}.mdi-alert-rhombus-outline:before{content:"\f11cf"}.mdi-alien:before{content:"\f089a"}.mdi-alien-outline:before{content:"\f10cb"}.mdi-align-horizontal-center:before{content:"\f11c3"}.mdi-align-horizontal-distribute:before{content:"\f1962"}.mdi-align-horizontal-left:before{content:"\f11c2"}.mdi-align-horizontal-right:before{content:"\f11c4"}.mdi-align-vertical-bottom:before{content:"\f11c5"}.mdi-align-vertical-center:before{content:"\f11c6"}.mdi-align-vertical-distribute:before{content:"\f1963"}.mdi-align-vertical-top:before{content:"\f11c7"}.mdi-all-inclusive:before{content:"\f06be"}.mdi-all-inclusive-box:before{content:"\f188d"}.mdi-all-inclusive-box-outline:before{content:"\f188e"}.mdi-allergy:before{content:"\f1258"}.mdi-alpha:before{content:"\f002b"}.mdi-alpha-a:before{content:"\f0aee"}.mdi-alpha-a-box:before{content:"\f0b08"}.mdi-alpha-a-box-outline:before{content:"\f0beb"}.mdi-alpha-a-circle:before{content:"\f0bec"}.mdi-alpha-a-circle-outline:before{content:"\f0bed"}.mdi-alpha-b:before{content:"\f0aef"}.mdi-alpha-b-box:before{content:"\f0b09"}.mdi-alpha-b-box-outline:before{content:"\f0bee"}.mdi-alpha-b-circle:before{content:"\f0bef"}.mdi-alpha-b-circle-outline:before{content:"\f0bf0"}.mdi-alpha-c:before{content:"\f0af0"}.mdi-alpha-c-box:before{content:"\f0b0a"}.mdi-alpha-c-box-outline:before{content:"\f0bf1"}.mdi-alpha-c-circle:before{content:"\f0bf2"}.mdi-alpha-c-circle-outline:before{content:"\f0bf3"}.mdi-alpha-d:before{content:"\f0af1"}.mdi-alpha-d-box:before{content:"\f0b0b"}.mdi-alpha-d-box-outline:before{content:"\f0bf4"}.mdi-alpha-d-circle:before{content:"\f0bf5"}.mdi-alpha-d-circle-outline:before{content:"\f0bf6"}.mdi-alpha-e:before{content:"\f0af2"}.mdi-alpha-e-box:before{content:"\f0b0c"}.mdi-alpha-e-box-outline:before{content:"\f0bf7"}.mdi-alpha-e-circle:before{content:"\f0bf8"}.mdi-alpha-e-circle-outline:before{content:"\f0bf9"}.mdi-alpha-f:before{content:"\f0af3"}.mdi-alpha-f-box:before{content:"\f0b0d"}.mdi-alpha-f-box-outline:before{content:"\f0bfa"}.mdi-alpha-f-circle:before{content:"\f0bfb"}.mdi-alpha-f-circle-outline:before{content:"\f0bfc"}.mdi-alpha-g:before{content:"\f0af4"}.mdi-alpha-g-box:before{content:"\f0b0e"}.mdi-alpha-g-box-outline:before{content:"\f0bfd"}.mdi-alpha-g-circle:before{content:"\f0bfe"}.mdi-alpha-g-circle-outline:before{content:"\f0bff"}.mdi-alpha-h:before{content:"\f0af5"}.mdi-alpha-h-box:before{content:"\f0b0f"}.mdi-alpha-h-box-outline:before{content:"\f0c00"}.mdi-alpha-h-circle:before{content:"\f0c01"}.mdi-alpha-h-circle-outline:before{content:"\f0c02"}.mdi-alpha-i:before{content:"\f0af6"}.mdi-alpha-i-box:before{content:"\f0b10"}.mdi-alpha-i-box-outline:before{content:"\f0c03"}.mdi-alpha-i-circle:before{content:"\f0c04"}.mdi-alpha-i-circle-outline:before{content:"\f0c05"}.mdi-alpha-j:before{content:"\f0af7"}.mdi-alpha-j-box:before{content:"\f0b11"}.mdi-alpha-j-box-outline:before{content:"\f0c06"}.mdi-alpha-j-circle:before{content:"\f0c07"}.mdi-alpha-j-circle-outline:before{content:"\f0c08"}.mdi-alpha-k:before{content:"\f0af8"}.mdi-alpha-k-box:before{content:"\f0b12"}.mdi-alpha-k-box-outline:before{content:"\f0c09"}.mdi-alpha-k-circle:before{content:"\f0c0a"}.mdi-alpha-k-circle-outline:before{content:"\f0c0b"}.mdi-alpha-l:before{content:"\f0af9"}.mdi-alpha-l-box:before{content:"\f0b13"}.mdi-alpha-l-box-outline:before{content:"\f0c0c"}.mdi-alpha-l-circle:before{content:"\f0c0d"}.mdi-alpha-l-circle-outline:before{content:"\f0c0e"}.mdi-alpha-m:before{content:"\f0afa"}.mdi-alpha-m-box:before{content:"\f0b14"}.mdi-alpha-m-box-outline:before{content:"\f0c0f"}.mdi-alpha-m-circle:before{content:"\f0c10"}.mdi-alpha-m-circle-outline:before{content:"\f0c11"}.mdi-alpha-n:before{content:"\f0afb"}.mdi-alpha-n-box:before{content:"\f0b15"}.mdi-alpha-n-box-outline:before{content:"\f0c12"}.mdi-alpha-n-circle:before{content:"\f0c13"}.mdi-alpha-n-circle-outline:before{content:"\f0c14"}.mdi-alpha-o:before{content:"\f0afc"}.mdi-alpha-o-box:before{content:"\f0b16"}.mdi-alpha-o-box-outline:before{content:"\f0c15"}.mdi-alpha-o-circle:before{content:"\f0c16"}.mdi-alpha-o-circle-outline:before{content:"\f0c17"}.mdi-alpha-p:before{content:"\f0afd"}.mdi-alpha-p-box:before{content:"\f0b17"}.mdi-alpha-p-box-outline:before{content:"\f0c18"}.mdi-alpha-p-circle:before{content:"\f0c19"}.mdi-alpha-p-circle-outline:before{content:"\f0c1a"}.mdi-alpha-q:before{content:"\f0afe"}.mdi-alpha-q-box:before{content:"\f0b18"}.mdi-alpha-q-box-outline:before{content:"\f0c1b"}.mdi-alpha-q-circle:before{content:"\f0c1c"}.mdi-alpha-q-circle-outline:before{content:"\f0c1d"}.mdi-alpha-r:before{content:"\f0aff"}.mdi-alpha-r-box:before{content:"\f0b19"}.mdi-alpha-r-box-outline:before{content:"\f0c1e"}.mdi-alpha-r-circle:before{content:"\f0c1f"}.mdi-alpha-r-circle-outline:before{content:"\f0c20"}.mdi-alpha-s:before{content:"\f0b00"}.mdi-alpha-s-box:before{content:"\f0b1a"}.mdi-alpha-s-box-outline:before{content:"\f0c21"}.mdi-alpha-s-circle:before{content:"\f0c22"}.mdi-alpha-s-circle-outline:before{content:"\f0c23"}.mdi-alpha-t:before{content:"\f0b01"}.mdi-alpha-t-box:before{content:"\f0b1b"}.mdi-alpha-t-box-outline:before{content:"\f0c24"}.mdi-alpha-t-circle:before{content:"\f0c25"}.mdi-alpha-t-circle-outline:before{content:"\f0c26"}.mdi-alpha-u:before{content:"\f0b02"}.mdi-alpha-u-box:before{content:"\f0b1c"}.mdi-alpha-u-box-outline:before{content:"\f0c27"}.mdi-alpha-u-circle:before{content:"\f0c28"}.mdi-alpha-u-circle-outline:before{content:"\f0c29"}.mdi-alpha-v:before{content:"\f0b03"}.mdi-alpha-v-box:before{content:"\f0b1d"}.mdi-alpha-v-box-outline:before{content:"\f0c2a"}.mdi-alpha-v-circle:before{content:"\f0c2b"}.mdi-alpha-v-circle-outline:before{content:"\f0c2c"}.mdi-alpha-w:before{content:"\f0b04"}.mdi-alpha-w-box:before{content:"\f0b1e"}.mdi-alpha-w-box-outline:before{content:"\f0c2d"}.mdi-alpha-w-circle:before{content:"\f0c2e"}.mdi-alpha-w-circle-outline:before{content:"\f0c2f"}.mdi-alpha-x:before{content:"\f0b05"}.mdi-alpha-x-box:before{content:"\f0b1f"}.mdi-alpha-x-box-outline:before{content:"\f0c30"}.mdi-alpha-x-circle:before{content:"\f0c31"}.mdi-alpha-x-circle-outline:before{content:"\f0c32"}.mdi-alpha-y:before{content:"\f0b06"}.mdi-alpha-y-box:before{content:"\f0b20"}.mdi-alpha-y-box-outline:before{content:"\f0c33"}.mdi-alpha-y-circle:before{content:"\f0c34"}.mdi-alpha-y-circle-outline:before{content:"\f0c35"}.mdi-alpha-z:before{content:"\f0b07"}.mdi-alpha-z-box:before{content:"\f0b21"}.mdi-alpha-z-box-outline:before{content:"\f0c36"}.mdi-alpha-z-circle:before{content:"\f0c37"}.mdi-alpha-z-circle-outline:before{content:"\f0c38"}.mdi-alphabet-aurebesh:before{content:"\f132c"}.mdi-alphabet-cyrillic:before{content:"\f132d"}.mdi-alphabet-greek:before{content:"\f132e"}.mdi-alphabet-latin:before{content:"\f132f"}.mdi-alphabet-piqad:before{content:"\f1330"}.mdi-alphabet-tengwar:before{content:"\f1337"}.mdi-alphabetical:before{content:"\f002c"}.mdi-alphabetical-off:before{content:"\f100c"}.mdi-alphabetical-variant:before{content:"\f100d"}.mdi-alphabetical-variant-off:before{content:"\f100e"}.mdi-altimeter:before{content:"\f05d7"}.mdi-ambulance:before{content:"\f002f"}.mdi-ammunition:before{content:"\f0ce8"}.mdi-ampersand:before{content:"\f0a8d"}.mdi-amplifier:before{content:"\f0030"}.mdi-amplifier-off:before{content:"\f11b5"}.mdi-anchor:before{content:"\f0031"}.mdi-android:before{content:"\f0032"}.mdi-android-studio:before{content:"\f0034"}.mdi-angle-acute:before{content:"\f0937"}.mdi-angle-obtuse:before{content:"\f0938"}.mdi-angle-right:before{content:"\f0939"}.mdi-angular:before{content:"\f06b2"}.mdi-angularjs:before{content:"\f06bf"}.mdi-animation:before{content:"\f05d8"}.mdi-animation-outline:before{content:"\f0a8f"}.mdi-animation-play:before{content:"\f093a"}.mdi-animation-play-outline:before{content:"\f0a90"}.mdi-ansible:before{content:"\f109a"}.mdi-antenna:before{content:"\f1119"}.mdi-anvil:before{content:"\f089b"}.mdi-apache-kafka:before{content:"\f100f"}.mdi-api:before{content:"\f109b"}.mdi-api-off:before{content:"\f1257"}.mdi-apple:before{content:"\f0035"}.mdi-apple-finder:before{content:"\f0036"}.mdi-apple-icloud:before{content:"\f0038"}.mdi-apple-ios:before{content:"\f0037"}.mdi-apple-keyboard-caps:before{content:"\f0632"}.mdi-apple-keyboard-command:before{content:"\f0633"}.mdi-apple-keyboard-control:before{content:"\f0634"}.mdi-apple-keyboard-option:before{content:"\f0635"}.mdi-apple-keyboard-shift:before{content:"\f0636"}.mdi-apple-safari:before{content:"\f0039"}.mdi-application:before{content:"\f08c6"}.mdi-application-array:before{content:"\f10f5"}.mdi-application-array-outline:before{content:"\f10f6"}.mdi-application-braces:before{content:"\f10f7"}.mdi-application-braces-outline:before{content:"\f10f8"}.mdi-application-brackets:before{content:"\f0c8b"}.mdi-application-brackets-outline:before{content:"\f0c8c"}.mdi-application-cog:before{content:"\f0675"}.mdi-application-cog-outline:before{content:"\f1577"}.mdi-application-edit:before{content:"\f00ae"}.mdi-application-edit-outline:before{content:"\f0619"}.mdi-application-export:before{content:"\f0dad"}.mdi-application-import:before{content:"\f0dae"}.mdi-application-outline:before{content:"\f0614"}.mdi-application-parentheses:before{content:"\f10f9"}.mdi-application-parentheses-outline:before{content:"\f10fa"}.mdi-application-settings:before{content:"\f0b60"}.mdi-application-settings-outline:before{content:"\f1555"}.mdi-application-variable:before{content:"\f10fb"}.mdi-application-variable-outline:before{content:"\f10fc"}.mdi-approximately-equal:before{content:"\f0f9e"}.mdi-approximately-equal-box:before{content:"\f0f9f"}.mdi-apps:before{content:"\f003b"}.mdi-apps-box:before{content:"\f0d46"}.mdi-arch:before{content:"\f08c7"}.mdi-archive:before{content:"\f003c"}.mdi-archive-alert:before{content:"\f14fd"}.mdi-archive-alert-outline:before{content:"\f14fe"}.mdi-archive-arrow-down:before{content:"\f1259"}.mdi-archive-arrow-down-outline:before{content:"\f125a"}.mdi-archive-arrow-up:before{content:"\f125b"}.mdi-archive-arrow-up-outline:before{content:"\f125c"}.mdi-archive-cancel:before{content:"\f174b"}.mdi-archive-cancel-outline:before{content:"\f174c"}.mdi-archive-check:before{content:"\f174d"}.mdi-archive-check-outline:before{content:"\f174e"}.mdi-archive-clock:before{content:"\f174f"}.mdi-archive-clock-outline:before{content:"\f1750"}.mdi-archive-cog:before{content:"\f1751"}.mdi-archive-cog-outline:before{content:"\f1752"}.mdi-archive-edit:before{content:"\f1753"}.mdi-archive-edit-outline:before{content:"\f1754"}.mdi-archive-eye:before{content:"\f1755"}.mdi-archive-eye-outline:before{content:"\f1756"}.mdi-archive-lock:before{content:"\f1757"}.mdi-archive-lock-open:before{content:"\f1758"}.mdi-archive-lock-open-outline:before{content:"\f1759"}.mdi-archive-lock-outline:before{content:"\f175a"}.mdi-archive-marker:before{content:"\f175b"}.mdi-archive-marker-outline:before{content:"\f175c"}.mdi-archive-minus:before{content:"\f175d"}.mdi-archive-minus-outline:before{content:"\f175e"}.mdi-archive-music:before{content:"\f175f"}.mdi-archive-music-outline:before{content:"\f1760"}.mdi-archive-off:before{content:"\f1761"}.mdi-archive-off-outline:before{content:"\f1762"}.mdi-archive-outline:before{content:"\f120e"}.mdi-archive-plus:before{content:"\f1763"}.mdi-archive-plus-outline:before{content:"\f1764"}.mdi-archive-refresh:before{content:"\f1765"}.mdi-archive-refresh-outline:before{content:"\f1766"}.mdi-archive-remove:before{content:"\f1767"}.mdi-archive-remove-outline:before{content:"\f1768"}.mdi-archive-search:before{content:"\f1769"}.mdi-archive-search-outline:before{content:"\f176a"}.mdi-archive-settings:before{content:"\f176b"}.mdi-archive-settings-outline:before{content:"\f176c"}.mdi-archive-star:before{content:"\f176d"}.mdi-archive-star-outline:before{content:"\f176e"}.mdi-archive-sync:before{content:"\f176f"}.mdi-archive-sync-outline:before{content:"\f1770"}.mdi-arm-flex:before{content:"\f0fd7"}.mdi-arm-flex-outline:before{content:"\f0fd6"}.mdi-arrange-bring-forward:before{content:"\f003d"}.mdi-arrange-bring-to-front:before{content:"\f003e"}.mdi-arrange-send-backward:before{content:"\f003f"}.mdi-arrange-send-to-back:before{content:"\f0040"}.mdi-arrow-all:before{content:"\f0041"}.mdi-arrow-bottom-left:before{content:"\f0042"}.mdi-arrow-bottom-left-bold-box:before{content:"\f1964"}.mdi-arrow-bottom-left-bold-box-outline:before{content:"\f1965"}.mdi-arrow-bottom-left-bold-outline:before{content:"\f09b7"}.mdi-arrow-bottom-left-thick:before{content:"\f09b8"}.mdi-arrow-bottom-left-thin:before{content:"\f19b6"}.mdi-arrow-bottom-left-thin-circle-outline:before{content:"\f1596"}.mdi-arrow-bottom-right:before{content:"\f0043"}.mdi-arrow-bottom-right-bold-box:before{content:"\f1966"}.mdi-arrow-bottom-right-bold-box-outline:before{content:"\f1967"}.mdi-arrow-bottom-right-bold-outline:before{content:"\f09b9"}.mdi-arrow-bottom-right-thick:before{content:"\f09ba"}.mdi-arrow-bottom-right-thin:before{content:"\f19b7"}.mdi-arrow-bottom-right-thin-circle-outline:before{content:"\f1595"}.mdi-arrow-collapse:before{content:"\f0615"}.mdi-arrow-collapse-all:before{content:"\f0044"}.mdi-arrow-collapse-down:before{content:"\f0792"}.mdi-arrow-collapse-horizontal:before{content:"\f084c"}.mdi-arrow-collapse-left:before{content:"\f0793"}.mdi-arrow-collapse-right:before{content:"\f0794"}.mdi-arrow-collapse-up:before{content:"\f0795"}.mdi-arrow-collapse-vertical:before{content:"\f084d"}.mdi-arrow-decision:before{content:"\f09bb"}.mdi-arrow-decision-auto:before{content:"\f09bc"}.mdi-arrow-decision-auto-outline:before{content:"\f09bd"}.mdi-arrow-decision-outline:before{content:"\f09be"}.mdi-arrow-down:before{content:"\f0045"}.mdi-arrow-down-bold:before{content:"\f072e"}.mdi-arrow-down-bold-box:before{content:"\f072f"}.mdi-arrow-down-bold-box-outline:before{content:"\f0730"}.mdi-arrow-down-bold-circle:before{content:"\f0047"}.mdi-arrow-down-bold-circle-outline:before{content:"\f0048"}.mdi-arrow-down-bold-hexagon-outline:before{content:"\f0049"}.mdi-arrow-down-bold-outline:before{content:"\f09bf"}.mdi-arrow-down-box:before{content:"\f06c0"}.mdi-arrow-down-circle:before{content:"\f0cdb"}.mdi-arrow-down-circle-outline:before{content:"\f0cdc"}.mdi-arrow-down-drop-circle:before{content:"\f004a"}.mdi-arrow-down-drop-circle-outline:before{content:"\f004b"}.mdi-arrow-down-left:before{content:"\f17a1"}.mdi-arrow-down-left-bold:before{content:"\f17a2"}.mdi-arrow-down-right:before{content:"\f17a3"}.mdi-arrow-down-right-bold:before{content:"\f17a4"}.mdi-arrow-down-thick:before{content:"\f0046"}.mdi-arrow-down-thin:before{content:"\f19b3"}.mdi-arrow-down-thin-circle-outline:before{content:"\f1599"}.mdi-arrow-expand:before{content:"\f0616"}.mdi-arrow-expand-all:before{content:"\f004c"}.mdi-arrow-expand-down:before{content:"\f0796"}.mdi-arrow-expand-horizontal:before{content:"\f084e"}.mdi-arrow-expand-left:before{content:"\f0797"}.mdi-arrow-expand-right:before{content:"\f0798"}.mdi-arrow-expand-up:before{content:"\f0799"}.mdi-arrow-expand-vertical:before{content:"\f084f"}.mdi-arrow-horizontal-lock:before{content:"\f115b"}.mdi-arrow-left:before{content:"\f004d"}.mdi-arrow-left-bold:before{content:"\f0731"}.mdi-arrow-left-bold-box:before{content:"\f0732"}.mdi-arrow-left-bold-box-outline:before{content:"\f0733"}.mdi-arrow-left-bold-circle:before{content:"\f004f"}.mdi-arrow-left-bold-circle-outline:before{content:"\f0050"}.mdi-arrow-left-bold-hexagon-outline:before{content:"\f0051"}.mdi-arrow-left-bold-outline:before{content:"\f09c0"}.mdi-arrow-left-bottom:before{content:"\f17a5"}.mdi-arrow-left-bottom-bold:before{content:"\f17a6"}.mdi-arrow-left-box:before{content:"\f06c1"}.mdi-arrow-left-circle:before{content:"\f0cdd"}.mdi-arrow-left-circle-outline:before{content:"\f0cde"}.mdi-arrow-left-drop-circle:before{content:"\f0052"}.mdi-arrow-left-drop-circle-outline:before{content:"\f0053"}.mdi-arrow-left-right:before{content:"\f0e73"}.mdi-arrow-left-right-bold:before{content:"\f0e74"}.mdi-arrow-left-right-bold-outline:before{content:"\f09c1"}.mdi-arrow-left-thick:before{content:"\f004e"}.mdi-arrow-left-thin:before{content:"\f19b1"}.mdi-arrow-left-thin-circle-outline:before{content:"\f159a"}.mdi-arrow-left-top:before{content:"\f17a7"}.mdi-arrow-left-top-bold:before{content:"\f17a8"}.mdi-arrow-oscillating:before{content:"\f1c91"}.mdi-arrow-oscillating-off:before{content:"\f1c92"}.mdi-arrow-projectile:before{content:"\f1840"}.mdi-arrow-projectile-multiple:before{content:"\f183f"}.mdi-arrow-right:before{content:"\f0054"}.mdi-arrow-right-bold:before{content:"\f0734"}.mdi-arrow-right-bold-box:before{content:"\f0735"}.mdi-arrow-right-bold-box-outline:before{content:"\f0736"}.mdi-arrow-right-bold-circle:before{content:"\f0056"}.mdi-arrow-right-bold-circle-outline:before{content:"\f0057"}.mdi-arrow-right-bold-hexagon-outline:before{content:"\f0058"}.mdi-arrow-right-bold-outline:before{content:"\f09c2"}.mdi-arrow-right-bottom:before{content:"\f17a9"}.mdi-arrow-right-bottom-bold:before{content:"\f17aa"}.mdi-arrow-right-box:before{content:"\f06c2"}.mdi-arrow-right-circle:before{content:"\f0cdf"}.mdi-arrow-right-circle-outline:before{content:"\f0ce0"}.mdi-arrow-right-drop-circle:before{content:"\f0059"}.mdi-arrow-right-drop-circle-outline:before{content:"\f005a"}.mdi-arrow-right-thick:before{content:"\f0055"}.mdi-arrow-right-thin:before{content:"\f19b0"}.mdi-arrow-right-thin-circle-outline:before{content:"\f1598"}.mdi-arrow-right-top:before{content:"\f17ab"}.mdi-arrow-right-top-bold:before{content:"\f17ac"}.mdi-arrow-split-horizontal:before{content:"\f093b"}.mdi-arrow-split-vertical:before{content:"\f093c"}.mdi-arrow-top-left:before{content:"\f005b"}.mdi-arrow-top-left-bold-box:before{content:"\f1968"}.mdi-arrow-top-left-bold-box-outline:before{content:"\f1969"}.mdi-arrow-top-left-bold-outline:before{content:"\f09c3"}.mdi-arrow-top-left-bottom-right:before{content:"\f0e75"}.mdi-arrow-top-left-bottom-right-bold:before{content:"\f0e76"}.mdi-arrow-top-left-thick:before{content:"\f09c4"}.mdi-arrow-top-left-thin:before{content:"\f19b5"}.mdi-arrow-top-left-thin-circle-outline:before{content:"\f1593"}.mdi-arrow-top-right:before{content:"\f005c"}.mdi-arrow-top-right-bold-box:before{content:"\f196a"}.mdi-arrow-top-right-bold-box-outline:before{content:"\f196b"}.mdi-arrow-top-right-bold-outline:before{content:"\f09c5"}.mdi-arrow-top-right-bottom-left:before{content:"\f0e77"}.mdi-arrow-top-right-bottom-left-bold:before{content:"\f0e78"}.mdi-arrow-top-right-thick:before{content:"\f09c6"}.mdi-arrow-top-right-thin:before{content:"\f19b4"}.mdi-arrow-top-right-thin-circle-outline:before{content:"\f1594"}.mdi-arrow-u-down-left:before{content:"\f17ad"}.mdi-arrow-u-down-left-bold:before{content:"\f17ae"}.mdi-arrow-u-down-right:before{content:"\f17af"}.mdi-arrow-u-down-right-bold:before{content:"\f17b0"}.mdi-arrow-u-left-bottom:before{content:"\f17b1"}.mdi-arrow-u-left-bottom-bold:before{content:"\f17b2"}.mdi-arrow-u-left-top:before{content:"\f17b3"}.mdi-arrow-u-left-top-bold:before{content:"\f17b4"}.mdi-arrow-u-right-bottom:before{content:"\f17b5"}.mdi-arrow-u-right-bottom-bold:before{content:"\f17b6"}.mdi-arrow-u-right-top:before{content:"\f17b7"}.mdi-arrow-u-right-top-bold:before{content:"\f17b8"}.mdi-arrow-u-up-left:before{content:"\f17b9"}.mdi-arrow-u-up-left-bold:before{content:"\f17ba"}.mdi-arrow-u-up-right:before{content:"\f17bb"}.mdi-arrow-u-up-right-bold:before{content:"\f17bc"}.mdi-arrow-up:before{content:"\f005d"}.mdi-arrow-up-bold:before{content:"\f0737"}.mdi-arrow-up-bold-box:before{content:"\f0738"}.mdi-arrow-up-bold-box-outline:before{content:"\f0739"}.mdi-arrow-up-bold-circle:before{content:"\f005f"}.mdi-arrow-up-bold-circle-outline:before{content:"\f0060"}.mdi-arrow-up-bold-hexagon-outline:before{content:"\f0061"}.mdi-arrow-up-bold-outline:before{content:"\f09c7"}.mdi-arrow-up-box:before{content:"\f06c3"}.mdi-arrow-up-circle:before{content:"\f0ce1"}.mdi-arrow-up-circle-outline:before{content:"\f0ce2"}.mdi-arrow-up-down:before{content:"\f0e79"}.mdi-arrow-up-down-bold:before{content:"\f0e7a"}.mdi-arrow-up-down-bold-outline:before{content:"\f09c8"}.mdi-arrow-up-drop-circle:before{content:"\f0062"}.mdi-arrow-up-drop-circle-outline:before{content:"\f0063"}.mdi-arrow-up-left:before{content:"\f17bd"}.mdi-arrow-up-left-bold:before{content:"\f17be"}.mdi-arrow-up-right:before{content:"\f17bf"}.mdi-arrow-up-right-bold:before{content:"\f17c0"}.mdi-arrow-up-thick:before{content:"\f005e"}.mdi-arrow-up-thin:before{content:"\f19b2"}.mdi-arrow-up-thin-circle-outline:before{content:"\f1597"}.mdi-arrow-vertical-lock:before{content:"\f115c"}.mdi-artboard:before{content:"\f1b9a"}.mdi-artstation:before{content:"\f0b5b"}.mdi-aspect-ratio:before{content:"\f0a24"}.mdi-assistant:before{content:"\f0064"}.mdi-asterisk:before{content:"\f06c4"}.mdi-asterisk-circle-outline:before{content:"\f1a27"}.mdi-at:before{content:"\f0065"}.mdi-atlassian:before{content:"\f0804"}.mdi-atm:before{content:"\f0d47"}.mdi-atom:before{content:"\f0768"}.mdi-atom-variant:before{content:"\f0e7b"}.mdi-attachment:before{content:"\f0066"}.mdi-attachment-check:before{content:"\f1ac1"}.mdi-attachment-lock:before{content:"\f19c4"}.mdi-attachment-minus:before{content:"\f1ac2"}.mdi-attachment-off:before{content:"\f1ac3"}.mdi-attachment-plus:before{content:"\f1ac4"}.mdi-attachment-remove:before{content:"\f1ac5"}.mdi-atv:before{content:"\f1b70"}.mdi-audio-input-rca:before{content:"\f186b"}.mdi-audio-input-stereo-minijack:before{content:"\f186c"}.mdi-audio-input-xlr:before{content:"\f186d"}.mdi-audio-video:before{content:"\f093d"}.mdi-audio-video-off:before{content:"\f11b6"}.mdi-augmented-reality:before{content:"\f0850"}.mdi-aurora:before{content:"\f1bb9"}.mdi-auto-download:before{content:"\f137e"}.mdi-auto-fix:before{content:"\f0068"}.mdi-auto-mode:before{content:"\f1c20"}.mdi-auto-upload:before{content:"\f0069"}.mdi-autorenew:before{content:"\f006a"}.mdi-autorenew-off:before{content:"\f19e7"}.mdi-av-timer:before{content:"\f006b"}.mdi-awning:before{content:"\f1b87"}.mdi-awning-outline:before{content:"\f1b88"}.mdi-aws:before{content:"\f0e0f"}.mdi-axe:before{content:"\f08c8"}.mdi-axe-battle:before{content:"\f1842"}.mdi-axis:before{content:"\f0d48"}.mdi-axis-arrow:before{content:"\f0d49"}.mdi-axis-arrow-info:before{content:"\f140e"}.mdi-axis-arrow-lock:before{content:"\f0d4a"}.mdi-axis-lock:before{content:"\f0d4b"}.mdi-axis-x-arrow:before{content:"\f0d4c"}.mdi-axis-x-arrow-lock:before{content:"\f0d4d"}.mdi-axis-x-rotate-clockwise:before{content:"\f0d4e"}.mdi-axis-x-rotate-counterclockwise:before{content:"\f0d4f"}.mdi-axis-x-y-arrow-lock:before{content:"\f0d50"}.mdi-axis-y-arrow:before{content:"\f0d51"}.mdi-axis-y-arrow-lock:before{content:"\f0d52"}.mdi-axis-y-rotate-clockwise:before{content:"\f0d53"}.mdi-axis-y-rotate-counterclockwise:before{content:"\f0d54"}.mdi-axis-z-arrow:before{content:"\f0d55"}.mdi-axis-z-arrow-lock:before{content:"\f0d56"}.mdi-axis-z-rotate-clockwise:before{content:"\f0d57"}.mdi-axis-z-rotate-counterclockwise:before{content:"\f0d58"}.mdi-babel:before{content:"\f0a25"}.mdi-baby:before{content:"\f006c"}.mdi-baby-bottle:before{content:"\f0f39"}.mdi-baby-bottle-outline:before{content:"\f0f3a"}.mdi-baby-buggy:before{content:"\f13e0"}.mdi-baby-buggy-off:before{content:"\f1af3"}.mdi-baby-carriage:before{content:"\f068f"}.mdi-baby-carriage-off:before{content:"\f0fa0"}.mdi-baby-face:before{content:"\f0e7c"}.mdi-baby-face-outline:before{content:"\f0e7d"}.mdi-backburger:before{content:"\f006d"}.mdi-backspace:before{content:"\f006e"}.mdi-backspace-outline:before{content:"\f0b5c"}.mdi-backspace-reverse:before{content:"\f0e7e"}.mdi-backspace-reverse-outline:before{content:"\f0e7f"}.mdi-backup-restore:before{content:"\f006f"}.mdi-bacteria:before{content:"\f0ed5"}.mdi-bacteria-outline:before{content:"\f0ed6"}.mdi-badge-account:before{content:"\f0da7"}.mdi-badge-account-alert:before{content:"\f0da8"}.mdi-badge-account-alert-outline:before{content:"\f0da9"}.mdi-badge-account-horizontal:before{content:"\f0e0d"}.mdi-badge-account-horizontal-outline:before{content:"\f0e0e"}.mdi-badge-account-outline:before{content:"\f0daa"}.mdi-badminton:before{content:"\f0851"}.mdi-bag-carry-on:before{content:"\f0f3b"}.mdi-bag-carry-on-check:before{content:"\f0d65"}.mdi-bag-carry-on-off:before{content:"\f0f3c"}.mdi-bag-checked:before{content:"\f0f3d"}.mdi-bag-personal:before{content:"\f0e10"}.mdi-bag-personal-off:before{content:"\f0e11"}.mdi-bag-personal-off-outline:before{content:"\f0e12"}.mdi-bag-personal-outline:before{content:"\f0e13"}.mdi-bag-personal-plus:before{content:"\f1ca4"}.mdi-bag-personal-plus-outline:before{content:"\f1ca5"}.mdi-bag-personal-tag:before{content:"\f1b0c"}.mdi-bag-personal-tag-outline:before{content:"\f1b0d"}.mdi-bag-suitcase:before{content:"\f158b"}.mdi-bag-suitcase-off:before{content:"\f158d"}.mdi-bag-suitcase-off-outline:before{content:"\f158e"}.mdi-bag-suitcase-outline:before{content:"\f158c"}.mdi-baguette:before{content:"\f0f3e"}.mdi-balcony:before{content:"\f1817"}.mdi-balloon:before{content:"\f0a26"}.mdi-ballot:before{content:"\f09c9"}.mdi-ballot-outline:before{content:"\f09ca"}.mdi-ballot-recount:before{content:"\f0c39"}.mdi-ballot-recount-outline:before{content:"\f0c3a"}.mdi-bandage:before{content:"\f0daf"}.mdi-bank:before{content:"\f0070"}.mdi-bank-check:before{content:"\f1655"}.mdi-bank-circle:before{content:"\f1c03"}.mdi-bank-circle-outline:before{content:"\f1c04"}.mdi-bank-minus:before{content:"\f0db0"}.mdi-bank-off:before{content:"\f1656"}.mdi-bank-off-outline:before{content:"\f1657"}.mdi-bank-outline:before{content:"\f0e80"}.mdi-bank-plus:before{content:"\f0db1"}.mdi-bank-remove:before{content:"\f0db2"}.mdi-bank-transfer:before{content:"\f0a27"}.mdi-bank-transfer-in:before{content:"\f0a28"}.mdi-bank-transfer-out:before{content:"\f0a29"}.mdi-barcode:before{content:"\f0071"}.mdi-barcode-off:before{content:"\f1236"}.mdi-barcode-scan:before{content:"\f0072"}.mdi-barley:before{content:"\f0073"}.mdi-barley-off:before{content:"\f0b5d"}.mdi-barn:before{content:"\f0b5e"}.mdi-barrel:before{content:"\f0074"}.mdi-barrel-outline:before{content:"\f1a28"}.mdi-baseball:before{content:"\f0852"}.mdi-baseball-bat:before{content:"\f0853"}.mdi-baseball-diamond:before{content:"\f15ec"}.mdi-baseball-diamond-outline:before{content:"\f15ed"}.mdi-baseball-outline:before{content:"\f1c5a"}.mdi-bash:before{content:"\f1183"}.mdi-basket:before{content:"\f0076"}.mdi-basket-check:before{content:"\f18e5"}.mdi-basket-check-outline:before{content:"\f18e6"}.mdi-basket-fill:before{content:"\f0077"}.mdi-basket-minus:before{content:"\f1523"}.mdi-basket-minus-outline:before{content:"\f1524"}.mdi-basket-off:before{content:"\f1525"}.mdi-basket-off-outline:before{content:"\f1526"}.mdi-basket-outline:before{content:"\f1181"}.mdi-basket-plus:before{content:"\f1527"}.mdi-basket-plus-outline:before{content:"\f1528"}.mdi-basket-remove:before{content:"\f1529"}.mdi-basket-remove-outline:before{content:"\f152a"}.mdi-basket-unfill:before{content:"\f0078"}.mdi-basketball:before{content:"\f0806"}.mdi-basketball-hoop:before{content:"\f0c3b"}.mdi-basketball-hoop-outline:before{content:"\f0c3c"}.mdi-bat:before{content:"\f0b5f"}.mdi-bathtub:before{content:"\f1818"}.mdi-bathtub-outline:before{content:"\f1819"}.mdi-battery:before{content:"\f0079"}.mdi-battery-10:before{content:"\f007a"}.mdi-battery-10-bluetooth:before{content:"\f093e"}.mdi-battery-20:before{content:"\f007b"}.mdi-battery-20-bluetooth:before{content:"\f093f"}.mdi-battery-30:before{content:"\f007c"}.mdi-battery-30-bluetooth:before{content:"\f0940"}.mdi-battery-40:before{content:"\f007d"}.mdi-battery-40-bluetooth:before{content:"\f0941"}.mdi-battery-50:before{content:"\f007e"}.mdi-battery-50-bluetooth:before{content:"\f0942"}.mdi-battery-60:before{content:"\f007f"}.mdi-battery-60-bluetooth:before{content:"\f0943"}.mdi-battery-70:before{content:"\f0080"}.mdi-battery-70-bluetooth:before{content:"\f0944"}.mdi-battery-80:before{content:"\f0081"}.mdi-battery-80-bluetooth:before{content:"\f0945"}.mdi-battery-90:before{content:"\f0082"}.mdi-battery-90-bluetooth:before{content:"\f0946"}.mdi-battery-alert:before{content:"\f0083"}.mdi-battery-alert-bluetooth:before{content:"\f0947"}.mdi-battery-alert-variant:before{content:"\f10cc"}.mdi-battery-alert-variant-outline:before{content:"\f10cd"}.mdi-battery-arrow-down:before{content:"\f17de"}.mdi-battery-arrow-down-outline:before{content:"\f17df"}.mdi-battery-arrow-up:before{content:"\f17e0"}.mdi-battery-arrow-up-outline:before{content:"\f17e1"}.mdi-battery-bluetooth:before{content:"\f0948"}.mdi-battery-bluetooth-variant:before{content:"\f0949"}.mdi-battery-charging:before{content:"\f0084"}.mdi-battery-charging-10:before{content:"\f089c"}.mdi-battery-charging-100:before{content:"\f0085"}.mdi-battery-charging-20:before{content:"\f0086"}.mdi-battery-charging-30:before{content:"\f0087"}.mdi-battery-charging-40:before{content:"\f0088"}.mdi-battery-charging-50:before{content:"\f089d"}.mdi-battery-charging-60:before{content:"\f0089"}.mdi-battery-charging-70:before{content:"\f089e"}.mdi-battery-charging-80:before{content:"\f008a"}.mdi-battery-charging-90:before{content:"\f008b"}.mdi-battery-charging-high:before{content:"\f12a6"}.mdi-battery-charging-low:before{content:"\f12a4"}.mdi-battery-charging-medium:before{content:"\f12a5"}.mdi-battery-charging-outline:before{content:"\f089f"}.mdi-battery-charging-wireless:before{content:"\f0807"}.mdi-battery-charging-wireless-10:before{content:"\f0808"}.mdi-battery-charging-wireless-20:before{content:"\f0809"}.mdi-battery-charging-wireless-30:before{content:"\f080a"}.mdi-battery-charging-wireless-40:before{content:"\f080b"}.mdi-battery-charging-wireless-50:before{content:"\f080c"}.mdi-battery-charging-wireless-60:before{content:"\f080d"}.mdi-battery-charging-wireless-70:before{content:"\f080e"}.mdi-battery-charging-wireless-80:before{content:"\f080f"}.mdi-battery-charging-wireless-90:before{content:"\f0810"}.mdi-battery-charging-wireless-alert:before{content:"\f0811"}.mdi-battery-charging-wireless-outline:before{content:"\f0812"}.mdi-battery-check:before{content:"\f17e2"}.mdi-battery-check-outline:before{content:"\f17e3"}.mdi-battery-clock:before{content:"\f19e5"}.mdi-battery-clock-outline:before{content:"\f19e6"}.mdi-battery-heart:before{content:"\f120f"}.mdi-battery-heart-outline:before{content:"\f1210"}.mdi-battery-heart-variant:before{content:"\f1211"}.mdi-battery-high:before{content:"\f12a3"}.mdi-battery-lock:before{content:"\f179c"}.mdi-battery-lock-open:before{content:"\f179d"}.mdi-battery-low:before{content:"\f12a1"}.mdi-battery-medium:before{content:"\f12a2"}.mdi-battery-minus:before{content:"\f17e4"}.mdi-battery-minus-outline:before{content:"\f17e5"}.mdi-battery-minus-variant:before{content:"\f008c"}.mdi-battery-negative:before{content:"\f008d"}.mdi-battery-off:before{content:"\f125d"}.mdi-battery-off-outline:before{content:"\f125e"}.mdi-battery-outline:before{content:"\f008e"}.mdi-battery-plus:before{content:"\f17e6"}.mdi-battery-plus-outline:before{content:"\f17e7"}.mdi-battery-plus-variant:before{content:"\f008f"}.mdi-battery-positive:before{content:"\f0090"}.mdi-battery-remove:before{content:"\f17e8"}.mdi-battery-remove-outline:before{content:"\f17e9"}.mdi-battery-sync:before{content:"\f1834"}.mdi-battery-sync-outline:before{content:"\f1835"}.mdi-battery-unknown:before{content:"\f0091"}.mdi-battery-unknown-bluetooth:before{content:"\f094a"}.mdi-beach:before{content:"\f0092"}.mdi-beaker:before{content:"\f0cea"}.mdi-beaker-alert:before{content:"\f1229"}.mdi-beaker-alert-outline:before{content:"\f122a"}.mdi-beaker-check:before{content:"\f122b"}.mdi-beaker-check-outline:before{content:"\f122c"}.mdi-beaker-minus:before{content:"\f122d"}.mdi-beaker-minus-outline:before{content:"\f122e"}.mdi-beaker-outline:before{content:"\f0690"}.mdi-beaker-plus:before{content:"\f122f"}.mdi-beaker-plus-outline:before{content:"\f1230"}.mdi-beaker-question:before{content:"\f1231"}.mdi-beaker-question-outline:before{content:"\f1232"}.mdi-beaker-remove:before{content:"\f1233"}.mdi-beaker-remove-outline:before{content:"\f1234"}.mdi-bed:before{content:"\f02e3"}.mdi-bed-clock:before{content:"\f1b94"}.mdi-bed-double:before{content:"\f0fd4"}.mdi-bed-double-outline:before{content:"\f0fd3"}.mdi-bed-empty:before{content:"\f08a0"}.mdi-bed-king:before{content:"\f0fd2"}.mdi-bed-king-outline:before{content:"\f0fd1"}.mdi-bed-outline:before{content:"\f0099"}.mdi-bed-queen:before{content:"\f0fd0"}.mdi-bed-queen-outline:before{content:"\f0fdb"}.mdi-bed-single:before{content:"\f106d"}.mdi-bed-single-outline:before{content:"\f106e"}.mdi-bee:before{content:"\f0fa1"}.mdi-bee-flower:before{content:"\f0fa2"}.mdi-beehive-off-outline:before{content:"\f13ed"}.mdi-beehive-outline:before{content:"\f10ce"}.mdi-beekeeper:before{content:"\f14e2"}.mdi-beer:before{content:"\f0098"}.mdi-beer-outline:before{content:"\f130c"}.mdi-bell:before{content:"\f009a"}.mdi-bell-alert:before{content:"\f0d59"}.mdi-bell-alert-outline:before{content:"\f0e81"}.mdi-bell-badge:before{content:"\f116b"}.mdi-bell-badge-outline:before{content:"\f0178"}.mdi-bell-cancel:before{content:"\f13e7"}.mdi-bell-cancel-outline:before{content:"\f13e8"}.mdi-bell-check:before{content:"\f11e5"}.mdi-bell-check-outline:before{content:"\f11e6"}.mdi-bell-circle:before{content:"\f0d5a"}.mdi-bell-circle-outline:before{content:"\f0d5b"}.mdi-bell-cog:before{content:"\f1a29"}.mdi-bell-cog-outline:before{content:"\f1a2a"}.mdi-bell-minus:before{content:"\f13e9"}.mdi-bell-minus-outline:before{content:"\f13ea"}.mdi-bell-off:before{content:"\f009b"}.mdi-bell-off-outline:before{content:"\f0a91"}.mdi-bell-outline:before{content:"\f009c"}.mdi-bell-plus:before{content:"\f009d"}.mdi-bell-plus-outline:before{content:"\f0a92"}.mdi-bell-remove:before{content:"\f13eb"}.mdi-bell-remove-outline:before{content:"\f13ec"}.mdi-bell-ring:before{content:"\f009e"}.mdi-bell-ring-outline:before{content:"\f009f"}.mdi-bell-sleep:before{content:"\f00a0"}.mdi-bell-sleep-outline:before{content:"\f0a93"}.mdi-bench:before{content:"\f1c21"}.mdi-bench-back:before{content:"\f1c22"}.mdi-beta:before{content:"\f00a1"}.mdi-betamax:before{content:"\f09cb"}.mdi-biathlon:before{content:"\f0e14"}.mdi-bicycle:before{content:"\f109c"}.mdi-bicycle-basket:before{content:"\f1235"}.mdi-bicycle-cargo:before{content:"\f189c"}.mdi-bicycle-electric:before{content:"\f15b4"}.mdi-bicycle-penny-farthing:before{content:"\f15e9"}.mdi-bike:before{content:"\f00a3"}.mdi-bike-fast:before{content:"\f111f"}.mdi-bike-pedal:before{content:"\f1c23"}.mdi-bike-pedal-clipless:before{content:"\f1c24"}.mdi-bike-pedal-mountain:before{content:"\f1c25"}.mdi-billboard:before{content:"\f1010"}.mdi-billiards:before{content:"\f0b61"}.mdi-billiards-rack:before{content:"\f0b62"}.mdi-binoculars:before{content:"\f00a5"}.mdi-bio:before{content:"\f00a6"}.mdi-biohazard:before{content:"\f00a7"}.mdi-bird:before{content:"\f15c6"}.mdi-bitbucket:before{content:"\f00a8"}.mdi-bitcoin:before{content:"\f0813"}.mdi-black-mesa:before{content:"\f00a9"}.mdi-blender:before{content:"\f0ceb"}.mdi-blender-outline:before{content:"\f181a"}.mdi-blender-software:before{content:"\f00ab"}.mdi-blinds:before{content:"\f00ac"}.mdi-blinds-horizontal:before{content:"\f1a2b"}.mdi-blinds-horizontal-closed:before{content:"\f1a2c"}.mdi-blinds-open:before{content:"\f1011"}.mdi-blinds-vertical:before{content:"\f1a2d"}.mdi-blinds-vertical-closed:before{content:"\f1a2e"}.mdi-block-helper:before{content:"\f00ad"}.mdi-blood-bag:before{content:"\f0cec"}.mdi-bluetooth:before{content:"\f00af"}.mdi-bluetooth-audio:before{content:"\f00b0"}.mdi-bluetooth-connect:before{content:"\f00b1"}.mdi-bluetooth-off:before{content:"\f00b2"}.mdi-bluetooth-settings:before{content:"\f00b3"}.mdi-bluetooth-transfer:before{content:"\f00b4"}.mdi-blur:before{content:"\f00b5"}.mdi-blur-linear:before{content:"\f00b6"}.mdi-blur-off:before{content:"\f00b7"}.mdi-blur-radial:before{content:"\f00b8"}.mdi-bolt:before{content:"\f0db3"}.mdi-bomb:before{content:"\f0691"}.mdi-bomb-off:before{content:"\f06c5"}.mdi-bone:before{content:"\f00b9"}.mdi-bone-off:before{content:"\f19e0"}.mdi-book:before{content:"\f00ba"}.mdi-book-account:before{content:"\f13ad"}.mdi-book-account-outline:before{content:"\f13ae"}.mdi-book-alert:before{content:"\f167c"}.mdi-book-alert-outline:before{content:"\f167d"}.mdi-book-alphabet:before{content:"\f061d"}.mdi-book-arrow-down:before{content:"\f167e"}.mdi-book-arrow-down-outline:before{content:"\f167f"}.mdi-book-arrow-left:before{content:"\f1680"}.mdi-book-arrow-left-outline:before{content:"\f1681"}.mdi-book-arrow-right:before{content:"\f1682"}.mdi-book-arrow-right-outline:before{content:"\f1683"}.mdi-book-arrow-up:before{content:"\f1684"}.mdi-book-arrow-up-outline:before{content:"\f1685"}.mdi-book-cancel:before{content:"\f1686"}.mdi-book-cancel-outline:before{content:"\f1687"}.mdi-book-check:before{content:"\f14f3"}.mdi-book-check-outline:before{content:"\f14f4"}.mdi-book-clock:before{content:"\f1688"}.mdi-book-clock-outline:before{content:"\f1689"}.mdi-book-cog:before{content:"\f168a"}.mdi-book-cog-outline:before{content:"\f168b"}.mdi-book-cross:before{content:"\f00a2"}.mdi-book-edit:before{content:"\f168c"}.mdi-book-edit-outline:before{content:"\f168d"}.mdi-book-education:before{content:"\f16c9"}.mdi-book-education-outline:before{content:"\f16ca"}.mdi-book-heart:before{content:"\f1a1d"}.mdi-book-heart-outline:before{content:"\f1a1e"}.mdi-book-information-variant:before{content:"\f106f"}.mdi-book-lock:before{content:"\f079a"}.mdi-book-lock-open:before{content:"\f079b"}.mdi-book-lock-open-outline:before{content:"\f168e"}.mdi-book-lock-outline:before{content:"\f168f"}.mdi-book-marker:before{content:"\f1690"}.mdi-book-marker-outline:before{content:"\f1691"}.mdi-book-minus:before{content:"\f05d9"}.mdi-book-minus-multiple:before{content:"\f0a94"}.mdi-book-minus-multiple-outline:before{content:"\f090b"}.mdi-book-minus-outline:before{content:"\f1692"}.mdi-book-multiple:before{content:"\f00bb"}.mdi-book-multiple-outline:before{content:"\f0436"}.mdi-book-music:before{content:"\f0067"}.mdi-book-music-outline:before{content:"\f1693"}.mdi-book-off:before{content:"\f1694"}.mdi-book-off-outline:before{content:"\f1695"}.mdi-book-open:before{content:"\f00bd"}.mdi-book-open-blank-variant:before{content:"\f00be"}.mdi-book-open-blank-variant-outline:before{content:"\f1ccb"}.mdi-book-open-outline:before{content:"\f0b63"}.mdi-book-open-page-variant:before{content:"\f05da"}.mdi-book-open-page-variant-outline:before{content:"\f15d6"}.mdi-book-open-variant:before{content:"\f14f7"}.mdi-book-open-variant-outline:before{content:"\f1ccc"}.mdi-book-outline:before{content:"\f0b64"}.mdi-book-play:before{content:"\f0e82"}.mdi-book-play-outline:before{content:"\f0e83"}.mdi-book-plus:before{content:"\f05db"}.mdi-book-plus-multiple:before{content:"\f0a95"}.mdi-book-plus-multiple-outline:before{content:"\f0ade"}.mdi-book-plus-outline:before{content:"\f1696"}.mdi-book-refresh:before{content:"\f1697"}.mdi-book-refresh-outline:before{content:"\f1698"}.mdi-book-remove:before{content:"\f0a97"}.mdi-book-remove-multiple:before{content:"\f0a96"}.mdi-book-remove-multiple-outline:before{content:"\f04ca"}.mdi-book-remove-outline:before{content:"\f1699"}.mdi-book-search:before{content:"\f0e84"}.mdi-book-search-outline:before{content:"\f0e85"}.mdi-book-settings:before{content:"\f169a"}.mdi-book-settings-outline:before{content:"\f169b"}.mdi-book-sync:before{content:"\f169c"}.mdi-book-sync-outline:before{content:"\f16c8"}.mdi-book-variant:before{content:"\f00bf"}.mdi-bookmark:before{content:"\f00c0"}.mdi-bookmark-box:before{content:"\f1b75"}.mdi-bookmark-box-multiple:before{content:"\f196c"}.mdi-bookmark-box-multiple-outline:before{content:"\f196d"}.mdi-bookmark-box-outline:before{content:"\f1b76"}.mdi-bookmark-check:before{content:"\f00c1"}.mdi-bookmark-check-outline:before{content:"\f137b"}.mdi-bookmark-minus:before{content:"\f09cc"}.mdi-bookmark-minus-outline:before{content:"\f09cd"}.mdi-bookmark-multiple:before{content:"\f0e15"}.mdi-bookmark-multiple-outline:before{content:"\f0e16"}.mdi-bookmark-music:before{content:"\f00c2"}.mdi-bookmark-music-outline:before{content:"\f1379"}.mdi-bookmark-off:before{content:"\f09ce"}.mdi-bookmark-off-outline:before{content:"\f09cf"}.mdi-bookmark-outline:before{content:"\f00c3"}.mdi-bookmark-plus:before{content:"\f00c5"}.mdi-bookmark-plus-outline:before{content:"\f00c4"}.mdi-bookmark-remove:before{content:"\f00c6"}.mdi-bookmark-remove-outline:before{content:"\f137a"}.mdi-bookshelf:before{content:"\f125f"}.mdi-boom-gate:before{content:"\f0e86"}.mdi-boom-gate-alert:before{content:"\f0e87"}.mdi-boom-gate-alert-outline:before{content:"\f0e88"}.mdi-boom-gate-arrow-down:before{content:"\f0e89"}.mdi-boom-gate-arrow-down-outline:before{content:"\f0e8a"}.mdi-boom-gate-arrow-up:before{content:"\f0e8c"}.mdi-boom-gate-arrow-up-outline:before{content:"\f0e8d"}.mdi-boom-gate-outline:before{content:"\f0e8b"}.mdi-boom-gate-up:before{content:"\f17f9"}.mdi-boom-gate-up-outline:before{content:"\f17fa"}.mdi-boombox:before{content:"\f05dc"}.mdi-boomerang:before{content:"\f10cf"}.mdi-bootstrap:before{content:"\f06c6"}.mdi-border-all:before{content:"\f00c7"}.mdi-border-all-variant:before{content:"\f08a1"}.mdi-border-bottom:before{content:"\f00c8"}.mdi-border-bottom-variant:before{content:"\f08a2"}.mdi-border-color:before{content:"\f00c9"}.mdi-border-horizontal:before{content:"\f00ca"}.mdi-border-inside:before{content:"\f00cb"}.mdi-border-left:before{content:"\f00cc"}.mdi-border-left-variant:before{content:"\f08a3"}.mdi-border-none:before{content:"\f00cd"}.mdi-border-none-variant:before{content:"\f08a4"}.mdi-border-outside:before{content:"\f00ce"}.mdi-border-radius:before{content:"\f1af4"}.mdi-border-right:before{content:"\f00cf"}.mdi-border-right-variant:before{content:"\f08a5"}.mdi-border-style:before{content:"\f00d0"}.mdi-border-top:before{content:"\f00d1"}.mdi-border-top-variant:before{content:"\f08a6"}.mdi-border-vertical:before{content:"\f00d2"}.mdi-bottle-soda:before{content:"\f1070"}.mdi-bottle-soda-classic:before{content:"\f1071"}.mdi-bottle-soda-classic-outline:before{content:"\f1363"}.mdi-bottle-soda-outline:before{content:"\f1072"}.mdi-bottle-tonic:before{content:"\f112e"}.mdi-bottle-tonic-outline:before{content:"\f112f"}.mdi-bottle-tonic-plus:before{content:"\f1130"}.mdi-bottle-tonic-plus-outline:before{content:"\f1131"}.mdi-bottle-tonic-skull:before{content:"\f1132"}.mdi-bottle-tonic-skull-outline:before{content:"\f1133"}.mdi-bottle-wine:before{content:"\f0854"}.mdi-bottle-wine-outline:before{content:"\f1310"}.mdi-bow-arrow:before{content:"\f1841"}.mdi-bow-tie:before{content:"\f0678"}.mdi-bowl:before{content:"\f028e"}.mdi-bowl-mix:before{content:"\f0617"}.mdi-bowl-mix-outline:before{content:"\f02e4"}.mdi-bowl-outline:before{content:"\f02a9"}.mdi-bowling:before{content:"\f00d3"}.mdi-box:before{content:"\f00d4"}.mdi-box-cutter:before{content:"\f00d5"}.mdi-box-cutter-off:before{content:"\f0b4a"}.mdi-box-shadow:before{content:"\f0637"}.mdi-boxing-glove:before{content:"\f0b65"}.mdi-braille:before{content:"\f09d0"}.mdi-brain:before{content:"\f09d1"}.mdi-bread-slice:before{content:"\f0cee"}.mdi-bread-slice-outline:before{content:"\f0cef"}.mdi-bridge:before{content:"\f0618"}.mdi-briefcase:before{content:"\f00d6"}.mdi-briefcase-account:before{content:"\f0cf0"}.mdi-briefcase-account-outline:before{content:"\f0cf1"}.mdi-briefcase-arrow-left-right:before{content:"\f1a8d"}.mdi-briefcase-arrow-left-right-outline:before{content:"\f1a8e"}.mdi-briefcase-arrow-up-down:before{content:"\f1a8f"}.mdi-briefcase-arrow-up-down-outline:before{content:"\f1a90"}.mdi-briefcase-check:before{content:"\f00d7"}.mdi-briefcase-check-outline:before{content:"\f131e"}.mdi-briefcase-clock:before{content:"\f10d0"}.mdi-briefcase-clock-outline:before{content:"\f10d1"}.mdi-briefcase-download:before{content:"\f00d8"}.mdi-briefcase-download-outline:before{content:"\f0c3d"}.mdi-briefcase-edit:before{content:"\f0a98"}.mdi-briefcase-edit-outline:before{content:"\f0c3e"}.mdi-briefcase-eye:before{content:"\f17d9"}.mdi-briefcase-eye-outline:before{content:"\f17da"}.mdi-briefcase-minus:before{content:"\f0a2a"}.mdi-briefcase-minus-outline:before{content:"\f0c3f"}.mdi-briefcase-off:before{content:"\f1658"}.mdi-briefcase-off-outline:before{content:"\f1659"}.mdi-briefcase-outline:before{content:"\f0814"}.mdi-briefcase-plus:before{content:"\f0a2b"}.mdi-briefcase-plus-outline:before{content:"\f0c40"}.mdi-briefcase-remove:before{content:"\f0a2c"}.mdi-briefcase-remove-outline:before{content:"\f0c41"}.mdi-briefcase-search:before{content:"\f0a2d"}.mdi-briefcase-search-outline:before{content:"\f0c42"}.mdi-briefcase-upload:before{content:"\f00d9"}.mdi-briefcase-upload-outline:before{content:"\f0c43"}.mdi-briefcase-variant:before{content:"\f1494"}.mdi-briefcase-variant-off:before{content:"\f165a"}.mdi-briefcase-variant-off-outline:before{content:"\f165b"}.mdi-briefcase-variant-outline:before{content:"\f1495"}.mdi-brightness-1:before{content:"\f00da"}.mdi-brightness-2:before{content:"\f00db"}.mdi-brightness-3:before{content:"\f00dc"}.mdi-brightness-4:before{content:"\f00dd"}.mdi-brightness-5:before{content:"\f00de"}.mdi-brightness-6:before{content:"\f00df"}.mdi-brightness-7:before{content:"\f00e0"}.mdi-brightness-auto:before{content:"\f00e1"}.mdi-brightness-percent:before{content:"\f0cf2"}.mdi-broadcast:before{content:"\f1720"}.mdi-broadcast-off:before{content:"\f1721"}.mdi-broom:before{content:"\f00e2"}.mdi-brush:before{content:"\f00e3"}.mdi-brush-off:before{content:"\f1771"}.mdi-brush-outline:before{content:"\f1a0d"}.mdi-brush-variant:before{content:"\f1813"}.mdi-bucket:before{content:"\f1415"}.mdi-bucket-outline:before{content:"\f1416"}.mdi-buffet:before{content:"\f0578"}.mdi-bug:before{content:"\f00e4"}.mdi-bug-check:before{content:"\f0a2e"}.mdi-bug-check-outline:before{content:"\f0a2f"}.mdi-bug-outline:before{content:"\f0a30"}.mdi-bug-pause:before{content:"\f1af5"}.mdi-bug-pause-outline:before{content:"\f1af6"}.mdi-bug-play:before{content:"\f1af7"}.mdi-bug-play-outline:before{content:"\f1af8"}.mdi-bug-stop:before{content:"\f1af9"}.mdi-bug-stop-outline:before{content:"\f1afa"}.mdi-bugle:before{content:"\f0db4"}.mdi-bulkhead-light:before{content:"\f1a2f"}.mdi-bulldozer:before{content:"\f0b22"}.mdi-bullet:before{content:"\f0cf3"}.mdi-bulletin-board:before{content:"\f00e5"}.mdi-bullhorn:before{content:"\f00e6"}.mdi-bullhorn-outline:before{content:"\f0b23"}.mdi-bullhorn-variant:before{content:"\f196e"}.mdi-bullhorn-variant-outline:before{content:"\f196f"}.mdi-bullseye:before{content:"\f05dd"}.mdi-bullseye-arrow:before{content:"\f08c9"}.mdi-bulma:before{content:"\f12e7"}.mdi-bunk-bed:before{content:"\f1302"}.mdi-bunk-bed-outline:before{content:"\f0097"}.mdi-bus:before{content:"\f00e7"}.mdi-bus-alert:before{content:"\f0a99"}.mdi-bus-articulated-end:before{content:"\f079c"}.mdi-bus-articulated-front:before{content:"\f079d"}.mdi-bus-clock:before{content:"\f08ca"}.mdi-bus-double-decker:before{content:"\f079e"}.mdi-bus-electric:before{content:"\f191d"}.mdi-bus-marker:before{content:"\f1212"}.mdi-bus-multiple:before{content:"\f0f3f"}.mdi-bus-school:before{content:"\f079f"}.mdi-bus-side:before{content:"\f07a0"}.mdi-bus-sign:before{content:"\f1cc1"}.mdi-bus-stop:before{content:"\f1012"}.mdi-bus-stop-covered:before{content:"\f1013"}.mdi-bus-stop-uncovered:before{content:"\f1014"}.mdi-bus-wrench:before{content:"\f1cc2"}.mdi-butterfly:before{content:"\f1589"}.mdi-butterfly-outline:before{content:"\f158a"}.mdi-button-cursor:before{content:"\f1b4f"}.mdi-button-pointer:before{content:"\f1b50"}.mdi-cabin-a-frame:before{content:"\f188c"}.mdi-cable-data:before{content:"\f1394"}.mdi-cached:before{content:"\f00e8"}.mdi-cactus:before{content:"\f0db5"}.mdi-cake:before{content:"\f00e9"}.mdi-cake-layered:before{content:"\f00ea"}.mdi-cake-variant:before{content:"\f00eb"}.mdi-cake-variant-outline:before{content:"\f17f0"}.mdi-calculator:before{content:"\f00ec"}.mdi-calculator-variant:before{content:"\f0a9a"}.mdi-calculator-variant-outline:before{content:"\f15a6"}.mdi-calendar:before{content:"\f00ed"}.mdi-calendar-account:before{content:"\f0ed7"}.mdi-calendar-account-outline:before{content:"\f0ed8"}.mdi-calendar-alert:before{content:"\f0a31"}.mdi-calendar-alert-outline:before{content:"\f1b62"}.mdi-calendar-arrow-left:before{content:"\f1134"}.mdi-calendar-arrow-right:before{content:"\f1135"}.mdi-calendar-badge:before{content:"\f1b9d"}.mdi-calendar-badge-outline:before{content:"\f1b9e"}.mdi-calendar-blank:before{content:"\f00ee"}.mdi-calendar-blank-multiple:before{content:"\f1073"}.mdi-calendar-blank-outline:before{content:"\f0b66"}.mdi-calendar-check:before{content:"\f00ef"}.mdi-calendar-check-outline:before{content:"\f0c44"}.mdi-calendar-clock:before{content:"\f00f0"}.mdi-calendar-clock-outline:before{content:"\f16e1"}.mdi-calendar-collapse-horizontal:before{content:"\f189d"}.mdi-calendar-collapse-horizontal-outline:before{content:"\f1b63"}.mdi-calendar-cursor:before{content:"\f157b"}.mdi-calendar-cursor-outline:before{content:"\f1b64"}.mdi-calendar-edit:before{content:"\f08a7"}.mdi-calendar-edit-outline:before{content:"\f1b65"}.mdi-calendar-end:before{content:"\f166c"}.mdi-calendar-end-outline:before{content:"\f1b66"}.mdi-calendar-expand-horizontal:before{content:"\f189e"}.mdi-calendar-expand-horizontal-outline:before{content:"\f1b67"}.mdi-calendar-export:before{content:"\f0b24"}.mdi-calendar-export-outline:before{content:"\f1b68"}.mdi-calendar-filter:before{content:"\f1a32"}.mdi-calendar-filter-outline:before{content:"\f1a33"}.mdi-calendar-heart:before{content:"\f09d2"}.mdi-calendar-heart-outline:before{content:"\f1b69"}.mdi-calendar-import:before{content:"\f0b25"}.mdi-calendar-import-outline:before{content:"\f1b6a"}.mdi-calendar-lock:before{content:"\f1641"}.mdi-calendar-lock-open:before{content:"\f1b5b"}.mdi-calendar-lock-open-outline:before{content:"\f1b5c"}.mdi-calendar-lock-outline:before{content:"\f1642"}.mdi-calendar-minus:before{content:"\f0d5c"}.mdi-calendar-minus-outline:before{content:"\f1b6b"}.mdi-calendar-month:before{content:"\f0e17"}.mdi-calendar-month-outline:before{content:"\f0e18"}.mdi-calendar-multiple:before{content:"\f00f1"}.mdi-calendar-multiple-check:before{content:"\f00f2"}.mdi-calendar-multiselect:before{content:"\f0a32"}.mdi-calendar-multiselect-outline:before{content:"\f1b55"}.mdi-calendar-outline:before{content:"\f0b67"}.mdi-calendar-plus:before{content:"\f00f3"}.mdi-calendar-plus-outline:before{content:"\f1b6c"}.mdi-calendar-question:before{content:"\f0692"}.mdi-calendar-question-outline:before{content:"\f1b6d"}.mdi-calendar-range:before{content:"\f0679"}.mdi-calendar-range-outline:before{content:"\f0b68"}.mdi-calendar-refresh:before{content:"\f01e1"}.mdi-calendar-refresh-outline:before{content:"\f0203"}.mdi-calendar-remove:before{content:"\f00f4"}.mdi-calendar-remove-outline:before{content:"\f0c45"}.mdi-calendar-search:before{content:"\f094c"}.mdi-calendar-search-outline:before{content:"\f1b6e"}.mdi-calendar-star:before{content:"\f09d3"}.mdi-calendar-star-four-points:before{content:"\f1c1f"}.mdi-calendar-star-outline:before{content:"\f1b53"}.mdi-calendar-start:before{content:"\f166d"}.mdi-calendar-start-outline:before{content:"\f1b6f"}.mdi-calendar-sync:before{content:"\f0e8e"}.mdi-calendar-sync-outline:before{content:"\f0e8f"}.mdi-calendar-text:before{content:"\f00f5"}.mdi-calendar-text-outline:before{content:"\f0c46"}.mdi-calendar-today:before{content:"\f00f6"}.mdi-calendar-today-outline:before{content:"\f1a30"}.mdi-calendar-week:before{content:"\f0a33"}.mdi-calendar-week-begin:before{content:"\f0a34"}.mdi-calendar-week-begin-outline:before{content:"\f1a31"}.mdi-calendar-week-outline:before{content:"\f1a34"}.mdi-calendar-weekend:before{content:"\f0ed9"}.mdi-calendar-weekend-outline:before{content:"\f0eda"}.mdi-call-made:before{content:"\f00f7"}.mdi-call-merge:before{content:"\f00f8"}.mdi-call-missed:before{content:"\f00f9"}.mdi-call-received:before{content:"\f00fa"}.mdi-call-split:before{content:"\f00fb"}.mdi-camcorder:before{content:"\f00fc"}.mdi-camcorder-off:before{content:"\f00ff"}.mdi-camera:before{content:"\f0100"}.mdi-camera-account:before{content:"\f08cb"}.mdi-camera-burst:before{content:"\f0693"}.mdi-camera-control:before{content:"\f0b69"}.mdi-camera-document:before{content:"\f1871"}.mdi-camera-document-off:before{content:"\f1872"}.mdi-camera-enhance:before{content:"\f0101"}.mdi-camera-enhance-outline:before{content:"\f0b6a"}.mdi-camera-flip:before{content:"\f15d9"}.mdi-camera-flip-outline:before{content:"\f15da"}.mdi-camera-front:before{content:"\f0102"}.mdi-camera-front-variant:before{content:"\f0103"}.mdi-camera-gopro:before{content:"\f07a1"}.mdi-camera-image:before{content:"\f08cc"}.mdi-camera-iris:before{content:"\f0104"}.mdi-camera-lock:before{content:"\f1a14"}.mdi-camera-lock-open:before{content:"\f1c0d"}.mdi-camera-lock-open-outline:before{content:"\f1c0e"}.mdi-camera-lock-outline:before{content:"\f1a15"}.mdi-camera-marker:before{content:"\f19a7"}.mdi-camera-marker-outline:before{content:"\f19a8"}.mdi-camera-metering-center:before{content:"\f07a2"}.mdi-camera-metering-matrix:before{content:"\f07a3"}.mdi-camera-metering-partial:before{content:"\f07a4"}.mdi-camera-metering-spot:before{content:"\f07a5"}.mdi-camera-off:before{content:"\f05df"}.mdi-camera-off-outline:before{content:"\f19bf"}.mdi-camera-outline:before{content:"\f0d5d"}.mdi-camera-party-mode:before{content:"\f0105"}.mdi-camera-plus:before{content:"\f0edb"}.mdi-camera-plus-outline:before{content:"\f0edc"}.mdi-camera-rear:before{content:"\f0106"}.mdi-camera-rear-variant:before{content:"\f0107"}.mdi-camera-retake:before{content:"\f0e19"}.mdi-camera-retake-outline:before{content:"\f0e1a"}.mdi-camera-switch:before{content:"\f0108"}.mdi-camera-switch-outline:before{content:"\f084a"}.mdi-camera-timer:before{content:"\f0109"}.mdi-camera-wireless:before{content:"\f0db6"}.mdi-camera-wireless-outline:before{content:"\f0db7"}.mdi-campfire:before{content:"\f0edd"}.mdi-cancel:before{content:"\f073a"}.mdi-candelabra:before{content:"\f17d2"}.mdi-candelabra-fire:before{content:"\f17d3"}.mdi-candle:before{content:"\f05e2"}.mdi-candy:before{content:"\f1970"}.mdi-candy-off:before{content:"\f1971"}.mdi-candy-off-outline:before{content:"\f1972"}.mdi-candy-outline:before{content:"\f1973"}.mdi-candycane:before{content:"\f010a"}.mdi-cannabis:before{content:"\f07a6"}.mdi-cannabis-off:before{content:"\f166e"}.mdi-caps-lock:before{content:"\f0a9b"}.mdi-car:before{content:"\f010b"}.mdi-car-2-plus:before{content:"\f1015"}.mdi-car-3-plus:before{content:"\f1016"}.mdi-car-arrow-left:before{content:"\f13b2"}.mdi-car-arrow-right:before{content:"\f13b3"}.mdi-car-back:before{content:"\f0e1b"}.mdi-car-battery:before{content:"\f010c"}.mdi-car-brake-abs:before{content:"\f0c47"}.mdi-car-brake-alert:before{content:"\f0c48"}.mdi-car-brake-fluid-level:before{content:"\f1909"}.mdi-car-brake-hold:before{content:"\f0d5e"}.mdi-car-brake-low-pressure:before{content:"\f190a"}.mdi-car-brake-parking:before{content:"\f0d5f"}.mdi-car-brake-retarder:before{content:"\f1017"}.mdi-car-brake-temperature:before{content:"\f190b"}.mdi-car-brake-worn-linings:before{content:"\f190c"}.mdi-car-child-seat:before{content:"\f0fa3"}.mdi-car-clock:before{content:"\f1974"}.mdi-car-clutch:before{content:"\f1018"}.mdi-car-cog:before{content:"\f13cc"}.mdi-car-connected:before{content:"\f010d"}.mdi-car-convertible:before{content:"\f07a7"}.mdi-car-coolant-level:before{content:"\f1019"}.mdi-car-cruise-control:before{content:"\f0d60"}.mdi-car-defrost-front:before{content:"\f0d61"}.mdi-car-defrost-rear:before{content:"\f0d62"}.mdi-car-door:before{content:"\f0b6b"}.mdi-car-door-lock:before{content:"\f109d"}.mdi-car-door-lock-open:before{content:"\f1c81"}.mdi-car-electric:before{content:"\f0b6c"}.mdi-car-electric-outline:before{content:"\f15b5"}.mdi-car-emergency:before{content:"\f160f"}.mdi-car-esp:before{content:"\f0c49"}.mdi-car-estate:before{content:"\f07a8"}.mdi-car-hatchback:before{content:"\f07a9"}.mdi-car-info:before{content:"\f11be"}.mdi-car-key:before{content:"\f0b6d"}.mdi-car-lifted-pickup:before{content:"\f152d"}.mdi-car-light-alert:before{content:"\f190d"}.mdi-car-light-dimmed:before{content:"\f0c4a"}.mdi-car-light-fog:before{content:"\f0c4b"}.mdi-car-light-high:before{content:"\f0c4c"}.mdi-car-limousine:before{content:"\f08cd"}.mdi-car-multiple:before{content:"\f0b6e"}.mdi-car-off:before{content:"\f0e1c"}.mdi-car-outline:before{content:"\f14ed"}.mdi-car-parking-lights:before{content:"\f0d63"}.mdi-car-pickup:before{content:"\f07aa"}.mdi-car-search:before{content:"\f1b8d"}.mdi-car-search-outline:before{content:"\f1b8e"}.mdi-car-seat:before{content:"\f0fa4"}.mdi-car-seat-cooler:before{content:"\f0fa5"}.mdi-car-seat-heater:before{content:"\f0fa6"}.mdi-car-select:before{content:"\f1879"}.mdi-car-settings:before{content:"\f13cd"}.mdi-car-shift-pattern:before{content:"\f0f40"}.mdi-car-side:before{content:"\f07ab"}.mdi-car-speed-limiter:before{content:"\f190e"}.mdi-car-sports:before{content:"\f07ac"}.mdi-car-tire-alert:before{content:"\f0c4d"}.mdi-car-traction-control:before{content:"\f0d64"}.mdi-car-turbocharger:before{content:"\f101a"}.mdi-car-wash:before{content:"\f010e"}.mdi-car-windshield:before{content:"\f101b"}.mdi-car-windshield-outline:before{content:"\f101c"}.mdi-car-wireless:before{content:"\f1878"}.mdi-car-wrench:before{content:"\f1814"}.mdi-carabiner:before{content:"\f14c0"}.mdi-caravan:before{content:"\f07ad"}.mdi-card:before{content:"\f0b6f"}.mdi-card-account-details:before{content:"\f05d2"}.mdi-card-account-details-outline:before{content:"\f0dab"}.mdi-card-account-details-star:before{content:"\f02a3"}.mdi-card-account-details-star-outline:before{content:"\f06db"}.mdi-card-account-mail:before{content:"\f018e"}.mdi-card-account-mail-outline:before{content:"\f0e98"}.mdi-card-account-phone:before{content:"\f0e99"}.mdi-card-account-phone-outline:before{content:"\f0e9a"}.mdi-card-bulleted:before{content:"\f0b70"}.mdi-card-bulleted-off:before{content:"\f0b71"}.mdi-card-bulleted-off-outline:before{content:"\f0b72"}.mdi-card-bulleted-outline:before{content:"\f0b73"}.mdi-card-bulleted-settings:before{content:"\f0b74"}.mdi-card-bulleted-settings-outline:before{content:"\f0b75"}.mdi-card-minus:before{content:"\f1600"}.mdi-card-minus-outline:before{content:"\f1601"}.mdi-card-multiple:before{content:"\f17f1"}.mdi-card-multiple-outline:before{content:"\f17f2"}.mdi-card-off:before{content:"\f1602"}.mdi-card-off-outline:before{content:"\f1603"}.mdi-card-outline:before{content:"\f0b76"}.mdi-card-plus:before{content:"\f11ff"}.mdi-card-plus-outline:before{content:"\f1200"}.mdi-card-remove:before{content:"\f1604"}.mdi-card-remove-outline:before{content:"\f1605"}.mdi-card-search:before{content:"\f1074"}.mdi-card-search-outline:before{content:"\f1075"}.mdi-card-text:before{content:"\f0b77"}.mdi-card-text-outline:before{content:"\f0b78"}.mdi-cards:before{content:"\f0638"}.mdi-cards-club:before{content:"\f08ce"}.mdi-cards-club-outline:before{content:"\f189f"}.mdi-cards-diamond:before{content:"\f08cf"}.mdi-cards-diamond-outline:before{content:"\f101d"}.mdi-cards-heart:before{content:"\f08d0"}.mdi-cards-heart-outline:before{content:"\f18a0"}.mdi-cards-outline:before{content:"\f0639"}.mdi-cards-playing:before{content:"\f18a1"}.mdi-cards-playing-club:before{content:"\f18a2"}.mdi-cards-playing-club-multiple:before{content:"\f18a3"}.mdi-cards-playing-club-multiple-outline:before{content:"\f18a4"}.mdi-cards-playing-club-outline:before{content:"\f18a5"}.mdi-cards-playing-diamond:before{content:"\f18a6"}.mdi-cards-playing-diamond-multiple:before{content:"\f18a7"}.mdi-cards-playing-diamond-multiple-outline:before{content:"\f18a8"}.mdi-cards-playing-diamond-outline:before{content:"\f18a9"}.mdi-cards-playing-heart:before{content:"\f18aa"}.mdi-cards-playing-heart-multiple:before{content:"\f18ab"}.mdi-cards-playing-heart-multiple-outline:before{content:"\f18ac"}.mdi-cards-playing-heart-outline:before{content:"\f18ad"}.mdi-cards-playing-outline:before{content:"\f063a"}.mdi-cards-playing-spade:before{content:"\f18ae"}.mdi-cards-playing-spade-multiple:before{content:"\f18af"}.mdi-cards-playing-spade-multiple-outline:before{content:"\f18b0"}.mdi-cards-playing-spade-outline:before{content:"\f18b1"}.mdi-cards-spade:before{content:"\f08d1"}.mdi-cards-spade-outline:before{content:"\f18b2"}.mdi-cards-variant:before{content:"\f06c7"}.mdi-carrot:before{content:"\f010f"}.mdi-cart:before{content:"\f0110"}.mdi-cart-arrow-down:before{content:"\f0d66"}.mdi-cart-arrow-right:before{content:"\f0c4e"}.mdi-cart-arrow-up:before{content:"\f0d67"}.mdi-cart-check:before{content:"\f15ea"}.mdi-cart-heart:before{content:"\f18e0"}.mdi-cart-minus:before{content:"\f0d68"}.mdi-cart-off:before{content:"\f066b"}.mdi-cart-outline:before{content:"\f0111"}.mdi-cart-percent:before{content:"\f1bae"}.mdi-cart-plus:before{content:"\f0112"}.mdi-cart-remove:before{content:"\f0d69"}.mdi-cart-variant:before{content:"\f15eb"}.mdi-case-sensitive-alt:before{content:"\f0113"}.mdi-cash:before{content:"\f0114"}.mdi-cash-100:before{content:"\f0115"}.mdi-cash-check:before{content:"\f14ee"}.mdi-cash-clock:before{content:"\f1a91"}.mdi-cash-edit:before{content:"\f1cab"}.mdi-cash-fast:before{content:"\f185c"}.mdi-cash-lock:before{content:"\f14ea"}.mdi-cash-lock-open:before{content:"\f14eb"}.mdi-cash-marker:before{content:"\f0db8"}.mdi-cash-minus:before{content:"\f1260"}.mdi-cash-multiple:before{content:"\f0116"}.mdi-cash-off:before{content:"\f1c79"}.mdi-cash-plus:before{content:"\f1261"}.mdi-cash-refund:before{content:"\f0a9c"}.mdi-cash-register:before{content:"\f0cf4"}.mdi-cash-remove:before{content:"\f1262"}.mdi-cash-sync:before{content:"\f1a92"}.mdi-cassette:before{content:"\f09d4"}.mdi-cast:before{content:"\f0118"}.mdi-cast-audio:before{content:"\f101e"}.mdi-cast-audio-variant:before{content:"\f1749"}.mdi-cast-connected:before{content:"\f0119"}.mdi-cast-education:before{content:"\f0e1d"}.mdi-cast-off:before{content:"\f078a"}.mdi-cast-variant:before{content:"\f001f"}.mdi-castle:before{content:"\f011a"}.mdi-cat:before{content:"\f011b"}.mdi-cctv:before{content:"\f07ae"}.mdi-cctv-off:before{content:"\f185f"}.mdi-ceiling-fan:before{content:"\f1797"}.mdi-ceiling-fan-light:before{content:"\f1798"}.mdi-ceiling-light:before{content:"\f0769"}.mdi-ceiling-light-multiple:before{content:"\f18dd"}.mdi-ceiling-light-multiple-outline:before{content:"\f18de"}.mdi-ceiling-light-outline:before{content:"\f17c7"}.mdi-cellphone:before{content:"\f011c"}.mdi-cellphone-arrow-down:before{content:"\f09d5"}.mdi-cellphone-arrow-down-variant:before{content:"\f19c5"}.mdi-cellphone-basic:before{content:"\f011e"}.mdi-cellphone-charging:before{content:"\f1397"}.mdi-cellphone-check:before{content:"\f17fd"}.mdi-cellphone-cog:before{content:"\f0951"}.mdi-cellphone-dock:before{content:"\f011f"}.mdi-cellphone-information:before{content:"\f0f41"}.mdi-cellphone-key:before{content:"\f094e"}.mdi-cellphone-link:before{content:"\f0121"}.mdi-cellphone-link-off:before{content:"\f0122"}.mdi-cellphone-lock:before{content:"\f094f"}.mdi-cellphone-marker:before{content:"\f183a"}.mdi-cellphone-message:before{content:"\f08d3"}.mdi-cellphone-message-off:before{content:"\f10d2"}.mdi-cellphone-nfc:before{content:"\f0e90"}.mdi-cellphone-nfc-off:before{content:"\f12d8"}.mdi-cellphone-off:before{content:"\f0950"}.mdi-cellphone-play:before{content:"\f101f"}.mdi-cellphone-remove:before{content:"\f094d"}.mdi-cellphone-screenshot:before{content:"\f0a35"}.mdi-cellphone-settings:before{content:"\f0123"}.mdi-cellphone-sound:before{content:"\f0952"}.mdi-cellphone-text:before{content:"\f08d2"}.mdi-cellphone-wireless:before{content:"\f0815"}.mdi-centos:before{content:"\f111a"}.mdi-certificate:before{content:"\f0124"}.mdi-certificate-outline:before{content:"\f1188"}.mdi-chair-rolling:before{content:"\f0f48"}.mdi-chair-school:before{content:"\f0125"}.mdi-chandelier:before{content:"\f1793"}.mdi-charity:before{content:"\f0c4f"}.mdi-charity-search:before{content:"\f1c82"}.mdi-chart-arc:before{content:"\f0126"}.mdi-chart-areaspline:before{content:"\f0127"}.mdi-chart-areaspline-variant:before{content:"\f0e91"}.mdi-chart-bar:before{content:"\f0128"}.mdi-chart-bar-stacked:before{content:"\f076a"}.mdi-chart-bell-curve:before{content:"\f0c50"}.mdi-chart-bell-curve-cumulative:before{content:"\f0fa7"}.mdi-chart-box:before{content:"\f154d"}.mdi-chart-box-multiple:before{content:"\f1ccd"}.mdi-chart-box-multiple-outline:before{content:"\f1cce"}.mdi-chart-box-outline:before{content:"\f154e"}.mdi-chart-box-plus-outline:before{content:"\f154f"}.mdi-chart-bubble:before{content:"\f05e3"}.mdi-chart-donut:before{content:"\f07af"}.mdi-chart-donut-variant:before{content:"\f07b0"}.mdi-chart-gantt:before{content:"\f066c"}.mdi-chart-histogram:before{content:"\f0129"}.mdi-chart-line:before{content:"\f012a"}.mdi-chart-line-stacked:before{content:"\f076b"}.mdi-chart-line-variant:before{content:"\f07b1"}.mdi-chart-multiline:before{content:"\f08d4"}.mdi-chart-multiple:before{content:"\f1213"}.mdi-chart-pie:before{content:"\f012b"}.mdi-chart-pie-outline:before{content:"\f1bdf"}.mdi-chart-ppf:before{content:"\f1380"}.mdi-chart-sankey:before{content:"\f11df"}.mdi-chart-sankey-variant:before{content:"\f11e0"}.mdi-chart-scatter-plot:before{content:"\f0e92"}.mdi-chart-scatter-plot-hexbin:before{content:"\f066d"}.mdi-chart-timeline:before{content:"\f066e"}.mdi-chart-timeline-variant:before{content:"\f0e93"}.mdi-chart-timeline-variant-shimmer:before{content:"\f15b6"}.mdi-chart-tree:before{content:"\f0e94"}.mdi-chart-waterfall:before{content:"\f1918"}.mdi-chat:before{content:"\f0b79"}.mdi-chat-alert:before{content:"\f0b7a"}.mdi-chat-alert-outline:before{content:"\f12c9"}.mdi-chat-minus:before{content:"\f1410"}.mdi-chat-minus-outline:before{content:"\f1413"}.mdi-chat-outline:before{content:"\f0ede"}.mdi-chat-plus:before{content:"\f140f"}.mdi-chat-plus-outline:before{content:"\f1412"}.mdi-chat-processing:before{content:"\f0b7b"}.mdi-chat-processing-outline:before{content:"\f12ca"}.mdi-chat-question:before{content:"\f1738"}.mdi-chat-question-outline:before{content:"\f1739"}.mdi-chat-remove:before{content:"\f1411"}.mdi-chat-remove-outline:before{content:"\f1414"}.mdi-chat-sleep:before{content:"\f12d1"}.mdi-chat-sleep-outline:before{content:"\f12d2"}.mdi-check:before{content:"\f012c"}.mdi-check-all:before{content:"\f012d"}.mdi-check-bold:before{content:"\f0e1e"}.mdi-check-circle:before{content:"\f05e0"}.mdi-check-circle-outline:before{content:"\f05e1"}.mdi-check-decagram:before{content:"\f0791"}.mdi-check-decagram-outline:before{content:"\f1740"}.mdi-check-network:before{content:"\f0c53"}.mdi-check-network-outline:before{content:"\f0c54"}.mdi-check-outline:before{content:"\f0855"}.mdi-check-underline:before{content:"\f0e1f"}.mdi-check-underline-circle:before{content:"\f0e20"}.mdi-check-underline-circle-outline:before{content:"\f0e21"}.mdi-checkbook:before{content:"\f0a9d"}.mdi-checkbook-arrow-left:before{content:"\f1c1d"}.mdi-checkbook-arrow-right:before{content:"\f1c1e"}.mdi-checkbox-blank:before{content:"\f012e"}.mdi-checkbox-blank-badge:before{content:"\f1176"}.mdi-checkbox-blank-badge-outline:before{content:"\f0117"}.mdi-checkbox-blank-circle:before{content:"\f012f"}.mdi-checkbox-blank-circle-outline:before{content:"\f0130"}.mdi-checkbox-blank-off:before{content:"\f12ec"}.mdi-checkbox-blank-off-outline:before{content:"\f12ed"}.mdi-checkbox-blank-outline:before{content:"\f0131"}.mdi-checkbox-intermediate:before{content:"\f0856"}.mdi-checkbox-intermediate-variant:before{content:"\f1b54"}.mdi-checkbox-marked:before{content:"\f0132"}.mdi-checkbox-marked-circle:before{content:"\f0133"}.mdi-checkbox-marked-circle-auto-outline:before{content:"\f1c26"}.mdi-checkbox-marked-circle-minus-outline:before{content:"\f1c27"}.mdi-checkbox-marked-circle-outline:before{content:"\f0134"}.mdi-checkbox-marked-circle-plus-outline:before{content:"\f1927"}.mdi-checkbox-marked-outline:before{content:"\f0135"}.mdi-checkbox-multiple-blank:before{content:"\f0136"}.mdi-checkbox-multiple-blank-circle:before{content:"\f063b"}.mdi-checkbox-multiple-blank-circle-outline:before{content:"\f063c"}.mdi-checkbox-multiple-blank-outline:before{content:"\f0137"}.mdi-checkbox-multiple-marked:before{content:"\f0138"}.mdi-checkbox-multiple-marked-circle:before{content:"\f063d"}.mdi-checkbox-multiple-marked-circle-outline:before{content:"\f063e"}.mdi-checkbox-multiple-marked-outline:before{content:"\f0139"}.mdi-checkbox-multiple-outline:before{content:"\f0c51"}.mdi-checkbox-outline:before{content:"\f0c52"}.mdi-checkerboard:before{content:"\f013a"}.mdi-checkerboard-minus:before{content:"\f1202"}.mdi-checkerboard-plus:before{content:"\f1201"}.mdi-checkerboard-remove:before{content:"\f1203"}.mdi-cheese:before{content:"\f12b9"}.mdi-cheese-off:before{content:"\f13ee"}.mdi-chef-hat:before{content:"\f0b7c"}.mdi-chemical-weapon:before{content:"\f013b"}.mdi-chess-bishop:before{content:"\f085c"}.mdi-chess-king:before{content:"\f0857"}.mdi-chess-knight:before{content:"\f0858"}.mdi-chess-pawn:before{content:"\f0859"}.mdi-chess-queen:before{content:"\f085a"}.mdi-chess-rook:before{content:"\f085b"}.mdi-chevron-double-down:before{content:"\f013c"}.mdi-chevron-double-left:before{content:"\f013d"}.mdi-chevron-double-right:before{content:"\f013e"}.mdi-chevron-double-up:before{content:"\f013f"}.mdi-chevron-down:before{content:"\f0140"}.mdi-chevron-down-box:before{content:"\f09d6"}.mdi-chevron-down-box-outline:before{content:"\f09d7"}.mdi-chevron-down-circle:before{content:"\f0b26"}.mdi-chevron-down-circle-outline:before{content:"\f0b27"}.mdi-chevron-left:before{content:"\f0141"}.mdi-chevron-left-box:before{content:"\f09d8"}.mdi-chevron-left-box-outline:before{content:"\f09d9"}.mdi-chevron-left-circle:before{content:"\f0b28"}.mdi-chevron-left-circle-outline:before{content:"\f0b29"}.mdi-chevron-right:before{content:"\f0142"}.mdi-chevron-right-box:before{content:"\f09da"}.mdi-chevron-right-box-outline:before{content:"\f09db"}.mdi-chevron-right-circle:before{content:"\f0b2a"}.mdi-chevron-right-circle-outline:before{content:"\f0b2b"}.mdi-chevron-triple-down:before{content:"\f0db9"}.mdi-chevron-triple-left:before{content:"\f0dba"}.mdi-chevron-triple-right:before{content:"\f0dbb"}.mdi-chevron-triple-up:before{content:"\f0dbc"}.mdi-chevron-up:before{content:"\f0143"}.mdi-chevron-up-box:before{content:"\f09dc"}.mdi-chevron-up-box-outline:before{content:"\f09dd"}.mdi-chevron-up-circle:before{content:"\f0b2c"}.mdi-chevron-up-circle-outline:before{content:"\f0b2d"}.mdi-chili-alert:before{content:"\f17ea"}.mdi-chili-alert-outline:before{content:"\f17eb"}.mdi-chili-hot:before{content:"\f07b2"}.mdi-chili-hot-outline:before{content:"\f17ec"}.mdi-chili-medium:before{content:"\f07b3"}.mdi-chili-medium-outline:before{content:"\f17ed"}.mdi-chili-mild:before{content:"\f07b4"}.mdi-chili-mild-outline:before{content:"\f17ee"}.mdi-chili-off:before{content:"\f1467"}.mdi-chili-off-outline:before{content:"\f17ef"}.mdi-chip:before{content:"\f061a"}.mdi-church:before{content:"\f0144"}.mdi-church-outline:before{content:"\f1b02"}.mdi-cigar:before{content:"\f1189"}.mdi-cigar-off:before{content:"\f141b"}.mdi-circle:before{content:"\f0765"}.mdi-circle-box:before{content:"\f15dc"}.mdi-circle-box-outline:before{content:"\f15dd"}.mdi-circle-double:before{content:"\f0e95"}.mdi-circle-edit-outline:before{content:"\f08d5"}.mdi-circle-expand:before{content:"\f0e96"}.mdi-circle-half:before{content:"\f1395"}.mdi-circle-half-full:before{content:"\f1396"}.mdi-circle-medium:before{content:"\f09de"}.mdi-circle-multiple:before{content:"\f0b38"}.mdi-circle-multiple-outline:before{content:"\f0695"}.mdi-circle-off-outline:before{content:"\f10d3"}.mdi-circle-opacity:before{content:"\f1853"}.mdi-circle-outline:before{content:"\f0766"}.mdi-circle-slice-1:before{content:"\f0a9e"}.mdi-circle-slice-2:before{content:"\f0a9f"}.mdi-circle-slice-3:before{content:"\f0aa0"}.mdi-circle-slice-4:before{content:"\f0aa1"}.mdi-circle-slice-5:before{content:"\f0aa2"}.mdi-circle-slice-6:before{content:"\f0aa3"}.mdi-circle-slice-7:before{content:"\f0aa4"}.mdi-circle-slice-8:before{content:"\f0aa5"}.mdi-circle-small:before{content:"\f09df"}.mdi-circular-saw:before{content:"\f0e22"}.mdi-city:before{content:"\f0146"}.mdi-city-switch:before{content:"\f1c28"}.mdi-city-variant:before{content:"\f0a36"}.mdi-city-variant-outline:before{content:"\f0a37"}.mdi-clipboard:before{content:"\f0147"}.mdi-clipboard-account:before{content:"\f0148"}.mdi-clipboard-account-outline:before{content:"\f0c55"}.mdi-clipboard-alert:before{content:"\f0149"}.mdi-clipboard-alert-outline:before{content:"\f0cf7"}.mdi-clipboard-arrow-down:before{content:"\f014a"}.mdi-clipboard-arrow-down-outline:before{content:"\f0c56"}.mdi-clipboard-arrow-left:before{content:"\f014b"}.mdi-clipboard-arrow-left-outline:before{content:"\f0cf8"}.mdi-clipboard-arrow-right:before{content:"\f0cf9"}.mdi-clipboard-arrow-right-outline:before{content:"\f0cfa"}.mdi-clipboard-arrow-up:before{content:"\f0c57"}.mdi-clipboard-arrow-up-outline:before{content:"\f0c58"}.mdi-clipboard-check:before{content:"\f014e"}.mdi-clipboard-check-multiple:before{content:"\f1263"}.mdi-clipboard-check-multiple-outline:before{content:"\f1264"}.mdi-clipboard-check-outline:before{content:"\f08a8"}.mdi-clipboard-clock:before{content:"\f16e2"}.mdi-clipboard-clock-outline:before{content:"\f16e3"}.mdi-clipboard-edit:before{content:"\f14e5"}.mdi-clipboard-edit-outline:before{content:"\f14e6"}.mdi-clipboard-file:before{content:"\f1265"}.mdi-clipboard-file-outline:before{content:"\f1266"}.mdi-clipboard-flow:before{content:"\f06c8"}.mdi-clipboard-flow-outline:before{content:"\f1117"}.mdi-clipboard-list:before{content:"\f10d4"}.mdi-clipboard-list-outline:before{content:"\f10d5"}.mdi-clipboard-minus:before{content:"\f1618"}.mdi-clipboard-minus-outline:before{content:"\f1619"}.mdi-clipboard-multiple:before{content:"\f1267"}.mdi-clipboard-multiple-outline:before{content:"\f1268"}.mdi-clipboard-off:before{content:"\f161a"}.mdi-clipboard-off-outline:before{content:"\f161b"}.mdi-clipboard-outline:before{content:"\f014c"}.mdi-clipboard-play:before{content:"\f0c59"}.mdi-clipboard-play-multiple:before{content:"\f1269"}.mdi-clipboard-play-multiple-outline:before{content:"\f126a"}.mdi-clipboard-play-outline:before{content:"\f0c5a"}.mdi-clipboard-plus:before{content:"\f0751"}.mdi-clipboard-plus-outline:before{content:"\f131f"}.mdi-clipboard-pulse:before{content:"\f085d"}.mdi-clipboard-pulse-outline:before{content:"\f085e"}.mdi-clipboard-remove:before{content:"\f161c"}.mdi-clipboard-remove-outline:before{content:"\f161d"}.mdi-clipboard-search:before{content:"\f161e"}.mdi-clipboard-search-outline:before{content:"\f161f"}.mdi-clipboard-text:before{content:"\f014d"}.mdi-clipboard-text-clock:before{content:"\f18f9"}.mdi-clipboard-text-clock-outline:before{content:"\f18fa"}.mdi-clipboard-text-multiple:before{content:"\f126b"}.mdi-clipboard-text-multiple-outline:before{content:"\f126c"}.mdi-clipboard-text-off:before{content:"\f1620"}.mdi-clipboard-text-off-outline:before{content:"\f1621"}.mdi-clipboard-text-outline:before{content:"\f0a38"}.mdi-clipboard-text-play:before{content:"\f0c5b"}.mdi-clipboard-text-play-outline:before{content:"\f0c5c"}.mdi-clipboard-text-search:before{content:"\f1622"}.mdi-clipboard-text-search-outline:before{content:"\f1623"}.mdi-clippy:before{content:"\f014f"}.mdi-clock:before{content:"\f0954"}.mdi-clock-alert:before{content:"\f0955"}.mdi-clock-alert-outline:before{content:"\f05ce"}.mdi-clock-check:before{content:"\f0fa8"}.mdi-clock-check-outline:before{content:"\f0fa9"}.mdi-clock-digital:before{content:"\f0e97"}.mdi-clock-edit:before{content:"\f19ba"}.mdi-clock-edit-outline:before{content:"\f19bb"}.mdi-clock-end:before{content:"\f0151"}.mdi-clock-fast:before{content:"\f0152"}.mdi-clock-in:before{content:"\f0153"}.mdi-clock-minus:before{content:"\f1863"}.mdi-clock-minus-outline:before{content:"\f1864"}.mdi-clock-out:before{content:"\f0154"}.mdi-clock-outline:before{content:"\f0150"}.mdi-clock-plus:before{content:"\f1861"}.mdi-clock-plus-outline:before{content:"\f1862"}.mdi-clock-remove:before{content:"\f1865"}.mdi-clock-remove-outline:before{content:"\f1866"}.mdi-clock-star-four-points:before{content:"\f1c29"}.mdi-clock-star-four-points-outline:before{content:"\f1c2a"}.mdi-clock-start:before{content:"\f0155"}.mdi-clock-time-eight:before{content:"\f1446"}.mdi-clock-time-eight-outline:before{content:"\f1452"}.mdi-clock-time-eleven:before{content:"\f1449"}.mdi-clock-time-eleven-outline:before{content:"\f1455"}.mdi-clock-time-five:before{content:"\f1443"}.mdi-clock-time-five-outline:before{content:"\f144f"}.mdi-clock-time-four:before{content:"\f1442"}.mdi-clock-time-four-outline:before{content:"\f144e"}.mdi-clock-time-nine:before{content:"\f1447"}.mdi-clock-time-nine-outline:before{content:"\f1453"}.mdi-clock-time-one:before{content:"\f143f"}.mdi-clock-time-one-outline:before{content:"\f144b"}.mdi-clock-time-seven:before{content:"\f1445"}.mdi-clock-time-seven-outline:before{content:"\f1451"}.mdi-clock-time-six:before{content:"\f1444"}.mdi-clock-time-six-outline:before{content:"\f1450"}.mdi-clock-time-ten:before{content:"\f1448"}.mdi-clock-time-ten-outline:before{content:"\f1454"}.mdi-clock-time-three:before{content:"\f1441"}.mdi-clock-time-three-outline:before{content:"\f144d"}.mdi-clock-time-twelve:before{content:"\f144a"}.mdi-clock-time-twelve-outline:before{content:"\f1456"}.mdi-clock-time-two:before{content:"\f1440"}.mdi-clock-time-two-outline:before{content:"\f144c"}.mdi-close:before{content:"\f0156"}.mdi-close-box:before{content:"\f0157"}.mdi-close-box-multiple:before{content:"\f0c5d"}.mdi-close-box-multiple-outline:before{content:"\f0c5e"}.mdi-close-box-outline:before{content:"\f0158"}.mdi-close-circle:before{content:"\f0159"}.mdi-close-circle-multiple:before{content:"\f062a"}.mdi-close-circle-multiple-outline:before{content:"\f0883"}.mdi-close-circle-outline:before{content:"\f015a"}.mdi-close-network:before{content:"\f015b"}.mdi-close-network-outline:before{content:"\f0c5f"}.mdi-close-octagon:before{content:"\f015c"}.mdi-close-octagon-outline:before{content:"\f015d"}.mdi-close-outline:before{content:"\f06c9"}.mdi-close-thick:before{content:"\f1398"}.mdi-closed-caption:before{content:"\f015e"}.mdi-closed-caption-outline:before{content:"\f0dbd"}.mdi-cloud:before{content:"\f015f"}.mdi-cloud-alert:before{content:"\f09e0"}.mdi-cloud-alert-outline:before{content:"\f1be0"}.mdi-cloud-arrow-down:before{content:"\f1be1"}.mdi-cloud-arrow-down-outline:before{content:"\f1be2"}.mdi-cloud-arrow-left:before{content:"\f1be3"}.mdi-cloud-arrow-left-outline:before{content:"\f1be4"}.mdi-cloud-arrow-right:before{content:"\f1be5"}.mdi-cloud-arrow-right-outline:before{content:"\f1be6"}.mdi-cloud-arrow-up:before{content:"\f1be7"}.mdi-cloud-arrow-up-outline:before{content:"\f1be8"}.mdi-cloud-braces:before{content:"\f07b5"}.mdi-cloud-cancel:before{content:"\f1be9"}.mdi-cloud-cancel-outline:before{content:"\f1bea"}.mdi-cloud-check:before{content:"\f1beb"}.mdi-cloud-check-outline:before{content:"\f1bec"}.mdi-cloud-check-variant:before{content:"\f0160"}.mdi-cloud-check-variant-outline:before{content:"\f12cc"}.mdi-cloud-circle:before{content:"\f0161"}.mdi-cloud-circle-outline:before{content:"\f1bed"}.mdi-cloud-clock:before{content:"\f1bee"}.mdi-cloud-clock-outline:before{content:"\f1bef"}.mdi-cloud-cog:before{content:"\f1bf0"}.mdi-cloud-cog-outline:before{content:"\f1bf1"}.mdi-cloud-download:before{content:"\f0162"}.mdi-cloud-download-outline:before{content:"\f0b7d"}.mdi-cloud-key:before{content:"\f1ca1"}.mdi-cloud-key-outline:before{content:"\f1ca2"}.mdi-cloud-lock:before{content:"\f11f1"}.mdi-cloud-lock-open:before{content:"\f1bf2"}.mdi-cloud-lock-open-outline:before{content:"\f1bf3"}.mdi-cloud-lock-outline:before{content:"\f11f2"}.mdi-cloud-minus:before{content:"\f1bf4"}.mdi-cloud-minus-outline:before{content:"\f1bf5"}.mdi-cloud-off:before{content:"\f1bf6"}.mdi-cloud-off-outline:before{content:"\f0164"}.mdi-cloud-outline:before{content:"\f0163"}.mdi-cloud-percent:before{content:"\f1a35"}.mdi-cloud-percent-outline:before{content:"\f1a36"}.mdi-cloud-plus:before{content:"\f1bf7"}.mdi-cloud-plus-outline:before{content:"\f1bf8"}.mdi-cloud-print:before{content:"\f0165"}.mdi-cloud-print-outline:before{content:"\f0166"}.mdi-cloud-question:before{content:"\f0a39"}.mdi-cloud-question-outline:before{content:"\f1bf9"}.mdi-cloud-refresh:before{content:"\f1bfa"}.mdi-cloud-refresh-outline:before{content:"\f1bfb"}.mdi-cloud-refresh-variant:before{content:"\f052a"}.mdi-cloud-refresh-variant-outline:before{content:"\f1bfc"}.mdi-cloud-remove:before{content:"\f1bfd"}.mdi-cloud-remove-outline:before{content:"\f1bfe"}.mdi-cloud-search:before{content:"\f0956"}.mdi-cloud-search-outline:before{content:"\f0957"}.mdi-cloud-sync:before{content:"\f063f"}.mdi-cloud-sync-outline:before{content:"\f12d6"}.mdi-cloud-tags:before{content:"\f07b6"}.mdi-cloud-upload:before{content:"\f0167"}.mdi-cloud-upload-outline:before{content:"\f0b7e"}.mdi-clouds:before{content:"\f1b95"}.mdi-clover:before{content:"\f0816"}.mdi-clover-outline:before{content:"\f1c62"}.mdi-coach-lamp:before{content:"\f1020"}.mdi-coach-lamp-variant:before{content:"\f1a37"}.mdi-coat-rack:before{content:"\f109e"}.mdi-code-array:before{content:"\f0168"}.mdi-code-block-braces:before{content:"\f1c83"}.mdi-code-block-brackets:before{content:"\f1c84"}.mdi-code-block-parentheses:before{content:"\f1c85"}.mdi-code-block-tags:before{content:"\f1c86"}.mdi-code-braces:before{content:"\f0169"}.mdi-code-braces-box:before{content:"\f10d6"}.mdi-code-brackets:before{content:"\f016a"}.mdi-code-equal:before{content:"\f016b"}.mdi-code-greater-than:before{content:"\f016c"}.mdi-code-greater-than-or-equal:before{content:"\f016d"}.mdi-code-json:before{content:"\f0626"}.mdi-code-less-than:before{content:"\f016e"}.mdi-code-less-than-or-equal:before{content:"\f016f"}.mdi-code-not-equal:before{content:"\f0170"}.mdi-code-not-equal-variant:before{content:"\f0171"}.mdi-code-parentheses:before{content:"\f0172"}.mdi-code-parentheses-box:before{content:"\f10d7"}.mdi-code-string:before{content:"\f0173"}.mdi-code-tags:before{content:"\f0174"}.mdi-code-tags-check:before{content:"\f0694"}.mdi-codepen:before{content:"\f0175"}.mdi-coffee:before{content:"\f0176"}.mdi-coffee-maker:before{content:"\f109f"}.mdi-coffee-maker-check:before{content:"\f1931"}.mdi-coffee-maker-check-outline:before{content:"\f1932"}.mdi-coffee-maker-outline:before{content:"\f181b"}.mdi-coffee-off:before{content:"\f0faa"}.mdi-coffee-off-outline:before{content:"\f0fab"}.mdi-coffee-outline:before{content:"\f06ca"}.mdi-coffee-to-go:before{content:"\f0177"}.mdi-coffee-to-go-outline:before{content:"\f130e"}.mdi-coffin:before{content:"\f0b7f"}.mdi-cog:before{content:"\f0493"}.mdi-cog-box:before{content:"\f0494"}.mdi-cog-clockwise:before{content:"\f11dd"}.mdi-cog-counterclockwise:before{content:"\f11de"}.mdi-cog-off:before{content:"\f13ce"}.mdi-cog-off-outline:before{content:"\f13cf"}.mdi-cog-outline:before{content:"\f08bb"}.mdi-cog-pause:before{content:"\f1933"}.mdi-cog-pause-outline:before{content:"\f1934"}.mdi-cog-play:before{content:"\f1935"}.mdi-cog-play-outline:before{content:"\f1936"}.mdi-cog-refresh:before{content:"\f145e"}.mdi-cog-refresh-outline:before{content:"\f145f"}.mdi-cog-stop:before{content:"\f1937"}.mdi-cog-stop-outline:before{content:"\f1938"}.mdi-cog-sync:before{content:"\f1460"}.mdi-cog-sync-outline:before{content:"\f1461"}.mdi-cog-transfer:before{content:"\f105b"}.mdi-cog-transfer-outline:before{content:"\f105c"}.mdi-cogs:before{content:"\f08d6"}.mdi-collage:before{content:"\f0640"}.mdi-collapse-all:before{content:"\f0aa6"}.mdi-collapse-all-outline:before{content:"\f0aa7"}.mdi-color-helper:before{content:"\f0179"}.mdi-comma:before{content:"\f0e23"}.mdi-comma-box:before{content:"\f0e2b"}.mdi-comma-box-outline:before{content:"\f0e24"}.mdi-comma-circle:before{content:"\f0e25"}.mdi-comma-circle-outline:before{content:"\f0e26"}.mdi-comment:before{content:"\f017a"}.mdi-comment-account:before{content:"\f017b"}.mdi-comment-account-outline:before{content:"\f017c"}.mdi-comment-alert:before{content:"\f017d"}.mdi-comment-alert-outline:before{content:"\f017e"}.mdi-comment-arrow-left:before{content:"\f09e1"}.mdi-comment-arrow-left-outline:before{content:"\f09e2"}.mdi-comment-arrow-right:before{content:"\f09e3"}.mdi-comment-arrow-right-outline:before{content:"\f09e4"}.mdi-comment-bookmark:before{content:"\f15ae"}.mdi-comment-bookmark-outline:before{content:"\f15af"}.mdi-comment-check:before{content:"\f017f"}.mdi-comment-check-outline:before{content:"\f0180"}.mdi-comment-edit:before{content:"\f11bf"}.mdi-comment-edit-outline:before{content:"\f12c4"}.mdi-comment-eye:before{content:"\f0a3a"}.mdi-comment-eye-outline:before{content:"\f0a3b"}.mdi-comment-flash:before{content:"\f15b0"}.mdi-comment-flash-outline:before{content:"\f15b1"}.mdi-comment-minus:before{content:"\f15df"}.mdi-comment-minus-outline:before{content:"\f15e0"}.mdi-comment-multiple:before{content:"\f085f"}.mdi-comment-multiple-outline:before{content:"\f0181"}.mdi-comment-off:before{content:"\f15e1"}.mdi-comment-off-outline:before{content:"\f15e2"}.mdi-comment-outline:before{content:"\f0182"}.mdi-comment-plus:before{content:"\f09e5"}.mdi-comment-plus-outline:before{content:"\f0183"}.mdi-comment-processing:before{content:"\f0184"}.mdi-comment-processing-outline:before{content:"\f0185"}.mdi-comment-question:before{content:"\f0817"}.mdi-comment-question-outline:before{content:"\f0186"}.mdi-comment-quote:before{content:"\f1021"}.mdi-comment-quote-outline:before{content:"\f1022"}.mdi-comment-remove:before{content:"\f05de"}.mdi-comment-remove-outline:before{content:"\f0187"}.mdi-comment-search:before{content:"\f0a3c"}.mdi-comment-search-outline:before{content:"\f0a3d"}.mdi-comment-text:before{content:"\f0188"}.mdi-comment-text-multiple:before{content:"\f0860"}.mdi-comment-text-multiple-outline:before{content:"\f0861"}.mdi-comment-text-outline:before{content:"\f0189"}.mdi-compare:before{content:"\f018a"}.mdi-compare-horizontal:before{content:"\f1492"}.mdi-compare-remove:before{content:"\f18b3"}.mdi-compare-vertical:before{content:"\f1493"}.mdi-compass:before{content:"\f018b"}.mdi-compass-off:before{content:"\f0b80"}.mdi-compass-off-outline:before{content:"\f0b81"}.mdi-compass-outline:before{content:"\f018c"}.mdi-compass-rose:before{content:"\f1382"}.mdi-compost:before{content:"\f1a38"}.mdi-cone:before{content:"\f194c"}.mdi-cone-off:before{content:"\f194d"}.mdi-connection:before{content:"\f1616"}.mdi-console:before{content:"\f018d"}.mdi-console-line:before{content:"\f07b7"}.mdi-console-network:before{content:"\f08a9"}.mdi-console-network-outline:before{content:"\f0c60"}.mdi-consolidate:before{content:"\f10d8"}.mdi-contactless-payment:before{content:"\f0d6a"}.mdi-contactless-payment-circle:before{content:"\f0321"}.mdi-contactless-payment-circle-outline:before{content:"\f0408"}.mdi-contacts:before{content:"\f06cb"}.mdi-contacts-outline:before{content:"\f05b8"}.mdi-contain:before{content:"\f0a3e"}.mdi-contain-end:before{content:"\f0a3f"}.mdi-contain-start:before{content:"\f0a40"}.mdi-content-copy:before{content:"\f018f"}.mdi-content-cut:before{content:"\f0190"}.mdi-content-duplicate:before{content:"\f0191"}.mdi-content-paste:before{content:"\f0192"}.mdi-content-save:before{content:"\f0193"}.mdi-content-save-alert:before{content:"\f0f42"}.mdi-content-save-alert-outline:before{content:"\f0f43"}.mdi-content-save-all:before{content:"\f0194"}.mdi-content-save-all-outline:before{content:"\f0f44"}.mdi-content-save-check:before{content:"\f18ea"}.mdi-content-save-check-outline:before{content:"\f18eb"}.mdi-content-save-cog:before{content:"\f145b"}.mdi-content-save-cog-outline:before{content:"\f145c"}.mdi-content-save-edit:before{content:"\f0cfb"}.mdi-content-save-edit-outline:before{content:"\f0cfc"}.mdi-content-save-minus:before{content:"\f1b43"}.mdi-content-save-minus-outline:before{content:"\f1b44"}.mdi-content-save-move:before{content:"\f0e27"}.mdi-content-save-move-outline:before{content:"\f0e28"}.mdi-content-save-off:before{content:"\f1643"}.mdi-content-save-off-outline:before{content:"\f1644"}.mdi-content-save-outline:before{content:"\f0818"}.mdi-content-save-plus:before{content:"\f1b41"}.mdi-content-save-plus-outline:before{content:"\f1b42"}.mdi-content-save-settings:before{content:"\f061b"}.mdi-content-save-settings-outline:before{content:"\f0b2e"}.mdi-contrast:before{content:"\f0195"}.mdi-contrast-box:before{content:"\f0196"}.mdi-contrast-circle:before{content:"\f0197"}.mdi-controller:before{content:"\f02b4"}.mdi-controller-classic:before{content:"\f0b82"}.mdi-controller-classic-outline:before{content:"\f0b83"}.mdi-controller-off:before{content:"\f02b5"}.mdi-cookie:before{content:"\f0198"}.mdi-cookie-alert:before{content:"\f16d0"}.mdi-cookie-alert-outline:before{content:"\f16d1"}.mdi-cookie-check:before{content:"\f16d2"}.mdi-cookie-check-outline:before{content:"\f16d3"}.mdi-cookie-clock:before{content:"\f16e4"}.mdi-cookie-clock-outline:before{content:"\f16e5"}.mdi-cookie-cog:before{content:"\f16d4"}.mdi-cookie-cog-outline:before{content:"\f16d5"}.mdi-cookie-edit:before{content:"\f16e6"}.mdi-cookie-edit-outline:before{content:"\f16e7"}.mdi-cookie-lock:before{content:"\f16e8"}.mdi-cookie-lock-outline:before{content:"\f16e9"}.mdi-cookie-minus:before{content:"\f16da"}.mdi-cookie-minus-outline:before{content:"\f16db"}.mdi-cookie-off:before{content:"\f16ea"}.mdi-cookie-off-outline:before{content:"\f16eb"}.mdi-cookie-outline:before{content:"\f16de"}.mdi-cookie-plus:before{content:"\f16d6"}.mdi-cookie-plus-outline:before{content:"\f16d7"}.mdi-cookie-refresh:before{content:"\f16ec"}.mdi-cookie-refresh-outline:before{content:"\f16ed"}.mdi-cookie-remove:before{content:"\f16d8"}.mdi-cookie-remove-outline:before{content:"\f16d9"}.mdi-cookie-settings:before{content:"\f16dc"}.mdi-cookie-settings-outline:before{content:"\f16dd"}.mdi-coolant-temperature:before{content:"\f03c8"}.mdi-copyleft:before{content:"\f1939"}.mdi-copyright:before{content:"\f05e6"}.mdi-cordova:before{content:"\f0958"}.mdi-corn:before{content:"\f07b8"}.mdi-corn-off:before{content:"\f13ef"}.mdi-cosine-wave:before{content:"\f1479"}.mdi-counter:before{content:"\f0199"}.mdi-countertop:before{content:"\f181c"}.mdi-countertop-outline:before{content:"\f181d"}.mdi-cow:before{content:"\f019a"}.mdi-cow-off:before{content:"\f18fc"}.mdi-cpu-32-bit:before{content:"\f0edf"}.mdi-cpu-64-bit:before{content:"\f0ee0"}.mdi-cradle:before{content:"\f198b"}.mdi-cradle-outline:before{content:"\f1991"}.mdi-crane:before{content:"\f0862"}.mdi-creation:before{content:"\f0674"}.mdi-creation-outline:before{content:"\f1c2b"}.mdi-creative-commons:before{content:"\f0d6b"}.mdi-credit-card:before{content:"\f0fef"}.mdi-credit-card-check:before{content:"\f13d0"}.mdi-credit-card-check-outline:before{content:"\f13d1"}.mdi-credit-card-chip:before{content:"\f190f"}.mdi-credit-card-chip-outline:before{content:"\f1910"}.mdi-credit-card-clock:before{content:"\f0ee1"}.mdi-credit-card-clock-outline:before{content:"\f0ee2"}.mdi-credit-card-edit:before{content:"\f17d7"}.mdi-credit-card-edit-outline:before{content:"\f17d8"}.mdi-credit-card-fast:before{content:"\f1911"}.mdi-credit-card-fast-outline:before{content:"\f1912"}.mdi-credit-card-lock:before{content:"\f18e7"}.mdi-credit-card-lock-outline:before{content:"\f18e8"}.mdi-credit-card-marker:before{content:"\f06a8"}.mdi-credit-card-marker-outline:before{content:"\f0dbe"}.mdi-credit-card-minus:before{content:"\f0fac"}.mdi-credit-card-minus-outline:before{content:"\f0fad"}.mdi-credit-card-multiple:before{content:"\f0ff0"}.mdi-credit-card-multiple-outline:before{content:"\f019c"}.mdi-credit-card-off:before{content:"\f0ff1"}.mdi-credit-card-off-outline:before{content:"\f05e4"}.mdi-credit-card-outline:before{content:"\f019b"}.mdi-credit-card-plus:before{content:"\f0ff2"}.mdi-credit-card-plus-outline:before{content:"\f0676"}.mdi-credit-card-refresh:before{content:"\f1645"}.mdi-credit-card-refresh-outline:before{content:"\f1646"}.mdi-credit-card-refund:before{content:"\f0ff3"}.mdi-credit-card-refund-outline:before{content:"\f0aa8"}.mdi-credit-card-remove:before{content:"\f0fae"}.mdi-credit-card-remove-outline:before{content:"\f0faf"}.mdi-credit-card-scan:before{content:"\f0ff4"}.mdi-credit-card-scan-outline:before{content:"\f019d"}.mdi-credit-card-search:before{content:"\f1647"}.mdi-credit-card-search-outline:before{content:"\f1648"}.mdi-credit-card-settings:before{content:"\f0ff5"}.mdi-credit-card-settings-outline:before{content:"\f08d7"}.mdi-credit-card-sync:before{content:"\f1649"}.mdi-credit-card-sync-outline:before{content:"\f164a"}.mdi-credit-card-wireless:before{content:"\f0802"}.mdi-credit-card-wireless-off:before{content:"\f057a"}.mdi-credit-card-wireless-off-outline:before{content:"\f057b"}.mdi-credit-card-wireless-outline:before{content:"\f0d6c"}.mdi-cricket:before{content:"\f0d6d"}.mdi-crop:before{content:"\f019e"}.mdi-crop-free:before{content:"\f019f"}.mdi-crop-landscape:before{content:"\f01a0"}.mdi-crop-portrait:before{content:"\f01a1"}.mdi-crop-rotate:before{content:"\f0696"}.mdi-crop-square:before{content:"\f01a2"}.mdi-cross:before{content:"\f0953"}.mdi-cross-bolnisi:before{content:"\f0ced"}.mdi-cross-celtic:before{content:"\f0cf5"}.mdi-cross-outline:before{content:"\f0cf6"}.mdi-crosshairs:before{content:"\f01a3"}.mdi-crosshairs-gps:before{content:"\f01a4"}.mdi-crosshairs-off:before{content:"\f0f45"}.mdi-crosshairs-question:before{content:"\f1136"}.mdi-crowd:before{content:"\f1975"}.mdi-crown:before{content:"\f01a5"}.mdi-crown-circle:before{content:"\f17dc"}.mdi-crown-circle-outline:before{content:"\f17dd"}.mdi-crown-outline:before{content:"\f11d0"}.mdi-cryengine:before{content:"\f0959"}.mdi-crystal-ball:before{content:"\f0b2f"}.mdi-cube:before{content:"\f01a6"}.mdi-cube-off:before{content:"\f141c"}.mdi-cube-off-outline:before{content:"\f141d"}.mdi-cube-outline:before{content:"\f01a7"}.mdi-cube-scan:before{content:"\f0b84"}.mdi-cube-send:before{content:"\f01a8"}.mdi-cube-unfolded:before{content:"\f01a9"}.mdi-cup:before{content:"\f01aa"}.mdi-cup-off:before{content:"\f05e5"}.mdi-cup-off-outline:before{content:"\f137d"}.mdi-cup-outline:before{content:"\f130f"}.mdi-cup-water:before{content:"\f01ab"}.mdi-cupboard:before{content:"\f0f46"}.mdi-cupboard-outline:before{content:"\f0f47"}.mdi-cupcake:before{content:"\f095a"}.mdi-curling:before{content:"\f0863"}.mdi-currency-bdt:before{content:"\f0864"}.mdi-currency-brl:before{content:"\f0b85"}.mdi-currency-btc:before{content:"\f01ac"}.mdi-currency-cny:before{content:"\f07ba"}.mdi-currency-eth:before{content:"\f07bb"}.mdi-currency-eur:before{content:"\f01ad"}.mdi-currency-eur-off:before{content:"\f1315"}.mdi-currency-fra:before{content:"\f1a39"}.mdi-currency-gbp:before{content:"\f01ae"}.mdi-currency-ils:before{content:"\f0c61"}.mdi-currency-inr:before{content:"\f01af"}.mdi-currency-jpy:before{content:"\f07bc"}.mdi-currency-krw:before{content:"\f07bd"}.mdi-currency-kzt:before{content:"\f0865"}.mdi-currency-mnt:before{content:"\f1512"}.mdi-currency-ngn:before{content:"\f01b0"}.mdi-currency-php:before{content:"\f09e6"}.mdi-currency-rial:before{content:"\f0e9c"}.mdi-currency-rub:before{content:"\f01b1"}.mdi-currency-rupee:before{content:"\f1976"}.mdi-currency-sign:before{content:"\f07be"}.mdi-currency-thb:before{content:"\f1c05"}.mdi-currency-try:before{content:"\f01b2"}.mdi-currency-twd:before{content:"\f07bf"}.mdi-currency-uah:before{content:"\f1b9b"}.mdi-currency-usd:before{content:"\f01c1"}.mdi-currency-usd-off:before{content:"\f067a"}.mdi-current-ac:before{content:"\f1480"}.mdi-current-dc:before{content:"\f095c"}.mdi-cursor-default:before{content:"\f01c0"}.mdi-cursor-default-click:before{content:"\f0cfd"}.mdi-cursor-default-click-outline:before{content:"\f0cfe"}.mdi-cursor-default-gesture:before{content:"\f1127"}.mdi-cursor-default-gesture-outline:before{content:"\f1128"}.mdi-cursor-default-outline:before{content:"\f01bf"}.mdi-cursor-move:before{content:"\f01be"}.mdi-cursor-pointer:before{content:"\f01bd"}.mdi-cursor-text:before{content:"\f05e7"}.mdi-curtains:before{content:"\f1846"}.mdi-curtains-closed:before{content:"\f1847"}.mdi-cylinder:before{content:"\f194e"}.mdi-cylinder-off:before{content:"\f194f"}.mdi-dance-ballroom:before{content:"\f15fb"}.mdi-dance-pole:before{content:"\f1578"}.mdi-data-matrix:before{content:"\f153c"}.mdi-data-matrix-edit:before{content:"\f153d"}.mdi-data-matrix-minus:before{content:"\f153e"}.mdi-data-matrix-plus:before{content:"\f153f"}.mdi-data-matrix-remove:before{content:"\f1540"}.mdi-data-matrix-scan:before{content:"\f1541"}.mdi-database:before{content:"\f01bc"}.mdi-database-alert:before{content:"\f163a"}.mdi-database-alert-outline:before{content:"\f1624"}.mdi-database-arrow-down:before{content:"\f163b"}.mdi-database-arrow-down-outline:before{content:"\f1625"}.mdi-database-arrow-left:before{content:"\f163c"}.mdi-database-arrow-left-outline:before{content:"\f1626"}.mdi-database-arrow-right:before{content:"\f163d"}.mdi-database-arrow-right-outline:before{content:"\f1627"}.mdi-database-arrow-up:before{content:"\f163e"}.mdi-database-arrow-up-outline:before{content:"\f1628"}.mdi-database-check:before{content:"\f0aa9"}.mdi-database-check-outline:before{content:"\f1629"}.mdi-database-clock:before{content:"\f163f"}.mdi-database-clock-outline:before{content:"\f162a"}.mdi-database-cog:before{content:"\f164b"}.mdi-database-cog-outline:before{content:"\f164c"}.mdi-database-edit:before{content:"\f0b86"}.mdi-database-edit-outline:before{content:"\f162b"}.mdi-database-export:before{content:"\f095e"}.mdi-database-export-outline:before{content:"\f162c"}.mdi-database-eye:before{content:"\f191f"}.mdi-database-eye-off:before{content:"\f1920"}.mdi-database-eye-off-outline:before{content:"\f1921"}.mdi-database-eye-outline:before{content:"\f1922"}.mdi-database-import:before{content:"\f095d"}.mdi-database-import-outline:before{content:"\f162d"}.mdi-database-lock:before{content:"\f0aaa"}.mdi-database-lock-outline:before{content:"\f162e"}.mdi-database-marker:before{content:"\f12f6"}.mdi-database-marker-outline:before{content:"\f162f"}.mdi-database-minus:before{content:"\f01bb"}.mdi-database-minus-outline:before{content:"\f1630"}.mdi-database-off:before{content:"\f1640"}.mdi-database-off-outline:before{content:"\f1631"}.mdi-database-outline:before{content:"\f1632"}.mdi-database-plus:before{content:"\f01ba"}.mdi-database-plus-outline:before{content:"\f1633"}.mdi-database-refresh:before{content:"\f05c2"}.mdi-database-refresh-outline:before{content:"\f1634"}.mdi-database-remove:before{content:"\f0d00"}.mdi-database-remove-outline:before{content:"\f1635"}.mdi-database-search:before{content:"\f0866"}.mdi-database-search-outline:before{content:"\f1636"}.mdi-database-settings:before{content:"\f0d01"}.mdi-database-settings-outline:before{content:"\f1637"}.mdi-database-sync:before{content:"\f0cff"}.mdi-database-sync-outline:before{content:"\f1638"}.mdi-death-star:before{content:"\f08d8"}.mdi-death-star-variant:before{content:"\f08d9"}.mdi-deathly-hallows:before{content:"\f0b87"}.mdi-debian:before{content:"\f08da"}.mdi-debug-step-into:before{content:"\f01b9"}.mdi-debug-step-out:before{content:"\f01b8"}.mdi-debug-step-over:before{content:"\f01b7"}.mdi-decagram:before{content:"\f076c"}.mdi-decagram-outline:before{content:"\f076d"}.mdi-decimal:before{content:"\f10a1"}.mdi-decimal-comma:before{content:"\f10a2"}.mdi-decimal-comma-decrease:before{content:"\f10a3"}.mdi-decimal-comma-increase:before{content:"\f10a4"}.mdi-decimal-decrease:before{content:"\f01b6"}.mdi-decimal-increase:before{content:"\f01b5"}.mdi-delete:before{content:"\f01b4"}.mdi-delete-alert:before{content:"\f10a5"}.mdi-delete-alert-outline:before{content:"\f10a6"}.mdi-delete-circle:before{content:"\f0683"}.mdi-delete-circle-outline:before{content:"\f0b88"}.mdi-delete-clock:before{content:"\f1556"}.mdi-delete-clock-outline:before{content:"\f1557"}.mdi-delete-empty:before{content:"\f06cc"}.mdi-delete-empty-outline:before{content:"\f0e9d"}.mdi-delete-forever:before{content:"\f05e8"}.mdi-delete-forever-outline:before{content:"\f0b89"}.mdi-delete-off:before{content:"\f10a7"}.mdi-delete-off-outline:before{content:"\f10a8"}.mdi-delete-outline:before{content:"\f09e7"}.mdi-delete-restore:before{content:"\f0819"}.mdi-delete-sweep:before{content:"\f05e9"}.mdi-delete-sweep-outline:before{content:"\f0c62"}.mdi-delete-variant:before{content:"\f01b3"}.mdi-delta:before{content:"\f01c2"}.mdi-desk:before{content:"\f1239"}.mdi-desk-lamp:before{content:"\f095f"}.mdi-desk-lamp-off:before{content:"\f1b1f"}.mdi-desk-lamp-on:before{content:"\f1b20"}.mdi-deskphone:before{content:"\f01c3"}.mdi-desktop-classic:before{content:"\f07c0"}.mdi-desktop-tower:before{content:"\f01c5"}.mdi-desktop-tower-monitor:before{content:"\f0aab"}.mdi-details:before{content:"\f01c6"}.mdi-dev-to:before{content:"\f0d6e"}.mdi-developer-board:before{content:"\f0697"}.mdi-deviantart:before{content:"\f01c7"}.mdi-devices:before{content:"\f0fb0"}.mdi-dharmachakra:before{content:"\f094b"}.mdi-diabetes:before{content:"\f1126"}.mdi-dialpad:before{content:"\f061c"}.mdi-diameter:before{content:"\f0c63"}.mdi-diameter-outline:before{content:"\f0c64"}.mdi-diameter-variant:before{content:"\f0c65"}.mdi-diamond:before{content:"\f0b8a"}.mdi-diamond-outline:before{content:"\f0b8b"}.mdi-diamond-stone:before{content:"\f01c8"}.mdi-diaper-outline:before{content:"\f1ccf"}.mdi-dice-1:before{content:"\f01ca"}.mdi-dice-1-outline:before{content:"\f114a"}.mdi-dice-2:before{content:"\f01cb"}.mdi-dice-2-outline:before{content:"\f114b"}.mdi-dice-3:before{content:"\f01cc"}.mdi-dice-3-outline:before{content:"\f114c"}.mdi-dice-4:before{content:"\f01cd"}.mdi-dice-4-outline:before{content:"\f114d"}.mdi-dice-5:before{content:"\f01ce"}.mdi-dice-5-outline:before{content:"\f114e"}.mdi-dice-6:before{content:"\f01cf"}.mdi-dice-6-outline:before{content:"\f114f"}.mdi-dice-d10:before{content:"\f1153"}.mdi-dice-d10-outline:before{content:"\f076f"}.mdi-dice-d12:before{content:"\f1154"}.mdi-dice-d12-outline:before{content:"\f0867"}.mdi-dice-d20:before{content:"\f1155"}.mdi-dice-d20-outline:before{content:"\f05ea"}.mdi-dice-d4:before{content:"\f1150"}.mdi-dice-d4-outline:before{content:"\f05eb"}.mdi-dice-d6:before{content:"\f1151"}.mdi-dice-d6-outline:before{content:"\f05ed"}.mdi-dice-d8:before{content:"\f1152"}.mdi-dice-d8-outline:before{content:"\f05ec"}.mdi-dice-multiple:before{content:"\f076e"}.mdi-dice-multiple-outline:before{content:"\f1156"}.mdi-digital-ocean:before{content:"\f1237"}.mdi-dip-switch:before{content:"\f07c1"}.mdi-directions:before{content:"\f01d0"}.mdi-directions-fork:before{content:"\f0641"}.mdi-disc:before{content:"\f05ee"}.mdi-disc-alert:before{content:"\f01d1"}.mdi-disc-player:before{content:"\f0960"}.mdi-dishwasher:before{content:"\f0aac"}.mdi-dishwasher-alert:before{content:"\f11b8"}.mdi-dishwasher-off:before{content:"\f11b9"}.mdi-disqus:before{content:"\f01d2"}.mdi-distribute-horizontal-center:before{content:"\f11c9"}.mdi-distribute-horizontal-left:before{content:"\f11c8"}.mdi-distribute-horizontal-right:before{content:"\f11ca"}.mdi-distribute-vertical-bottom:before{content:"\f11cb"}.mdi-distribute-vertical-center:before{content:"\f11cc"}.mdi-distribute-vertical-top:before{content:"\f11cd"}.mdi-diversify:before{content:"\f1877"}.mdi-diving:before{content:"\f1977"}.mdi-diving-flippers:before{content:"\f0dbf"}.mdi-diving-helmet:before{content:"\f0dc0"}.mdi-diving-scuba:before{content:"\f1b77"}.mdi-diving-scuba-flag:before{content:"\f0dc2"}.mdi-diving-scuba-mask:before{content:"\f0dc1"}.mdi-diving-scuba-tank:before{content:"\f0dc3"}.mdi-diving-scuba-tank-multiple:before{content:"\f0dc4"}.mdi-diving-snorkel:before{content:"\f0dc5"}.mdi-division:before{content:"\f01d4"}.mdi-division-box:before{content:"\f01d5"}.mdi-dlna:before{content:"\f0a41"}.mdi-dna:before{content:"\f0684"}.mdi-dns:before{content:"\f01d6"}.mdi-dns-outline:before{content:"\f0b8c"}.mdi-dock-bottom:before{content:"\f10a9"}.mdi-dock-left:before{content:"\f10aa"}.mdi-dock-right:before{content:"\f10ab"}.mdi-dock-top:before{content:"\f1513"}.mdi-dock-window:before{content:"\f10ac"}.mdi-docker:before{content:"\f0868"}.mdi-doctor:before{content:"\f0a42"}.mdi-dog:before{content:"\f0a43"}.mdi-dog-service:before{content:"\f0aad"}.mdi-dog-side:before{content:"\f0a44"}.mdi-dog-side-off:before{content:"\f16ee"}.mdi-dolby:before{content:"\f06b3"}.mdi-dolly:before{content:"\f0e9e"}.mdi-dolphin:before{content:"\f18b4"}.mdi-domain:before{content:"\f01d7"}.mdi-domain-off:before{content:"\f0d6f"}.mdi-domain-plus:before{content:"\f10ad"}.mdi-domain-remove:before{content:"\f10ae"}.mdi-domain-switch:before{content:"\f1c2c"}.mdi-dome-light:before{content:"\f141e"}.mdi-domino-mask:before{content:"\f1023"}.mdi-donkey:before{content:"\f07c2"}.mdi-door:before{content:"\f081a"}.mdi-door-closed:before{content:"\f081b"}.mdi-door-closed-cancel:before{content:"\f1c93"}.mdi-door-closed-lock:before{content:"\f10af"}.mdi-door-open:before{content:"\f081c"}.mdi-door-sliding:before{content:"\f181e"}.mdi-door-sliding-lock:before{content:"\f181f"}.mdi-door-sliding-open:before{content:"\f1820"}.mdi-doorbell:before{content:"\f12e6"}.mdi-doorbell-video:before{content:"\f0869"}.mdi-dot-net:before{content:"\f0aae"}.mdi-dots-circle:before{content:"\f1978"}.mdi-dots-grid:before{content:"\f15fc"}.mdi-dots-hexagon:before{content:"\f15ff"}.mdi-dots-horizontal:before{content:"\f01d8"}.mdi-dots-horizontal-circle:before{content:"\f07c3"}.mdi-dots-horizontal-circle-outline:before{content:"\f0b8d"}.mdi-dots-square:before{content:"\f15fd"}.mdi-dots-triangle:before{content:"\f15fe"}.mdi-dots-vertical:before{content:"\f01d9"}.mdi-dots-vertical-circle:before{content:"\f07c4"}.mdi-dots-vertical-circle-outline:before{content:"\f0b8e"}.mdi-download:before{content:"\f01da"}.mdi-download-box:before{content:"\f1462"}.mdi-download-box-outline:before{content:"\f1463"}.mdi-download-circle:before{content:"\f1464"}.mdi-download-circle-outline:before{content:"\f1465"}.mdi-download-lock:before{content:"\f1320"}.mdi-download-lock-outline:before{content:"\f1321"}.mdi-download-multiple:before{content:"\f09e9"}.mdi-download-multiple-outline:before{content:"\f1cd0"}.mdi-download-network:before{content:"\f06f4"}.mdi-download-network-outline:before{content:"\f0c66"}.mdi-download-off:before{content:"\f10b0"}.mdi-download-off-outline:before{content:"\f10b1"}.mdi-download-outline:before{content:"\f0b8f"}.mdi-drag:before{content:"\f01db"}.mdi-drag-horizontal:before{content:"\f01dc"}.mdi-drag-horizontal-variant:before{content:"\f12f0"}.mdi-drag-variant:before{content:"\f0b90"}.mdi-drag-vertical:before{content:"\f01dd"}.mdi-drag-vertical-variant:before{content:"\f12f1"}.mdi-drama-masks:before{content:"\f0d02"}.mdi-draw:before{content:"\f0f49"}.mdi-draw-pen:before{content:"\f19b9"}.mdi-drawing:before{content:"\f01de"}.mdi-drawing-box:before{content:"\f01df"}.mdi-dresser:before{content:"\f0f4a"}.mdi-dresser-outline:before{content:"\f0f4b"}.mdi-drone:before{content:"\f01e2"}.mdi-dropbox:before{content:"\f01e3"}.mdi-drupal:before{content:"\f01e4"}.mdi-duck:before{content:"\f01e5"}.mdi-dumbbell:before{content:"\f01e6"}.mdi-dump-truck:before{content:"\f0c67"}.mdi-ear-hearing:before{content:"\f07c5"}.mdi-ear-hearing-loop:before{content:"\f1aee"}.mdi-ear-hearing-off:before{content:"\f0a45"}.mdi-earbuds:before{content:"\f184f"}.mdi-earbuds-off:before{content:"\f1850"}.mdi-earbuds-off-outline:before{content:"\f1851"}.mdi-earbuds-outline:before{content:"\f1852"}.mdi-earth:before{content:"\f01e7"}.mdi-earth-arrow-down:before{content:"\f1c87"}.mdi-earth-arrow-left:before{content:"\f1c88"}.mdi-earth-arrow-right:before{content:"\f1311"}.mdi-earth-arrow-up:before{content:"\f1c89"}.mdi-earth-box:before{content:"\f06cd"}.mdi-earth-box-minus:before{content:"\f1407"}.mdi-earth-box-off:before{content:"\f06ce"}.mdi-earth-box-plus:before{content:"\f1406"}.mdi-earth-box-remove:before{content:"\f1408"}.mdi-earth-minus:before{content:"\f1404"}.mdi-earth-off:before{content:"\f01e8"}.mdi-earth-plus:before{content:"\f1403"}.mdi-earth-remove:before{content:"\f1405"}.mdi-egg:before{content:"\f0aaf"}.mdi-egg-easter:before{content:"\f0ab0"}.mdi-egg-fried:before{content:"\f184a"}.mdi-egg-off:before{content:"\f13f0"}.mdi-egg-off-outline:before{content:"\f13f1"}.mdi-egg-outline:before{content:"\f13f2"}.mdi-eiffel-tower:before{content:"\f156b"}.mdi-eight-track:before{content:"\f09ea"}.mdi-eject:before{content:"\f01ea"}.mdi-eject-circle:before{content:"\f1b23"}.mdi-eject-circle-outline:before{content:"\f1b24"}.mdi-eject-outline:before{content:"\f0b91"}.mdi-electric-switch:before{content:"\f0e9f"}.mdi-electric-switch-closed:before{content:"\f10d9"}.mdi-electron-framework:before{content:"\f1024"}.mdi-elephant:before{content:"\f07c6"}.mdi-elevation-decline:before{content:"\f01eb"}.mdi-elevation-rise:before{content:"\f01ec"}.mdi-elevator:before{content:"\f01ed"}.mdi-elevator-down:before{content:"\f12c2"}.mdi-elevator-passenger:before{content:"\f1381"}.mdi-elevator-passenger-off:before{content:"\f1979"}.mdi-elevator-passenger-off-outline:before{content:"\f197a"}.mdi-elevator-passenger-outline:before{content:"\f197b"}.mdi-elevator-up:before{content:"\f12c1"}.mdi-ellipse:before{content:"\f0ea0"}.mdi-ellipse-outline:before{content:"\f0ea1"}.mdi-email:before{content:"\f01ee"}.mdi-email-alert:before{content:"\f06cf"}.mdi-email-alert-outline:before{content:"\f0d42"}.mdi-email-arrow-left:before{content:"\f10da"}.mdi-email-arrow-left-outline:before{content:"\f10db"}.mdi-email-arrow-right:before{content:"\f10dc"}.mdi-email-arrow-right-outline:before{content:"\f10dd"}.mdi-email-box:before{content:"\f0d03"}.mdi-email-check:before{content:"\f0ab1"}.mdi-email-check-outline:before{content:"\f0ab2"}.mdi-email-edit:before{content:"\f0ee3"}.mdi-email-edit-outline:before{content:"\f0ee4"}.mdi-email-fast:before{content:"\f186f"}.mdi-email-fast-outline:before{content:"\f1870"}.mdi-email-heart-outline:before{content:"\f1c5b"}.mdi-email-lock:before{content:"\f01f1"}.mdi-email-lock-outline:before{content:"\f1b61"}.mdi-email-mark-as-unread:before{content:"\f0b92"}.mdi-email-minus:before{content:"\f0ee5"}.mdi-email-minus-outline:before{content:"\f0ee6"}.mdi-email-multiple:before{content:"\f0ee7"}.mdi-email-multiple-outline:before{content:"\f0ee8"}.mdi-email-newsletter:before{content:"\f0fb1"}.mdi-email-off:before{content:"\f13e3"}.mdi-email-off-outline:before{content:"\f13e4"}.mdi-email-open:before{content:"\f01ef"}.mdi-email-open-heart-outline:before{content:"\f1c5c"}.mdi-email-open-multiple:before{content:"\f0ee9"}.mdi-email-open-multiple-outline:before{content:"\f0eea"}.mdi-email-open-outline:before{content:"\f05ef"}.mdi-email-outline:before{content:"\f01f0"}.mdi-email-plus:before{content:"\f09eb"}.mdi-email-plus-outline:before{content:"\f09ec"}.mdi-email-remove:before{content:"\f1661"}.mdi-email-remove-outline:before{content:"\f1662"}.mdi-email-seal:before{content:"\f195b"}.mdi-email-seal-outline:before{content:"\f195c"}.mdi-email-search:before{content:"\f0961"}.mdi-email-search-outline:before{content:"\f0962"}.mdi-email-sync:before{content:"\f12c7"}.mdi-email-sync-outline:before{content:"\f12c8"}.mdi-email-variant:before{content:"\f05f0"}.mdi-ember:before{content:"\f0b30"}.mdi-emby:before{content:"\f06b4"}.mdi-emoticon:before{content:"\f0c68"}.mdi-emoticon-angry:before{content:"\f0c69"}.mdi-emoticon-angry-outline:before{content:"\f0c6a"}.mdi-emoticon-confused:before{content:"\f10de"}.mdi-emoticon-confused-outline:before{content:"\f10df"}.mdi-emoticon-cool:before{content:"\f0c6b"}.mdi-emoticon-cool-outline:before{content:"\f01f3"}.mdi-emoticon-cry:before{content:"\f0c6c"}.mdi-emoticon-cry-outline:before{content:"\f0c6d"}.mdi-emoticon-dead:before{content:"\f0c6e"}.mdi-emoticon-dead-outline:before{content:"\f069b"}.mdi-emoticon-devil:before{content:"\f0c6f"}.mdi-emoticon-devil-outline:before{content:"\f01f4"}.mdi-emoticon-excited:before{content:"\f0c70"}.mdi-emoticon-excited-outline:before{content:"\f069c"}.mdi-emoticon-frown:before{content:"\f0f4c"}.mdi-emoticon-frown-outline:before{content:"\f0f4d"}.mdi-emoticon-happy:before{content:"\f0c71"}.mdi-emoticon-happy-outline:before{content:"\f01f5"}.mdi-emoticon-kiss:before{content:"\f0c72"}.mdi-emoticon-kiss-outline:before{content:"\f0c73"}.mdi-emoticon-lol:before{content:"\f1214"}.mdi-emoticon-lol-outline:before{content:"\f1215"}.mdi-emoticon-minus:before{content:"\f1cb2"}.mdi-emoticon-minus-outline:before{content:"\f1cb3"}.mdi-emoticon-neutral:before{content:"\f0c74"}.mdi-emoticon-neutral-outline:before{content:"\f01f6"}.mdi-emoticon-outline:before{content:"\f01f2"}.mdi-emoticon-plus:before{content:"\f1cb4"}.mdi-emoticon-plus-outline:before{content:"\f1cb5"}.mdi-emoticon-poop:before{content:"\f01f7"}.mdi-emoticon-poop-outline:before{content:"\f0c75"}.mdi-emoticon-remove:before{content:"\f1cb6"}.mdi-emoticon-remove-outline:before{content:"\f1cb7"}.mdi-emoticon-sad:before{content:"\f0c76"}.mdi-emoticon-sad-outline:before{content:"\f01f8"}.mdi-emoticon-sick:before{content:"\f157c"}.mdi-emoticon-sick-outline:before{content:"\f157d"}.mdi-emoticon-tongue:before{content:"\f01f9"}.mdi-emoticon-tongue-outline:before{content:"\f0c77"}.mdi-emoticon-wink:before{content:"\f0c78"}.mdi-emoticon-wink-outline:before{content:"\f0c79"}.mdi-engine:before{content:"\f01fa"}.mdi-engine-off:before{content:"\f0a46"}.mdi-engine-off-outline:before{content:"\f0a47"}.mdi-engine-outline:before{content:"\f01fb"}.mdi-epsilon:before{content:"\f10e0"}.mdi-equal:before{content:"\f01fc"}.mdi-equal-box:before{content:"\f01fd"}.mdi-equalizer:before{content:"\f0ea2"}.mdi-equalizer-outline:before{content:"\f0ea3"}.mdi-eraser:before{content:"\f01fe"}.mdi-eraser-variant:before{content:"\f0642"}.mdi-escalator:before{content:"\f01ff"}.mdi-escalator-box:before{content:"\f1399"}.mdi-escalator-down:before{content:"\f12c0"}.mdi-escalator-up:before{content:"\f12bf"}.mdi-eslint:before{content:"\f0c7a"}.mdi-et:before{content:"\f0ab3"}.mdi-ethereum:before{content:"\f086a"}.mdi-ethernet:before{content:"\f0200"}.mdi-ethernet-cable:before{content:"\f0201"}.mdi-ethernet-cable-off:before{content:"\f0202"}.mdi-ethernet-off:before{content:"\f1cd1"}.mdi-ev-plug-ccs1:before{content:"\f1519"}.mdi-ev-plug-ccs2:before{content:"\f151a"}.mdi-ev-plug-chademo:before{content:"\f151b"}.mdi-ev-plug-tesla:before{content:"\f151c"}.mdi-ev-plug-type1:before{content:"\f151d"}.mdi-ev-plug-type2:before{content:"\f151e"}.mdi-ev-station:before{content:"\f05f1"}.mdi-evernote:before{content:"\f0204"}.mdi-excavator:before{content:"\f1025"}.mdi-exclamation:before{content:"\f0205"}.mdi-exclamation-thick:before{content:"\f1238"}.mdi-exit-run:before{content:"\f0a48"}.mdi-exit-to-app:before{content:"\f0206"}.mdi-expand-all:before{content:"\f0ab4"}.mdi-expand-all-outline:before{content:"\f0ab5"}.mdi-expansion-card:before{content:"\f08ae"}.mdi-expansion-card-variant:before{content:"\f0fb2"}.mdi-exponent:before{content:"\f0963"}.mdi-exponent-box:before{content:"\f0964"}.mdi-export:before{content:"\f0207"}.mdi-export-variant:before{content:"\f0b93"}.mdi-eye:before{content:"\f0208"}.mdi-eye-arrow-left:before{content:"\f18fd"}.mdi-eye-arrow-left-outline:before{content:"\f18fe"}.mdi-eye-arrow-right:before{content:"\f18ff"}.mdi-eye-arrow-right-outline:before{content:"\f1900"}.mdi-eye-check:before{content:"\f0d04"}.mdi-eye-check-outline:before{content:"\f0d05"}.mdi-eye-circle:before{content:"\f0b94"}.mdi-eye-circle-outline:before{content:"\f0b95"}.mdi-eye-closed:before{content:"\f1ca3"}.mdi-eye-lock:before{content:"\f1c06"}.mdi-eye-lock-open:before{content:"\f1c07"}.mdi-eye-lock-open-outline:before{content:"\f1c08"}.mdi-eye-lock-outline:before{content:"\f1c09"}.mdi-eye-minus:before{content:"\f1026"}.mdi-eye-minus-outline:before{content:"\f1027"}.mdi-eye-off:before{content:"\f0209"}.mdi-eye-off-outline:before{content:"\f06d1"}.mdi-eye-outline:before{content:"\f06d0"}.mdi-eye-plus:before{content:"\f086b"}.mdi-eye-plus-outline:before{content:"\f086c"}.mdi-eye-refresh:before{content:"\f197c"}.mdi-eye-refresh-outline:before{content:"\f197d"}.mdi-eye-remove:before{content:"\f15e3"}.mdi-eye-remove-outline:before{content:"\f15e4"}.mdi-eye-settings:before{content:"\f086d"}.mdi-eye-settings-outline:before{content:"\f086e"}.mdi-eyedropper:before{content:"\f020a"}.mdi-eyedropper-minus:before{content:"\f13dd"}.mdi-eyedropper-off:before{content:"\f13df"}.mdi-eyedropper-plus:before{content:"\f13dc"}.mdi-eyedropper-remove:before{content:"\f13de"}.mdi-eyedropper-variant:before{content:"\f020b"}.mdi-face-agent:before{content:"\f0d70"}.mdi-face-man:before{content:"\f0643"}.mdi-face-man-outline:before{content:"\f0b96"}.mdi-face-man-profile:before{content:"\f0644"}.mdi-face-man-shimmer:before{content:"\f15cc"}.mdi-face-man-shimmer-outline:before{content:"\f15cd"}.mdi-face-mask:before{content:"\f1586"}.mdi-face-mask-outline:before{content:"\f1587"}.mdi-face-recognition:before{content:"\f0c7b"}.mdi-face-woman:before{content:"\f1077"}.mdi-face-woman-outline:before{content:"\f1078"}.mdi-face-woman-profile:before{content:"\f1076"}.mdi-face-woman-shimmer:before{content:"\f15ce"}.mdi-face-woman-shimmer-outline:before{content:"\f15cf"}.mdi-facebook:before{content:"\f020c"}.mdi-facebook-gaming:before{content:"\f07dd"}.mdi-facebook-messenger:before{content:"\f020e"}.mdi-facebook-workplace:before{content:"\f0b31"}.mdi-factory:before{content:"\f020f"}.mdi-family-tree:before{content:"\f160e"}.mdi-fan:before{content:"\f0210"}.mdi-fan-alert:before{content:"\f146c"}.mdi-fan-auto:before{content:"\f171d"}.mdi-fan-chevron-down:before{content:"\f146d"}.mdi-fan-chevron-up:before{content:"\f146e"}.mdi-fan-clock:before{content:"\f1a3a"}.mdi-fan-minus:before{content:"\f1470"}.mdi-fan-off:before{content:"\f081d"}.mdi-fan-plus:before{content:"\f146f"}.mdi-fan-remove:before{content:"\f1471"}.mdi-fan-speed-1:before{content:"\f1472"}.mdi-fan-speed-2:before{content:"\f1473"}.mdi-fan-speed-3:before{content:"\f1474"}.mdi-fast-forward:before{content:"\f0211"}.mdi-fast-forward-10:before{content:"\f0d71"}.mdi-fast-forward-15:before{content:"\f193a"}.mdi-fast-forward-30:before{content:"\f0d06"}.mdi-fast-forward-45:before{content:"\f1b12"}.mdi-fast-forward-5:before{content:"\f11f8"}.mdi-fast-forward-60:before{content:"\f160b"}.mdi-fast-forward-outline:before{content:"\f06d2"}.mdi-faucet:before{content:"\f1b29"}.mdi-faucet-variant:before{content:"\f1b2a"}.mdi-fax:before{content:"\f0212"}.mdi-feather:before{content:"\f06d3"}.mdi-feature-search:before{content:"\f0a49"}.mdi-feature-search-outline:before{content:"\f0a4a"}.mdi-fedora:before{content:"\f08db"}.mdi-fence:before{content:"\f179a"}.mdi-fence-electric:before{content:"\f17f6"}.mdi-fencing:before{content:"\f14c1"}.mdi-ferris-wheel:before{content:"\f0ea4"}.mdi-ferry:before{content:"\f0213"}.mdi-file:before{content:"\f0214"}.mdi-file-account:before{content:"\f073b"}.mdi-file-account-outline:before{content:"\f1028"}.mdi-file-alert:before{content:"\f0a4b"}.mdi-file-alert-outline:before{content:"\f0a4c"}.mdi-file-arrow-left-right:before{content:"\f1a93"}.mdi-file-arrow-left-right-outline:before{content:"\f1a94"}.mdi-file-arrow-up-down:before{content:"\f1a95"}.mdi-file-arrow-up-down-outline:before{content:"\f1a96"}.mdi-file-cabinet:before{content:"\f0ab6"}.mdi-file-cad:before{content:"\f0eeb"}.mdi-file-cad-box:before{content:"\f0eec"}.mdi-file-cancel:before{content:"\f0dc6"}.mdi-file-cancel-outline:before{content:"\f0dc7"}.mdi-file-certificate:before{content:"\f1186"}.mdi-file-certificate-outline:before{content:"\f1187"}.mdi-file-chart:before{content:"\f0215"}.mdi-file-chart-check:before{content:"\f19c6"}.mdi-file-chart-check-outline:before{content:"\f19c7"}.mdi-file-chart-outline:before{content:"\f1029"}.mdi-file-check:before{content:"\f0216"}.mdi-file-check-outline:before{content:"\f0e29"}.mdi-file-clock:before{content:"\f12e1"}.mdi-file-clock-outline:before{content:"\f12e2"}.mdi-file-cloud:before{content:"\f0217"}.mdi-file-cloud-outline:before{content:"\f102a"}.mdi-file-code:before{content:"\f022e"}.mdi-file-code-outline:before{content:"\f102b"}.mdi-file-cog:before{content:"\f107b"}.mdi-file-cog-outline:before{content:"\f107c"}.mdi-file-compare:before{content:"\f08aa"}.mdi-file-delimited:before{content:"\f0218"}.mdi-file-delimited-outline:before{content:"\f0ea5"}.mdi-file-document:before{content:"\f0219"}.mdi-file-document-alert:before{content:"\f1a97"}.mdi-file-document-alert-outline:before{content:"\f1a98"}.mdi-file-document-arrow-right:before{content:"\f1c0f"}.mdi-file-document-arrow-right-outline:before{content:"\f1c10"}.mdi-file-document-check:before{content:"\f1a99"}.mdi-file-document-check-outline:before{content:"\f1a9a"}.mdi-file-document-edit:before{content:"\f0dc8"}.mdi-file-document-edit-outline:before{content:"\f0dc9"}.mdi-file-document-minus:before{content:"\f1a9b"}.mdi-file-document-minus-outline:before{content:"\f1a9c"}.mdi-file-document-multiple:before{content:"\f1517"}.mdi-file-document-multiple-outline:before{content:"\f1518"}.mdi-file-document-outline:before{content:"\f09ee"}.mdi-file-document-plus:before{content:"\f1a9d"}.mdi-file-document-plus-outline:before{content:"\f1a9e"}.mdi-file-document-refresh:before{content:"\f1c7a"}.mdi-file-document-refresh-outline:before{content:"\f1c7b"}.mdi-file-document-remove:before{content:"\f1a9f"}.mdi-file-document-remove-outline:before{content:"\f1aa0"}.mdi-file-download:before{content:"\f0965"}.mdi-file-download-outline:before{content:"\f0966"}.mdi-file-edit:before{content:"\f11e7"}.mdi-file-edit-outline:before{content:"\f11e8"}.mdi-file-excel:before{content:"\f021b"}.mdi-file-excel-box:before{content:"\f021c"}.mdi-file-excel-box-outline:before{content:"\f102c"}.mdi-file-excel-outline:before{content:"\f102d"}.mdi-file-export:before{content:"\f021d"}.mdi-file-export-outline:before{content:"\f102e"}.mdi-file-eye:before{content:"\f0dca"}.mdi-file-eye-outline:before{content:"\f0dcb"}.mdi-file-find:before{content:"\f021e"}.mdi-file-find-outline:before{content:"\f0b97"}.mdi-file-gif-box:before{content:"\f0d78"}.mdi-file-hidden:before{content:"\f0613"}.mdi-file-image:before{content:"\f021f"}.mdi-file-image-marker:before{content:"\f1772"}.mdi-file-image-marker-outline:before{content:"\f1773"}.mdi-file-image-minus:before{content:"\f193b"}.mdi-file-image-minus-outline:before{content:"\f193c"}.mdi-file-image-outline:before{content:"\f0eb0"}.mdi-file-image-plus:before{content:"\f193d"}.mdi-file-image-plus-outline:before{content:"\f193e"}.mdi-file-image-remove:before{content:"\f193f"}.mdi-file-image-remove-outline:before{content:"\f1940"}.mdi-file-import:before{content:"\f0220"}.mdi-file-import-outline:before{content:"\f102f"}.mdi-file-jpg-box:before{content:"\f0225"}.mdi-file-key:before{content:"\f1184"}.mdi-file-key-outline:before{content:"\f1185"}.mdi-file-link:before{content:"\f1177"}.mdi-file-link-outline:before{content:"\f1178"}.mdi-file-lock:before{content:"\f0221"}.mdi-file-lock-open:before{content:"\f19c8"}.mdi-file-lock-open-outline:before{content:"\f19c9"}.mdi-file-lock-outline:before{content:"\f1030"}.mdi-file-marker:before{content:"\f1774"}.mdi-file-marker-outline:before{content:"\f1775"}.mdi-file-minus:before{content:"\f1aa1"}.mdi-file-minus-outline:before{content:"\f1aa2"}.mdi-file-move:before{content:"\f0ab9"}.mdi-file-move-outline:before{content:"\f1031"}.mdi-file-multiple:before{content:"\f0222"}.mdi-file-multiple-outline:before{content:"\f1032"}.mdi-file-music:before{content:"\f0223"}.mdi-file-music-outline:before{content:"\f0e2a"}.mdi-file-outline:before{content:"\f0224"}.mdi-file-pdf-box:before{content:"\f0226"}.mdi-file-percent:before{content:"\f081e"}.mdi-file-percent-outline:before{content:"\f1033"}.mdi-file-phone:before{content:"\f1179"}.mdi-file-phone-outline:before{content:"\f117a"}.mdi-file-plus:before{content:"\f0752"}.mdi-file-plus-outline:before{content:"\f0eed"}.mdi-file-png-box:before{content:"\f0e2d"}.mdi-file-powerpoint:before{content:"\f0227"}.mdi-file-powerpoint-box:before{content:"\f0228"}.mdi-file-powerpoint-box-outline:before{content:"\f1034"}.mdi-file-powerpoint-outline:before{content:"\f1035"}.mdi-file-presentation-box:before{content:"\f0229"}.mdi-file-question:before{content:"\f086f"}.mdi-file-question-outline:before{content:"\f1036"}.mdi-file-refresh:before{content:"\f0918"}.mdi-file-refresh-outline:before{content:"\f0541"}.mdi-file-remove:before{content:"\f0b98"}.mdi-file-remove-outline:before{content:"\f1037"}.mdi-file-replace:before{content:"\f0b32"}.mdi-file-replace-outline:before{content:"\f0b33"}.mdi-file-restore:before{content:"\f0670"}.mdi-file-restore-outline:before{content:"\f1038"}.mdi-file-rotate-left:before{content:"\f1a3b"}.mdi-file-rotate-left-outline:before{content:"\f1a3c"}.mdi-file-rotate-right:before{content:"\f1a3d"}.mdi-file-rotate-right-outline:before{content:"\f1a3e"}.mdi-file-search:before{content:"\f0c7c"}.mdi-file-search-outline:before{content:"\f0c7d"}.mdi-file-send:before{content:"\f022a"}.mdi-file-send-outline:before{content:"\f1039"}.mdi-file-settings:before{content:"\f1079"}.mdi-file-settings-outline:before{content:"\f107a"}.mdi-file-sign:before{content:"\f19c3"}.mdi-file-star:before{content:"\f103a"}.mdi-file-star-four-points:before{content:"\f1c2d"}.mdi-file-star-four-points-outline:before{content:"\f1c2e"}.mdi-file-star-outline:before{content:"\f103b"}.mdi-file-swap:before{content:"\f0fb4"}.mdi-file-swap-outline:before{content:"\f0fb5"}.mdi-file-sync:before{content:"\f1216"}.mdi-file-sync-outline:before{content:"\f1217"}.mdi-file-table:before{content:"\f0c7e"}.mdi-file-table-box:before{content:"\f10e1"}.mdi-file-table-box-multiple:before{content:"\f10e2"}.mdi-file-table-box-multiple-outline:before{content:"\f10e3"}.mdi-file-table-box-outline:before{content:"\f10e4"}.mdi-file-table-outline:before{content:"\f0c7f"}.mdi-file-tree:before{content:"\f0645"}.mdi-file-tree-outline:before{content:"\f13d2"}.mdi-file-undo:before{content:"\f08dc"}.mdi-file-undo-outline:before{content:"\f103c"}.mdi-file-upload:before{content:"\f0a4d"}.mdi-file-upload-outline:before{content:"\f0a4e"}.mdi-file-video:before{content:"\f022b"}.mdi-file-video-outline:before{content:"\f0e2c"}.mdi-file-word:before{content:"\f022c"}.mdi-file-word-box:before{content:"\f022d"}.mdi-file-word-box-outline:before{content:"\f103d"}.mdi-file-word-outline:before{content:"\f103e"}.mdi-file-xml-box:before{content:"\f1b4b"}.mdi-film:before{content:"\f022f"}.mdi-filmstrip:before{content:"\f0230"}.mdi-filmstrip-box:before{content:"\f0332"}.mdi-filmstrip-box-multiple:before{content:"\f0d18"}.mdi-filmstrip-off:before{content:"\f0231"}.mdi-filter:before{content:"\f0232"}.mdi-filter-check:before{content:"\f18ec"}.mdi-filter-check-outline:before{content:"\f18ed"}.mdi-filter-cog:before{content:"\f1aa3"}.mdi-filter-cog-outline:before{content:"\f1aa4"}.mdi-filter-menu:before{content:"\f10e5"}.mdi-filter-menu-outline:before{content:"\f10e6"}.mdi-filter-minus:before{content:"\f0eee"}.mdi-filter-minus-outline:before{content:"\f0eef"}.mdi-filter-multiple:before{content:"\f1a3f"}.mdi-filter-multiple-outline:before{content:"\f1a40"}.mdi-filter-off:before{content:"\f14ef"}.mdi-filter-off-outline:before{content:"\f14f0"}.mdi-filter-outline:before{content:"\f0233"}.mdi-filter-plus:before{content:"\f0ef0"}.mdi-filter-plus-outline:before{content:"\f0ef1"}.mdi-filter-remove:before{content:"\f0234"}.mdi-filter-remove-outline:before{content:"\f0235"}.mdi-filter-settings:before{content:"\f1aa5"}.mdi-filter-settings-outline:before{content:"\f1aa6"}.mdi-filter-variant:before{content:"\f0236"}.mdi-filter-variant-minus:before{content:"\f1112"}.mdi-filter-variant-plus:before{content:"\f1113"}.mdi-filter-variant-remove:before{content:"\f103f"}.mdi-finance:before{content:"\f081f"}.mdi-find-replace:before{content:"\f06d4"}.mdi-fingerprint:before{content:"\f0237"}.mdi-fingerprint-off:before{content:"\f0eb1"}.mdi-fire:before{content:"\f0238"}.mdi-fire-alert:before{content:"\f15d7"}.mdi-fire-circle:before{content:"\f1807"}.mdi-fire-extinguisher:before{content:"\f0ef2"}.mdi-fire-hydrant:before{content:"\f1137"}.mdi-fire-hydrant-alert:before{content:"\f1138"}.mdi-fire-hydrant-off:before{content:"\f1139"}.mdi-fire-off:before{content:"\f1722"}.mdi-fire-station:before{content:"\f1cc3"}.mdi-fire-truck:before{content:"\f08ab"}.mdi-firebase:before{content:"\f0967"}.mdi-firefox:before{content:"\f0239"}.mdi-fireplace:before{content:"\f0e2e"}.mdi-fireplace-off:before{content:"\f0e2f"}.mdi-firewire:before{content:"\f05be"}.mdi-firework:before{content:"\f0e30"}.mdi-firework-off:before{content:"\f1723"}.mdi-fish:before{content:"\f023a"}.mdi-fish-off:before{content:"\f13f3"}.mdi-fishbowl:before{content:"\f0ef3"}.mdi-fishbowl-outline:before{content:"\f0ef4"}.mdi-fit-to-page:before{content:"\f0ef5"}.mdi-fit-to-page-outline:before{content:"\f0ef6"}.mdi-fit-to-screen:before{content:"\f18f4"}.mdi-fit-to-screen-outline:before{content:"\f18f5"}.mdi-flag:before{content:"\f023b"}.mdi-flag-checkered:before{content:"\f023c"}.mdi-flag-minus:before{content:"\f0b99"}.mdi-flag-minus-outline:before{content:"\f10b2"}.mdi-flag-off:before{content:"\f18ee"}.mdi-flag-off-outline:before{content:"\f18ef"}.mdi-flag-outline:before{content:"\f023d"}.mdi-flag-plus:before{content:"\f0b9a"}.mdi-flag-plus-outline:before{content:"\f10b3"}.mdi-flag-remove:before{content:"\f0b9b"}.mdi-flag-remove-outline:before{content:"\f10b4"}.mdi-flag-triangle:before{content:"\f023f"}.mdi-flag-variant:before{content:"\f0240"}.mdi-flag-variant-minus:before{content:"\f1bb4"}.mdi-flag-variant-minus-outline:before{content:"\f1bb5"}.mdi-flag-variant-off:before{content:"\f1bb0"}.mdi-flag-variant-off-outline:before{content:"\f1bb1"}.mdi-flag-variant-outline:before{content:"\f023e"}.mdi-flag-variant-plus:before{content:"\f1bb2"}.mdi-flag-variant-plus-outline:before{content:"\f1bb3"}.mdi-flag-variant-remove:before{content:"\f1bb6"}.mdi-flag-variant-remove-outline:before{content:"\f1bb7"}.mdi-flare:before{content:"\f0d72"}.mdi-flash:before{content:"\f0241"}.mdi-flash-alert:before{content:"\f0ef7"}.mdi-flash-alert-outline:before{content:"\f0ef8"}.mdi-flash-auto:before{content:"\f0242"}.mdi-flash-off:before{content:"\f0243"}.mdi-flash-off-outline:before{content:"\f1b45"}.mdi-flash-outline:before{content:"\f06d5"}.mdi-flash-red-eye:before{content:"\f067b"}.mdi-flash-triangle:before{content:"\f1b1d"}.mdi-flash-triangle-outline:before{content:"\f1b1e"}.mdi-flashlight:before{content:"\f0244"}.mdi-flashlight-off:before{content:"\f0245"}.mdi-flask:before{content:"\f0093"}.mdi-flask-empty:before{content:"\f0094"}.mdi-flask-empty-minus:before{content:"\f123a"}.mdi-flask-empty-minus-outline:before{content:"\f123b"}.mdi-flask-empty-off:before{content:"\f13f4"}.mdi-flask-empty-off-outline:before{content:"\f13f5"}.mdi-flask-empty-outline:before{content:"\f0095"}.mdi-flask-empty-plus:before{content:"\f123c"}.mdi-flask-empty-plus-outline:before{content:"\f123d"}.mdi-flask-empty-remove:before{content:"\f123e"}.mdi-flask-empty-remove-outline:before{content:"\f123f"}.mdi-flask-minus:before{content:"\f1240"}.mdi-flask-minus-outline:before{content:"\f1241"}.mdi-flask-off:before{content:"\f13f6"}.mdi-flask-off-outline:before{content:"\f13f7"}.mdi-flask-outline:before{content:"\f0096"}.mdi-flask-plus:before{content:"\f1242"}.mdi-flask-plus-outline:before{content:"\f1243"}.mdi-flask-remove:before{content:"\f1244"}.mdi-flask-remove-outline:before{content:"\f1245"}.mdi-flask-round-bottom:before{content:"\f124b"}.mdi-flask-round-bottom-empty:before{content:"\f124c"}.mdi-flask-round-bottom-empty-outline:before{content:"\f124d"}.mdi-flask-round-bottom-outline:before{content:"\f124e"}.mdi-fleur-de-lis:before{content:"\f1303"}.mdi-flip-horizontal:before{content:"\f10e7"}.mdi-flip-to-back:before{content:"\f0247"}.mdi-flip-to-front:before{content:"\f0248"}.mdi-flip-vertical:before{content:"\f10e8"}.mdi-floor-lamp:before{content:"\f08dd"}.mdi-floor-lamp-dual:before{content:"\f1040"}.mdi-floor-lamp-dual-outline:before{content:"\f17ce"}.mdi-floor-lamp-outline:before{content:"\f17c8"}.mdi-floor-lamp-torchiere:before{content:"\f1747"}.mdi-floor-lamp-torchiere-outline:before{content:"\f17d6"}.mdi-floor-lamp-torchiere-variant:before{content:"\f1041"}.mdi-floor-lamp-torchiere-variant-outline:before{content:"\f17cf"}.mdi-floor-plan:before{content:"\f0821"}.mdi-floppy:before{content:"\f0249"}.mdi-floppy-variant:before{content:"\f09ef"}.mdi-flower:before{content:"\f024a"}.mdi-flower-outline:before{content:"\f09f0"}.mdi-flower-pollen:before{content:"\f1885"}.mdi-flower-pollen-outline:before{content:"\f1886"}.mdi-flower-poppy:before{content:"\f0d08"}.mdi-flower-tulip:before{content:"\f09f1"}.mdi-flower-tulip-outline:before{content:"\f09f2"}.mdi-focus-auto:before{content:"\f0f4e"}.mdi-focus-field:before{content:"\f0f4f"}.mdi-focus-field-horizontal:before{content:"\f0f50"}.mdi-focus-field-vertical:before{content:"\f0f51"}.mdi-folder:before{content:"\f024b"}.mdi-folder-account:before{content:"\f024c"}.mdi-folder-account-outline:before{content:"\f0b9c"}.mdi-folder-alert:before{content:"\f0dcc"}.mdi-folder-alert-outline:before{content:"\f0dcd"}.mdi-folder-arrow-down:before{content:"\f19e8"}.mdi-folder-arrow-down-outline:before{content:"\f19e9"}.mdi-folder-arrow-left:before{content:"\f19ea"}.mdi-folder-arrow-left-outline:before{content:"\f19eb"}.mdi-folder-arrow-left-right:before{content:"\f19ec"}.mdi-folder-arrow-left-right-outline:before{content:"\f19ed"}.mdi-folder-arrow-right:before{content:"\f19ee"}.mdi-folder-arrow-right-outline:before{content:"\f19ef"}.mdi-folder-arrow-up:before{content:"\f19f0"}.mdi-folder-arrow-up-down:before{content:"\f19f1"}.mdi-folder-arrow-up-down-outline:before{content:"\f19f2"}.mdi-folder-arrow-up-outline:before{content:"\f19f3"}.mdi-folder-cancel:before{content:"\f19f4"}.mdi-folder-cancel-outline:before{content:"\f19f5"}.mdi-folder-check:before{content:"\f197e"}.mdi-folder-check-outline:before{content:"\f197f"}.mdi-folder-clock:before{content:"\f0aba"}.mdi-folder-clock-outline:before{content:"\f0abb"}.mdi-folder-cog:before{content:"\f107f"}.mdi-folder-cog-outline:before{content:"\f1080"}.mdi-folder-download:before{content:"\f024d"}.mdi-folder-download-outline:before{content:"\f10e9"}.mdi-folder-edit:before{content:"\f08de"}.mdi-folder-edit-outline:before{content:"\f0dce"}.mdi-folder-eye:before{content:"\f178a"}.mdi-folder-eye-outline:before{content:"\f178b"}.mdi-folder-file:before{content:"\f19f6"}.mdi-folder-file-outline:before{content:"\f19f7"}.mdi-folder-google-drive:before{content:"\f024e"}.mdi-folder-heart:before{content:"\f10ea"}.mdi-folder-heart-outline:before{content:"\f10eb"}.mdi-folder-hidden:before{content:"\f179e"}.mdi-folder-home:before{content:"\f10b5"}.mdi-folder-home-outline:before{content:"\f10b6"}.mdi-folder-image:before{content:"\f024f"}.mdi-folder-information:before{content:"\f10b7"}.mdi-folder-information-outline:before{content:"\f10b8"}.mdi-folder-key:before{content:"\f08ac"}.mdi-folder-key-network:before{content:"\f08ad"}.mdi-folder-key-network-outline:before{content:"\f0c80"}.mdi-folder-key-outline:before{content:"\f10ec"}.mdi-folder-lock:before{content:"\f0250"}.mdi-folder-lock-open:before{content:"\f0251"}.mdi-folder-lock-open-outline:before{content:"\f1aa7"}.mdi-folder-lock-outline:before{content:"\f1aa8"}.mdi-folder-marker:before{content:"\f126d"}.mdi-folder-marker-outline:before{content:"\f126e"}.mdi-folder-minus:before{content:"\f1b49"}.mdi-folder-minus-outline:before{content:"\f1b4a"}.mdi-folder-move:before{content:"\f0252"}.mdi-folder-move-outline:before{content:"\f1246"}.mdi-folder-multiple:before{content:"\f0253"}.mdi-folder-multiple-image:before{content:"\f0254"}.mdi-folder-multiple-outline:before{content:"\f0255"}.mdi-folder-multiple-plus:before{content:"\f147e"}.mdi-folder-multiple-plus-outline:before{content:"\f147f"}.mdi-folder-music:before{content:"\f1359"}.mdi-folder-music-outline:before{content:"\f135a"}.mdi-folder-network:before{content:"\f0870"}.mdi-folder-network-outline:before{content:"\f0c81"}.mdi-folder-off:before{content:"\f19f8"}.mdi-folder-off-outline:before{content:"\f19f9"}.mdi-folder-open:before{content:"\f0770"}.mdi-folder-open-outline:before{content:"\f0dcf"}.mdi-folder-outline:before{content:"\f0256"}.mdi-folder-play:before{content:"\f19fa"}.mdi-folder-play-outline:before{content:"\f19fb"}.mdi-folder-plus:before{content:"\f0257"}.mdi-folder-plus-outline:before{content:"\f0b9d"}.mdi-folder-pound:before{content:"\f0d09"}.mdi-folder-pound-outline:before{content:"\f0d0a"}.mdi-folder-question:before{content:"\f19ca"}.mdi-folder-question-outline:before{content:"\f19cb"}.mdi-folder-refresh:before{content:"\f0749"}.mdi-folder-refresh-outline:before{content:"\f0542"}.mdi-folder-remove:before{content:"\f0258"}.mdi-folder-remove-outline:before{content:"\f0b9e"}.mdi-folder-search:before{content:"\f0968"}.mdi-folder-search-outline:before{content:"\f0969"}.mdi-folder-settings:before{content:"\f107d"}.mdi-folder-settings-outline:before{content:"\f107e"}.mdi-folder-star:before{content:"\f069d"}.mdi-folder-star-multiple:before{content:"\f13d3"}.mdi-folder-star-multiple-outline:before{content:"\f13d4"}.mdi-folder-star-outline:before{content:"\f0b9f"}.mdi-folder-swap:before{content:"\f0fb6"}.mdi-folder-swap-outline:before{content:"\f0fb7"}.mdi-folder-sync:before{content:"\f0d0b"}.mdi-folder-sync-outline:before{content:"\f0d0c"}.mdi-folder-table:before{content:"\f12e3"}.mdi-folder-table-outline:before{content:"\f12e4"}.mdi-folder-text:before{content:"\f0c82"}.mdi-folder-text-outline:before{content:"\f0c83"}.mdi-folder-upload:before{content:"\f0259"}.mdi-folder-upload-outline:before{content:"\f10ed"}.mdi-folder-wrench:before{content:"\f19fc"}.mdi-folder-wrench-outline:before{content:"\f19fd"}.mdi-folder-zip:before{content:"\f06eb"}.mdi-folder-zip-outline:before{content:"\f07b9"}.mdi-font-awesome:before{content:"\f003a"}.mdi-food:before{content:"\f025a"}.mdi-food-apple:before{content:"\f025b"}.mdi-food-apple-outline:before{content:"\f0c84"}.mdi-food-croissant:before{content:"\f07c8"}.mdi-food-drumstick:before{content:"\f141f"}.mdi-food-drumstick-off:before{content:"\f1468"}.mdi-food-drumstick-off-outline:before{content:"\f1469"}.mdi-food-drumstick-outline:before{content:"\f1420"}.mdi-food-fork-drink:before{content:"\f05f2"}.mdi-food-halal:before{content:"\f1572"}.mdi-food-hot-dog:before{content:"\f184b"}.mdi-food-kosher:before{content:"\f1573"}.mdi-food-off:before{content:"\f05f3"}.mdi-food-off-outline:before{content:"\f1915"}.mdi-food-outline:before{content:"\f1916"}.mdi-food-steak:before{content:"\f146a"}.mdi-food-steak-off:before{content:"\f146b"}.mdi-food-takeout-box:before{content:"\f1836"}.mdi-food-takeout-box-outline:before{content:"\f1837"}.mdi-food-turkey:before{content:"\f171c"}.mdi-food-variant:before{content:"\f025c"}.mdi-food-variant-off:before{content:"\f13e5"}.mdi-foot-print:before{content:"\f0f52"}.mdi-football:before{content:"\f025d"}.mdi-football-australian:before{content:"\f025e"}.mdi-football-helmet:before{content:"\f025f"}.mdi-forest:before{content:"\f1897"}.mdi-forest-outline:before{content:"\f1c63"}.mdi-forklift:before{content:"\f07c9"}.mdi-form-dropdown:before{content:"\f1400"}.mdi-form-select:before{content:"\f1401"}.mdi-form-textarea:before{content:"\f1095"}.mdi-form-textbox:before{content:"\f060e"}.mdi-form-textbox-lock:before{content:"\f135d"}.mdi-form-textbox-password:before{content:"\f07f5"}.mdi-format-align-bottom:before{content:"\f0753"}.mdi-format-align-center:before{content:"\f0260"}.mdi-format-align-justify:before{content:"\f0261"}.mdi-format-align-left:before{content:"\f0262"}.mdi-format-align-middle:before{content:"\f0754"}.mdi-format-align-right:before{content:"\f0263"}.mdi-format-align-top:before{content:"\f0755"}.mdi-format-annotation-minus:before{content:"\f0abc"}.mdi-format-annotation-plus:before{content:"\f0646"}.mdi-format-bold:before{content:"\f0264"}.mdi-format-clear:before{content:"\f0265"}.mdi-format-color-fill:before{content:"\f0266"}.mdi-format-color-highlight:before{content:"\f0e31"}.mdi-format-color-marker-cancel:before{content:"\f1313"}.mdi-format-color-text:before{content:"\f069e"}.mdi-format-columns:before{content:"\f08df"}.mdi-format-float-center:before{content:"\f0267"}.mdi-format-float-left:before{content:"\f0268"}.mdi-format-float-none:before{content:"\f0269"}.mdi-format-float-right:before{content:"\f026a"}.mdi-format-font:before{content:"\f06d6"}.mdi-format-font-size-decrease:before{content:"\f09f3"}.mdi-format-font-size-increase:before{content:"\f09f4"}.mdi-format-header-1:before{content:"\f026b"}.mdi-format-header-2:before{content:"\f026c"}.mdi-format-header-3:before{content:"\f026d"}.mdi-format-header-4:before{content:"\f026e"}.mdi-format-header-5:before{content:"\f026f"}.mdi-format-header-6:before{content:"\f0270"}.mdi-format-header-decrease:before{content:"\f0271"}.mdi-format-header-equal:before{content:"\f0272"}.mdi-format-header-increase:before{content:"\f0273"}.mdi-format-header-pound:before{content:"\f0274"}.mdi-format-horizontal-align-center:before{content:"\f061e"}.mdi-format-horizontal-align-left:before{content:"\f061f"}.mdi-format-horizontal-align-right:before{content:"\f0620"}.mdi-format-indent-decrease:before{content:"\f0275"}.mdi-format-indent-increase:before{content:"\f0276"}.mdi-format-italic:before{content:"\f0277"}.mdi-format-letter-case:before{content:"\f0b34"}.mdi-format-letter-case-lower:before{content:"\f0b35"}.mdi-format-letter-case-upper:before{content:"\f0b36"}.mdi-format-letter-ends-with:before{content:"\f0fb8"}.mdi-format-letter-matches:before{content:"\f0fb9"}.mdi-format-letter-spacing:before{content:"\f1956"}.mdi-format-letter-spacing-variant:before{content:"\f1afb"}.mdi-format-letter-starts-with:before{content:"\f0fba"}.mdi-format-line-height:before{content:"\f1afc"}.mdi-format-line-spacing:before{content:"\f0278"}.mdi-format-line-style:before{content:"\f05c8"}.mdi-format-line-weight:before{content:"\f05c9"}.mdi-format-list-bulleted:before{content:"\f0279"}.mdi-format-list-bulleted-square:before{content:"\f0dd0"}.mdi-format-list-bulleted-triangle:before{content:"\f0eb2"}.mdi-format-list-bulleted-type:before{content:"\f027a"}.mdi-format-list-checkbox:before{content:"\f096a"}.mdi-format-list-checks:before{content:"\f0756"}.mdi-format-list-group:before{content:"\f1860"}.mdi-format-list-group-plus:before{content:"\f1b56"}.mdi-format-list-numbered:before{content:"\f027b"}.mdi-format-list-numbered-rtl:before{content:"\f0d0d"}.mdi-format-list-text:before{content:"\f126f"}.mdi-format-overline:before{content:"\f0eb3"}.mdi-format-page-break:before{content:"\f06d7"}.mdi-format-page-split:before{content:"\f1917"}.mdi-format-paint:before{content:"\f027c"}.mdi-format-paragraph:before{content:"\f027d"}.mdi-format-paragraph-spacing:before{content:"\f1afd"}.mdi-format-pilcrow:before{content:"\f06d8"}.mdi-format-pilcrow-arrow-left:before{content:"\f0286"}.mdi-format-pilcrow-arrow-right:before{content:"\f0285"}.mdi-format-quote-close:before{content:"\f027e"}.mdi-format-quote-close-outline:before{content:"\f11a8"}.mdi-format-quote-open:before{content:"\f0757"}.mdi-format-quote-open-outline:before{content:"\f11a7"}.mdi-format-rotate-90:before{content:"\f06aa"}.mdi-format-section:before{content:"\f069f"}.mdi-format-size:before{content:"\f027f"}.mdi-format-strikethrough:before{content:"\f0280"}.mdi-format-strikethrough-variant:before{content:"\f0281"}.mdi-format-subscript:before{content:"\f0282"}.mdi-format-superscript:before{content:"\f0283"}.mdi-format-text:before{content:"\f0284"}.mdi-format-text-rotation-angle-down:before{content:"\f0fbb"}.mdi-format-text-rotation-angle-up:before{content:"\f0fbc"}.mdi-format-text-rotation-down:before{content:"\f0d73"}.mdi-format-text-rotation-down-vertical:before{content:"\f0fbd"}.mdi-format-text-rotation-none:before{content:"\f0d74"}.mdi-format-text-rotation-up:before{content:"\f0fbe"}.mdi-format-text-rotation-vertical:before{content:"\f0fbf"}.mdi-format-text-variant:before{content:"\f0e32"}.mdi-format-text-variant-outline:before{content:"\f150f"}.mdi-format-text-wrapping-clip:before{content:"\f0d0e"}.mdi-format-text-wrapping-overflow:before{content:"\f0d0f"}.mdi-format-text-wrapping-wrap:before{content:"\f0d10"}.mdi-format-textbox:before{content:"\f0d11"}.mdi-format-title:before{content:"\f05f4"}.mdi-format-underline:before{content:"\f0287"}.mdi-format-underline-wavy:before{content:"\f18e9"}.mdi-format-vertical-align-bottom:before{content:"\f0621"}.mdi-format-vertical-align-center:before{content:"\f0622"}.mdi-format-vertical-align-top:before{content:"\f0623"}.mdi-format-wrap-inline:before{content:"\f0288"}.mdi-format-wrap-square:before{content:"\f0289"}.mdi-format-wrap-tight:before{content:"\f028a"}.mdi-format-wrap-top-bottom:before{content:"\f028b"}.mdi-forum:before{content:"\f028c"}.mdi-forum-minus:before{content:"\f1aa9"}.mdi-forum-minus-outline:before{content:"\f1aaa"}.mdi-forum-outline:before{content:"\f0822"}.mdi-forum-plus:before{content:"\f1aab"}.mdi-forum-plus-outline:before{content:"\f1aac"}.mdi-forum-remove:before{content:"\f1aad"}.mdi-forum-remove-outline:before{content:"\f1aae"}.mdi-forward:before{content:"\f028d"}.mdi-forwardburger:before{content:"\f0d75"}.mdi-fountain:before{content:"\f096b"}.mdi-fountain-pen:before{content:"\f0d12"}.mdi-fountain-pen-tip:before{content:"\f0d13"}.mdi-fraction-one-half:before{content:"\f1992"}.mdi-freebsd:before{content:"\f08e0"}.mdi-french-fries:before{content:"\f1957"}.mdi-frequently-asked-questions:before{content:"\f0eb4"}.mdi-fridge:before{content:"\f0290"}.mdi-fridge-alert:before{content:"\f11b1"}.mdi-fridge-alert-outline:before{content:"\f11b2"}.mdi-fridge-bottom:before{content:"\f0292"}.mdi-fridge-industrial:before{content:"\f15ee"}.mdi-fridge-industrial-alert:before{content:"\f15ef"}.mdi-fridge-industrial-alert-outline:before{content:"\f15f0"}.mdi-fridge-industrial-off:before{content:"\f15f1"}.mdi-fridge-industrial-off-outline:before{content:"\f15f2"}.mdi-fridge-industrial-outline:before{content:"\f15f3"}.mdi-fridge-off:before{content:"\f11af"}.mdi-fridge-off-outline:before{content:"\f11b0"}.mdi-fridge-outline:before{content:"\f028f"}.mdi-fridge-top:before{content:"\f0291"}.mdi-fridge-variant:before{content:"\f15f4"}.mdi-fridge-variant-alert:before{content:"\f15f5"}.mdi-fridge-variant-alert-outline:before{content:"\f15f6"}.mdi-fridge-variant-off:before{content:"\f15f7"}.mdi-fridge-variant-off-outline:before{content:"\f15f8"}.mdi-fridge-variant-outline:before{content:"\f15f9"}.mdi-fruit-cherries:before{content:"\f1042"}.mdi-fruit-cherries-off:before{content:"\f13f8"}.mdi-fruit-citrus:before{content:"\f1043"}.mdi-fruit-citrus-off:before{content:"\f13f9"}.mdi-fruit-grapes:before{content:"\f1044"}.mdi-fruit-grapes-outline:before{content:"\f1045"}.mdi-fruit-pear:before{content:"\f1a0e"}.mdi-fruit-pineapple:before{content:"\f1046"}.mdi-fruit-watermelon:before{content:"\f1047"}.mdi-fuel:before{content:"\f07ca"}.mdi-fuel-cell:before{content:"\f18b5"}.mdi-fullscreen:before{content:"\f0293"}.mdi-fullscreen-exit:before{content:"\f0294"}.mdi-function:before{content:"\f0295"}.mdi-function-variant:before{content:"\f0871"}.mdi-furigana-horizontal:before{content:"\f1081"}.mdi-furigana-vertical:before{content:"\f1082"}.mdi-fuse:before{content:"\f0c85"}.mdi-fuse-alert:before{content:"\f142d"}.mdi-fuse-blade:before{content:"\f0c86"}.mdi-fuse-off:before{content:"\f142c"}.mdi-gamepad:before{content:"\f0296"}.mdi-gamepad-circle:before{content:"\f0e33"}.mdi-gamepad-circle-down:before{content:"\f0e34"}.mdi-gamepad-circle-left:before{content:"\f0e35"}.mdi-gamepad-circle-outline:before{content:"\f0e36"}.mdi-gamepad-circle-right:before{content:"\f0e37"}.mdi-gamepad-circle-up:before{content:"\f0e38"}.mdi-gamepad-down:before{content:"\f0e39"}.mdi-gamepad-left:before{content:"\f0e3a"}.mdi-gamepad-outline:before{content:"\f1919"}.mdi-gamepad-right:before{content:"\f0e3b"}.mdi-gamepad-round:before{content:"\f0e3c"}.mdi-gamepad-round-down:before{content:"\f0e3d"}.mdi-gamepad-round-left:before{content:"\f0e3e"}.mdi-gamepad-round-outline:before{content:"\f0e3f"}.mdi-gamepad-round-right:before{content:"\f0e40"}.mdi-gamepad-round-up:before{content:"\f0e41"}.mdi-gamepad-square:before{content:"\f0eb5"}.mdi-gamepad-square-outline:before{content:"\f0eb6"}.mdi-gamepad-up:before{content:"\f0e42"}.mdi-gamepad-variant:before{content:"\f0297"}.mdi-gamepad-variant-outline:before{content:"\f0eb7"}.mdi-gamma:before{content:"\f10ee"}.mdi-gantry-crane:before{content:"\f0dd1"}.mdi-garage:before{content:"\f06d9"}.mdi-garage-alert:before{content:"\f0872"}.mdi-garage-alert-variant:before{content:"\f12d5"}.mdi-garage-lock:before{content:"\f17fb"}.mdi-garage-open:before{content:"\f06da"}.mdi-garage-open-variant:before{content:"\f12d4"}.mdi-garage-variant:before{content:"\f12d3"}.mdi-garage-variant-lock:before{content:"\f17fc"}.mdi-gas-burner:before{content:"\f1a1b"}.mdi-gas-cylinder:before{content:"\f0647"}.mdi-gas-station:before{content:"\f0298"}.mdi-gas-station-in-use:before{content:"\f1cc4"}.mdi-gas-station-in-use-outline:before{content:"\f1cc5"}.mdi-gas-station-off:before{content:"\f1409"}.mdi-gas-station-off-outline:before{content:"\f140a"}.mdi-gas-station-outline:before{content:"\f0eb8"}.mdi-gate:before{content:"\f0299"}.mdi-gate-alert:before{content:"\f17f8"}.mdi-gate-and:before{content:"\f08e1"}.mdi-gate-arrow-left:before{content:"\f17f7"}.mdi-gate-arrow-right:before{content:"\f1169"}.mdi-gate-buffer:before{content:"\f1afe"}.mdi-gate-nand:before{content:"\f08e2"}.mdi-gate-nor:before{content:"\f08e3"}.mdi-gate-not:before{content:"\f08e4"}.mdi-gate-open:before{content:"\f116a"}.mdi-gate-or:before{content:"\f08e5"}.mdi-gate-xnor:before{content:"\f08e6"}.mdi-gate-xor:before{content:"\f08e7"}.mdi-gatsby:before{content:"\f0e43"}.mdi-gauge:before{content:"\f029a"}.mdi-gauge-empty:before{content:"\f0873"}.mdi-gauge-full:before{content:"\f0874"}.mdi-gauge-low:before{content:"\f0875"}.mdi-gavel:before{content:"\f029b"}.mdi-gender-female:before{content:"\f029c"}.mdi-gender-male:before{content:"\f029d"}.mdi-gender-male-female:before{content:"\f029e"}.mdi-gender-male-female-variant:before{content:"\f113f"}.mdi-gender-non-binary:before{content:"\f1140"}.mdi-gender-transgender:before{content:"\f029f"}.mdi-generator-mobile:before{content:"\f1c8a"}.mdi-generator-portable:before{content:"\f1c8b"}.mdi-generator-stationary:before{content:"\f1c8c"}.mdi-gentoo:before{content:"\f08e8"}.mdi-gesture:before{content:"\f07cb"}.mdi-gesture-double-tap:before{content:"\f073c"}.mdi-gesture-pinch:before{content:"\f0abd"}.mdi-gesture-spread:before{content:"\f0abe"}.mdi-gesture-swipe:before{content:"\f0d76"}.mdi-gesture-swipe-down:before{content:"\f073d"}.mdi-gesture-swipe-horizontal:before{content:"\f0abf"}.mdi-gesture-swipe-left:before{content:"\f073e"}.mdi-gesture-swipe-right:before{content:"\f073f"}.mdi-gesture-swipe-up:before{content:"\f0740"}.mdi-gesture-swipe-vertical:before{content:"\f0ac0"}.mdi-gesture-tap:before{content:"\f0741"}.mdi-gesture-tap-box:before{content:"\f12a9"}.mdi-gesture-tap-button:before{content:"\f12a8"}.mdi-gesture-tap-hold:before{content:"\f0d77"}.mdi-gesture-two-double-tap:before{content:"\f0742"}.mdi-gesture-two-tap:before{content:"\f0743"}.mdi-ghost:before{content:"\f02a0"}.mdi-ghost-off:before{content:"\f09f5"}.mdi-ghost-off-outline:before{content:"\f165c"}.mdi-ghost-outline:before{content:"\f165d"}.mdi-gift:before{content:"\f0e44"}.mdi-gift-off:before{content:"\f16ef"}.mdi-gift-off-outline:before{content:"\f16f0"}.mdi-gift-open:before{content:"\f16f1"}.mdi-gift-open-outline:before{content:"\f16f2"}.mdi-gift-outline:before{content:"\f02a1"}.mdi-git:before{content:"\f02a2"}.mdi-github:before{content:"\f02a4"}.mdi-gitlab:before{content:"\f0ba0"}.mdi-glass-cocktail:before{content:"\f0356"}.mdi-glass-cocktail-off:before{content:"\f15e6"}.mdi-glass-flute:before{content:"\f02a5"}.mdi-glass-fragile:before{content:"\f1873"}.mdi-glass-mug:before{content:"\f02a6"}.mdi-glass-mug-off:before{content:"\f15e7"}.mdi-glass-mug-variant:before{content:"\f1116"}.mdi-glass-mug-variant-off:before{content:"\f15e8"}.mdi-glass-pint-outline:before{content:"\f130d"}.mdi-glass-stange:before{content:"\f02a7"}.mdi-glass-tulip:before{content:"\f02a8"}.mdi-glass-wine:before{content:"\f0876"}.mdi-glasses:before{content:"\f02aa"}.mdi-globe-light:before{content:"\f066f"}.mdi-globe-light-outline:before{content:"\f12d7"}.mdi-globe-model:before{content:"\f08e9"}.mdi-gmail:before{content:"\f02ab"}.mdi-gnome:before{content:"\f02ac"}.mdi-go-kart:before{content:"\f0d79"}.mdi-go-kart-track:before{content:"\f0d7a"}.mdi-gog:before{content:"\f0ba1"}.mdi-gold:before{content:"\f124f"}.mdi-golf:before{content:"\f0823"}.mdi-golf-cart:before{content:"\f11a4"}.mdi-golf-tee:before{content:"\f1083"}.mdi-gondola:before{content:"\f0686"}.mdi-goodreads:before{content:"\f0d7b"}.mdi-google:before{content:"\f02ad"}.mdi-google-ads:before{content:"\f0c87"}.mdi-google-analytics:before{content:"\f07cc"}.mdi-google-assistant:before{content:"\f07cd"}.mdi-google-cardboard:before{content:"\f02ae"}.mdi-google-chrome:before{content:"\f02af"}.mdi-google-circles:before{content:"\f02b0"}.mdi-google-circles-communities:before{content:"\f02b1"}.mdi-google-circles-extended:before{content:"\f02b2"}.mdi-google-circles-group:before{content:"\f02b3"}.mdi-google-classroom:before{content:"\f02c0"}.mdi-google-cloud:before{content:"\f11f6"}.mdi-google-downasaur:before{content:"\f1362"}.mdi-google-drive:before{content:"\f02b6"}.mdi-google-earth:before{content:"\f02b7"}.mdi-google-fit:before{content:"\f096c"}.mdi-google-glass:before{content:"\f02b8"}.mdi-google-hangouts:before{content:"\f02c9"}.mdi-google-keep:before{content:"\f06dc"}.mdi-google-lens:before{content:"\f09f6"}.mdi-google-maps:before{content:"\f05f5"}.mdi-google-my-business:before{content:"\f1048"}.mdi-google-nearby:before{content:"\f02b9"}.mdi-google-play:before{content:"\f02bc"}.mdi-google-plus:before{content:"\f02bd"}.mdi-google-podcast:before{content:"\f0eb9"}.mdi-google-spreadsheet:before{content:"\f09f7"}.mdi-google-street-view:before{content:"\f0c88"}.mdi-google-translate:before{content:"\f02bf"}.mdi-gradient-horizontal:before{content:"\f174a"}.mdi-gradient-vertical:before{content:"\f06a0"}.mdi-grain:before{content:"\f0d7c"}.mdi-graph:before{content:"\f1049"}.mdi-graph-outline:before{content:"\f104a"}.mdi-graphql:before{content:"\f0877"}.mdi-grass:before{content:"\f1510"}.mdi-grave-stone:before{content:"\f0ba2"}.mdi-grease-pencil:before{content:"\f0648"}.mdi-greater-than:before{content:"\f096d"}.mdi-greater-than-or-equal:before{content:"\f096e"}.mdi-greenhouse:before{content:"\f002d"}.mdi-grid:before{content:"\f02c1"}.mdi-grid-large:before{content:"\f0758"}.mdi-grid-off:before{content:"\f02c2"}.mdi-grill:before{content:"\f0e45"}.mdi-grill-outline:before{content:"\f118a"}.mdi-group:before{content:"\f02c3"}.mdi-guitar-acoustic:before{content:"\f0771"}.mdi-guitar-electric:before{content:"\f02c4"}.mdi-guitar-pick:before{content:"\f02c5"}.mdi-guitar-pick-outline:before{content:"\f02c6"}.mdi-guy-fawkes-mask:before{content:"\f0825"}.mdi-gymnastics:before{content:"\f1a41"}.mdi-hail:before{content:"\f0ac1"}.mdi-hair-dryer:before{content:"\f10ef"}.mdi-hair-dryer-outline:before{content:"\f10f0"}.mdi-halloween:before{content:"\f0ba3"}.mdi-hamburger:before{content:"\f0685"}.mdi-hamburger-check:before{content:"\f1776"}.mdi-hamburger-minus:before{content:"\f1777"}.mdi-hamburger-off:before{content:"\f1778"}.mdi-hamburger-plus:before{content:"\f1779"}.mdi-hamburger-remove:before{content:"\f177a"}.mdi-hammer:before{content:"\f08ea"}.mdi-hammer-screwdriver:before{content:"\f1322"}.mdi-hammer-sickle:before{content:"\f1887"}.mdi-hammer-wrench:before{content:"\f1323"}.mdi-hand-back-left:before{content:"\f0e46"}.mdi-hand-back-left-off:before{content:"\f1830"}.mdi-hand-back-left-off-outline:before{content:"\f1832"}.mdi-hand-back-left-outline:before{content:"\f182c"}.mdi-hand-back-right:before{content:"\f0e47"}.mdi-hand-back-right-off:before{content:"\f1831"}.mdi-hand-back-right-off-outline:before{content:"\f1833"}.mdi-hand-back-right-outline:before{content:"\f182d"}.mdi-hand-clap:before{content:"\f194b"}.mdi-hand-clap-off:before{content:"\f1a42"}.mdi-hand-coin:before{content:"\f188f"}.mdi-hand-coin-outline:before{content:"\f1890"}.mdi-hand-cycle:before{content:"\f1b9c"}.mdi-hand-extended:before{content:"\f18b6"}.mdi-hand-extended-outline:before{content:"\f18b7"}.mdi-hand-front-left:before{content:"\f182b"}.mdi-hand-front-left-outline:before{content:"\f182e"}.mdi-hand-front-right:before{content:"\f0a4f"}.mdi-hand-front-right-outline:before{content:"\f182f"}.mdi-hand-heart:before{content:"\f10f1"}.mdi-hand-heart-outline:before{content:"\f157e"}.mdi-hand-okay:before{content:"\f0a50"}.mdi-hand-peace:before{content:"\f0a51"}.mdi-hand-peace-variant:before{content:"\f0a52"}.mdi-hand-pointing-down:before{content:"\f0a53"}.mdi-hand-pointing-left:before{content:"\f0a54"}.mdi-hand-pointing-right:before{content:"\f02c7"}.mdi-hand-pointing-up:before{content:"\f0a55"}.mdi-hand-saw:before{content:"\f0e48"}.mdi-hand-wash:before{content:"\f157f"}.mdi-hand-wash-outline:before{content:"\f1580"}.mdi-hand-water:before{content:"\f139f"}.mdi-hand-wave:before{content:"\f1821"}.mdi-hand-wave-outline:before{content:"\f1822"}.mdi-handball:before{content:"\f0f53"}.mdi-handcuffs:before{content:"\f113e"}.mdi-hands-pray:before{content:"\f0579"}.mdi-handshake:before{content:"\f1218"}.mdi-handshake-outline:before{content:"\f15a1"}.mdi-hanger:before{content:"\f02c8"}.mdi-hard-hat:before{content:"\f096f"}.mdi-harddisk:before{content:"\f02ca"}.mdi-harddisk-plus:before{content:"\f104b"}.mdi-harddisk-remove:before{content:"\f104c"}.mdi-hat-fedora:before{content:"\f0ba4"}.mdi-hazard-lights:before{content:"\f0c89"}.mdi-hdmi-port:before{content:"\f1bb8"}.mdi-hdr:before{content:"\f0d7d"}.mdi-hdr-off:before{content:"\f0d7e"}.mdi-head:before{content:"\f135e"}.mdi-head-alert:before{content:"\f1338"}.mdi-head-alert-outline:before{content:"\f1339"}.mdi-head-check:before{content:"\f133a"}.mdi-head-check-outline:before{content:"\f133b"}.mdi-head-cog:before{content:"\f133c"}.mdi-head-cog-outline:before{content:"\f133d"}.mdi-head-dots-horizontal:before{content:"\f133e"}.mdi-head-dots-horizontal-outline:before{content:"\f133f"}.mdi-head-flash:before{content:"\f1340"}.mdi-head-flash-outline:before{content:"\f1341"}.mdi-head-heart:before{content:"\f1342"}.mdi-head-heart-outline:before{content:"\f1343"}.mdi-head-lightbulb:before{content:"\f1344"}.mdi-head-lightbulb-outline:before{content:"\f1345"}.mdi-head-minus:before{content:"\f1346"}.mdi-head-minus-outline:before{content:"\f1347"}.mdi-head-outline:before{content:"\f135f"}.mdi-head-plus:before{content:"\f1348"}.mdi-head-plus-outline:before{content:"\f1349"}.mdi-head-question:before{content:"\f134a"}.mdi-head-question-outline:before{content:"\f134b"}.mdi-head-remove:before{content:"\f134c"}.mdi-head-remove-outline:before{content:"\f134d"}.mdi-head-snowflake:before{content:"\f134e"}.mdi-head-snowflake-outline:before{content:"\f134f"}.mdi-head-sync:before{content:"\f1350"}.mdi-head-sync-outline:before{content:"\f1351"}.mdi-headphones:before{content:"\f02cb"}.mdi-headphones-bluetooth:before{content:"\f0970"}.mdi-headphones-box:before{content:"\f02cc"}.mdi-headphones-off:before{content:"\f07ce"}.mdi-headphones-settings:before{content:"\f02cd"}.mdi-headset:before{content:"\f02ce"}.mdi-headset-dock:before{content:"\f02cf"}.mdi-headset-off:before{content:"\f02d0"}.mdi-heart:before{content:"\f02d1"}.mdi-heart-box:before{content:"\f02d2"}.mdi-heart-box-outline:before{content:"\f02d3"}.mdi-heart-broken:before{content:"\f02d4"}.mdi-heart-broken-outline:before{content:"\f0d14"}.mdi-heart-circle:before{content:"\f0971"}.mdi-heart-circle-outline:before{content:"\f0972"}.mdi-heart-cog:before{content:"\f1663"}.mdi-heart-cog-outline:before{content:"\f1664"}.mdi-heart-flash:before{content:"\f0ef9"}.mdi-heart-half:before{content:"\f06df"}.mdi-heart-half-full:before{content:"\f06de"}.mdi-heart-half-outline:before{content:"\f06e0"}.mdi-heart-minus:before{content:"\f142f"}.mdi-heart-minus-outline:before{content:"\f1432"}.mdi-heart-multiple:before{content:"\f0a56"}.mdi-heart-multiple-outline:before{content:"\f0a57"}.mdi-heart-off:before{content:"\f0759"}.mdi-heart-off-outline:before{content:"\f1434"}.mdi-heart-outline:before{content:"\f02d5"}.mdi-heart-plus:before{content:"\f142e"}.mdi-heart-plus-outline:before{content:"\f1431"}.mdi-heart-pulse:before{content:"\f05f6"}.mdi-heart-remove:before{content:"\f1430"}.mdi-heart-remove-outline:before{content:"\f1433"}.mdi-heart-search:before{content:"\f1c8d"}.mdi-heart-settings:before{content:"\f1665"}.mdi-heart-settings-outline:before{content:"\f1666"}.mdi-heat-pump:before{content:"\f1a43"}.mdi-heat-pump-outline:before{content:"\f1a44"}.mdi-heat-wave:before{content:"\f1a45"}.mdi-heating-coil:before{content:"\f1aaf"}.mdi-helicopter:before{content:"\f0ac2"}.mdi-help:before{content:"\f02d6"}.mdi-help-box:before{content:"\f078b"}.mdi-help-box-multiple:before{content:"\f1c0a"}.mdi-help-box-multiple-outline:before{content:"\f1c0b"}.mdi-help-box-outline:before{content:"\f1c0c"}.mdi-help-circle:before{content:"\f02d7"}.mdi-help-circle-outline:before{content:"\f0625"}.mdi-help-network:before{content:"\f06f5"}.mdi-help-network-outline:before{content:"\f0c8a"}.mdi-help-rhombus:before{content:"\f0ba5"}.mdi-help-rhombus-outline:before{content:"\f0ba6"}.mdi-hexadecimal:before{content:"\f12a7"}.mdi-hexagon:before{content:"\f02d8"}.mdi-hexagon-multiple:before{content:"\f06e1"}.mdi-hexagon-multiple-outline:before{content:"\f10f2"}.mdi-hexagon-outline:before{content:"\f02d9"}.mdi-hexagon-slice-1:before{content:"\f0ac3"}.mdi-hexagon-slice-2:before{content:"\f0ac4"}.mdi-hexagon-slice-3:before{content:"\f0ac5"}.mdi-hexagon-slice-4:before{content:"\f0ac6"}.mdi-hexagon-slice-5:before{content:"\f0ac7"}.mdi-hexagon-slice-6:before{content:"\f0ac8"}.mdi-hexagram:before{content:"\f0ac9"}.mdi-hexagram-outline:before{content:"\f0aca"}.mdi-high-definition:before{content:"\f07cf"}.mdi-high-definition-box:before{content:"\f0878"}.mdi-highway:before{content:"\f05f7"}.mdi-hiking:before{content:"\f0d7f"}.mdi-history:before{content:"\f02da"}.mdi-hockey-puck:before{content:"\f0879"}.mdi-hockey-sticks:before{content:"\f087a"}.mdi-hololens:before{content:"\f02db"}.mdi-home:before{content:"\f02dc"}.mdi-home-account:before{content:"\f0826"}.mdi-home-alert:before{content:"\f087b"}.mdi-home-alert-outline:before{content:"\f15d0"}.mdi-home-analytics:before{content:"\f0eba"}.mdi-home-assistant:before{content:"\f07d0"}.mdi-home-automation:before{content:"\f07d1"}.mdi-home-battery:before{content:"\f1901"}.mdi-home-battery-outline:before{content:"\f1902"}.mdi-home-circle:before{content:"\f07d2"}.mdi-home-circle-outline:before{content:"\f104d"}.mdi-home-city:before{content:"\f0d15"}.mdi-home-city-outline:before{content:"\f0d16"}.mdi-home-clock:before{content:"\f1a12"}.mdi-home-clock-outline:before{content:"\f1a13"}.mdi-home-edit:before{content:"\f1159"}.mdi-home-edit-outline:before{content:"\f115a"}.mdi-home-export-outline:before{content:"\f0f9b"}.mdi-home-flood:before{content:"\f0efa"}.mdi-home-floor-0:before{content:"\f0dd2"}.mdi-home-floor-1:before{content:"\f0d80"}.mdi-home-floor-2:before{content:"\f0d81"}.mdi-home-floor-3:before{content:"\f0d82"}.mdi-home-floor-a:before{content:"\f0d83"}.mdi-home-floor-b:before{content:"\f0d84"}.mdi-home-floor-g:before{content:"\f0d85"}.mdi-home-floor-l:before{content:"\f0d86"}.mdi-home-floor-negative-1:before{content:"\f0dd3"}.mdi-home-group:before{content:"\f0dd4"}.mdi-home-group-minus:before{content:"\f19c1"}.mdi-home-group-plus:before{content:"\f19c0"}.mdi-home-group-remove:before{content:"\f19c2"}.mdi-home-heart:before{content:"\f0827"}.mdi-home-import-outline:before{content:"\f0f9c"}.mdi-home-lightbulb:before{content:"\f1251"}.mdi-home-lightbulb-outline:before{content:"\f1252"}.mdi-home-lightning-bolt:before{content:"\f1903"}.mdi-home-lightning-bolt-outline:before{content:"\f1904"}.mdi-home-lock:before{content:"\f08eb"}.mdi-home-lock-open:before{content:"\f08ec"}.mdi-home-map-marker:before{content:"\f05f8"}.mdi-home-minus:before{content:"\f0974"}.mdi-home-minus-outline:before{content:"\f13d5"}.mdi-home-modern:before{content:"\f02dd"}.mdi-home-off:before{content:"\f1a46"}.mdi-home-off-outline:before{content:"\f1a47"}.mdi-home-outline:before{content:"\f06a1"}.mdi-home-percent:before{content:"\f1c7c"}.mdi-home-percent-outline:before{content:"\f1c7d"}.mdi-home-plus:before{content:"\f0975"}.mdi-home-plus-outline:before{content:"\f13d6"}.mdi-home-remove:before{content:"\f1247"}.mdi-home-remove-outline:before{content:"\f13d7"}.mdi-home-roof:before{content:"\f112b"}.mdi-home-search:before{content:"\f13b0"}.mdi-home-search-outline:before{content:"\f13b1"}.mdi-home-silo:before{content:"\f1ba0"}.mdi-home-silo-outline:before{content:"\f1ba1"}.mdi-home-sound-in:before{content:"\f1c2f"}.mdi-home-sound-in-outline:before{content:"\f1c30"}.mdi-home-sound-out:before{content:"\f1c31"}.mdi-home-sound-out-outline:before{content:"\f1c32"}.mdi-home-switch:before{content:"\f1794"}.mdi-home-switch-outline:before{content:"\f1795"}.mdi-home-thermometer:before{content:"\f0f54"}.mdi-home-thermometer-outline:before{content:"\f0f55"}.mdi-home-variant:before{content:"\f02de"}.mdi-home-variant-outline:before{content:"\f0ba7"}.mdi-hook:before{content:"\f06e2"}.mdi-hook-off:before{content:"\f06e3"}.mdi-hoop-house:before{content:"\f0e56"}.mdi-hops:before{content:"\f02df"}.mdi-horizontal-rotate-clockwise:before{content:"\f10f3"}.mdi-horizontal-rotate-counterclockwise:before{content:"\f10f4"}.mdi-horse:before{content:"\f15bf"}.mdi-horse-human:before{content:"\f15c0"}.mdi-horse-variant:before{content:"\f15c1"}.mdi-horse-variant-fast:before{content:"\f186e"}.mdi-horseshoe:before{content:"\f0a58"}.mdi-hospital:before{content:"\f0ff6"}.mdi-hospital-box:before{content:"\f02e0"}.mdi-hospital-box-outline:before{content:"\f0ff7"}.mdi-hospital-building:before{content:"\f02e1"}.mdi-hospital-marker:before{content:"\f02e2"}.mdi-hot-tub:before{content:"\f0828"}.mdi-hours-12:before{content:"\f1c94"}.mdi-hours-24:before{content:"\f1478"}.mdi-hub:before{content:"\f1c95"}.mdi-hub-outline:before{content:"\f1c96"}.mdi-hubspot:before{content:"\f0d17"}.mdi-hulu:before{content:"\f0829"}.mdi-human:before{content:"\f02e6"}.mdi-human-baby-changing-table:before{content:"\f138b"}.mdi-human-cane:before{content:"\f1581"}.mdi-human-capacity-decrease:before{content:"\f159b"}.mdi-human-capacity-increase:before{content:"\f159c"}.mdi-human-child:before{content:"\f02e7"}.mdi-human-dolly:before{content:"\f1980"}.mdi-human-edit:before{content:"\f14e8"}.mdi-human-female:before{content:"\f0649"}.mdi-human-female-boy:before{content:"\f0a59"}.mdi-human-female-dance:before{content:"\f15c9"}.mdi-human-female-female:before{content:"\f0a5a"}.mdi-human-female-female-child:before{content:"\f1c8e"}.mdi-human-female-girl:before{content:"\f0a5b"}.mdi-human-greeting:before{content:"\f17c4"}.mdi-human-greeting-proximity:before{content:"\f159d"}.mdi-human-greeting-variant:before{content:"\f064a"}.mdi-human-handsdown:before{content:"\f064b"}.mdi-human-handsup:before{content:"\f064c"}.mdi-human-male:before{content:"\f064d"}.mdi-human-male-board:before{content:"\f0890"}.mdi-human-male-board-poll:before{content:"\f0846"}.mdi-human-male-boy:before{content:"\f0a5c"}.mdi-human-male-child:before{content:"\f138c"}.mdi-human-male-female:before{content:"\f02e8"}.mdi-human-male-female-child:before{content:"\f1823"}.mdi-human-male-girl:before{content:"\f0a5d"}.mdi-human-male-height:before{content:"\f0efb"}.mdi-human-male-height-variant:before{content:"\f0efc"}.mdi-human-male-male:before{content:"\f0a5e"}.mdi-human-male-male-child:before{content:"\f1c8f"}.mdi-human-non-binary:before{content:"\f1848"}.mdi-human-pregnant:before{content:"\f05cf"}.mdi-human-queue:before{content:"\f1571"}.mdi-human-scooter:before{content:"\f11e9"}.mdi-human-walker:before{content:"\f1b71"}.mdi-human-wheelchair:before{content:"\f138d"}.mdi-human-white-cane:before{content:"\f1981"}.mdi-humble-bundle:before{content:"\f0744"}.mdi-hvac:before{content:"\f1352"}.mdi-hvac-off:before{content:"\f159e"}.mdi-hydraulic-oil-level:before{content:"\f1324"}.mdi-hydraulic-oil-temperature:before{content:"\f1325"}.mdi-hydro-power:before{content:"\f12e5"}.mdi-hydrogen-station:before{content:"\f1894"}.mdi-ice-cream:before{content:"\f082a"}.mdi-ice-cream-off:before{content:"\f0e52"}.mdi-ice-pop:before{content:"\f0efd"}.mdi-id-card:before{content:"\f0fc0"}.mdi-identifier:before{content:"\f0efe"}.mdi-ideogram-cjk:before{content:"\f1331"}.mdi-ideogram-cjk-variant:before{content:"\f1332"}.mdi-image:before{content:"\f02e9"}.mdi-image-album:before{content:"\f02ea"}.mdi-image-area:before{content:"\f02eb"}.mdi-image-area-close:before{content:"\f02ec"}.mdi-image-auto-adjust:before{content:"\f0fc1"}.mdi-image-broken:before{content:"\f02ed"}.mdi-image-broken-variant:before{content:"\f02ee"}.mdi-image-check:before{content:"\f1b25"}.mdi-image-check-outline:before{content:"\f1b26"}.mdi-image-edit:before{content:"\f11e3"}.mdi-image-edit-outline:before{content:"\f11e4"}.mdi-image-filter-black-white:before{content:"\f02f0"}.mdi-image-filter-center-focus:before{content:"\f02f1"}.mdi-image-filter-center-focus-strong:before{content:"\f0eff"}.mdi-image-filter-center-focus-strong-outline:before{content:"\f0f00"}.mdi-image-filter-center-focus-weak:before{content:"\f02f2"}.mdi-image-filter-drama:before{content:"\f02f3"}.mdi-image-filter-drama-outline:before{content:"\f1bff"}.mdi-image-filter-frames:before{content:"\f02f4"}.mdi-image-filter-hdr:before{content:"\f02f5"}.mdi-image-filter-hdr-outline:before{content:"\f1c64"}.mdi-image-filter-none:before{content:"\f02f6"}.mdi-image-filter-tilt-shift:before{content:"\f02f7"}.mdi-image-filter-vintage:before{content:"\f02f8"}.mdi-image-frame:before{content:"\f0e49"}.mdi-image-lock:before{content:"\f1ab0"}.mdi-image-lock-outline:before{content:"\f1ab1"}.mdi-image-marker:before{content:"\f177b"}.mdi-image-marker-outline:before{content:"\f177c"}.mdi-image-minus:before{content:"\f1419"}.mdi-image-minus-outline:before{content:"\f1b47"}.mdi-image-move:before{content:"\f09f8"}.mdi-image-multiple:before{content:"\f02f9"}.mdi-image-multiple-outline:before{content:"\f02ef"}.mdi-image-off:before{content:"\f082b"}.mdi-image-off-outline:before{content:"\f11d1"}.mdi-image-outline:before{content:"\f0976"}.mdi-image-plus:before{content:"\f087c"}.mdi-image-plus-outline:before{content:"\f1b46"}.mdi-image-refresh:before{content:"\f19fe"}.mdi-image-refresh-outline:before{content:"\f19ff"}.mdi-image-remove:before{content:"\f1418"}.mdi-image-remove-outline:before{content:"\f1b48"}.mdi-image-search:before{content:"\f0977"}.mdi-image-search-outline:before{content:"\f0978"}.mdi-image-size-select-actual:before{content:"\f0c8d"}.mdi-image-size-select-large:before{content:"\f0c8e"}.mdi-image-size-select-small:before{content:"\f0c8f"}.mdi-image-sync:before{content:"\f1a00"}.mdi-image-sync-outline:before{content:"\f1a01"}.mdi-image-text:before{content:"\f160d"}.mdi-import:before{content:"\f02fa"}.mdi-inbox:before{content:"\f0687"}.mdi-inbox-arrow-down:before{content:"\f02fb"}.mdi-inbox-arrow-down-outline:before{content:"\f1270"}.mdi-inbox-arrow-up:before{content:"\f03d1"}.mdi-inbox-arrow-up-outline:before{content:"\f1271"}.mdi-inbox-full:before{content:"\f1272"}.mdi-inbox-full-outline:before{content:"\f1273"}.mdi-inbox-multiple:before{content:"\f08b0"}.mdi-inbox-multiple-outline:before{content:"\f0ba8"}.mdi-inbox-outline:before{content:"\f1274"}.mdi-inbox-remove:before{content:"\f159f"}.mdi-inbox-remove-outline:before{content:"\f15a0"}.mdi-incognito:before{content:"\f05f9"}.mdi-incognito-circle:before{content:"\f1421"}.mdi-incognito-circle-off:before{content:"\f1422"}.mdi-incognito-off:before{content:"\f0075"}.mdi-induction:before{content:"\f184c"}.mdi-infinity:before{content:"\f06e4"}.mdi-information:before{content:"\f02fc"}.mdi-information-box:before{content:"\f1c65"}.mdi-information-box-outline:before{content:"\f1c66"}.mdi-information-off:before{content:"\f178c"}.mdi-information-off-outline:before{content:"\f178d"}.mdi-information-outline:before{content:"\f02fd"}.mdi-information-slab-box:before{content:"\f1c67"}.mdi-information-slab-box-outline:before{content:"\f1c68"}.mdi-information-slab-circle:before{content:"\f1c69"}.mdi-information-slab-circle-outline:before{content:"\f1c6a"}.mdi-information-slab-symbol:before{content:"\f1c6b"}.mdi-information-symbol:before{content:"\f1c6c"}.mdi-information-variant:before{content:"\f064e"}.mdi-information-variant-box:before{content:"\f1c6d"}.mdi-information-variant-box-outline:before{content:"\f1c6e"}.mdi-information-variant-circle:before{content:"\f1c6f"}.mdi-information-variant-circle-outline:before{content:"\f1c70"}.mdi-instagram:before{content:"\f02fe"}.mdi-instrument-triangle:before{content:"\f104e"}.mdi-integrated-circuit-chip:before{content:"\f1913"}.mdi-invert-colors:before{content:"\f0301"}.mdi-invert-colors-off:before{content:"\f0e4a"}.mdi-invoice:before{content:"\f1cd2"}.mdi-invoice-arrow-left:before{content:"\f1cd3"}.mdi-invoice-arrow-left-outline:before{content:"\f1cd4"}.mdi-invoice-arrow-right:before{content:"\f1cd5"}.mdi-invoice-arrow-right-outline:before{content:"\f1cd6"}.mdi-invoice-check:before{content:"\f1cd7"}.mdi-invoice-check-outline:before{content:"\f1cd8"}.mdi-invoice-clock:before{content:"\f1cd9"}.mdi-invoice-clock-outline:before{content:"\f1cda"}.mdi-invoice-edit:before{content:"\f1cdb"}.mdi-invoice-edit-outline:before{content:"\f1cdc"}.mdi-invoice-export-outline:before{content:"\f1cdd"}.mdi-invoice-fast:before{content:"\f1cde"}.mdi-invoice-fast-outline:before{content:"\f1cdf"}.mdi-invoice-import:before{content:"\f1ce0"}.mdi-invoice-import-outline:before{content:"\f1ce1"}.mdi-invoice-list:before{content:"\f1ce2"}.mdi-invoice-list-outline:before{content:"\f1ce3"}.mdi-invoice-minus:before{content:"\f1ce4"}.mdi-invoice-minus-outline:before{content:"\f1ce5"}.mdi-invoice-multiple:before{content:"\f1ce6"}.mdi-invoice-multiple-outline:before{content:"\f1ce7"}.mdi-invoice-outline:before{content:"\f1ce8"}.mdi-invoice-plus:before{content:"\f1ce9"}.mdi-invoice-plus-outline:before{content:"\f1cea"}.mdi-invoice-remove:before{content:"\f1ceb"}.mdi-invoice-remove-outline:before{content:"\f1cec"}.mdi-invoice-send:before{content:"\f1ced"}.mdi-invoice-send-outline:before{content:"\f1cee"}.mdi-invoice-text:before{content:"\f1cef"}.mdi-invoice-text-arrow-left:before{content:"\f1cf0"}.mdi-invoice-text-arrow-left-outline:before{content:"\f1cf1"}.mdi-invoice-text-arrow-right:before{content:"\f1cf2"}.mdi-invoice-text-arrow-right-outline:before{content:"\f1cf3"}.mdi-invoice-text-check:before{content:"\f1cf4"}.mdi-invoice-text-check-outline:before{content:"\f1cf5"}.mdi-invoice-text-clock:before{content:"\f1cf6"}.mdi-invoice-text-clock-outline:before{content:"\f1cf7"}.mdi-invoice-text-edit:before{content:"\f1cf8"}.mdi-invoice-text-edit-outline:before{content:"\f1cf9"}.mdi-invoice-text-fast:before{content:"\f1cfa"}.mdi-invoice-text-fast-outline:before{content:"\f1cfb"}.mdi-invoice-text-minus:before{content:"\f1cfc"}.mdi-invoice-text-minus-outline:before{content:"\f1cfd"}.mdi-invoice-text-multiple:before{content:"\f1cfe"}.mdi-invoice-text-multiple-outline:before{content:"\f1cff"}.mdi-invoice-text-outline:before{content:"\f1d00"}.mdi-invoice-text-plus:before{content:"\f1d01"}.mdi-invoice-text-plus-outline:before{content:"\f1d02"}.mdi-invoice-text-remove:before{content:"\f1d03"}.mdi-invoice-text-remove-outline:before{content:"\f1d04"}.mdi-invoice-text-send:before{content:"\f1d05"}.mdi-invoice-text-send-outline:before{content:"\f1d06"}.mdi-iobroker:before{content:"\f12e8"}.mdi-ip:before{content:"\f0a5f"}.mdi-ip-network:before{content:"\f0a60"}.mdi-ip-network-outline:before{content:"\f0c90"}.mdi-ip-outline:before{content:"\f1982"}.mdi-ipod:before{content:"\f0c91"}.mdi-iron:before{content:"\f1824"}.mdi-iron-board:before{content:"\f1838"}.mdi-iron-outline:before{content:"\f1825"}.mdi-island:before{content:"\f104f"}.mdi-island-variant:before{content:"\f1cc6"}.mdi-iv-bag:before{content:"\f10b9"}.mdi-jabber:before{content:"\f0dd5"}.mdi-jeepney:before{content:"\f0302"}.mdi-jellyfish:before{content:"\f0f01"}.mdi-jellyfish-outline:before{content:"\f0f02"}.mdi-jira:before{content:"\f0303"}.mdi-jquery:before{content:"\f087d"}.mdi-jsfiddle:before{content:"\f0304"}.mdi-jump-rope:before{content:"\f12ff"}.mdi-kabaddi:before{content:"\f0d87"}.mdi-kangaroo:before{content:"\f1558"}.mdi-karate:before{content:"\f082c"}.mdi-kayaking:before{content:"\f08af"}.mdi-keg:before{content:"\f0305"}.mdi-kettle:before{content:"\f05fa"}.mdi-kettle-alert:before{content:"\f1317"}.mdi-kettle-alert-outline:before{content:"\f1318"}.mdi-kettle-off:before{content:"\f131b"}.mdi-kettle-off-outline:before{content:"\f131c"}.mdi-kettle-outline:before{content:"\f0f56"}.mdi-kettle-pour-over:before{content:"\f173c"}.mdi-kettle-steam:before{content:"\f1319"}.mdi-kettle-steam-outline:before{content:"\f131a"}.mdi-kettlebell:before{content:"\f1300"}.mdi-key:before{content:"\f0306"}.mdi-key-alert:before{content:"\f1983"}.mdi-key-alert-outline:before{content:"\f1984"}.mdi-key-arrow-right:before{content:"\f1312"}.mdi-key-chain:before{content:"\f1574"}.mdi-key-chain-variant:before{content:"\f1575"}.mdi-key-change:before{content:"\f0307"}.mdi-key-link:before{content:"\f119f"}.mdi-key-minus:before{content:"\f0308"}.mdi-key-outline:before{content:"\f0dd6"}.mdi-key-plus:before{content:"\f0309"}.mdi-key-remove:before{content:"\f030a"}.mdi-key-star:before{content:"\f119e"}.mdi-key-variant:before{content:"\f030b"}.mdi-key-wireless:before{content:"\f0fc2"}.mdi-keyboard:before{content:"\f030c"}.mdi-keyboard-backspace:before{content:"\f030d"}.mdi-keyboard-caps:before{content:"\f030e"}.mdi-keyboard-close:before{content:"\f030f"}.mdi-keyboard-close-outline:before{content:"\f1c00"}.mdi-keyboard-esc:before{content:"\f12b7"}.mdi-keyboard-f1:before{content:"\f12ab"}.mdi-keyboard-f10:before{content:"\f12b4"}.mdi-keyboard-f11:before{content:"\f12b5"}.mdi-keyboard-f12:before{content:"\f12b6"}.mdi-keyboard-f2:before{content:"\f12ac"}.mdi-keyboard-f3:before{content:"\f12ad"}.mdi-keyboard-f4:before{content:"\f12ae"}.mdi-keyboard-f5:before{content:"\f12af"}.mdi-keyboard-f6:before{content:"\f12b0"}.mdi-keyboard-f7:before{content:"\f12b1"}.mdi-keyboard-f8:before{content:"\f12b2"}.mdi-keyboard-f9:before{content:"\f12b3"}.mdi-keyboard-off:before{content:"\f0310"}.mdi-keyboard-off-outline:before{content:"\f0e4b"}.mdi-keyboard-outline:before{content:"\f097b"}.mdi-keyboard-return:before{content:"\f0311"}.mdi-keyboard-settings:before{content:"\f09f9"}.mdi-keyboard-settings-outline:before{content:"\f09fa"}.mdi-keyboard-space:before{content:"\f1050"}.mdi-keyboard-tab:before{content:"\f0312"}.mdi-keyboard-tab-reverse:before{content:"\f0325"}.mdi-keyboard-variant:before{content:"\f0313"}.mdi-khanda:before{content:"\f10fd"}.mdi-kickstarter:before{content:"\f0745"}.mdi-kite:before{content:"\f1985"}.mdi-kite-outline:before{content:"\f1986"}.mdi-kitesurfing:before{content:"\f1744"}.mdi-klingon:before{content:"\f135b"}.mdi-knife:before{content:"\f09fb"}.mdi-knife-military:before{content:"\f09fc"}.mdi-knob:before{content:"\f1b96"}.mdi-koala:before{content:"\f173f"}.mdi-kodi:before{content:"\f0314"}.mdi-kubernetes:before{content:"\f10fe"}.mdi-label:before{content:"\f0315"}.mdi-label-multiple:before{content:"\f1375"}.mdi-label-multiple-outline:before{content:"\f1376"}.mdi-label-off:before{content:"\f0acb"}.mdi-label-off-outline:before{content:"\f0acc"}.mdi-label-outline:before{content:"\f0316"}.mdi-label-percent:before{content:"\f12ea"}.mdi-label-percent-outline:before{content:"\f12eb"}.mdi-label-variant:before{content:"\f0acd"}.mdi-label-variant-outline:before{content:"\f0ace"}.mdi-ladder:before{content:"\f15a2"}.mdi-ladybug:before{content:"\f082d"}.mdi-lambda:before{content:"\f0627"}.mdi-lamp:before{content:"\f06b5"}.mdi-lamp-outline:before{content:"\f17d0"}.mdi-lamps:before{content:"\f1576"}.mdi-lamps-outline:before{content:"\f17d1"}.mdi-lan:before{content:"\f0317"}.mdi-lan-check:before{content:"\f12aa"}.mdi-lan-connect:before{content:"\f0318"}.mdi-lan-disconnect:before{content:"\f0319"}.mdi-lan-pending:before{content:"\f031a"}.mdi-land-fields:before{content:"\f1ab2"}.mdi-land-plots:before{content:"\f1ab3"}.mdi-land-plots-circle:before{content:"\f1ab4"}.mdi-land-plots-circle-variant:before{content:"\f1ab5"}.mdi-land-plots-marker:before{content:"\f1c5d"}.mdi-land-rows-horizontal:before{content:"\f1ab6"}.mdi-land-rows-vertical:before{content:"\f1ab7"}.mdi-landslide:before{content:"\f1a48"}.mdi-landslide-outline:before{content:"\f1a49"}.mdi-language-c:before{content:"\f0671"}.mdi-language-cpp:before{content:"\f0672"}.mdi-language-csharp:before{content:"\f031b"}.mdi-language-css3:before{content:"\f031c"}.mdi-language-fortran:before{content:"\f121a"}.mdi-language-go:before{content:"\f07d3"}.mdi-language-haskell:before{content:"\f0c92"}.mdi-language-html5:before{content:"\f031d"}.mdi-language-java:before{content:"\f0b37"}.mdi-language-javascript:before{content:"\f031e"}.mdi-language-kotlin:before{content:"\f1219"}.mdi-language-lua:before{content:"\f08b1"}.mdi-language-markdown:before{content:"\f0354"}.mdi-language-markdown-outline:before{content:"\f0f5b"}.mdi-language-php:before{content:"\f031f"}.mdi-language-python:before{content:"\f0320"}.mdi-language-r:before{content:"\f07d4"}.mdi-language-ruby:before{content:"\f0d2d"}.mdi-language-ruby-on-rails:before{content:"\f0acf"}.mdi-language-rust:before{content:"\f1617"}.mdi-language-swift:before{content:"\f06e5"}.mdi-language-typescript:before{content:"\f06e6"}.mdi-language-xaml:before{content:"\f0673"}.mdi-laptop:before{content:"\f0322"}.mdi-laptop-account:before{content:"\f1a4a"}.mdi-laptop-off:before{content:"\f06e7"}.mdi-laravel:before{content:"\f0ad0"}.mdi-laser-pointer:before{content:"\f1484"}.mdi-lasso:before{content:"\f0f03"}.mdi-lastpass:before{content:"\f0446"}.mdi-latitude:before{content:"\f0f57"}.mdi-launch:before{content:"\f0327"}.mdi-lava-lamp:before{content:"\f07d5"}.mdi-layers:before{content:"\f0328"}.mdi-layers-edit:before{content:"\f1892"}.mdi-layers-minus:before{content:"\f0e4c"}.mdi-layers-off:before{content:"\f0329"}.mdi-layers-off-outline:before{content:"\f09fd"}.mdi-layers-outline:before{content:"\f09fe"}.mdi-layers-plus:before{content:"\f0e4d"}.mdi-layers-remove:before{content:"\f0e4e"}.mdi-layers-search:before{content:"\f1206"}.mdi-layers-search-outline:before{content:"\f1207"}.mdi-layers-triple:before{content:"\f0f58"}.mdi-layers-triple-outline:before{content:"\f0f59"}.mdi-lead-pencil:before{content:"\f064f"}.mdi-leaf:before{content:"\f032a"}.mdi-leaf-circle:before{content:"\f1905"}.mdi-leaf-circle-outline:before{content:"\f1906"}.mdi-leaf-maple:before{content:"\f0c93"}.mdi-leaf-maple-off:before{content:"\f12da"}.mdi-leaf-off:before{content:"\f12d9"}.mdi-leak:before{content:"\f0dd7"}.mdi-leak-off:before{content:"\f0dd8"}.mdi-lectern:before{content:"\f1af0"}.mdi-led-off:before{content:"\f032b"}.mdi-led-on:before{content:"\f032c"}.mdi-led-outline:before{content:"\f032d"}.mdi-led-strip:before{content:"\f07d6"}.mdi-led-strip-variant:before{content:"\f1051"}.mdi-led-strip-variant-off:before{content:"\f1a4b"}.mdi-led-variant-off:before{content:"\f032e"}.mdi-led-variant-on:before{content:"\f032f"}.mdi-led-variant-outline:before{content:"\f0330"}.mdi-leek:before{content:"\f117d"}.mdi-less-than:before{content:"\f097c"}.mdi-less-than-or-equal:before{content:"\f097d"}.mdi-library:before{content:"\f0331"}.mdi-library-outline:before{content:"\f1a22"}.mdi-library-shelves:before{content:"\f0ba9"}.mdi-license:before{content:"\f0fc3"}.mdi-lifebuoy:before{content:"\f087e"}.mdi-light-flood-down:before{content:"\f1987"}.mdi-light-flood-up:before{content:"\f1988"}.mdi-light-recessed:before{content:"\f179b"}.mdi-light-switch:before{content:"\f097e"}.mdi-light-switch-off:before{content:"\f1a24"}.mdi-lightbulb:before{content:"\f0335"}.mdi-lightbulb-alert:before{content:"\f19e1"}.mdi-lightbulb-alert-outline:before{content:"\f19e2"}.mdi-lightbulb-auto:before{content:"\f1800"}.mdi-lightbulb-auto-outline:before{content:"\f1801"}.mdi-lightbulb-cfl:before{content:"\f1208"}.mdi-lightbulb-cfl-off:before{content:"\f1209"}.mdi-lightbulb-cfl-spiral:before{content:"\f1275"}.mdi-lightbulb-cfl-spiral-off:before{content:"\f12c3"}.mdi-lightbulb-fluorescent-tube:before{content:"\f1804"}.mdi-lightbulb-fluorescent-tube-outline:before{content:"\f1805"}.mdi-lightbulb-group:before{content:"\f1253"}.mdi-lightbulb-group-off:before{content:"\f12cd"}.mdi-lightbulb-group-off-outline:before{content:"\f12ce"}.mdi-lightbulb-group-outline:before{content:"\f1254"}.mdi-lightbulb-multiple:before{content:"\f1255"}.mdi-lightbulb-multiple-off:before{content:"\f12cf"}.mdi-lightbulb-multiple-off-outline:before{content:"\f12d0"}.mdi-lightbulb-multiple-outline:before{content:"\f1256"}.mdi-lightbulb-night:before{content:"\f1a4c"}.mdi-lightbulb-night-outline:before{content:"\f1a4d"}.mdi-lightbulb-off:before{content:"\f0e4f"}.mdi-lightbulb-off-outline:before{content:"\f0e50"}.mdi-lightbulb-on:before{content:"\f06e8"}.mdi-lightbulb-on-10:before{content:"\f1a4e"}.mdi-lightbulb-on-20:before{content:"\f1a4f"}.mdi-lightbulb-on-30:before{content:"\f1a50"}.mdi-lightbulb-on-40:before{content:"\f1a51"}.mdi-lightbulb-on-50:before{content:"\f1a52"}.mdi-lightbulb-on-60:before{content:"\f1a53"}.mdi-lightbulb-on-70:before{content:"\f1a54"}.mdi-lightbulb-on-80:before{content:"\f1a55"}.mdi-lightbulb-on-90:before{content:"\f1a56"}.mdi-lightbulb-on-outline:before{content:"\f06e9"}.mdi-lightbulb-outline:before{content:"\f0336"}.mdi-lightbulb-question:before{content:"\f19e3"}.mdi-lightbulb-question-outline:before{content:"\f19e4"}.mdi-lightbulb-spot:before{content:"\f17f4"}.mdi-lightbulb-spot-off:before{content:"\f17f5"}.mdi-lightbulb-variant:before{content:"\f1802"}.mdi-lightbulb-variant-outline:before{content:"\f1803"}.mdi-lighthouse:before{content:"\f09ff"}.mdi-lighthouse-on:before{content:"\f0a00"}.mdi-lightning-bolt:before{content:"\f140b"}.mdi-lightning-bolt-circle:before{content:"\f0820"}.mdi-lightning-bolt-outline:before{content:"\f140c"}.mdi-line-scan:before{content:"\f0624"}.mdi-lingerie:before{content:"\f1476"}.mdi-link:before{content:"\f0337"}.mdi-link-box:before{content:"\f0d1a"}.mdi-link-box-outline:before{content:"\f0d1b"}.mdi-link-box-variant:before{content:"\f0d1c"}.mdi-link-box-variant-outline:before{content:"\f0d1d"}.mdi-link-circle:before{content:"\f1cac"}.mdi-link-circle-outline:before{content:"\f1cad"}.mdi-link-edit:before{content:"\f1cae"}.mdi-link-lock:before{content:"\f10ba"}.mdi-link-off:before{content:"\f0338"}.mdi-link-plus:before{content:"\f0c94"}.mdi-link-variant:before{content:"\f0339"}.mdi-link-variant-minus:before{content:"\f10ff"}.mdi-link-variant-off:before{content:"\f033a"}.mdi-link-variant-plus:before{content:"\f1100"}.mdi-link-variant-remove:before{content:"\f1101"}.mdi-linkedin:before{content:"\f033b"}.mdi-linux:before{content:"\f033d"}.mdi-linux-mint:before{content:"\f08ed"}.mdi-lipstick:before{content:"\f13b5"}.mdi-liquid-spot:before{content:"\f1826"}.mdi-liquor:before{content:"\f191e"}.mdi-list-box:before{content:"\f1b7b"}.mdi-list-box-outline:before{content:"\f1b7c"}.mdi-list-status:before{content:"\f15ab"}.mdi-litecoin:before{content:"\f0a61"}.mdi-loading:before{content:"\f0772"}.mdi-location-enter:before{content:"\f0fc4"}.mdi-location-exit:before{content:"\f0fc5"}.mdi-lock:before{content:"\f033e"}.mdi-lock-alert:before{content:"\f08ee"}.mdi-lock-alert-outline:before{content:"\f15d1"}.mdi-lock-check:before{content:"\f139a"}.mdi-lock-check-outline:before{content:"\f16a8"}.mdi-lock-clock:before{content:"\f097f"}.mdi-lock-minus:before{content:"\f16a9"}.mdi-lock-minus-outline:before{content:"\f16aa"}.mdi-lock-off:before{content:"\f1671"}.mdi-lock-off-outline:before{content:"\f1672"}.mdi-lock-open:before{content:"\f033f"}.mdi-lock-open-alert:before{content:"\f139b"}.mdi-lock-open-alert-outline:before{content:"\f15d2"}.mdi-lock-open-check:before{content:"\f139c"}.mdi-lock-open-check-outline:before{content:"\f16ab"}.mdi-lock-open-minus:before{content:"\f16ac"}.mdi-lock-open-minus-outline:before{content:"\f16ad"}.mdi-lock-open-outline:before{content:"\f0340"}.mdi-lock-open-plus:before{content:"\f16ae"}.mdi-lock-open-plus-outline:before{content:"\f16af"}.mdi-lock-open-remove:before{content:"\f16b0"}.mdi-lock-open-remove-outline:before{content:"\f16b1"}.mdi-lock-open-variant:before{content:"\f0fc6"}.mdi-lock-open-variant-outline:before{content:"\f0fc7"}.mdi-lock-outline:before{content:"\f0341"}.mdi-lock-pattern:before{content:"\f06ea"}.mdi-lock-percent:before{content:"\f1c12"}.mdi-lock-percent-open:before{content:"\f1c13"}.mdi-lock-percent-open-outline:before{content:"\f1c14"}.mdi-lock-percent-open-variant:before{content:"\f1c15"}.mdi-lock-percent-open-variant-outline:before{content:"\f1c16"}.mdi-lock-percent-outline:before{content:"\f1c17"}.mdi-lock-plus:before{content:"\f05fb"}.mdi-lock-plus-outline:before{content:"\f16b2"}.mdi-lock-question:before{content:"\f08ef"}.mdi-lock-remove:before{content:"\f16b3"}.mdi-lock-remove-outline:before{content:"\f16b4"}.mdi-lock-reset:before{content:"\f0773"}.mdi-lock-smart:before{content:"\f08b2"}.mdi-locker:before{content:"\f07d7"}.mdi-locker-multiple:before{content:"\f07d8"}.mdi-login:before{content:"\f0342"}.mdi-login-variant:before{content:"\f05fc"}.mdi-logout:before{content:"\f0343"}.mdi-logout-variant:before{content:"\f05fd"}.mdi-longitude:before{content:"\f0f5a"}.mdi-looks:before{content:"\f0344"}.mdi-lotion:before{content:"\f1582"}.mdi-lotion-outline:before{content:"\f1583"}.mdi-lotion-plus:before{content:"\f1584"}.mdi-lotion-plus-outline:before{content:"\f1585"}.mdi-loupe:before{content:"\f0345"}.mdi-lumx:before{content:"\f0346"}.mdi-lungs:before{content:"\f1084"}.mdi-mace:before{content:"\f1843"}.mdi-magazine-pistol:before{content:"\f0324"}.mdi-magazine-rifle:before{content:"\f0323"}.mdi-magic-staff:before{content:"\f1844"}.mdi-magnet:before{content:"\f0347"}.mdi-magnet-on:before{content:"\f0348"}.mdi-magnify:before{content:"\f0349"}.mdi-magnify-close:before{content:"\f0980"}.mdi-magnify-expand:before{content:"\f1874"}.mdi-magnify-minus:before{content:"\f034a"}.mdi-magnify-minus-cursor:before{content:"\f0a62"}.mdi-magnify-minus-outline:before{content:"\f06ec"}.mdi-magnify-plus:before{content:"\f034b"}.mdi-magnify-plus-cursor:before{content:"\f0a63"}.mdi-magnify-plus-outline:before{content:"\f06ed"}.mdi-magnify-remove-cursor:before{content:"\f120c"}.mdi-magnify-remove-outline:before{content:"\f120d"}.mdi-magnify-scan:before{content:"\f1276"}.mdi-mail:before{content:"\f0ebb"}.mdi-mailbox:before{content:"\f06ee"}.mdi-mailbox-open:before{content:"\f0d88"}.mdi-mailbox-open-outline:before{content:"\f0d89"}.mdi-mailbox-open-up:before{content:"\f0d8a"}.mdi-mailbox-open-up-outline:before{content:"\f0d8b"}.mdi-mailbox-outline:before{content:"\f0d8c"}.mdi-mailbox-up:before{content:"\f0d8d"}.mdi-mailbox-up-outline:before{content:"\f0d8e"}.mdi-manjaro:before{content:"\f160a"}.mdi-map:before{content:"\f034d"}.mdi-map-check:before{content:"\f0ebc"}.mdi-map-check-outline:before{content:"\f0ebd"}.mdi-map-clock:before{content:"\f0d1e"}.mdi-map-clock-outline:before{content:"\f0d1f"}.mdi-map-legend:before{content:"\f0a01"}.mdi-map-marker:before{content:"\f034e"}.mdi-map-marker-account:before{content:"\f18e3"}.mdi-map-marker-account-outline:before{content:"\f18e4"}.mdi-map-marker-alert:before{content:"\f0f05"}.mdi-map-marker-alert-outline:before{content:"\f0f06"}.mdi-map-marker-check:before{content:"\f0c95"}.mdi-map-marker-check-outline:before{content:"\f12fb"}.mdi-map-marker-circle:before{content:"\f034f"}.mdi-map-marker-distance:before{content:"\f08f0"}.mdi-map-marker-down:before{content:"\f1102"}.mdi-map-marker-left:before{content:"\f12db"}.mdi-map-marker-left-outline:before{content:"\f12dd"}.mdi-map-marker-minus:before{content:"\f0650"}.mdi-map-marker-minus-outline:before{content:"\f12f9"}.mdi-map-marker-multiple:before{content:"\f0350"}.mdi-map-marker-multiple-outline:before{content:"\f1277"}.mdi-map-marker-off:before{content:"\f0351"}.mdi-map-marker-off-outline:before{content:"\f12fd"}.mdi-map-marker-outline:before{content:"\f07d9"}.mdi-map-marker-path:before{content:"\f0d20"}.mdi-map-marker-plus:before{content:"\f0651"}.mdi-map-marker-plus-outline:before{content:"\f12f8"}.mdi-map-marker-question:before{content:"\f0f07"}.mdi-map-marker-question-outline:before{content:"\f0f08"}.mdi-map-marker-radius:before{content:"\f0352"}.mdi-map-marker-radius-outline:before{content:"\f12fc"}.mdi-map-marker-remove:before{content:"\f0f09"}.mdi-map-marker-remove-outline:before{content:"\f12fa"}.mdi-map-marker-remove-variant:before{content:"\f0f0a"}.mdi-map-marker-right:before{content:"\f12dc"}.mdi-map-marker-right-outline:before{content:"\f12de"}.mdi-map-marker-star:before{content:"\f1608"}.mdi-map-marker-star-outline:before{content:"\f1609"}.mdi-map-marker-up:before{content:"\f1103"}.mdi-map-minus:before{content:"\f0981"}.mdi-map-outline:before{content:"\f0982"}.mdi-map-plus:before{content:"\f0983"}.mdi-map-search:before{content:"\f0984"}.mdi-map-search-outline:before{content:"\f0985"}.mdi-mapbox:before{content:"\f0baa"}.mdi-margin:before{content:"\f0353"}.mdi-marker:before{content:"\f0652"}.mdi-marker-cancel:before{content:"\f0dd9"}.mdi-marker-check:before{content:"\f0355"}.mdi-mastodon:before{content:"\f0ad1"}.mdi-material-design:before{content:"\f0986"}.mdi-material-ui:before{content:"\f0357"}.mdi-math-compass:before{content:"\f0358"}.mdi-math-cos:before{content:"\f0c96"}.mdi-math-integral:before{content:"\f0fc8"}.mdi-math-integral-box:before{content:"\f0fc9"}.mdi-math-log:before{content:"\f1085"}.mdi-math-norm:before{content:"\f0fca"}.mdi-math-norm-box:before{content:"\f0fcb"}.mdi-math-sin:before{content:"\f0c97"}.mdi-math-tan:before{content:"\f0c98"}.mdi-matrix:before{content:"\f0628"}.mdi-medal:before{content:"\f0987"}.mdi-medal-outline:before{content:"\f1326"}.mdi-medical-bag:before{content:"\f06ef"}.mdi-medical-cotton-swab:before{content:"\f1ab8"}.mdi-medication:before{content:"\f1b14"}.mdi-medication-outline:before{content:"\f1b15"}.mdi-meditation:before{content:"\f117b"}.mdi-memory:before{content:"\f035b"}.mdi-memory-arrow-down:before{content:"\f1ca6"}.mdi-menorah:before{content:"\f17d4"}.mdi-menorah-fire:before{content:"\f17d5"}.mdi-menu:before{content:"\f035c"}.mdi-menu-close:before{content:"\f1c90"}.mdi-menu-down:before{content:"\f035d"}.mdi-menu-down-outline:before{content:"\f06b6"}.mdi-menu-left:before{content:"\f035e"}.mdi-menu-left-outline:before{content:"\f0a02"}.mdi-menu-open:before{content:"\f0bab"}.mdi-menu-right:before{content:"\f035f"}.mdi-menu-right-outline:before{content:"\f0a03"}.mdi-menu-swap:before{content:"\f0a64"}.mdi-menu-swap-outline:before{content:"\f0a65"}.mdi-menu-up:before{content:"\f0360"}.mdi-menu-up-outline:before{content:"\f06b7"}.mdi-merge:before{content:"\f0f5c"}.mdi-message:before{content:"\f0361"}.mdi-message-alert:before{content:"\f0362"}.mdi-message-alert-outline:before{content:"\f0a04"}.mdi-message-arrow-left:before{content:"\f12f2"}.mdi-message-arrow-left-outline:before{content:"\f12f3"}.mdi-message-arrow-right:before{content:"\f12f4"}.mdi-message-arrow-right-outline:before{content:"\f12f5"}.mdi-message-badge:before{content:"\f1941"}.mdi-message-badge-outline:before{content:"\f1942"}.mdi-message-bookmark:before{content:"\f15ac"}.mdi-message-bookmark-outline:before{content:"\f15ad"}.mdi-message-bulleted:before{content:"\f06a2"}.mdi-message-bulleted-off:before{content:"\f06a3"}.mdi-message-check:before{content:"\f1b8a"}.mdi-message-check-outline:before{content:"\f1b8b"}.mdi-message-cog:before{content:"\f06f1"}.mdi-message-cog-outline:before{content:"\f1172"}.mdi-message-draw:before{content:"\f0363"}.mdi-message-fast:before{content:"\f19cc"}.mdi-message-fast-outline:before{content:"\f19cd"}.mdi-message-flash:before{content:"\f15a9"}.mdi-message-flash-outline:before{content:"\f15aa"}.mdi-message-image:before{content:"\f0364"}.mdi-message-image-outline:before{content:"\f116c"}.mdi-message-lock:before{content:"\f0fcc"}.mdi-message-lock-outline:before{content:"\f116d"}.mdi-message-minus:before{content:"\f116e"}.mdi-message-minus-outline:before{content:"\f116f"}.mdi-message-off:before{content:"\f164d"}.mdi-message-off-outline:before{content:"\f164e"}.mdi-message-outline:before{content:"\f0365"}.mdi-message-plus:before{content:"\f0653"}.mdi-message-plus-outline:before{content:"\f10bb"}.mdi-message-processing:before{content:"\f0366"}.mdi-message-processing-outline:before{content:"\f1170"}.mdi-message-question:before{content:"\f173a"}.mdi-message-question-outline:before{content:"\f173b"}.mdi-message-reply:before{content:"\f0367"}.mdi-message-reply-outline:before{content:"\f173d"}.mdi-message-reply-text:before{content:"\f0368"}.mdi-message-reply-text-outline:before{content:"\f173e"}.mdi-message-settings:before{content:"\f06f0"}.mdi-message-settings-outline:before{content:"\f1171"}.mdi-message-star:before{content:"\f069a"}.mdi-message-star-outline:before{content:"\f1250"}.mdi-message-text:before{content:"\f0369"}.mdi-message-text-clock:before{content:"\f1173"}.mdi-message-text-clock-outline:before{content:"\f1174"}.mdi-message-text-fast:before{content:"\f19ce"}.mdi-message-text-fast-outline:before{content:"\f19cf"}.mdi-message-text-lock:before{content:"\f0fcd"}.mdi-message-text-lock-outline:before{content:"\f1175"}.mdi-message-text-outline:before{content:"\f036a"}.mdi-message-video:before{content:"\f036b"}.mdi-meteor:before{content:"\f0629"}.mdi-meter-electric:before{content:"\f1a57"}.mdi-meter-electric-outline:before{content:"\f1a58"}.mdi-meter-gas:before{content:"\f1a59"}.mdi-meter-gas-outline:before{content:"\f1a5a"}.mdi-metronome:before{content:"\f07da"}.mdi-metronome-tick:before{content:"\f07db"}.mdi-micro-sd:before{content:"\f07dc"}.mdi-microphone:before{content:"\f036c"}.mdi-microphone-message:before{content:"\f050a"}.mdi-microphone-message-off:before{content:"\f050b"}.mdi-microphone-minus:before{content:"\f08b3"}.mdi-microphone-off:before{content:"\f036d"}.mdi-microphone-outline:before{content:"\f036e"}.mdi-microphone-plus:before{content:"\f08b4"}.mdi-microphone-question:before{content:"\f1989"}.mdi-microphone-question-outline:before{content:"\f198a"}.mdi-microphone-settings:before{content:"\f036f"}.mdi-microphone-variant:before{content:"\f0370"}.mdi-microphone-variant-off:before{content:"\f0371"}.mdi-microscope:before{content:"\f0654"}.mdi-microsoft:before{content:"\f0372"}.mdi-microsoft-access:before{content:"\f138e"}.mdi-microsoft-azure:before{content:"\f0805"}.mdi-microsoft-azure-devops:before{content:"\f0fd5"}.mdi-microsoft-bing:before{content:"\f00a4"}.mdi-microsoft-dynamics-365:before{content:"\f0988"}.mdi-microsoft-edge:before{content:"\f01e9"}.mdi-microsoft-excel:before{content:"\f138f"}.mdi-microsoft-internet-explorer:before{content:"\f0300"}.mdi-microsoft-office:before{content:"\f03c6"}.mdi-microsoft-onedrive:before{content:"\f03ca"}.mdi-microsoft-onenote:before{content:"\f0747"}.mdi-microsoft-outlook:before{content:"\f0d22"}.mdi-microsoft-powerpoint:before{content:"\f1390"}.mdi-microsoft-sharepoint:before{content:"\f1391"}.mdi-microsoft-teams:before{content:"\f02bb"}.mdi-microsoft-visual-studio:before{content:"\f0610"}.mdi-microsoft-visual-studio-code:before{content:"\f0a1e"}.mdi-microsoft-windows:before{content:"\f05b3"}.mdi-microsoft-windows-classic:before{content:"\f0a21"}.mdi-microsoft-word:before{content:"\f1392"}.mdi-microsoft-xbox:before{content:"\f05b9"}.mdi-microsoft-xbox-controller:before{content:"\f05ba"}.mdi-microsoft-xbox-controller-battery-alert:before{content:"\f074b"}.mdi-microsoft-xbox-controller-battery-charging:before{content:"\f0a22"}.mdi-microsoft-xbox-controller-battery-empty:before{content:"\f074c"}.mdi-microsoft-xbox-controller-battery-full:before{content:"\f074d"}.mdi-microsoft-xbox-controller-battery-low:before{content:"\f074e"}.mdi-microsoft-xbox-controller-battery-medium:before{content:"\f074f"}.mdi-microsoft-xbox-controller-battery-unknown:before{content:"\f0750"}.mdi-microsoft-xbox-controller-menu:before{content:"\f0e6f"}.mdi-microsoft-xbox-controller-off:before{content:"\f05bb"}.mdi-microsoft-xbox-controller-view:before{content:"\f0e70"}.mdi-microwave:before{content:"\f0c99"}.mdi-microwave-off:before{content:"\f1423"}.mdi-middleware:before{content:"\f0f5d"}.mdi-middleware-outline:before{content:"\f0f5e"}.mdi-midi:before{content:"\f08f1"}.mdi-midi-port:before{content:"\f08f2"}.mdi-mine:before{content:"\f0dda"}.mdi-minecraft:before{content:"\f0373"}.mdi-mini-sd:before{content:"\f0a05"}.mdi-minidisc:before{content:"\f0a06"}.mdi-minus:before{content:"\f0374"}.mdi-minus-box:before{content:"\f0375"}.mdi-minus-box-multiple:before{content:"\f1141"}.mdi-minus-box-multiple-outline:before{content:"\f1142"}.mdi-minus-box-outline:before{content:"\f06f2"}.mdi-minus-circle:before{content:"\f0376"}.mdi-minus-circle-multiple:before{content:"\f035a"}.mdi-minus-circle-multiple-outline:before{content:"\f0ad3"}.mdi-minus-circle-off:before{content:"\f1459"}.mdi-minus-circle-off-outline:before{content:"\f145a"}.mdi-minus-circle-outline:before{content:"\f0377"}.mdi-minus-network:before{content:"\f0378"}.mdi-minus-network-outline:before{content:"\f0c9a"}.mdi-minus-thick:before{content:"\f1639"}.mdi-mirror:before{content:"\f11fd"}.mdi-mirror-rectangle:before{content:"\f179f"}.mdi-mirror-variant:before{content:"\f17a0"}.mdi-mixed-martial-arts:before{content:"\f0d8f"}.mdi-mixed-reality:before{content:"\f087f"}.mdi-molecule:before{content:"\f0bac"}.mdi-molecule-co:before{content:"\f12fe"}.mdi-molecule-co2:before{content:"\f07e4"}.mdi-monitor:before{content:"\f0379"}.mdi-monitor-account:before{content:"\f1a5b"}.mdi-monitor-arrow-down:before{content:"\f19d0"}.mdi-monitor-arrow-down-variant:before{content:"\f19d1"}.mdi-monitor-cellphone:before{content:"\f0989"}.mdi-monitor-cellphone-star:before{content:"\f098a"}.mdi-monitor-dashboard:before{content:"\f0a07"}.mdi-monitor-edit:before{content:"\f12c6"}.mdi-monitor-eye:before{content:"\f13b4"}.mdi-monitor-lock:before{content:"\f0ddb"}.mdi-monitor-multiple:before{content:"\f037a"}.mdi-monitor-off:before{content:"\f0d90"}.mdi-monitor-screenshot:before{content:"\f0e51"}.mdi-monitor-share:before{content:"\f1483"}.mdi-monitor-shimmer:before{content:"\f1104"}.mdi-monitor-small:before{content:"\f1876"}.mdi-monitor-speaker:before{content:"\f0f5f"}.mdi-monitor-speaker-off:before{content:"\f0f60"}.mdi-monitor-star:before{content:"\f0ddc"}.mdi-monitor-vertical:before{content:"\f1c33"}.mdi-moon-first-quarter:before{content:"\f0f61"}.mdi-moon-full:before{content:"\f0f62"}.mdi-moon-last-quarter:before{content:"\f0f63"}.mdi-moon-new:before{content:"\f0f64"}.mdi-moon-waning-crescent:before{content:"\f0f65"}.mdi-moon-waning-gibbous:before{content:"\f0f66"}.mdi-moon-waxing-crescent:before{content:"\f0f67"}.mdi-moon-waxing-gibbous:before{content:"\f0f68"}.mdi-moped:before{content:"\f1086"}.mdi-moped-electric:before{content:"\f15b7"}.mdi-moped-electric-outline:before{content:"\f15b8"}.mdi-moped-outline:before{content:"\f15b9"}.mdi-more:before{content:"\f037b"}.mdi-mortar-pestle:before{content:"\f1748"}.mdi-mortar-pestle-plus:before{content:"\f03f1"}.mdi-mosque:before{content:"\f0d45"}.mdi-mosque-outline:before{content:"\f1827"}.mdi-mother-heart:before{content:"\f1314"}.mdi-mother-nurse:before{content:"\f0d21"}.mdi-motion:before{content:"\f15b2"}.mdi-motion-outline:before{content:"\f15b3"}.mdi-motion-pause:before{content:"\f1590"}.mdi-motion-pause-outline:before{content:"\f1592"}.mdi-motion-play:before{content:"\f158f"}.mdi-motion-play-outline:before{content:"\f1591"}.mdi-motion-sensor:before{content:"\f0d91"}.mdi-motion-sensor-off:before{content:"\f1435"}.mdi-motorbike:before{content:"\f037c"}.mdi-motorbike-electric:before{content:"\f15ba"}.mdi-motorbike-off:before{content:"\f1b16"}.mdi-mouse:before{content:"\f037d"}.mdi-mouse-bluetooth:before{content:"\f098b"}.mdi-mouse-left-click:before{content:"\f1d07"}.mdi-mouse-left-click-outline:before{content:"\f1d08"}.mdi-mouse-move-down:before{content:"\f1550"}.mdi-mouse-move-up:before{content:"\f1551"}.mdi-mouse-move-vertical:before{content:"\f1552"}.mdi-mouse-off:before{content:"\f037e"}.mdi-mouse-outline:before{content:"\f1d09"}.mdi-mouse-right-click:before{content:"\f1d0a"}.mdi-mouse-right-click-outline:before{content:"\f1d0b"}.mdi-mouse-scroll-wheel:before{content:"\f1d0c"}.mdi-mouse-variant:before{content:"\f037f"}.mdi-mouse-variant-off:before{content:"\f0380"}.mdi-move-resize:before{content:"\f0655"}.mdi-move-resize-variant:before{content:"\f0656"}.mdi-movie:before{content:"\f0381"}.mdi-movie-check:before{content:"\f16f3"}.mdi-movie-check-outline:before{content:"\f16f4"}.mdi-movie-cog:before{content:"\f16f5"}.mdi-movie-cog-outline:before{content:"\f16f6"}.mdi-movie-edit:before{content:"\f1122"}.mdi-movie-edit-outline:before{content:"\f1123"}.mdi-movie-filter:before{content:"\f1124"}.mdi-movie-filter-outline:before{content:"\f1125"}.mdi-movie-minus:before{content:"\f16f7"}.mdi-movie-minus-outline:before{content:"\f16f8"}.mdi-movie-off:before{content:"\f16f9"}.mdi-movie-off-outline:before{content:"\f16fa"}.mdi-movie-open:before{content:"\f0fce"}.mdi-movie-open-check:before{content:"\f16fb"}.mdi-movie-open-check-outline:before{content:"\f16fc"}.mdi-movie-open-cog:before{content:"\f16fd"}.mdi-movie-open-cog-outline:before{content:"\f16fe"}.mdi-movie-open-edit:before{content:"\f16ff"}.mdi-movie-open-edit-outline:before{content:"\f1700"}.mdi-movie-open-minus:before{content:"\f1701"}.mdi-movie-open-minus-outline:before{content:"\f1702"}.mdi-movie-open-off:before{content:"\f1703"}.mdi-movie-open-off-outline:before{content:"\f1704"}.mdi-movie-open-outline:before{content:"\f0fcf"}.mdi-movie-open-play:before{content:"\f1705"}.mdi-movie-open-play-outline:before{content:"\f1706"}.mdi-movie-open-plus:before{content:"\f1707"}.mdi-movie-open-plus-outline:before{content:"\f1708"}.mdi-movie-open-remove:before{content:"\f1709"}.mdi-movie-open-remove-outline:before{content:"\f170a"}.mdi-movie-open-settings:before{content:"\f170b"}.mdi-movie-open-settings-outline:before{content:"\f170c"}.mdi-movie-open-star:before{content:"\f170d"}.mdi-movie-open-star-outline:before{content:"\f170e"}.mdi-movie-outline:before{content:"\f0ddd"}.mdi-movie-play:before{content:"\f170f"}.mdi-movie-play-outline:before{content:"\f1710"}.mdi-movie-plus:before{content:"\f1711"}.mdi-movie-plus-outline:before{content:"\f1712"}.mdi-movie-remove:before{content:"\f1713"}.mdi-movie-remove-outline:before{content:"\f1714"}.mdi-movie-roll:before{content:"\f07de"}.mdi-movie-search:before{content:"\f11d2"}.mdi-movie-search-outline:before{content:"\f11d3"}.mdi-movie-settings:before{content:"\f1715"}.mdi-movie-settings-outline:before{content:"\f1716"}.mdi-movie-star:before{content:"\f1717"}.mdi-movie-star-outline:before{content:"\f1718"}.mdi-mower:before{content:"\f166f"}.mdi-mower-bag:before{content:"\f1670"}.mdi-mower-bag-on:before{content:"\f1b60"}.mdi-mower-on:before{content:"\f1b5f"}.mdi-muffin:before{content:"\f098c"}.mdi-multicast:before{content:"\f1893"}.mdi-multimedia:before{content:"\f1b97"}.mdi-multiplication:before{content:"\f0382"}.mdi-multiplication-box:before{content:"\f0383"}.mdi-mushroom:before{content:"\f07df"}.mdi-mushroom-off:before{content:"\f13fa"}.mdi-mushroom-off-outline:before{content:"\f13fb"}.mdi-mushroom-outline:before{content:"\f07e0"}.mdi-music:before{content:"\f075a"}.mdi-music-accidental-double-flat:before{content:"\f0f69"}.mdi-music-accidental-double-sharp:before{content:"\f0f6a"}.mdi-music-accidental-flat:before{content:"\f0f6b"}.mdi-music-accidental-natural:before{content:"\f0f6c"}.mdi-music-accidental-sharp:before{content:"\f0f6d"}.mdi-music-box:before{content:"\f0384"}.mdi-music-box-multiple:before{content:"\f0333"}.mdi-music-box-multiple-outline:before{content:"\f0f04"}.mdi-music-box-outline:before{content:"\f0385"}.mdi-music-circle:before{content:"\f0386"}.mdi-music-circle-outline:before{content:"\f0ad4"}.mdi-music-clef-alto:before{content:"\f0f6e"}.mdi-music-clef-bass:before{content:"\f0f6f"}.mdi-music-clef-treble:before{content:"\f0f70"}.mdi-music-note:before{content:"\f0387"}.mdi-music-note-bluetooth:before{content:"\f05fe"}.mdi-music-note-bluetooth-off:before{content:"\f05ff"}.mdi-music-note-eighth:before{content:"\f0388"}.mdi-music-note-eighth-dotted:before{content:"\f0f71"}.mdi-music-note-half:before{content:"\f0389"}.mdi-music-note-half-dotted:before{content:"\f0f72"}.mdi-music-note-minus:before{content:"\f1b89"}.mdi-music-note-off:before{content:"\f038a"}.mdi-music-note-off-outline:before{content:"\f0f73"}.mdi-music-note-outline:before{content:"\f0f74"}.mdi-music-note-plus:before{content:"\f0dde"}.mdi-music-note-quarter:before{content:"\f038b"}.mdi-music-note-quarter-dotted:before{content:"\f0f75"}.mdi-music-note-sixteenth:before{content:"\f038c"}.mdi-music-note-sixteenth-dotted:before{content:"\f0f76"}.mdi-music-note-whole:before{content:"\f038d"}.mdi-music-note-whole-dotted:before{content:"\f0f77"}.mdi-music-off:before{content:"\f075b"}.mdi-music-rest-eighth:before{content:"\f0f78"}.mdi-music-rest-half:before{content:"\f0f79"}.mdi-music-rest-quarter:before{content:"\f0f7a"}.mdi-music-rest-sixteenth:before{content:"\f0f7b"}.mdi-music-rest-whole:before{content:"\f0f7c"}.mdi-mustache:before{content:"\f15de"}.mdi-nail:before{content:"\f0ddf"}.mdi-nas:before{content:"\f08f3"}.mdi-nativescript:before{content:"\f0880"}.mdi-nature:before{content:"\f038e"}.mdi-nature-outline:before{content:"\f1c71"}.mdi-nature-people:before{content:"\f038f"}.mdi-nature-people-outline:before{content:"\f1c72"}.mdi-navigation:before{content:"\f0390"}.mdi-navigation-outline:before{content:"\f1607"}.mdi-navigation-variant:before{content:"\f18f0"}.mdi-navigation-variant-outline:before{content:"\f18f1"}.mdi-near-me:before{content:"\f05cd"}.mdi-necklace:before{content:"\f0f0b"}.mdi-needle:before{content:"\f0391"}.mdi-needle-off:before{content:"\f19d2"}.mdi-netflix:before{content:"\f0746"}.mdi-network:before{content:"\f06f3"}.mdi-network-off:before{content:"\f0c9b"}.mdi-network-off-outline:before{content:"\f0c9c"}.mdi-network-outline:before{content:"\f0c9d"}.mdi-network-pos:before{content:"\f1acb"}.mdi-network-strength-1:before{content:"\f08f4"}.mdi-network-strength-1-alert:before{content:"\f08f5"}.mdi-network-strength-2:before{content:"\f08f6"}.mdi-network-strength-2-alert:before{content:"\f08f7"}.mdi-network-strength-3:before{content:"\f08f8"}.mdi-network-strength-3-alert:before{content:"\f08f9"}.mdi-network-strength-4:before{content:"\f08fa"}.mdi-network-strength-4-alert:before{content:"\f08fb"}.mdi-network-strength-4-cog:before{content:"\f191a"}.mdi-network-strength-off:before{content:"\f08fc"}.mdi-network-strength-off-outline:before{content:"\f08fd"}.mdi-network-strength-outline:before{content:"\f08fe"}.mdi-new-box:before{content:"\f0394"}.mdi-newspaper:before{content:"\f0395"}.mdi-newspaper-check:before{content:"\f1943"}.mdi-newspaper-minus:before{content:"\f0f0c"}.mdi-newspaper-plus:before{content:"\f0f0d"}.mdi-newspaper-remove:before{content:"\f1944"}.mdi-newspaper-variant:before{content:"\f1001"}.mdi-newspaper-variant-multiple:before{content:"\f1002"}.mdi-newspaper-variant-multiple-outline:before{content:"\f1003"}.mdi-newspaper-variant-outline:before{content:"\f1004"}.mdi-nfc:before{content:"\f0396"}.mdi-nfc-search-variant:before{content:"\f0e53"}.mdi-nfc-tap:before{content:"\f0397"}.mdi-nfc-variant:before{content:"\f0398"}.mdi-nfc-variant-off:before{content:"\f0e54"}.mdi-ninja:before{content:"\f0774"}.mdi-nintendo-game-boy:before{content:"\f1393"}.mdi-nintendo-switch:before{content:"\f07e1"}.mdi-nintendo-wii:before{content:"\f05ab"}.mdi-nintendo-wiiu:before{content:"\f072d"}.mdi-nix:before{content:"\f1105"}.mdi-nodejs:before{content:"\f0399"}.mdi-noodles:before{content:"\f117e"}.mdi-not-equal:before{content:"\f098d"}.mdi-not-equal-variant:before{content:"\f098e"}.mdi-note:before{content:"\f039a"}.mdi-note-alert:before{content:"\f177d"}.mdi-note-alert-outline:before{content:"\f177e"}.mdi-note-check:before{content:"\f177f"}.mdi-note-check-outline:before{content:"\f1780"}.mdi-note-edit:before{content:"\f1781"}.mdi-note-edit-outline:before{content:"\f1782"}.mdi-note-minus:before{content:"\f164f"}.mdi-note-minus-outline:before{content:"\f1650"}.mdi-note-multiple:before{content:"\f06b8"}.mdi-note-multiple-outline:before{content:"\f06b9"}.mdi-note-off:before{content:"\f1783"}.mdi-note-off-outline:before{content:"\f1784"}.mdi-note-outline:before{content:"\f039b"}.mdi-note-plus:before{content:"\f039c"}.mdi-note-plus-outline:before{content:"\f039d"}.mdi-note-remove:before{content:"\f1651"}.mdi-note-remove-outline:before{content:"\f1652"}.mdi-note-search:before{content:"\f1653"}.mdi-note-search-outline:before{content:"\f1654"}.mdi-note-text:before{content:"\f039e"}.mdi-note-text-outline:before{content:"\f11d7"}.mdi-notebook:before{content:"\f082e"}.mdi-notebook-check:before{content:"\f14f5"}.mdi-notebook-check-outline:before{content:"\f14f6"}.mdi-notebook-edit:before{content:"\f14e7"}.mdi-notebook-edit-outline:before{content:"\f14e9"}.mdi-notebook-heart:before{content:"\f1a0b"}.mdi-notebook-heart-outline:before{content:"\f1a0c"}.mdi-notebook-minus:before{content:"\f1610"}.mdi-notebook-minus-outline:before{content:"\f1611"}.mdi-notebook-multiple:before{content:"\f0e55"}.mdi-notebook-outline:before{content:"\f0ebf"}.mdi-notebook-plus:before{content:"\f1612"}.mdi-notebook-plus-outline:before{content:"\f1613"}.mdi-notebook-remove:before{content:"\f1614"}.mdi-notebook-remove-outline:before{content:"\f1615"}.mdi-notification-clear-all:before{content:"\f039f"}.mdi-npm:before{content:"\f06f7"}.mdi-nuke:before{content:"\f06a4"}.mdi-null:before{content:"\f07e2"}.mdi-numeric:before{content:"\f03a0"}.mdi-numeric-0:before{content:"\f0b39"}.mdi-numeric-0-box:before{content:"\f03a1"}.mdi-numeric-0-box-multiple:before{content:"\f0f0e"}.mdi-numeric-0-box-multiple-outline:before{content:"\f03a2"}.mdi-numeric-0-box-outline:before{content:"\f03a3"}.mdi-numeric-0-circle:before{content:"\f0c9e"}.mdi-numeric-0-circle-outline:before{content:"\f0c9f"}.mdi-numeric-1:before{content:"\f0b3a"}.mdi-numeric-1-box:before{content:"\f03a4"}.mdi-numeric-1-box-multiple:before{content:"\f0f0f"}.mdi-numeric-1-box-multiple-outline:before{content:"\f03a5"}.mdi-numeric-1-box-outline:before{content:"\f03a6"}.mdi-numeric-1-circle:before{content:"\f0ca0"}.mdi-numeric-1-circle-outline:before{content:"\f0ca1"}.mdi-numeric-10:before{content:"\f0fe9"}.mdi-numeric-10-box:before{content:"\f0f7d"}.mdi-numeric-10-box-multiple:before{content:"\f0fea"}.mdi-numeric-10-box-multiple-outline:before{content:"\f0feb"}.mdi-numeric-10-box-outline:before{content:"\f0f7e"}.mdi-numeric-10-circle:before{content:"\f0fec"}.mdi-numeric-10-circle-outline:before{content:"\f0fed"}.mdi-numeric-2:before{content:"\f0b3b"}.mdi-numeric-2-box:before{content:"\f03a7"}.mdi-numeric-2-box-multiple:before{content:"\f0f10"}.mdi-numeric-2-box-multiple-outline:before{content:"\f03a8"}.mdi-numeric-2-box-outline:before{content:"\f03a9"}.mdi-numeric-2-circle:before{content:"\f0ca2"}.mdi-numeric-2-circle-outline:before{content:"\f0ca3"}.mdi-numeric-3:before{content:"\f0b3c"}.mdi-numeric-3-box:before{content:"\f03aa"}.mdi-numeric-3-box-multiple:before{content:"\f0f11"}.mdi-numeric-3-box-multiple-outline:before{content:"\f03ab"}.mdi-numeric-3-box-outline:before{content:"\f03ac"}.mdi-numeric-3-circle:before{content:"\f0ca4"}.mdi-numeric-3-circle-outline:before{content:"\f0ca5"}.mdi-numeric-4:before{content:"\f0b3d"}.mdi-numeric-4-box:before{content:"\f03ad"}.mdi-numeric-4-box-multiple:before{content:"\f0f12"}.mdi-numeric-4-box-multiple-outline:before{content:"\f03b2"}.mdi-numeric-4-box-outline:before{content:"\f03ae"}.mdi-numeric-4-circle:before{content:"\f0ca6"}.mdi-numeric-4-circle-outline:before{content:"\f0ca7"}.mdi-numeric-5:before{content:"\f0b3e"}.mdi-numeric-5-box:before{content:"\f03b1"}.mdi-numeric-5-box-multiple:before{content:"\f0f13"}.mdi-numeric-5-box-multiple-outline:before{content:"\f03af"}.mdi-numeric-5-box-outline:before{content:"\f03b0"}.mdi-numeric-5-circle:before{content:"\f0ca8"}.mdi-numeric-5-circle-outline:before{content:"\f0ca9"}.mdi-numeric-6:before{content:"\f0b3f"}.mdi-numeric-6-box:before{content:"\f03b3"}.mdi-numeric-6-box-multiple:before{content:"\f0f14"}.mdi-numeric-6-box-multiple-outline:before{content:"\f03b4"}.mdi-numeric-6-box-outline:before{content:"\f03b5"}.mdi-numeric-6-circle:before{content:"\f0caa"}.mdi-numeric-6-circle-outline:before{content:"\f0cab"}.mdi-numeric-7:before{content:"\f0b40"}.mdi-numeric-7-box:before{content:"\f03b6"}.mdi-numeric-7-box-multiple:before{content:"\f0f15"}.mdi-numeric-7-box-multiple-outline:before{content:"\f03b7"}.mdi-numeric-7-box-outline:before{content:"\f03b8"}.mdi-numeric-7-circle:before{content:"\f0cac"}.mdi-numeric-7-circle-outline:before{content:"\f0cad"}.mdi-numeric-8:before{content:"\f0b41"}.mdi-numeric-8-box:before{content:"\f03b9"}.mdi-numeric-8-box-multiple:before{content:"\f0f16"}.mdi-numeric-8-box-multiple-outline:before{content:"\f03ba"}.mdi-numeric-8-box-outline:before{content:"\f03bb"}.mdi-numeric-8-circle:before{content:"\f0cae"}.mdi-numeric-8-circle-outline:before{content:"\f0caf"}.mdi-numeric-9:before{content:"\f0b42"}.mdi-numeric-9-box:before{content:"\f03bc"}.mdi-numeric-9-box-multiple:before{content:"\f0f17"}.mdi-numeric-9-box-multiple-outline:before{content:"\f03bd"}.mdi-numeric-9-box-outline:before{content:"\f03be"}.mdi-numeric-9-circle:before{content:"\f0cb0"}.mdi-numeric-9-circle-outline:before{content:"\f0cb1"}.mdi-numeric-9-plus:before{content:"\f0fee"}.mdi-numeric-9-plus-box:before{content:"\f03bf"}.mdi-numeric-9-plus-box-multiple:before{content:"\f0f18"}.mdi-numeric-9-plus-box-multiple-outline:before{content:"\f03c0"}.mdi-numeric-9-plus-box-outline:before{content:"\f03c1"}.mdi-numeric-9-plus-circle:before{content:"\f0cb2"}.mdi-numeric-9-plus-circle-outline:before{content:"\f0cb3"}.mdi-numeric-negative-1:before{content:"\f1052"}.mdi-numeric-off:before{content:"\f19d3"}.mdi-numeric-positive-1:before{content:"\f15cb"}.mdi-nut:before{content:"\f06f8"}.mdi-nutrition:before{content:"\f03c2"}.mdi-nuxt:before{content:"\f1106"}.mdi-oar:before{content:"\f067c"}.mdi-ocarina:before{content:"\f0de0"}.mdi-oci:before{content:"\f12e9"}.mdi-ocr:before{content:"\f113a"}.mdi-octagon:before{content:"\f03c3"}.mdi-octagon-outline:before{content:"\f03c4"}.mdi-octagram:before{content:"\f06f9"}.mdi-octagram-edit:before{content:"\f1c34"}.mdi-octagram-edit-outline:before{content:"\f1c35"}.mdi-octagram-minus:before{content:"\f1c36"}.mdi-octagram-minus-outline:before{content:"\f1c37"}.mdi-octagram-outline:before{content:"\f0775"}.mdi-octagram-plus:before{content:"\f1c38"}.mdi-octagram-plus-outline:before{content:"\f1c39"}.mdi-octahedron:before{content:"\f1950"}.mdi-octahedron-off:before{content:"\f1951"}.mdi-odnoklassniki:before{content:"\f03c5"}.mdi-offer:before{content:"\f121b"}.mdi-office-building:before{content:"\f0991"}.mdi-office-building-cog:before{content:"\f1949"}.mdi-office-building-cog-outline:before{content:"\f194a"}.mdi-office-building-marker:before{content:"\f1520"}.mdi-office-building-marker-outline:before{content:"\f1521"}.mdi-office-building-minus:before{content:"\f1baa"}.mdi-office-building-minus-outline:before{content:"\f1bab"}.mdi-office-building-outline:before{content:"\f151f"}.mdi-office-building-plus:before{content:"\f1ba8"}.mdi-office-building-plus-outline:before{content:"\f1ba9"}.mdi-office-building-remove:before{content:"\f1bac"}.mdi-office-building-remove-outline:before{content:"\f1bad"}.mdi-oil:before{content:"\f03c7"}.mdi-oil-lamp:before{content:"\f0f19"}.mdi-oil-level:before{content:"\f1053"}.mdi-oil-temperature:before{content:"\f0ff8"}.mdi-om:before{content:"\f0973"}.mdi-omega:before{content:"\f03c9"}.mdi-one-up:before{content:"\f0bad"}.mdi-onepassword:before{content:"\f0881"}.mdi-opacity:before{content:"\f05cc"}.mdi-open-in-app:before{content:"\f03cb"}.mdi-open-in-new:before{content:"\f03cc"}.mdi-open-source-initiative:before{content:"\f0bae"}.mdi-openid:before{content:"\f03cd"}.mdi-opera:before{content:"\f03ce"}.mdi-orbit:before{content:"\f0018"}.mdi-orbit-variant:before{content:"\f15db"}.mdi-order-alphabetical-ascending:before{content:"\f020d"}.mdi-order-alphabetical-descending:before{content:"\f0d07"}.mdi-order-bool-ascending:before{content:"\f02be"}.mdi-order-bool-ascending-variant:before{content:"\f098f"}.mdi-order-bool-descending:before{content:"\f1384"}.mdi-order-bool-descending-variant:before{content:"\f0990"}.mdi-order-numeric-ascending:before{content:"\f0545"}.mdi-order-numeric-descending:before{content:"\f0546"}.mdi-origin:before{content:"\f0b43"}.mdi-ornament:before{content:"\f03cf"}.mdi-ornament-variant:before{content:"\f03d0"}.mdi-outdoor-lamp:before{content:"\f1054"}.mdi-overscan:before{content:"\f1005"}.mdi-owl:before{content:"\f03d2"}.mdi-pac-man:before{content:"\f0baf"}.mdi-package:before{content:"\f03d3"}.mdi-package-check:before{content:"\f1b51"}.mdi-package-down:before{content:"\f03d4"}.mdi-package-up:before{content:"\f03d5"}.mdi-package-variant:before{content:"\f03d6"}.mdi-package-variant-closed:before{content:"\f03d7"}.mdi-package-variant-closed-check:before{content:"\f1b52"}.mdi-package-variant-closed-minus:before{content:"\f19d4"}.mdi-package-variant-closed-plus:before{content:"\f19d5"}.mdi-package-variant-closed-remove:before{content:"\f19d6"}.mdi-package-variant-minus:before{content:"\f19d7"}.mdi-package-variant-plus:before{content:"\f19d8"}.mdi-package-variant-remove:before{content:"\f19d9"}.mdi-page-first:before{content:"\f0600"}.mdi-page-last:before{content:"\f0601"}.mdi-page-layout-body:before{content:"\f06fa"}.mdi-page-layout-footer:before{content:"\f06fb"}.mdi-page-layout-header:before{content:"\f06fc"}.mdi-page-layout-header-footer:before{content:"\f0f7f"}.mdi-page-layout-sidebar-left:before{content:"\f06fd"}.mdi-page-layout-sidebar-right:before{content:"\f06fe"}.mdi-page-next:before{content:"\f0bb0"}.mdi-page-next-outline:before{content:"\f0bb1"}.mdi-page-previous:before{content:"\f0bb2"}.mdi-page-previous-outline:before{content:"\f0bb3"}.mdi-pail:before{content:"\f1417"}.mdi-pail-minus:before{content:"\f1437"}.mdi-pail-minus-outline:before{content:"\f143c"}.mdi-pail-off:before{content:"\f1439"}.mdi-pail-off-outline:before{content:"\f143e"}.mdi-pail-outline:before{content:"\f143a"}.mdi-pail-plus:before{content:"\f1436"}.mdi-pail-plus-outline:before{content:"\f143b"}.mdi-pail-remove:before{content:"\f1438"}.mdi-pail-remove-outline:before{content:"\f143d"}.mdi-palette:before{content:"\f03d8"}.mdi-palette-advanced:before{content:"\f03d9"}.mdi-palette-outline:before{content:"\f0e0c"}.mdi-palette-swatch:before{content:"\f08b5"}.mdi-palette-swatch-outline:before{content:"\f135c"}.mdi-palette-swatch-variant:before{content:"\f195a"}.mdi-palm-tree:before{content:"\f1055"}.mdi-pan:before{content:"\f0bb4"}.mdi-pan-bottom-left:before{content:"\f0bb5"}.mdi-pan-bottom-right:before{content:"\f0bb6"}.mdi-pan-down:before{content:"\f0bb7"}.mdi-pan-horizontal:before{content:"\f0bb8"}.mdi-pan-left:before{content:"\f0bb9"}.mdi-pan-right:before{content:"\f0bba"}.mdi-pan-top-left:before{content:"\f0bbb"}.mdi-pan-top-right:before{content:"\f0bbc"}.mdi-pan-up:before{content:"\f0bbd"}.mdi-pan-vertical:before{content:"\f0bbe"}.mdi-panda:before{content:"\f03da"}.mdi-pandora:before{content:"\f03db"}.mdi-panorama:before{content:"\f03dc"}.mdi-panorama-fisheye:before{content:"\f03dd"}.mdi-panorama-horizontal:before{content:"\f1928"}.mdi-panorama-horizontal-outline:before{content:"\f03de"}.mdi-panorama-outline:before{content:"\f198c"}.mdi-panorama-sphere:before{content:"\f198d"}.mdi-panorama-sphere-outline:before{content:"\f198e"}.mdi-panorama-variant:before{content:"\f198f"}.mdi-panorama-variant-outline:before{content:"\f1990"}.mdi-panorama-vertical:before{content:"\f1929"}.mdi-panorama-vertical-outline:before{content:"\f03df"}.mdi-panorama-wide-angle:before{content:"\f195f"}.mdi-panorama-wide-angle-outline:before{content:"\f03e0"}.mdi-paper-cut-vertical:before{content:"\f03e1"}.mdi-paper-roll:before{content:"\f1157"}.mdi-paper-roll-outline:before{content:"\f1158"}.mdi-paperclip:before{content:"\f03e2"}.mdi-paperclip-check:before{content:"\f1ac6"}.mdi-paperclip-lock:before{content:"\f19da"}.mdi-paperclip-minus:before{content:"\f1ac7"}.mdi-paperclip-off:before{content:"\f1ac8"}.mdi-paperclip-plus:before{content:"\f1ac9"}.mdi-paperclip-remove:before{content:"\f1aca"}.mdi-parachute:before{content:"\f0cb4"}.mdi-parachute-outline:before{content:"\f0cb5"}.mdi-paragliding:before{content:"\f1745"}.mdi-parking:before{content:"\f03e3"}.mdi-party-popper:before{content:"\f1056"}.mdi-passport:before{content:"\f07e3"}.mdi-passport-alert:before{content:"\f1cb8"}.mdi-passport-biometric:before{content:"\f0de1"}.mdi-passport-cancel:before{content:"\f1cb9"}.mdi-passport-check:before{content:"\f1cba"}.mdi-passport-minus:before{content:"\f1cbb"}.mdi-passport-plus:before{content:"\f1cbc"}.mdi-passport-remove:before{content:"\f1cbd"}.mdi-pasta:before{content:"\f1160"}.mdi-patio-heater:before{content:"\f0f80"}.mdi-patreon:before{content:"\f0882"}.mdi-pause:before{content:"\f03e4"}.mdi-pause-box:before{content:"\f00bc"}.mdi-pause-box-outline:before{content:"\f1b7a"}.mdi-pause-circle:before{content:"\f03e5"}.mdi-pause-circle-outline:before{content:"\f03e6"}.mdi-pause-octagon:before{content:"\f03e7"}.mdi-pause-octagon-outline:before{content:"\f03e8"}.mdi-paw:before{content:"\f03e9"}.mdi-paw-off:before{content:"\f0657"}.mdi-paw-off-outline:before{content:"\f1676"}.mdi-paw-outline:before{content:"\f1675"}.mdi-peace:before{content:"\f0884"}.mdi-peanut:before{content:"\f0ffc"}.mdi-peanut-off:before{content:"\f0ffd"}.mdi-peanut-off-outline:before{content:"\f0fff"}.mdi-peanut-outline:before{content:"\f0ffe"}.mdi-pen:before{content:"\f03ea"}.mdi-pen-lock:before{content:"\f0de2"}.mdi-pen-minus:before{content:"\f0de3"}.mdi-pen-off:before{content:"\f0de4"}.mdi-pen-plus:before{content:"\f0de5"}.mdi-pen-remove:before{content:"\f0de6"}.mdi-pencil:before{content:"\f03eb"}.mdi-pencil-box:before{content:"\f03ec"}.mdi-pencil-box-multiple:before{content:"\f1144"}.mdi-pencil-box-multiple-outline:before{content:"\f1145"}.mdi-pencil-box-outline:before{content:"\f03ed"}.mdi-pencil-circle:before{content:"\f06ff"}.mdi-pencil-circle-outline:before{content:"\f0776"}.mdi-pencil-lock:before{content:"\f03ee"}.mdi-pencil-lock-outline:before{content:"\f0de7"}.mdi-pencil-minus:before{content:"\f0de8"}.mdi-pencil-minus-outline:before{content:"\f0de9"}.mdi-pencil-off:before{content:"\f03ef"}.mdi-pencil-off-outline:before{content:"\f0dea"}.mdi-pencil-outline:before{content:"\f0cb6"}.mdi-pencil-plus:before{content:"\f0deb"}.mdi-pencil-plus-outline:before{content:"\f0dec"}.mdi-pencil-remove:before{content:"\f0ded"}.mdi-pencil-remove-outline:before{content:"\f0dee"}.mdi-pencil-ruler:before{content:"\f1353"}.mdi-pencil-ruler-outline:before{content:"\f1c11"}.mdi-penguin:before{content:"\f0ec0"}.mdi-pentagon:before{content:"\f0701"}.mdi-pentagon-outline:before{content:"\f0700"}.mdi-pentagram:before{content:"\f1667"}.mdi-percent:before{content:"\f03f0"}.mdi-percent-box:before{content:"\f1a02"}.mdi-percent-box-outline:before{content:"\f1a03"}.mdi-percent-circle:before{content:"\f1a04"}.mdi-percent-circle-outline:before{content:"\f1a05"}.mdi-percent-outline:before{content:"\f1278"}.mdi-periodic-table:before{content:"\f08b6"}.mdi-perspective-less:before{content:"\f0d23"}.mdi-perspective-more:before{content:"\f0d24"}.mdi-ph:before{content:"\f17c5"}.mdi-phone:before{content:"\f03f2"}.mdi-phone-alert:before{content:"\f0f1a"}.mdi-phone-alert-outline:before{content:"\f118e"}.mdi-phone-bluetooth:before{content:"\f03f3"}.mdi-phone-bluetooth-outline:before{content:"\f118f"}.mdi-phone-cancel:before{content:"\f10bc"}.mdi-phone-cancel-outline:before{content:"\f1190"}.mdi-phone-check:before{content:"\f11a9"}.mdi-phone-check-outline:before{content:"\f11aa"}.mdi-phone-classic:before{content:"\f0602"}.mdi-phone-classic-off:before{content:"\f1279"}.mdi-phone-clock:before{content:"\f19db"}.mdi-phone-dial:before{content:"\f1559"}.mdi-phone-dial-outline:before{content:"\f155a"}.mdi-phone-forward:before{content:"\f03f4"}.mdi-phone-forward-outline:before{content:"\f1191"}.mdi-phone-hangup:before{content:"\f03f5"}.mdi-phone-hangup-outline:before{content:"\f1192"}.mdi-phone-in-talk:before{content:"\f03f6"}.mdi-phone-in-talk-outline:before{content:"\f1182"}.mdi-phone-incoming:before{content:"\f03f7"}.mdi-phone-incoming-outgoing:before{content:"\f1b3f"}.mdi-phone-incoming-outgoing-outline:before{content:"\f1b40"}.mdi-phone-incoming-outline:before{content:"\f1193"}.mdi-phone-lock:before{content:"\f03f8"}.mdi-phone-lock-outline:before{content:"\f1194"}.mdi-phone-log:before{content:"\f03f9"}.mdi-phone-log-outline:before{content:"\f1195"}.mdi-phone-message:before{content:"\f1196"}.mdi-phone-message-outline:before{content:"\f1197"}.mdi-phone-minus:before{content:"\f0658"}.mdi-phone-minus-outline:before{content:"\f1198"}.mdi-phone-missed:before{content:"\f03fa"}.mdi-phone-missed-outline:before{content:"\f11a5"}.mdi-phone-off:before{content:"\f0def"}.mdi-phone-off-outline:before{content:"\f11a6"}.mdi-phone-outgoing:before{content:"\f03fb"}.mdi-phone-outgoing-outline:before{content:"\f1199"}.mdi-phone-outline:before{content:"\f0df0"}.mdi-phone-paused:before{content:"\f03fc"}.mdi-phone-paused-outline:before{content:"\f119a"}.mdi-phone-plus:before{content:"\f0659"}.mdi-phone-plus-outline:before{content:"\f119b"}.mdi-phone-refresh:before{content:"\f1993"}.mdi-phone-refresh-outline:before{content:"\f1994"}.mdi-phone-remove:before{content:"\f152f"}.mdi-phone-remove-outline:before{content:"\f1530"}.mdi-phone-return:before{content:"\f082f"}.mdi-phone-return-outline:before{content:"\f119c"}.mdi-phone-ring:before{content:"\f11ab"}.mdi-phone-ring-outline:before{content:"\f11ac"}.mdi-phone-rotate-landscape:before{content:"\f0885"}.mdi-phone-rotate-portrait:before{content:"\f0886"}.mdi-phone-settings:before{content:"\f03fd"}.mdi-phone-settings-outline:before{content:"\f119d"}.mdi-phone-sync:before{content:"\f1995"}.mdi-phone-sync-outline:before{content:"\f1996"}.mdi-phone-voip:before{content:"\f03fe"}.mdi-pi:before{content:"\f03ff"}.mdi-pi-box:before{content:"\f0400"}.mdi-pi-hole:before{content:"\f0df1"}.mdi-piano:before{content:"\f067d"}.mdi-piano-off:before{content:"\f0698"}.mdi-pickaxe:before{content:"\f08b7"}.mdi-picture-in-picture-bottom-right:before{content:"\f0e57"}.mdi-picture-in-picture-bottom-right-outline:before{content:"\f0e58"}.mdi-picture-in-picture-top-right:before{content:"\f0e59"}.mdi-picture-in-picture-top-right-outline:before{content:"\f0e5a"}.mdi-pier:before{content:"\f0887"}.mdi-pier-crane:before{content:"\f0888"}.mdi-pig:before{content:"\f0401"}.mdi-pig-variant:before{content:"\f1006"}.mdi-pig-variant-outline:before{content:"\f1678"}.mdi-piggy-bank:before{content:"\f1007"}.mdi-piggy-bank-outline:before{content:"\f1679"}.mdi-pill:before{content:"\f0402"}.mdi-pill-multiple:before{content:"\f1b4c"}.mdi-pill-off:before{content:"\f1a5c"}.mdi-pillar:before{content:"\f0702"}.mdi-pin:before{content:"\f0403"}.mdi-pin-off:before{content:"\f0404"}.mdi-pin-off-outline:before{content:"\f0930"}.mdi-pin-outline:before{content:"\f0931"}.mdi-pine-tree:before{content:"\f0405"}.mdi-pine-tree-box:before{content:"\f0406"}.mdi-pine-tree-fire:before{content:"\f141a"}.mdi-pine-tree-variant:before{content:"\f1c73"}.mdi-pine-tree-variant-outline:before{content:"\f1c74"}.mdi-pinterest:before{content:"\f0407"}.mdi-pinwheel:before{content:"\f0ad5"}.mdi-pinwheel-outline:before{content:"\f0ad6"}.mdi-pipe:before{content:"\f07e5"}.mdi-pipe-disconnected:before{content:"\f07e6"}.mdi-pipe-leak:before{content:"\f0889"}.mdi-pipe-valve:before{content:"\f184d"}.mdi-pipe-wrench:before{content:"\f1354"}.mdi-pirate:before{content:"\f0a08"}.mdi-pistol:before{content:"\f0703"}.mdi-piston:before{content:"\f088a"}.mdi-pitchfork:before{content:"\f1553"}.mdi-pizza:before{content:"\f0409"}.mdi-plane-car:before{content:"\f1aff"}.mdi-plane-train:before{content:"\f1b00"}.mdi-play:before{content:"\f040a"}.mdi-play-box:before{content:"\f127a"}.mdi-play-box-edit-outline:before{content:"\f1c3a"}.mdi-play-box-lock:before{content:"\f1a16"}.mdi-play-box-lock-open:before{content:"\f1a17"}.mdi-play-box-lock-open-outline:before{content:"\f1a18"}.mdi-play-box-lock-outline:before{content:"\f1a19"}.mdi-play-box-multiple:before{content:"\f0d19"}.mdi-play-box-multiple-outline:before{content:"\f13e6"}.mdi-play-box-outline:before{content:"\f040b"}.mdi-play-circle:before{content:"\f040c"}.mdi-play-circle-outline:before{content:"\f040d"}.mdi-play-network:before{content:"\f088b"}.mdi-play-network-outline:before{content:"\f0cb7"}.mdi-play-outline:before{content:"\f0f1b"}.mdi-play-pause:before{content:"\f040e"}.mdi-play-protected-content:before{content:"\f040f"}.mdi-play-speed:before{content:"\f08ff"}.mdi-playlist-check:before{content:"\f05c7"}.mdi-playlist-edit:before{content:"\f0900"}.mdi-playlist-minus:before{content:"\f0410"}.mdi-playlist-music:before{content:"\f0cb8"}.mdi-playlist-music-outline:before{content:"\f0cb9"}.mdi-playlist-play:before{content:"\f0411"}.mdi-playlist-plus:before{content:"\f0412"}.mdi-playlist-remove:before{content:"\f0413"}.mdi-playlist-star:before{content:"\f0df2"}.mdi-plex:before{content:"\f06ba"}.mdi-pliers:before{content:"\f19a4"}.mdi-plus:before{content:"\f0415"}.mdi-plus-box:before{content:"\f0416"}.mdi-plus-box-multiple:before{content:"\f0334"}.mdi-plus-box-multiple-outline:before{content:"\f1143"}.mdi-plus-box-outline:before{content:"\f0704"}.mdi-plus-circle:before{content:"\f0417"}.mdi-plus-circle-multiple:before{content:"\f034c"}.mdi-plus-circle-multiple-outline:before{content:"\f0418"}.mdi-plus-circle-outline:before{content:"\f0419"}.mdi-plus-lock:before{content:"\f1a5d"}.mdi-plus-lock-open:before{content:"\f1a5e"}.mdi-plus-minus:before{content:"\f0992"}.mdi-plus-minus-box:before{content:"\f0993"}.mdi-plus-minus-variant:before{content:"\f14c9"}.mdi-plus-network:before{content:"\f041a"}.mdi-plus-network-outline:before{content:"\f0cba"}.mdi-plus-outline:before{content:"\f0705"}.mdi-plus-thick:before{content:"\f11ec"}.mdi-pocket:before{content:"\f1cbe"}.mdi-podcast:before{content:"\f0994"}.mdi-podium:before{content:"\f0d25"}.mdi-podium-bronze:before{content:"\f0d26"}.mdi-podium-gold:before{content:"\f0d27"}.mdi-podium-silver:before{content:"\f0d28"}.mdi-point-of-sale:before{content:"\f0d92"}.mdi-pokeball:before{content:"\f041d"}.mdi-pokemon-go:before{content:"\f0a09"}.mdi-poker-chip:before{content:"\f0830"}.mdi-polaroid:before{content:"\f041e"}.mdi-police-badge:before{content:"\f1167"}.mdi-police-badge-outline:before{content:"\f1168"}.mdi-police-station:before{content:"\f1839"}.mdi-poll:before{content:"\f041f"}.mdi-polo:before{content:"\f14c3"}.mdi-polymer:before{content:"\f0421"}.mdi-pool:before{content:"\f0606"}.mdi-pool-thermometer:before{content:"\f1a5f"}.mdi-popcorn:before{content:"\f0422"}.mdi-post:before{content:"\f1008"}.mdi-post-lamp:before{content:"\f1a60"}.mdi-post-outline:before{content:"\f1009"}.mdi-postage-stamp:before{content:"\f0cbb"}.mdi-pot:before{content:"\f02e5"}.mdi-pot-mix:before{content:"\f065b"}.mdi-pot-mix-outline:before{content:"\f0677"}.mdi-pot-outline:before{content:"\f02ff"}.mdi-pot-steam:before{content:"\f065a"}.mdi-pot-steam-outline:before{content:"\f0326"}.mdi-pound:before{content:"\f0423"}.mdi-pound-box:before{content:"\f0424"}.mdi-pound-box-outline:before{content:"\f117f"}.mdi-power:before{content:"\f0425"}.mdi-power-cycle:before{content:"\f0901"}.mdi-power-off:before{content:"\f0902"}.mdi-power-on:before{content:"\f0903"}.mdi-power-plug:before{content:"\f06a5"}.mdi-power-plug-battery:before{content:"\f1c3b"}.mdi-power-plug-battery-outline:before{content:"\f1c3c"}.mdi-power-plug-off:before{content:"\f06a6"}.mdi-power-plug-off-outline:before{content:"\f1424"}.mdi-power-plug-outline:before{content:"\f1425"}.mdi-power-settings:before{content:"\f0426"}.mdi-power-sleep:before{content:"\f0904"}.mdi-power-socket:before{content:"\f0427"}.mdi-power-socket-au:before{content:"\f0905"}.mdi-power-socket-ch:before{content:"\f0fb3"}.mdi-power-socket-de:before{content:"\f1107"}.mdi-power-socket-eu:before{content:"\f07e7"}.mdi-power-socket-fr:before{content:"\f1108"}.mdi-power-socket-it:before{content:"\f14ff"}.mdi-power-socket-jp:before{content:"\f1109"}.mdi-power-socket-uk:before{content:"\f07e8"}.mdi-power-socket-us:before{content:"\f07e9"}.mdi-power-standby:before{content:"\f0906"}.mdi-powershell:before{content:"\f0a0a"}.mdi-prescription:before{content:"\f0706"}.mdi-presentation:before{content:"\f0428"}.mdi-presentation-play:before{content:"\f0429"}.mdi-pretzel:before{content:"\f1562"}.mdi-printer:before{content:"\f042a"}.mdi-printer-3d:before{content:"\f042b"}.mdi-printer-3d-nozzle:before{content:"\f0e5b"}.mdi-printer-3d-nozzle-alert:before{content:"\f11c0"}.mdi-printer-3d-nozzle-alert-outline:before{content:"\f11c1"}.mdi-printer-3d-nozzle-heat:before{content:"\f18b8"}.mdi-printer-3d-nozzle-heat-outline:before{content:"\f18b9"}.mdi-printer-3d-nozzle-off:before{content:"\f1b19"}.mdi-printer-3d-nozzle-off-outline:before{content:"\f1b1a"}.mdi-printer-3d-nozzle-outline:before{content:"\f0e5c"}.mdi-printer-3d-off:before{content:"\f1b0e"}.mdi-printer-alert:before{content:"\f042c"}.mdi-printer-check:before{content:"\f1146"}.mdi-printer-eye:before{content:"\f1458"}.mdi-printer-off:before{content:"\f0e5d"}.mdi-printer-off-outline:before{content:"\f1785"}.mdi-printer-outline:before{content:"\f1786"}.mdi-printer-pos:before{content:"\f1057"}.mdi-printer-pos-alert:before{content:"\f1bbc"}.mdi-printer-pos-alert-outline:before{content:"\f1bbd"}.mdi-printer-pos-cancel:before{content:"\f1bbe"}.mdi-printer-pos-cancel-outline:before{content:"\f1bbf"}.mdi-printer-pos-check:before{content:"\f1bc0"}.mdi-printer-pos-check-outline:before{content:"\f1bc1"}.mdi-printer-pos-cog:before{content:"\f1bc2"}.mdi-printer-pos-cog-outline:before{content:"\f1bc3"}.mdi-printer-pos-edit:before{content:"\f1bc4"}.mdi-printer-pos-edit-outline:before{content:"\f1bc5"}.mdi-printer-pos-minus:before{content:"\f1bc6"}.mdi-printer-pos-minus-outline:before{content:"\f1bc7"}.mdi-printer-pos-network:before{content:"\f1bc8"}.mdi-printer-pos-network-outline:before{content:"\f1bc9"}.mdi-printer-pos-off:before{content:"\f1bca"}.mdi-printer-pos-off-outline:before{content:"\f1bcb"}.mdi-printer-pos-outline:before{content:"\f1bcc"}.mdi-printer-pos-pause:before{content:"\f1bcd"}.mdi-printer-pos-pause-outline:before{content:"\f1bce"}.mdi-printer-pos-play:before{content:"\f1bcf"}.mdi-printer-pos-play-outline:before{content:"\f1bd0"}.mdi-printer-pos-plus:before{content:"\f1bd1"}.mdi-printer-pos-plus-outline:before{content:"\f1bd2"}.mdi-printer-pos-refresh:before{content:"\f1bd3"}.mdi-printer-pos-refresh-outline:before{content:"\f1bd4"}.mdi-printer-pos-remove:before{content:"\f1bd5"}.mdi-printer-pos-remove-outline:before{content:"\f1bd6"}.mdi-printer-pos-star:before{content:"\f1bd7"}.mdi-printer-pos-star-outline:before{content:"\f1bd8"}.mdi-printer-pos-stop:before{content:"\f1bd9"}.mdi-printer-pos-stop-outline:before{content:"\f1bda"}.mdi-printer-pos-sync:before{content:"\f1bdb"}.mdi-printer-pos-sync-outline:before{content:"\f1bdc"}.mdi-printer-pos-wrench:before{content:"\f1bdd"}.mdi-printer-pos-wrench-outline:before{content:"\f1bde"}.mdi-printer-search:before{content:"\f1457"}.mdi-printer-settings:before{content:"\f0707"}.mdi-printer-wireless:before{content:"\f0a0b"}.mdi-priority-high:before{content:"\f0603"}.mdi-priority-low:before{content:"\f0604"}.mdi-professional-hexagon:before{content:"\f042d"}.mdi-progress-alert:before{content:"\f0cbc"}.mdi-progress-check:before{content:"\f0995"}.mdi-progress-clock:before{content:"\f0996"}.mdi-progress-close:before{content:"\f110a"}.mdi-progress-download:before{content:"\f0997"}.mdi-progress-helper:before{content:"\f1ba2"}.mdi-progress-pencil:before{content:"\f1787"}.mdi-progress-question:before{content:"\f1522"}.mdi-progress-star:before{content:"\f1788"}.mdi-progress-star-four-points:before{content:"\f1c3d"}.mdi-progress-tag:before{content:"\f1d0d"}.mdi-progress-upload:before{content:"\f0998"}.mdi-progress-wrench:before{content:"\f0cbd"}.mdi-projector:before{content:"\f042e"}.mdi-projector-off:before{content:"\f1a23"}.mdi-projector-screen:before{content:"\f042f"}.mdi-projector-screen-off:before{content:"\f180d"}.mdi-projector-screen-off-outline:before{content:"\f180e"}.mdi-projector-screen-outline:before{content:"\f1724"}.mdi-projector-screen-variant:before{content:"\f180f"}.mdi-projector-screen-variant-off:before{content:"\f1810"}.mdi-projector-screen-variant-off-outline:before{content:"\f1811"}.mdi-projector-screen-variant-outline:before{content:"\f1812"}.mdi-propane-tank:before{content:"\f1357"}.mdi-propane-tank-outline:before{content:"\f1358"}.mdi-protocol:before{content:"\f0fd8"}.mdi-publish:before{content:"\f06a7"}.mdi-publish-off:before{content:"\f1945"}.mdi-pulse:before{content:"\f0430"}.mdi-pump:before{content:"\f1402"}.mdi-pump-off:before{content:"\f1b22"}.mdi-pumpkin:before{content:"\f0bbf"}.mdi-purse:before{content:"\f0f1c"}.mdi-purse-outline:before{content:"\f0f1d"}.mdi-puzzle:before{content:"\f0431"}.mdi-puzzle-check:before{content:"\f1426"}.mdi-puzzle-check-outline:before{content:"\f1427"}.mdi-puzzle-edit:before{content:"\f14d3"}.mdi-puzzle-edit-outline:before{content:"\f14d9"}.mdi-puzzle-heart:before{content:"\f14d4"}.mdi-puzzle-heart-outline:before{content:"\f14da"}.mdi-puzzle-minus:before{content:"\f14d1"}.mdi-puzzle-minus-outline:before{content:"\f14d7"}.mdi-puzzle-outline:before{content:"\f0a66"}.mdi-puzzle-plus:before{content:"\f14d0"}.mdi-puzzle-plus-outline:before{content:"\f14d6"}.mdi-puzzle-remove:before{content:"\f14d2"}.mdi-puzzle-remove-outline:before{content:"\f14d8"}.mdi-puzzle-star:before{content:"\f14d5"}.mdi-puzzle-star-outline:before{content:"\f14db"}.mdi-pyramid:before{content:"\f1952"}.mdi-pyramid-off:before{content:"\f1953"}.mdi-qi:before{content:"\f0999"}.mdi-qqchat:before{content:"\f0605"}.mdi-qrcode:before{content:"\f0432"}.mdi-qrcode-edit:before{content:"\f08b8"}.mdi-qrcode-minus:before{content:"\f118c"}.mdi-qrcode-plus:before{content:"\f118b"}.mdi-qrcode-remove:before{content:"\f118d"}.mdi-qrcode-scan:before{content:"\f0433"}.mdi-quadcopter:before{content:"\f0434"}.mdi-quality-high:before{content:"\f0435"}.mdi-quality-low:before{content:"\f0a0c"}.mdi-quality-medium:before{content:"\f0a0d"}.mdi-queue-first-in-last-out:before{content:"\f1caf"}.mdi-quora:before{content:"\f0d29"}.mdi-rabbit:before{content:"\f0907"}.mdi-rabbit-variant:before{content:"\f1a61"}.mdi-rabbit-variant-outline:before{content:"\f1a62"}.mdi-racing-helmet:before{content:"\f0d93"}.mdi-racquetball:before{content:"\f0d94"}.mdi-radar:before{content:"\f0437"}.mdi-radiator:before{content:"\f0438"}.mdi-radiator-disabled:before{content:"\f0ad7"}.mdi-radiator-off:before{content:"\f0ad8"}.mdi-radio:before{content:"\f0439"}.mdi-radio-am:before{content:"\f0cbe"}.mdi-radio-fm:before{content:"\f0cbf"}.mdi-radio-handheld:before{content:"\f043a"}.mdi-radio-off:before{content:"\f121c"}.mdi-radio-tower:before{content:"\f043b"}.mdi-radioactive:before{content:"\f043c"}.mdi-radioactive-circle:before{content:"\f185d"}.mdi-radioactive-circle-outline:before{content:"\f185e"}.mdi-radioactive-off:before{content:"\f0ec1"}.mdi-radiobox-blank:before{content:"\f043d"}.mdi-radiobox-indeterminate-variant:before{content:"\f1c5e"}.mdi-radiobox-marked:before{content:"\f043e"}.mdi-radiology-box:before{content:"\f14c5"}.mdi-radiology-box-outline:before{content:"\f14c6"}.mdi-radius:before{content:"\f0cc0"}.mdi-radius-outline:before{content:"\f0cc1"}.mdi-railroad-light:before{content:"\f0f1e"}.mdi-rake:before{content:"\f1544"}.mdi-raspberry-pi:before{content:"\f043f"}.mdi-raw:before{content:"\f1a0f"}.mdi-raw-off:before{content:"\f1a10"}.mdi-ray-end:before{content:"\f0440"}.mdi-ray-end-arrow:before{content:"\f0441"}.mdi-ray-start:before{content:"\f0442"}.mdi-ray-start-arrow:before{content:"\f0443"}.mdi-ray-start-end:before{content:"\f0444"}.mdi-ray-start-vertex-end:before{content:"\f15d8"}.mdi-ray-vertex:before{content:"\f0445"}.mdi-razor-double-edge:before{content:"\f1997"}.mdi-razor-single-edge:before{content:"\f1998"}.mdi-react:before{content:"\f0708"}.mdi-read:before{content:"\f0447"}.mdi-receipt:before{content:"\f0824"}.mdi-receipt-clock:before{content:"\f1c3e"}.mdi-receipt-clock-outline:before{content:"\f1c3f"}.mdi-receipt-outline:before{content:"\f04f7"}.mdi-receipt-send:before{content:"\f1c40"}.mdi-receipt-send-outline:before{content:"\f1c41"}.mdi-receipt-text:before{content:"\f0449"}.mdi-receipt-text-arrow-left:before{content:"\f1c42"}.mdi-receipt-text-arrow-left-outline:before{content:"\f1c43"}.mdi-receipt-text-arrow-right:before{content:"\f1c44"}.mdi-receipt-text-arrow-right-outline:before{content:"\f1c45"}.mdi-receipt-text-check:before{content:"\f1a63"}.mdi-receipt-text-check-outline:before{content:"\f1a64"}.mdi-receipt-text-clock:before{content:"\f1c46"}.mdi-receipt-text-clock-outline:before{content:"\f1c47"}.mdi-receipt-text-edit:before{content:"\f1c48"}.mdi-receipt-text-edit-outline:before{content:"\f1c49"}.mdi-receipt-text-minus:before{content:"\f1a65"}.mdi-receipt-text-minus-outline:before{content:"\f1a66"}.mdi-receipt-text-outline:before{content:"\f19dc"}.mdi-receipt-text-plus:before{content:"\f1a67"}.mdi-receipt-text-plus-outline:before{content:"\f1a68"}.mdi-receipt-text-remove:before{content:"\f1a69"}.mdi-receipt-text-remove-outline:before{content:"\f1a6a"}.mdi-receipt-text-send:before{content:"\f1c4a"}.mdi-receipt-text-send-outline:before{content:"\f1c4b"}.mdi-record:before{content:"\f044a"}.mdi-record-circle:before{content:"\f0ec2"}.mdi-record-circle-outline:before{content:"\f0ec3"}.mdi-record-player:before{content:"\f099a"}.mdi-record-rec:before{content:"\f044b"}.mdi-rectangle:before{content:"\f0e5e"}.mdi-rectangle-outline:before{content:"\f0e5f"}.mdi-recycle:before{content:"\f044c"}.mdi-recycle-variant:before{content:"\f139d"}.mdi-reddit:before{content:"\f044d"}.mdi-redhat:before{content:"\f111b"}.mdi-redo:before{content:"\f044e"}.mdi-redo-variant:before{content:"\f044f"}.mdi-reflect-horizontal:before{content:"\f0a0e"}.mdi-reflect-vertical:before{content:"\f0a0f"}.mdi-refresh:before{content:"\f0450"}.mdi-refresh-auto:before{content:"\f18f2"}.mdi-refresh-circle:before{content:"\f1377"}.mdi-regex:before{content:"\f0451"}.mdi-registered-trademark:before{content:"\f0a67"}.mdi-reiterate:before{content:"\f1588"}.mdi-relation-many-to-many:before{content:"\f1496"}.mdi-relation-many-to-one:before{content:"\f1497"}.mdi-relation-many-to-one-or-many:before{content:"\f1498"}.mdi-relation-many-to-only-one:before{content:"\f1499"}.mdi-relation-many-to-zero-or-many:before{content:"\f149a"}.mdi-relation-many-to-zero-or-one:before{content:"\f149b"}.mdi-relation-one-or-many-to-many:before{content:"\f149c"}.mdi-relation-one-or-many-to-one:before{content:"\f149d"}.mdi-relation-one-or-many-to-one-or-many:before{content:"\f149e"}.mdi-relation-one-or-many-to-only-one:before{content:"\f149f"}.mdi-relation-one-or-many-to-zero-or-many:before{content:"\f14a0"}.mdi-relation-one-or-many-to-zero-or-one:before{content:"\f14a1"}.mdi-relation-one-to-many:before{content:"\f14a2"}.mdi-relation-one-to-one:before{content:"\f14a3"}.mdi-relation-one-to-one-or-many:before{content:"\f14a4"}.mdi-relation-one-to-only-one:before{content:"\f14a5"}.mdi-relation-one-to-zero-or-many:before{content:"\f14a6"}.mdi-relation-one-to-zero-or-one:before{content:"\f14a7"}.mdi-relation-only-one-to-many:before{content:"\f14a8"}.mdi-relation-only-one-to-one:before{content:"\f14a9"}.mdi-relation-only-one-to-one-or-many:before{content:"\f14aa"}.mdi-relation-only-one-to-only-one:before{content:"\f14ab"}.mdi-relation-only-one-to-zero-or-many:before{content:"\f14ac"}.mdi-relation-only-one-to-zero-or-one:before{content:"\f14ad"}.mdi-relation-zero-or-many-to-many:before{content:"\f14ae"}.mdi-relation-zero-or-many-to-one:before{content:"\f14af"}.mdi-relation-zero-or-many-to-one-or-many:before{content:"\f14b0"}.mdi-relation-zero-or-many-to-only-one:before{content:"\f14b1"}.mdi-relation-zero-or-many-to-zero-or-many:before{content:"\f14b2"}.mdi-relation-zero-or-many-to-zero-or-one:before{content:"\f14b3"}.mdi-relation-zero-or-one-to-many:before{content:"\f14b4"}.mdi-relation-zero-or-one-to-one:before{content:"\f14b5"}.mdi-relation-zero-or-one-to-one-or-many:before{content:"\f14b6"}.mdi-relation-zero-or-one-to-only-one:before{content:"\f14b7"}.mdi-relation-zero-or-one-to-zero-or-many:before{content:"\f14b8"}.mdi-relation-zero-or-one-to-zero-or-one:before{content:"\f14b9"}.mdi-relative-scale:before{content:"\f0452"}.mdi-reload:before{content:"\f0453"}.mdi-reload-alert:before{content:"\f110b"}.mdi-reminder:before{content:"\f088c"}.mdi-remote:before{content:"\f0454"}.mdi-remote-desktop:before{content:"\f08b9"}.mdi-remote-off:before{content:"\f0ec4"}.mdi-remote-tv:before{content:"\f0ec5"}.mdi-remote-tv-off:before{content:"\f0ec6"}.mdi-rename:before{content:"\f1c18"}.mdi-rename-box:before{content:"\f0455"}.mdi-rename-box-outline:before{content:"\f1c19"}.mdi-rename-outline:before{content:"\f1c1a"}.mdi-reorder-horizontal:before{content:"\f0688"}.mdi-reorder-vertical:before{content:"\f0689"}.mdi-repeat:before{content:"\f0456"}.mdi-repeat-off:before{content:"\f0457"}.mdi-repeat-once:before{content:"\f0458"}.mdi-repeat-variant:before{content:"\f0547"}.mdi-replay:before{content:"\f0459"}.mdi-reply:before{content:"\f045a"}.mdi-reply-all:before{content:"\f045b"}.mdi-reply-all-outline:before{content:"\f0f1f"}.mdi-reply-circle:before{content:"\f11ae"}.mdi-reply-outline:before{content:"\f0f20"}.mdi-reproduction:before{content:"\f045c"}.mdi-resistor:before{content:"\f0b44"}.mdi-resistor-nodes:before{content:"\f0b45"}.mdi-resize:before{content:"\f0a68"}.mdi-resize-bottom-right:before{content:"\f045d"}.mdi-responsive:before{content:"\f045e"}.mdi-restart:before{content:"\f0709"}.mdi-restart-alert:before{content:"\f110c"}.mdi-restart-off:before{content:"\f0d95"}.mdi-restore:before{content:"\f099b"}.mdi-restore-alert:before{content:"\f110d"}.mdi-rewind:before{content:"\f045f"}.mdi-rewind-10:before{content:"\f0d2a"}.mdi-rewind-15:before{content:"\f1946"}.mdi-rewind-30:before{content:"\f0d96"}.mdi-rewind-45:before{content:"\f1b13"}.mdi-rewind-5:before{content:"\f11f9"}.mdi-rewind-60:before{content:"\f160c"}.mdi-rewind-outline:before{content:"\f070a"}.mdi-rhombus:before{content:"\f070b"}.mdi-rhombus-medium:before{content:"\f0a10"}.mdi-rhombus-medium-outline:before{content:"\f14dc"}.mdi-rhombus-outline:before{content:"\f070c"}.mdi-rhombus-split:before{content:"\f0a11"}.mdi-rhombus-split-outline:before{content:"\f14dd"}.mdi-ribbon:before{content:"\f0460"}.mdi-rice:before{content:"\f07ea"}.mdi-rickshaw:before{content:"\f15bb"}.mdi-rickshaw-electric:before{content:"\f15bc"}.mdi-ring:before{content:"\f07eb"}.mdi-rivet:before{content:"\f0e60"}.mdi-road:before{content:"\f0461"}.mdi-road-variant:before{content:"\f0462"}.mdi-robber:before{content:"\f1058"}.mdi-robot:before{content:"\f06a9"}.mdi-robot-angry:before{content:"\f169d"}.mdi-robot-angry-outline:before{content:"\f169e"}.mdi-robot-confused:before{content:"\f169f"}.mdi-robot-confused-outline:before{content:"\f16a0"}.mdi-robot-dead:before{content:"\f16a1"}.mdi-robot-dead-outline:before{content:"\f16a2"}.mdi-robot-excited:before{content:"\f16a3"}.mdi-robot-excited-outline:before{content:"\f16a4"}.mdi-robot-happy:before{content:"\f1719"}.mdi-robot-happy-outline:before{content:"\f171a"}.mdi-robot-industrial:before{content:"\f0b46"}.mdi-robot-industrial-outline:before{content:"\f1a1a"}.mdi-robot-love:before{content:"\f16a5"}.mdi-robot-love-outline:before{content:"\f16a6"}.mdi-robot-mower:before{content:"\f11f7"}.mdi-robot-mower-outline:before{content:"\f11f3"}.mdi-robot-off:before{content:"\f16a7"}.mdi-robot-off-outline:before{content:"\f167b"}.mdi-robot-outline:before{content:"\f167a"}.mdi-robot-vacuum:before{content:"\f070d"}.mdi-robot-vacuum-alert:before{content:"\f1b5d"}.mdi-robot-vacuum-off:before{content:"\f1c01"}.mdi-robot-vacuum-variant:before{content:"\f0908"}.mdi-robot-vacuum-variant-alert:before{content:"\f1b5e"}.mdi-robot-vacuum-variant-off:before{content:"\f1c02"}.mdi-rocket:before{content:"\f0463"}.mdi-rocket-launch:before{content:"\f14de"}.mdi-rocket-launch-outline:before{content:"\f14df"}.mdi-rocket-outline:before{content:"\f13af"}.mdi-rodent:before{content:"\f1327"}.mdi-roller-shade:before{content:"\f1a6b"}.mdi-roller-shade-closed:before{content:"\f1a6c"}.mdi-roller-skate:before{content:"\f0d2b"}.mdi-roller-skate-off:before{content:"\f0145"}.mdi-rollerblade:before{content:"\f0d2c"}.mdi-rollerblade-off:before{content:"\f002e"}.mdi-rollupjs:before{content:"\f0bc0"}.mdi-rolodex:before{content:"\f1ab9"}.mdi-rolodex-outline:before{content:"\f1aba"}.mdi-roman-numeral-1:before{content:"\f1088"}.mdi-roman-numeral-10:before{content:"\f1091"}.mdi-roman-numeral-2:before{content:"\f1089"}.mdi-roman-numeral-3:before{content:"\f108a"}.mdi-roman-numeral-4:before{content:"\f108b"}.mdi-roman-numeral-5:before{content:"\f108c"}.mdi-roman-numeral-6:before{content:"\f108d"}.mdi-roman-numeral-7:before{content:"\f108e"}.mdi-roman-numeral-8:before{content:"\f108f"}.mdi-roman-numeral-9:before{content:"\f1090"}.mdi-room-service:before{content:"\f088d"}.mdi-room-service-outline:before{content:"\f0d97"}.mdi-rotate-360:before{content:"\f1999"}.mdi-rotate-3d:before{content:"\f0ec7"}.mdi-rotate-3d-variant:before{content:"\f0464"}.mdi-rotate-left:before{content:"\f0465"}.mdi-rotate-left-variant:before{content:"\f0466"}.mdi-rotate-orbit:before{content:"\f0d98"}.mdi-rotate-right:before{content:"\f0467"}.mdi-rotate-right-variant:before{content:"\f0468"}.mdi-rounded-corner:before{content:"\f0607"}.mdi-router:before{content:"\f11e2"}.mdi-router-network:before{content:"\f1087"}.mdi-router-network-wireless:before{content:"\f1c97"}.mdi-router-wireless:before{content:"\f0469"}.mdi-router-wireless-off:before{content:"\f15a3"}.mdi-router-wireless-settings:before{content:"\f0a69"}.mdi-routes:before{content:"\f046a"}.mdi-routes-clock:before{content:"\f1059"}.mdi-rowing:before{content:"\f0608"}.mdi-rss:before{content:"\f046b"}.mdi-rss-box:before{content:"\f046c"}.mdi-rss-off:before{content:"\f0f21"}.mdi-rug:before{content:"\f1475"}.mdi-rugby:before{content:"\f0d99"}.mdi-ruler:before{content:"\f046d"}.mdi-ruler-square:before{content:"\f0cc2"}.mdi-ruler-square-compass:before{content:"\f0ebe"}.mdi-run:before{content:"\f070e"}.mdi-run-fast:before{content:"\f046e"}.mdi-rv-truck:before{content:"\f11d4"}.mdi-sack:before{content:"\f0d2e"}.mdi-sack-outline:before{content:"\f1c4c"}.mdi-sack-percent:before{content:"\f0d2f"}.mdi-safe:before{content:"\f0a6a"}.mdi-safe-square:before{content:"\f127c"}.mdi-safe-square-outline:before{content:"\f127d"}.mdi-safety-goggles:before{content:"\f0d30"}.mdi-sail-boat:before{content:"\f0ec8"}.mdi-sail-boat-sink:before{content:"\f1aef"}.mdi-sale:before{content:"\f046f"}.mdi-sale-outline:before{content:"\f1a06"}.mdi-salesforce:before{content:"\f088e"}.mdi-sass:before{content:"\f07ec"}.mdi-satellite:before{content:"\f0470"}.mdi-satellite-uplink:before{content:"\f0909"}.mdi-satellite-variant:before{content:"\f0471"}.mdi-sausage:before{content:"\f08ba"}.mdi-sausage-off:before{content:"\f1789"}.mdi-saw-blade:before{content:"\f0e61"}.mdi-sawtooth-wave:before{content:"\f147a"}.mdi-saxophone:before{content:"\f0609"}.mdi-scale:before{content:"\f0472"}.mdi-scale-balance:before{content:"\f05d1"}.mdi-scale-bathroom:before{content:"\f0473"}.mdi-scale-off:before{content:"\f105a"}.mdi-scale-unbalanced:before{content:"\f19b8"}.mdi-scan-helper:before{content:"\f13d8"}.mdi-scanner:before{content:"\f06ab"}.mdi-scanner-off:before{content:"\f090a"}.mdi-scatter-plot:before{content:"\f0ec9"}.mdi-scatter-plot-outline:before{content:"\f0eca"}.mdi-scent:before{content:"\f1958"}.mdi-scent-off:before{content:"\f1959"}.mdi-school:before{content:"\f0474"}.mdi-school-outline:before{content:"\f1180"}.mdi-scissors-cutting:before{content:"\f0a6b"}.mdi-scooter:before{content:"\f15bd"}.mdi-scooter-electric:before{content:"\f15be"}.mdi-scoreboard:before{content:"\f127e"}.mdi-scoreboard-outline:before{content:"\f127f"}.mdi-screen-rotation:before{content:"\f0475"}.mdi-screen-rotation-lock:before{content:"\f0478"}.mdi-screw-flat-top:before{content:"\f0df3"}.mdi-screw-lag:before{content:"\f0df4"}.mdi-screw-machine-flat-top:before{content:"\f0df5"}.mdi-screw-machine-round-top:before{content:"\f0df6"}.mdi-screw-round-top:before{content:"\f0df7"}.mdi-screwdriver:before{content:"\f0476"}.mdi-script:before{content:"\f0bc1"}.mdi-script-outline:before{content:"\f0477"}.mdi-script-text:before{content:"\f0bc2"}.mdi-script-text-key:before{content:"\f1725"}.mdi-script-text-key-outline:before{content:"\f1726"}.mdi-script-text-outline:before{content:"\f0bc3"}.mdi-script-text-play:before{content:"\f1727"}.mdi-script-text-play-outline:before{content:"\f1728"}.mdi-sd:before{content:"\f0479"}.mdi-seal:before{content:"\f047a"}.mdi-seal-variant:before{content:"\f0fd9"}.mdi-search-web:before{content:"\f070f"}.mdi-seat:before{content:"\f0cc3"}.mdi-seat-flat:before{content:"\f047b"}.mdi-seat-flat-angled:before{content:"\f047c"}.mdi-seat-individual-suite:before{content:"\f047d"}.mdi-seat-legroom-extra:before{content:"\f047e"}.mdi-seat-legroom-normal:before{content:"\f047f"}.mdi-seat-legroom-reduced:before{content:"\f0480"}.mdi-seat-outline:before{content:"\f0cc4"}.mdi-seat-passenger:before{content:"\f1249"}.mdi-seat-recline-extra:before{content:"\f0481"}.mdi-seat-recline-normal:before{content:"\f0482"}.mdi-seatbelt:before{content:"\f0cc5"}.mdi-security:before{content:"\f0483"}.mdi-security-network:before{content:"\f0484"}.mdi-seed:before{content:"\f0e62"}.mdi-seed-off:before{content:"\f13fd"}.mdi-seed-off-outline:before{content:"\f13fe"}.mdi-seed-outline:before{content:"\f0e63"}.mdi-seed-plus:before{content:"\f1a6d"}.mdi-seed-plus-outline:before{content:"\f1a6e"}.mdi-seesaw:before{content:"\f15a4"}.mdi-segment:before{content:"\f0ecb"}.mdi-select:before{content:"\f0485"}.mdi-select-all:before{content:"\f0486"}.mdi-select-arrow-down:before{content:"\f1b59"}.mdi-select-arrow-up:before{content:"\f1b58"}.mdi-select-color:before{content:"\f0d31"}.mdi-select-compare:before{content:"\f0ad9"}.mdi-select-drag:before{content:"\f0a6c"}.mdi-select-group:before{content:"\f0f82"}.mdi-select-inverse:before{content:"\f0487"}.mdi-select-marker:before{content:"\f1280"}.mdi-select-multiple:before{content:"\f1281"}.mdi-select-multiple-marker:before{content:"\f1282"}.mdi-select-off:before{content:"\f0488"}.mdi-select-place:before{content:"\f0fda"}.mdi-select-remove:before{content:"\f17c1"}.mdi-select-search:before{content:"\f1204"}.mdi-selection:before{content:"\f0489"}.mdi-selection-drag:before{content:"\f0a6d"}.mdi-selection-ellipse:before{content:"\f0d32"}.mdi-selection-ellipse-arrow-inside:before{content:"\f0f22"}.mdi-selection-ellipse-remove:before{content:"\f17c2"}.mdi-selection-marker:before{content:"\f1283"}.mdi-selection-multiple:before{content:"\f1285"}.mdi-selection-multiple-marker:before{content:"\f1284"}.mdi-selection-off:before{content:"\f0777"}.mdi-selection-remove:before{content:"\f17c3"}.mdi-selection-search:before{content:"\f1205"}.mdi-semantic-web:before{content:"\f1316"}.mdi-send:before{content:"\f048a"}.mdi-send-check:before{content:"\f1161"}.mdi-send-check-outline:before{content:"\f1162"}.mdi-send-circle:before{content:"\f0df8"}.mdi-send-circle-outline:before{content:"\f0df9"}.mdi-send-clock:before{content:"\f1163"}.mdi-send-clock-outline:before{content:"\f1164"}.mdi-send-lock:before{content:"\f07ed"}.mdi-send-lock-outline:before{content:"\f1166"}.mdi-send-outline:before{content:"\f1165"}.mdi-send-variant:before{content:"\f1c4d"}.mdi-send-variant-clock:before{content:"\f1c7e"}.mdi-send-variant-clock-outline:before{content:"\f1c7f"}.mdi-send-variant-outline:before{content:"\f1c4e"}.mdi-serial-port:before{content:"\f065c"}.mdi-server:before{content:"\f048b"}.mdi-server-minus:before{content:"\f048c"}.mdi-server-minus-outline:before{content:"\f1c98"}.mdi-server-network:before{content:"\f048d"}.mdi-server-network-off:before{content:"\f048e"}.mdi-server-network-outline:before{content:"\f1c99"}.mdi-server-off:before{content:"\f048f"}.mdi-server-outline:before{content:"\f1c9a"}.mdi-server-plus:before{content:"\f0490"}.mdi-server-plus-outline:before{content:"\f1c9b"}.mdi-server-remove:before{content:"\f0491"}.mdi-server-security:before{content:"\f0492"}.mdi-set-all:before{content:"\f0778"}.mdi-set-center:before{content:"\f0779"}.mdi-set-center-right:before{content:"\f077a"}.mdi-set-left:before{content:"\f077b"}.mdi-set-left-center:before{content:"\f077c"}.mdi-set-left-right:before{content:"\f077d"}.mdi-set-merge:before{content:"\f14e0"}.mdi-set-none:before{content:"\f077e"}.mdi-set-right:before{content:"\f077f"}.mdi-set-split:before{content:"\f14e1"}.mdi-set-square:before{content:"\f145d"}.mdi-set-top-box:before{content:"\f099f"}.mdi-settings-helper:before{content:"\f0a6e"}.mdi-shaker:before{content:"\f110e"}.mdi-shaker-outline:before{content:"\f110f"}.mdi-shape:before{content:"\f0831"}.mdi-shape-circle-plus:before{content:"\f065d"}.mdi-shape-outline:before{content:"\f0832"}.mdi-shape-oval-plus:before{content:"\f11fa"}.mdi-shape-plus:before{content:"\f0495"}.mdi-shape-plus-outline:before{content:"\f1c4f"}.mdi-shape-polygon-plus:before{content:"\f065e"}.mdi-shape-rectangle-plus:before{content:"\f065f"}.mdi-shape-square-plus:before{content:"\f0660"}.mdi-shape-square-rounded-plus:before{content:"\f14fa"}.mdi-share:before{content:"\f0496"}.mdi-share-all:before{content:"\f11f4"}.mdi-share-all-outline:before{content:"\f11f5"}.mdi-share-circle:before{content:"\f11ad"}.mdi-share-off:before{content:"\f0f23"}.mdi-share-off-outline:before{content:"\f0f24"}.mdi-share-outline:before{content:"\f0932"}.mdi-share-variant:before{content:"\f0497"}.mdi-share-variant-outline:before{content:"\f1514"}.mdi-shark:before{content:"\f18ba"}.mdi-shark-fin:before{content:"\f1673"}.mdi-shark-fin-outline:before{content:"\f1674"}.mdi-shark-off:before{content:"\f18bb"}.mdi-sheep:before{content:"\f0cc6"}.mdi-shield:before{content:"\f0498"}.mdi-shield-account:before{content:"\f088f"}.mdi-shield-account-outline:before{content:"\f0a12"}.mdi-shield-account-variant:before{content:"\f15a7"}.mdi-shield-account-variant-outline:before{content:"\f15a8"}.mdi-shield-airplane:before{content:"\f06bb"}.mdi-shield-airplane-outline:before{content:"\f0cc7"}.mdi-shield-alert:before{content:"\f0ecc"}.mdi-shield-alert-outline:before{content:"\f0ecd"}.mdi-shield-bug:before{content:"\f13da"}.mdi-shield-bug-outline:before{content:"\f13db"}.mdi-shield-car:before{content:"\f0f83"}.mdi-shield-check:before{content:"\f0565"}.mdi-shield-check-outline:before{content:"\f0cc8"}.mdi-shield-cross:before{content:"\f0cc9"}.mdi-shield-cross-outline:before{content:"\f0cca"}.mdi-shield-crown:before{content:"\f18bc"}.mdi-shield-crown-outline:before{content:"\f18bd"}.mdi-shield-edit:before{content:"\f11a0"}.mdi-shield-edit-outline:before{content:"\f11a1"}.mdi-shield-half:before{content:"\f1360"}.mdi-shield-half-full:before{content:"\f0780"}.mdi-shield-home:before{content:"\f068a"}.mdi-shield-home-outline:before{content:"\f0ccb"}.mdi-shield-key:before{content:"\f0bc4"}.mdi-shield-key-outline:before{content:"\f0bc5"}.mdi-shield-link-variant:before{content:"\f0d33"}.mdi-shield-link-variant-outline:before{content:"\f0d34"}.mdi-shield-lock:before{content:"\f099d"}.mdi-shield-lock-open:before{content:"\f199a"}.mdi-shield-lock-open-outline:before{content:"\f199b"}.mdi-shield-lock-outline:before{content:"\f0ccc"}.mdi-shield-moon:before{content:"\f1828"}.mdi-shield-moon-outline:before{content:"\f1829"}.mdi-shield-off:before{content:"\f099e"}.mdi-shield-off-outline:before{content:"\f099c"}.mdi-shield-outline:before{content:"\f0499"}.mdi-shield-plus:before{content:"\f0ada"}.mdi-shield-plus-outline:before{content:"\f0adb"}.mdi-shield-refresh:before{content:"\f00aa"}.mdi-shield-refresh-outline:before{content:"\f01e0"}.mdi-shield-remove:before{content:"\f0adc"}.mdi-shield-remove-outline:before{content:"\f0add"}.mdi-shield-search:before{content:"\f0d9a"}.mdi-shield-star:before{content:"\f113b"}.mdi-shield-star-outline:before{content:"\f113c"}.mdi-shield-sun:before{content:"\f105d"}.mdi-shield-sun-outline:before{content:"\f105e"}.mdi-shield-sword:before{content:"\f18be"}.mdi-shield-sword-outline:before{content:"\f18bf"}.mdi-shield-sync:before{content:"\f11a2"}.mdi-shield-sync-outline:before{content:"\f11a3"}.mdi-shimmer:before{content:"\f1545"}.mdi-ship-wheel:before{content:"\f0833"}.mdi-shipping-pallet:before{content:"\f184e"}.mdi-shoe-ballet:before{content:"\f15ca"}.mdi-shoe-cleat:before{content:"\f15c7"}.mdi-shoe-formal:before{content:"\f0b47"}.mdi-shoe-heel:before{content:"\f0b48"}.mdi-shoe-print:before{content:"\f0dfa"}.mdi-shoe-sneaker:before{content:"\f15c8"}.mdi-shopping:before{content:"\f049a"}.mdi-shopping-music:before{content:"\f049b"}.mdi-shopping-outline:before{content:"\f11d5"}.mdi-shopping-search:before{content:"\f0f84"}.mdi-shopping-search-outline:before{content:"\f1a6f"}.mdi-shore:before{content:"\f14f9"}.mdi-shovel:before{content:"\f0710"}.mdi-shovel-off:before{content:"\f0711"}.mdi-shower:before{content:"\f09a0"}.mdi-shower-head:before{content:"\f09a1"}.mdi-shredder:before{content:"\f049c"}.mdi-shuffle:before{content:"\f049d"}.mdi-shuffle-disabled:before{content:"\f049e"}.mdi-shuffle-variant:before{content:"\f049f"}.mdi-shuriken:before{content:"\f137f"}.mdi-sickle:before{content:"\f18c0"}.mdi-sigma:before{content:"\f04a0"}.mdi-sigma-lower:before{content:"\f062b"}.mdi-sign-caution:before{content:"\f04a1"}.mdi-sign-direction:before{content:"\f0781"}.mdi-sign-direction-minus:before{content:"\f1000"}.mdi-sign-direction-plus:before{content:"\f0fdc"}.mdi-sign-direction-remove:before{content:"\f0fdd"}.mdi-sign-language:before{content:"\f1b4d"}.mdi-sign-language-outline:before{content:"\f1b4e"}.mdi-sign-pole:before{content:"\f14f8"}.mdi-sign-real-estate:before{content:"\f1118"}.mdi-sign-text:before{content:"\f0782"}.mdi-sign-yield:before{content:"\f1baf"}.mdi-signal:before{content:"\f04a2"}.mdi-signal-2g:before{content:"\f0712"}.mdi-signal-3g:before{content:"\f0713"}.mdi-signal-4g:before{content:"\f0714"}.mdi-signal-5g:before{content:"\f0a6f"}.mdi-signal-cellular-1:before{content:"\f08bc"}.mdi-signal-cellular-2:before{content:"\f08bd"}.mdi-signal-cellular-3:before{content:"\f08be"}.mdi-signal-cellular-outline:before{content:"\f08bf"}.mdi-signal-distance-variant:before{content:"\f0e64"}.mdi-signal-hspa:before{content:"\f0715"}.mdi-signal-hspa-plus:before{content:"\f0716"}.mdi-signal-off:before{content:"\f0783"}.mdi-signal-variant:before{content:"\f060a"}.mdi-signature:before{content:"\f0dfb"}.mdi-signature-freehand:before{content:"\f0dfc"}.mdi-signature-image:before{content:"\f0dfd"}.mdi-signature-text:before{content:"\f0dfe"}.mdi-silo:before{content:"\f1b9f"}.mdi-silo-outline:before{content:"\f0b49"}.mdi-silverware:before{content:"\f04a3"}.mdi-silverware-clean:before{content:"\f0fde"}.mdi-silverware-fork:before{content:"\f04a4"}.mdi-silverware-fork-knife:before{content:"\f0a70"}.mdi-silverware-spoon:before{content:"\f04a5"}.mdi-silverware-variant:before{content:"\f04a6"}.mdi-sim:before{content:"\f04a7"}.mdi-sim-alert:before{content:"\f04a8"}.mdi-sim-alert-outline:before{content:"\f15d3"}.mdi-sim-off:before{content:"\f04a9"}.mdi-sim-off-outline:before{content:"\f15d4"}.mdi-sim-outline:before{content:"\f15d5"}.mdi-simple-icons:before{content:"\f131d"}.mdi-sina-weibo:before{content:"\f0adf"}.mdi-sine-wave:before{content:"\f095b"}.mdi-sitemap:before{content:"\f04aa"}.mdi-sitemap-outline:before{content:"\f199c"}.mdi-size-l:before{content:"\f13a6"}.mdi-size-m:before{content:"\f13a5"}.mdi-size-s:before{content:"\f13a4"}.mdi-size-xl:before{content:"\f13a7"}.mdi-size-xs:before{content:"\f13a3"}.mdi-size-xxl:before{content:"\f13a8"}.mdi-size-xxs:before{content:"\f13a2"}.mdi-size-xxxl:before{content:"\f13a9"}.mdi-skate:before{content:"\f0d35"}.mdi-skate-off:before{content:"\f0699"}.mdi-skateboard:before{content:"\f14c2"}.mdi-skateboarding:before{content:"\f0501"}.mdi-skew-less:before{content:"\f0d36"}.mdi-skew-more:before{content:"\f0d37"}.mdi-ski:before{content:"\f1304"}.mdi-ski-cross-country:before{content:"\f1305"}.mdi-ski-water:before{content:"\f1306"}.mdi-skip-backward:before{content:"\f04ab"}.mdi-skip-backward-outline:before{content:"\f0f25"}.mdi-skip-forward:before{content:"\f04ac"}.mdi-skip-forward-outline:before{content:"\f0f26"}.mdi-skip-next:before{content:"\f04ad"}.mdi-skip-next-circle:before{content:"\f0661"}.mdi-skip-next-circle-outline:before{content:"\f0662"}.mdi-skip-next-outline:before{content:"\f0f27"}.mdi-skip-previous:before{content:"\f04ae"}.mdi-skip-previous-circle:before{content:"\f0663"}.mdi-skip-previous-circle-outline:before{content:"\f0664"}.mdi-skip-previous-outline:before{content:"\f0f28"}.mdi-skull:before{content:"\f068c"}.mdi-skull-crossbones:before{content:"\f0bc6"}.mdi-skull-crossbones-outline:before{content:"\f0bc7"}.mdi-skull-outline:before{content:"\f0bc8"}.mdi-skull-scan:before{content:"\f14c7"}.mdi-skull-scan-outline:before{content:"\f14c8"}.mdi-skype:before{content:"\f04af"}.mdi-skype-business:before{content:"\f04b0"}.mdi-slack:before{content:"\f04b1"}.mdi-slash-forward:before{content:"\f0fdf"}.mdi-slash-forward-box:before{content:"\f0fe0"}.mdi-sledding:before{content:"\f041b"}.mdi-sleep:before{content:"\f04b2"}.mdi-sleep-off:before{content:"\f04b3"}.mdi-slide:before{content:"\f15a5"}.mdi-slope-downhill:before{content:"\f0dff"}.mdi-slope-uphill:before{content:"\f0e00"}.mdi-slot-machine:before{content:"\f1114"}.mdi-slot-machine-outline:before{content:"\f1115"}.mdi-smart-card:before{content:"\f10bd"}.mdi-smart-card-off:before{content:"\f18f7"}.mdi-smart-card-off-outline:before{content:"\f18f8"}.mdi-smart-card-outline:before{content:"\f10be"}.mdi-smart-card-reader:before{content:"\f10bf"}.mdi-smart-card-reader-outline:before{content:"\f10c0"}.mdi-smog:before{content:"\f0a71"}.mdi-smoke:before{content:"\f1799"}.mdi-smoke-detector:before{content:"\f0392"}.mdi-smoke-detector-alert:before{content:"\f192e"}.mdi-smoke-detector-alert-outline:before{content:"\f192f"}.mdi-smoke-detector-off:before{content:"\f1809"}.mdi-smoke-detector-off-outline:before{content:"\f180a"}.mdi-smoke-detector-outline:before{content:"\f1808"}.mdi-smoke-detector-variant:before{content:"\f180b"}.mdi-smoke-detector-variant-alert:before{content:"\f1930"}.mdi-smoke-detector-variant-off:before{content:"\f180c"}.mdi-smoking:before{content:"\f04b4"}.mdi-smoking-off:before{content:"\f04b5"}.mdi-smoking-pipe:before{content:"\f140d"}.mdi-smoking-pipe-off:before{content:"\f1428"}.mdi-snail:before{content:"\f1677"}.mdi-snake:before{content:"\f150e"}.mdi-snapchat:before{content:"\f04b6"}.mdi-snowboard:before{content:"\f1307"}.mdi-snowflake:before{content:"\f0717"}.mdi-snowflake-alert:before{content:"\f0f29"}.mdi-snowflake-check:before{content:"\f1a70"}.mdi-snowflake-melt:before{content:"\f12cb"}.mdi-snowflake-off:before{content:"\f14e3"}.mdi-snowflake-thermometer:before{content:"\f1a71"}.mdi-snowflake-variant:before{content:"\f0f2a"}.mdi-snowman:before{content:"\f04b7"}.mdi-snowmobile:before{content:"\f06dd"}.mdi-snowshoeing:before{content:"\f1a72"}.mdi-soccer:before{content:"\f04b8"}.mdi-soccer-field:before{content:"\f0834"}.mdi-social-distance-2-meters:before{content:"\f1579"}.mdi-social-distance-6-feet:before{content:"\f157a"}.mdi-sofa:before{content:"\f04b9"}.mdi-sofa-outline:before{content:"\f156d"}.mdi-sofa-single:before{content:"\f156e"}.mdi-sofa-single-outline:before{content:"\f156f"}.mdi-solar-panel:before{content:"\f0d9b"}.mdi-solar-panel-large:before{content:"\f0d9c"}.mdi-solar-power:before{content:"\f0a72"}.mdi-solar-power-variant:before{content:"\f1a73"}.mdi-solar-power-variant-outline:before{content:"\f1a74"}.mdi-soldering-iron:before{content:"\f1092"}.mdi-solid:before{content:"\f068d"}.mdi-sony-playstation:before{content:"\f0414"}.mdi-sort:before{content:"\f04ba"}.mdi-sort-alphabetical-ascending:before{content:"\f05bd"}.mdi-sort-alphabetical-ascending-variant:before{content:"\f1148"}.mdi-sort-alphabetical-descending:before{content:"\f05bf"}.mdi-sort-alphabetical-descending-variant:before{content:"\f1149"}.mdi-sort-alphabetical-variant:before{content:"\f04bb"}.mdi-sort-ascending:before{content:"\f04bc"}.mdi-sort-bool-ascending:before{content:"\f1385"}.mdi-sort-bool-ascending-variant:before{content:"\f1386"}.mdi-sort-bool-descending:before{content:"\f1387"}.mdi-sort-bool-descending-variant:before{content:"\f1388"}.mdi-sort-calendar-ascending:before{content:"\f1547"}.mdi-sort-calendar-descending:before{content:"\f1548"}.mdi-sort-clock-ascending:before{content:"\f1549"}.mdi-sort-clock-ascending-outline:before{content:"\f154a"}.mdi-sort-clock-descending:before{content:"\f154b"}.mdi-sort-clock-descending-outline:before{content:"\f154c"}.mdi-sort-descending:before{content:"\f04bd"}.mdi-sort-numeric-ascending:before{content:"\f1389"}.mdi-sort-numeric-ascending-variant:before{content:"\f090d"}.mdi-sort-numeric-descending:before{content:"\f138a"}.mdi-sort-numeric-descending-variant:before{content:"\f0ad2"}.mdi-sort-numeric-variant:before{content:"\f04be"}.mdi-sort-reverse-variant:before{content:"\f033c"}.mdi-sort-variant:before{content:"\f04bf"}.mdi-sort-variant-lock:before{content:"\f0ccd"}.mdi-sort-variant-lock-open:before{content:"\f0cce"}.mdi-sort-variant-off:before{content:"\f1abb"}.mdi-sort-variant-remove:before{content:"\f1147"}.mdi-soundbar:before{content:"\f17db"}.mdi-soundcloud:before{content:"\f04c0"}.mdi-source-branch:before{content:"\f062c"}.mdi-source-branch-check:before{content:"\f14cf"}.mdi-source-branch-minus:before{content:"\f14cb"}.mdi-source-branch-plus:before{content:"\f14ca"}.mdi-source-branch-refresh:before{content:"\f14cd"}.mdi-source-branch-remove:before{content:"\f14cc"}.mdi-source-branch-sync:before{content:"\f14ce"}.mdi-source-commit:before{content:"\f0718"}.mdi-source-commit-end:before{content:"\f0719"}.mdi-source-commit-end-local:before{content:"\f071a"}.mdi-source-commit-local:before{content:"\f071b"}.mdi-source-commit-next-local:before{content:"\f071c"}.mdi-source-commit-start:before{content:"\f071d"}.mdi-source-commit-start-next-local:before{content:"\f071e"}.mdi-source-fork:before{content:"\f04c1"}.mdi-source-merge:before{content:"\f062d"}.mdi-source-pull:before{content:"\f04c2"}.mdi-source-repository:before{content:"\f0ccf"}.mdi-source-repository-multiple:before{content:"\f0cd0"}.mdi-soy-sauce:before{content:"\f07ee"}.mdi-soy-sauce-off:before{content:"\f13fc"}.mdi-spa:before{content:"\f0cd1"}.mdi-spa-outline:before{content:"\f0cd2"}.mdi-space-invaders:before{content:"\f0bc9"}.mdi-space-station:before{content:"\f1383"}.mdi-spade:before{content:"\f0e65"}.mdi-speaker:before{content:"\f04c3"}.mdi-speaker-bluetooth:before{content:"\f09a2"}.mdi-speaker-message:before{content:"\f1b11"}.mdi-speaker-multiple:before{content:"\f0d38"}.mdi-speaker-off:before{content:"\f04c4"}.mdi-speaker-pause:before{content:"\f1b73"}.mdi-speaker-play:before{content:"\f1b72"}.mdi-speaker-stop:before{content:"\f1b74"}.mdi-speaker-wireless:before{content:"\f071f"}.mdi-spear:before{content:"\f1845"}.mdi-speedometer:before{content:"\f04c5"}.mdi-speedometer-medium:before{content:"\f0f85"}.mdi-speedometer-slow:before{content:"\f0f86"}.mdi-spellcheck:before{content:"\f04c6"}.mdi-sphere:before{content:"\f1954"}.mdi-sphere-off:before{content:"\f1955"}.mdi-spider:before{content:"\f11ea"}.mdi-spider-outline:before{content:"\f1c75"}.mdi-spider-thread:before{content:"\f11eb"}.mdi-spider-web:before{content:"\f0bca"}.mdi-spirit-level:before{content:"\f14f1"}.mdi-spoon-sugar:before{content:"\f1429"}.mdi-spotify:before{content:"\f04c7"}.mdi-spotlight:before{content:"\f04c8"}.mdi-spotlight-beam:before{content:"\f04c9"}.mdi-spray:before{content:"\f0665"}.mdi-spray-bottle:before{content:"\f0ae0"}.mdi-sprinkler:before{content:"\f105f"}.mdi-sprinkler-fire:before{content:"\f199d"}.mdi-sprinkler-variant:before{content:"\f1060"}.mdi-sprout:before{content:"\f0e66"}.mdi-sprout-outline:before{content:"\f0e67"}.mdi-square:before{content:"\f0764"}.mdi-square-circle:before{content:"\f1500"}.mdi-square-circle-outline:before{content:"\f1c50"}.mdi-square-edit-outline:before{content:"\f090c"}.mdi-square-medium:before{content:"\f0a13"}.mdi-square-medium-outline:before{content:"\f0a14"}.mdi-square-off:before{content:"\f12ee"}.mdi-square-off-outline:before{content:"\f12ef"}.mdi-square-opacity:before{content:"\f1854"}.mdi-square-outline:before{content:"\f0763"}.mdi-square-root:before{content:"\f0784"}.mdi-square-root-box:before{content:"\f09a3"}.mdi-square-rounded:before{content:"\f14fb"}.mdi-square-rounded-badge:before{content:"\f1a07"}.mdi-square-rounded-badge-outline:before{content:"\f1a08"}.mdi-square-rounded-outline:before{content:"\f14fc"}.mdi-square-small:before{content:"\f0a15"}.mdi-square-wave:before{content:"\f147b"}.mdi-squeegee:before{content:"\f0ae1"}.mdi-ssh:before{content:"\f08c0"}.mdi-stack-exchange:before{content:"\f060b"}.mdi-stack-overflow:before{content:"\f04cc"}.mdi-stackpath:before{content:"\f0359"}.mdi-stadium:before{content:"\f0ff9"}.mdi-stadium-outline:before{content:"\f1b03"}.mdi-stadium-variant:before{content:"\f0720"}.mdi-stairs:before{content:"\f04cd"}.mdi-stairs-box:before{content:"\f139e"}.mdi-stairs-down:before{content:"\f12be"}.mdi-stairs-up:before{content:"\f12bd"}.mdi-stamper:before{content:"\f0d39"}.mdi-standard-definition:before{content:"\f07ef"}.mdi-star:before{content:"\f04ce"}.mdi-star-box:before{content:"\f0a73"}.mdi-star-box-multiple:before{content:"\f1286"}.mdi-star-box-multiple-outline:before{content:"\f1287"}.mdi-star-box-outline:before{content:"\f0a74"}.mdi-star-check:before{content:"\f1566"}.mdi-star-check-outline:before{content:"\f156a"}.mdi-star-circle:before{content:"\f04cf"}.mdi-star-circle-outline:before{content:"\f09a4"}.mdi-star-cog:before{content:"\f1668"}.mdi-star-cog-outline:before{content:"\f1669"}.mdi-star-crescent:before{content:"\f0979"}.mdi-star-david:before{content:"\f097a"}.mdi-star-face:before{content:"\f09a5"}.mdi-star-four-points:before{content:"\f0ae2"}.mdi-star-four-points-box:before{content:"\f1c51"}.mdi-star-four-points-box-outline:before{content:"\f1c52"}.mdi-star-four-points-circle:before{content:"\f1c53"}.mdi-star-four-points-circle-outline:before{content:"\f1c54"}.mdi-star-four-points-outline:before{content:"\f0ae3"}.mdi-star-four-points-small:before{content:"\f1c55"}.mdi-star-half:before{content:"\f0246"}.mdi-star-half-full:before{content:"\f04d0"}.mdi-star-minus:before{content:"\f1564"}.mdi-star-minus-outline:before{content:"\f1568"}.mdi-star-off:before{content:"\f04d1"}.mdi-star-off-outline:before{content:"\f155b"}.mdi-star-outline:before{content:"\f04d2"}.mdi-star-plus:before{content:"\f1563"}.mdi-star-plus-outline:before{content:"\f1567"}.mdi-star-remove:before{content:"\f1565"}.mdi-star-remove-outline:before{content:"\f1569"}.mdi-star-settings:before{content:"\f166a"}.mdi-star-settings-outline:before{content:"\f166b"}.mdi-star-shooting:before{content:"\f1741"}.mdi-star-shooting-outline:before{content:"\f1742"}.mdi-star-three-points:before{content:"\f0ae4"}.mdi-star-three-points-outline:before{content:"\f0ae5"}.mdi-state-machine:before{content:"\f11ef"}.mdi-steam:before{content:"\f04d3"}.mdi-steering:before{content:"\f04d4"}.mdi-steering-off:before{content:"\f090e"}.mdi-step-backward:before{content:"\f04d5"}.mdi-step-backward-2:before{content:"\f04d6"}.mdi-step-forward:before{content:"\f04d7"}.mdi-step-forward-2:before{content:"\f04d8"}.mdi-stethoscope:before{content:"\f04d9"}.mdi-sticker:before{content:"\f1364"}.mdi-sticker-alert:before{content:"\f1365"}.mdi-sticker-alert-outline:before{content:"\f1366"}.mdi-sticker-check:before{content:"\f1367"}.mdi-sticker-check-outline:before{content:"\f1368"}.mdi-sticker-circle-outline:before{content:"\f05d0"}.mdi-sticker-emoji:before{content:"\f0785"}.mdi-sticker-minus:before{content:"\f1369"}.mdi-sticker-minus-outline:before{content:"\f136a"}.mdi-sticker-outline:before{content:"\f136b"}.mdi-sticker-plus:before{content:"\f136c"}.mdi-sticker-plus-outline:before{content:"\f136d"}.mdi-sticker-remove:before{content:"\f136e"}.mdi-sticker-remove-outline:before{content:"\f136f"}.mdi-sticker-text:before{content:"\f178e"}.mdi-sticker-text-outline:before{content:"\f178f"}.mdi-stocking:before{content:"\f04da"}.mdi-stomach:before{content:"\f1093"}.mdi-stool:before{content:"\f195d"}.mdi-stool-outline:before{content:"\f195e"}.mdi-stop:before{content:"\f04db"}.mdi-stop-circle:before{content:"\f0666"}.mdi-stop-circle-outline:before{content:"\f0667"}.mdi-storage-tank:before{content:"\f1a75"}.mdi-storage-tank-outline:before{content:"\f1a76"}.mdi-store:before{content:"\f04dc"}.mdi-store-24-hour:before{content:"\f04dd"}.mdi-store-alert:before{content:"\f18c1"}.mdi-store-alert-outline:before{content:"\f18c2"}.mdi-store-check:before{content:"\f18c3"}.mdi-store-check-outline:before{content:"\f18c4"}.mdi-store-clock:before{content:"\f18c5"}.mdi-store-clock-outline:before{content:"\f18c6"}.mdi-store-cog:before{content:"\f18c7"}.mdi-store-cog-outline:before{content:"\f18c8"}.mdi-store-edit:before{content:"\f18c9"}.mdi-store-edit-outline:before{content:"\f18ca"}.mdi-store-marker:before{content:"\f18cb"}.mdi-store-marker-outline:before{content:"\f18cc"}.mdi-store-minus:before{content:"\f165e"}.mdi-store-minus-outline:before{content:"\f18cd"}.mdi-store-off:before{content:"\f18ce"}.mdi-store-off-outline:before{content:"\f18cf"}.mdi-store-outline:before{content:"\f1361"}.mdi-store-plus:before{content:"\f165f"}.mdi-store-plus-outline:before{content:"\f18d0"}.mdi-store-remove:before{content:"\f1660"}.mdi-store-remove-outline:before{content:"\f18d1"}.mdi-store-search:before{content:"\f18d2"}.mdi-store-search-outline:before{content:"\f18d3"}.mdi-store-settings:before{content:"\f18d4"}.mdi-store-settings-outline:before{content:"\f18d5"}.mdi-storefront:before{content:"\f07c7"}.mdi-storefront-check:before{content:"\f1b7d"}.mdi-storefront-check-outline:before{content:"\f1b7e"}.mdi-storefront-edit:before{content:"\f1b7f"}.mdi-storefront-edit-outline:before{content:"\f1b80"}.mdi-storefront-minus:before{content:"\f1b83"}.mdi-storefront-minus-outline:before{content:"\f1b84"}.mdi-storefront-outline:before{content:"\f10c1"}.mdi-storefront-plus:before{content:"\f1b81"}.mdi-storefront-plus-outline:before{content:"\f1b82"}.mdi-storefront-remove:before{content:"\f1b85"}.mdi-storefront-remove-outline:before{content:"\f1b86"}.mdi-stove:before{content:"\f04de"}.mdi-strategy:before{content:"\f11d6"}.mdi-stretch-to-page:before{content:"\f0f2b"}.mdi-stretch-to-page-outline:before{content:"\f0f2c"}.mdi-string-lights:before{content:"\f12ba"}.mdi-string-lights-off:before{content:"\f12bb"}.mdi-subdirectory-arrow-left:before{content:"\f060c"}.mdi-subdirectory-arrow-right:before{content:"\f060d"}.mdi-submarine:before{content:"\f156c"}.mdi-subtitles:before{content:"\f0a16"}.mdi-subtitles-outline:before{content:"\f0a17"}.mdi-subway:before{content:"\f06ac"}.mdi-subway-alert-variant:before{content:"\f0d9d"}.mdi-subway-variant:before{content:"\f04df"}.mdi-summit:before{content:"\f0786"}.mdi-sun-angle:before{content:"\f1b27"}.mdi-sun-angle-outline:before{content:"\f1b28"}.mdi-sun-clock:before{content:"\f1a77"}.mdi-sun-clock-outline:before{content:"\f1a78"}.mdi-sun-compass:before{content:"\f19a5"}.mdi-sun-snowflake:before{content:"\f1796"}.mdi-sun-snowflake-variant:before{content:"\f1a79"}.mdi-sun-thermometer:before{content:"\f18d6"}.mdi-sun-thermometer-outline:before{content:"\f18d7"}.mdi-sun-wireless:before{content:"\f17fe"}.mdi-sun-wireless-outline:before{content:"\f17ff"}.mdi-sunglasses:before{content:"\f04e0"}.mdi-surfing:before{content:"\f1746"}.mdi-surround-sound:before{content:"\f05c5"}.mdi-surround-sound-2-0:before{content:"\f07f0"}.mdi-surround-sound-2-1:before{content:"\f1729"}.mdi-surround-sound-3-1:before{content:"\f07f1"}.mdi-surround-sound-5-1:before{content:"\f07f2"}.mdi-surround-sound-5-1-2:before{content:"\f172a"}.mdi-surround-sound-7-1:before{content:"\f07f3"}.mdi-svg:before{content:"\f0721"}.mdi-swap-horizontal:before{content:"\f04e1"}.mdi-swap-horizontal-bold:before{content:"\f0bcd"}.mdi-swap-horizontal-circle:before{content:"\f0fe1"}.mdi-swap-horizontal-circle-outline:before{content:"\f0fe2"}.mdi-swap-horizontal-hidden:before{content:"\f1d0e"}.mdi-swap-horizontal-variant:before{content:"\f08c1"}.mdi-swap-vertical:before{content:"\f04e2"}.mdi-swap-vertical-bold:before{content:"\f0bce"}.mdi-swap-vertical-circle:before{content:"\f0fe3"}.mdi-swap-vertical-circle-outline:before{content:"\f0fe4"}.mdi-swap-vertical-variant:before{content:"\f08c2"}.mdi-swim:before{content:"\f04e3"}.mdi-switch:before{content:"\f04e4"}.mdi-sword:before{content:"\f04e5"}.mdi-sword-cross:before{content:"\f0787"}.mdi-syllabary-hangul:before{content:"\f1333"}.mdi-syllabary-hiragana:before{content:"\f1334"}.mdi-syllabary-katakana:before{content:"\f1335"}.mdi-syllabary-katakana-halfwidth:before{content:"\f1336"}.mdi-symbol:before{content:"\f1501"}.mdi-symfony:before{content:"\f0ae6"}.mdi-synagogue:before{content:"\f1b04"}.mdi-synagogue-outline:before{content:"\f1b05"}.mdi-sync:before{content:"\f04e6"}.mdi-sync-alert:before{content:"\f04e7"}.mdi-sync-circle:before{content:"\f1378"}.mdi-sync-off:before{content:"\f04e8"}.mdi-tab:before{content:"\f04e9"}.mdi-tab-minus:before{content:"\f0b4b"}.mdi-tab-plus:before{content:"\f075c"}.mdi-tab-remove:before{content:"\f0b4c"}.mdi-tab-search:before{content:"\f199e"}.mdi-tab-unselected:before{content:"\f04ea"}.mdi-table:before{content:"\f04eb"}.mdi-table-account:before{content:"\f13b9"}.mdi-table-alert:before{content:"\f13ba"}.mdi-table-arrow-down:before{content:"\f13bb"}.mdi-table-arrow-left:before{content:"\f13bc"}.mdi-table-arrow-right:before{content:"\f13bd"}.mdi-table-arrow-up:before{content:"\f13be"}.mdi-table-border:before{content:"\f0a18"}.mdi-table-cancel:before{content:"\f13bf"}.mdi-table-chair:before{content:"\f1061"}.mdi-table-check:before{content:"\f13c0"}.mdi-table-clock:before{content:"\f13c1"}.mdi-table-cog:before{content:"\f13c2"}.mdi-table-column:before{content:"\f0835"}.mdi-table-column-plus-after:before{content:"\f04ec"}.mdi-table-column-plus-before:before{content:"\f04ed"}.mdi-table-column-remove:before{content:"\f04ee"}.mdi-table-column-width:before{content:"\f04ef"}.mdi-table-edit:before{content:"\f04f0"}.mdi-table-eye:before{content:"\f1094"}.mdi-table-eye-off:before{content:"\f13c3"}.mdi-table-filter:before{content:"\f1b8c"}.mdi-table-furniture:before{content:"\f05bc"}.mdi-table-headers-eye:before{content:"\f121d"}.mdi-table-headers-eye-off:before{content:"\f121e"}.mdi-table-heart:before{content:"\f13c4"}.mdi-table-key:before{content:"\f13c5"}.mdi-table-large:before{content:"\f04f1"}.mdi-table-large-plus:before{content:"\f0f87"}.mdi-table-large-remove:before{content:"\f0f88"}.mdi-table-lock:before{content:"\f13c6"}.mdi-table-merge-cells:before{content:"\f09a6"}.mdi-table-minus:before{content:"\f13c7"}.mdi-table-multiple:before{content:"\f13c8"}.mdi-table-network:before{content:"\f13c9"}.mdi-table-of-contents:before{content:"\f0836"}.mdi-table-off:before{content:"\f13ca"}.mdi-table-picnic:before{content:"\f1743"}.mdi-table-pivot:before{content:"\f183c"}.mdi-table-plus:before{content:"\f0a75"}.mdi-table-question:before{content:"\f1b21"}.mdi-table-refresh:before{content:"\f13a0"}.mdi-table-remove:before{content:"\f0a76"}.mdi-table-row:before{content:"\f0837"}.mdi-table-row-height:before{content:"\f04f2"}.mdi-table-row-plus-after:before{content:"\f04f3"}.mdi-table-row-plus-before:before{content:"\f04f4"}.mdi-table-row-remove:before{content:"\f04f5"}.mdi-table-search:before{content:"\f090f"}.mdi-table-settings:before{content:"\f0838"}.mdi-table-split-cell:before{content:"\f142a"}.mdi-table-star:before{content:"\f13cb"}.mdi-table-sync:before{content:"\f13a1"}.mdi-table-tennis:before{content:"\f0e68"}.mdi-tablet:before{content:"\f04f6"}.mdi-tablet-cellphone:before{content:"\f09a7"}.mdi-tablet-dashboard:before{content:"\f0ece"}.mdi-taco:before{content:"\f0762"}.mdi-tag:before{content:"\f04f9"}.mdi-tag-arrow-down:before{content:"\f172b"}.mdi-tag-arrow-down-outline:before{content:"\f172c"}.mdi-tag-arrow-left:before{content:"\f172d"}.mdi-tag-arrow-left-outline:before{content:"\f172e"}.mdi-tag-arrow-right:before{content:"\f172f"}.mdi-tag-arrow-right-outline:before{content:"\f1730"}.mdi-tag-arrow-up:before{content:"\f1731"}.mdi-tag-arrow-up-outline:before{content:"\f1732"}.mdi-tag-check:before{content:"\f1a7a"}.mdi-tag-check-outline:before{content:"\f1a7b"}.mdi-tag-edit:before{content:"\f1c9c"}.mdi-tag-edit-outline:before{content:"\f1c9d"}.mdi-tag-faces:before{content:"\f04fa"}.mdi-tag-heart:before{content:"\f068b"}.mdi-tag-heart-outline:before{content:"\f0bcf"}.mdi-tag-hidden:before{content:"\f1c76"}.mdi-tag-minus:before{content:"\f0910"}.mdi-tag-minus-outline:before{content:"\f121f"}.mdi-tag-multiple:before{content:"\f04fb"}.mdi-tag-multiple-outline:before{content:"\f12f7"}.mdi-tag-off:before{content:"\f1220"}.mdi-tag-off-outline:before{content:"\f1221"}.mdi-tag-outline:before{content:"\f04fc"}.mdi-tag-plus:before{content:"\f0722"}.mdi-tag-plus-outline:before{content:"\f1222"}.mdi-tag-remove:before{content:"\f0723"}.mdi-tag-remove-outline:before{content:"\f1223"}.mdi-tag-search:before{content:"\f1907"}.mdi-tag-search-outline:before{content:"\f1908"}.mdi-tag-text:before{content:"\f1224"}.mdi-tag-text-outline:before{content:"\f04fd"}.mdi-tailwind:before{content:"\f13ff"}.mdi-tally-mark-1:before{content:"\f1abc"}.mdi-tally-mark-2:before{content:"\f1abd"}.mdi-tally-mark-3:before{content:"\f1abe"}.mdi-tally-mark-4:before{content:"\f1abf"}.mdi-tally-mark-5:before{content:"\f1ac0"}.mdi-tangram:before{content:"\f04f8"}.mdi-tank:before{content:"\f0d3a"}.mdi-tanker-truck:before{content:"\f0fe5"}.mdi-tape-drive:before{content:"\f16df"}.mdi-tape-measure:before{content:"\f0b4d"}.mdi-target:before{content:"\f04fe"}.mdi-target-account:before{content:"\f0bd0"}.mdi-target-variant:before{content:"\f0a77"}.mdi-taxi:before{content:"\f04ff"}.mdi-tea:before{content:"\f0d9e"}.mdi-tea-outline:before{content:"\f0d9f"}.mdi-teamviewer:before{content:"\f0500"}.mdi-teddy-bear:before{content:"\f18fb"}.mdi-telescope:before{content:"\f0b4e"}.mdi-television:before{content:"\f0502"}.mdi-television-ambient-light:before{content:"\f1356"}.mdi-television-box:before{content:"\f0839"}.mdi-television-classic:before{content:"\f07f4"}.mdi-television-classic-off:before{content:"\f083a"}.mdi-television-guide:before{content:"\f0503"}.mdi-television-off:before{content:"\f083b"}.mdi-television-pause:before{content:"\f0f89"}.mdi-television-play:before{content:"\f0ecf"}.mdi-television-shimmer:before{content:"\f1110"}.mdi-television-speaker:before{content:"\f1b1b"}.mdi-television-speaker-off:before{content:"\f1b1c"}.mdi-television-stop:before{content:"\f0f8a"}.mdi-temperature-celsius:before{content:"\f0504"}.mdi-temperature-fahrenheit:before{content:"\f0505"}.mdi-temperature-kelvin:before{content:"\f0506"}.mdi-temple-buddhist:before{content:"\f1b06"}.mdi-temple-buddhist-outline:before{content:"\f1b07"}.mdi-temple-hindu:before{content:"\f1b08"}.mdi-temple-hindu-outline:before{content:"\f1b09"}.mdi-tennis:before{content:"\f0da0"}.mdi-tennis-ball:before{content:"\f0507"}.mdi-tennis-ball-outline:before{content:"\f1c5f"}.mdi-tent:before{content:"\f0508"}.mdi-terraform:before{content:"\f1062"}.mdi-terrain:before{content:"\f0509"}.mdi-test-tube:before{content:"\f0668"}.mdi-test-tube-empty:before{content:"\f0911"}.mdi-test-tube-off:before{content:"\f0912"}.mdi-text:before{content:"\f09a8"}.mdi-text-account:before{content:"\f1570"}.mdi-text-box:before{content:"\f021a"}.mdi-text-box-check:before{content:"\f0ea6"}.mdi-text-box-check-outline:before{content:"\f0ea7"}.mdi-text-box-edit:before{content:"\f1a7c"}.mdi-text-box-edit-outline:before{content:"\f1a7d"}.mdi-text-box-minus:before{content:"\f0ea8"}.mdi-text-box-minus-outline:before{content:"\f0ea9"}.mdi-text-box-multiple:before{content:"\f0ab7"}.mdi-text-box-multiple-outline:before{content:"\f0ab8"}.mdi-text-box-outline:before{content:"\f09ed"}.mdi-text-box-plus:before{content:"\f0eaa"}.mdi-text-box-plus-outline:before{content:"\f0eab"}.mdi-text-box-remove:before{content:"\f0eac"}.mdi-text-box-remove-outline:before{content:"\f0ead"}.mdi-text-box-search:before{content:"\f0eae"}.mdi-text-box-search-outline:before{content:"\f0eaf"}.mdi-text-long:before{content:"\f09aa"}.mdi-text-recognition:before{content:"\f113d"}.mdi-text-search:before{content:"\f13b8"}.mdi-text-search-variant:before{content:"\f1a7e"}.mdi-text-shadow:before{content:"\f0669"}.mdi-text-short:before{content:"\f09a9"}.mdi-texture:before{content:"\f050c"}.mdi-texture-box:before{content:"\f0fe6"}.mdi-theater:before{content:"\f050d"}.mdi-theme-light-dark:before{content:"\f050e"}.mdi-thermometer:before{content:"\f050f"}.mdi-thermometer-alert:before{content:"\f0e01"}.mdi-thermometer-auto:before{content:"\f1b0f"}.mdi-thermometer-bluetooth:before{content:"\f1895"}.mdi-thermometer-check:before{content:"\f1a7f"}.mdi-thermometer-chevron-down:before{content:"\f0e02"}.mdi-thermometer-chevron-up:before{content:"\f0e03"}.mdi-thermometer-high:before{content:"\f10c2"}.mdi-thermometer-lines:before{content:"\f0510"}.mdi-thermometer-low:before{content:"\f10c3"}.mdi-thermometer-minus:before{content:"\f0e04"}.mdi-thermometer-off:before{content:"\f1531"}.mdi-thermometer-plus:before{content:"\f0e05"}.mdi-thermometer-probe:before{content:"\f1b2b"}.mdi-thermometer-probe-off:before{content:"\f1b2c"}.mdi-thermometer-water:before{content:"\f1a80"}.mdi-thermostat:before{content:"\f0393"}.mdi-thermostat-auto:before{content:"\f1b17"}.mdi-thermostat-box:before{content:"\f0891"}.mdi-thermostat-box-auto:before{content:"\f1b18"}.mdi-thermostat-cog:before{content:"\f1c80"}.mdi-thought-bubble:before{content:"\f07f6"}.mdi-thought-bubble-outline:before{content:"\f07f7"}.mdi-thumb-down:before{content:"\f0511"}.mdi-thumb-down-outline:before{content:"\f0512"}.mdi-thumb-up:before{content:"\f0513"}.mdi-thumb-up-outline:before{content:"\f0514"}.mdi-thumbs-up-down:before{content:"\f0515"}.mdi-thumbs-up-down-outline:before{content:"\f1914"}.mdi-ticket:before{content:"\f0516"}.mdi-ticket-account:before{content:"\f0517"}.mdi-ticket-confirmation:before{content:"\f0518"}.mdi-ticket-confirmation-outline:before{content:"\f13aa"}.mdi-ticket-outline:before{content:"\f0913"}.mdi-ticket-percent:before{content:"\f0724"}.mdi-ticket-percent-outline:before{content:"\f142b"}.mdi-tie:before{content:"\f0519"}.mdi-tilde:before{content:"\f0725"}.mdi-tilde-off:before{content:"\f18f3"}.mdi-timelapse:before{content:"\f051a"}.mdi-timeline:before{content:"\f0bd1"}.mdi-timeline-alert:before{content:"\f0f95"}.mdi-timeline-alert-outline:before{content:"\f0f98"}.mdi-timeline-check:before{content:"\f1532"}.mdi-timeline-check-outline:before{content:"\f1533"}.mdi-timeline-clock:before{content:"\f11fb"}.mdi-timeline-clock-outline:before{content:"\f11fc"}.mdi-timeline-minus:before{content:"\f1534"}.mdi-timeline-minus-outline:before{content:"\f1535"}.mdi-timeline-outline:before{content:"\f0bd2"}.mdi-timeline-plus:before{content:"\f0f96"}.mdi-timeline-plus-outline:before{content:"\f0f97"}.mdi-timeline-question:before{content:"\f0f99"}.mdi-timeline-question-outline:before{content:"\f0f9a"}.mdi-timeline-remove:before{content:"\f1536"}.mdi-timeline-remove-outline:before{content:"\f1537"}.mdi-timeline-text:before{content:"\f0bd3"}.mdi-timeline-text-outline:before{content:"\f0bd4"}.mdi-timer:before{content:"\f13ab"}.mdi-timer-10:before{content:"\f051c"}.mdi-timer-3:before{content:"\f051d"}.mdi-timer-alert:before{content:"\f1acc"}.mdi-timer-alert-outline:before{content:"\f1acd"}.mdi-timer-cancel:before{content:"\f1ace"}.mdi-timer-cancel-outline:before{content:"\f1acf"}.mdi-timer-check:before{content:"\f1ad0"}.mdi-timer-check-outline:before{content:"\f1ad1"}.mdi-timer-cog:before{content:"\f1925"}.mdi-timer-cog-outline:before{content:"\f1926"}.mdi-timer-edit:before{content:"\f1ad2"}.mdi-timer-edit-outline:before{content:"\f1ad3"}.mdi-timer-lock:before{content:"\f1ad4"}.mdi-timer-lock-open:before{content:"\f1ad5"}.mdi-timer-lock-open-outline:before{content:"\f1ad6"}.mdi-timer-lock-outline:before{content:"\f1ad7"}.mdi-timer-marker:before{content:"\f1ad8"}.mdi-timer-marker-outline:before{content:"\f1ad9"}.mdi-timer-minus:before{content:"\f1ada"}.mdi-timer-minus-outline:before{content:"\f1adb"}.mdi-timer-music:before{content:"\f1adc"}.mdi-timer-music-outline:before{content:"\f1add"}.mdi-timer-off:before{content:"\f13ac"}.mdi-timer-off-outline:before{content:"\f051e"}.mdi-timer-outline:before{content:"\f051b"}.mdi-timer-pause:before{content:"\f1ade"}.mdi-timer-pause-outline:before{content:"\f1adf"}.mdi-timer-play:before{content:"\f1ae0"}.mdi-timer-play-outline:before{content:"\f1ae1"}.mdi-timer-plus:before{content:"\f1ae2"}.mdi-timer-plus-outline:before{content:"\f1ae3"}.mdi-timer-refresh:before{content:"\f1ae4"}.mdi-timer-refresh-outline:before{content:"\f1ae5"}.mdi-timer-remove:before{content:"\f1ae6"}.mdi-timer-remove-outline:before{content:"\f1ae7"}.mdi-timer-sand:before{content:"\f051f"}.mdi-timer-sand-complete:before{content:"\f199f"}.mdi-timer-sand-empty:before{content:"\f06ad"}.mdi-timer-sand-full:before{content:"\f078c"}.mdi-timer-sand-paused:before{content:"\f19a0"}.mdi-timer-settings:before{content:"\f1923"}.mdi-timer-settings-outline:before{content:"\f1924"}.mdi-timer-star:before{content:"\f1ae8"}.mdi-timer-star-outline:before{content:"\f1ae9"}.mdi-timer-stop:before{content:"\f1aea"}.mdi-timer-stop-outline:before{content:"\f1aeb"}.mdi-timer-sync:before{content:"\f1aec"}.mdi-timer-sync-outline:before{content:"\f1aed"}.mdi-timetable:before{content:"\f0520"}.mdi-tire:before{content:"\f1896"}.mdi-toaster:before{content:"\f1063"}.mdi-toaster-off:before{content:"\f11b7"}.mdi-toaster-oven:before{content:"\f0cd3"}.mdi-toggle-switch:before{content:"\f0521"}.mdi-toggle-switch-off:before{content:"\f0522"}.mdi-toggle-switch-off-outline:before{content:"\f0a19"}.mdi-toggle-switch-outline:before{content:"\f0a1a"}.mdi-toggle-switch-variant:before{content:"\f1a25"}.mdi-toggle-switch-variant-off:before{content:"\f1a26"}.mdi-toilet:before{content:"\f09ab"}.mdi-toolbox:before{content:"\f09ac"}.mdi-toolbox-outline:before{content:"\f09ad"}.mdi-tools:before{content:"\f1064"}.mdi-tooltip:before{content:"\f0523"}.mdi-tooltip-account:before{content:"\f000c"}.mdi-tooltip-cellphone:before{content:"\f183b"}.mdi-tooltip-check:before{content:"\f155c"}.mdi-tooltip-check-outline:before{content:"\f155d"}.mdi-tooltip-edit:before{content:"\f0524"}.mdi-tooltip-edit-outline:before{content:"\f12c5"}.mdi-tooltip-image:before{content:"\f0525"}.mdi-tooltip-image-outline:before{content:"\f0bd5"}.mdi-tooltip-minus:before{content:"\f155e"}.mdi-tooltip-minus-outline:before{content:"\f155f"}.mdi-tooltip-outline:before{content:"\f0526"}.mdi-tooltip-plus:before{content:"\f0bd6"}.mdi-tooltip-plus-outline:before{content:"\f0527"}.mdi-tooltip-question:before{content:"\f1bba"}.mdi-tooltip-question-outline:before{content:"\f1bbb"}.mdi-tooltip-remove:before{content:"\f1560"}.mdi-tooltip-remove-outline:before{content:"\f1561"}.mdi-tooltip-text:before{content:"\f0528"}.mdi-tooltip-text-outline:before{content:"\f0bd7"}.mdi-tooth:before{content:"\f08c3"}.mdi-tooth-outline:before{content:"\f0529"}.mdi-toothbrush:before{content:"\f1129"}.mdi-toothbrush-electric:before{content:"\f112c"}.mdi-toothbrush-paste:before{content:"\f112a"}.mdi-torch:before{content:"\f1606"}.mdi-tortoise:before{content:"\f0d3b"}.mdi-toslink:before{content:"\f12b8"}.mdi-touch-text-outline:before{content:"\f1c60"}.mdi-tournament:before{content:"\f09ae"}.mdi-tow-truck:before{content:"\f083c"}.mdi-tower-beach:before{content:"\f0681"}.mdi-tower-fire:before{content:"\f0682"}.mdi-town-hall:before{content:"\f1875"}.mdi-toy-brick:before{content:"\f1288"}.mdi-toy-brick-marker:before{content:"\f1289"}.mdi-toy-brick-marker-outline:before{content:"\f128a"}.mdi-toy-brick-minus:before{content:"\f128b"}.mdi-toy-brick-minus-outline:before{content:"\f128c"}.mdi-toy-brick-outline:before{content:"\f128d"}.mdi-toy-brick-plus:before{content:"\f128e"}.mdi-toy-brick-plus-outline:before{content:"\f128f"}.mdi-toy-brick-remove:before{content:"\f1290"}.mdi-toy-brick-remove-outline:before{content:"\f1291"}.mdi-toy-brick-search:before{content:"\f1292"}.mdi-toy-brick-search-outline:before{content:"\f1293"}.mdi-track-light:before{content:"\f0914"}.mdi-track-light-off:before{content:"\f1b01"}.mdi-trackpad:before{content:"\f07f8"}.mdi-trackpad-lock:before{content:"\f0933"}.mdi-tractor:before{content:"\f0892"}.mdi-tractor-variant:before{content:"\f14c4"}.mdi-trademark:before{content:"\f0a78"}.mdi-traffic-cone:before{content:"\f137c"}.mdi-traffic-light:before{content:"\f052b"}.mdi-traffic-light-outline:before{content:"\f182a"}.mdi-train:before{content:"\f052c"}.mdi-train-bus:before{content:"\f1cc7"}.mdi-train-car:before{content:"\f0bd8"}.mdi-train-car-autorack:before{content:"\f1b2d"}.mdi-train-car-box:before{content:"\f1b2e"}.mdi-train-car-box-full:before{content:"\f1b2f"}.mdi-train-car-box-open:before{content:"\f1b30"}.mdi-train-car-caboose:before{content:"\f1b31"}.mdi-train-car-centerbeam:before{content:"\f1b32"}.mdi-train-car-centerbeam-full:before{content:"\f1b33"}.mdi-train-car-container:before{content:"\f1b34"}.mdi-train-car-flatbed:before{content:"\f1b35"}.mdi-train-car-flatbed-car:before{content:"\f1b36"}.mdi-train-car-flatbed-tank:before{content:"\f1b37"}.mdi-train-car-gondola:before{content:"\f1b38"}.mdi-train-car-gondola-full:before{content:"\f1b39"}.mdi-train-car-hopper:before{content:"\f1b3a"}.mdi-train-car-hopper-covered:before{content:"\f1b3b"}.mdi-train-car-hopper-full:before{content:"\f1b3c"}.mdi-train-car-intermodal:before{content:"\f1b3d"}.mdi-train-car-passenger:before{content:"\f1733"}.mdi-train-car-passenger-door:before{content:"\f1734"}.mdi-train-car-passenger-door-open:before{content:"\f1735"}.mdi-train-car-passenger-variant:before{content:"\f1736"}.mdi-train-car-tank:before{content:"\f1b3e"}.mdi-train-variant:before{content:"\f08c4"}.mdi-tram:before{content:"\f052d"}.mdi-tram-side:before{content:"\f0fe7"}.mdi-transcribe:before{content:"\f052e"}.mdi-transcribe-close:before{content:"\f052f"}.mdi-transfer:before{content:"\f1065"}.mdi-transfer-down:before{content:"\f0da1"}.mdi-transfer-left:before{content:"\f0da2"}.mdi-transfer-right:before{content:"\f0530"}.mdi-transfer-up:before{content:"\f0da3"}.mdi-transit-connection:before{content:"\f0d3c"}.mdi-transit-connection-horizontal:before{content:"\f1546"}.mdi-transit-connection-variant:before{content:"\f0d3d"}.mdi-transit-detour:before{content:"\f0f8b"}.mdi-transit-skip:before{content:"\f1515"}.mdi-transit-transfer:before{content:"\f06ae"}.mdi-transition:before{content:"\f0915"}.mdi-transition-masked:before{content:"\f0916"}.mdi-translate:before{content:"\f05ca"}.mdi-translate-off:before{content:"\f0e06"}.mdi-translate-variant:before{content:"\f1b99"}.mdi-transmission-tower:before{content:"\f0d3e"}.mdi-transmission-tower-export:before{content:"\f192c"}.mdi-transmission-tower-import:before{content:"\f192d"}.mdi-transmission-tower-off:before{content:"\f19dd"}.mdi-trash-can:before{content:"\f0a79"}.mdi-trash-can-outline:before{content:"\f0a7a"}.mdi-tray:before{content:"\f1294"}.mdi-tray-alert:before{content:"\f1295"}.mdi-tray-arrow-down:before{content:"\f0120"}.mdi-tray-arrow-up:before{content:"\f011d"}.mdi-tray-full:before{content:"\f1296"}.mdi-tray-minus:before{content:"\f1297"}.mdi-tray-plus:before{content:"\f1298"}.mdi-tray-remove:before{content:"\f1299"}.mdi-treasure-chest:before{content:"\f0726"}.mdi-treasure-chest-outline:before{content:"\f1c77"}.mdi-tree:before{content:"\f0531"}.mdi-tree-outline:before{content:"\f0e69"}.mdi-trello:before{content:"\f0532"}.mdi-trending-down:before{content:"\f0533"}.mdi-trending-neutral:before{content:"\f0534"}.mdi-trending-up:before{content:"\f0535"}.mdi-triangle:before{content:"\f0536"}.mdi-triangle-down:before{content:"\f1c56"}.mdi-triangle-down-outline:before{content:"\f1c57"}.mdi-triangle-outline:before{content:"\f0537"}.mdi-triangle-small-down:before{content:"\f1a09"}.mdi-triangle-small-up:before{content:"\f1a0a"}.mdi-triangle-wave:before{content:"\f147c"}.mdi-triforce:before{content:"\f0bd9"}.mdi-trophy:before{content:"\f0538"}.mdi-trophy-award:before{content:"\f0539"}.mdi-trophy-broken:before{content:"\f0da4"}.mdi-trophy-outline:before{content:"\f053a"}.mdi-trophy-variant:before{content:"\f053b"}.mdi-trophy-variant-outline:before{content:"\f053c"}.mdi-truck:before{content:"\f053d"}.mdi-truck-alert:before{content:"\f19de"}.mdi-truck-alert-outline:before{content:"\f19df"}.mdi-truck-cargo-container:before{content:"\f18d8"}.mdi-truck-check:before{content:"\f0cd4"}.mdi-truck-check-outline:before{content:"\f129a"}.mdi-truck-delivery:before{content:"\f053e"}.mdi-truck-delivery-outline:before{content:"\f129b"}.mdi-truck-fast:before{content:"\f0788"}.mdi-truck-fast-outline:before{content:"\f129c"}.mdi-truck-flatbed:before{content:"\f1891"}.mdi-truck-minus:before{content:"\f19ae"}.mdi-truck-minus-outline:before{content:"\f19bd"}.mdi-truck-off-road:before{content:"\f1c9e"}.mdi-truck-off-road-off:before{content:"\f1c9f"}.mdi-truck-outline:before{content:"\f129d"}.mdi-truck-plus:before{content:"\f19ad"}.mdi-truck-plus-outline:before{content:"\f19bc"}.mdi-truck-remove:before{content:"\f19af"}.mdi-truck-remove-outline:before{content:"\f19be"}.mdi-truck-snowflake:before{content:"\f19a6"}.mdi-truck-trailer:before{content:"\f0727"}.mdi-trumpet:before{content:"\f1096"}.mdi-tshirt-crew:before{content:"\f0a7b"}.mdi-tshirt-crew-outline:before{content:"\f053f"}.mdi-tshirt-v:before{content:"\f0a7c"}.mdi-tshirt-v-outline:before{content:"\f0540"}.mdi-tsunami:before{content:"\f1a81"}.mdi-tumble-dryer:before{content:"\f0917"}.mdi-tumble-dryer-alert:before{content:"\f11ba"}.mdi-tumble-dryer-off:before{content:"\f11bb"}.mdi-tune:before{content:"\f062e"}.mdi-tune-variant:before{content:"\f1542"}.mdi-tune-vertical:before{content:"\f066a"}.mdi-tune-vertical-variant:before{content:"\f1543"}.mdi-tunnel:before{content:"\f183d"}.mdi-tunnel-outline:before{content:"\f183e"}.mdi-turbine:before{content:"\f1a82"}.mdi-turkey:before{content:"\f171b"}.mdi-turnstile:before{content:"\f0cd5"}.mdi-turnstile-outline:before{content:"\f0cd6"}.mdi-turtle:before{content:"\f0cd7"}.mdi-twitch:before{content:"\f0543"}.mdi-twitter:before{content:"\f0544"}.mdi-two-factor-authentication:before{content:"\f09af"}.mdi-typewriter:before{content:"\f0f2d"}.mdi-ubisoft:before{content:"\f0bda"}.mdi-ubuntu:before{content:"\f0548"}.mdi-ufo:before{content:"\f10c4"}.mdi-ufo-outline:before{content:"\f10c5"}.mdi-ultra-high-definition:before{content:"\f07f9"}.mdi-umbraco:before{content:"\f0549"}.mdi-umbrella:before{content:"\f054a"}.mdi-umbrella-beach:before{content:"\f188a"}.mdi-umbrella-beach-outline:before{content:"\f188b"}.mdi-umbrella-closed:before{content:"\f09b0"}.mdi-umbrella-closed-outline:before{content:"\f13e2"}.mdi-umbrella-closed-variant:before{content:"\f13e1"}.mdi-umbrella-outline:before{content:"\f054b"}.mdi-underwear-outline:before{content:"\f1d0f"}.mdi-undo:before{content:"\f054c"}.mdi-undo-variant:before{content:"\f054d"}.mdi-unfold-less-horizontal:before{content:"\f054e"}.mdi-unfold-less-vertical:before{content:"\f0760"}.mdi-unfold-more-horizontal:before{content:"\f054f"}.mdi-unfold-more-vertical:before{content:"\f0761"}.mdi-ungroup:before{content:"\f0550"}.mdi-unicode:before{content:"\f0ed0"}.mdi-unicorn:before{content:"\f15c2"}.mdi-unicorn-variant:before{content:"\f15c3"}.mdi-unicycle:before{content:"\f15e5"}.mdi-unity:before{content:"\f06af"}.mdi-unreal:before{content:"\f09b1"}.mdi-update:before{content:"\f06b0"}.mdi-upload:before{content:"\f0552"}.mdi-upload-box:before{content:"\f1d10"}.mdi-upload-box-outline:before{content:"\f1d11"}.mdi-upload-circle:before{content:"\f1d12"}.mdi-upload-circle-outline:before{content:"\f1d13"}.mdi-upload-lock:before{content:"\f1373"}.mdi-upload-lock-outline:before{content:"\f1374"}.mdi-upload-multiple:before{content:"\f083d"}.mdi-upload-multiple-outline:before{content:"\f1d14"}.mdi-upload-network:before{content:"\f06f6"}.mdi-upload-network-outline:before{content:"\f0cd8"}.mdi-upload-off:before{content:"\f10c6"}.mdi-upload-off-outline:before{content:"\f10c7"}.mdi-upload-outline:before{content:"\f0e07"}.mdi-usb:before{content:"\f0553"}.mdi-usb-c-port:before{content:"\f1cbf"}.mdi-usb-flash-drive:before{content:"\f129e"}.mdi-usb-flash-drive-outline:before{content:"\f129f"}.mdi-usb-port:before{content:"\f11f0"}.mdi-vacuum:before{content:"\f19a1"}.mdi-vacuum-outline:before{content:"\f19a2"}.mdi-valve:before{content:"\f1066"}.mdi-valve-closed:before{content:"\f1067"}.mdi-valve-open:before{content:"\f1068"}.mdi-van-passenger:before{content:"\f07fa"}.mdi-van-utility:before{content:"\f07fb"}.mdi-vanish:before{content:"\f07fc"}.mdi-vanish-quarter:before{content:"\f1554"}.mdi-vanity-light:before{content:"\f11e1"}.mdi-variable:before{content:"\f0ae7"}.mdi-variable-box:before{content:"\f1111"}.mdi-vector-arrange-above:before{content:"\f0554"}.mdi-vector-arrange-below:before{content:"\f0555"}.mdi-vector-bezier:before{content:"\f0ae8"}.mdi-vector-circle:before{content:"\f0556"}.mdi-vector-circle-variant:before{content:"\f0557"}.mdi-vector-combine:before{content:"\f0558"}.mdi-vector-curve:before{content:"\f0559"}.mdi-vector-difference:before{content:"\f055a"}.mdi-vector-difference-ab:before{content:"\f055b"}.mdi-vector-difference-ba:before{content:"\f055c"}.mdi-vector-ellipse:before{content:"\f0893"}.mdi-vector-intersection:before{content:"\f055d"}.mdi-vector-line:before{content:"\f055e"}.mdi-vector-link:before{content:"\f0fe8"}.mdi-vector-point:before{content:"\f01c4"}.mdi-vector-point-edit:before{content:"\f09e8"}.mdi-vector-point-minus:before{content:"\f1b78"}.mdi-vector-point-plus:before{content:"\f1b79"}.mdi-vector-point-select:before{content:"\f055f"}.mdi-vector-polygon:before{content:"\f0560"}.mdi-vector-polygon-variant:before{content:"\f1856"}.mdi-vector-polyline:before{content:"\f0561"}.mdi-vector-polyline-edit:before{content:"\f1225"}.mdi-vector-polyline-minus:before{content:"\f1226"}.mdi-vector-polyline-plus:before{content:"\f1227"}.mdi-vector-polyline-remove:before{content:"\f1228"}.mdi-vector-radius:before{content:"\f074a"}.mdi-vector-rectangle:before{content:"\f05c6"}.mdi-vector-selection:before{content:"\f0562"}.mdi-vector-square:before{content:"\f0001"}.mdi-vector-square-close:before{content:"\f1857"}.mdi-vector-square-edit:before{content:"\f18d9"}.mdi-vector-square-minus:before{content:"\f18da"}.mdi-vector-square-open:before{content:"\f1858"}.mdi-vector-square-plus:before{content:"\f18db"}.mdi-vector-square-remove:before{content:"\f18dc"}.mdi-vector-triangle:before{content:"\f0563"}.mdi-vector-union:before{content:"\f0564"}.mdi-vhs:before{content:"\f0a1b"}.mdi-vibrate:before{content:"\f0566"}.mdi-vibrate-off:before{content:"\f0cd9"}.mdi-video:before{content:"\f0567"}.mdi-video-2d:before{content:"\f1a1c"}.mdi-video-3d:before{content:"\f07fd"}.mdi-video-3d-off:before{content:"\f13d9"}.mdi-video-3d-variant:before{content:"\f0ed1"}.mdi-video-4k-box:before{content:"\f083e"}.mdi-video-account:before{content:"\f0919"}.mdi-video-box:before{content:"\f00fd"}.mdi-video-box-off:before{content:"\f00fe"}.mdi-video-check:before{content:"\f1069"}.mdi-video-check-outline:before{content:"\f106a"}.mdi-video-high-definition:before{content:"\f152e"}.mdi-video-image:before{content:"\f091a"}.mdi-video-input-antenna:before{content:"\f083f"}.mdi-video-input-component:before{content:"\f0840"}.mdi-video-input-hdmi:before{content:"\f0841"}.mdi-video-input-scart:before{content:"\f0f8c"}.mdi-video-input-svideo:before{content:"\f0842"}.mdi-video-marker:before{content:"\f19a9"}.mdi-video-marker-outline:before{content:"\f19aa"}.mdi-video-minus:before{content:"\f09b2"}.mdi-video-minus-outline:before{content:"\f02ba"}.mdi-video-off:before{content:"\f0568"}.mdi-video-off-outline:before{content:"\f0bdb"}.mdi-video-outline:before{content:"\f0bdc"}.mdi-video-plus:before{content:"\f09b3"}.mdi-video-plus-outline:before{content:"\f01d3"}.mdi-video-stabilization:before{content:"\f091b"}.mdi-video-standard-definition:before{content:"\f1ca0"}.mdi-video-switch:before{content:"\f0569"}.mdi-video-switch-outline:before{content:"\f0790"}.mdi-video-vintage:before{content:"\f0a1c"}.mdi-video-wireless:before{content:"\f0ed2"}.mdi-video-wireless-outline:before{content:"\f0ed3"}.mdi-view-agenda:before{content:"\f056a"}.mdi-view-agenda-outline:before{content:"\f11d8"}.mdi-view-array:before{content:"\f056b"}.mdi-view-array-outline:before{content:"\f1485"}.mdi-view-carousel:before{content:"\f056c"}.mdi-view-carousel-outline:before{content:"\f1486"}.mdi-view-column:before{content:"\f056d"}.mdi-view-column-outline:before{content:"\f1487"}.mdi-view-comfy:before{content:"\f0e6a"}.mdi-view-comfy-outline:before{content:"\f1488"}.mdi-view-compact:before{content:"\f0e6b"}.mdi-view-compact-outline:before{content:"\f0e6c"}.mdi-view-dashboard:before{content:"\f056e"}.mdi-view-dashboard-edit:before{content:"\f1947"}.mdi-view-dashboard-edit-outline:before{content:"\f1948"}.mdi-view-dashboard-outline:before{content:"\f0a1d"}.mdi-view-dashboard-variant:before{content:"\f0843"}.mdi-view-dashboard-variant-outline:before{content:"\f1489"}.mdi-view-day:before{content:"\f056f"}.mdi-view-day-outline:before{content:"\f148a"}.mdi-view-gallery:before{content:"\f1888"}.mdi-view-gallery-outline:before{content:"\f1889"}.mdi-view-grid:before{content:"\f0570"}.mdi-view-grid-compact:before{content:"\f1c61"}.mdi-view-grid-outline:before{content:"\f11d9"}.mdi-view-grid-plus:before{content:"\f0f8d"}.mdi-view-grid-plus-outline:before{content:"\f11da"}.mdi-view-headline:before{content:"\f0571"}.mdi-view-list:before{content:"\f0572"}.mdi-view-list-outline:before{content:"\f148b"}.mdi-view-module:before{content:"\f0573"}.mdi-view-module-outline:before{content:"\f148c"}.mdi-view-parallel:before{content:"\f0728"}.mdi-view-parallel-outline:before{content:"\f148d"}.mdi-view-quilt:before{content:"\f0574"}.mdi-view-quilt-outline:before{content:"\f148e"}.mdi-view-sequential:before{content:"\f0729"}.mdi-view-sequential-outline:before{content:"\f148f"}.mdi-view-split-horizontal:before{content:"\f0bcb"}.mdi-view-split-vertical:before{content:"\f0bcc"}.mdi-view-stream:before{content:"\f0575"}.mdi-view-stream-outline:before{content:"\f1490"}.mdi-view-week:before{content:"\f0576"}.mdi-view-week-outline:before{content:"\f1491"}.mdi-vimeo:before{content:"\f0577"}.mdi-violin:before{content:"\f060f"}.mdi-virtual-reality:before{content:"\f0894"}.mdi-virus:before{content:"\f13b6"}.mdi-virus-off:before{content:"\f18e1"}.mdi-virus-off-outline:before{content:"\f18e2"}.mdi-virus-outline:before{content:"\f13b7"}.mdi-vlc:before{content:"\f057c"}.mdi-voicemail:before{content:"\f057d"}.mdi-volcano:before{content:"\f1a83"}.mdi-volcano-outline:before{content:"\f1a84"}.mdi-volleyball:before{content:"\f09b4"}.mdi-volume-equal:before{content:"\f1b10"}.mdi-volume-high:before{content:"\f057e"}.mdi-volume-low:before{content:"\f057f"}.mdi-volume-medium:before{content:"\f0580"}.mdi-volume-minus:before{content:"\f075e"}.mdi-volume-mute:before{content:"\f075f"}.mdi-volume-off:before{content:"\f0581"}.mdi-volume-plus:before{content:"\f075d"}.mdi-volume-source:before{content:"\f1120"}.mdi-volume-variant-off:before{content:"\f0e08"}.mdi-volume-vibrate:before{content:"\f1121"}.mdi-vote:before{content:"\f0a1f"}.mdi-vote-outline:before{content:"\f0a20"}.mdi-vpn:before{content:"\f0582"}.mdi-vuejs:before{content:"\f0844"}.mdi-vuetify:before{content:"\f0e6d"}.mdi-walk:before{content:"\f0583"}.mdi-wall:before{content:"\f07fe"}.mdi-wall-fire:before{content:"\f1a11"}.mdi-wall-sconce:before{content:"\f091c"}.mdi-wall-sconce-flat:before{content:"\f091d"}.mdi-wall-sconce-flat-outline:before{content:"\f17c9"}.mdi-wall-sconce-flat-variant:before{content:"\f041c"}.mdi-wall-sconce-flat-variant-outline:before{content:"\f17ca"}.mdi-wall-sconce-outline:before{content:"\f17cb"}.mdi-wall-sconce-round:before{content:"\f0748"}.mdi-wall-sconce-round-outline:before{content:"\f17cc"}.mdi-wall-sconce-round-variant:before{content:"\f091e"}.mdi-wall-sconce-round-variant-outline:before{content:"\f17cd"}.mdi-wallet:before{content:"\f0584"}.mdi-wallet-bifold:before{content:"\f1c58"}.mdi-wallet-bifold-outline:before{content:"\f1c59"}.mdi-wallet-giftcard:before{content:"\f0585"}.mdi-wallet-membership:before{content:"\f0586"}.mdi-wallet-outline:before{content:"\f0bdd"}.mdi-wallet-plus:before{content:"\f0f8e"}.mdi-wallet-plus-outline:before{content:"\f0f8f"}.mdi-wallet-travel:before{content:"\f0587"}.mdi-wallpaper:before{content:"\f0e09"}.mdi-wan:before{content:"\f0588"}.mdi-wardrobe:before{content:"\f0f90"}.mdi-wardrobe-outline:before{content:"\f0f91"}.mdi-warehouse:before{content:"\f0f81"}.mdi-washing-machine:before{content:"\f072a"}.mdi-washing-machine-alert:before{content:"\f11bc"}.mdi-washing-machine-off:before{content:"\f11bd"}.mdi-watch:before{content:"\f0589"}.mdi-watch-export:before{content:"\f058a"}.mdi-watch-export-variant:before{content:"\f0895"}.mdi-watch-import:before{content:"\f058b"}.mdi-watch-import-variant:before{content:"\f0896"}.mdi-watch-variant:before{content:"\f0897"}.mdi-watch-vibrate:before{content:"\f06b1"}.mdi-watch-vibrate-off:before{content:"\f0cda"}.mdi-water:before{content:"\f058c"}.mdi-water-alert:before{content:"\f1502"}.mdi-water-alert-outline:before{content:"\f1503"}.mdi-water-boiler:before{content:"\f0f92"}.mdi-water-boiler-alert:before{content:"\f11b3"}.mdi-water-boiler-auto:before{content:"\f1b98"}.mdi-water-boiler-off:before{content:"\f11b4"}.mdi-water-check:before{content:"\f1504"}.mdi-water-check-outline:before{content:"\f1505"}.mdi-water-circle:before{content:"\f1806"}.mdi-water-minus:before{content:"\f1506"}.mdi-water-minus-outline:before{content:"\f1507"}.mdi-water-off:before{content:"\f058d"}.mdi-water-off-outline:before{content:"\f1508"}.mdi-water-opacity:before{content:"\f1855"}.mdi-water-outline:before{content:"\f0e0a"}.mdi-water-percent:before{content:"\f058e"}.mdi-water-percent-alert:before{content:"\f1509"}.mdi-water-plus:before{content:"\f150a"}.mdi-water-plus-outline:before{content:"\f150b"}.mdi-water-polo:before{content:"\f12a0"}.mdi-water-pump:before{content:"\f058f"}.mdi-water-pump-off:before{content:"\f0f93"}.mdi-water-remove:before{content:"\f150c"}.mdi-water-remove-outline:before{content:"\f150d"}.mdi-water-sync:before{content:"\f17c6"}.mdi-water-thermometer:before{content:"\f1a85"}.mdi-water-thermometer-outline:before{content:"\f1a86"}.mdi-water-well:before{content:"\f106b"}.mdi-water-well-outline:before{content:"\f106c"}.mdi-waterfall:before{content:"\f1849"}.mdi-watering-can:before{content:"\f1481"}.mdi-watering-can-outline:before{content:"\f1482"}.mdi-watermark:before{content:"\f0612"}.mdi-wave:before{content:"\f0f2e"}.mdi-wave-arrow-down:before{content:"\f1cb0"}.mdi-wave-arrow-up:before{content:"\f1cb1"}.mdi-wave-undercurrent:before{content:"\f1cc0"}.mdi-waveform:before{content:"\f147d"}.mdi-waves:before{content:"\f078d"}.mdi-waves-arrow-left:before{content:"\f1859"}.mdi-waves-arrow-right:before{content:"\f185a"}.mdi-waves-arrow-up:before{content:"\f185b"}.mdi-waze:before{content:"\f0bde"}.mdi-weather-cloudy:before{content:"\f0590"}.mdi-weather-cloudy-alert:before{content:"\f0f2f"}.mdi-weather-cloudy-arrow-right:before{content:"\f0e6e"}.mdi-weather-cloudy-clock:before{content:"\f18f6"}.mdi-weather-dust:before{content:"\f1b5a"}.mdi-weather-fog:before{content:"\f0591"}.mdi-weather-hail:before{content:"\f0592"}.mdi-weather-hazy:before{content:"\f0f30"}.mdi-weather-hurricane:before{content:"\f0898"}.mdi-weather-hurricane-outline:before{content:"\f1c78"}.mdi-weather-lightning:before{content:"\f0593"}.mdi-weather-lightning-rainy:before{content:"\f067e"}.mdi-weather-moonset:before{content:"\f1d15"}.mdi-weather-moonset-down:before{content:"\f1d16"}.mdi-weather-moonset-up:before{content:"\f1d17"}.mdi-weather-night:before{content:"\f0594"}.mdi-weather-night-partly-cloudy:before{content:"\f0f31"}.mdi-weather-partly-cloudy:before{content:"\f0595"}.mdi-weather-partly-lightning:before{content:"\f0f32"}.mdi-weather-partly-rainy:before{content:"\f0f33"}.mdi-weather-partly-snowy:before{content:"\f0f34"}.mdi-weather-partly-snowy-rainy:before{content:"\f0f35"}.mdi-weather-pouring:before{content:"\f0596"}.mdi-weather-rainy:before{content:"\f0597"}.mdi-weather-snowy:before{content:"\f0598"}.mdi-weather-snowy-heavy:before{content:"\f0f36"}.mdi-weather-snowy-rainy:before{content:"\f067f"}.mdi-weather-sunny:before{content:"\f0599"}.mdi-weather-sunny-alert:before{content:"\f0f37"}.mdi-weather-sunny-off:before{content:"\f14e4"}.mdi-weather-sunset:before{content:"\f059a"}.mdi-weather-sunset-down:before{content:"\f059b"}.mdi-weather-sunset-up:before{content:"\f059c"}.mdi-weather-tornado:before{content:"\f0f38"}.mdi-weather-windy:before{content:"\f059d"}.mdi-weather-windy-variant:before{content:"\f059e"}.mdi-web:before{content:"\f059f"}.mdi-web-box:before{content:"\f0f94"}.mdi-web-cancel:before{content:"\f1790"}.mdi-web-check:before{content:"\f0789"}.mdi-web-clock:before{content:"\f124a"}.mdi-web-minus:before{content:"\f10a0"}.mdi-web-off:before{content:"\f0a8e"}.mdi-web-plus:before{content:"\f0033"}.mdi-web-refresh:before{content:"\f1791"}.mdi-web-remove:before{content:"\f0551"}.mdi-web-sync:before{content:"\f1792"}.mdi-webcam:before{content:"\f05a0"}.mdi-webcam-off:before{content:"\f1737"}.mdi-webhook:before{content:"\f062f"}.mdi-webpack:before{content:"\f072b"}.mdi-webrtc:before{content:"\f1248"}.mdi-wechat:before{content:"\f0611"}.mdi-weight:before{content:"\f05a1"}.mdi-weight-gram:before{content:"\f0d3f"}.mdi-weight-kilogram:before{content:"\f05a2"}.mdi-weight-lifter:before{content:"\f115d"}.mdi-weight-pound:before{content:"\f09b5"}.mdi-whatsapp:before{content:"\f05a3"}.mdi-wheel-barrow:before{content:"\f14f2"}.mdi-wheelchair:before{content:"\f1a87"}.mdi-wheelchair-accessibility:before{content:"\f05a4"}.mdi-whistle:before{content:"\f09b6"}.mdi-whistle-outline:before{content:"\f12bc"}.mdi-white-balance-auto:before{content:"\f05a5"}.mdi-white-balance-incandescent:before{content:"\f05a6"}.mdi-white-balance-iridescent:before{content:"\f05a7"}.mdi-white-balance-sunny:before{content:"\f05a8"}.mdi-widgets:before{content:"\f072c"}.mdi-widgets-outline:before{content:"\f1355"}.mdi-wifi:before{content:"\f05a9"}.mdi-wifi-alert:before{content:"\f16b5"}.mdi-wifi-arrow-down:before{content:"\f16b6"}.mdi-wifi-arrow-left:before{content:"\f16b7"}.mdi-wifi-arrow-left-right:before{content:"\f16b8"}.mdi-wifi-arrow-right:before{content:"\f16b9"}.mdi-wifi-arrow-up:before{content:"\f16ba"}.mdi-wifi-arrow-up-down:before{content:"\f16bb"}.mdi-wifi-cancel:before{content:"\f16bc"}.mdi-wifi-check:before{content:"\f16bd"}.mdi-wifi-cog:before{content:"\f16be"}.mdi-wifi-lock:before{content:"\f16bf"}.mdi-wifi-lock-open:before{content:"\f16c0"}.mdi-wifi-marker:before{content:"\f16c1"}.mdi-wifi-minus:before{content:"\f16c2"}.mdi-wifi-off:before{content:"\f05aa"}.mdi-wifi-plus:before{content:"\f16c3"}.mdi-wifi-refresh:before{content:"\f16c4"}.mdi-wifi-remove:before{content:"\f16c5"}.mdi-wifi-settings:before{content:"\f16c6"}.mdi-wifi-star:before{content:"\f0e0b"}.mdi-wifi-strength-1:before{content:"\f091f"}.mdi-wifi-strength-1-alert:before{content:"\f0920"}.mdi-wifi-strength-1-lock:before{content:"\f0921"}.mdi-wifi-strength-1-lock-open:before{content:"\f16cb"}.mdi-wifi-strength-2:before{content:"\f0922"}.mdi-wifi-strength-2-alert:before{content:"\f0923"}.mdi-wifi-strength-2-lock:before{content:"\f0924"}.mdi-wifi-strength-2-lock-open:before{content:"\f16cc"}.mdi-wifi-strength-3:before{content:"\f0925"}.mdi-wifi-strength-3-alert:before{content:"\f0926"}.mdi-wifi-strength-3-lock:before{content:"\f0927"}.mdi-wifi-strength-3-lock-open:before{content:"\f16cd"}.mdi-wifi-strength-4:before{content:"\f0928"}.mdi-wifi-strength-4-alert:before{content:"\f0929"}.mdi-wifi-strength-4-lock:before{content:"\f092a"}.mdi-wifi-strength-4-lock-open:before{content:"\f16ce"}.mdi-wifi-strength-alert-outline:before{content:"\f092b"}.mdi-wifi-strength-lock-open-outline:before{content:"\f16cf"}.mdi-wifi-strength-lock-outline:before{content:"\f092c"}.mdi-wifi-strength-off:before{content:"\f092d"}.mdi-wifi-strength-off-outline:before{content:"\f092e"}.mdi-wifi-strength-outline:before{content:"\f092f"}.mdi-wifi-sync:before{content:"\f16c7"}.mdi-wikipedia:before{content:"\f05ac"}.mdi-wind-power:before{content:"\f1a88"}.mdi-wind-power-outline:before{content:"\f1a89"}.mdi-wind-turbine:before{content:"\f0da5"}.mdi-wind-turbine-alert:before{content:"\f19ab"}.mdi-wind-turbine-check:before{content:"\f19ac"}.mdi-window-close:before{content:"\f05ad"}.mdi-window-closed:before{content:"\f05ae"}.mdi-window-closed-variant:before{content:"\f11db"}.mdi-window-maximize:before{content:"\f05af"}.mdi-window-minimize:before{content:"\f05b0"}.mdi-window-open:before{content:"\f05b1"}.mdi-window-open-variant:before{content:"\f11dc"}.mdi-window-restore:before{content:"\f05b2"}.mdi-window-shutter:before{content:"\f111c"}.mdi-window-shutter-alert:before{content:"\f111d"}.mdi-window-shutter-auto:before{content:"\f1ba3"}.mdi-window-shutter-cog:before{content:"\f1a8a"}.mdi-window-shutter-open:before{content:"\f111e"}.mdi-window-shutter-settings:before{content:"\f1a8b"}.mdi-windsock:before{content:"\f15fa"}.mdi-wiper:before{content:"\f0ae9"}.mdi-wiper-wash:before{content:"\f0da6"}.mdi-wiper-wash-alert:before{content:"\f18df"}.mdi-wizard-hat:before{content:"\f1477"}.mdi-wordpress:before{content:"\f05b4"}.mdi-wrap:before{content:"\f05b6"}.mdi-wrap-disabled:before{content:"\f0bdf"}.mdi-wrench:before{content:"\f05b7"}.mdi-wrench-check:before{content:"\f1b8f"}.mdi-wrench-check-outline:before{content:"\f1b90"}.mdi-wrench-clock:before{content:"\f19a3"}.mdi-wrench-clock-outline:before{content:"\f1b93"}.mdi-wrench-cog:before{content:"\f1b91"}.mdi-wrench-cog-outline:before{content:"\f1b92"}.mdi-wrench-outline:before{content:"\f0be0"}.mdi-xamarin:before{content:"\f0845"}.mdi-xml:before{content:"\f05c0"}.mdi-xmpp:before{content:"\f07ff"}.mdi-yahoo:before{content:"\f0b4f"}.mdi-yeast:before{content:"\f05c1"}.mdi-yin-yang:before{content:"\f0680"}.mdi-yoga:before{content:"\f117c"}.mdi-youtube:before{content:"\f05c3"}.mdi-youtube-gaming:before{content:"\f0848"}.mdi-youtube-studio:before{content:"\f0847"}.mdi-youtube-subscription:before{content:"\f0d40"}.mdi-youtube-tv:before{content:"\f0448"}.mdi-yurt:before{content:"\f1516"}.mdi-z-wave:before{content:"\f0aea"}.mdi-zend:before{content:"\f0aeb"}.mdi-zigbee:before{content:"\f0d41"}.mdi-zip-box:before{content:"\f05c4"}.mdi-zip-box-outline:before{content:"\f0ffa"}.mdi-zip-disk:before{content:"\f0a23"}.mdi-zodiac-aquarius:before{content:"\f0a7d"}.mdi-zodiac-aries:before{content:"\f0a7e"}.mdi-zodiac-cancer:before{content:"\f0a7f"}.mdi-zodiac-capricorn:before{content:"\f0a80"}.mdi-zodiac-gemini:before{content:"\f0a81"}.mdi-zodiac-leo:before{content:"\f0a82"}.mdi-zodiac-libra:before{content:"\f0a83"}.mdi-zodiac-pisces:before{content:"\f0a84"}.mdi-zodiac-sagittarius:before{content:"\f0a85"}.mdi-zodiac-scorpio:before{content:"\f0a86"}.mdi-zodiac-taurus:before{content:"\f0a87"}.mdi-zodiac-virgo:before{content:"\f0a88"}.mdi-blank:before{content:"\f68c";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:#0000008a}.mdi-dark.mdi-inactive:before{color:#00000042}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:#ffffff4d}.mdi-rotate-45:before{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mdi-rotate-90:before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-135:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg)}.mdi-rotate-180:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-225:before{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg)}.mdi-rotate-270:before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.mdi-rotate-315:before{-webkit-transform:rotate(315deg);-ms-transform:rotate(315deg);transform:rotate(315deg)}.mdi-flip-h:before{-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{-webkit-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{-webkit-animation:mdi-spin 2s infinite linear;animation:mdi-spin 2s infinite linear}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08);box-shadow:1px 0 #e6e6e6,-1px 0 #e6e6e6,0 1px #e6e6e6,0 -1px #e6e6e6,0 3px 13px #00000014}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1);animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none!important;box-shadow:none!important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:"";height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:#000000e6;fill:#000000e6;height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:#000000e6;fill:#000000e6}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{left:0}.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{right:0}.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:#0000001a}.numInputWrapper span:active{background:#0003}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:#00000080}.numInputWrapper:hover{background:#0000000d}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:#0000000d}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\fffd;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:#000000e6}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:#000000e6}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:#00000080;background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:#0000000d}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:#0000008a;line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translateZ(0);opacity:1}.dayContainer+.dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:#3939394d;background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:#3939391a}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 #569ff7,5px 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:#3939394d;background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:700}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:700;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}@keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}.grid-stack{position:relative}.grid-stack-rtl{direction:ltr}.grid-stack-rtl>.grid-stack-item{direction:rtl}.grid-stack-placeholder>.placeholder-content{background-color:#0000001a;margin:0;position:absolute;width:auto;z-index:0!important}.grid-stack>.grid-stack-item{position:absolute;padding:0}.grid-stack>.grid-stack-item>.grid-stack-item-content{margin:0;position:absolute;width:auto;overflow-x:hidden;overflow-y:auto}.grid-stack>.grid-stack-item.size-to-content:not(.size-to-content-max)>.grid-stack-item-content{overflow-y:hidden}.grid-stack-item>.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.grid-stack-item.ui-resizable-autohide>.ui-resizable-handle,.grid-stack-item.ui-resizable-disabled>.ui-resizable-handle{display:none}.grid-stack-item>.ui-resizable-ne,.grid-stack-item>.ui-resizable-nw,.grid-stack-item>.ui-resizable-se,.grid-stack-item>.ui-resizable-sw{background-image:url('data:image/svg+xml;utf8,');background-repeat:no-repeat;background-position:center}.grid-stack-item>.ui-resizable-ne{transform:translateY(10px) rotate(45deg)}.grid-stack-item>.ui-resizable-sw{transform:rotate(45deg)}.grid-stack-item>.ui-resizable-nw{transform:translateY(10px) rotate(-45deg)}.grid-stack-item>.ui-resizable-se{transform:rotate(-45deg)}.grid-stack-item>.ui-resizable-nw{cursor:nw-resize;width:20px;height:20px;top:0}.grid-stack-item>.ui-resizable-n{cursor:n-resize;height:10px;top:0;left:25px;right:25px}.grid-stack-item>.ui-resizable-ne{cursor:ne-resize;width:20px;height:20px;top:0}.grid-stack-item>.ui-resizable-e{cursor:e-resize;width:10px;top:15px;bottom:15px}.grid-stack-item>.ui-resizable-se{cursor:se-resize;width:20px;height:20px}.grid-stack-item>.ui-resizable-s{cursor:s-resize;height:10px;left:25px;bottom:0;right:25px}.grid-stack-item>.ui-resizable-sw{cursor:sw-resize;width:20px;height:20px}.grid-stack-item>.ui-resizable-w{cursor:w-resize;width:10px;top:15px;bottom:15px}.grid-stack-item.ui-draggable-dragging>.ui-resizable-handle{display:none!important}.grid-stack-item.ui-draggable-dragging{will-change:left,top;cursor:move}.grid-stack-item.ui-resizable-resizing{will-change:width,height}.ui-draggable-dragging,.ui-resizable-resizing{z-index:10000}.ui-draggable-dragging>.grid-stack-item-content,.ui-resizable-resizing>.grid-stack-item-content{box-shadow:1px 4px 6px #0003;opacity:.8}.grid-stack-animate,.grid-stack-animate .grid-stack-item{transition:left .3s,top .3s,height .3s,width .3s}.grid-stack-animate .grid-stack-item.grid-stack-placeholder,.grid-stack-animate .grid-stack-item.ui-draggable-dragging,.grid-stack-animate .grid-stack-item.ui-resizable-resizing{transition:left 0s,top 0s,height 0s,width 0s}.grid-stack>.grid-stack-item[gs-y="0"]{top:0}.grid-stack>.grid-stack-item[gs-x="0"]{left:0}.gs-12>.grid-stack-item{width:8.333%}.gs-12>.grid-stack-item[gs-x="1"]{left:8.333%}.gs-12>.grid-stack-item[gs-w="2"]{width:16.667%}.gs-12>.grid-stack-item[gs-x="2"]{left:16.667%}.gs-12>.grid-stack-item[gs-w="3"]{width:25%}.gs-12>.grid-stack-item[gs-x="3"]{left:25%}.gs-12>.grid-stack-item[gs-w="4"]{width:33.333%}.gs-12>.grid-stack-item[gs-x="4"]{left:33.333%}.gs-12>.grid-stack-item[gs-w="5"]{width:41.667%}.gs-12>.grid-stack-item[gs-x="5"]{left:41.667%}.gs-12>.grid-stack-item[gs-w="6"]{width:50%}.gs-12>.grid-stack-item[gs-x="6"]{left:50%}.gs-12>.grid-stack-item[gs-w="7"]{width:58.333%}.gs-12>.grid-stack-item[gs-x="7"]{left:58.333%}.gs-12>.grid-stack-item[gs-w="8"]{width:66.667%}.gs-12>.grid-stack-item[gs-x="8"]{left:66.667%}.gs-12>.grid-stack-item[gs-w="9"]{width:75%}.gs-12>.grid-stack-item[gs-x="9"]{left:75%}.gs-12>.grid-stack-item[gs-w="10"]{width:83.333%}.gs-12>.grid-stack-item[gs-x="10"]{left:83.333%}.gs-12>.grid-stack-item[gs-w="11"]{width:91.667%}.gs-12>.grid-stack-item[gs-x="11"]{left:91.667%}.gs-12>.grid-stack-item[gs-w="12"]{width:100%}.gs-1>.grid-stack-item{width:100%}@font-face{font-family:Inter;font-style:normal;font-weight:100;font-display:swap;src:url("./Inter-Thin-TCINWRKS.woff2?v=3.18") format("woff2"),url("./Inter-Thin-MEKOZMGA.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:italic;font-weight:100;font-display:swap;src:url("./Inter-ThinItalic-WRULPH3M.woff2?v=3.18") format("woff2"),url("./Inter-ThinItalic-ZFOL6JFL.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:200;font-display:swap;src:url("./Inter-ExtraLight-DVW3SATI.woff2?v=3.18") format("woff2"),url("./Inter-ExtraLight-A7NHN7KT.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:italic;font-weight:200;font-display:swap;src:url("./Inter-ExtraLightItalic-KXZYPKOE.woff2?v=3.18") format("woff2"),url("./Inter-ExtraLightItalic-SKGXKLLA.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:300;font-display:swap;src:url("./Inter-Light-XBRUIIRZ.woff2?v=3.18") format("woff2"),url("./Inter-Light-ARG5Y6MT.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:italic;font-weight:300;font-display:swap;src:url("./Inter-LightItalic-4OWY6V5R.woff2?v=3.18") format("woff2"),url("./Inter-LightItalic-WFS25IQZ.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url("./Inter-Regular-373XMOLM.woff2?v=3.18") format("woff2"),url("./Inter-Regular-DR3VC6YG.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:italic;font-weight:400;font-display:swap;src:url("./Inter-Italic-RW2ZALTO.woff2?v=3.18") format("woff2"),url("./Inter-Italic-GHDVOOKA.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url("./Inter-Medium-JV63DMR7.woff2?v=3.18") format("woff2"),url("./Inter-Medium-KH2CGZVE.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:italic;font-weight:500;font-display:swap;src:url("./Inter-MediumItalic-P7H6BBYU.woff2?v=3.18") format("woff2"),url("./Inter-MediumItalic-PO2E4FIG.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:600;font-display:swap;src:url("./Inter-SemiBold-UMRILHOG.woff2?v=3.18") format("woff2"),url("./Inter-SemiBold-TJ6HPMMH.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:italic;font-weight:600;font-display:swap;src:url("./Inter-SemiBoldItalic-ABO2DCC7.woff2?v=3.18") format("woff2"),url("./Inter-SemiBoldItalic-DM4JJSFU.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:700;font-display:swap;src:url("./Inter-Bold-6AVOS7AV.woff2?v=3.18") format("woff2"),url("./Inter-Bold-RTIBL5DO.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:italic;font-weight:700;font-display:swap;src:url("./Inter-BoldItalic-AID2XGS3.woff2?v=3.18") format("woff2"),url("./Inter-BoldItalic-UU7SOVRI.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:800;font-display:swap;src:url("./Inter-ExtraBold-VAPCTO5F.woff2?v=3.18") format("woff2"),url("./Inter-ExtraBold-B5RSZK6R.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:italic;font-weight:800;font-display:swap;src:url("./Inter-ExtraBoldItalic-W26CJYY7.woff2?v=3.18") format("woff2"),url("./Inter-ExtraBoldItalic-R7DLWYIK.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:900;font-display:swap;src:url("./Inter-Black-NU3KAVPI.woff2?v=3.18") format("woff2"),url("./Inter-Black-7VL4YR6G.woff?v=3.18") format("woff")}@font-face{font-family:Inter;font-style:italic;font-weight:900;font-display:swap;src:url("./Inter-BlackItalic-4BVAVUVI.woff2?v=3.18") format("woff2"),url("./Inter-BlackItalic-HJLUEYVW.woff?v=3.18") format("woff")}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url("./Inter-roman.var-EDENVCUS.woff2?v=3.18") format("woff2")}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url("./Inter-italic.var-7LS4VCXC.woff2?v=3.18") format("woff2")}@font-face{font-family:Inter var experimental;font-weight:100 900;font-display:swap;font-style:oblique 0deg 10deg;src:url("./Inter.var-FTIQFLGO.woff2?v=3.18") format("woff2")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:100;src:local("Roboto Mono Thin "),local("Roboto Mono-Thin"),url("./roboto-mono-latin-100-JQJ4Z5FD.woff2") format("woff2"),url("./roboto-mono-latin-100-SMKVIC22.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:100;src:local("Roboto Mono Thin italic"),local("Roboto Mono-Thinitalic"),url("./roboto-mono-latin-100italic-SF7I3UQS.woff2") format("woff2"),url("./roboto-mono-latin-100italic-DARDHGP2.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:200;src:local("Roboto Mono Extra Light "),local("Roboto Mono-Extra Light"),url("./roboto-mono-latin-200-GAB3DPCB.woff2") format("woff2"),url("./roboto-mono-latin-200-GNXGWAU7.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:200;src:local("Roboto Mono Extra Light italic"),local("Roboto Mono-Extra Lightitalic"),url("./roboto-mono-latin-200italic-YC3AN6RQ.woff2") format("woff2"),url("./roboto-mono-latin-200italic-MBEOZD5A.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:300;src:local("Roboto Mono Light "),local("Roboto Mono-Light"),url("./roboto-mono-latin-300-76QG53G7.woff2") format("woff2"),url("./roboto-mono-latin-300-KB4HCXJB.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:300;src:local("Roboto Mono Light italic"),local("Roboto Mono-Lightitalic"),url("./roboto-mono-latin-300italic-ATWQWJG4.woff2") format("woff2"),url("./roboto-mono-latin-300italic-UCTTXECO.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:400;src:local("Roboto Mono Regular "),local("Roboto Mono-Regular"),url("./roboto-mono-latin-400-OKRWGZOX.woff2") format("woff2"),url("./roboto-mono-latin-400-L25YYWY3.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:400;src:local("Roboto Mono Regular italic"),local("Roboto Mono-Regularitalic"),url("./roboto-mono-latin-400italic-UPQRVZWX.woff2") format("woff2"),url("./roboto-mono-latin-400italic-3G7XMJ7A.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:500;src:local("Roboto Mono Medium "),local("Roboto Mono-Medium"),url("./roboto-mono-latin-500-67YXJMLO.woff2") format("woff2"),url("./roboto-mono-latin-500-4ZB2P7GK.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:500;src:local("Roboto Mono Medium italic"),local("Roboto Mono-Mediumitalic"),url("./roboto-mono-latin-500italic-U7WRIR22.woff2") format("woff2"),url("./roboto-mono-latin-500italic-RXGCSZS4.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:600;src:local("Roboto Mono SemiBold "),local("Roboto Mono-SemiBold"),url("./roboto-mono-latin-600-ZRZYGQNG.woff2") format("woff2"),url("./roboto-mono-latin-600-USMEYMTS.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:600;src:local("Roboto Mono SemiBold italic"),local("Roboto Mono-SemiBolditalic"),url("./roboto-mono-latin-600italic-THUILB76.woff2") format("woff2"),url("./roboto-mono-latin-600italic-TLIW3M4P.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:700;src:local("Roboto Mono Bold "),local("Roboto Mono-Bold"),url("./roboto-mono-latin-700-QNNSSZIK.woff2") format("woff2"),url("./roboto-mono-latin-700-PEQVO3WV.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:700;src:local("Roboto Mono Bold italic"),local("Roboto Mono-Bolditalic"),url("./roboto-mono-latin-700italic-WWLRMKIN.woff2") format("woff2"),url("./roboto-mono-latin-700italic-KTWD2UYU.woff") format("woff")} +@font-face{font-family:Material Design Icons;src:url("./materialdesignicons-webfont-A5TO3SM5.eot?v=7.4.47");src:url("./materialdesignicons-webfont-A5TO3SM5.eot?#iefix&v=7.4.47") format("embedded-opentype"),url("./materialdesignicons-webfont-7OXPFKOV.woff2?v=7.4.47") format("woff2"),url("./materialdesignicons-webfont-4ZM36VVG.woff?v=7.4.47") format("woff"),url("./materialdesignicons-webfont-OFFE53R5.ttf?v=7.4.47") format("truetype");font-weight:400;font-style:normal}.mdi:before,.mdi-set{display:inline-block;font: 24px/1 Material Design Icons;font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-ab-testing:before{content:"\f01c9"}.mdi-abacus:before{content:"\f16e0"}.mdi-abjad-arabic:before{content:"\f1328"}.mdi-abjad-hebrew:before{content:"\f1329"}.mdi-abugida-devanagari:before{content:"\f132a"}.mdi-abugida-thai:before{content:"\f132b"}.mdi-access-point:before{content:"\f0003"}.mdi-access-point-check:before{content:"\f1538"}.mdi-access-point-minus:before{content:"\f1539"}.mdi-access-point-network:before{content:"\f0002"}.mdi-access-point-network-off:before{content:"\f0be1"}.mdi-access-point-off:before{content:"\f1511"}.mdi-access-point-plus:before{content:"\f153a"}.mdi-access-point-remove:before{content:"\f153b"}.mdi-account:before{content:"\f0004"}.mdi-account-alert:before{content:"\f0005"}.mdi-account-alert-outline:before{content:"\f0b50"}.mdi-account-arrow-down:before{content:"\f1868"}.mdi-account-arrow-down-outline:before{content:"\f1869"}.mdi-account-arrow-left:before{content:"\f0b51"}.mdi-account-arrow-left-outline:before{content:"\f0b52"}.mdi-account-arrow-right:before{content:"\f0b53"}.mdi-account-arrow-right-outline:before{content:"\f0b54"}.mdi-account-arrow-up:before{content:"\f1867"}.mdi-account-arrow-up-outline:before{content:"\f186a"}.mdi-account-badge:before{content:"\f1b0a"}.mdi-account-badge-outline:before{content:"\f1b0b"}.mdi-account-box:before{content:"\f0006"}.mdi-account-box-edit-outline:before{content:"\f1cc8"}.mdi-account-box-minus-outline:before{content:"\f1cc9"}.mdi-account-box-multiple:before{content:"\f0934"}.mdi-account-box-multiple-outline:before{content:"\f100a"}.mdi-account-box-outline:before{content:"\f0007"}.mdi-account-box-plus-outline:before{content:"\f1cca"}.mdi-account-cancel:before{content:"\f12df"}.mdi-account-cancel-outline:before{content:"\f12e0"}.mdi-account-card:before{content:"\f1ba4"}.mdi-account-card-outline:before{content:"\f1ba5"}.mdi-account-cash:before{content:"\f1097"}.mdi-account-cash-outline:before{content:"\f1098"}.mdi-account-check:before{content:"\f0008"}.mdi-account-check-outline:before{content:"\f0be2"}.mdi-account-child:before{content:"\f0a89"}.mdi-account-child-circle:before{content:"\f0a8a"}.mdi-account-child-outline:before{content:"\f10c8"}.mdi-account-circle:before{content:"\f0009"}.mdi-account-circle-outline:before{content:"\f0b55"}.mdi-account-clock:before{content:"\f0b56"}.mdi-account-clock-outline:before{content:"\f0b57"}.mdi-account-cog:before{content:"\f1370"}.mdi-account-cog-outline:before{content:"\f1371"}.mdi-account-convert:before{content:"\f000a"}.mdi-account-convert-outline:before{content:"\f1301"}.mdi-account-cowboy-hat:before{content:"\f0e9b"}.mdi-account-cowboy-hat-outline:before{content:"\f17f3"}.mdi-account-credit-card:before{content:"\f1ba6"}.mdi-account-credit-card-outline:before{content:"\f1ba7"}.mdi-account-details:before{content:"\f0631"}.mdi-account-details-outline:before{content:"\f1372"}.mdi-account-edit:before{content:"\f06bc"}.mdi-account-edit-outline:before{content:"\f0ffb"}.mdi-account-eye:before{content:"\f0420"}.mdi-account-eye-outline:before{content:"\f127b"}.mdi-account-file:before{content:"\f1ca7"}.mdi-account-file-outline:before{content:"\f1ca8"}.mdi-account-file-text:before{content:"\f1ca9"}.mdi-account-file-text-outline:before{content:"\f1caa"}.mdi-account-filter:before{content:"\f0936"}.mdi-account-filter-outline:before{content:"\f0f9d"}.mdi-account-group:before{content:"\f0849"}.mdi-account-group-outline:before{content:"\f0b58"}.mdi-account-hard-hat:before{content:"\f05b5"}.mdi-account-hard-hat-outline:before{content:"\f1a1f"}.mdi-account-heart:before{content:"\f0899"}.mdi-account-heart-outline:before{content:"\f0be3"}.mdi-account-injury:before{content:"\f1815"}.mdi-account-injury-outline:before{content:"\f1816"}.mdi-account-key:before{content:"\f000b"}.mdi-account-key-outline:before{content:"\f0be4"}.mdi-account-lock:before{content:"\f115e"}.mdi-account-lock-open:before{content:"\f1960"}.mdi-account-lock-open-outline:before{content:"\f1961"}.mdi-account-lock-outline:before{content:"\f115f"}.mdi-account-minus:before{content:"\f000d"}.mdi-account-minus-outline:before{content:"\f0aec"}.mdi-account-multiple:before{content:"\f000e"}.mdi-account-multiple-check:before{content:"\f08c5"}.mdi-account-multiple-check-outline:before{content:"\f11fe"}.mdi-account-multiple-minus:before{content:"\f05d3"}.mdi-account-multiple-minus-outline:before{content:"\f0be5"}.mdi-account-multiple-outline:before{content:"\f000f"}.mdi-account-multiple-plus:before{content:"\f0010"}.mdi-account-multiple-plus-outline:before{content:"\f0800"}.mdi-account-multiple-remove:before{content:"\f120a"}.mdi-account-multiple-remove-outline:before{content:"\f120b"}.mdi-account-music:before{content:"\f0803"}.mdi-account-music-outline:before{content:"\f0ce9"}.mdi-account-network:before{content:"\f0011"}.mdi-account-network-off:before{content:"\f1af1"}.mdi-account-network-off-outline:before{content:"\f1af2"}.mdi-account-network-outline:before{content:"\f0be6"}.mdi-account-off:before{content:"\f0012"}.mdi-account-off-outline:before{content:"\f0be7"}.mdi-account-outline:before{content:"\f0013"}.mdi-account-plus:before{content:"\f0014"}.mdi-account-plus-outline:before{content:"\f0801"}.mdi-account-question:before{content:"\f0b59"}.mdi-account-question-outline:before{content:"\f0b5a"}.mdi-account-reactivate:before{content:"\f152b"}.mdi-account-reactivate-outline:before{content:"\f152c"}.mdi-account-remove:before{content:"\f0015"}.mdi-account-remove-outline:before{content:"\f0aed"}.mdi-account-school:before{content:"\f1a20"}.mdi-account-school-outline:before{content:"\f1a21"}.mdi-account-search:before{content:"\f0016"}.mdi-account-search-outline:before{content:"\f0935"}.mdi-account-settings:before{content:"\f0630"}.mdi-account-settings-outline:before{content:"\f10c9"}.mdi-account-star:before{content:"\f0017"}.mdi-account-star-outline:before{content:"\f0be8"}.mdi-account-supervisor:before{content:"\f0a8b"}.mdi-account-supervisor-circle:before{content:"\f0a8c"}.mdi-account-supervisor-circle-outline:before{content:"\f14ec"}.mdi-account-supervisor-outline:before{content:"\f112d"}.mdi-account-switch:before{content:"\f0019"}.mdi-account-switch-outline:before{content:"\f04cb"}.mdi-account-sync:before{content:"\f191b"}.mdi-account-sync-outline:before{content:"\f191c"}.mdi-account-tag:before{content:"\f1c1b"}.mdi-account-tag-outline:before{content:"\f1c1c"}.mdi-account-tie:before{content:"\f0ce3"}.mdi-account-tie-hat:before{content:"\f1898"}.mdi-account-tie-hat-outline:before{content:"\f1899"}.mdi-account-tie-outline:before{content:"\f10ca"}.mdi-account-tie-voice:before{content:"\f1308"}.mdi-account-tie-voice-off:before{content:"\f130a"}.mdi-account-tie-voice-off-outline:before{content:"\f130b"}.mdi-account-tie-voice-outline:before{content:"\f1309"}.mdi-account-tie-woman:before{content:"\f1a8c"}.mdi-account-voice:before{content:"\f05cb"}.mdi-account-voice-off:before{content:"\f0ed4"}.mdi-account-wrench:before{content:"\f189a"}.mdi-account-wrench-outline:before{content:"\f189b"}.mdi-adjust:before{content:"\f001a"}.mdi-advertisements:before{content:"\f192a"}.mdi-advertisements-off:before{content:"\f192b"}.mdi-air-conditioner:before{content:"\f001b"}.mdi-air-filter:before{content:"\f0d43"}.mdi-air-horn:before{content:"\f0dac"}.mdi-air-humidifier:before{content:"\f1099"}.mdi-air-humidifier-off:before{content:"\f1466"}.mdi-air-purifier:before{content:"\f0d44"}.mdi-air-purifier-off:before{content:"\f1b57"}.mdi-airbag:before{content:"\f0be9"}.mdi-airballoon:before{content:"\f001c"}.mdi-airballoon-outline:before{content:"\f100b"}.mdi-airplane:before{content:"\f001d"}.mdi-airplane-alert:before{content:"\f187a"}.mdi-airplane-check:before{content:"\f187b"}.mdi-airplane-clock:before{content:"\f187c"}.mdi-airplane-cog:before{content:"\f187d"}.mdi-airplane-edit:before{content:"\f187e"}.mdi-airplane-landing:before{content:"\f05d4"}.mdi-airplane-marker:before{content:"\f187f"}.mdi-airplane-minus:before{content:"\f1880"}.mdi-airplane-off:before{content:"\f001e"}.mdi-airplane-plus:before{content:"\f1881"}.mdi-airplane-remove:before{content:"\f1882"}.mdi-airplane-search:before{content:"\f1883"}.mdi-airplane-settings:before{content:"\f1884"}.mdi-airplane-takeoff:before{content:"\f05d5"}.mdi-airport:before{content:"\f084b"}.mdi-alarm:before{content:"\f0020"}.mdi-alarm-bell:before{content:"\f078e"}.mdi-alarm-check:before{content:"\f0021"}.mdi-alarm-light:before{content:"\f078f"}.mdi-alarm-light-off:before{content:"\f171e"}.mdi-alarm-light-off-outline:before{content:"\f171f"}.mdi-alarm-light-outline:before{content:"\f0bea"}.mdi-alarm-multiple:before{content:"\f0022"}.mdi-alarm-note:before{content:"\f0e71"}.mdi-alarm-note-off:before{content:"\f0e72"}.mdi-alarm-off:before{content:"\f0023"}.mdi-alarm-panel:before{content:"\f15c4"}.mdi-alarm-panel-outline:before{content:"\f15c5"}.mdi-alarm-plus:before{content:"\f0024"}.mdi-alarm-snooze:before{content:"\f068e"}.mdi-album:before{content:"\f0025"}.mdi-alert:before{content:"\f0026"}.mdi-alert-box:before{content:"\f0027"}.mdi-alert-box-outline:before{content:"\f0ce4"}.mdi-alert-circle:before{content:"\f0028"}.mdi-alert-circle-check:before{content:"\f11ed"}.mdi-alert-circle-check-outline:before{content:"\f11ee"}.mdi-alert-circle-outline:before{content:"\f05d6"}.mdi-alert-decagram:before{content:"\f06bd"}.mdi-alert-decagram-outline:before{content:"\f0ce5"}.mdi-alert-minus:before{content:"\f14bb"}.mdi-alert-minus-outline:before{content:"\f14be"}.mdi-alert-octagon:before{content:"\f0029"}.mdi-alert-octagon-outline:before{content:"\f0ce6"}.mdi-alert-octagram:before{content:"\f0767"}.mdi-alert-octagram-outline:before{content:"\f0ce7"}.mdi-alert-outline:before{content:"\f002a"}.mdi-alert-plus:before{content:"\f14ba"}.mdi-alert-plus-outline:before{content:"\f14bd"}.mdi-alert-remove:before{content:"\f14bc"}.mdi-alert-remove-outline:before{content:"\f14bf"}.mdi-alert-rhombus:before{content:"\f11ce"}.mdi-alert-rhombus-outline:before{content:"\f11cf"}.mdi-alien:before{content:"\f089a"}.mdi-alien-outline:before{content:"\f10cb"}.mdi-align-horizontal-center:before{content:"\f11c3"}.mdi-align-horizontal-distribute:before{content:"\f1962"}.mdi-align-horizontal-left:before{content:"\f11c2"}.mdi-align-horizontal-right:before{content:"\f11c4"}.mdi-align-vertical-bottom:before{content:"\f11c5"}.mdi-align-vertical-center:before{content:"\f11c6"}.mdi-align-vertical-distribute:before{content:"\f1963"}.mdi-align-vertical-top:before{content:"\f11c7"}.mdi-all-inclusive:before{content:"\f06be"}.mdi-all-inclusive-box:before{content:"\f188d"}.mdi-all-inclusive-box-outline:before{content:"\f188e"}.mdi-allergy:before{content:"\f1258"}.mdi-alpha:before{content:"\f002b"}.mdi-alpha-a:before{content:"\f0aee"}.mdi-alpha-a-box:before{content:"\f0b08"}.mdi-alpha-a-box-outline:before{content:"\f0beb"}.mdi-alpha-a-circle:before{content:"\f0bec"}.mdi-alpha-a-circle-outline:before{content:"\f0bed"}.mdi-alpha-b:before{content:"\f0aef"}.mdi-alpha-b-box:before{content:"\f0b09"}.mdi-alpha-b-box-outline:before{content:"\f0bee"}.mdi-alpha-b-circle:before{content:"\f0bef"}.mdi-alpha-b-circle-outline:before{content:"\f0bf0"}.mdi-alpha-c:before{content:"\f0af0"}.mdi-alpha-c-box:before{content:"\f0b0a"}.mdi-alpha-c-box-outline:before{content:"\f0bf1"}.mdi-alpha-c-circle:before{content:"\f0bf2"}.mdi-alpha-c-circle-outline:before{content:"\f0bf3"}.mdi-alpha-d:before{content:"\f0af1"}.mdi-alpha-d-box:before{content:"\f0b0b"}.mdi-alpha-d-box-outline:before{content:"\f0bf4"}.mdi-alpha-d-circle:before{content:"\f0bf5"}.mdi-alpha-d-circle-outline:before{content:"\f0bf6"}.mdi-alpha-e:before{content:"\f0af2"}.mdi-alpha-e-box:before{content:"\f0b0c"}.mdi-alpha-e-box-outline:before{content:"\f0bf7"}.mdi-alpha-e-circle:before{content:"\f0bf8"}.mdi-alpha-e-circle-outline:before{content:"\f0bf9"}.mdi-alpha-f:before{content:"\f0af3"}.mdi-alpha-f-box:before{content:"\f0b0d"}.mdi-alpha-f-box-outline:before{content:"\f0bfa"}.mdi-alpha-f-circle:before{content:"\f0bfb"}.mdi-alpha-f-circle-outline:before{content:"\f0bfc"}.mdi-alpha-g:before{content:"\f0af4"}.mdi-alpha-g-box:before{content:"\f0b0e"}.mdi-alpha-g-box-outline:before{content:"\f0bfd"}.mdi-alpha-g-circle:before{content:"\f0bfe"}.mdi-alpha-g-circle-outline:before{content:"\f0bff"}.mdi-alpha-h:before{content:"\f0af5"}.mdi-alpha-h-box:before{content:"\f0b0f"}.mdi-alpha-h-box-outline:before{content:"\f0c00"}.mdi-alpha-h-circle:before{content:"\f0c01"}.mdi-alpha-h-circle-outline:before{content:"\f0c02"}.mdi-alpha-i:before{content:"\f0af6"}.mdi-alpha-i-box:before{content:"\f0b10"}.mdi-alpha-i-box-outline:before{content:"\f0c03"}.mdi-alpha-i-circle:before{content:"\f0c04"}.mdi-alpha-i-circle-outline:before{content:"\f0c05"}.mdi-alpha-j:before{content:"\f0af7"}.mdi-alpha-j-box:before{content:"\f0b11"}.mdi-alpha-j-box-outline:before{content:"\f0c06"}.mdi-alpha-j-circle:before{content:"\f0c07"}.mdi-alpha-j-circle-outline:before{content:"\f0c08"}.mdi-alpha-k:before{content:"\f0af8"}.mdi-alpha-k-box:before{content:"\f0b12"}.mdi-alpha-k-box-outline:before{content:"\f0c09"}.mdi-alpha-k-circle:before{content:"\f0c0a"}.mdi-alpha-k-circle-outline:before{content:"\f0c0b"}.mdi-alpha-l:before{content:"\f0af9"}.mdi-alpha-l-box:before{content:"\f0b13"}.mdi-alpha-l-box-outline:before{content:"\f0c0c"}.mdi-alpha-l-circle:before{content:"\f0c0d"}.mdi-alpha-l-circle-outline:before{content:"\f0c0e"}.mdi-alpha-m:before{content:"\f0afa"}.mdi-alpha-m-box:before{content:"\f0b14"}.mdi-alpha-m-box-outline:before{content:"\f0c0f"}.mdi-alpha-m-circle:before{content:"\f0c10"}.mdi-alpha-m-circle-outline:before{content:"\f0c11"}.mdi-alpha-n:before{content:"\f0afb"}.mdi-alpha-n-box:before{content:"\f0b15"}.mdi-alpha-n-box-outline:before{content:"\f0c12"}.mdi-alpha-n-circle:before{content:"\f0c13"}.mdi-alpha-n-circle-outline:before{content:"\f0c14"}.mdi-alpha-o:before{content:"\f0afc"}.mdi-alpha-o-box:before{content:"\f0b16"}.mdi-alpha-o-box-outline:before{content:"\f0c15"}.mdi-alpha-o-circle:before{content:"\f0c16"}.mdi-alpha-o-circle-outline:before{content:"\f0c17"}.mdi-alpha-p:before{content:"\f0afd"}.mdi-alpha-p-box:before{content:"\f0b17"}.mdi-alpha-p-box-outline:before{content:"\f0c18"}.mdi-alpha-p-circle:before{content:"\f0c19"}.mdi-alpha-p-circle-outline:before{content:"\f0c1a"}.mdi-alpha-q:before{content:"\f0afe"}.mdi-alpha-q-box:before{content:"\f0b18"}.mdi-alpha-q-box-outline:before{content:"\f0c1b"}.mdi-alpha-q-circle:before{content:"\f0c1c"}.mdi-alpha-q-circle-outline:before{content:"\f0c1d"}.mdi-alpha-r:before{content:"\f0aff"}.mdi-alpha-r-box:before{content:"\f0b19"}.mdi-alpha-r-box-outline:before{content:"\f0c1e"}.mdi-alpha-r-circle:before{content:"\f0c1f"}.mdi-alpha-r-circle-outline:before{content:"\f0c20"}.mdi-alpha-s:before{content:"\f0b00"}.mdi-alpha-s-box:before{content:"\f0b1a"}.mdi-alpha-s-box-outline:before{content:"\f0c21"}.mdi-alpha-s-circle:before{content:"\f0c22"}.mdi-alpha-s-circle-outline:before{content:"\f0c23"}.mdi-alpha-t:before{content:"\f0b01"}.mdi-alpha-t-box:before{content:"\f0b1b"}.mdi-alpha-t-box-outline:before{content:"\f0c24"}.mdi-alpha-t-circle:before{content:"\f0c25"}.mdi-alpha-t-circle-outline:before{content:"\f0c26"}.mdi-alpha-u:before{content:"\f0b02"}.mdi-alpha-u-box:before{content:"\f0b1c"}.mdi-alpha-u-box-outline:before{content:"\f0c27"}.mdi-alpha-u-circle:before{content:"\f0c28"}.mdi-alpha-u-circle-outline:before{content:"\f0c29"}.mdi-alpha-v:before{content:"\f0b03"}.mdi-alpha-v-box:before{content:"\f0b1d"}.mdi-alpha-v-box-outline:before{content:"\f0c2a"}.mdi-alpha-v-circle:before{content:"\f0c2b"}.mdi-alpha-v-circle-outline:before{content:"\f0c2c"}.mdi-alpha-w:before{content:"\f0b04"}.mdi-alpha-w-box:before{content:"\f0b1e"}.mdi-alpha-w-box-outline:before{content:"\f0c2d"}.mdi-alpha-w-circle:before{content:"\f0c2e"}.mdi-alpha-w-circle-outline:before{content:"\f0c2f"}.mdi-alpha-x:before{content:"\f0b05"}.mdi-alpha-x-box:before{content:"\f0b1f"}.mdi-alpha-x-box-outline:before{content:"\f0c30"}.mdi-alpha-x-circle:before{content:"\f0c31"}.mdi-alpha-x-circle-outline:before{content:"\f0c32"}.mdi-alpha-y:before{content:"\f0b06"}.mdi-alpha-y-box:before{content:"\f0b20"}.mdi-alpha-y-box-outline:before{content:"\f0c33"}.mdi-alpha-y-circle:before{content:"\f0c34"}.mdi-alpha-y-circle-outline:before{content:"\f0c35"}.mdi-alpha-z:before{content:"\f0b07"}.mdi-alpha-z-box:before{content:"\f0b21"}.mdi-alpha-z-box-outline:before{content:"\f0c36"}.mdi-alpha-z-circle:before{content:"\f0c37"}.mdi-alpha-z-circle-outline:before{content:"\f0c38"}.mdi-alphabet-aurebesh:before{content:"\f132c"}.mdi-alphabet-cyrillic:before{content:"\f132d"}.mdi-alphabet-greek:before{content:"\f132e"}.mdi-alphabet-latin:before{content:"\f132f"}.mdi-alphabet-piqad:before{content:"\f1330"}.mdi-alphabet-tengwar:before{content:"\f1337"}.mdi-alphabetical:before{content:"\f002c"}.mdi-alphabetical-off:before{content:"\f100c"}.mdi-alphabetical-variant:before{content:"\f100d"}.mdi-alphabetical-variant-off:before{content:"\f100e"}.mdi-altimeter:before{content:"\f05d7"}.mdi-ambulance:before{content:"\f002f"}.mdi-ammunition:before{content:"\f0ce8"}.mdi-ampersand:before{content:"\f0a8d"}.mdi-amplifier:before{content:"\f0030"}.mdi-amplifier-off:before{content:"\f11b5"}.mdi-anchor:before{content:"\f0031"}.mdi-android:before{content:"\f0032"}.mdi-android-studio:before{content:"\f0034"}.mdi-angle-acute:before{content:"\f0937"}.mdi-angle-obtuse:before{content:"\f0938"}.mdi-angle-right:before{content:"\f0939"}.mdi-angular:before{content:"\f06b2"}.mdi-angularjs:before{content:"\f06bf"}.mdi-animation:before{content:"\f05d8"}.mdi-animation-outline:before{content:"\f0a8f"}.mdi-animation-play:before{content:"\f093a"}.mdi-animation-play-outline:before{content:"\f0a90"}.mdi-ansible:before{content:"\f109a"}.mdi-antenna:before{content:"\f1119"}.mdi-anvil:before{content:"\f089b"}.mdi-apache-kafka:before{content:"\f100f"}.mdi-api:before{content:"\f109b"}.mdi-api-off:before{content:"\f1257"}.mdi-apple:before{content:"\f0035"}.mdi-apple-finder:before{content:"\f0036"}.mdi-apple-icloud:before{content:"\f0038"}.mdi-apple-ios:before{content:"\f0037"}.mdi-apple-keyboard-caps:before{content:"\f0632"}.mdi-apple-keyboard-command:before{content:"\f0633"}.mdi-apple-keyboard-control:before{content:"\f0634"}.mdi-apple-keyboard-option:before{content:"\f0635"}.mdi-apple-keyboard-shift:before{content:"\f0636"}.mdi-apple-safari:before{content:"\f0039"}.mdi-application:before{content:"\f08c6"}.mdi-application-array:before{content:"\f10f5"}.mdi-application-array-outline:before{content:"\f10f6"}.mdi-application-braces:before{content:"\f10f7"}.mdi-application-braces-outline:before{content:"\f10f8"}.mdi-application-brackets:before{content:"\f0c8b"}.mdi-application-brackets-outline:before{content:"\f0c8c"}.mdi-application-cog:before{content:"\f0675"}.mdi-application-cog-outline:before{content:"\f1577"}.mdi-application-edit:before{content:"\f00ae"}.mdi-application-edit-outline:before{content:"\f0619"}.mdi-application-export:before{content:"\f0dad"}.mdi-application-import:before{content:"\f0dae"}.mdi-application-outline:before{content:"\f0614"}.mdi-application-parentheses:before{content:"\f10f9"}.mdi-application-parentheses-outline:before{content:"\f10fa"}.mdi-application-settings:before{content:"\f0b60"}.mdi-application-settings-outline:before{content:"\f1555"}.mdi-application-variable:before{content:"\f10fb"}.mdi-application-variable-outline:before{content:"\f10fc"}.mdi-approximately-equal:before{content:"\f0f9e"}.mdi-approximately-equal-box:before{content:"\f0f9f"}.mdi-apps:before{content:"\f003b"}.mdi-apps-box:before{content:"\f0d46"}.mdi-arch:before{content:"\f08c7"}.mdi-archive:before{content:"\f003c"}.mdi-archive-alert:before{content:"\f14fd"}.mdi-archive-alert-outline:before{content:"\f14fe"}.mdi-archive-arrow-down:before{content:"\f1259"}.mdi-archive-arrow-down-outline:before{content:"\f125a"}.mdi-archive-arrow-up:before{content:"\f125b"}.mdi-archive-arrow-up-outline:before{content:"\f125c"}.mdi-archive-cancel:before{content:"\f174b"}.mdi-archive-cancel-outline:before{content:"\f174c"}.mdi-archive-check:before{content:"\f174d"}.mdi-archive-check-outline:before{content:"\f174e"}.mdi-archive-clock:before{content:"\f174f"}.mdi-archive-clock-outline:before{content:"\f1750"}.mdi-archive-cog:before{content:"\f1751"}.mdi-archive-cog-outline:before{content:"\f1752"}.mdi-archive-edit:before{content:"\f1753"}.mdi-archive-edit-outline:before{content:"\f1754"}.mdi-archive-eye:before{content:"\f1755"}.mdi-archive-eye-outline:before{content:"\f1756"}.mdi-archive-lock:before{content:"\f1757"}.mdi-archive-lock-open:before{content:"\f1758"}.mdi-archive-lock-open-outline:before{content:"\f1759"}.mdi-archive-lock-outline:before{content:"\f175a"}.mdi-archive-marker:before{content:"\f175b"}.mdi-archive-marker-outline:before{content:"\f175c"}.mdi-archive-minus:before{content:"\f175d"}.mdi-archive-minus-outline:before{content:"\f175e"}.mdi-archive-music:before{content:"\f175f"}.mdi-archive-music-outline:before{content:"\f1760"}.mdi-archive-off:before{content:"\f1761"}.mdi-archive-off-outline:before{content:"\f1762"}.mdi-archive-outline:before{content:"\f120e"}.mdi-archive-plus:before{content:"\f1763"}.mdi-archive-plus-outline:before{content:"\f1764"}.mdi-archive-refresh:before{content:"\f1765"}.mdi-archive-refresh-outline:before{content:"\f1766"}.mdi-archive-remove:before{content:"\f1767"}.mdi-archive-remove-outline:before{content:"\f1768"}.mdi-archive-search:before{content:"\f1769"}.mdi-archive-search-outline:before{content:"\f176a"}.mdi-archive-settings:before{content:"\f176b"}.mdi-archive-settings-outline:before{content:"\f176c"}.mdi-archive-star:before{content:"\f176d"}.mdi-archive-star-outline:before{content:"\f176e"}.mdi-archive-sync:before{content:"\f176f"}.mdi-archive-sync-outline:before{content:"\f1770"}.mdi-arm-flex:before{content:"\f0fd7"}.mdi-arm-flex-outline:before{content:"\f0fd6"}.mdi-arrange-bring-forward:before{content:"\f003d"}.mdi-arrange-bring-to-front:before{content:"\f003e"}.mdi-arrange-send-backward:before{content:"\f003f"}.mdi-arrange-send-to-back:before{content:"\f0040"}.mdi-arrow-all:before{content:"\f0041"}.mdi-arrow-bottom-left:before{content:"\f0042"}.mdi-arrow-bottom-left-bold-box:before{content:"\f1964"}.mdi-arrow-bottom-left-bold-box-outline:before{content:"\f1965"}.mdi-arrow-bottom-left-bold-outline:before{content:"\f09b7"}.mdi-arrow-bottom-left-thick:before{content:"\f09b8"}.mdi-arrow-bottom-left-thin:before{content:"\f19b6"}.mdi-arrow-bottom-left-thin-circle-outline:before{content:"\f1596"}.mdi-arrow-bottom-right:before{content:"\f0043"}.mdi-arrow-bottom-right-bold-box:before{content:"\f1966"}.mdi-arrow-bottom-right-bold-box-outline:before{content:"\f1967"}.mdi-arrow-bottom-right-bold-outline:before{content:"\f09b9"}.mdi-arrow-bottom-right-thick:before{content:"\f09ba"}.mdi-arrow-bottom-right-thin:before{content:"\f19b7"}.mdi-arrow-bottom-right-thin-circle-outline:before{content:"\f1595"}.mdi-arrow-collapse:before{content:"\f0615"}.mdi-arrow-collapse-all:before{content:"\f0044"}.mdi-arrow-collapse-down:before{content:"\f0792"}.mdi-arrow-collapse-horizontal:before{content:"\f084c"}.mdi-arrow-collapse-left:before{content:"\f0793"}.mdi-arrow-collapse-right:before{content:"\f0794"}.mdi-arrow-collapse-up:before{content:"\f0795"}.mdi-arrow-collapse-vertical:before{content:"\f084d"}.mdi-arrow-decision:before{content:"\f09bb"}.mdi-arrow-decision-auto:before{content:"\f09bc"}.mdi-arrow-decision-auto-outline:before{content:"\f09bd"}.mdi-arrow-decision-outline:before{content:"\f09be"}.mdi-arrow-down:before{content:"\f0045"}.mdi-arrow-down-bold:before{content:"\f072e"}.mdi-arrow-down-bold-box:before{content:"\f072f"}.mdi-arrow-down-bold-box-outline:before{content:"\f0730"}.mdi-arrow-down-bold-circle:before{content:"\f0047"}.mdi-arrow-down-bold-circle-outline:before{content:"\f0048"}.mdi-arrow-down-bold-hexagon-outline:before{content:"\f0049"}.mdi-arrow-down-bold-outline:before{content:"\f09bf"}.mdi-arrow-down-box:before{content:"\f06c0"}.mdi-arrow-down-circle:before{content:"\f0cdb"}.mdi-arrow-down-circle-outline:before{content:"\f0cdc"}.mdi-arrow-down-drop-circle:before{content:"\f004a"}.mdi-arrow-down-drop-circle-outline:before{content:"\f004b"}.mdi-arrow-down-left:before{content:"\f17a1"}.mdi-arrow-down-left-bold:before{content:"\f17a2"}.mdi-arrow-down-right:before{content:"\f17a3"}.mdi-arrow-down-right-bold:before{content:"\f17a4"}.mdi-arrow-down-thick:before{content:"\f0046"}.mdi-arrow-down-thin:before{content:"\f19b3"}.mdi-arrow-down-thin-circle-outline:before{content:"\f1599"}.mdi-arrow-expand:before{content:"\f0616"}.mdi-arrow-expand-all:before{content:"\f004c"}.mdi-arrow-expand-down:before{content:"\f0796"}.mdi-arrow-expand-horizontal:before{content:"\f084e"}.mdi-arrow-expand-left:before{content:"\f0797"}.mdi-arrow-expand-right:before{content:"\f0798"}.mdi-arrow-expand-up:before{content:"\f0799"}.mdi-arrow-expand-vertical:before{content:"\f084f"}.mdi-arrow-horizontal-lock:before{content:"\f115b"}.mdi-arrow-left:before{content:"\f004d"}.mdi-arrow-left-bold:before{content:"\f0731"}.mdi-arrow-left-bold-box:before{content:"\f0732"}.mdi-arrow-left-bold-box-outline:before{content:"\f0733"}.mdi-arrow-left-bold-circle:before{content:"\f004f"}.mdi-arrow-left-bold-circle-outline:before{content:"\f0050"}.mdi-arrow-left-bold-hexagon-outline:before{content:"\f0051"}.mdi-arrow-left-bold-outline:before{content:"\f09c0"}.mdi-arrow-left-bottom:before{content:"\f17a5"}.mdi-arrow-left-bottom-bold:before{content:"\f17a6"}.mdi-arrow-left-box:before{content:"\f06c1"}.mdi-arrow-left-circle:before{content:"\f0cdd"}.mdi-arrow-left-circle-outline:before{content:"\f0cde"}.mdi-arrow-left-drop-circle:before{content:"\f0052"}.mdi-arrow-left-drop-circle-outline:before{content:"\f0053"}.mdi-arrow-left-right:before{content:"\f0e73"}.mdi-arrow-left-right-bold:before{content:"\f0e74"}.mdi-arrow-left-right-bold-outline:before{content:"\f09c1"}.mdi-arrow-left-thick:before{content:"\f004e"}.mdi-arrow-left-thin:before{content:"\f19b1"}.mdi-arrow-left-thin-circle-outline:before{content:"\f159a"}.mdi-arrow-left-top:before{content:"\f17a7"}.mdi-arrow-left-top-bold:before{content:"\f17a8"}.mdi-arrow-oscillating:before{content:"\f1c91"}.mdi-arrow-oscillating-off:before{content:"\f1c92"}.mdi-arrow-projectile:before{content:"\f1840"}.mdi-arrow-projectile-multiple:before{content:"\f183f"}.mdi-arrow-right:before{content:"\f0054"}.mdi-arrow-right-bold:before{content:"\f0734"}.mdi-arrow-right-bold-box:before{content:"\f0735"}.mdi-arrow-right-bold-box-outline:before{content:"\f0736"}.mdi-arrow-right-bold-circle:before{content:"\f0056"}.mdi-arrow-right-bold-circle-outline:before{content:"\f0057"}.mdi-arrow-right-bold-hexagon-outline:before{content:"\f0058"}.mdi-arrow-right-bold-outline:before{content:"\f09c2"}.mdi-arrow-right-bottom:before{content:"\f17a9"}.mdi-arrow-right-bottom-bold:before{content:"\f17aa"}.mdi-arrow-right-box:before{content:"\f06c2"}.mdi-arrow-right-circle:before{content:"\f0cdf"}.mdi-arrow-right-circle-outline:before{content:"\f0ce0"}.mdi-arrow-right-drop-circle:before{content:"\f0059"}.mdi-arrow-right-drop-circle-outline:before{content:"\f005a"}.mdi-arrow-right-thick:before{content:"\f0055"}.mdi-arrow-right-thin:before{content:"\f19b0"}.mdi-arrow-right-thin-circle-outline:before{content:"\f1598"}.mdi-arrow-right-top:before{content:"\f17ab"}.mdi-arrow-right-top-bold:before{content:"\f17ac"}.mdi-arrow-split-horizontal:before{content:"\f093b"}.mdi-arrow-split-vertical:before{content:"\f093c"}.mdi-arrow-top-left:before{content:"\f005b"}.mdi-arrow-top-left-bold-box:before{content:"\f1968"}.mdi-arrow-top-left-bold-box-outline:before{content:"\f1969"}.mdi-arrow-top-left-bold-outline:before{content:"\f09c3"}.mdi-arrow-top-left-bottom-right:before{content:"\f0e75"}.mdi-arrow-top-left-bottom-right-bold:before{content:"\f0e76"}.mdi-arrow-top-left-thick:before{content:"\f09c4"}.mdi-arrow-top-left-thin:before{content:"\f19b5"}.mdi-arrow-top-left-thin-circle-outline:before{content:"\f1593"}.mdi-arrow-top-right:before{content:"\f005c"}.mdi-arrow-top-right-bold-box:before{content:"\f196a"}.mdi-arrow-top-right-bold-box-outline:before{content:"\f196b"}.mdi-arrow-top-right-bold-outline:before{content:"\f09c5"}.mdi-arrow-top-right-bottom-left:before{content:"\f0e77"}.mdi-arrow-top-right-bottom-left-bold:before{content:"\f0e78"}.mdi-arrow-top-right-thick:before{content:"\f09c6"}.mdi-arrow-top-right-thin:before{content:"\f19b4"}.mdi-arrow-top-right-thin-circle-outline:before{content:"\f1594"}.mdi-arrow-u-down-left:before{content:"\f17ad"}.mdi-arrow-u-down-left-bold:before{content:"\f17ae"}.mdi-arrow-u-down-right:before{content:"\f17af"}.mdi-arrow-u-down-right-bold:before{content:"\f17b0"}.mdi-arrow-u-left-bottom:before{content:"\f17b1"}.mdi-arrow-u-left-bottom-bold:before{content:"\f17b2"}.mdi-arrow-u-left-top:before{content:"\f17b3"}.mdi-arrow-u-left-top-bold:before{content:"\f17b4"}.mdi-arrow-u-right-bottom:before{content:"\f17b5"}.mdi-arrow-u-right-bottom-bold:before{content:"\f17b6"}.mdi-arrow-u-right-top:before{content:"\f17b7"}.mdi-arrow-u-right-top-bold:before{content:"\f17b8"}.mdi-arrow-u-up-left:before{content:"\f17b9"}.mdi-arrow-u-up-left-bold:before{content:"\f17ba"}.mdi-arrow-u-up-right:before{content:"\f17bb"}.mdi-arrow-u-up-right-bold:before{content:"\f17bc"}.mdi-arrow-up:before{content:"\f005d"}.mdi-arrow-up-bold:before{content:"\f0737"}.mdi-arrow-up-bold-box:before{content:"\f0738"}.mdi-arrow-up-bold-box-outline:before{content:"\f0739"}.mdi-arrow-up-bold-circle:before{content:"\f005f"}.mdi-arrow-up-bold-circle-outline:before{content:"\f0060"}.mdi-arrow-up-bold-hexagon-outline:before{content:"\f0061"}.mdi-arrow-up-bold-outline:before{content:"\f09c7"}.mdi-arrow-up-box:before{content:"\f06c3"}.mdi-arrow-up-circle:before{content:"\f0ce1"}.mdi-arrow-up-circle-outline:before{content:"\f0ce2"}.mdi-arrow-up-down:before{content:"\f0e79"}.mdi-arrow-up-down-bold:before{content:"\f0e7a"}.mdi-arrow-up-down-bold-outline:before{content:"\f09c8"}.mdi-arrow-up-drop-circle:before{content:"\f0062"}.mdi-arrow-up-drop-circle-outline:before{content:"\f0063"}.mdi-arrow-up-left:before{content:"\f17bd"}.mdi-arrow-up-left-bold:before{content:"\f17be"}.mdi-arrow-up-right:before{content:"\f17bf"}.mdi-arrow-up-right-bold:before{content:"\f17c0"}.mdi-arrow-up-thick:before{content:"\f005e"}.mdi-arrow-up-thin:before{content:"\f19b2"}.mdi-arrow-up-thin-circle-outline:before{content:"\f1597"}.mdi-arrow-vertical-lock:before{content:"\f115c"}.mdi-artboard:before{content:"\f1b9a"}.mdi-artstation:before{content:"\f0b5b"}.mdi-aspect-ratio:before{content:"\f0a24"}.mdi-assistant:before{content:"\f0064"}.mdi-asterisk:before{content:"\f06c4"}.mdi-asterisk-circle-outline:before{content:"\f1a27"}.mdi-at:before{content:"\f0065"}.mdi-atlassian:before{content:"\f0804"}.mdi-atm:before{content:"\f0d47"}.mdi-atom:before{content:"\f0768"}.mdi-atom-variant:before{content:"\f0e7b"}.mdi-attachment:before{content:"\f0066"}.mdi-attachment-check:before{content:"\f1ac1"}.mdi-attachment-lock:before{content:"\f19c4"}.mdi-attachment-minus:before{content:"\f1ac2"}.mdi-attachment-off:before{content:"\f1ac3"}.mdi-attachment-plus:before{content:"\f1ac4"}.mdi-attachment-remove:before{content:"\f1ac5"}.mdi-atv:before{content:"\f1b70"}.mdi-audio-input-rca:before{content:"\f186b"}.mdi-audio-input-stereo-minijack:before{content:"\f186c"}.mdi-audio-input-xlr:before{content:"\f186d"}.mdi-audio-video:before{content:"\f093d"}.mdi-audio-video-off:before{content:"\f11b6"}.mdi-augmented-reality:before{content:"\f0850"}.mdi-aurora:before{content:"\f1bb9"}.mdi-auto-download:before{content:"\f137e"}.mdi-auto-fix:before{content:"\f0068"}.mdi-auto-mode:before{content:"\f1c20"}.mdi-auto-upload:before{content:"\f0069"}.mdi-autorenew:before{content:"\f006a"}.mdi-autorenew-off:before{content:"\f19e7"}.mdi-av-timer:before{content:"\f006b"}.mdi-awning:before{content:"\f1b87"}.mdi-awning-outline:before{content:"\f1b88"}.mdi-aws:before{content:"\f0e0f"}.mdi-axe:before{content:"\f08c8"}.mdi-axe-battle:before{content:"\f1842"}.mdi-axis:before{content:"\f0d48"}.mdi-axis-arrow:before{content:"\f0d49"}.mdi-axis-arrow-info:before{content:"\f140e"}.mdi-axis-arrow-lock:before{content:"\f0d4a"}.mdi-axis-lock:before{content:"\f0d4b"}.mdi-axis-x-arrow:before{content:"\f0d4c"}.mdi-axis-x-arrow-lock:before{content:"\f0d4d"}.mdi-axis-x-rotate-clockwise:before{content:"\f0d4e"}.mdi-axis-x-rotate-counterclockwise:before{content:"\f0d4f"}.mdi-axis-x-y-arrow-lock:before{content:"\f0d50"}.mdi-axis-y-arrow:before{content:"\f0d51"}.mdi-axis-y-arrow-lock:before{content:"\f0d52"}.mdi-axis-y-rotate-clockwise:before{content:"\f0d53"}.mdi-axis-y-rotate-counterclockwise:before{content:"\f0d54"}.mdi-axis-z-arrow:before{content:"\f0d55"}.mdi-axis-z-arrow-lock:before{content:"\f0d56"}.mdi-axis-z-rotate-clockwise:before{content:"\f0d57"}.mdi-axis-z-rotate-counterclockwise:before{content:"\f0d58"}.mdi-babel:before{content:"\f0a25"}.mdi-baby:before{content:"\f006c"}.mdi-baby-bottle:before{content:"\f0f39"}.mdi-baby-bottle-outline:before{content:"\f0f3a"}.mdi-baby-buggy:before{content:"\f13e0"}.mdi-baby-buggy-off:before{content:"\f1af3"}.mdi-baby-carriage:before{content:"\f068f"}.mdi-baby-carriage-off:before{content:"\f0fa0"}.mdi-baby-face:before{content:"\f0e7c"}.mdi-baby-face-outline:before{content:"\f0e7d"}.mdi-backburger:before{content:"\f006d"}.mdi-backspace:before{content:"\f006e"}.mdi-backspace-outline:before{content:"\f0b5c"}.mdi-backspace-reverse:before{content:"\f0e7e"}.mdi-backspace-reverse-outline:before{content:"\f0e7f"}.mdi-backup-restore:before{content:"\f006f"}.mdi-bacteria:before{content:"\f0ed5"}.mdi-bacteria-outline:before{content:"\f0ed6"}.mdi-badge-account:before{content:"\f0da7"}.mdi-badge-account-alert:before{content:"\f0da8"}.mdi-badge-account-alert-outline:before{content:"\f0da9"}.mdi-badge-account-horizontal:before{content:"\f0e0d"}.mdi-badge-account-horizontal-outline:before{content:"\f0e0e"}.mdi-badge-account-outline:before{content:"\f0daa"}.mdi-badminton:before{content:"\f0851"}.mdi-bag-carry-on:before{content:"\f0f3b"}.mdi-bag-carry-on-check:before{content:"\f0d65"}.mdi-bag-carry-on-off:before{content:"\f0f3c"}.mdi-bag-checked:before{content:"\f0f3d"}.mdi-bag-personal:before{content:"\f0e10"}.mdi-bag-personal-off:before{content:"\f0e11"}.mdi-bag-personal-off-outline:before{content:"\f0e12"}.mdi-bag-personal-outline:before{content:"\f0e13"}.mdi-bag-personal-plus:before{content:"\f1ca4"}.mdi-bag-personal-plus-outline:before{content:"\f1ca5"}.mdi-bag-personal-tag:before{content:"\f1b0c"}.mdi-bag-personal-tag-outline:before{content:"\f1b0d"}.mdi-bag-suitcase:before{content:"\f158b"}.mdi-bag-suitcase-off:before{content:"\f158d"}.mdi-bag-suitcase-off-outline:before{content:"\f158e"}.mdi-bag-suitcase-outline:before{content:"\f158c"}.mdi-baguette:before{content:"\f0f3e"}.mdi-balcony:before{content:"\f1817"}.mdi-balloon:before{content:"\f0a26"}.mdi-ballot:before{content:"\f09c9"}.mdi-ballot-outline:before{content:"\f09ca"}.mdi-ballot-recount:before{content:"\f0c39"}.mdi-ballot-recount-outline:before{content:"\f0c3a"}.mdi-bandage:before{content:"\f0daf"}.mdi-bank:before{content:"\f0070"}.mdi-bank-check:before{content:"\f1655"}.mdi-bank-circle:before{content:"\f1c03"}.mdi-bank-circle-outline:before{content:"\f1c04"}.mdi-bank-minus:before{content:"\f0db0"}.mdi-bank-off:before{content:"\f1656"}.mdi-bank-off-outline:before{content:"\f1657"}.mdi-bank-outline:before{content:"\f0e80"}.mdi-bank-plus:before{content:"\f0db1"}.mdi-bank-remove:before{content:"\f0db2"}.mdi-bank-transfer:before{content:"\f0a27"}.mdi-bank-transfer-in:before{content:"\f0a28"}.mdi-bank-transfer-out:before{content:"\f0a29"}.mdi-barcode:before{content:"\f0071"}.mdi-barcode-off:before{content:"\f1236"}.mdi-barcode-scan:before{content:"\f0072"}.mdi-barley:before{content:"\f0073"}.mdi-barley-off:before{content:"\f0b5d"}.mdi-barn:before{content:"\f0b5e"}.mdi-barrel:before{content:"\f0074"}.mdi-barrel-outline:before{content:"\f1a28"}.mdi-baseball:before{content:"\f0852"}.mdi-baseball-bat:before{content:"\f0853"}.mdi-baseball-diamond:before{content:"\f15ec"}.mdi-baseball-diamond-outline:before{content:"\f15ed"}.mdi-baseball-outline:before{content:"\f1c5a"}.mdi-bash:before{content:"\f1183"}.mdi-basket:before{content:"\f0076"}.mdi-basket-check:before{content:"\f18e5"}.mdi-basket-check-outline:before{content:"\f18e6"}.mdi-basket-fill:before{content:"\f0077"}.mdi-basket-minus:before{content:"\f1523"}.mdi-basket-minus-outline:before{content:"\f1524"}.mdi-basket-off:before{content:"\f1525"}.mdi-basket-off-outline:before{content:"\f1526"}.mdi-basket-outline:before{content:"\f1181"}.mdi-basket-plus:before{content:"\f1527"}.mdi-basket-plus-outline:before{content:"\f1528"}.mdi-basket-remove:before{content:"\f1529"}.mdi-basket-remove-outline:before{content:"\f152a"}.mdi-basket-unfill:before{content:"\f0078"}.mdi-basketball:before{content:"\f0806"}.mdi-basketball-hoop:before{content:"\f0c3b"}.mdi-basketball-hoop-outline:before{content:"\f0c3c"}.mdi-bat:before{content:"\f0b5f"}.mdi-bathtub:before{content:"\f1818"}.mdi-bathtub-outline:before{content:"\f1819"}.mdi-battery:before{content:"\f0079"}.mdi-battery-10:before{content:"\f007a"}.mdi-battery-10-bluetooth:before{content:"\f093e"}.mdi-battery-20:before{content:"\f007b"}.mdi-battery-20-bluetooth:before{content:"\f093f"}.mdi-battery-30:before{content:"\f007c"}.mdi-battery-30-bluetooth:before{content:"\f0940"}.mdi-battery-40:before{content:"\f007d"}.mdi-battery-40-bluetooth:before{content:"\f0941"}.mdi-battery-50:before{content:"\f007e"}.mdi-battery-50-bluetooth:before{content:"\f0942"}.mdi-battery-60:before{content:"\f007f"}.mdi-battery-60-bluetooth:before{content:"\f0943"}.mdi-battery-70:before{content:"\f0080"}.mdi-battery-70-bluetooth:before{content:"\f0944"}.mdi-battery-80:before{content:"\f0081"}.mdi-battery-80-bluetooth:before{content:"\f0945"}.mdi-battery-90:before{content:"\f0082"}.mdi-battery-90-bluetooth:before{content:"\f0946"}.mdi-battery-alert:before{content:"\f0083"}.mdi-battery-alert-bluetooth:before{content:"\f0947"}.mdi-battery-alert-variant:before{content:"\f10cc"}.mdi-battery-alert-variant-outline:before{content:"\f10cd"}.mdi-battery-arrow-down:before{content:"\f17de"}.mdi-battery-arrow-down-outline:before{content:"\f17df"}.mdi-battery-arrow-up:before{content:"\f17e0"}.mdi-battery-arrow-up-outline:before{content:"\f17e1"}.mdi-battery-bluetooth:before{content:"\f0948"}.mdi-battery-bluetooth-variant:before{content:"\f0949"}.mdi-battery-charging:before{content:"\f0084"}.mdi-battery-charging-10:before{content:"\f089c"}.mdi-battery-charging-100:before{content:"\f0085"}.mdi-battery-charging-20:before{content:"\f0086"}.mdi-battery-charging-30:before{content:"\f0087"}.mdi-battery-charging-40:before{content:"\f0088"}.mdi-battery-charging-50:before{content:"\f089d"}.mdi-battery-charging-60:before{content:"\f0089"}.mdi-battery-charging-70:before{content:"\f089e"}.mdi-battery-charging-80:before{content:"\f008a"}.mdi-battery-charging-90:before{content:"\f008b"}.mdi-battery-charging-high:before{content:"\f12a6"}.mdi-battery-charging-low:before{content:"\f12a4"}.mdi-battery-charging-medium:before{content:"\f12a5"}.mdi-battery-charging-outline:before{content:"\f089f"}.mdi-battery-charging-wireless:before{content:"\f0807"}.mdi-battery-charging-wireless-10:before{content:"\f0808"}.mdi-battery-charging-wireless-20:before{content:"\f0809"}.mdi-battery-charging-wireless-30:before{content:"\f080a"}.mdi-battery-charging-wireless-40:before{content:"\f080b"}.mdi-battery-charging-wireless-50:before{content:"\f080c"}.mdi-battery-charging-wireless-60:before{content:"\f080d"}.mdi-battery-charging-wireless-70:before{content:"\f080e"}.mdi-battery-charging-wireless-80:before{content:"\f080f"}.mdi-battery-charging-wireless-90:before{content:"\f0810"}.mdi-battery-charging-wireless-alert:before{content:"\f0811"}.mdi-battery-charging-wireless-outline:before{content:"\f0812"}.mdi-battery-check:before{content:"\f17e2"}.mdi-battery-check-outline:before{content:"\f17e3"}.mdi-battery-clock:before{content:"\f19e5"}.mdi-battery-clock-outline:before{content:"\f19e6"}.mdi-battery-heart:before{content:"\f120f"}.mdi-battery-heart-outline:before{content:"\f1210"}.mdi-battery-heart-variant:before{content:"\f1211"}.mdi-battery-high:before{content:"\f12a3"}.mdi-battery-lock:before{content:"\f179c"}.mdi-battery-lock-open:before{content:"\f179d"}.mdi-battery-low:before{content:"\f12a1"}.mdi-battery-medium:before{content:"\f12a2"}.mdi-battery-minus:before{content:"\f17e4"}.mdi-battery-minus-outline:before{content:"\f17e5"}.mdi-battery-minus-variant:before{content:"\f008c"}.mdi-battery-negative:before{content:"\f008d"}.mdi-battery-off:before{content:"\f125d"}.mdi-battery-off-outline:before{content:"\f125e"}.mdi-battery-outline:before{content:"\f008e"}.mdi-battery-plus:before{content:"\f17e6"}.mdi-battery-plus-outline:before{content:"\f17e7"}.mdi-battery-plus-variant:before{content:"\f008f"}.mdi-battery-positive:before{content:"\f0090"}.mdi-battery-remove:before{content:"\f17e8"}.mdi-battery-remove-outline:before{content:"\f17e9"}.mdi-battery-sync:before{content:"\f1834"}.mdi-battery-sync-outline:before{content:"\f1835"}.mdi-battery-unknown:before{content:"\f0091"}.mdi-battery-unknown-bluetooth:before{content:"\f094a"}.mdi-beach:before{content:"\f0092"}.mdi-beaker:before{content:"\f0cea"}.mdi-beaker-alert:before{content:"\f1229"}.mdi-beaker-alert-outline:before{content:"\f122a"}.mdi-beaker-check:before{content:"\f122b"}.mdi-beaker-check-outline:before{content:"\f122c"}.mdi-beaker-minus:before{content:"\f122d"}.mdi-beaker-minus-outline:before{content:"\f122e"}.mdi-beaker-outline:before{content:"\f0690"}.mdi-beaker-plus:before{content:"\f122f"}.mdi-beaker-plus-outline:before{content:"\f1230"}.mdi-beaker-question:before{content:"\f1231"}.mdi-beaker-question-outline:before{content:"\f1232"}.mdi-beaker-remove:before{content:"\f1233"}.mdi-beaker-remove-outline:before{content:"\f1234"}.mdi-bed:before{content:"\f02e3"}.mdi-bed-clock:before{content:"\f1b94"}.mdi-bed-double:before{content:"\f0fd4"}.mdi-bed-double-outline:before{content:"\f0fd3"}.mdi-bed-empty:before{content:"\f08a0"}.mdi-bed-king:before{content:"\f0fd2"}.mdi-bed-king-outline:before{content:"\f0fd1"}.mdi-bed-outline:before{content:"\f0099"}.mdi-bed-queen:before{content:"\f0fd0"}.mdi-bed-queen-outline:before{content:"\f0fdb"}.mdi-bed-single:before{content:"\f106d"}.mdi-bed-single-outline:before{content:"\f106e"}.mdi-bee:before{content:"\f0fa1"}.mdi-bee-flower:before{content:"\f0fa2"}.mdi-beehive-off-outline:before{content:"\f13ed"}.mdi-beehive-outline:before{content:"\f10ce"}.mdi-beekeeper:before{content:"\f14e2"}.mdi-beer:before{content:"\f0098"}.mdi-beer-outline:before{content:"\f130c"}.mdi-bell:before{content:"\f009a"}.mdi-bell-alert:before{content:"\f0d59"}.mdi-bell-alert-outline:before{content:"\f0e81"}.mdi-bell-badge:before{content:"\f116b"}.mdi-bell-badge-outline:before{content:"\f0178"}.mdi-bell-cancel:before{content:"\f13e7"}.mdi-bell-cancel-outline:before{content:"\f13e8"}.mdi-bell-check:before{content:"\f11e5"}.mdi-bell-check-outline:before{content:"\f11e6"}.mdi-bell-circle:before{content:"\f0d5a"}.mdi-bell-circle-outline:before{content:"\f0d5b"}.mdi-bell-cog:before{content:"\f1a29"}.mdi-bell-cog-outline:before{content:"\f1a2a"}.mdi-bell-minus:before{content:"\f13e9"}.mdi-bell-minus-outline:before{content:"\f13ea"}.mdi-bell-off:before{content:"\f009b"}.mdi-bell-off-outline:before{content:"\f0a91"}.mdi-bell-outline:before{content:"\f009c"}.mdi-bell-plus:before{content:"\f009d"}.mdi-bell-plus-outline:before{content:"\f0a92"}.mdi-bell-remove:before{content:"\f13eb"}.mdi-bell-remove-outline:before{content:"\f13ec"}.mdi-bell-ring:before{content:"\f009e"}.mdi-bell-ring-outline:before{content:"\f009f"}.mdi-bell-sleep:before{content:"\f00a0"}.mdi-bell-sleep-outline:before{content:"\f0a93"}.mdi-bench:before{content:"\f1c21"}.mdi-bench-back:before{content:"\f1c22"}.mdi-beta:before{content:"\f00a1"}.mdi-betamax:before{content:"\f09cb"}.mdi-biathlon:before{content:"\f0e14"}.mdi-bicycle:before{content:"\f109c"}.mdi-bicycle-basket:before{content:"\f1235"}.mdi-bicycle-cargo:before{content:"\f189c"}.mdi-bicycle-electric:before{content:"\f15b4"}.mdi-bicycle-penny-farthing:before{content:"\f15e9"}.mdi-bike:before{content:"\f00a3"}.mdi-bike-fast:before{content:"\f111f"}.mdi-bike-pedal:before{content:"\f1c23"}.mdi-bike-pedal-clipless:before{content:"\f1c24"}.mdi-bike-pedal-mountain:before{content:"\f1c25"}.mdi-billboard:before{content:"\f1010"}.mdi-billiards:before{content:"\f0b61"}.mdi-billiards-rack:before{content:"\f0b62"}.mdi-binoculars:before{content:"\f00a5"}.mdi-bio:before{content:"\f00a6"}.mdi-biohazard:before{content:"\f00a7"}.mdi-bird:before{content:"\f15c6"}.mdi-bitbucket:before{content:"\f00a8"}.mdi-bitcoin:before{content:"\f0813"}.mdi-black-mesa:before{content:"\f00a9"}.mdi-blender:before{content:"\f0ceb"}.mdi-blender-outline:before{content:"\f181a"}.mdi-blender-software:before{content:"\f00ab"}.mdi-blinds:before{content:"\f00ac"}.mdi-blinds-horizontal:before{content:"\f1a2b"}.mdi-blinds-horizontal-closed:before{content:"\f1a2c"}.mdi-blinds-open:before{content:"\f1011"}.mdi-blinds-vertical:before{content:"\f1a2d"}.mdi-blinds-vertical-closed:before{content:"\f1a2e"}.mdi-block-helper:before{content:"\f00ad"}.mdi-blood-bag:before{content:"\f0cec"}.mdi-bluetooth:before{content:"\f00af"}.mdi-bluetooth-audio:before{content:"\f00b0"}.mdi-bluetooth-connect:before{content:"\f00b1"}.mdi-bluetooth-off:before{content:"\f00b2"}.mdi-bluetooth-settings:before{content:"\f00b3"}.mdi-bluetooth-transfer:before{content:"\f00b4"}.mdi-blur:before{content:"\f00b5"}.mdi-blur-linear:before{content:"\f00b6"}.mdi-blur-off:before{content:"\f00b7"}.mdi-blur-radial:before{content:"\f00b8"}.mdi-bolt:before{content:"\f0db3"}.mdi-bomb:before{content:"\f0691"}.mdi-bomb-off:before{content:"\f06c5"}.mdi-bone:before{content:"\f00b9"}.mdi-bone-off:before{content:"\f19e0"}.mdi-book:before{content:"\f00ba"}.mdi-book-account:before{content:"\f13ad"}.mdi-book-account-outline:before{content:"\f13ae"}.mdi-book-alert:before{content:"\f167c"}.mdi-book-alert-outline:before{content:"\f167d"}.mdi-book-alphabet:before{content:"\f061d"}.mdi-book-arrow-down:before{content:"\f167e"}.mdi-book-arrow-down-outline:before{content:"\f167f"}.mdi-book-arrow-left:before{content:"\f1680"}.mdi-book-arrow-left-outline:before{content:"\f1681"}.mdi-book-arrow-right:before{content:"\f1682"}.mdi-book-arrow-right-outline:before{content:"\f1683"}.mdi-book-arrow-up:before{content:"\f1684"}.mdi-book-arrow-up-outline:before{content:"\f1685"}.mdi-book-cancel:before{content:"\f1686"}.mdi-book-cancel-outline:before{content:"\f1687"}.mdi-book-check:before{content:"\f14f3"}.mdi-book-check-outline:before{content:"\f14f4"}.mdi-book-clock:before{content:"\f1688"}.mdi-book-clock-outline:before{content:"\f1689"}.mdi-book-cog:before{content:"\f168a"}.mdi-book-cog-outline:before{content:"\f168b"}.mdi-book-cross:before{content:"\f00a2"}.mdi-book-edit:before{content:"\f168c"}.mdi-book-edit-outline:before{content:"\f168d"}.mdi-book-education:before{content:"\f16c9"}.mdi-book-education-outline:before{content:"\f16ca"}.mdi-book-heart:before{content:"\f1a1d"}.mdi-book-heart-outline:before{content:"\f1a1e"}.mdi-book-information-variant:before{content:"\f106f"}.mdi-book-lock:before{content:"\f079a"}.mdi-book-lock-open:before{content:"\f079b"}.mdi-book-lock-open-outline:before{content:"\f168e"}.mdi-book-lock-outline:before{content:"\f168f"}.mdi-book-marker:before{content:"\f1690"}.mdi-book-marker-outline:before{content:"\f1691"}.mdi-book-minus:before{content:"\f05d9"}.mdi-book-minus-multiple:before{content:"\f0a94"}.mdi-book-minus-multiple-outline:before{content:"\f090b"}.mdi-book-minus-outline:before{content:"\f1692"}.mdi-book-multiple:before{content:"\f00bb"}.mdi-book-multiple-outline:before{content:"\f0436"}.mdi-book-music:before{content:"\f0067"}.mdi-book-music-outline:before{content:"\f1693"}.mdi-book-off:before{content:"\f1694"}.mdi-book-off-outline:before{content:"\f1695"}.mdi-book-open:before{content:"\f00bd"}.mdi-book-open-blank-variant:before{content:"\f00be"}.mdi-book-open-blank-variant-outline:before{content:"\f1ccb"}.mdi-book-open-outline:before{content:"\f0b63"}.mdi-book-open-page-variant:before{content:"\f05da"}.mdi-book-open-page-variant-outline:before{content:"\f15d6"}.mdi-book-open-variant:before{content:"\f14f7"}.mdi-book-open-variant-outline:before{content:"\f1ccc"}.mdi-book-outline:before{content:"\f0b64"}.mdi-book-play:before{content:"\f0e82"}.mdi-book-play-outline:before{content:"\f0e83"}.mdi-book-plus:before{content:"\f05db"}.mdi-book-plus-multiple:before{content:"\f0a95"}.mdi-book-plus-multiple-outline:before{content:"\f0ade"}.mdi-book-plus-outline:before{content:"\f1696"}.mdi-book-refresh:before{content:"\f1697"}.mdi-book-refresh-outline:before{content:"\f1698"}.mdi-book-remove:before{content:"\f0a97"}.mdi-book-remove-multiple:before{content:"\f0a96"}.mdi-book-remove-multiple-outline:before{content:"\f04ca"}.mdi-book-remove-outline:before{content:"\f1699"}.mdi-book-search:before{content:"\f0e84"}.mdi-book-search-outline:before{content:"\f0e85"}.mdi-book-settings:before{content:"\f169a"}.mdi-book-settings-outline:before{content:"\f169b"}.mdi-book-sync:before{content:"\f169c"}.mdi-book-sync-outline:before{content:"\f16c8"}.mdi-book-variant:before{content:"\f00bf"}.mdi-bookmark:before{content:"\f00c0"}.mdi-bookmark-box:before{content:"\f1b75"}.mdi-bookmark-box-multiple:before{content:"\f196c"}.mdi-bookmark-box-multiple-outline:before{content:"\f196d"}.mdi-bookmark-box-outline:before{content:"\f1b76"}.mdi-bookmark-check:before{content:"\f00c1"}.mdi-bookmark-check-outline:before{content:"\f137b"}.mdi-bookmark-minus:before{content:"\f09cc"}.mdi-bookmark-minus-outline:before{content:"\f09cd"}.mdi-bookmark-multiple:before{content:"\f0e15"}.mdi-bookmark-multiple-outline:before{content:"\f0e16"}.mdi-bookmark-music:before{content:"\f00c2"}.mdi-bookmark-music-outline:before{content:"\f1379"}.mdi-bookmark-off:before{content:"\f09ce"}.mdi-bookmark-off-outline:before{content:"\f09cf"}.mdi-bookmark-outline:before{content:"\f00c3"}.mdi-bookmark-plus:before{content:"\f00c5"}.mdi-bookmark-plus-outline:before{content:"\f00c4"}.mdi-bookmark-remove:before{content:"\f00c6"}.mdi-bookmark-remove-outline:before{content:"\f137a"}.mdi-bookshelf:before{content:"\f125f"}.mdi-boom-gate:before{content:"\f0e86"}.mdi-boom-gate-alert:before{content:"\f0e87"}.mdi-boom-gate-alert-outline:before{content:"\f0e88"}.mdi-boom-gate-arrow-down:before{content:"\f0e89"}.mdi-boom-gate-arrow-down-outline:before{content:"\f0e8a"}.mdi-boom-gate-arrow-up:before{content:"\f0e8c"}.mdi-boom-gate-arrow-up-outline:before{content:"\f0e8d"}.mdi-boom-gate-outline:before{content:"\f0e8b"}.mdi-boom-gate-up:before{content:"\f17f9"}.mdi-boom-gate-up-outline:before{content:"\f17fa"}.mdi-boombox:before{content:"\f05dc"}.mdi-boomerang:before{content:"\f10cf"}.mdi-bootstrap:before{content:"\f06c6"}.mdi-border-all:before{content:"\f00c7"}.mdi-border-all-variant:before{content:"\f08a1"}.mdi-border-bottom:before{content:"\f00c8"}.mdi-border-bottom-variant:before{content:"\f08a2"}.mdi-border-color:before{content:"\f00c9"}.mdi-border-horizontal:before{content:"\f00ca"}.mdi-border-inside:before{content:"\f00cb"}.mdi-border-left:before{content:"\f00cc"}.mdi-border-left-variant:before{content:"\f08a3"}.mdi-border-none:before{content:"\f00cd"}.mdi-border-none-variant:before{content:"\f08a4"}.mdi-border-outside:before{content:"\f00ce"}.mdi-border-radius:before{content:"\f1af4"}.mdi-border-right:before{content:"\f00cf"}.mdi-border-right-variant:before{content:"\f08a5"}.mdi-border-style:before{content:"\f00d0"}.mdi-border-top:before{content:"\f00d1"}.mdi-border-top-variant:before{content:"\f08a6"}.mdi-border-vertical:before{content:"\f00d2"}.mdi-bottle-soda:before{content:"\f1070"}.mdi-bottle-soda-classic:before{content:"\f1071"}.mdi-bottle-soda-classic-outline:before{content:"\f1363"}.mdi-bottle-soda-outline:before{content:"\f1072"}.mdi-bottle-tonic:before{content:"\f112e"}.mdi-bottle-tonic-outline:before{content:"\f112f"}.mdi-bottle-tonic-plus:before{content:"\f1130"}.mdi-bottle-tonic-plus-outline:before{content:"\f1131"}.mdi-bottle-tonic-skull:before{content:"\f1132"}.mdi-bottle-tonic-skull-outline:before{content:"\f1133"}.mdi-bottle-wine:before{content:"\f0854"}.mdi-bottle-wine-outline:before{content:"\f1310"}.mdi-bow-arrow:before{content:"\f1841"}.mdi-bow-tie:before{content:"\f0678"}.mdi-bowl:before{content:"\f028e"}.mdi-bowl-mix:before{content:"\f0617"}.mdi-bowl-mix-outline:before{content:"\f02e4"}.mdi-bowl-outline:before{content:"\f02a9"}.mdi-bowling:before{content:"\f00d3"}.mdi-box:before{content:"\f00d4"}.mdi-box-cutter:before{content:"\f00d5"}.mdi-box-cutter-off:before{content:"\f0b4a"}.mdi-box-shadow:before{content:"\f0637"}.mdi-boxing-glove:before{content:"\f0b65"}.mdi-braille:before{content:"\f09d0"}.mdi-brain:before{content:"\f09d1"}.mdi-bread-slice:before{content:"\f0cee"}.mdi-bread-slice-outline:before{content:"\f0cef"}.mdi-bridge:before{content:"\f0618"}.mdi-briefcase:before{content:"\f00d6"}.mdi-briefcase-account:before{content:"\f0cf0"}.mdi-briefcase-account-outline:before{content:"\f0cf1"}.mdi-briefcase-arrow-left-right:before{content:"\f1a8d"}.mdi-briefcase-arrow-left-right-outline:before{content:"\f1a8e"}.mdi-briefcase-arrow-up-down:before{content:"\f1a8f"}.mdi-briefcase-arrow-up-down-outline:before{content:"\f1a90"}.mdi-briefcase-check:before{content:"\f00d7"}.mdi-briefcase-check-outline:before{content:"\f131e"}.mdi-briefcase-clock:before{content:"\f10d0"}.mdi-briefcase-clock-outline:before{content:"\f10d1"}.mdi-briefcase-download:before{content:"\f00d8"}.mdi-briefcase-download-outline:before{content:"\f0c3d"}.mdi-briefcase-edit:before{content:"\f0a98"}.mdi-briefcase-edit-outline:before{content:"\f0c3e"}.mdi-briefcase-eye:before{content:"\f17d9"}.mdi-briefcase-eye-outline:before{content:"\f17da"}.mdi-briefcase-minus:before{content:"\f0a2a"}.mdi-briefcase-minus-outline:before{content:"\f0c3f"}.mdi-briefcase-off:before{content:"\f1658"}.mdi-briefcase-off-outline:before{content:"\f1659"}.mdi-briefcase-outline:before{content:"\f0814"}.mdi-briefcase-plus:before{content:"\f0a2b"}.mdi-briefcase-plus-outline:before{content:"\f0c40"}.mdi-briefcase-remove:before{content:"\f0a2c"}.mdi-briefcase-remove-outline:before{content:"\f0c41"}.mdi-briefcase-search:before{content:"\f0a2d"}.mdi-briefcase-search-outline:before{content:"\f0c42"}.mdi-briefcase-upload:before{content:"\f00d9"}.mdi-briefcase-upload-outline:before{content:"\f0c43"}.mdi-briefcase-variant:before{content:"\f1494"}.mdi-briefcase-variant-off:before{content:"\f165a"}.mdi-briefcase-variant-off-outline:before{content:"\f165b"}.mdi-briefcase-variant-outline:before{content:"\f1495"}.mdi-brightness-1:before{content:"\f00da"}.mdi-brightness-2:before{content:"\f00db"}.mdi-brightness-3:before{content:"\f00dc"}.mdi-brightness-4:before{content:"\f00dd"}.mdi-brightness-5:before{content:"\f00de"}.mdi-brightness-6:before{content:"\f00df"}.mdi-brightness-7:before{content:"\f00e0"}.mdi-brightness-auto:before{content:"\f00e1"}.mdi-brightness-percent:before{content:"\f0cf2"}.mdi-broadcast:before{content:"\f1720"}.mdi-broadcast-off:before{content:"\f1721"}.mdi-broom:before{content:"\f00e2"}.mdi-brush:before{content:"\f00e3"}.mdi-brush-off:before{content:"\f1771"}.mdi-brush-outline:before{content:"\f1a0d"}.mdi-brush-variant:before{content:"\f1813"}.mdi-bucket:before{content:"\f1415"}.mdi-bucket-outline:before{content:"\f1416"}.mdi-buffet:before{content:"\f0578"}.mdi-bug:before{content:"\f00e4"}.mdi-bug-check:before{content:"\f0a2e"}.mdi-bug-check-outline:before{content:"\f0a2f"}.mdi-bug-outline:before{content:"\f0a30"}.mdi-bug-pause:before{content:"\f1af5"}.mdi-bug-pause-outline:before{content:"\f1af6"}.mdi-bug-play:before{content:"\f1af7"}.mdi-bug-play-outline:before{content:"\f1af8"}.mdi-bug-stop:before{content:"\f1af9"}.mdi-bug-stop-outline:before{content:"\f1afa"}.mdi-bugle:before{content:"\f0db4"}.mdi-bulkhead-light:before{content:"\f1a2f"}.mdi-bulldozer:before{content:"\f0b22"}.mdi-bullet:before{content:"\f0cf3"}.mdi-bulletin-board:before{content:"\f00e5"}.mdi-bullhorn:before{content:"\f00e6"}.mdi-bullhorn-outline:before{content:"\f0b23"}.mdi-bullhorn-variant:before{content:"\f196e"}.mdi-bullhorn-variant-outline:before{content:"\f196f"}.mdi-bullseye:before{content:"\f05dd"}.mdi-bullseye-arrow:before{content:"\f08c9"}.mdi-bulma:before{content:"\f12e7"}.mdi-bunk-bed:before{content:"\f1302"}.mdi-bunk-bed-outline:before{content:"\f0097"}.mdi-bus:before{content:"\f00e7"}.mdi-bus-alert:before{content:"\f0a99"}.mdi-bus-articulated-end:before{content:"\f079c"}.mdi-bus-articulated-front:before{content:"\f079d"}.mdi-bus-clock:before{content:"\f08ca"}.mdi-bus-double-decker:before{content:"\f079e"}.mdi-bus-electric:before{content:"\f191d"}.mdi-bus-marker:before{content:"\f1212"}.mdi-bus-multiple:before{content:"\f0f3f"}.mdi-bus-school:before{content:"\f079f"}.mdi-bus-side:before{content:"\f07a0"}.mdi-bus-sign:before{content:"\f1cc1"}.mdi-bus-stop:before{content:"\f1012"}.mdi-bus-stop-covered:before{content:"\f1013"}.mdi-bus-stop-uncovered:before{content:"\f1014"}.mdi-bus-wrench:before{content:"\f1cc2"}.mdi-butterfly:before{content:"\f1589"}.mdi-butterfly-outline:before{content:"\f158a"}.mdi-button-cursor:before{content:"\f1b4f"}.mdi-button-pointer:before{content:"\f1b50"}.mdi-cabin-a-frame:before{content:"\f188c"}.mdi-cable-data:before{content:"\f1394"}.mdi-cached:before{content:"\f00e8"}.mdi-cactus:before{content:"\f0db5"}.mdi-cake:before{content:"\f00e9"}.mdi-cake-layered:before{content:"\f00ea"}.mdi-cake-variant:before{content:"\f00eb"}.mdi-cake-variant-outline:before{content:"\f17f0"}.mdi-calculator:before{content:"\f00ec"}.mdi-calculator-variant:before{content:"\f0a9a"}.mdi-calculator-variant-outline:before{content:"\f15a6"}.mdi-calendar:before{content:"\f00ed"}.mdi-calendar-account:before{content:"\f0ed7"}.mdi-calendar-account-outline:before{content:"\f0ed8"}.mdi-calendar-alert:before{content:"\f0a31"}.mdi-calendar-alert-outline:before{content:"\f1b62"}.mdi-calendar-arrow-left:before{content:"\f1134"}.mdi-calendar-arrow-right:before{content:"\f1135"}.mdi-calendar-badge:before{content:"\f1b9d"}.mdi-calendar-badge-outline:before{content:"\f1b9e"}.mdi-calendar-blank:before{content:"\f00ee"}.mdi-calendar-blank-multiple:before{content:"\f1073"}.mdi-calendar-blank-outline:before{content:"\f0b66"}.mdi-calendar-check:before{content:"\f00ef"}.mdi-calendar-check-outline:before{content:"\f0c44"}.mdi-calendar-clock:before{content:"\f00f0"}.mdi-calendar-clock-outline:before{content:"\f16e1"}.mdi-calendar-collapse-horizontal:before{content:"\f189d"}.mdi-calendar-collapse-horizontal-outline:before{content:"\f1b63"}.mdi-calendar-cursor:before{content:"\f157b"}.mdi-calendar-cursor-outline:before{content:"\f1b64"}.mdi-calendar-edit:before{content:"\f08a7"}.mdi-calendar-edit-outline:before{content:"\f1b65"}.mdi-calendar-end:before{content:"\f166c"}.mdi-calendar-end-outline:before{content:"\f1b66"}.mdi-calendar-expand-horizontal:before{content:"\f189e"}.mdi-calendar-expand-horizontal-outline:before{content:"\f1b67"}.mdi-calendar-export:before{content:"\f0b24"}.mdi-calendar-export-outline:before{content:"\f1b68"}.mdi-calendar-filter:before{content:"\f1a32"}.mdi-calendar-filter-outline:before{content:"\f1a33"}.mdi-calendar-heart:before{content:"\f09d2"}.mdi-calendar-heart-outline:before{content:"\f1b69"}.mdi-calendar-import:before{content:"\f0b25"}.mdi-calendar-import-outline:before{content:"\f1b6a"}.mdi-calendar-lock:before{content:"\f1641"}.mdi-calendar-lock-open:before{content:"\f1b5b"}.mdi-calendar-lock-open-outline:before{content:"\f1b5c"}.mdi-calendar-lock-outline:before{content:"\f1642"}.mdi-calendar-minus:before{content:"\f0d5c"}.mdi-calendar-minus-outline:before{content:"\f1b6b"}.mdi-calendar-month:before{content:"\f0e17"}.mdi-calendar-month-outline:before{content:"\f0e18"}.mdi-calendar-multiple:before{content:"\f00f1"}.mdi-calendar-multiple-check:before{content:"\f00f2"}.mdi-calendar-multiselect:before{content:"\f0a32"}.mdi-calendar-multiselect-outline:before{content:"\f1b55"}.mdi-calendar-outline:before{content:"\f0b67"}.mdi-calendar-plus:before{content:"\f00f3"}.mdi-calendar-plus-outline:before{content:"\f1b6c"}.mdi-calendar-question:before{content:"\f0692"}.mdi-calendar-question-outline:before{content:"\f1b6d"}.mdi-calendar-range:before{content:"\f0679"}.mdi-calendar-range-outline:before{content:"\f0b68"}.mdi-calendar-refresh:before{content:"\f01e1"}.mdi-calendar-refresh-outline:before{content:"\f0203"}.mdi-calendar-remove:before{content:"\f00f4"}.mdi-calendar-remove-outline:before{content:"\f0c45"}.mdi-calendar-search:before{content:"\f094c"}.mdi-calendar-search-outline:before{content:"\f1b6e"}.mdi-calendar-star:before{content:"\f09d3"}.mdi-calendar-star-four-points:before{content:"\f1c1f"}.mdi-calendar-star-outline:before{content:"\f1b53"}.mdi-calendar-start:before{content:"\f166d"}.mdi-calendar-start-outline:before{content:"\f1b6f"}.mdi-calendar-sync:before{content:"\f0e8e"}.mdi-calendar-sync-outline:before{content:"\f0e8f"}.mdi-calendar-text:before{content:"\f00f5"}.mdi-calendar-text-outline:before{content:"\f0c46"}.mdi-calendar-today:before{content:"\f00f6"}.mdi-calendar-today-outline:before{content:"\f1a30"}.mdi-calendar-week:before{content:"\f0a33"}.mdi-calendar-week-begin:before{content:"\f0a34"}.mdi-calendar-week-begin-outline:before{content:"\f1a31"}.mdi-calendar-week-outline:before{content:"\f1a34"}.mdi-calendar-weekend:before{content:"\f0ed9"}.mdi-calendar-weekend-outline:before{content:"\f0eda"}.mdi-call-made:before{content:"\f00f7"}.mdi-call-merge:before{content:"\f00f8"}.mdi-call-missed:before{content:"\f00f9"}.mdi-call-received:before{content:"\f00fa"}.mdi-call-split:before{content:"\f00fb"}.mdi-camcorder:before{content:"\f00fc"}.mdi-camcorder-off:before{content:"\f00ff"}.mdi-camera:before{content:"\f0100"}.mdi-camera-account:before{content:"\f08cb"}.mdi-camera-burst:before{content:"\f0693"}.mdi-camera-control:before{content:"\f0b69"}.mdi-camera-document:before{content:"\f1871"}.mdi-camera-document-off:before{content:"\f1872"}.mdi-camera-enhance:before{content:"\f0101"}.mdi-camera-enhance-outline:before{content:"\f0b6a"}.mdi-camera-flip:before{content:"\f15d9"}.mdi-camera-flip-outline:before{content:"\f15da"}.mdi-camera-front:before{content:"\f0102"}.mdi-camera-front-variant:before{content:"\f0103"}.mdi-camera-gopro:before{content:"\f07a1"}.mdi-camera-image:before{content:"\f08cc"}.mdi-camera-iris:before{content:"\f0104"}.mdi-camera-lock:before{content:"\f1a14"}.mdi-camera-lock-open:before{content:"\f1c0d"}.mdi-camera-lock-open-outline:before{content:"\f1c0e"}.mdi-camera-lock-outline:before{content:"\f1a15"}.mdi-camera-marker:before{content:"\f19a7"}.mdi-camera-marker-outline:before{content:"\f19a8"}.mdi-camera-metering-center:before{content:"\f07a2"}.mdi-camera-metering-matrix:before{content:"\f07a3"}.mdi-camera-metering-partial:before{content:"\f07a4"}.mdi-camera-metering-spot:before{content:"\f07a5"}.mdi-camera-off:before{content:"\f05df"}.mdi-camera-off-outline:before{content:"\f19bf"}.mdi-camera-outline:before{content:"\f0d5d"}.mdi-camera-party-mode:before{content:"\f0105"}.mdi-camera-plus:before{content:"\f0edb"}.mdi-camera-plus-outline:before{content:"\f0edc"}.mdi-camera-rear:before{content:"\f0106"}.mdi-camera-rear-variant:before{content:"\f0107"}.mdi-camera-retake:before{content:"\f0e19"}.mdi-camera-retake-outline:before{content:"\f0e1a"}.mdi-camera-switch:before{content:"\f0108"}.mdi-camera-switch-outline:before{content:"\f084a"}.mdi-camera-timer:before{content:"\f0109"}.mdi-camera-wireless:before{content:"\f0db6"}.mdi-camera-wireless-outline:before{content:"\f0db7"}.mdi-campfire:before{content:"\f0edd"}.mdi-cancel:before{content:"\f073a"}.mdi-candelabra:before{content:"\f17d2"}.mdi-candelabra-fire:before{content:"\f17d3"}.mdi-candle:before{content:"\f05e2"}.mdi-candy:before{content:"\f1970"}.mdi-candy-off:before{content:"\f1971"}.mdi-candy-off-outline:before{content:"\f1972"}.mdi-candy-outline:before{content:"\f1973"}.mdi-candycane:before{content:"\f010a"}.mdi-cannabis:before{content:"\f07a6"}.mdi-cannabis-off:before{content:"\f166e"}.mdi-caps-lock:before{content:"\f0a9b"}.mdi-car:before{content:"\f010b"}.mdi-car-2-plus:before{content:"\f1015"}.mdi-car-3-plus:before{content:"\f1016"}.mdi-car-arrow-left:before{content:"\f13b2"}.mdi-car-arrow-right:before{content:"\f13b3"}.mdi-car-back:before{content:"\f0e1b"}.mdi-car-battery:before{content:"\f010c"}.mdi-car-brake-abs:before{content:"\f0c47"}.mdi-car-brake-alert:before{content:"\f0c48"}.mdi-car-brake-fluid-level:before{content:"\f1909"}.mdi-car-brake-hold:before{content:"\f0d5e"}.mdi-car-brake-low-pressure:before{content:"\f190a"}.mdi-car-brake-parking:before{content:"\f0d5f"}.mdi-car-brake-retarder:before{content:"\f1017"}.mdi-car-brake-temperature:before{content:"\f190b"}.mdi-car-brake-worn-linings:before{content:"\f190c"}.mdi-car-child-seat:before{content:"\f0fa3"}.mdi-car-clock:before{content:"\f1974"}.mdi-car-clutch:before{content:"\f1018"}.mdi-car-cog:before{content:"\f13cc"}.mdi-car-connected:before{content:"\f010d"}.mdi-car-convertible:before{content:"\f07a7"}.mdi-car-coolant-level:before{content:"\f1019"}.mdi-car-cruise-control:before{content:"\f0d60"}.mdi-car-defrost-front:before{content:"\f0d61"}.mdi-car-defrost-rear:before{content:"\f0d62"}.mdi-car-door:before{content:"\f0b6b"}.mdi-car-door-lock:before{content:"\f109d"}.mdi-car-door-lock-open:before{content:"\f1c81"}.mdi-car-electric:before{content:"\f0b6c"}.mdi-car-electric-outline:before{content:"\f15b5"}.mdi-car-emergency:before{content:"\f160f"}.mdi-car-esp:before{content:"\f0c49"}.mdi-car-estate:before{content:"\f07a8"}.mdi-car-hatchback:before{content:"\f07a9"}.mdi-car-info:before{content:"\f11be"}.mdi-car-key:before{content:"\f0b6d"}.mdi-car-lifted-pickup:before{content:"\f152d"}.mdi-car-light-alert:before{content:"\f190d"}.mdi-car-light-dimmed:before{content:"\f0c4a"}.mdi-car-light-fog:before{content:"\f0c4b"}.mdi-car-light-high:before{content:"\f0c4c"}.mdi-car-limousine:before{content:"\f08cd"}.mdi-car-multiple:before{content:"\f0b6e"}.mdi-car-off:before{content:"\f0e1c"}.mdi-car-outline:before{content:"\f14ed"}.mdi-car-parking-lights:before{content:"\f0d63"}.mdi-car-pickup:before{content:"\f07aa"}.mdi-car-search:before{content:"\f1b8d"}.mdi-car-search-outline:before{content:"\f1b8e"}.mdi-car-seat:before{content:"\f0fa4"}.mdi-car-seat-cooler:before{content:"\f0fa5"}.mdi-car-seat-heater:before{content:"\f0fa6"}.mdi-car-select:before{content:"\f1879"}.mdi-car-settings:before{content:"\f13cd"}.mdi-car-shift-pattern:before{content:"\f0f40"}.mdi-car-side:before{content:"\f07ab"}.mdi-car-speed-limiter:before{content:"\f190e"}.mdi-car-sports:before{content:"\f07ac"}.mdi-car-tire-alert:before{content:"\f0c4d"}.mdi-car-traction-control:before{content:"\f0d64"}.mdi-car-turbocharger:before{content:"\f101a"}.mdi-car-wash:before{content:"\f010e"}.mdi-car-windshield:before{content:"\f101b"}.mdi-car-windshield-outline:before{content:"\f101c"}.mdi-car-wireless:before{content:"\f1878"}.mdi-car-wrench:before{content:"\f1814"}.mdi-carabiner:before{content:"\f14c0"}.mdi-caravan:before{content:"\f07ad"}.mdi-card:before{content:"\f0b6f"}.mdi-card-account-details:before{content:"\f05d2"}.mdi-card-account-details-outline:before{content:"\f0dab"}.mdi-card-account-details-star:before{content:"\f02a3"}.mdi-card-account-details-star-outline:before{content:"\f06db"}.mdi-card-account-mail:before{content:"\f018e"}.mdi-card-account-mail-outline:before{content:"\f0e98"}.mdi-card-account-phone:before{content:"\f0e99"}.mdi-card-account-phone-outline:before{content:"\f0e9a"}.mdi-card-bulleted:before{content:"\f0b70"}.mdi-card-bulleted-off:before{content:"\f0b71"}.mdi-card-bulleted-off-outline:before{content:"\f0b72"}.mdi-card-bulleted-outline:before{content:"\f0b73"}.mdi-card-bulleted-settings:before{content:"\f0b74"}.mdi-card-bulleted-settings-outline:before{content:"\f0b75"}.mdi-card-minus:before{content:"\f1600"}.mdi-card-minus-outline:before{content:"\f1601"}.mdi-card-multiple:before{content:"\f17f1"}.mdi-card-multiple-outline:before{content:"\f17f2"}.mdi-card-off:before{content:"\f1602"}.mdi-card-off-outline:before{content:"\f1603"}.mdi-card-outline:before{content:"\f0b76"}.mdi-card-plus:before{content:"\f11ff"}.mdi-card-plus-outline:before{content:"\f1200"}.mdi-card-remove:before{content:"\f1604"}.mdi-card-remove-outline:before{content:"\f1605"}.mdi-card-search:before{content:"\f1074"}.mdi-card-search-outline:before{content:"\f1075"}.mdi-card-text:before{content:"\f0b77"}.mdi-card-text-outline:before{content:"\f0b78"}.mdi-cards:before{content:"\f0638"}.mdi-cards-club:before{content:"\f08ce"}.mdi-cards-club-outline:before{content:"\f189f"}.mdi-cards-diamond:before{content:"\f08cf"}.mdi-cards-diamond-outline:before{content:"\f101d"}.mdi-cards-heart:before{content:"\f08d0"}.mdi-cards-heart-outline:before{content:"\f18a0"}.mdi-cards-outline:before{content:"\f0639"}.mdi-cards-playing:before{content:"\f18a1"}.mdi-cards-playing-club:before{content:"\f18a2"}.mdi-cards-playing-club-multiple:before{content:"\f18a3"}.mdi-cards-playing-club-multiple-outline:before{content:"\f18a4"}.mdi-cards-playing-club-outline:before{content:"\f18a5"}.mdi-cards-playing-diamond:before{content:"\f18a6"}.mdi-cards-playing-diamond-multiple:before{content:"\f18a7"}.mdi-cards-playing-diamond-multiple-outline:before{content:"\f18a8"}.mdi-cards-playing-diamond-outline:before{content:"\f18a9"}.mdi-cards-playing-heart:before{content:"\f18aa"}.mdi-cards-playing-heart-multiple:before{content:"\f18ab"}.mdi-cards-playing-heart-multiple-outline:before{content:"\f18ac"}.mdi-cards-playing-heart-outline:before{content:"\f18ad"}.mdi-cards-playing-outline:before{content:"\f063a"}.mdi-cards-playing-spade:before{content:"\f18ae"}.mdi-cards-playing-spade-multiple:before{content:"\f18af"}.mdi-cards-playing-spade-multiple-outline:before{content:"\f18b0"}.mdi-cards-playing-spade-outline:before{content:"\f18b1"}.mdi-cards-spade:before{content:"\f08d1"}.mdi-cards-spade-outline:before{content:"\f18b2"}.mdi-cards-variant:before{content:"\f06c7"}.mdi-carrot:before{content:"\f010f"}.mdi-cart:before{content:"\f0110"}.mdi-cart-arrow-down:before{content:"\f0d66"}.mdi-cart-arrow-right:before{content:"\f0c4e"}.mdi-cart-arrow-up:before{content:"\f0d67"}.mdi-cart-check:before{content:"\f15ea"}.mdi-cart-heart:before{content:"\f18e0"}.mdi-cart-minus:before{content:"\f0d68"}.mdi-cart-off:before{content:"\f066b"}.mdi-cart-outline:before{content:"\f0111"}.mdi-cart-percent:before{content:"\f1bae"}.mdi-cart-plus:before{content:"\f0112"}.mdi-cart-remove:before{content:"\f0d69"}.mdi-cart-variant:before{content:"\f15eb"}.mdi-case-sensitive-alt:before{content:"\f0113"}.mdi-cash:before{content:"\f0114"}.mdi-cash-100:before{content:"\f0115"}.mdi-cash-check:before{content:"\f14ee"}.mdi-cash-clock:before{content:"\f1a91"}.mdi-cash-edit:before{content:"\f1cab"}.mdi-cash-fast:before{content:"\f185c"}.mdi-cash-lock:before{content:"\f14ea"}.mdi-cash-lock-open:before{content:"\f14eb"}.mdi-cash-marker:before{content:"\f0db8"}.mdi-cash-minus:before{content:"\f1260"}.mdi-cash-multiple:before{content:"\f0116"}.mdi-cash-off:before{content:"\f1c79"}.mdi-cash-plus:before{content:"\f1261"}.mdi-cash-refund:before{content:"\f0a9c"}.mdi-cash-register:before{content:"\f0cf4"}.mdi-cash-remove:before{content:"\f1262"}.mdi-cash-sync:before{content:"\f1a92"}.mdi-cassette:before{content:"\f09d4"}.mdi-cast:before{content:"\f0118"}.mdi-cast-audio:before{content:"\f101e"}.mdi-cast-audio-variant:before{content:"\f1749"}.mdi-cast-connected:before{content:"\f0119"}.mdi-cast-education:before{content:"\f0e1d"}.mdi-cast-off:before{content:"\f078a"}.mdi-cast-variant:before{content:"\f001f"}.mdi-castle:before{content:"\f011a"}.mdi-cat:before{content:"\f011b"}.mdi-cctv:before{content:"\f07ae"}.mdi-cctv-off:before{content:"\f185f"}.mdi-ceiling-fan:before{content:"\f1797"}.mdi-ceiling-fan-light:before{content:"\f1798"}.mdi-ceiling-light:before{content:"\f0769"}.mdi-ceiling-light-multiple:before{content:"\f18dd"}.mdi-ceiling-light-multiple-outline:before{content:"\f18de"}.mdi-ceiling-light-outline:before{content:"\f17c7"}.mdi-cellphone:before{content:"\f011c"}.mdi-cellphone-arrow-down:before{content:"\f09d5"}.mdi-cellphone-arrow-down-variant:before{content:"\f19c5"}.mdi-cellphone-basic:before{content:"\f011e"}.mdi-cellphone-charging:before{content:"\f1397"}.mdi-cellphone-check:before{content:"\f17fd"}.mdi-cellphone-cog:before{content:"\f0951"}.mdi-cellphone-dock:before{content:"\f011f"}.mdi-cellphone-information:before{content:"\f0f41"}.mdi-cellphone-key:before{content:"\f094e"}.mdi-cellphone-link:before{content:"\f0121"}.mdi-cellphone-link-off:before{content:"\f0122"}.mdi-cellphone-lock:before{content:"\f094f"}.mdi-cellphone-marker:before{content:"\f183a"}.mdi-cellphone-message:before{content:"\f08d3"}.mdi-cellphone-message-off:before{content:"\f10d2"}.mdi-cellphone-nfc:before{content:"\f0e90"}.mdi-cellphone-nfc-off:before{content:"\f12d8"}.mdi-cellphone-off:before{content:"\f0950"}.mdi-cellphone-play:before{content:"\f101f"}.mdi-cellphone-remove:before{content:"\f094d"}.mdi-cellphone-screenshot:before{content:"\f0a35"}.mdi-cellphone-settings:before{content:"\f0123"}.mdi-cellphone-sound:before{content:"\f0952"}.mdi-cellphone-text:before{content:"\f08d2"}.mdi-cellphone-wireless:before{content:"\f0815"}.mdi-centos:before{content:"\f111a"}.mdi-certificate:before{content:"\f0124"}.mdi-certificate-outline:before{content:"\f1188"}.mdi-chair-rolling:before{content:"\f0f48"}.mdi-chair-school:before{content:"\f0125"}.mdi-chandelier:before{content:"\f1793"}.mdi-charity:before{content:"\f0c4f"}.mdi-charity-search:before{content:"\f1c82"}.mdi-chart-arc:before{content:"\f0126"}.mdi-chart-areaspline:before{content:"\f0127"}.mdi-chart-areaspline-variant:before{content:"\f0e91"}.mdi-chart-bar:before{content:"\f0128"}.mdi-chart-bar-stacked:before{content:"\f076a"}.mdi-chart-bell-curve:before{content:"\f0c50"}.mdi-chart-bell-curve-cumulative:before{content:"\f0fa7"}.mdi-chart-box:before{content:"\f154d"}.mdi-chart-box-multiple:before{content:"\f1ccd"}.mdi-chart-box-multiple-outline:before{content:"\f1cce"}.mdi-chart-box-outline:before{content:"\f154e"}.mdi-chart-box-plus-outline:before{content:"\f154f"}.mdi-chart-bubble:before{content:"\f05e3"}.mdi-chart-donut:before{content:"\f07af"}.mdi-chart-donut-variant:before{content:"\f07b0"}.mdi-chart-gantt:before{content:"\f066c"}.mdi-chart-histogram:before{content:"\f0129"}.mdi-chart-line:before{content:"\f012a"}.mdi-chart-line-stacked:before{content:"\f076b"}.mdi-chart-line-variant:before{content:"\f07b1"}.mdi-chart-multiline:before{content:"\f08d4"}.mdi-chart-multiple:before{content:"\f1213"}.mdi-chart-pie:before{content:"\f012b"}.mdi-chart-pie-outline:before{content:"\f1bdf"}.mdi-chart-ppf:before{content:"\f1380"}.mdi-chart-sankey:before{content:"\f11df"}.mdi-chart-sankey-variant:before{content:"\f11e0"}.mdi-chart-scatter-plot:before{content:"\f0e92"}.mdi-chart-scatter-plot-hexbin:before{content:"\f066d"}.mdi-chart-timeline:before{content:"\f066e"}.mdi-chart-timeline-variant:before{content:"\f0e93"}.mdi-chart-timeline-variant-shimmer:before{content:"\f15b6"}.mdi-chart-tree:before{content:"\f0e94"}.mdi-chart-waterfall:before{content:"\f1918"}.mdi-chat:before{content:"\f0b79"}.mdi-chat-alert:before{content:"\f0b7a"}.mdi-chat-alert-outline:before{content:"\f12c9"}.mdi-chat-minus:before{content:"\f1410"}.mdi-chat-minus-outline:before{content:"\f1413"}.mdi-chat-outline:before{content:"\f0ede"}.mdi-chat-plus:before{content:"\f140f"}.mdi-chat-plus-outline:before{content:"\f1412"}.mdi-chat-processing:before{content:"\f0b7b"}.mdi-chat-processing-outline:before{content:"\f12ca"}.mdi-chat-question:before{content:"\f1738"}.mdi-chat-question-outline:before{content:"\f1739"}.mdi-chat-remove:before{content:"\f1411"}.mdi-chat-remove-outline:before{content:"\f1414"}.mdi-chat-sleep:before{content:"\f12d1"}.mdi-chat-sleep-outline:before{content:"\f12d2"}.mdi-check:before{content:"\f012c"}.mdi-check-all:before{content:"\f012d"}.mdi-check-bold:before{content:"\f0e1e"}.mdi-check-circle:before{content:"\f05e0"}.mdi-check-circle-outline:before{content:"\f05e1"}.mdi-check-decagram:before{content:"\f0791"}.mdi-check-decagram-outline:before{content:"\f1740"}.mdi-check-network:before{content:"\f0c53"}.mdi-check-network-outline:before{content:"\f0c54"}.mdi-check-outline:before{content:"\f0855"}.mdi-check-underline:before{content:"\f0e1f"}.mdi-check-underline-circle:before{content:"\f0e20"}.mdi-check-underline-circle-outline:before{content:"\f0e21"}.mdi-checkbook:before{content:"\f0a9d"}.mdi-checkbook-arrow-left:before{content:"\f1c1d"}.mdi-checkbook-arrow-right:before{content:"\f1c1e"}.mdi-checkbox-blank:before{content:"\f012e"}.mdi-checkbox-blank-badge:before{content:"\f1176"}.mdi-checkbox-blank-badge-outline:before{content:"\f0117"}.mdi-checkbox-blank-circle:before{content:"\f012f"}.mdi-checkbox-blank-circle-outline:before{content:"\f0130"}.mdi-checkbox-blank-off:before{content:"\f12ec"}.mdi-checkbox-blank-off-outline:before{content:"\f12ed"}.mdi-checkbox-blank-outline:before{content:"\f0131"}.mdi-checkbox-intermediate:before{content:"\f0856"}.mdi-checkbox-intermediate-variant:before{content:"\f1b54"}.mdi-checkbox-marked:before{content:"\f0132"}.mdi-checkbox-marked-circle:before{content:"\f0133"}.mdi-checkbox-marked-circle-auto-outline:before{content:"\f1c26"}.mdi-checkbox-marked-circle-minus-outline:before{content:"\f1c27"}.mdi-checkbox-marked-circle-outline:before{content:"\f0134"}.mdi-checkbox-marked-circle-plus-outline:before{content:"\f1927"}.mdi-checkbox-marked-outline:before{content:"\f0135"}.mdi-checkbox-multiple-blank:before{content:"\f0136"}.mdi-checkbox-multiple-blank-circle:before{content:"\f063b"}.mdi-checkbox-multiple-blank-circle-outline:before{content:"\f063c"}.mdi-checkbox-multiple-blank-outline:before{content:"\f0137"}.mdi-checkbox-multiple-marked:before{content:"\f0138"}.mdi-checkbox-multiple-marked-circle:before{content:"\f063d"}.mdi-checkbox-multiple-marked-circle-outline:before{content:"\f063e"}.mdi-checkbox-multiple-marked-outline:before{content:"\f0139"}.mdi-checkbox-multiple-outline:before{content:"\f0c51"}.mdi-checkbox-outline:before{content:"\f0c52"}.mdi-checkerboard:before{content:"\f013a"}.mdi-checkerboard-minus:before{content:"\f1202"}.mdi-checkerboard-plus:before{content:"\f1201"}.mdi-checkerboard-remove:before{content:"\f1203"}.mdi-cheese:before{content:"\f12b9"}.mdi-cheese-off:before{content:"\f13ee"}.mdi-chef-hat:before{content:"\f0b7c"}.mdi-chemical-weapon:before{content:"\f013b"}.mdi-chess-bishop:before{content:"\f085c"}.mdi-chess-king:before{content:"\f0857"}.mdi-chess-knight:before{content:"\f0858"}.mdi-chess-pawn:before{content:"\f0859"}.mdi-chess-queen:before{content:"\f085a"}.mdi-chess-rook:before{content:"\f085b"}.mdi-chevron-double-down:before{content:"\f013c"}.mdi-chevron-double-left:before{content:"\f013d"}.mdi-chevron-double-right:before{content:"\f013e"}.mdi-chevron-double-up:before{content:"\f013f"}.mdi-chevron-down:before{content:"\f0140"}.mdi-chevron-down-box:before{content:"\f09d6"}.mdi-chevron-down-box-outline:before{content:"\f09d7"}.mdi-chevron-down-circle:before{content:"\f0b26"}.mdi-chevron-down-circle-outline:before{content:"\f0b27"}.mdi-chevron-left:before{content:"\f0141"}.mdi-chevron-left-box:before{content:"\f09d8"}.mdi-chevron-left-box-outline:before{content:"\f09d9"}.mdi-chevron-left-circle:before{content:"\f0b28"}.mdi-chevron-left-circle-outline:before{content:"\f0b29"}.mdi-chevron-right:before{content:"\f0142"}.mdi-chevron-right-box:before{content:"\f09da"}.mdi-chevron-right-box-outline:before{content:"\f09db"}.mdi-chevron-right-circle:before{content:"\f0b2a"}.mdi-chevron-right-circle-outline:before{content:"\f0b2b"}.mdi-chevron-triple-down:before{content:"\f0db9"}.mdi-chevron-triple-left:before{content:"\f0dba"}.mdi-chevron-triple-right:before{content:"\f0dbb"}.mdi-chevron-triple-up:before{content:"\f0dbc"}.mdi-chevron-up:before{content:"\f0143"}.mdi-chevron-up-box:before{content:"\f09dc"}.mdi-chevron-up-box-outline:before{content:"\f09dd"}.mdi-chevron-up-circle:before{content:"\f0b2c"}.mdi-chevron-up-circle-outline:before{content:"\f0b2d"}.mdi-chili-alert:before{content:"\f17ea"}.mdi-chili-alert-outline:before{content:"\f17eb"}.mdi-chili-hot:before{content:"\f07b2"}.mdi-chili-hot-outline:before{content:"\f17ec"}.mdi-chili-medium:before{content:"\f07b3"}.mdi-chili-medium-outline:before{content:"\f17ed"}.mdi-chili-mild:before{content:"\f07b4"}.mdi-chili-mild-outline:before{content:"\f17ee"}.mdi-chili-off:before{content:"\f1467"}.mdi-chili-off-outline:before{content:"\f17ef"}.mdi-chip:before{content:"\f061a"}.mdi-church:before{content:"\f0144"}.mdi-church-outline:before{content:"\f1b02"}.mdi-cigar:before{content:"\f1189"}.mdi-cigar-off:before{content:"\f141b"}.mdi-circle:before{content:"\f0765"}.mdi-circle-box:before{content:"\f15dc"}.mdi-circle-box-outline:before{content:"\f15dd"}.mdi-circle-double:before{content:"\f0e95"}.mdi-circle-edit-outline:before{content:"\f08d5"}.mdi-circle-expand:before{content:"\f0e96"}.mdi-circle-half:before{content:"\f1395"}.mdi-circle-half-full:before{content:"\f1396"}.mdi-circle-medium:before{content:"\f09de"}.mdi-circle-multiple:before{content:"\f0b38"}.mdi-circle-multiple-outline:before{content:"\f0695"}.mdi-circle-off-outline:before{content:"\f10d3"}.mdi-circle-opacity:before{content:"\f1853"}.mdi-circle-outline:before{content:"\f0766"}.mdi-circle-slice-1:before{content:"\f0a9e"}.mdi-circle-slice-2:before{content:"\f0a9f"}.mdi-circle-slice-3:before{content:"\f0aa0"}.mdi-circle-slice-4:before{content:"\f0aa1"}.mdi-circle-slice-5:before{content:"\f0aa2"}.mdi-circle-slice-6:before{content:"\f0aa3"}.mdi-circle-slice-7:before{content:"\f0aa4"}.mdi-circle-slice-8:before{content:"\f0aa5"}.mdi-circle-small:before{content:"\f09df"}.mdi-circular-saw:before{content:"\f0e22"}.mdi-city:before{content:"\f0146"}.mdi-city-switch:before{content:"\f1c28"}.mdi-city-variant:before{content:"\f0a36"}.mdi-city-variant-outline:before{content:"\f0a37"}.mdi-clipboard:before{content:"\f0147"}.mdi-clipboard-account:before{content:"\f0148"}.mdi-clipboard-account-outline:before{content:"\f0c55"}.mdi-clipboard-alert:before{content:"\f0149"}.mdi-clipboard-alert-outline:before{content:"\f0cf7"}.mdi-clipboard-arrow-down:before{content:"\f014a"}.mdi-clipboard-arrow-down-outline:before{content:"\f0c56"}.mdi-clipboard-arrow-left:before{content:"\f014b"}.mdi-clipboard-arrow-left-outline:before{content:"\f0cf8"}.mdi-clipboard-arrow-right:before{content:"\f0cf9"}.mdi-clipboard-arrow-right-outline:before{content:"\f0cfa"}.mdi-clipboard-arrow-up:before{content:"\f0c57"}.mdi-clipboard-arrow-up-outline:before{content:"\f0c58"}.mdi-clipboard-check:before{content:"\f014e"}.mdi-clipboard-check-multiple:before{content:"\f1263"}.mdi-clipboard-check-multiple-outline:before{content:"\f1264"}.mdi-clipboard-check-outline:before{content:"\f08a8"}.mdi-clipboard-clock:before{content:"\f16e2"}.mdi-clipboard-clock-outline:before{content:"\f16e3"}.mdi-clipboard-edit:before{content:"\f14e5"}.mdi-clipboard-edit-outline:before{content:"\f14e6"}.mdi-clipboard-file:before{content:"\f1265"}.mdi-clipboard-file-outline:before{content:"\f1266"}.mdi-clipboard-flow:before{content:"\f06c8"}.mdi-clipboard-flow-outline:before{content:"\f1117"}.mdi-clipboard-list:before{content:"\f10d4"}.mdi-clipboard-list-outline:before{content:"\f10d5"}.mdi-clipboard-minus:before{content:"\f1618"}.mdi-clipboard-minus-outline:before{content:"\f1619"}.mdi-clipboard-multiple:before{content:"\f1267"}.mdi-clipboard-multiple-outline:before{content:"\f1268"}.mdi-clipboard-off:before{content:"\f161a"}.mdi-clipboard-off-outline:before{content:"\f161b"}.mdi-clipboard-outline:before{content:"\f014c"}.mdi-clipboard-play:before{content:"\f0c59"}.mdi-clipboard-play-multiple:before{content:"\f1269"}.mdi-clipboard-play-multiple-outline:before{content:"\f126a"}.mdi-clipboard-play-outline:before{content:"\f0c5a"}.mdi-clipboard-plus:before{content:"\f0751"}.mdi-clipboard-plus-outline:before{content:"\f131f"}.mdi-clipboard-pulse:before{content:"\f085d"}.mdi-clipboard-pulse-outline:before{content:"\f085e"}.mdi-clipboard-remove:before{content:"\f161c"}.mdi-clipboard-remove-outline:before{content:"\f161d"}.mdi-clipboard-search:before{content:"\f161e"}.mdi-clipboard-search-outline:before{content:"\f161f"}.mdi-clipboard-text:before{content:"\f014d"}.mdi-clipboard-text-clock:before{content:"\f18f9"}.mdi-clipboard-text-clock-outline:before{content:"\f18fa"}.mdi-clipboard-text-multiple:before{content:"\f126b"}.mdi-clipboard-text-multiple-outline:before{content:"\f126c"}.mdi-clipboard-text-off:before{content:"\f1620"}.mdi-clipboard-text-off-outline:before{content:"\f1621"}.mdi-clipboard-text-outline:before{content:"\f0a38"}.mdi-clipboard-text-play:before{content:"\f0c5b"}.mdi-clipboard-text-play-outline:before{content:"\f0c5c"}.mdi-clipboard-text-search:before{content:"\f1622"}.mdi-clipboard-text-search-outline:before{content:"\f1623"}.mdi-clippy:before{content:"\f014f"}.mdi-clock:before{content:"\f0954"}.mdi-clock-alert:before{content:"\f0955"}.mdi-clock-alert-outline:before{content:"\f05ce"}.mdi-clock-check:before{content:"\f0fa8"}.mdi-clock-check-outline:before{content:"\f0fa9"}.mdi-clock-digital:before{content:"\f0e97"}.mdi-clock-edit:before{content:"\f19ba"}.mdi-clock-edit-outline:before{content:"\f19bb"}.mdi-clock-end:before{content:"\f0151"}.mdi-clock-fast:before{content:"\f0152"}.mdi-clock-in:before{content:"\f0153"}.mdi-clock-minus:before{content:"\f1863"}.mdi-clock-minus-outline:before{content:"\f1864"}.mdi-clock-out:before{content:"\f0154"}.mdi-clock-outline:before{content:"\f0150"}.mdi-clock-plus:before{content:"\f1861"}.mdi-clock-plus-outline:before{content:"\f1862"}.mdi-clock-remove:before{content:"\f1865"}.mdi-clock-remove-outline:before{content:"\f1866"}.mdi-clock-star-four-points:before{content:"\f1c29"}.mdi-clock-star-four-points-outline:before{content:"\f1c2a"}.mdi-clock-start:before{content:"\f0155"}.mdi-clock-time-eight:before{content:"\f1446"}.mdi-clock-time-eight-outline:before{content:"\f1452"}.mdi-clock-time-eleven:before{content:"\f1449"}.mdi-clock-time-eleven-outline:before{content:"\f1455"}.mdi-clock-time-five:before{content:"\f1443"}.mdi-clock-time-five-outline:before{content:"\f144f"}.mdi-clock-time-four:before{content:"\f1442"}.mdi-clock-time-four-outline:before{content:"\f144e"}.mdi-clock-time-nine:before{content:"\f1447"}.mdi-clock-time-nine-outline:before{content:"\f1453"}.mdi-clock-time-one:before{content:"\f143f"}.mdi-clock-time-one-outline:before{content:"\f144b"}.mdi-clock-time-seven:before{content:"\f1445"}.mdi-clock-time-seven-outline:before{content:"\f1451"}.mdi-clock-time-six:before{content:"\f1444"}.mdi-clock-time-six-outline:before{content:"\f1450"}.mdi-clock-time-ten:before{content:"\f1448"}.mdi-clock-time-ten-outline:before{content:"\f1454"}.mdi-clock-time-three:before{content:"\f1441"}.mdi-clock-time-three-outline:before{content:"\f144d"}.mdi-clock-time-twelve:before{content:"\f144a"}.mdi-clock-time-twelve-outline:before{content:"\f1456"}.mdi-clock-time-two:before{content:"\f1440"}.mdi-clock-time-two-outline:before{content:"\f144c"}.mdi-close:before{content:"\f0156"}.mdi-close-box:before{content:"\f0157"}.mdi-close-box-multiple:before{content:"\f0c5d"}.mdi-close-box-multiple-outline:before{content:"\f0c5e"}.mdi-close-box-outline:before{content:"\f0158"}.mdi-close-circle:before{content:"\f0159"}.mdi-close-circle-multiple:before{content:"\f062a"}.mdi-close-circle-multiple-outline:before{content:"\f0883"}.mdi-close-circle-outline:before{content:"\f015a"}.mdi-close-network:before{content:"\f015b"}.mdi-close-network-outline:before{content:"\f0c5f"}.mdi-close-octagon:before{content:"\f015c"}.mdi-close-octagon-outline:before{content:"\f015d"}.mdi-close-outline:before{content:"\f06c9"}.mdi-close-thick:before{content:"\f1398"}.mdi-closed-caption:before{content:"\f015e"}.mdi-closed-caption-outline:before{content:"\f0dbd"}.mdi-cloud:before{content:"\f015f"}.mdi-cloud-alert:before{content:"\f09e0"}.mdi-cloud-alert-outline:before{content:"\f1be0"}.mdi-cloud-arrow-down:before{content:"\f1be1"}.mdi-cloud-arrow-down-outline:before{content:"\f1be2"}.mdi-cloud-arrow-left:before{content:"\f1be3"}.mdi-cloud-arrow-left-outline:before{content:"\f1be4"}.mdi-cloud-arrow-right:before{content:"\f1be5"}.mdi-cloud-arrow-right-outline:before{content:"\f1be6"}.mdi-cloud-arrow-up:before{content:"\f1be7"}.mdi-cloud-arrow-up-outline:before{content:"\f1be8"}.mdi-cloud-braces:before{content:"\f07b5"}.mdi-cloud-cancel:before{content:"\f1be9"}.mdi-cloud-cancel-outline:before{content:"\f1bea"}.mdi-cloud-check:before{content:"\f1beb"}.mdi-cloud-check-outline:before{content:"\f1bec"}.mdi-cloud-check-variant:before{content:"\f0160"}.mdi-cloud-check-variant-outline:before{content:"\f12cc"}.mdi-cloud-circle:before{content:"\f0161"}.mdi-cloud-circle-outline:before{content:"\f1bed"}.mdi-cloud-clock:before{content:"\f1bee"}.mdi-cloud-clock-outline:before{content:"\f1bef"}.mdi-cloud-cog:before{content:"\f1bf0"}.mdi-cloud-cog-outline:before{content:"\f1bf1"}.mdi-cloud-download:before{content:"\f0162"}.mdi-cloud-download-outline:before{content:"\f0b7d"}.mdi-cloud-key:before{content:"\f1ca1"}.mdi-cloud-key-outline:before{content:"\f1ca2"}.mdi-cloud-lock:before{content:"\f11f1"}.mdi-cloud-lock-open:before{content:"\f1bf2"}.mdi-cloud-lock-open-outline:before{content:"\f1bf3"}.mdi-cloud-lock-outline:before{content:"\f11f2"}.mdi-cloud-minus:before{content:"\f1bf4"}.mdi-cloud-minus-outline:before{content:"\f1bf5"}.mdi-cloud-off:before{content:"\f1bf6"}.mdi-cloud-off-outline:before{content:"\f0164"}.mdi-cloud-outline:before{content:"\f0163"}.mdi-cloud-percent:before{content:"\f1a35"}.mdi-cloud-percent-outline:before{content:"\f1a36"}.mdi-cloud-plus:before{content:"\f1bf7"}.mdi-cloud-plus-outline:before{content:"\f1bf8"}.mdi-cloud-print:before{content:"\f0165"}.mdi-cloud-print-outline:before{content:"\f0166"}.mdi-cloud-question:before{content:"\f0a39"}.mdi-cloud-question-outline:before{content:"\f1bf9"}.mdi-cloud-refresh:before{content:"\f1bfa"}.mdi-cloud-refresh-outline:before{content:"\f1bfb"}.mdi-cloud-refresh-variant:before{content:"\f052a"}.mdi-cloud-refresh-variant-outline:before{content:"\f1bfc"}.mdi-cloud-remove:before{content:"\f1bfd"}.mdi-cloud-remove-outline:before{content:"\f1bfe"}.mdi-cloud-search:before{content:"\f0956"}.mdi-cloud-search-outline:before{content:"\f0957"}.mdi-cloud-sync:before{content:"\f063f"}.mdi-cloud-sync-outline:before{content:"\f12d6"}.mdi-cloud-tags:before{content:"\f07b6"}.mdi-cloud-upload:before{content:"\f0167"}.mdi-cloud-upload-outline:before{content:"\f0b7e"}.mdi-clouds:before{content:"\f1b95"}.mdi-clover:before{content:"\f0816"}.mdi-clover-outline:before{content:"\f1c62"}.mdi-coach-lamp:before{content:"\f1020"}.mdi-coach-lamp-variant:before{content:"\f1a37"}.mdi-coat-rack:before{content:"\f109e"}.mdi-code-array:before{content:"\f0168"}.mdi-code-block-braces:before{content:"\f1c83"}.mdi-code-block-brackets:before{content:"\f1c84"}.mdi-code-block-parentheses:before{content:"\f1c85"}.mdi-code-block-tags:before{content:"\f1c86"}.mdi-code-braces:before{content:"\f0169"}.mdi-code-braces-box:before{content:"\f10d6"}.mdi-code-brackets:before{content:"\f016a"}.mdi-code-equal:before{content:"\f016b"}.mdi-code-greater-than:before{content:"\f016c"}.mdi-code-greater-than-or-equal:before{content:"\f016d"}.mdi-code-json:before{content:"\f0626"}.mdi-code-less-than:before{content:"\f016e"}.mdi-code-less-than-or-equal:before{content:"\f016f"}.mdi-code-not-equal:before{content:"\f0170"}.mdi-code-not-equal-variant:before{content:"\f0171"}.mdi-code-parentheses:before{content:"\f0172"}.mdi-code-parentheses-box:before{content:"\f10d7"}.mdi-code-string:before{content:"\f0173"}.mdi-code-tags:before{content:"\f0174"}.mdi-code-tags-check:before{content:"\f0694"}.mdi-codepen:before{content:"\f0175"}.mdi-coffee:before{content:"\f0176"}.mdi-coffee-maker:before{content:"\f109f"}.mdi-coffee-maker-check:before{content:"\f1931"}.mdi-coffee-maker-check-outline:before{content:"\f1932"}.mdi-coffee-maker-outline:before{content:"\f181b"}.mdi-coffee-off:before{content:"\f0faa"}.mdi-coffee-off-outline:before{content:"\f0fab"}.mdi-coffee-outline:before{content:"\f06ca"}.mdi-coffee-to-go:before{content:"\f0177"}.mdi-coffee-to-go-outline:before{content:"\f130e"}.mdi-coffin:before{content:"\f0b7f"}.mdi-cog:before{content:"\f0493"}.mdi-cog-box:before{content:"\f0494"}.mdi-cog-clockwise:before{content:"\f11dd"}.mdi-cog-counterclockwise:before{content:"\f11de"}.mdi-cog-off:before{content:"\f13ce"}.mdi-cog-off-outline:before{content:"\f13cf"}.mdi-cog-outline:before{content:"\f08bb"}.mdi-cog-pause:before{content:"\f1933"}.mdi-cog-pause-outline:before{content:"\f1934"}.mdi-cog-play:before{content:"\f1935"}.mdi-cog-play-outline:before{content:"\f1936"}.mdi-cog-refresh:before{content:"\f145e"}.mdi-cog-refresh-outline:before{content:"\f145f"}.mdi-cog-stop:before{content:"\f1937"}.mdi-cog-stop-outline:before{content:"\f1938"}.mdi-cog-sync:before{content:"\f1460"}.mdi-cog-sync-outline:before{content:"\f1461"}.mdi-cog-transfer:before{content:"\f105b"}.mdi-cog-transfer-outline:before{content:"\f105c"}.mdi-cogs:before{content:"\f08d6"}.mdi-collage:before{content:"\f0640"}.mdi-collapse-all:before{content:"\f0aa6"}.mdi-collapse-all-outline:before{content:"\f0aa7"}.mdi-color-helper:before{content:"\f0179"}.mdi-comma:before{content:"\f0e23"}.mdi-comma-box:before{content:"\f0e2b"}.mdi-comma-box-outline:before{content:"\f0e24"}.mdi-comma-circle:before{content:"\f0e25"}.mdi-comma-circle-outline:before{content:"\f0e26"}.mdi-comment:before{content:"\f017a"}.mdi-comment-account:before{content:"\f017b"}.mdi-comment-account-outline:before{content:"\f017c"}.mdi-comment-alert:before{content:"\f017d"}.mdi-comment-alert-outline:before{content:"\f017e"}.mdi-comment-arrow-left:before{content:"\f09e1"}.mdi-comment-arrow-left-outline:before{content:"\f09e2"}.mdi-comment-arrow-right:before{content:"\f09e3"}.mdi-comment-arrow-right-outline:before{content:"\f09e4"}.mdi-comment-bookmark:before{content:"\f15ae"}.mdi-comment-bookmark-outline:before{content:"\f15af"}.mdi-comment-check:before{content:"\f017f"}.mdi-comment-check-outline:before{content:"\f0180"}.mdi-comment-edit:before{content:"\f11bf"}.mdi-comment-edit-outline:before{content:"\f12c4"}.mdi-comment-eye:before{content:"\f0a3a"}.mdi-comment-eye-outline:before{content:"\f0a3b"}.mdi-comment-flash:before{content:"\f15b0"}.mdi-comment-flash-outline:before{content:"\f15b1"}.mdi-comment-minus:before{content:"\f15df"}.mdi-comment-minus-outline:before{content:"\f15e0"}.mdi-comment-multiple:before{content:"\f085f"}.mdi-comment-multiple-outline:before{content:"\f0181"}.mdi-comment-off:before{content:"\f15e1"}.mdi-comment-off-outline:before{content:"\f15e2"}.mdi-comment-outline:before{content:"\f0182"}.mdi-comment-plus:before{content:"\f09e5"}.mdi-comment-plus-outline:before{content:"\f0183"}.mdi-comment-processing:before{content:"\f0184"}.mdi-comment-processing-outline:before{content:"\f0185"}.mdi-comment-question:before{content:"\f0817"}.mdi-comment-question-outline:before{content:"\f0186"}.mdi-comment-quote:before{content:"\f1021"}.mdi-comment-quote-outline:before{content:"\f1022"}.mdi-comment-remove:before{content:"\f05de"}.mdi-comment-remove-outline:before{content:"\f0187"}.mdi-comment-search:before{content:"\f0a3c"}.mdi-comment-search-outline:before{content:"\f0a3d"}.mdi-comment-text:before{content:"\f0188"}.mdi-comment-text-multiple:before{content:"\f0860"}.mdi-comment-text-multiple-outline:before{content:"\f0861"}.mdi-comment-text-outline:before{content:"\f0189"}.mdi-compare:before{content:"\f018a"}.mdi-compare-horizontal:before{content:"\f1492"}.mdi-compare-remove:before{content:"\f18b3"}.mdi-compare-vertical:before{content:"\f1493"}.mdi-compass:before{content:"\f018b"}.mdi-compass-off:before{content:"\f0b80"}.mdi-compass-off-outline:before{content:"\f0b81"}.mdi-compass-outline:before{content:"\f018c"}.mdi-compass-rose:before{content:"\f1382"}.mdi-compost:before{content:"\f1a38"}.mdi-cone:before{content:"\f194c"}.mdi-cone-off:before{content:"\f194d"}.mdi-connection:before{content:"\f1616"}.mdi-console:before{content:"\f018d"}.mdi-console-line:before{content:"\f07b7"}.mdi-console-network:before{content:"\f08a9"}.mdi-console-network-outline:before{content:"\f0c60"}.mdi-consolidate:before{content:"\f10d8"}.mdi-contactless-payment:before{content:"\f0d6a"}.mdi-contactless-payment-circle:before{content:"\f0321"}.mdi-contactless-payment-circle-outline:before{content:"\f0408"}.mdi-contacts:before{content:"\f06cb"}.mdi-contacts-outline:before{content:"\f05b8"}.mdi-contain:before{content:"\f0a3e"}.mdi-contain-end:before{content:"\f0a3f"}.mdi-contain-start:before{content:"\f0a40"}.mdi-content-copy:before{content:"\f018f"}.mdi-content-cut:before{content:"\f0190"}.mdi-content-duplicate:before{content:"\f0191"}.mdi-content-paste:before{content:"\f0192"}.mdi-content-save:before{content:"\f0193"}.mdi-content-save-alert:before{content:"\f0f42"}.mdi-content-save-alert-outline:before{content:"\f0f43"}.mdi-content-save-all:before{content:"\f0194"}.mdi-content-save-all-outline:before{content:"\f0f44"}.mdi-content-save-check:before{content:"\f18ea"}.mdi-content-save-check-outline:before{content:"\f18eb"}.mdi-content-save-cog:before{content:"\f145b"}.mdi-content-save-cog-outline:before{content:"\f145c"}.mdi-content-save-edit:before{content:"\f0cfb"}.mdi-content-save-edit-outline:before{content:"\f0cfc"}.mdi-content-save-minus:before{content:"\f1b43"}.mdi-content-save-minus-outline:before{content:"\f1b44"}.mdi-content-save-move:before{content:"\f0e27"}.mdi-content-save-move-outline:before{content:"\f0e28"}.mdi-content-save-off:before{content:"\f1643"}.mdi-content-save-off-outline:before{content:"\f1644"}.mdi-content-save-outline:before{content:"\f0818"}.mdi-content-save-plus:before{content:"\f1b41"}.mdi-content-save-plus-outline:before{content:"\f1b42"}.mdi-content-save-settings:before{content:"\f061b"}.mdi-content-save-settings-outline:before{content:"\f0b2e"}.mdi-contrast:before{content:"\f0195"}.mdi-contrast-box:before{content:"\f0196"}.mdi-contrast-circle:before{content:"\f0197"}.mdi-controller:before{content:"\f02b4"}.mdi-controller-classic:before{content:"\f0b82"}.mdi-controller-classic-outline:before{content:"\f0b83"}.mdi-controller-off:before{content:"\f02b5"}.mdi-cookie:before{content:"\f0198"}.mdi-cookie-alert:before{content:"\f16d0"}.mdi-cookie-alert-outline:before{content:"\f16d1"}.mdi-cookie-check:before{content:"\f16d2"}.mdi-cookie-check-outline:before{content:"\f16d3"}.mdi-cookie-clock:before{content:"\f16e4"}.mdi-cookie-clock-outline:before{content:"\f16e5"}.mdi-cookie-cog:before{content:"\f16d4"}.mdi-cookie-cog-outline:before{content:"\f16d5"}.mdi-cookie-edit:before{content:"\f16e6"}.mdi-cookie-edit-outline:before{content:"\f16e7"}.mdi-cookie-lock:before{content:"\f16e8"}.mdi-cookie-lock-outline:before{content:"\f16e9"}.mdi-cookie-minus:before{content:"\f16da"}.mdi-cookie-minus-outline:before{content:"\f16db"}.mdi-cookie-off:before{content:"\f16ea"}.mdi-cookie-off-outline:before{content:"\f16eb"}.mdi-cookie-outline:before{content:"\f16de"}.mdi-cookie-plus:before{content:"\f16d6"}.mdi-cookie-plus-outline:before{content:"\f16d7"}.mdi-cookie-refresh:before{content:"\f16ec"}.mdi-cookie-refresh-outline:before{content:"\f16ed"}.mdi-cookie-remove:before{content:"\f16d8"}.mdi-cookie-remove-outline:before{content:"\f16d9"}.mdi-cookie-settings:before{content:"\f16dc"}.mdi-cookie-settings-outline:before{content:"\f16dd"}.mdi-coolant-temperature:before{content:"\f03c8"}.mdi-copyleft:before{content:"\f1939"}.mdi-copyright:before{content:"\f05e6"}.mdi-cordova:before{content:"\f0958"}.mdi-corn:before{content:"\f07b8"}.mdi-corn-off:before{content:"\f13ef"}.mdi-cosine-wave:before{content:"\f1479"}.mdi-counter:before{content:"\f0199"}.mdi-countertop:before{content:"\f181c"}.mdi-countertop-outline:before{content:"\f181d"}.mdi-cow:before{content:"\f019a"}.mdi-cow-off:before{content:"\f18fc"}.mdi-cpu-32-bit:before{content:"\f0edf"}.mdi-cpu-64-bit:before{content:"\f0ee0"}.mdi-cradle:before{content:"\f198b"}.mdi-cradle-outline:before{content:"\f1991"}.mdi-crane:before{content:"\f0862"}.mdi-creation:before{content:"\f0674"}.mdi-creation-outline:before{content:"\f1c2b"}.mdi-creative-commons:before{content:"\f0d6b"}.mdi-credit-card:before{content:"\f0fef"}.mdi-credit-card-check:before{content:"\f13d0"}.mdi-credit-card-check-outline:before{content:"\f13d1"}.mdi-credit-card-chip:before{content:"\f190f"}.mdi-credit-card-chip-outline:before{content:"\f1910"}.mdi-credit-card-clock:before{content:"\f0ee1"}.mdi-credit-card-clock-outline:before{content:"\f0ee2"}.mdi-credit-card-edit:before{content:"\f17d7"}.mdi-credit-card-edit-outline:before{content:"\f17d8"}.mdi-credit-card-fast:before{content:"\f1911"}.mdi-credit-card-fast-outline:before{content:"\f1912"}.mdi-credit-card-lock:before{content:"\f18e7"}.mdi-credit-card-lock-outline:before{content:"\f18e8"}.mdi-credit-card-marker:before{content:"\f06a8"}.mdi-credit-card-marker-outline:before{content:"\f0dbe"}.mdi-credit-card-minus:before{content:"\f0fac"}.mdi-credit-card-minus-outline:before{content:"\f0fad"}.mdi-credit-card-multiple:before{content:"\f0ff0"}.mdi-credit-card-multiple-outline:before{content:"\f019c"}.mdi-credit-card-off:before{content:"\f0ff1"}.mdi-credit-card-off-outline:before{content:"\f05e4"}.mdi-credit-card-outline:before{content:"\f019b"}.mdi-credit-card-plus:before{content:"\f0ff2"}.mdi-credit-card-plus-outline:before{content:"\f0676"}.mdi-credit-card-refresh:before{content:"\f1645"}.mdi-credit-card-refresh-outline:before{content:"\f1646"}.mdi-credit-card-refund:before{content:"\f0ff3"}.mdi-credit-card-refund-outline:before{content:"\f0aa8"}.mdi-credit-card-remove:before{content:"\f0fae"}.mdi-credit-card-remove-outline:before{content:"\f0faf"}.mdi-credit-card-scan:before{content:"\f0ff4"}.mdi-credit-card-scan-outline:before{content:"\f019d"}.mdi-credit-card-search:before{content:"\f1647"}.mdi-credit-card-search-outline:before{content:"\f1648"}.mdi-credit-card-settings:before{content:"\f0ff5"}.mdi-credit-card-settings-outline:before{content:"\f08d7"}.mdi-credit-card-sync:before{content:"\f1649"}.mdi-credit-card-sync-outline:before{content:"\f164a"}.mdi-credit-card-wireless:before{content:"\f0802"}.mdi-credit-card-wireless-off:before{content:"\f057a"}.mdi-credit-card-wireless-off-outline:before{content:"\f057b"}.mdi-credit-card-wireless-outline:before{content:"\f0d6c"}.mdi-cricket:before{content:"\f0d6d"}.mdi-crop:before{content:"\f019e"}.mdi-crop-free:before{content:"\f019f"}.mdi-crop-landscape:before{content:"\f01a0"}.mdi-crop-portrait:before{content:"\f01a1"}.mdi-crop-rotate:before{content:"\f0696"}.mdi-crop-square:before{content:"\f01a2"}.mdi-cross:before{content:"\f0953"}.mdi-cross-bolnisi:before{content:"\f0ced"}.mdi-cross-celtic:before{content:"\f0cf5"}.mdi-cross-outline:before{content:"\f0cf6"}.mdi-crosshairs:before{content:"\f01a3"}.mdi-crosshairs-gps:before{content:"\f01a4"}.mdi-crosshairs-off:before{content:"\f0f45"}.mdi-crosshairs-question:before{content:"\f1136"}.mdi-crowd:before{content:"\f1975"}.mdi-crown:before{content:"\f01a5"}.mdi-crown-circle:before{content:"\f17dc"}.mdi-crown-circle-outline:before{content:"\f17dd"}.mdi-crown-outline:before{content:"\f11d0"}.mdi-cryengine:before{content:"\f0959"}.mdi-crystal-ball:before{content:"\f0b2f"}.mdi-cube:before{content:"\f01a6"}.mdi-cube-off:before{content:"\f141c"}.mdi-cube-off-outline:before{content:"\f141d"}.mdi-cube-outline:before{content:"\f01a7"}.mdi-cube-scan:before{content:"\f0b84"}.mdi-cube-send:before{content:"\f01a8"}.mdi-cube-unfolded:before{content:"\f01a9"}.mdi-cup:before{content:"\f01aa"}.mdi-cup-off:before{content:"\f05e5"}.mdi-cup-off-outline:before{content:"\f137d"}.mdi-cup-outline:before{content:"\f130f"}.mdi-cup-water:before{content:"\f01ab"}.mdi-cupboard:before{content:"\f0f46"}.mdi-cupboard-outline:before{content:"\f0f47"}.mdi-cupcake:before{content:"\f095a"}.mdi-curling:before{content:"\f0863"}.mdi-currency-bdt:before{content:"\f0864"}.mdi-currency-brl:before{content:"\f0b85"}.mdi-currency-btc:before{content:"\f01ac"}.mdi-currency-cny:before{content:"\f07ba"}.mdi-currency-eth:before{content:"\f07bb"}.mdi-currency-eur:before{content:"\f01ad"}.mdi-currency-eur-off:before{content:"\f1315"}.mdi-currency-fra:before{content:"\f1a39"}.mdi-currency-gbp:before{content:"\f01ae"}.mdi-currency-ils:before{content:"\f0c61"}.mdi-currency-inr:before{content:"\f01af"}.mdi-currency-jpy:before{content:"\f07bc"}.mdi-currency-krw:before{content:"\f07bd"}.mdi-currency-kzt:before{content:"\f0865"}.mdi-currency-mnt:before{content:"\f1512"}.mdi-currency-ngn:before{content:"\f01b0"}.mdi-currency-php:before{content:"\f09e6"}.mdi-currency-rial:before{content:"\f0e9c"}.mdi-currency-rub:before{content:"\f01b1"}.mdi-currency-rupee:before{content:"\f1976"}.mdi-currency-sign:before{content:"\f07be"}.mdi-currency-thb:before{content:"\f1c05"}.mdi-currency-try:before{content:"\f01b2"}.mdi-currency-twd:before{content:"\f07bf"}.mdi-currency-uah:before{content:"\f1b9b"}.mdi-currency-usd:before{content:"\f01c1"}.mdi-currency-usd-off:before{content:"\f067a"}.mdi-current-ac:before{content:"\f1480"}.mdi-current-dc:before{content:"\f095c"}.mdi-cursor-default:before{content:"\f01c0"}.mdi-cursor-default-click:before{content:"\f0cfd"}.mdi-cursor-default-click-outline:before{content:"\f0cfe"}.mdi-cursor-default-gesture:before{content:"\f1127"}.mdi-cursor-default-gesture-outline:before{content:"\f1128"}.mdi-cursor-default-outline:before{content:"\f01bf"}.mdi-cursor-move:before{content:"\f01be"}.mdi-cursor-pointer:before{content:"\f01bd"}.mdi-cursor-text:before{content:"\f05e7"}.mdi-curtains:before{content:"\f1846"}.mdi-curtains-closed:before{content:"\f1847"}.mdi-cylinder:before{content:"\f194e"}.mdi-cylinder-off:before{content:"\f194f"}.mdi-dance-ballroom:before{content:"\f15fb"}.mdi-dance-pole:before{content:"\f1578"}.mdi-data-matrix:before{content:"\f153c"}.mdi-data-matrix-edit:before{content:"\f153d"}.mdi-data-matrix-minus:before{content:"\f153e"}.mdi-data-matrix-plus:before{content:"\f153f"}.mdi-data-matrix-remove:before{content:"\f1540"}.mdi-data-matrix-scan:before{content:"\f1541"}.mdi-database:before{content:"\f01bc"}.mdi-database-alert:before{content:"\f163a"}.mdi-database-alert-outline:before{content:"\f1624"}.mdi-database-arrow-down:before{content:"\f163b"}.mdi-database-arrow-down-outline:before{content:"\f1625"}.mdi-database-arrow-left:before{content:"\f163c"}.mdi-database-arrow-left-outline:before{content:"\f1626"}.mdi-database-arrow-right:before{content:"\f163d"}.mdi-database-arrow-right-outline:before{content:"\f1627"}.mdi-database-arrow-up:before{content:"\f163e"}.mdi-database-arrow-up-outline:before{content:"\f1628"}.mdi-database-check:before{content:"\f0aa9"}.mdi-database-check-outline:before{content:"\f1629"}.mdi-database-clock:before{content:"\f163f"}.mdi-database-clock-outline:before{content:"\f162a"}.mdi-database-cog:before{content:"\f164b"}.mdi-database-cog-outline:before{content:"\f164c"}.mdi-database-edit:before{content:"\f0b86"}.mdi-database-edit-outline:before{content:"\f162b"}.mdi-database-export:before{content:"\f095e"}.mdi-database-export-outline:before{content:"\f162c"}.mdi-database-eye:before{content:"\f191f"}.mdi-database-eye-off:before{content:"\f1920"}.mdi-database-eye-off-outline:before{content:"\f1921"}.mdi-database-eye-outline:before{content:"\f1922"}.mdi-database-import:before{content:"\f095d"}.mdi-database-import-outline:before{content:"\f162d"}.mdi-database-lock:before{content:"\f0aaa"}.mdi-database-lock-outline:before{content:"\f162e"}.mdi-database-marker:before{content:"\f12f6"}.mdi-database-marker-outline:before{content:"\f162f"}.mdi-database-minus:before{content:"\f01bb"}.mdi-database-minus-outline:before{content:"\f1630"}.mdi-database-off:before{content:"\f1640"}.mdi-database-off-outline:before{content:"\f1631"}.mdi-database-outline:before{content:"\f1632"}.mdi-database-plus:before{content:"\f01ba"}.mdi-database-plus-outline:before{content:"\f1633"}.mdi-database-refresh:before{content:"\f05c2"}.mdi-database-refresh-outline:before{content:"\f1634"}.mdi-database-remove:before{content:"\f0d00"}.mdi-database-remove-outline:before{content:"\f1635"}.mdi-database-search:before{content:"\f0866"}.mdi-database-search-outline:before{content:"\f1636"}.mdi-database-settings:before{content:"\f0d01"}.mdi-database-settings-outline:before{content:"\f1637"}.mdi-database-sync:before{content:"\f0cff"}.mdi-database-sync-outline:before{content:"\f1638"}.mdi-death-star:before{content:"\f08d8"}.mdi-death-star-variant:before{content:"\f08d9"}.mdi-deathly-hallows:before{content:"\f0b87"}.mdi-debian:before{content:"\f08da"}.mdi-debug-step-into:before{content:"\f01b9"}.mdi-debug-step-out:before{content:"\f01b8"}.mdi-debug-step-over:before{content:"\f01b7"}.mdi-decagram:before{content:"\f076c"}.mdi-decagram-outline:before{content:"\f076d"}.mdi-decimal:before{content:"\f10a1"}.mdi-decimal-comma:before{content:"\f10a2"}.mdi-decimal-comma-decrease:before{content:"\f10a3"}.mdi-decimal-comma-increase:before{content:"\f10a4"}.mdi-decimal-decrease:before{content:"\f01b6"}.mdi-decimal-increase:before{content:"\f01b5"}.mdi-delete:before{content:"\f01b4"}.mdi-delete-alert:before{content:"\f10a5"}.mdi-delete-alert-outline:before{content:"\f10a6"}.mdi-delete-circle:before{content:"\f0683"}.mdi-delete-circle-outline:before{content:"\f0b88"}.mdi-delete-clock:before{content:"\f1556"}.mdi-delete-clock-outline:before{content:"\f1557"}.mdi-delete-empty:before{content:"\f06cc"}.mdi-delete-empty-outline:before{content:"\f0e9d"}.mdi-delete-forever:before{content:"\f05e8"}.mdi-delete-forever-outline:before{content:"\f0b89"}.mdi-delete-off:before{content:"\f10a7"}.mdi-delete-off-outline:before{content:"\f10a8"}.mdi-delete-outline:before{content:"\f09e7"}.mdi-delete-restore:before{content:"\f0819"}.mdi-delete-sweep:before{content:"\f05e9"}.mdi-delete-sweep-outline:before{content:"\f0c62"}.mdi-delete-variant:before{content:"\f01b3"}.mdi-delta:before{content:"\f01c2"}.mdi-desk:before{content:"\f1239"}.mdi-desk-lamp:before{content:"\f095f"}.mdi-desk-lamp-off:before{content:"\f1b1f"}.mdi-desk-lamp-on:before{content:"\f1b20"}.mdi-deskphone:before{content:"\f01c3"}.mdi-desktop-classic:before{content:"\f07c0"}.mdi-desktop-tower:before{content:"\f01c5"}.mdi-desktop-tower-monitor:before{content:"\f0aab"}.mdi-details:before{content:"\f01c6"}.mdi-dev-to:before{content:"\f0d6e"}.mdi-developer-board:before{content:"\f0697"}.mdi-deviantart:before{content:"\f01c7"}.mdi-devices:before{content:"\f0fb0"}.mdi-dharmachakra:before{content:"\f094b"}.mdi-diabetes:before{content:"\f1126"}.mdi-dialpad:before{content:"\f061c"}.mdi-diameter:before{content:"\f0c63"}.mdi-diameter-outline:before{content:"\f0c64"}.mdi-diameter-variant:before{content:"\f0c65"}.mdi-diamond:before{content:"\f0b8a"}.mdi-diamond-outline:before{content:"\f0b8b"}.mdi-diamond-stone:before{content:"\f01c8"}.mdi-diaper-outline:before{content:"\f1ccf"}.mdi-dice-1:before{content:"\f01ca"}.mdi-dice-1-outline:before{content:"\f114a"}.mdi-dice-2:before{content:"\f01cb"}.mdi-dice-2-outline:before{content:"\f114b"}.mdi-dice-3:before{content:"\f01cc"}.mdi-dice-3-outline:before{content:"\f114c"}.mdi-dice-4:before{content:"\f01cd"}.mdi-dice-4-outline:before{content:"\f114d"}.mdi-dice-5:before{content:"\f01ce"}.mdi-dice-5-outline:before{content:"\f114e"}.mdi-dice-6:before{content:"\f01cf"}.mdi-dice-6-outline:before{content:"\f114f"}.mdi-dice-d10:before{content:"\f1153"}.mdi-dice-d10-outline:before{content:"\f076f"}.mdi-dice-d12:before{content:"\f1154"}.mdi-dice-d12-outline:before{content:"\f0867"}.mdi-dice-d20:before{content:"\f1155"}.mdi-dice-d20-outline:before{content:"\f05ea"}.mdi-dice-d4:before{content:"\f1150"}.mdi-dice-d4-outline:before{content:"\f05eb"}.mdi-dice-d6:before{content:"\f1151"}.mdi-dice-d6-outline:before{content:"\f05ed"}.mdi-dice-d8:before{content:"\f1152"}.mdi-dice-d8-outline:before{content:"\f05ec"}.mdi-dice-multiple:before{content:"\f076e"}.mdi-dice-multiple-outline:before{content:"\f1156"}.mdi-digital-ocean:before{content:"\f1237"}.mdi-dip-switch:before{content:"\f07c1"}.mdi-directions:before{content:"\f01d0"}.mdi-directions-fork:before{content:"\f0641"}.mdi-disc:before{content:"\f05ee"}.mdi-disc-alert:before{content:"\f01d1"}.mdi-disc-player:before{content:"\f0960"}.mdi-dishwasher:before{content:"\f0aac"}.mdi-dishwasher-alert:before{content:"\f11b8"}.mdi-dishwasher-off:before{content:"\f11b9"}.mdi-disqus:before{content:"\f01d2"}.mdi-distribute-horizontal-center:before{content:"\f11c9"}.mdi-distribute-horizontal-left:before{content:"\f11c8"}.mdi-distribute-horizontal-right:before{content:"\f11ca"}.mdi-distribute-vertical-bottom:before{content:"\f11cb"}.mdi-distribute-vertical-center:before{content:"\f11cc"}.mdi-distribute-vertical-top:before{content:"\f11cd"}.mdi-diversify:before{content:"\f1877"}.mdi-diving:before{content:"\f1977"}.mdi-diving-flippers:before{content:"\f0dbf"}.mdi-diving-helmet:before{content:"\f0dc0"}.mdi-diving-scuba:before{content:"\f1b77"}.mdi-diving-scuba-flag:before{content:"\f0dc2"}.mdi-diving-scuba-mask:before{content:"\f0dc1"}.mdi-diving-scuba-tank:before{content:"\f0dc3"}.mdi-diving-scuba-tank-multiple:before{content:"\f0dc4"}.mdi-diving-snorkel:before{content:"\f0dc5"}.mdi-division:before{content:"\f01d4"}.mdi-division-box:before{content:"\f01d5"}.mdi-dlna:before{content:"\f0a41"}.mdi-dna:before{content:"\f0684"}.mdi-dns:before{content:"\f01d6"}.mdi-dns-outline:before{content:"\f0b8c"}.mdi-dock-bottom:before{content:"\f10a9"}.mdi-dock-left:before{content:"\f10aa"}.mdi-dock-right:before{content:"\f10ab"}.mdi-dock-top:before{content:"\f1513"}.mdi-dock-window:before{content:"\f10ac"}.mdi-docker:before{content:"\f0868"}.mdi-doctor:before{content:"\f0a42"}.mdi-dog:before{content:"\f0a43"}.mdi-dog-service:before{content:"\f0aad"}.mdi-dog-side:before{content:"\f0a44"}.mdi-dog-side-off:before{content:"\f16ee"}.mdi-dolby:before{content:"\f06b3"}.mdi-dolly:before{content:"\f0e9e"}.mdi-dolphin:before{content:"\f18b4"}.mdi-domain:before{content:"\f01d7"}.mdi-domain-off:before{content:"\f0d6f"}.mdi-domain-plus:before{content:"\f10ad"}.mdi-domain-remove:before{content:"\f10ae"}.mdi-domain-switch:before{content:"\f1c2c"}.mdi-dome-light:before{content:"\f141e"}.mdi-domino-mask:before{content:"\f1023"}.mdi-donkey:before{content:"\f07c2"}.mdi-door:before{content:"\f081a"}.mdi-door-closed:before{content:"\f081b"}.mdi-door-closed-cancel:before{content:"\f1c93"}.mdi-door-closed-lock:before{content:"\f10af"}.mdi-door-open:before{content:"\f081c"}.mdi-door-sliding:before{content:"\f181e"}.mdi-door-sliding-lock:before{content:"\f181f"}.mdi-door-sliding-open:before{content:"\f1820"}.mdi-doorbell:before{content:"\f12e6"}.mdi-doorbell-video:before{content:"\f0869"}.mdi-dot-net:before{content:"\f0aae"}.mdi-dots-circle:before{content:"\f1978"}.mdi-dots-grid:before{content:"\f15fc"}.mdi-dots-hexagon:before{content:"\f15ff"}.mdi-dots-horizontal:before{content:"\f01d8"}.mdi-dots-horizontal-circle:before{content:"\f07c3"}.mdi-dots-horizontal-circle-outline:before{content:"\f0b8d"}.mdi-dots-square:before{content:"\f15fd"}.mdi-dots-triangle:before{content:"\f15fe"}.mdi-dots-vertical:before{content:"\f01d9"}.mdi-dots-vertical-circle:before{content:"\f07c4"}.mdi-dots-vertical-circle-outline:before{content:"\f0b8e"}.mdi-download:before{content:"\f01da"}.mdi-download-box:before{content:"\f1462"}.mdi-download-box-outline:before{content:"\f1463"}.mdi-download-circle:before{content:"\f1464"}.mdi-download-circle-outline:before{content:"\f1465"}.mdi-download-lock:before{content:"\f1320"}.mdi-download-lock-outline:before{content:"\f1321"}.mdi-download-multiple:before{content:"\f09e9"}.mdi-download-multiple-outline:before{content:"\f1cd0"}.mdi-download-network:before{content:"\f06f4"}.mdi-download-network-outline:before{content:"\f0c66"}.mdi-download-off:before{content:"\f10b0"}.mdi-download-off-outline:before{content:"\f10b1"}.mdi-download-outline:before{content:"\f0b8f"}.mdi-drag:before{content:"\f01db"}.mdi-drag-horizontal:before{content:"\f01dc"}.mdi-drag-horizontal-variant:before{content:"\f12f0"}.mdi-drag-variant:before{content:"\f0b90"}.mdi-drag-vertical:before{content:"\f01dd"}.mdi-drag-vertical-variant:before{content:"\f12f1"}.mdi-drama-masks:before{content:"\f0d02"}.mdi-draw:before{content:"\f0f49"}.mdi-draw-pen:before{content:"\f19b9"}.mdi-drawing:before{content:"\f01de"}.mdi-drawing-box:before{content:"\f01df"}.mdi-dresser:before{content:"\f0f4a"}.mdi-dresser-outline:before{content:"\f0f4b"}.mdi-drone:before{content:"\f01e2"}.mdi-dropbox:before{content:"\f01e3"}.mdi-drupal:before{content:"\f01e4"}.mdi-duck:before{content:"\f01e5"}.mdi-dumbbell:before{content:"\f01e6"}.mdi-dump-truck:before{content:"\f0c67"}.mdi-ear-hearing:before{content:"\f07c5"}.mdi-ear-hearing-loop:before{content:"\f1aee"}.mdi-ear-hearing-off:before{content:"\f0a45"}.mdi-earbuds:before{content:"\f184f"}.mdi-earbuds-off:before{content:"\f1850"}.mdi-earbuds-off-outline:before{content:"\f1851"}.mdi-earbuds-outline:before{content:"\f1852"}.mdi-earth:before{content:"\f01e7"}.mdi-earth-arrow-down:before{content:"\f1c87"}.mdi-earth-arrow-left:before{content:"\f1c88"}.mdi-earth-arrow-right:before{content:"\f1311"}.mdi-earth-arrow-up:before{content:"\f1c89"}.mdi-earth-box:before{content:"\f06cd"}.mdi-earth-box-minus:before{content:"\f1407"}.mdi-earth-box-off:before{content:"\f06ce"}.mdi-earth-box-plus:before{content:"\f1406"}.mdi-earth-box-remove:before{content:"\f1408"}.mdi-earth-minus:before{content:"\f1404"}.mdi-earth-off:before{content:"\f01e8"}.mdi-earth-plus:before{content:"\f1403"}.mdi-earth-remove:before{content:"\f1405"}.mdi-egg:before{content:"\f0aaf"}.mdi-egg-easter:before{content:"\f0ab0"}.mdi-egg-fried:before{content:"\f184a"}.mdi-egg-off:before{content:"\f13f0"}.mdi-egg-off-outline:before{content:"\f13f1"}.mdi-egg-outline:before{content:"\f13f2"}.mdi-eiffel-tower:before{content:"\f156b"}.mdi-eight-track:before{content:"\f09ea"}.mdi-eject:before{content:"\f01ea"}.mdi-eject-circle:before{content:"\f1b23"}.mdi-eject-circle-outline:before{content:"\f1b24"}.mdi-eject-outline:before{content:"\f0b91"}.mdi-electric-switch:before{content:"\f0e9f"}.mdi-electric-switch-closed:before{content:"\f10d9"}.mdi-electron-framework:before{content:"\f1024"}.mdi-elephant:before{content:"\f07c6"}.mdi-elevation-decline:before{content:"\f01eb"}.mdi-elevation-rise:before{content:"\f01ec"}.mdi-elevator:before{content:"\f01ed"}.mdi-elevator-down:before{content:"\f12c2"}.mdi-elevator-passenger:before{content:"\f1381"}.mdi-elevator-passenger-off:before{content:"\f1979"}.mdi-elevator-passenger-off-outline:before{content:"\f197a"}.mdi-elevator-passenger-outline:before{content:"\f197b"}.mdi-elevator-up:before{content:"\f12c1"}.mdi-ellipse:before{content:"\f0ea0"}.mdi-ellipse-outline:before{content:"\f0ea1"}.mdi-email:before{content:"\f01ee"}.mdi-email-alert:before{content:"\f06cf"}.mdi-email-alert-outline:before{content:"\f0d42"}.mdi-email-arrow-left:before{content:"\f10da"}.mdi-email-arrow-left-outline:before{content:"\f10db"}.mdi-email-arrow-right:before{content:"\f10dc"}.mdi-email-arrow-right-outline:before{content:"\f10dd"}.mdi-email-box:before{content:"\f0d03"}.mdi-email-check:before{content:"\f0ab1"}.mdi-email-check-outline:before{content:"\f0ab2"}.mdi-email-edit:before{content:"\f0ee3"}.mdi-email-edit-outline:before{content:"\f0ee4"}.mdi-email-fast:before{content:"\f186f"}.mdi-email-fast-outline:before{content:"\f1870"}.mdi-email-heart-outline:before{content:"\f1c5b"}.mdi-email-lock:before{content:"\f01f1"}.mdi-email-lock-outline:before{content:"\f1b61"}.mdi-email-mark-as-unread:before{content:"\f0b92"}.mdi-email-minus:before{content:"\f0ee5"}.mdi-email-minus-outline:before{content:"\f0ee6"}.mdi-email-multiple:before{content:"\f0ee7"}.mdi-email-multiple-outline:before{content:"\f0ee8"}.mdi-email-newsletter:before{content:"\f0fb1"}.mdi-email-off:before{content:"\f13e3"}.mdi-email-off-outline:before{content:"\f13e4"}.mdi-email-open:before{content:"\f01ef"}.mdi-email-open-heart-outline:before{content:"\f1c5c"}.mdi-email-open-multiple:before{content:"\f0ee9"}.mdi-email-open-multiple-outline:before{content:"\f0eea"}.mdi-email-open-outline:before{content:"\f05ef"}.mdi-email-outline:before{content:"\f01f0"}.mdi-email-plus:before{content:"\f09eb"}.mdi-email-plus-outline:before{content:"\f09ec"}.mdi-email-remove:before{content:"\f1661"}.mdi-email-remove-outline:before{content:"\f1662"}.mdi-email-seal:before{content:"\f195b"}.mdi-email-seal-outline:before{content:"\f195c"}.mdi-email-search:before{content:"\f0961"}.mdi-email-search-outline:before{content:"\f0962"}.mdi-email-sync:before{content:"\f12c7"}.mdi-email-sync-outline:before{content:"\f12c8"}.mdi-email-variant:before{content:"\f05f0"}.mdi-ember:before{content:"\f0b30"}.mdi-emby:before{content:"\f06b4"}.mdi-emoticon:before{content:"\f0c68"}.mdi-emoticon-angry:before{content:"\f0c69"}.mdi-emoticon-angry-outline:before{content:"\f0c6a"}.mdi-emoticon-confused:before{content:"\f10de"}.mdi-emoticon-confused-outline:before{content:"\f10df"}.mdi-emoticon-cool:before{content:"\f0c6b"}.mdi-emoticon-cool-outline:before{content:"\f01f3"}.mdi-emoticon-cry:before{content:"\f0c6c"}.mdi-emoticon-cry-outline:before{content:"\f0c6d"}.mdi-emoticon-dead:before{content:"\f0c6e"}.mdi-emoticon-dead-outline:before{content:"\f069b"}.mdi-emoticon-devil:before{content:"\f0c6f"}.mdi-emoticon-devil-outline:before{content:"\f01f4"}.mdi-emoticon-excited:before{content:"\f0c70"}.mdi-emoticon-excited-outline:before{content:"\f069c"}.mdi-emoticon-frown:before{content:"\f0f4c"}.mdi-emoticon-frown-outline:before{content:"\f0f4d"}.mdi-emoticon-happy:before{content:"\f0c71"}.mdi-emoticon-happy-outline:before{content:"\f01f5"}.mdi-emoticon-kiss:before{content:"\f0c72"}.mdi-emoticon-kiss-outline:before{content:"\f0c73"}.mdi-emoticon-lol:before{content:"\f1214"}.mdi-emoticon-lol-outline:before{content:"\f1215"}.mdi-emoticon-minus:before{content:"\f1cb2"}.mdi-emoticon-minus-outline:before{content:"\f1cb3"}.mdi-emoticon-neutral:before{content:"\f0c74"}.mdi-emoticon-neutral-outline:before{content:"\f01f6"}.mdi-emoticon-outline:before{content:"\f01f2"}.mdi-emoticon-plus:before{content:"\f1cb4"}.mdi-emoticon-plus-outline:before{content:"\f1cb5"}.mdi-emoticon-poop:before{content:"\f01f7"}.mdi-emoticon-poop-outline:before{content:"\f0c75"}.mdi-emoticon-remove:before{content:"\f1cb6"}.mdi-emoticon-remove-outline:before{content:"\f1cb7"}.mdi-emoticon-sad:before{content:"\f0c76"}.mdi-emoticon-sad-outline:before{content:"\f01f8"}.mdi-emoticon-sick:before{content:"\f157c"}.mdi-emoticon-sick-outline:before{content:"\f157d"}.mdi-emoticon-tongue:before{content:"\f01f9"}.mdi-emoticon-tongue-outline:before{content:"\f0c77"}.mdi-emoticon-wink:before{content:"\f0c78"}.mdi-emoticon-wink-outline:before{content:"\f0c79"}.mdi-engine:before{content:"\f01fa"}.mdi-engine-off:before{content:"\f0a46"}.mdi-engine-off-outline:before{content:"\f0a47"}.mdi-engine-outline:before{content:"\f01fb"}.mdi-epsilon:before{content:"\f10e0"}.mdi-equal:before{content:"\f01fc"}.mdi-equal-box:before{content:"\f01fd"}.mdi-equalizer:before{content:"\f0ea2"}.mdi-equalizer-outline:before{content:"\f0ea3"}.mdi-eraser:before{content:"\f01fe"}.mdi-eraser-variant:before{content:"\f0642"}.mdi-escalator:before{content:"\f01ff"}.mdi-escalator-box:before{content:"\f1399"}.mdi-escalator-down:before{content:"\f12c0"}.mdi-escalator-up:before{content:"\f12bf"}.mdi-eslint:before{content:"\f0c7a"}.mdi-et:before{content:"\f0ab3"}.mdi-ethereum:before{content:"\f086a"}.mdi-ethernet:before{content:"\f0200"}.mdi-ethernet-cable:before{content:"\f0201"}.mdi-ethernet-cable-off:before{content:"\f0202"}.mdi-ethernet-off:before{content:"\f1cd1"}.mdi-ev-plug-ccs1:before{content:"\f1519"}.mdi-ev-plug-ccs2:before{content:"\f151a"}.mdi-ev-plug-chademo:before{content:"\f151b"}.mdi-ev-plug-tesla:before{content:"\f151c"}.mdi-ev-plug-type1:before{content:"\f151d"}.mdi-ev-plug-type2:before{content:"\f151e"}.mdi-ev-station:before{content:"\f05f1"}.mdi-evernote:before{content:"\f0204"}.mdi-excavator:before{content:"\f1025"}.mdi-exclamation:before{content:"\f0205"}.mdi-exclamation-thick:before{content:"\f1238"}.mdi-exit-run:before{content:"\f0a48"}.mdi-exit-to-app:before{content:"\f0206"}.mdi-expand-all:before{content:"\f0ab4"}.mdi-expand-all-outline:before{content:"\f0ab5"}.mdi-expansion-card:before{content:"\f08ae"}.mdi-expansion-card-variant:before{content:"\f0fb2"}.mdi-exponent:before{content:"\f0963"}.mdi-exponent-box:before{content:"\f0964"}.mdi-export:before{content:"\f0207"}.mdi-export-variant:before{content:"\f0b93"}.mdi-eye:before{content:"\f0208"}.mdi-eye-arrow-left:before{content:"\f18fd"}.mdi-eye-arrow-left-outline:before{content:"\f18fe"}.mdi-eye-arrow-right:before{content:"\f18ff"}.mdi-eye-arrow-right-outline:before{content:"\f1900"}.mdi-eye-check:before{content:"\f0d04"}.mdi-eye-check-outline:before{content:"\f0d05"}.mdi-eye-circle:before{content:"\f0b94"}.mdi-eye-circle-outline:before{content:"\f0b95"}.mdi-eye-closed:before{content:"\f1ca3"}.mdi-eye-lock:before{content:"\f1c06"}.mdi-eye-lock-open:before{content:"\f1c07"}.mdi-eye-lock-open-outline:before{content:"\f1c08"}.mdi-eye-lock-outline:before{content:"\f1c09"}.mdi-eye-minus:before{content:"\f1026"}.mdi-eye-minus-outline:before{content:"\f1027"}.mdi-eye-off:before{content:"\f0209"}.mdi-eye-off-outline:before{content:"\f06d1"}.mdi-eye-outline:before{content:"\f06d0"}.mdi-eye-plus:before{content:"\f086b"}.mdi-eye-plus-outline:before{content:"\f086c"}.mdi-eye-refresh:before{content:"\f197c"}.mdi-eye-refresh-outline:before{content:"\f197d"}.mdi-eye-remove:before{content:"\f15e3"}.mdi-eye-remove-outline:before{content:"\f15e4"}.mdi-eye-settings:before{content:"\f086d"}.mdi-eye-settings-outline:before{content:"\f086e"}.mdi-eyedropper:before{content:"\f020a"}.mdi-eyedropper-minus:before{content:"\f13dd"}.mdi-eyedropper-off:before{content:"\f13df"}.mdi-eyedropper-plus:before{content:"\f13dc"}.mdi-eyedropper-remove:before{content:"\f13de"}.mdi-eyedropper-variant:before{content:"\f020b"}.mdi-face-agent:before{content:"\f0d70"}.mdi-face-man:before{content:"\f0643"}.mdi-face-man-outline:before{content:"\f0b96"}.mdi-face-man-profile:before{content:"\f0644"}.mdi-face-man-shimmer:before{content:"\f15cc"}.mdi-face-man-shimmer-outline:before{content:"\f15cd"}.mdi-face-mask:before{content:"\f1586"}.mdi-face-mask-outline:before{content:"\f1587"}.mdi-face-recognition:before{content:"\f0c7b"}.mdi-face-woman:before{content:"\f1077"}.mdi-face-woman-outline:before{content:"\f1078"}.mdi-face-woman-profile:before{content:"\f1076"}.mdi-face-woman-shimmer:before{content:"\f15ce"}.mdi-face-woman-shimmer-outline:before{content:"\f15cf"}.mdi-facebook:before{content:"\f020c"}.mdi-facebook-gaming:before{content:"\f07dd"}.mdi-facebook-messenger:before{content:"\f020e"}.mdi-facebook-workplace:before{content:"\f0b31"}.mdi-factory:before{content:"\f020f"}.mdi-family-tree:before{content:"\f160e"}.mdi-fan:before{content:"\f0210"}.mdi-fan-alert:before{content:"\f146c"}.mdi-fan-auto:before{content:"\f171d"}.mdi-fan-chevron-down:before{content:"\f146d"}.mdi-fan-chevron-up:before{content:"\f146e"}.mdi-fan-clock:before{content:"\f1a3a"}.mdi-fan-minus:before{content:"\f1470"}.mdi-fan-off:before{content:"\f081d"}.mdi-fan-plus:before{content:"\f146f"}.mdi-fan-remove:before{content:"\f1471"}.mdi-fan-speed-1:before{content:"\f1472"}.mdi-fan-speed-2:before{content:"\f1473"}.mdi-fan-speed-3:before{content:"\f1474"}.mdi-fast-forward:before{content:"\f0211"}.mdi-fast-forward-10:before{content:"\f0d71"}.mdi-fast-forward-15:before{content:"\f193a"}.mdi-fast-forward-30:before{content:"\f0d06"}.mdi-fast-forward-45:before{content:"\f1b12"}.mdi-fast-forward-5:before{content:"\f11f8"}.mdi-fast-forward-60:before{content:"\f160b"}.mdi-fast-forward-outline:before{content:"\f06d2"}.mdi-faucet:before{content:"\f1b29"}.mdi-faucet-variant:before{content:"\f1b2a"}.mdi-fax:before{content:"\f0212"}.mdi-feather:before{content:"\f06d3"}.mdi-feature-search:before{content:"\f0a49"}.mdi-feature-search-outline:before{content:"\f0a4a"}.mdi-fedora:before{content:"\f08db"}.mdi-fence:before{content:"\f179a"}.mdi-fence-electric:before{content:"\f17f6"}.mdi-fencing:before{content:"\f14c1"}.mdi-ferris-wheel:before{content:"\f0ea4"}.mdi-ferry:before{content:"\f0213"}.mdi-file:before{content:"\f0214"}.mdi-file-account:before{content:"\f073b"}.mdi-file-account-outline:before{content:"\f1028"}.mdi-file-alert:before{content:"\f0a4b"}.mdi-file-alert-outline:before{content:"\f0a4c"}.mdi-file-arrow-left-right:before{content:"\f1a93"}.mdi-file-arrow-left-right-outline:before{content:"\f1a94"}.mdi-file-arrow-up-down:before{content:"\f1a95"}.mdi-file-arrow-up-down-outline:before{content:"\f1a96"}.mdi-file-cabinet:before{content:"\f0ab6"}.mdi-file-cad:before{content:"\f0eeb"}.mdi-file-cad-box:before{content:"\f0eec"}.mdi-file-cancel:before{content:"\f0dc6"}.mdi-file-cancel-outline:before{content:"\f0dc7"}.mdi-file-certificate:before{content:"\f1186"}.mdi-file-certificate-outline:before{content:"\f1187"}.mdi-file-chart:before{content:"\f0215"}.mdi-file-chart-check:before{content:"\f19c6"}.mdi-file-chart-check-outline:before{content:"\f19c7"}.mdi-file-chart-outline:before{content:"\f1029"}.mdi-file-check:before{content:"\f0216"}.mdi-file-check-outline:before{content:"\f0e29"}.mdi-file-clock:before{content:"\f12e1"}.mdi-file-clock-outline:before{content:"\f12e2"}.mdi-file-cloud:before{content:"\f0217"}.mdi-file-cloud-outline:before{content:"\f102a"}.mdi-file-code:before{content:"\f022e"}.mdi-file-code-outline:before{content:"\f102b"}.mdi-file-cog:before{content:"\f107b"}.mdi-file-cog-outline:before{content:"\f107c"}.mdi-file-compare:before{content:"\f08aa"}.mdi-file-delimited:before{content:"\f0218"}.mdi-file-delimited-outline:before{content:"\f0ea5"}.mdi-file-document:before{content:"\f0219"}.mdi-file-document-alert:before{content:"\f1a97"}.mdi-file-document-alert-outline:before{content:"\f1a98"}.mdi-file-document-arrow-right:before{content:"\f1c0f"}.mdi-file-document-arrow-right-outline:before{content:"\f1c10"}.mdi-file-document-check:before{content:"\f1a99"}.mdi-file-document-check-outline:before{content:"\f1a9a"}.mdi-file-document-edit:before{content:"\f0dc8"}.mdi-file-document-edit-outline:before{content:"\f0dc9"}.mdi-file-document-minus:before{content:"\f1a9b"}.mdi-file-document-minus-outline:before{content:"\f1a9c"}.mdi-file-document-multiple:before{content:"\f1517"}.mdi-file-document-multiple-outline:before{content:"\f1518"}.mdi-file-document-outline:before{content:"\f09ee"}.mdi-file-document-plus:before{content:"\f1a9d"}.mdi-file-document-plus-outline:before{content:"\f1a9e"}.mdi-file-document-refresh:before{content:"\f1c7a"}.mdi-file-document-refresh-outline:before{content:"\f1c7b"}.mdi-file-document-remove:before{content:"\f1a9f"}.mdi-file-document-remove-outline:before{content:"\f1aa0"}.mdi-file-download:before{content:"\f0965"}.mdi-file-download-outline:before{content:"\f0966"}.mdi-file-edit:before{content:"\f11e7"}.mdi-file-edit-outline:before{content:"\f11e8"}.mdi-file-excel:before{content:"\f021b"}.mdi-file-excel-box:before{content:"\f021c"}.mdi-file-excel-box-outline:before{content:"\f102c"}.mdi-file-excel-outline:before{content:"\f102d"}.mdi-file-export:before{content:"\f021d"}.mdi-file-export-outline:before{content:"\f102e"}.mdi-file-eye:before{content:"\f0dca"}.mdi-file-eye-outline:before{content:"\f0dcb"}.mdi-file-find:before{content:"\f021e"}.mdi-file-find-outline:before{content:"\f0b97"}.mdi-file-gif-box:before{content:"\f0d78"}.mdi-file-hidden:before{content:"\f0613"}.mdi-file-image:before{content:"\f021f"}.mdi-file-image-marker:before{content:"\f1772"}.mdi-file-image-marker-outline:before{content:"\f1773"}.mdi-file-image-minus:before{content:"\f193b"}.mdi-file-image-minus-outline:before{content:"\f193c"}.mdi-file-image-outline:before{content:"\f0eb0"}.mdi-file-image-plus:before{content:"\f193d"}.mdi-file-image-plus-outline:before{content:"\f193e"}.mdi-file-image-remove:before{content:"\f193f"}.mdi-file-image-remove-outline:before{content:"\f1940"}.mdi-file-import:before{content:"\f0220"}.mdi-file-import-outline:before{content:"\f102f"}.mdi-file-jpg-box:before{content:"\f0225"}.mdi-file-key:before{content:"\f1184"}.mdi-file-key-outline:before{content:"\f1185"}.mdi-file-link:before{content:"\f1177"}.mdi-file-link-outline:before{content:"\f1178"}.mdi-file-lock:before{content:"\f0221"}.mdi-file-lock-open:before{content:"\f19c8"}.mdi-file-lock-open-outline:before{content:"\f19c9"}.mdi-file-lock-outline:before{content:"\f1030"}.mdi-file-marker:before{content:"\f1774"}.mdi-file-marker-outline:before{content:"\f1775"}.mdi-file-minus:before{content:"\f1aa1"}.mdi-file-minus-outline:before{content:"\f1aa2"}.mdi-file-move:before{content:"\f0ab9"}.mdi-file-move-outline:before{content:"\f1031"}.mdi-file-multiple:before{content:"\f0222"}.mdi-file-multiple-outline:before{content:"\f1032"}.mdi-file-music:before{content:"\f0223"}.mdi-file-music-outline:before{content:"\f0e2a"}.mdi-file-outline:before{content:"\f0224"}.mdi-file-pdf-box:before{content:"\f0226"}.mdi-file-percent:before{content:"\f081e"}.mdi-file-percent-outline:before{content:"\f1033"}.mdi-file-phone:before{content:"\f1179"}.mdi-file-phone-outline:before{content:"\f117a"}.mdi-file-plus:before{content:"\f0752"}.mdi-file-plus-outline:before{content:"\f0eed"}.mdi-file-png-box:before{content:"\f0e2d"}.mdi-file-powerpoint:before{content:"\f0227"}.mdi-file-powerpoint-box:before{content:"\f0228"}.mdi-file-powerpoint-box-outline:before{content:"\f1034"}.mdi-file-powerpoint-outline:before{content:"\f1035"}.mdi-file-presentation-box:before{content:"\f0229"}.mdi-file-question:before{content:"\f086f"}.mdi-file-question-outline:before{content:"\f1036"}.mdi-file-refresh:before{content:"\f0918"}.mdi-file-refresh-outline:before{content:"\f0541"}.mdi-file-remove:before{content:"\f0b98"}.mdi-file-remove-outline:before{content:"\f1037"}.mdi-file-replace:before{content:"\f0b32"}.mdi-file-replace-outline:before{content:"\f0b33"}.mdi-file-restore:before{content:"\f0670"}.mdi-file-restore-outline:before{content:"\f1038"}.mdi-file-rotate-left:before{content:"\f1a3b"}.mdi-file-rotate-left-outline:before{content:"\f1a3c"}.mdi-file-rotate-right:before{content:"\f1a3d"}.mdi-file-rotate-right-outline:before{content:"\f1a3e"}.mdi-file-search:before{content:"\f0c7c"}.mdi-file-search-outline:before{content:"\f0c7d"}.mdi-file-send:before{content:"\f022a"}.mdi-file-send-outline:before{content:"\f1039"}.mdi-file-settings:before{content:"\f1079"}.mdi-file-settings-outline:before{content:"\f107a"}.mdi-file-sign:before{content:"\f19c3"}.mdi-file-star:before{content:"\f103a"}.mdi-file-star-four-points:before{content:"\f1c2d"}.mdi-file-star-four-points-outline:before{content:"\f1c2e"}.mdi-file-star-outline:before{content:"\f103b"}.mdi-file-swap:before{content:"\f0fb4"}.mdi-file-swap-outline:before{content:"\f0fb5"}.mdi-file-sync:before{content:"\f1216"}.mdi-file-sync-outline:before{content:"\f1217"}.mdi-file-table:before{content:"\f0c7e"}.mdi-file-table-box:before{content:"\f10e1"}.mdi-file-table-box-multiple:before{content:"\f10e2"}.mdi-file-table-box-multiple-outline:before{content:"\f10e3"}.mdi-file-table-box-outline:before{content:"\f10e4"}.mdi-file-table-outline:before{content:"\f0c7f"}.mdi-file-tree:before{content:"\f0645"}.mdi-file-tree-outline:before{content:"\f13d2"}.mdi-file-undo:before{content:"\f08dc"}.mdi-file-undo-outline:before{content:"\f103c"}.mdi-file-upload:before{content:"\f0a4d"}.mdi-file-upload-outline:before{content:"\f0a4e"}.mdi-file-video:before{content:"\f022b"}.mdi-file-video-outline:before{content:"\f0e2c"}.mdi-file-word:before{content:"\f022c"}.mdi-file-word-box:before{content:"\f022d"}.mdi-file-word-box-outline:before{content:"\f103d"}.mdi-file-word-outline:before{content:"\f103e"}.mdi-file-xml-box:before{content:"\f1b4b"}.mdi-film:before{content:"\f022f"}.mdi-filmstrip:before{content:"\f0230"}.mdi-filmstrip-box:before{content:"\f0332"}.mdi-filmstrip-box-multiple:before{content:"\f0d18"}.mdi-filmstrip-off:before{content:"\f0231"}.mdi-filter:before{content:"\f0232"}.mdi-filter-check:before{content:"\f18ec"}.mdi-filter-check-outline:before{content:"\f18ed"}.mdi-filter-cog:before{content:"\f1aa3"}.mdi-filter-cog-outline:before{content:"\f1aa4"}.mdi-filter-menu:before{content:"\f10e5"}.mdi-filter-menu-outline:before{content:"\f10e6"}.mdi-filter-minus:before{content:"\f0eee"}.mdi-filter-minus-outline:before{content:"\f0eef"}.mdi-filter-multiple:before{content:"\f1a3f"}.mdi-filter-multiple-outline:before{content:"\f1a40"}.mdi-filter-off:before{content:"\f14ef"}.mdi-filter-off-outline:before{content:"\f14f0"}.mdi-filter-outline:before{content:"\f0233"}.mdi-filter-plus:before{content:"\f0ef0"}.mdi-filter-plus-outline:before{content:"\f0ef1"}.mdi-filter-remove:before{content:"\f0234"}.mdi-filter-remove-outline:before{content:"\f0235"}.mdi-filter-settings:before{content:"\f1aa5"}.mdi-filter-settings-outline:before{content:"\f1aa6"}.mdi-filter-variant:before{content:"\f0236"}.mdi-filter-variant-minus:before{content:"\f1112"}.mdi-filter-variant-plus:before{content:"\f1113"}.mdi-filter-variant-remove:before{content:"\f103f"}.mdi-finance:before{content:"\f081f"}.mdi-find-replace:before{content:"\f06d4"}.mdi-fingerprint:before{content:"\f0237"}.mdi-fingerprint-off:before{content:"\f0eb1"}.mdi-fire:before{content:"\f0238"}.mdi-fire-alert:before{content:"\f15d7"}.mdi-fire-circle:before{content:"\f1807"}.mdi-fire-extinguisher:before{content:"\f0ef2"}.mdi-fire-hydrant:before{content:"\f1137"}.mdi-fire-hydrant-alert:before{content:"\f1138"}.mdi-fire-hydrant-off:before{content:"\f1139"}.mdi-fire-off:before{content:"\f1722"}.mdi-fire-station:before{content:"\f1cc3"}.mdi-fire-truck:before{content:"\f08ab"}.mdi-firebase:before{content:"\f0967"}.mdi-firefox:before{content:"\f0239"}.mdi-fireplace:before{content:"\f0e2e"}.mdi-fireplace-off:before{content:"\f0e2f"}.mdi-firewire:before{content:"\f05be"}.mdi-firework:before{content:"\f0e30"}.mdi-firework-off:before{content:"\f1723"}.mdi-fish:before{content:"\f023a"}.mdi-fish-off:before{content:"\f13f3"}.mdi-fishbowl:before{content:"\f0ef3"}.mdi-fishbowl-outline:before{content:"\f0ef4"}.mdi-fit-to-page:before{content:"\f0ef5"}.mdi-fit-to-page-outline:before{content:"\f0ef6"}.mdi-fit-to-screen:before{content:"\f18f4"}.mdi-fit-to-screen-outline:before{content:"\f18f5"}.mdi-flag:before{content:"\f023b"}.mdi-flag-checkered:before{content:"\f023c"}.mdi-flag-minus:before{content:"\f0b99"}.mdi-flag-minus-outline:before{content:"\f10b2"}.mdi-flag-off:before{content:"\f18ee"}.mdi-flag-off-outline:before{content:"\f18ef"}.mdi-flag-outline:before{content:"\f023d"}.mdi-flag-plus:before{content:"\f0b9a"}.mdi-flag-plus-outline:before{content:"\f10b3"}.mdi-flag-remove:before{content:"\f0b9b"}.mdi-flag-remove-outline:before{content:"\f10b4"}.mdi-flag-triangle:before{content:"\f023f"}.mdi-flag-variant:before{content:"\f0240"}.mdi-flag-variant-minus:before{content:"\f1bb4"}.mdi-flag-variant-minus-outline:before{content:"\f1bb5"}.mdi-flag-variant-off:before{content:"\f1bb0"}.mdi-flag-variant-off-outline:before{content:"\f1bb1"}.mdi-flag-variant-outline:before{content:"\f023e"}.mdi-flag-variant-plus:before{content:"\f1bb2"}.mdi-flag-variant-plus-outline:before{content:"\f1bb3"}.mdi-flag-variant-remove:before{content:"\f1bb6"}.mdi-flag-variant-remove-outline:before{content:"\f1bb7"}.mdi-flare:before{content:"\f0d72"}.mdi-flash:before{content:"\f0241"}.mdi-flash-alert:before{content:"\f0ef7"}.mdi-flash-alert-outline:before{content:"\f0ef8"}.mdi-flash-auto:before{content:"\f0242"}.mdi-flash-off:before{content:"\f0243"}.mdi-flash-off-outline:before{content:"\f1b45"}.mdi-flash-outline:before{content:"\f06d5"}.mdi-flash-red-eye:before{content:"\f067b"}.mdi-flash-triangle:before{content:"\f1b1d"}.mdi-flash-triangle-outline:before{content:"\f1b1e"}.mdi-flashlight:before{content:"\f0244"}.mdi-flashlight-off:before{content:"\f0245"}.mdi-flask:before{content:"\f0093"}.mdi-flask-empty:before{content:"\f0094"}.mdi-flask-empty-minus:before{content:"\f123a"}.mdi-flask-empty-minus-outline:before{content:"\f123b"}.mdi-flask-empty-off:before{content:"\f13f4"}.mdi-flask-empty-off-outline:before{content:"\f13f5"}.mdi-flask-empty-outline:before{content:"\f0095"}.mdi-flask-empty-plus:before{content:"\f123c"}.mdi-flask-empty-plus-outline:before{content:"\f123d"}.mdi-flask-empty-remove:before{content:"\f123e"}.mdi-flask-empty-remove-outline:before{content:"\f123f"}.mdi-flask-minus:before{content:"\f1240"}.mdi-flask-minus-outline:before{content:"\f1241"}.mdi-flask-off:before{content:"\f13f6"}.mdi-flask-off-outline:before{content:"\f13f7"}.mdi-flask-outline:before{content:"\f0096"}.mdi-flask-plus:before{content:"\f1242"}.mdi-flask-plus-outline:before{content:"\f1243"}.mdi-flask-remove:before{content:"\f1244"}.mdi-flask-remove-outline:before{content:"\f1245"}.mdi-flask-round-bottom:before{content:"\f124b"}.mdi-flask-round-bottom-empty:before{content:"\f124c"}.mdi-flask-round-bottom-empty-outline:before{content:"\f124d"}.mdi-flask-round-bottom-outline:before{content:"\f124e"}.mdi-fleur-de-lis:before{content:"\f1303"}.mdi-flip-horizontal:before{content:"\f10e7"}.mdi-flip-to-back:before{content:"\f0247"}.mdi-flip-to-front:before{content:"\f0248"}.mdi-flip-vertical:before{content:"\f10e8"}.mdi-floor-lamp:before{content:"\f08dd"}.mdi-floor-lamp-dual:before{content:"\f1040"}.mdi-floor-lamp-dual-outline:before{content:"\f17ce"}.mdi-floor-lamp-outline:before{content:"\f17c8"}.mdi-floor-lamp-torchiere:before{content:"\f1747"}.mdi-floor-lamp-torchiere-outline:before{content:"\f17d6"}.mdi-floor-lamp-torchiere-variant:before{content:"\f1041"}.mdi-floor-lamp-torchiere-variant-outline:before{content:"\f17cf"}.mdi-floor-plan:before{content:"\f0821"}.mdi-floppy:before{content:"\f0249"}.mdi-floppy-variant:before{content:"\f09ef"}.mdi-flower:before{content:"\f024a"}.mdi-flower-outline:before{content:"\f09f0"}.mdi-flower-pollen:before{content:"\f1885"}.mdi-flower-pollen-outline:before{content:"\f1886"}.mdi-flower-poppy:before{content:"\f0d08"}.mdi-flower-tulip:before{content:"\f09f1"}.mdi-flower-tulip-outline:before{content:"\f09f2"}.mdi-focus-auto:before{content:"\f0f4e"}.mdi-focus-field:before{content:"\f0f4f"}.mdi-focus-field-horizontal:before{content:"\f0f50"}.mdi-focus-field-vertical:before{content:"\f0f51"}.mdi-folder:before{content:"\f024b"}.mdi-folder-account:before{content:"\f024c"}.mdi-folder-account-outline:before{content:"\f0b9c"}.mdi-folder-alert:before{content:"\f0dcc"}.mdi-folder-alert-outline:before{content:"\f0dcd"}.mdi-folder-arrow-down:before{content:"\f19e8"}.mdi-folder-arrow-down-outline:before{content:"\f19e9"}.mdi-folder-arrow-left:before{content:"\f19ea"}.mdi-folder-arrow-left-outline:before{content:"\f19eb"}.mdi-folder-arrow-left-right:before{content:"\f19ec"}.mdi-folder-arrow-left-right-outline:before{content:"\f19ed"}.mdi-folder-arrow-right:before{content:"\f19ee"}.mdi-folder-arrow-right-outline:before{content:"\f19ef"}.mdi-folder-arrow-up:before{content:"\f19f0"}.mdi-folder-arrow-up-down:before{content:"\f19f1"}.mdi-folder-arrow-up-down-outline:before{content:"\f19f2"}.mdi-folder-arrow-up-outline:before{content:"\f19f3"}.mdi-folder-cancel:before{content:"\f19f4"}.mdi-folder-cancel-outline:before{content:"\f19f5"}.mdi-folder-check:before{content:"\f197e"}.mdi-folder-check-outline:before{content:"\f197f"}.mdi-folder-clock:before{content:"\f0aba"}.mdi-folder-clock-outline:before{content:"\f0abb"}.mdi-folder-cog:before{content:"\f107f"}.mdi-folder-cog-outline:before{content:"\f1080"}.mdi-folder-download:before{content:"\f024d"}.mdi-folder-download-outline:before{content:"\f10e9"}.mdi-folder-edit:before{content:"\f08de"}.mdi-folder-edit-outline:before{content:"\f0dce"}.mdi-folder-eye:before{content:"\f178a"}.mdi-folder-eye-outline:before{content:"\f178b"}.mdi-folder-file:before{content:"\f19f6"}.mdi-folder-file-outline:before{content:"\f19f7"}.mdi-folder-google-drive:before{content:"\f024e"}.mdi-folder-heart:before{content:"\f10ea"}.mdi-folder-heart-outline:before{content:"\f10eb"}.mdi-folder-hidden:before{content:"\f179e"}.mdi-folder-home:before{content:"\f10b5"}.mdi-folder-home-outline:before{content:"\f10b6"}.mdi-folder-image:before{content:"\f024f"}.mdi-folder-information:before{content:"\f10b7"}.mdi-folder-information-outline:before{content:"\f10b8"}.mdi-folder-key:before{content:"\f08ac"}.mdi-folder-key-network:before{content:"\f08ad"}.mdi-folder-key-network-outline:before{content:"\f0c80"}.mdi-folder-key-outline:before{content:"\f10ec"}.mdi-folder-lock:before{content:"\f0250"}.mdi-folder-lock-open:before{content:"\f0251"}.mdi-folder-lock-open-outline:before{content:"\f1aa7"}.mdi-folder-lock-outline:before{content:"\f1aa8"}.mdi-folder-marker:before{content:"\f126d"}.mdi-folder-marker-outline:before{content:"\f126e"}.mdi-folder-minus:before{content:"\f1b49"}.mdi-folder-minus-outline:before{content:"\f1b4a"}.mdi-folder-move:before{content:"\f0252"}.mdi-folder-move-outline:before{content:"\f1246"}.mdi-folder-multiple:before{content:"\f0253"}.mdi-folder-multiple-image:before{content:"\f0254"}.mdi-folder-multiple-outline:before{content:"\f0255"}.mdi-folder-multiple-plus:before{content:"\f147e"}.mdi-folder-multiple-plus-outline:before{content:"\f147f"}.mdi-folder-music:before{content:"\f1359"}.mdi-folder-music-outline:before{content:"\f135a"}.mdi-folder-network:before{content:"\f0870"}.mdi-folder-network-outline:before{content:"\f0c81"}.mdi-folder-off:before{content:"\f19f8"}.mdi-folder-off-outline:before{content:"\f19f9"}.mdi-folder-open:before{content:"\f0770"}.mdi-folder-open-outline:before{content:"\f0dcf"}.mdi-folder-outline:before{content:"\f0256"}.mdi-folder-play:before{content:"\f19fa"}.mdi-folder-play-outline:before{content:"\f19fb"}.mdi-folder-plus:before{content:"\f0257"}.mdi-folder-plus-outline:before{content:"\f0b9d"}.mdi-folder-pound:before{content:"\f0d09"}.mdi-folder-pound-outline:before{content:"\f0d0a"}.mdi-folder-question:before{content:"\f19ca"}.mdi-folder-question-outline:before{content:"\f19cb"}.mdi-folder-refresh:before{content:"\f0749"}.mdi-folder-refresh-outline:before{content:"\f0542"}.mdi-folder-remove:before{content:"\f0258"}.mdi-folder-remove-outline:before{content:"\f0b9e"}.mdi-folder-search:before{content:"\f0968"}.mdi-folder-search-outline:before{content:"\f0969"}.mdi-folder-settings:before{content:"\f107d"}.mdi-folder-settings-outline:before{content:"\f107e"}.mdi-folder-star:before{content:"\f069d"}.mdi-folder-star-multiple:before{content:"\f13d3"}.mdi-folder-star-multiple-outline:before{content:"\f13d4"}.mdi-folder-star-outline:before{content:"\f0b9f"}.mdi-folder-swap:before{content:"\f0fb6"}.mdi-folder-swap-outline:before{content:"\f0fb7"}.mdi-folder-sync:before{content:"\f0d0b"}.mdi-folder-sync-outline:before{content:"\f0d0c"}.mdi-folder-table:before{content:"\f12e3"}.mdi-folder-table-outline:before{content:"\f12e4"}.mdi-folder-text:before{content:"\f0c82"}.mdi-folder-text-outline:before{content:"\f0c83"}.mdi-folder-upload:before{content:"\f0259"}.mdi-folder-upload-outline:before{content:"\f10ed"}.mdi-folder-wrench:before{content:"\f19fc"}.mdi-folder-wrench-outline:before{content:"\f19fd"}.mdi-folder-zip:before{content:"\f06eb"}.mdi-folder-zip-outline:before{content:"\f07b9"}.mdi-font-awesome:before{content:"\f003a"}.mdi-food:before{content:"\f025a"}.mdi-food-apple:before{content:"\f025b"}.mdi-food-apple-outline:before{content:"\f0c84"}.mdi-food-croissant:before{content:"\f07c8"}.mdi-food-drumstick:before{content:"\f141f"}.mdi-food-drumstick-off:before{content:"\f1468"}.mdi-food-drumstick-off-outline:before{content:"\f1469"}.mdi-food-drumstick-outline:before{content:"\f1420"}.mdi-food-fork-drink:before{content:"\f05f2"}.mdi-food-halal:before{content:"\f1572"}.mdi-food-hot-dog:before{content:"\f184b"}.mdi-food-kosher:before{content:"\f1573"}.mdi-food-off:before{content:"\f05f3"}.mdi-food-off-outline:before{content:"\f1915"}.mdi-food-outline:before{content:"\f1916"}.mdi-food-steak:before{content:"\f146a"}.mdi-food-steak-off:before{content:"\f146b"}.mdi-food-takeout-box:before{content:"\f1836"}.mdi-food-takeout-box-outline:before{content:"\f1837"}.mdi-food-turkey:before{content:"\f171c"}.mdi-food-variant:before{content:"\f025c"}.mdi-food-variant-off:before{content:"\f13e5"}.mdi-foot-print:before{content:"\f0f52"}.mdi-football:before{content:"\f025d"}.mdi-football-australian:before{content:"\f025e"}.mdi-football-helmet:before{content:"\f025f"}.mdi-forest:before{content:"\f1897"}.mdi-forest-outline:before{content:"\f1c63"}.mdi-forklift:before{content:"\f07c9"}.mdi-form-dropdown:before{content:"\f1400"}.mdi-form-select:before{content:"\f1401"}.mdi-form-textarea:before{content:"\f1095"}.mdi-form-textbox:before{content:"\f060e"}.mdi-form-textbox-lock:before{content:"\f135d"}.mdi-form-textbox-password:before{content:"\f07f5"}.mdi-format-align-bottom:before{content:"\f0753"}.mdi-format-align-center:before{content:"\f0260"}.mdi-format-align-justify:before{content:"\f0261"}.mdi-format-align-left:before{content:"\f0262"}.mdi-format-align-middle:before{content:"\f0754"}.mdi-format-align-right:before{content:"\f0263"}.mdi-format-align-top:before{content:"\f0755"}.mdi-format-annotation-minus:before{content:"\f0abc"}.mdi-format-annotation-plus:before{content:"\f0646"}.mdi-format-bold:before{content:"\f0264"}.mdi-format-clear:before{content:"\f0265"}.mdi-format-color-fill:before{content:"\f0266"}.mdi-format-color-highlight:before{content:"\f0e31"}.mdi-format-color-marker-cancel:before{content:"\f1313"}.mdi-format-color-text:before{content:"\f069e"}.mdi-format-columns:before{content:"\f08df"}.mdi-format-float-center:before{content:"\f0267"}.mdi-format-float-left:before{content:"\f0268"}.mdi-format-float-none:before{content:"\f0269"}.mdi-format-float-right:before{content:"\f026a"}.mdi-format-font:before{content:"\f06d6"}.mdi-format-font-size-decrease:before{content:"\f09f3"}.mdi-format-font-size-increase:before{content:"\f09f4"}.mdi-format-header-1:before{content:"\f026b"}.mdi-format-header-2:before{content:"\f026c"}.mdi-format-header-3:before{content:"\f026d"}.mdi-format-header-4:before{content:"\f026e"}.mdi-format-header-5:before{content:"\f026f"}.mdi-format-header-6:before{content:"\f0270"}.mdi-format-header-decrease:before{content:"\f0271"}.mdi-format-header-equal:before{content:"\f0272"}.mdi-format-header-increase:before{content:"\f0273"}.mdi-format-header-pound:before{content:"\f0274"}.mdi-format-horizontal-align-center:before{content:"\f061e"}.mdi-format-horizontal-align-left:before{content:"\f061f"}.mdi-format-horizontal-align-right:before{content:"\f0620"}.mdi-format-indent-decrease:before{content:"\f0275"}.mdi-format-indent-increase:before{content:"\f0276"}.mdi-format-italic:before{content:"\f0277"}.mdi-format-letter-case:before{content:"\f0b34"}.mdi-format-letter-case-lower:before{content:"\f0b35"}.mdi-format-letter-case-upper:before{content:"\f0b36"}.mdi-format-letter-ends-with:before{content:"\f0fb8"}.mdi-format-letter-matches:before{content:"\f0fb9"}.mdi-format-letter-spacing:before{content:"\f1956"}.mdi-format-letter-spacing-variant:before{content:"\f1afb"}.mdi-format-letter-starts-with:before{content:"\f0fba"}.mdi-format-line-height:before{content:"\f1afc"}.mdi-format-line-spacing:before{content:"\f0278"}.mdi-format-line-style:before{content:"\f05c8"}.mdi-format-line-weight:before{content:"\f05c9"}.mdi-format-list-bulleted:before{content:"\f0279"}.mdi-format-list-bulleted-square:before{content:"\f0dd0"}.mdi-format-list-bulleted-triangle:before{content:"\f0eb2"}.mdi-format-list-bulleted-type:before{content:"\f027a"}.mdi-format-list-checkbox:before{content:"\f096a"}.mdi-format-list-checks:before{content:"\f0756"}.mdi-format-list-group:before{content:"\f1860"}.mdi-format-list-group-plus:before{content:"\f1b56"}.mdi-format-list-numbered:before{content:"\f027b"}.mdi-format-list-numbered-rtl:before{content:"\f0d0d"}.mdi-format-list-text:before{content:"\f126f"}.mdi-format-overline:before{content:"\f0eb3"}.mdi-format-page-break:before{content:"\f06d7"}.mdi-format-page-split:before{content:"\f1917"}.mdi-format-paint:before{content:"\f027c"}.mdi-format-paragraph:before{content:"\f027d"}.mdi-format-paragraph-spacing:before{content:"\f1afd"}.mdi-format-pilcrow:before{content:"\f06d8"}.mdi-format-pilcrow-arrow-left:before{content:"\f0286"}.mdi-format-pilcrow-arrow-right:before{content:"\f0285"}.mdi-format-quote-close:before{content:"\f027e"}.mdi-format-quote-close-outline:before{content:"\f11a8"}.mdi-format-quote-open:before{content:"\f0757"}.mdi-format-quote-open-outline:before{content:"\f11a7"}.mdi-format-rotate-90:before{content:"\f06aa"}.mdi-format-section:before{content:"\f069f"}.mdi-format-size:before{content:"\f027f"}.mdi-format-strikethrough:before{content:"\f0280"}.mdi-format-strikethrough-variant:before{content:"\f0281"}.mdi-format-subscript:before{content:"\f0282"}.mdi-format-superscript:before{content:"\f0283"}.mdi-format-text:before{content:"\f0284"}.mdi-format-text-rotation-angle-down:before{content:"\f0fbb"}.mdi-format-text-rotation-angle-up:before{content:"\f0fbc"}.mdi-format-text-rotation-down:before{content:"\f0d73"}.mdi-format-text-rotation-down-vertical:before{content:"\f0fbd"}.mdi-format-text-rotation-none:before{content:"\f0d74"}.mdi-format-text-rotation-up:before{content:"\f0fbe"}.mdi-format-text-rotation-vertical:before{content:"\f0fbf"}.mdi-format-text-variant:before{content:"\f0e32"}.mdi-format-text-variant-outline:before{content:"\f150f"}.mdi-format-text-wrapping-clip:before{content:"\f0d0e"}.mdi-format-text-wrapping-overflow:before{content:"\f0d0f"}.mdi-format-text-wrapping-wrap:before{content:"\f0d10"}.mdi-format-textbox:before{content:"\f0d11"}.mdi-format-title:before{content:"\f05f4"}.mdi-format-underline:before{content:"\f0287"}.mdi-format-underline-wavy:before{content:"\f18e9"}.mdi-format-vertical-align-bottom:before{content:"\f0621"}.mdi-format-vertical-align-center:before{content:"\f0622"}.mdi-format-vertical-align-top:before{content:"\f0623"}.mdi-format-wrap-inline:before{content:"\f0288"}.mdi-format-wrap-square:before{content:"\f0289"}.mdi-format-wrap-tight:before{content:"\f028a"}.mdi-format-wrap-top-bottom:before{content:"\f028b"}.mdi-forum:before{content:"\f028c"}.mdi-forum-minus:before{content:"\f1aa9"}.mdi-forum-minus-outline:before{content:"\f1aaa"}.mdi-forum-outline:before{content:"\f0822"}.mdi-forum-plus:before{content:"\f1aab"}.mdi-forum-plus-outline:before{content:"\f1aac"}.mdi-forum-remove:before{content:"\f1aad"}.mdi-forum-remove-outline:before{content:"\f1aae"}.mdi-forward:before{content:"\f028d"}.mdi-forwardburger:before{content:"\f0d75"}.mdi-fountain:before{content:"\f096b"}.mdi-fountain-pen:before{content:"\f0d12"}.mdi-fountain-pen-tip:before{content:"\f0d13"}.mdi-fraction-one-half:before{content:"\f1992"}.mdi-freebsd:before{content:"\f08e0"}.mdi-french-fries:before{content:"\f1957"}.mdi-frequently-asked-questions:before{content:"\f0eb4"}.mdi-fridge:before{content:"\f0290"}.mdi-fridge-alert:before{content:"\f11b1"}.mdi-fridge-alert-outline:before{content:"\f11b2"}.mdi-fridge-bottom:before{content:"\f0292"}.mdi-fridge-industrial:before{content:"\f15ee"}.mdi-fridge-industrial-alert:before{content:"\f15ef"}.mdi-fridge-industrial-alert-outline:before{content:"\f15f0"}.mdi-fridge-industrial-off:before{content:"\f15f1"}.mdi-fridge-industrial-off-outline:before{content:"\f15f2"}.mdi-fridge-industrial-outline:before{content:"\f15f3"}.mdi-fridge-off:before{content:"\f11af"}.mdi-fridge-off-outline:before{content:"\f11b0"}.mdi-fridge-outline:before{content:"\f028f"}.mdi-fridge-top:before{content:"\f0291"}.mdi-fridge-variant:before{content:"\f15f4"}.mdi-fridge-variant-alert:before{content:"\f15f5"}.mdi-fridge-variant-alert-outline:before{content:"\f15f6"}.mdi-fridge-variant-off:before{content:"\f15f7"}.mdi-fridge-variant-off-outline:before{content:"\f15f8"}.mdi-fridge-variant-outline:before{content:"\f15f9"}.mdi-fruit-cherries:before{content:"\f1042"}.mdi-fruit-cherries-off:before{content:"\f13f8"}.mdi-fruit-citrus:before{content:"\f1043"}.mdi-fruit-citrus-off:before{content:"\f13f9"}.mdi-fruit-grapes:before{content:"\f1044"}.mdi-fruit-grapes-outline:before{content:"\f1045"}.mdi-fruit-pear:before{content:"\f1a0e"}.mdi-fruit-pineapple:before{content:"\f1046"}.mdi-fruit-watermelon:before{content:"\f1047"}.mdi-fuel:before{content:"\f07ca"}.mdi-fuel-cell:before{content:"\f18b5"}.mdi-fullscreen:before{content:"\f0293"}.mdi-fullscreen-exit:before{content:"\f0294"}.mdi-function:before{content:"\f0295"}.mdi-function-variant:before{content:"\f0871"}.mdi-furigana-horizontal:before{content:"\f1081"}.mdi-furigana-vertical:before{content:"\f1082"}.mdi-fuse:before{content:"\f0c85"}.mdi-fuse-alert:before{content:"\f142d"}.mdi-fuse-blade:before{content:"\f0c86"}.mdi-fuse-off:before{content:"\f142c"}.mdi-gamepad:before{content:"\f0296"}.mdi-gamepad-circle:before{content:"\f0e33"}.mdi-gamepad-circle-down:before{content:"\f0e34"}.mdi-gamepad-circle-left:before{content:"\f0e35"}.mdi-gamepad-circle-outline:before{content:"\f0e36"}.mdi-gamepad-circle-right:before{content:"\f0e37"}.mdi-gamepad-circle-up:before{content:"\f0e38"}.mdi-gamepad-down:before{content:"\f0e39"}.mdi-gamepad-left:before{content:"\f0e3a"}.mdi-gamepad-outline:before{content:"\f1919"}.mdi-gamepad-right:before{content:"\f0e3b"}.mdi-gamepad-round:before{content:"\f0e3c"}.mdi-gamepad-round-down:before{content:"\f0e3d"}.mdi-gamepad-round-left:before{content:"\f0e3e"}.mdi-gamepad-round-outline:before{content:"\f0e3f"}.mdi-gamepad-round-right:before{content:"\f0e40"}.mdi-gamepad-round-up:before{content:"\f0e41"}.mdi-gamepad-square:before{content:"\f0eb5"}.mdi-gamepad-square-outline:before{content:"\f0eb6"}.mdi-gamepad-up:before{content:"\f0e42"}.mdi-gamepad-variant:before{content:"\f0297"}.mdi-gamepad-variant-outline:before{content:"\f0eb7"}.mdi-gamma:before{content:"\f10ee"}.mdi-gantry-crane:before{content:"\f0dd1"}.mdi-garage:before{content:"\f06d9"}.mdi-garage-alert:before{content:"\f0872"}.mdi-garage-alert-variant:before{content:"\f12d5"}.mdi-garage-lock:before{content:"\f17fb"}.mdi-garage-open:before{content:"\f06da"}.mdi-garage-open-variant:before{content:"\f12d4"}.mdi-garage-variant:before{content:"\f12d3"}.mdi-garage-variant-lock:before{content:"\f17fc"}.mdi-gas-burner:before{content:"\f1a1b"}.mdi-gas-cylinder:before{content:"\f0647"}.mdi-gas-station:before{content:"\f0298"}.mdi-gas-station-in-use:before{content:"\f1cc4"}.mdi-gas-station-in-use-outline:before{content:"\f1cc5"}.mdi-gas-station-off:before{content:"\f1409"}.mdi-gas-station-off-outline:before{content:"\f140a"}.mdi-gas-station-outline:before{content:"\f0eb8"}.mdi-gate:before{content:"\f0299"}.mdi-gate-alert:before{content:"\f17f8"}.mdi-gate-and:before{content:"\f08e1"}.mdi-gate-arrow-left:before{content:"\f17f7"}.mdi-gate-arrow-right:before{content:"\f1169"}.mdi-gate-buffer:before{content:"\f1afe"}.mdi-gate-nand:before{content:"\f08e2"}.mdi-gate-nor:before{content:"\f08e3"}.mdi-gate-not:before{content:"\f08e4"}.mdi-gate-open:before{content:"\f116a"}.mdi-gate-or:before{content:"\f08e5"}.mdi-gate-xnor:before{content:"\f08e6"}.mdi-gate-xor:before{content:"\f08e7"}.mdi-gatsby:before{content:"\f0e43"}.mdi-gauge:before{content:"\f029a"}.mdi-gauge-empty:before{content:"\f0873"}.mdi-gauge-full:before{content:"\f0874"}.mdi-gauge-low:before{content:"\f0875"}.mdi-gavel:before{content:"\f029b"}.mdi-gender-female:before{content:"\f029c"}.mdi-gender-male:before{content:"\f029d"}.mdi-gender-male-female:before{content:"\f029e"}.mdi-gender-male-female-variant:before{content:"\f113f"}.mdi-gender-non-binary:before{content:"\f1140"}.mdi-gender-transgender:before{content:"\f029f"}.mdi-generator-mobile:before{content:"\f1c8a"}.mdi-generator-portable:before{content:"\f1c8b"}.mdi-generator-stationary:before{content:"\f1c8c"}.mdi-gentoo:before{content:"\f08e8"}.mdi-gesture:before{content:"\f07cb"}.mdi-gesture-double-tap:before{content:"\f073c"}.mdi-gesture-pinch:before{content:"\f0abd"}.mdi-gesture-spread:before{content:"\f0abe"}.mdi-gesture-swipe:before{content:"\f0d76"}.mdi-gesture-swipe-down:before{content:"\f073d"}.mdi-gesture-swipe-horizontal:before{content:"\f0abf"}.mdi-gesture-swipe-left:before{content:"\f073e"}.mdi-gesture-swipe-right:before{content:"\f073f"}.mdi-gesture-swipe-up:before{content:"\f0740"}.mdi-gesture-swipe-vertical:before{content:"\f0ac0"}.mdi-gesture-tap:before{content:"\f0741"}.mdi-gesture-tap-box:before{content:"\f12a9"}.mdi-gesture-tap-button:before{content:"\f12a8"}.mdi-gesture-tap-hold:before{content:"\f0d77"}.mdi-gesture-two-double-tap:before{content:"\f0742"}.mdi-gesture-two-tap:before{content:"\f0743"}.mdi-ghost:before{content:"\f02a0"}.mdi-ghost-off:before{content:"\f09f5"}.mdi-ghost-off-outline:before{content:"\f165c"}.mdi-ghost-outline:before{content:"\f165d"}.mdi-gift:before{content:"\f0e44"}.mdi-gift-off:before{content:"\f16ef"}.mdi-gift-off-outline:before{content:"\f16f0"}.mdi-gift-open:before{content:"\f16f1"}.mdi-gift-open-outline:before{content:"\f16f2"}.mdi-gift-outline:before{content:"\f02a1"}.mdi-git:before{content:"\f02a2"}.mdi-github:before{content:"\f02a4"}.mdi-gitlab:before{content:"\f0ba0"}.mdi-glass-cocktail:before{content:"\f0356"}.mdi-glass-cocktail-off:before{content:"\f15e6"}.mdi-glass-flute:before{content:"\f02a5"}.mdi-glass-fragile:before{content:"\f1873"}.mdi-glass-mug:before{content:"\f02a6"}.mdi-glass-mug-off:before{content:"\f15e7"}.mdi-glass-mug-variant:before{content:"\f1116"}.mdi-glass-mug-variant-off:before{content:"\f15e8"}.mdi-glass-pint-outline:before{content:"\f130d"}.mdi-glass-stange:before{content:"\f02a7"}.mdi-glass-tulip:before{content:"\f02a8"}.mdi-glass-wine:before{content:"\f0876"}.mdi-glasses:before{content:"\f02aa"}.mdi-globe-light:before{content:"\f066f"}.mdi-globe-light-outline:before{content:"\f12d7"}.mdi-globe-model:before{content:"\f08e9"}.mdi-gmail:before{content:"\f02ab"}.mdi-gnome:before{content:"\f02ac"}.mdi-go-kart:before{content:"\f0d79"}.mdi-go-kart-track:before{content:"\f0d7a"}.mdi-gog:before{content:"\f0ba1"}.mdi-gold:before{content:"\f124f"}.mdi-golf:before{content:"\f0823"}.mdi-golf-cart:before{content:"\f11a4"}.mdi-golf-tee:before{content:"\f1083"}.mdi-gondola:before{content:"\f0686"}.mdi-goodreads:before{content:"\f0d7b"}.mdi-google:before{content:"\f02ad"}.mdi-google-ads:before{content:"\f0c87"}.mdi-google-analytics:before{content:"\f07cc"}.mdi-google-assistant:before{content:"\f07cd"}.mdi-google-cardboard:before{content:"\f02ae"}.mdi-google-chrome:before{content:"\f02af"}.mdi-google-circles:before{content:"\f02b0"}.mdi-google-circles-communities:before{content:"\f02b1"}.mdi-google-circles-extended:before{content:"\f02b2"}.mdi-google-circles-group:before{content:"\f02b3"}.mdi-google-classroom:before{content:"\f02c0"}.mdi-google-cloud:before{content:"\f11f6"}.mdi-google-downasaur:before{content:"\f1362"}.mdi-google-drive:before{content:"\f02b6"}.mdi-google-earth:before{content:"\f02b7"}.mdi-google-fit:before{content:"\f096c"}.mdi-google-glass:before{content:"\f02b8"}.mdi-google-hangouts:before{content:"\f02c9"}.mdi-google-keep:before{content:"\f06dc"}.mdi-google-lens:before{content:"\f09f6"}.mdi-google-maps:before{content:"\f05f5"}.mdi-google-my-business:before{content:"\f1048"}.mdi-google-nearby:before{content:"\f02b9"}.mdi-google-play:before{content:"\f02bc"}.mdi-google-plus:before{content:"\f02bd"}.mdi-google-podcast:before{content:"\f0eb9"}.mdi-google-spreadsheet:before{content:"\f09f7"}.mdi-google-street-view:before{content:"\f0c88"}.mdi-google-translate:before{content:"\f02bf"}.mdi-gradient-horizontal:before{content:"\f174a"}.mdi-gradient-vertical:before{content:"\f06a0"}.mdi-grain:before{content:"\f0d7c"}.mdi-graph:before{content:"\f1049"}.mdi-graph-outline:before{content:"\f104a"}.mdi-graphql:before{content:"\f0877"}.mdi-grass:before{content:"\f1510"}.mdi-grave-stone:before{content:"\f0ba2"}.mdi-grease-pencil:before{content:"\f0648"}.mdi-greater-than:before{content:"\f096d"}.mdi-greater-than-or-equal:before{content:"\f096e"}.mdi-greenhouse:before{content:"\f002d"}.mdi-grid:before{content:"\f02c1"}.mdi-grid-large:before{content:"\f0758"}.mdi-grid-off:before{content:"\f02c2"}.mdi-grill:before{content:"\f0e45"}.mdi-grill-outline:before{content:"\f118a"}.mdi-group:before{content:"\f02c3"}.mdi-guitar-acoustic:before{content:"\f0771"}.mdi-guitar-electric:before{content:"\f02c4"}.mdi-guitar-pick:before{content:"\f02c5"}.mdi-guitar-pick-outline:before{content:"\f02c6"}.mdi-guy-fawkes-mask:before{content:"\f0825"}.mdi-gymnastics:before{content:"\f1a41"}.mdi-hail:before{content:"\f0ac1"}.mdi-hair-dryer:before{content:"\f10ef"}.mdi-hair-dryer-outline:before{content:"\f10f0"}.mdi-halloween:before{content:"\f0ba3"}.mdi-hamburger:before{content:"\f0685"}.mdi-hamburger-check:before{content:"\f1776"}.mdi-hamburger-minus:before{content:"\f1777"}.mdi-hamburger-off:before{content:"\f1778"}.mdi-hamburger-plus:before{content:"\f1779"}.mdi-hamburger-remove:before{content:"\f177a"}.mdi-hammer:before{content:"\f08ea"}.mdi-hammer-screwdriver:before{content:"\f1322"}.mdi-hammer-sickle:before{content:"\f1887"}.mdi-hammer-wrench:before{content:"\f1323"}.mdi-hand-back-left:before{content:"\f0e46"}.mdi-hand-back-left-off:before{content:"\f1830"}.mdi-hand-back-left-off-outline:before{content:"\f1832"}.mdi-hand-back-left-outline:before{content:"\f182c"}.mdi-hand-back-right:before{content:"\f0e47"}.mdi-hand-back-right-off:before{content:"\f1831"}.mdi-hand-back-right-off-outline:before{content:"\f1833"}.mdi-hand-back-right-outline:before{content:"\f182d"}.mdi-hand-clap:before{content:"\f194b"}.mdi-hand-clap-off:before{content:"\f1a42"}.mdi-hand-coin:before{content:"\f188f"}.mdi-hand-coin-outline:before{content:"\f1890"}.mdi-hand-cycle:before{content:"\f1b9c"}.mdi-hand-extended:before{content:"\f18b6"}.mdi-hand-extended-outline:before{content:"\f18b7"}.mdi-hand-front-left:before{content:"\f182b"}.mdi-hand-front-left-outline:before{content:"\f182e"}.mdi-hand-front-right:before{content:"\f0a4f"}.mdi-hand-front-right-outline:before{content:"\f182f"}.mdi-hand-heart:before{content:"\f10f1"}.mdi-hand-heart-outline:before{content:"\f157e"}.mdi-hand-okay:before{content:"\f0a50"}.mdi-hand-peace:before{content:"\f0a51"}.mdi-hand-peace-variant:before{content:"\f0a52"}.mdi-hand-pointing-down:before{content:"\f0a53"}.mdi-hand-pointing-left:before{content:"\f0a54"}.mdi-hand-pointing-right:before{content:"\f02c7"}.mdi-hand-pointing-up:before{content:"\f0a55"}.mdi-hand-saw:before{content:"\f0e48"}.mdi-hand-wash:before{content:"\f157f"}.mdi-hand-wash-outline:before{content:"\f1580"}.mdi-hand-water:before{content:"\f139f"}.mdi-hand-wave:before{content:"\f1821"}.mdi-hand-wave-outline:before{content:"\f1822"}.mdi-handball:before{content:"\f0f53"}.mdi-handcuffs:before{content:"\f113e"}.mdi-hands-pray:before{content:"\f0579"}.mdi-handshake:before{content:"\f1218"}.mdi-handshake-outline:before{content:"\f15a1"}.mdi-hanger:before{content:"\f02c8"}.mdi-hard-hat:before{content:"\f096f"}.mdi-harddisk:before{content:"\f02ca"}.mdi-harddisk-plus:before{content:"\f104b"}.mdi-harddisk-remove:before{content:"\f104c"}.mdi-hat-fedora:before{content:"\f0ba4"}.mdi-hazard-lights:before{content:"\f0c89"}.mdi-hdmi-port:before{content:"\f1bb8"}.mdi-hdr:before{content:"\f0d7d"}.mdi-hdr-off:before{content:"\f0d7e"}.mdi-head:before{content:"\f135e"}.mdi-head-alert:before{content:"\f1338"}.mdi-head-alert-outline:before{content:"\f1339"}.mdi-head-check:before{content:"\f133a"}.mdi-head-check-outline:before{content:"\f133b"}.mdi-head-cog:before{content:"\f133c"}.mdi-head-cog-outline:before{content:"\f133d"}.mdi-head-dots-horizontal:before{content:"\f133e"}.mdi-head-dots-horizontal-outline:before{content:"\f133f"}.mdi-head-flash:before{content:"\f1340"}.mdi-head-flash-outline:before{content:"\f1341"}.mdi-head-heart:before{content:"\f1342"}.mdi-head-heart-outline:before{content:"\f1343"}.mdi-head-lightbulb:before{content:"\f1344"}.mdi-head-lightbulb-outline:before{content:"\f1345"}.mdi-head-minus:before{content:"\f1346"}.mdi-head-minus-outline:before{content:"\f1347"}.mdi-head-outline:before{content:"\f135f"}.mdi-head-plus:before{content:"\f1348"}.mdi-head-plus-outline:before{content:"\f1349"}.mdi-head-question:before{content:"\f134a"}.mdi-head-question-outline:before{content:"\f134b"}.mdi-head-remove:before{content:"\f134c"}.mdi-head-remove-outline:before{content:"\f134d"}.mdi-head-snowflake:before{content:"\f134e"}.mdi-head-snowflake-outline:before{content:"\f134f"}.mdi-head-sync:before{content:"\f1350"}.mdi-head-sync-outline:before{content:"\f1351"}.mdi-headphones:before{content:"\f02cb"}.mdi-headphones-bluetooth:before{content:"\f0970"}.mdi-headphones-box:before{content:"\f02cc"}.mdi-headphones-off:before{content:"\f07ce"}.mdi-headphones-settings:before{content:"\f02cd"}.mdi-headset:before{content:"\f02ce"}.mdi-headset-dock:before{content:"\f02cf"}.mdi-headset-off:before{content:"\f02d0"}.mdi-heart:before{content:"\f02d1"}.mdi-heart-box:before{content:"\f02d2"}.mdi-heart-box-outline:before{content:"\f02d3"}.mdi-heart-broken:before{content:"\f02d4"}.mdi-heart-broken-outline:before{content:"\f0d14"}.mdi-heart-circle:before{content:"\f0971"}.mdi-heart-circle-outline:before{content:"\f0972"}.mdi-heart-cog:before{content:"\f1663"}.mdi-heart-cog-outline:before{content:"\f1664"}.mdi-heart-flash:before{content:"\f0ef9"}.mdi-heart-half:before{content:"\f06df"}.mdi-heart-half-full:before{content:"\f06de"}.mdi-heart-half-outline:before{content:"\f06e0"}.mdi-heart-minus:before{content:"\f142f"}.mdi-heart-minus-outline:before{content:"\f1432"}.mdi-heart-multiple:before{content:"\f0a56"}.mdi-heart-multiple-outline:before{content:"\f0a57"}.mdi-heart-off:before{content:"\f0759"}.mdi-heart-off-outline:before{content:"\f1434"}.mdi-heart-outline:before{content:"\f02d5"}.mdi-heart-plus:before{content:"\f142e"}.mdi-heart-plus-outline:before{content:"\f1431"}.mdi-heart-pulse:before{content:"\f05f6"}.mdi-heart-remove:before{content:"\f1430"}.mdi-heart-remove-outline:before{content:"\f1433"}.mdi-heart-search:before{content:"\f1c8d"}.mdi-heart-settings:before{content:"\f1665"}.mdi-heart-settings-outline:before{content:"\f1666"}.mdi-heat-pump:before{content:"\f1a43"}.mdi-heat-pump-outline:before{content:"\f1a44"}.mdi-heat-wave:before{content:"\f1a45"}.mdi-heating-coil:before{content:"\f1aaf"}.mdi-helicopter:before{content:"\f0ac2"}.mdi-help:before{content:"\f02d6"}.mdi-help-box:before{content:"\f078b"}.mdi-help-box-multiple:before{content:"\f1c0a"}.mdi-help-box-multiple-outline:before{content:"\f1c0b"}.mdi-help-box-outline:before{content:"\f1c0c"}.mdi-help-circle:before{content:"\f02d7"}.mdi-help-circle-outline:before{content:"\f0625"}.mdi-help-network:before{content:"\f06f5"}.mdi-help-network-outline:before{content:"\f0c8a"}.mdi-help-rhombus:before{content:"\f0ba5"}.mdi-help-rhombus-outline:before{content:"\f0ba6"}.mdi-hexadecimal:before{content:"\f12a7"}.mdi-hexagon:before{content:"\f02d8"}.mdi-hexagon-multiple:before{content:"\f06e1"}.mdi-hexagon-multiple-outline:before{content:"\f10f2"}.mdi-hexagon-outline:before{content:"\f02d9"}.mdi-hexagon-slice-1:before{content:"\f0ac3"}.mdi-hexagon-slice-2:before{content:"\f0ac4"}.mdi-hexagon-slice-3:before{content:"\f0ac5"}.mdi-hexagon-slice-4:before{content:"\f0ac6"}.mdi-hexagon-slice-5:before{content:"\f0ac7"}.mdi-hexagon-slice-6:before{content:"\f0ac8"}.mdi-hexagram:before{content:"\f0ac9"}.mdi-hexagram-outline:before{content:"\f0aca"}.mdi-high-definition:before{content:"\f07cf"}.mdi-high-definition-box:before{content:"\f0878"}.mdi-highway:before{content:"\f05f7"}.mdi-hiking:before{content:"\f0d7f"}.mdi-history:before{content:"\f02da"}.mdi-hockey-puck:before{content:"\f0879"}.mdi-hockey-sticks:before{content:"\f087a"}.mdi-hololens:before{content:"\f02db"}.mdi-home:before{content:"\f02dc"}.mdi-home-account:before{content:"\f0826"}.mdi-home-alert:before{content:"\f087b"}.mdi-home-alert-outline:before{content:"\f15d0"}.mdi-home-analytics:before{content:"\f0eba"}.mdi-home-assistant:before{content:"\f07d0"}.mdi-home-automation:before{content:"\f07d1"}.mdi-home-battery:before{content:"\f1901"}.mdi-home-battery-outline:before{content:"\f1902"}.mdi-home-circle:before{content:"\f07d2"}.mdi-home-circle-outline:before{content:"\f104d"}.mdi-home-city:before{content:"\f0d15"}.mdi-home-city-outline:before{content:"\f0d16"}.mdi-home-clock:before{content:"\f1a12"}.mdi-home-clock-outline:before{content:"\f1a13"}.mdi-home-edit:before{content:"\f1159"}.mdi-home-edit-outline:before{content:"\f115a"}.mdi-home-export-outline:before{content:"\f0f9b"}.mdi-home-flood:before{content:"\f0efa"}.mdi-home-floor-0:before{content:"\f0dd2"}.mdi-home-floor-1:before{content:"\f0d80"}.mdi-home-floor-2:before{content:"\f0d81"}.mdi-home-floor-3:before{content:"\f0d82"}.mdi-home-floor-a:before{content:"\f0d83"}.mdi-home-floor-b:before{content:"\f0d84"}.mdi-home-floor-g:before{content:"\f0d85"}.mdi-home-floor-l:before{content:"\f0d86"}.mdi-home-floor-negative-1:before{content:"\f0dd3"}.mdi-home-group:before{content:"\f0dd4"}.mdi-home-group-minus:before{content:"\f19c1"}.mdi-home-group-plus:before{content:"\f19c0"}.mdi-home-group-remove:before{content:"\f19c2"}.mdi-home-heart:before{content:"\f0827"}.mdi-home-import-outline:before{content:"\f0f9c"}.mdi-home-lightbulb:before{content:"\f1251"}.mdi-home-lightbulb-outline:before{content:"\f1252"}.mdi-home-lightning-bolt:before{content:"\f1903"}.mdi-home-lightning-bolt-outline:before{content:"\f1904"}.mdi-home-lock:before{content:"\f08eb"}.mdi-home-lock-open:before{content:"\f08ec"}.mdi-home-map-marker:before{content:"\f05f8"}.mdi-home-minus:before{content:"\f0974"}.mdi-home-minus-outline:before{content:"\f13d5"}.mdi-home-modern:before{content:"\f02dd"}.mdi-home-off:before{content:"\f1a46"}.mdi-home-off-outline:before{content:"\f1a47"}.mdi-home-outline:before{content:"\f06a1"}.mdi-home-percent:before{content:"\f1c7c"}.mdi-home-percent-outline:before{content:"\f1c7d"}.mdi-home-plus:before{content:"\f0975"}.mdi-home-plus-outline:before{content:"\f13d6"}.mdi-home-remove:before{content:"\f1247"}.mdi-home-remove-outline:before{content:"\f13d7"}.mdi-home-roof:before{content:"\f112b"}.mdi-home-search:before{content:"\f13b0"}.mdi-home-search-outline:before{content:"\f13b1"}.mdi-home-silo:before{content:"\f1ba0"}.mdi-home-silo-outline:before{content:"\f1ba1"}.mdi-home-sound-in:before{content:"\f1c2f"}.mdi-home-sound-in-outline:before{content:"\f1c30"}.mdi-home-sound-out:before{content:"\f1c31"}.mdi-home-sound-out-outline:before{content:"\f1c32"}.mdi-home-switch:before{content:"\f1794"}.mdi-home-switch-outline:before{content:"\f1795"}.mdi-home-thermometer:before{content:"\f0f54"}.mdi-home-thermometer-outline:before{content:"\f0f55"}.mdi-home-variant:before{content:"\f02de"}.mdi-home-variant-outline:before{content:"\f0ba7"}.mdi-hook:before{content:"\f06e2"}.mdi-hook-off:before{content:"\f06e3"}.mdi-hoop-house:before{content:"\f0e56"}.mdi-hops:before{content:"\f02df"}.mdi-horizontal-rotate-clockwise:before{content:"\f10f3"}.mdi-horizontal-rotate-counterclockwise:before{content:"\f10f4"}.mdi-horse:before{content:"\f15bf"}.mdi-horse-human:before{content:"\f15c0"}.mdi-horse-variant:before{content:"\f15c1"}.mdi-horse-variant-fast:before{content:"\f186e"}.mdi-horseshoe:before{content:"\f0a58"}.mdi-hospital:before{content:"\f0ff6"}.mdi-hospital-box:before{content:"\f02e0"}.mdi-hospital-box-outline:before{content:"\f0ff7"}.mdi-hospital-building:before{content:"\f02e1"}.mdi-hospital-marker:before{content:"\f02e2"}.mdi-hot-tub:before{content:"\f0828"}.mdi-hours-12:before{content:"\f1c94"}.mdi-hours-24:before{content:"\f1478"}.mdi-hub:before{content:"\f1c95"}.mdi-hub-outline:before{content:"\f1c96"}.mdi-hubspot:before{content:"\f0d17"}.mdi-hulu:before{content:"\f0829"}.mdi-human:before{content:"\f02e6"}.mdi-human-baby-changing-table:before{content:"\f138b"}.mdi-human-cane:before{content:"\f1581"}.mdi-human-capacity-decrease:before{content:"\f159b"}.mdi-human-capacity-increase:before{content:"\f159c"}.mdi-human-child:before{content:"\f02e7"}.mdi-human-dolly:before{content:"\f1980"}.mdi-human-edit:before{content:"\f14e8"}.mdi-human-female:before{content:"\f0649"}.mdi-human-female-boy:before{content:"\f0a59"}.mdi-human-female-dance:before{content:"\f15c9"}.mdi-human-female-female:before{content:"\f0a5a"}.mdi-human-female-female-child:before{content:"\f1c8e"}.mdi-human-female-girl:before{content:"\f0a5b"}.mdi-human-greeting:before{content:"\f17c4"}.mdi-human-greeting-proximity:before{content:"\f159d"}.mdi-human-greeting-variant:before{content:"\f064a"}.mdi-human-handsdown:before{content:"\f064b"}.mdi-human-handsup:before{content:"\f064c"}.mdi-human-male:before{content:"\f064d"}.mdi-human-male-board:before{content:"\f0890"}.mdi-human-male-board-poll:before{content:"\f0846"}.mdi-human-male-boy:before{content:"\f0a5c"}.mdi-human-male-child:before{content:"\f138c"}.mdi-human-male-female:before{content:"\f02e8"}.mdi-human-male-female-child:before{content:"\f1823"}.mdi-human-male-girl:before{content:"\f0a5d"}.mdi-human-male-height:before{content:"\f0efb"}.mdi-human-male-height-variant:before{content:"\f0efc"}.mdi-human-male-male:before{content:"\f0a5e"}.mdi-human-male-male-child:before{content:"\f1c8f"}.mdi-human-non-binary:before{content:"\f1848"}.mdi-human-pregnant:before{content:"\f05cf"}.mdi-human-queue:before{content:"\f1571"}.mdi-human-scooter:before{content:"\f11e9"}.mdi-human-walker:before{content:"\f1b71"}.mdi-human-wheelchair:before{content:"\f138d"}.mdi-human-white-cane:before{content:"\f1981"}.mdi-humble-bundle:before{content:"\f0744"}.mdi-hvac:before{content:"\f1352"}.mdi-hvac-off:before{content:"\f159e"}.mdi-hydraulic-oil-level:before{content:"\f1324"}.mdi-hydraulic-oil-temperature:before{content:"\f1325"}.mdi-hydro-power:before{content:"\f12e5"}.mdi-hydrogen-station:before{content:"\f1894"}.mdi-ice-cream:before{content:"\f082a"}.mdi-ice-cream-off:before{content:"\f0e52"}.mdi-ice-pop:before{content:"\f0efd"}.mdi-id-card:before{content:"\f0fc0"}.mdi-identifier:before{content:"\f0efe"}.mdi-ideogram-cjk:before{content:"\f1331"}.mdi-ideogram-cjk-variant:before{content:"\f1332"}.mdi-image:before{content:"\f02e9"}.mdi-image-album:before{content:"\f02ea"}.mdi-image-area:before{content:"\f02eb"}.mdi-image-area-close:before{content:"\f02ec"}.mdi-image-auto-adjust:before{content:"\f0fc1"}.mdi-image-broken:before{content:"\f02ed"}.mdi-image-broken-variant:before{content:"\f02ee"}.mdi-image-check:before{content:"\f1b25"}.mdi-image-check-outline:before{content:"\f1b26"}.mdi-image-edit:before{content:"\f11e3"}.mdi-image-edit-outline:before{content:"\f11e4"}.mdi-image-filter-black-white:before{content:"\f02f0"}.mdi-image-filter-center-focus:before{content:"\f02f1"}.mdi-image-filter-center-focus-strong:before{content:"\f0eff"}.mdi-image-filter-center-focus-strong-outline:before{content:"\f0f00"}.mdi-image-filter-center-focus-weak:before{content:"\f02f2"}.mdi-image-filter-drama:before{content:"\f02f3"}.mdi-image-filter-drama-outline:before{content:"\f1bff"}.mdi-image-filter-frames:before{content:"\f02f4"}.mdi-image-filter-hdr:before{content:"\f02f5"}.mdi-image-filter-hdr-outline:before{content:"\f1c64"}.mdi-image-filter-none:before{content:"\f02f6"}.mdi-image-filter-tilt-shift:before{content:"\f02f7"}.mdi-image-filter-vintage:before{content:"\f02f8"}.mdi-image-frame:before{content:"\f0e49"}.mdi-image-lock:before{content:"\f1ab0"}.mdi-image-lock-outline:before{content:"\f1ab1"}.mdi-image-marker:before{content:"\f177b"}.mdi-image-marker-outline:before{content:"\f177c"}.mdi-image-minus:before{content:"\f1419"}.mdi-image-minus-outline:before{content:"\f1b47"}.mdi-image-move:before{content:"\f09f8"}.mdi-image-multiple:before{content:"\f02f9"}.mdi-image-multiple-outline:before{content:"\f02ef"}.mdi-image-off:before{content:"\f082b"}.mdi-image-off-outline:before{content:"\f11d1"}.mdi-image-outline:before{content:"\f0976"}.mdi-image-plus:before{content:"\f087c"}.mdi-image-plus-outline:before{content:"\f1b46"}.mdi-image-refresh:before{content:"\f19fe"}.mdi-image-refresh-outline:before{content:"\f19ff"}.mdi-image-remove:before{content:"\f1418"}.mdi-image-remove-outline:before{content:"\f1b48"}.mdi-image-search:before{content:"\f0977"}.mdi-image-search-outline:before{content:"\f0978"}.mdi-image-size-select-actual:before{content:"\f0c8d"}.mdi-image-size-select-large:before{content:"\f0c8e"}.mdi-image-size-select-small:before{content:"\f0c8f"}.mdi-image-sync:before{content:"\f1a00"}.mdi-image-sync-outline:before{content:"\f1a01"}.mdi-image-text:before{content:"\f160d"}.mdi-import:before{content:"\f02fa"}.mdi-inbox:before{content:"\f0687"}.mdi-inbox-arrow-down:before{content:"\f02fb"}.mdi-inbox-arrow-down-outline:before{content:"\f1270"}.mdi-inbox-arrow-up:before{content:"\f03d1"}.mdi-inbox-arrow-up-outline:before{content:"\f1271"}.mdi-inbox-full:before{content:"\f1272"}.mdi-inbox-full-outline:before{content:"\f1273"}.mdi-inbox-multiple:before{content:"\f08b0"}.mdi-inbox-multiple-outline:before{content:"\f0ba8"}.mdi-inbox-outline:before{content:"\f1274"}.mdi-inbox-remove:before{content:"\f159f"}.mdi-inbox-remove-outline:before{content:"\f15a0"}.mdi-incognito:before{content:"\f05f9"}.mdi-incognito-circle:before{content:"\f1421"}.mdi-incognito-circle-off:before{content:"\f1422"}.mdi-incognito-off:before{content:"\f0075"}.mdi-induction:before{content:"\f184c"}.mdi-infinity:before{content:"\f06e4"}.mdi-information:before{content:"\f02fc"}.mdi-information-box:before{content:"\f1c65"}.mdi-information-box-outline:before{content:"\f1c66"}.mdi-information-off:before{content:"\f178c"}.mdi-information-off-outline:before{content:"\f178d"}.mdi-information-outline:before{content:"\f02fd"}.mdi-information-slab-box:before{content:"\f1c67"}.mdi-information-slab-box-outline:before{content:"\f1c68"}.mdi-information-slab-circle:before{content:"\f1c69"}.mdi-information-slab-circle-outline:before{content:"\f1c6a"}.mdi-information-slab-symbol:before{content:"\f1c6b"}.mdi-information-symbol:before{content:"\f1c6c"}.mdi-information-variant:before{content:"\f064e"}.mdi-information-variant-box:before{content:"\f1c6d"}.mdi-information-variant-box-outline:before{content:"\f1c6e"}.mdi-information-variant-circle:before{content:"\f1c6f"}.mdi-information-variant-circle-outline:before{content:"\f1c70"}.mdi-instagram:before{content:"\f02fe"}.mdi-instrument-triangle:before{content:"\f104e"}.mdi-integrated-circuit-chip:before{content:"\f1913"}.mdi-invert-colors:before{content:"\f0301"}.mdi-invert-colors-off:before{content:"\f0e4a"}.mdi-invoice:before{content:"\f1cd2"}.mdi-invoice-arrow-left:before{content:"\f1cd3"}.mdi-invoice-arrow-left-outline:before{content:"\f1cd4"}.mdi-invoice-arrow-right:before{content:"\f1cd5"}.mdi-invoice-arrow-right-outline:before{content:"\f1cd6"}.mdi-invoice-check:before{content:"\f1cd7"}.mdi-invoice-check-outline:before{content:"\f1cd8"}.mdi-invoice-clock:before{content:"\f1cd9"}.mdi-invoice-clock-outline:before{content:"\f1cda"}.mdi-invoice-edit:before{content:"\f1cdb"}.mdi-invoice-edit-outline:before{content:"\f1cdc"}.mdi-invoice-export-outline:before{content:"\f1cdd"}.mdi-invoice-fast:before{content:"\f1cde"}.mdi-invoice-fast-outline:before{content:"\f1cdf"}.mdi-invoice-import:before{content:"\f1ce0"}.mdi-invoice-import-outline:before{content:"\f1ce1"}.mdi-invoice-list:before{content:"\f1ce2"}.mdi-invoice-list-outline:before{content:"\f1ce3"}.mdi-invoice-minus:before{content:"\f1ce4"}.mdi-invoice-minus-outline:before{content:"\f1ce5"}.mdi-invoice-multiple:before{content:"\f1ce6"}.mdi-invoice-multiple-outline:before{content:"\f1ce7"}.mdi-invoice-outline:before{content:"\f1ce8"}.mdi-invoice-plus:before{content:"\f1ce9"}.mdi-invoice-plus-outline:before{content:"\f1cea"}.mdi-invoice-remove:before{content:"\f1ceb"}.mdi-invoice-remove-outline:before{content:"\f1cec"}.mdi-invoice-send:before{content:"\f1ced"}.mdi-invoice-send-outline:before{content:"\f1cee"}.mdi-invoice-text:before{content:"\f1cef"}.mdi-invoice-text-arrow-left:before{content:"\f1cf0"}.mdi-invoice-text-arrow-left-outline:before{content:"\f1cf1"}.mdi-invoice-text-arrow-right:before{content:"\f1cf2"}.mdi-invoice-text-arrow-right-outline:before{content:"\f1cf3"}.mdi-invoice-text-check:before{content:"\f1cf4"}.mdi-invoice-text-check-outline:before{content:"\f1cf5"}.mdi-invoice-text-clock:before{content:"\f1cf6"}.mdi-invoice-text-clock-outline:before{content:"\f1cf7"}.mdi-invoice-text-edit:before{content:"\f1cf8"}.mdi-invoice-text-edit-outline:before{content:"\f1cf9"}.mdi-invoice-text-fast:before{content:"\f1cfa"}.mdi-invoice-text-fast-outline:before{content:"\f1cfb"}.mdi-invoice-text-minus:before{content:"\f1cfc"}.mdi-invoice-text-minus-outline:before{content:"\f1cfd"}.mdi-invoice-text-multiple:before{content:"\f1cfe"}.mdi-invoice-text-multiple-outline:before{content:"\f1cff"}.mdi-invoice-text-outline:before{content:"\f1d00"}.mdi-invoice-text-plus:before{content:"\f1d01"}.mdi-invoice-text-plus-outline:before{content:"\f1d02"}.mdi-invoice-text-remove:before{content:"\f1d03"}.mdi-invoice-text-remove-outline:before{content:"\f1d04"}.mdi-invoice-text-send:before{content:"\f1d05"}.mdi-invoice-text-send-outline:before{content:"\f1d06"}.mdi-iobroker:before{content:"\f12e8"}.mdi-ip:before{content:"\f0a5f"}.mdi-ip-network:before{content:"\f0a60"}.mdi-ip-network-outline:before{content:"\f0c90"}.mdi-ip-outline:before{content:"\f1982"}.mdi-ipod:before{content:"\f0c91"}.mdi-iron:before{content:"\f1824"}.mdi-iron-board:before{content:"\f1838"}.mdi-iron-outline:before{content:"\f1825"}.mdi-island:before{content:"\f104f"}.mdi-island-variant:before{content:"\f1cc6"}.mdi-iv-bag:before{content:"\f10b9"}.mdi-jabber:before{content:"\f0dd5"}.mdi-jeepney:before{content:"\f0302"}.mdi-jellyfish:before{content:"\f0f01"}.mdi-jellyfish-outline:before{content:"\f0f02"}.mdi-jira:before{content:"\f0303"}.mdi-jquery:before{content:"\f087d"}.mdi-jsfiddle:before{content:"\f0304"}.mdi-jump-rope:before{content:"\f12ff"}.mdi-kabaddi:before{content:"\f0d87"}.mdi-kangaroo:before{content:"\f1558"}.mdi-karate:before{content:"\f082c"}.mdi-kayaking:before{content:"\f08af"}.mdi-keg:before{content:"\f0305"}.mdi-kettle:before{content:"\f05fa"}.mdi-kettle-alert:before{content:"\f1317"}.mdi-kettle-alert-outline:before{content:"\f1318"}.mdi-kettle-off:before{content:"\f131b"}.mdi-kettle-off-outline:before{content:"\f131c"}.mdi-kettle-outline:before{content:"\f0f56"}.mdi-kettle-pour-over:before{content:"\f173c"}.mdi-kettle-steam:before{content:"\f1319"}.mdi-kettle-steam-outline:before{content:"\f131a"}.mdi-kettlebell:before{content:"\f1300"}.mdi-key:before{content:"\f0306"}.mdi-key-alert:before{content:"\f1983"}.mdi-key-alert-outline:before{content:"\f1984"}.mdi-key-arrow-right:before{content:"\f1312"}.mdi-key-chain:before{content:"\f1574"}.mdi-key-chain-variant:before{content:"\f1575"}.mdi-key-change:before{content:"\f0307"}.mdi-key-link:before{content:"\f119f"}.mdi-key-minus:before{content:"\f0308"}.mdi-key-outline:before{content:"\f0dd6"}.mdi-key-plus:before{content:"\f0309"}.mdi-key-remove:before{content:"\f030a"}.mdi-key-star:before{content:"\f119e"}.mdi-key-variant:before{content:"\f030b"}.mdi-key-wireless:before{content:"\f0fc2"}.mdi-keyboard:before{content:"\f030c"}.mdi-keyboard-backspace:before{content:"\f030d"}.mdi-keyboard-caps:before{content:"\f030e"}.mdi-keyboard-close:before{content:"\f030f"}.mdi-keyboard-close-outline:before{content:"\f1c00"}.mdi-keyboard-esc:before{content:"\f12b7"}.mdi-keyboard-f1:before{content:"\f12ab"}.mdi-keyboard-f10:before{content:"\f12b4"}.mdi-keyboard-f11:before{content:"\f12b5"}.mdi-keyboard-f12:before{content:"\f12b6"}.mdi-keyboard-f2:before{content:"\f12ac"}.mdi-keyboard-f3:before{content:"\f12ad"}.mdi-keyboard-f4:before{content:"\f12ae"}.mdi-keyboard-f5:before{content:"\f12af"}.mdi-keyboard-f6:before{content:"\f12b0"}.mdi-keyboard-f7:before{content:"\f12b1"}.mdi-keyboard-f8:before{content:"\f12b2"}.mdi-keyboard-f9:before{content:"\f12b3"}.mdi-keyboard-off:before{content:"\f0310"}.mdi-keyboard-off-outline:before{content:"\f0e4b"}.mdi-keyboard-outline:before{content:"\f097b"}.mdi-keyboard-return:before{content:"\f0311"}.mdi-keyboard-settings:before{content:"\f09f9"}.mdi-keyboard-settings-outline:before{content:"\f09fa"}.mdi-keyboard-space:before{content:"\f1050"}.mdi-keyboard-tab:before{content:"\f0312"}.mdi-keyboard-tab-reverse:before{content:"\f0325"}.mdi-keyboard-variant:before{content:"\f0313"}.mdi-khanda:before{content:"\f10fd"}.mdi-kickstarter:before{content:"\f0745"}.mdi-kite:before{content:"\f1985"}.mdi-kite-outline:before{content:"\f1986"}.mdi-kitesurfing:before{content:"\f1744"}.mdi-klingon:before{content:"\f135b"}.mdi-knife:before{content:"\f09fb"}.mdi-knife-military:before{content:"\f09fc"}.mdi-knob:before{content:"\f1b96"}.mdi-koala:before{content:"\f173f"}.mdi-kodi:before{content:"\f0314"}.mdi-kubernetes:before{content:"\f10fe"}.mdi-label:before{content:"\f0315"}.mdi-label-multiple:before{content:"\f1375"}.mdi-label-multiple-outline:before{content:"\f1376"}.mdi-label-off:before{content:"\f0acb"}.mdi-label-off-outline:before{content:"\f0acc"}.mdi-label-outline:before{content:"\f0316"}.mdi-label-percent:before{content:"\f12ea"}.mdi-label-percent-outline:before{content:"\f12eb"}.mdi-label-variant:before{content:"\f0acd"}.mdi-label-variant-outline:before{content:"\f0ace"}.mdi-ladder:before{content:"\f15a2"}.mdi-ladybug:before{content:"\f082d"}.mdi-lambda:before{content:"\f0627"}.mdi-lamp:before{content:"\f06b5"}.mdi-lamp-outline:before{content:"\f17d0"}.mdi-lamps:before{content:"\f1576"}.mdi-lamps-outline:before{content:"\f17d1"}.mdi-lan:before{content:"\f0317"}.mdi-lan-check:before{content:"\f12aa"}.mdi-lan-connect:before{content:"\f0318"}.mdi-lan-disconnect:before{content:"\f0319"}.mdi-lan-pending:before{content:"\f031a"}.mdi-land-fields:before{content:"\f1ab2"}.mdi-land-plots:before{content:"\f1ab3"}.mdi-land-plots-circle:before{content:"\f1ab4"}.mdi-land-plots-circle-variant:before{content:"\f1ab5"}.mdi-land-plots-marker:before{content:"\f1c5d"}.mdi-land-rows-horizontal:before{content:"\f1ab6"}.mdi-land-rows-vertical:before{content:"\f1ab7"}.mdi-landslide:before{content:"\f1a48"}.mdi-landslide-outline:before{content:"\f1a49"}.mdi-language-c:before{content:"\f0671"}.mdi-language-cpp:before{content:"\f0672"}.mdi-language-csharp:before{content:"\f031b"}.mdi-language-css3:before{content:"\f031c"}.mdi-language-fortran:before{content:"\f121a"}.mdi-language-go:before{content:"\f07d3"}.mdi-language-haskell:before{content:"\f0c92"}.mdi-language-html5:before{content:"\f031d"}.mdi-language-java:before{content:"\f0b37"}.mdi-language-javascript:before{content:"\f031e"}.mdi-language-kotlin:before{content:"\f1219"}.mdi-language-lua:before{content:"\f08b1"}.mdi-language-markdown:before{content:"\f0354"}.mdi-language-markdown-outline:before{content:"\f0f5b"}.mdi-language-php:before{content:"\f031f"}.mdi-language-python:before{content:"\f0320"}.mdi-language-r:before{content:"\f07d4"}.mdi-language-ruby:before{content:"\f0d2d"}.mdi-language-ruby-on-rails:before{content:"\f0acf"}.mdi-language-rust:before{content:"\f1617"}.mdi-language-swift:before{content:"\f06e5"}.mdi-language-typescript:before{content:"\f06e6"}.mdi-language-xaml:before{content:"\f0673"}.mdi-laptop:before{content:"\f0322"}.mdi-laptop-account:before{content:"\f1a4a"}.mdi-laptop-off:before{content:"\f06e7"}.mdi-laravel:before{content:"\f0ad0"}.mdi-laser-pointer:before{content:"\f1484"}.mdi-lasso:before{content:"\f0f03"}.mdi-lastpass:before{content:"\f0446"}.mdi-latitude:before{content:"\f0f57"}.mdi-launch:before{content:"\f0327"}.mdi-lava-lamp:before{content:"\f07d5"}.mdi-layers:before{content:"\f0328"}.mdi-layers-edit:before{content:"\f1892"}.mdi-layers-minus:before{content:"\f0e4c"}.mdi-layers-off:before{content:"\f0329"}.mdi-layers-off-outline:before{content:"\f09fd"}.mdi-layers-outline:before{content:"\f09fe"}.mdi-layers-plus:before{content:"\f0e4d"}.mdi-layers-remove:before{content:"\f0e4e"}.mdi-layers-search:before{content:"\f1206"}.mdi-layers-search-outline:before{content:"\f1207"}.mdi-layers-triple:before{content:"\f0f58"}.mdi-layers-triple-outline:before{content:"\f0f59"}.mdi-lead-pencil:before{content:"\f064f"}.mdi-leaf:before{content:"\f032a"}.mdi-leaf-circle:before{content:"\f1905"}.mdi-leaf-circle-outline:before{content:"\f1906"}.mdi-leaf-maple:before{content:"\f0c93"}.mdi-leaf-maple-off:before{content:"\f12da"}.mdi-leaf-off:before{content:"\f12d9"}.mdi-leak:before{content:"\f0dd7"}.mdi-leak-off:before{content:"\f0dd8"}.mdi-lectern:before{content:"\f1af0"}.mdi-led-off:before{content:"\f032b"}.mdi-led-on:before{content:"\f032c"}.mdi-led-outline:before{content:"\f032d"}.mdi-led-strip:before{content:"\f07d6"}.mdi-led-strip-variant:before{content:"\f1051"}.mdi-led-strip-variant-off:before{content:"\f1a4b"}.mdi-led-variant-off:before{content:"\f032e"}.mdi-led-variant-on:before{content:"\f032f"}.mdi-led-variant-outline:before{content:"\f0330"}.mdi-leek:before{content:"\f117d"}.mdi-less-than:before{content:"\f097c"}.mdi-less-than-or-equal:before{content:"\f097d"}.mdi-library:before{content:"\f0331"}.mdi-library-outline:before{content:"\f1a22"}.mdi-library-shelves:before{content:"\f0ba9"}.mdi-license:before{content:"\f0fc3"}.mdi-lifebuoy:before{content:"\f087e"}.mdi-light-flood-down:before{content:"\f1987"}.mdi-light-flood-up:before{content:"\f1988"}.mdi-light-recessed:before{content:"\f179b"}.mdi-light-switch:before{content:"\f097e"}.mdi-light-switch-off:before{content:"\f1a24"}.mdi-lightbulb:before{content:"\f0335"}.mdi-lightbulb-alert:before{content:"\f19e1"}.mdi-lightbulb-alert-outline:before{content:"\f19e2"}.mdi-lightbulb-auto:before{content:"\f1800"}.mdi-lightbulb-auto-outline:before{content:"\f1801"}.mdi-lightbulb-cfl:before{content:"\f1208"}.mdi-lightbulb-cfl-off:before{content:"\f1209"}.mdi-lightbulb-cfl-spiral:before{content:"\f1275"}.mdi-lightbulb-cfl-spiral-off:before{content:"\f12c3"}.mdi-lightbulb-fluorescent-tube:before{content:"\f1804"}.mdi-lightbulb-fluorescent-tube-outline:before{content:"\f1805"}.mdi-lightbulb-group:before{content:"\f1253"}.mdi-lightbulb-group-off:before{content:"\f12cd"}.mdi-lightbulb-group-off-outline:before{content:"\f12ce"}.mdi-lightbulb-group-outline:before{content:"\f1254"}.mdi-lightbulb-multiple:before{content:"\f1255"}.mdi-lightbulb-multiple-off:before{content:"\f12cf"}.mdi-lightbulb-multiple-off-outline:before{content:"\f12d0"}.mdi-lightbulb-multiple-outline:before{content:"\f1256"}.mdi-lightbulb-night:before{content:"\f1a4c"}.mdi-lightbulb-night-outline:before{content:"\f1a4d"}.mdi-lightbulb-off:before{content:"\f0e4f"}.mdi-lightbulb-off-outline:before{content:"\f0e50"}.mdi-lightbulb-on:before{content:"\f06e8"}.mdi-lightbulb-on-10:before{content:"\f1a4e"}.mdi-lightbulb-on-20:before{content:"\f1a4f"}.mdi-lightbulb-on-30:before{content:"\f1a50"}.mdi-lightbulb-on-40:before{content:"\f1a51"}.mdi-lightbulb-on-50:before{content:"\f1a52"}.mdi-lightbulb-on-60:before{content:"\f1a53"}.mdi-lightbulb-on-70:before{content:"\f1a54"}.mdi-lightbulb-on-80:before{content:"\f1a55"}.mdi-lightbulb-on-90:before{content:"\f1a56"}.mdi-lightbulb-on-outline:before{content:"\f06e9"}.mdi-lightbulb-outline:before{content:"\f0336"}.mdi-lightbulb-question:before{content:"\f19e3"}.mdi-lightbulb-question-outline:before{content:"\f19e4"}.mdi-lightbulb-spot:before{content:"\f17f4"}.mdi-lightbulb-spot-off:before{content:"\f17f5"}.mdi-lightbulb-variant:before{content:"\f1802"}.mdi-lightbulb-variant-outline:before{content:"\f1803"}.mdi-lighthouse:before{content:"\f09ff"}.mdi-lighthouse-on:before{content:"\f0a00"}.mdi-lightning-bolt:before{content:"\f140b"}.mdi-lightning-bolt-circle:before{content:"\f0820"}.mdi-lightning-bolt-outline:before{content:"\f140c"}.mdi-line-scan:before{content:"\f0624"}.mdi-lingerie:before{content:"\f1476"}.mdi-link:before{content:"\f0337"}.mdi-link-box:before{content:"\f0d1a"}.mdi-link-box-outline:before{content:"\f0d1b"}.mdi-link-box-variant:before{content:"\f0d1c"}.mdi-link-box-variant-outline:before{content:"\f0d1d"}.mdi-link-circle:before{content:"\f1cac"}.mdi-link-circle-outline:before{content:"\f1cad"}.mdi-link-edit:before{content:"\f1cae"}.mdi-link-lock:before{content:"\f10ba"}.mdi-link-off:before{content:"\f0338"}.mdi-link-plus:before{content:"\f0c94"}.mdi-link-variant:before{content:"\f0339"}.mdi-link-variant-minus:before{content:"\f10ff"}.mdi-link-variant-off:before{content:"\f033a"}.mdi-link-variant-plus:before{content:"\f1100"}.mdi-link-variant-remove:before{content:"\f1101"}.mdi-linkedin:before{content:"\f033b"}.mdi-linux:before{content:"\f033d"}.mdi-linux-mint:before{content:"\f08ed"}.mdi-lipstick:before{content:"\f13b5"}.mdi-liquid-spot:before{content:"\f1826"}.mdi-liquor:before{content:"\f191e"}.mdi-list-box:before{content:"\f1b7b"}.mdi-list-box-outline:before{content:"\f1b7c"}.mdi-list-status:before{content:"\f15ab"}.mdi-litecoin:before{content:"\f0a61"}.mdi-loading:before{content:"\f0772"}.mdi-location-enter:before{content:"\f0fc4"}.mdi-location-exit:before{content:"\f0fc5"}.mdi-lock:before{content:"\f033e"}.mdi-lock-alert:before{content:"\f08ee"}.mdi-lock-alert-outline:before{content:"\f15d1"}.mdi-lock-check:before{content:"\f139a"}.mdi-lock-check-outline:before{content:"\f16a8"}.mdi-lock-clock:before{content:"\f097f"}.mdi-lock-minus:before{content:"\f16a9"}.mdi-lock-minus-outline:before{content:"\f16aa"}.mdi-lock-off:before{content:"\f1671"}.mdi-lock-off-outline:before{content:"\f1672"}.mdi-lock-open:before{content:"\f033f"}.mdi-lock-open-alert:before{content:"\f139b"}.mdi-lock-open-alert-outline:before{content:"\f15d2"}.mdi-lock-open-check:before{content:"\f139c"}.mdi-lock-open-check-outline:before{content:"\f16ab"}.mdi-lock-open-minus:before{content:"\f16ac"}.mdi-lock-open-minus-outline:before{content:"\f16ad"}.mdi-lock-open-outline:before{content:"\f0340"}.mdi-lock-open-plus:before{content:"\f16ae"}.mdi-lock-open-plus-outline:before{content:"\f16af"}.mdi-lock-open-remove:before{content:"\f16b0"}.mdi-lock-open-remove-outline:before{content:"\f16b1"}.mdi-lock-open-variant:before{content:"\f0fc6"}.mdi-lock-open-variant-outline:before{content:"\f0fc7"}.mdi-lock-outline:before{content:"\f0341"}.mdi-lock-pattern:before{content:"\f06ea"}.mdi-lock-percent:before{content:"\f1c12"}.mdi-lock-percent-open:before{content:"\f1c13"}.mdi-lock-percent-open-outline:before{content:"\f1c14"}.mdi-lock-percent-open-variant:before{content:"\f1c15"}.mdi-lock-percent-open-variant-outline:before{content:"\f1c16"}.mdi-lock-percent-outline:before{content:"\f1c17"}.mdi-lock-plus:before{content:"\f05fb"}.mdi-lock-plus-outline:before{content:"\f16b2"}.mdi-lock-question:before{content:"\f08ef"}.mdi-lock-remove:before{content:"\f16b3"}.mdi-lock-remove-outline:before{content:"\f16b4"}.mdi-lock-reset:before{content:"\f0773"}.mdi-lock-smart:before{content:"\f08b2"}.mdi-locker:before{content:"\f07d7"}.mdi-locker-multiple:before{content:"\f07d8"}.mdi-login:before{content:"\f0342"}.mdi-login-variant:before{content:"\f05fc"}.mdi-logout:before{content:"\f0343"}.mdi-logout-variant:before{content:"\f05fd"}.mdi-longitude:before{content:"\f0f5a"}.mdi-looks:before{content:"\f0344"}.mdi-lotion:before{content:"\f1582"}.mdi-lotion-outline:before{content:"\f1583"}.mdi-lotion-plus:before{content:"\f1584"}.mdi-lotion-plus-outline:before{content:"\f1585"}.mdi-loupe:before{content:"\f0345"}.mdi-lumx:before{content:"\f0346"}.mdi-lungs:before{content:"\f1084"}.mdi-mace:before{content:"\f1843"}.mdi-magazine-pistol:before{content:"\f0324"}.mdi-magazine-rifle:before{content:"\f0323"}.mdi-magic-staff:before{content:"\f1844"}.mdi-magnet:before{content:"\f0347"}.mdi-magnet-on:before{content:"\f0348"}.mdi-magnify:before{content:"\f0349"}.mdi-magnify-close:before{content:"\f0980"}.mdi-magnify-expand:before{content:"\f1874"}.mdi-magnify-minus:before{content:"\f034a"}.mdi-magnify-minus-cursor:before{content:"\f0a62"}.mdi-magnify-minus-outline:before{content:"\f06ec"}.mdi-magnify-plus:before{content:"\f034b"}.mdi-magnify-plus-cursor:before{content:"\f0a63"}.mdi-magnify-plus-outline:before{content:"\f06ed"}.mdi-magnify-remove-cursor:before{content:"\f120c"}.mdi-magnify-remove-outline:before{content:"\f120d"}.mdi-magnify-scan:before{content:"\f1276"}.mdi-mail:before{content:"\f0ebb"}.mdi-mailbox:before{content:"\f06ee"}.mdi-mailbox-open:before{content:"\f0d88"}.mdi-mailbox-open-outline:before{content:"\f0d89"}.mdi-mailbox-open-up:before{content:"\f0d8a"}.mdi-mailbox-open-up-outline:before{content:"\f0d8b"}.mdi-mailbox-outline:before{content:"\f0d8c"}.mdi-mailbox-up:before{content:"\f0d8d"}.mdi-mailbox-up-outline:before{content:"\f0d8e"}.mdi-manjaro:before{content:"\f160a"}.mdi-map:before{content:"\f034d"}.mdi-map-check:before{content:"\f0ebc"}.mdi-map-check-outline:before{content:"\f0ebd"}.mdi-map-clock:before{content:"\f0d1e"}.mdi-map-clock-outline:before{content:"\f0d1f"}.mdi-map-legend:before{content:"\f0a01"}.mdi-map-marker:before{content:"\f034e"}.mdi-map-marker-account:before{content:"\f18e3"}.mdi-map-marker-account-outline:before{content:"\f18e4"}.mdi-map-marker-alert:before{content:"\f0f05"}.mdi-map-marker-alert-outline:before{content:"\f0f06"}.mdi-map-marker-check:before{content:"\f0c95"}.mdi-map-marker-check-outline:before{content:"\f12fb"}.mdi-map-marker-circle:before{content:"\f034f"}.mdi-map-marker-distance:before{content:"\f08f0"}.mdi-map-marker-down:before{content:"\f1102"}.mdi-map-marker-left:before{content:"\f12db"}.mdi-map-marker-left-outline:before{content:"\f12dd"}.mdi-map-marker-minus:before{content:"\f0650"}.mdi-map-marker-minus-outline:before{content:"\f12f9"}.mdi-map-marker-multiple:before{content:"\f0350"}.mdi-map-marker-multiple-outline:before{content:"\f1277"}.mdi-map-marker-off:before{content:"\f0351"}.mdi-map-marker-off-outline:before{content:"\f12fd"}.mdi-map-marker-outline:before{content:"\f07d9"}.mdi-map-marker-path:before{content:"\f0d20"}.mdi-map-marker-plus:before{content:"\f0651"}.mdi-map-marker-plus-outline:before{content:"\f12f8"}.mdi-map-marker-question:before{content:"\f0f07"}.mdi-map-marker-question-outline:before{content:"\f0f08"}.mdi-map-marker-radius:before{content:"\f0352"}.mdi-map-marker-radius-outline:before{content:"\f12fc"}.mdi-map-marker-remove:before{content:"\f0f09"}.mdi-map-marker-remove-outline:before{content:"\f12fa"}.mdi-map-marker-remove-variant:before{content:"\f0f0a"}.mdi-map-marker-right:before{content:"\f12dc"}.mdi-map-marker-right-outline:before{content:"\f12de"}.mdi-map-marker-star:before{content:"\f1608"}.mdi-map-marker-star-outline:before{content:"\f1609"}.mdi-map-marker-up:before{content:"\f1103"}.mdi-map-minus:before{content:"\f0981"}.mdi-map-outline:before{content:"\f0982"}.mdi-map-plus:before{content:"\f0983"}.mdi-map-search:before{content:"\f0984"}.mdi-map-search-outline:before{content:"\f0985"}.mdi-mapbox:before{content:"\f0baa"}.mdi-margin:before{content:"\f0353"}.mdi-marker:before{content:"\f0652"}.mdi-marker-cancel:before{content:"\f0dd9"}.mdi-marker-check:before{content:"\f0355"}.mdi-mastodon:before{content:"\f0ad1"}.mdi-material-design:before{content:"\f0986"}.mdi-material-ui:before{content:"\f0357"}.mdi-math-compass:before{content:"\f0358"}.mdi-math-cos:before{content:"\f0c96"}.mdi-math-integral:before{content:"\f0fc8"}.mdi-math-integral-box:before{content:"\f0fc9"}.mdi-math-log:before{content:"\f1085"}.mdi-math-norm:before{content:"\f0fca"}.mdi-math-norm-box:before{content:"\f0fcb"}.mdi-math-sin:before{content:"\f0c97"}.mdi-math-tan:before{content:"\f0c98"}.mdi-matrix:before{content:"\f0628"}.mdi-medal:before{content:"\f0987"}.mdi-medal-outline:before{content:"\f1326"}.mdi-medical-bag:before{content:"\f06ef"}.mdi-medical-cotton-swab:before{content:"\f1ab8"}.mdi-medication:before{content:"\f1b14"}.mdi-medication-outline:before{content:"\f1b15"}.mdi-meditation:before{content:"\f117b"}.mdi-memory:before{content:"\f035b"}.mdi-memory-arrow-down:before{content:"\f1ca6"}.mdi-menorah:before{content:"\f17d4"}.mdi-menorah-fire:before{content:"\f17d5"}.mdi-menu:before{content:"\f035c"}.mdi-menu-close:before{content:"\f1c90"}.mdi-menu-down:before{content:"\f035d"}.mdi-menu-down-outline:before{content:"\f06b6"}.mdi-menu-left:before{content:"\f035e"}.mdi-menu-left-outline:before{content:"\f0a02"}.mdi-menu-open:before{content:"\f0bab"}.mdi-menu-right:before{content:"\f035f"}.mdi-menu-right-outline:before{content:"\f0a03"}.mdi-menu-swap:before{content:"\f0a64"}.mdi-menu-swap-outline:before{content:"\f0a65"}.mdi-menu-up:before{content:"\f0360"}.mdi-menu-up-outline:before{content:"\f06b7"}.mdi-merge:before{content:"\f0f5c"}.mdi-message:before{content:"\f0361"}.mdi-message-alert:before{content:"\f0362"}.mdi-message-alert-outline:before{content:"\f0a04"}.mdi-message-arrow-left:before{content:"\f12f2"}.mdi-message-arrow-left-outline:before{content:"\f12f3"}.mdi-message-arrow-right:before{content:"\f12f4"}.mdi-message-arrow-right-outline:before{content:"\f12f5"}.mdi-message-badge:before{content:"\f1941"}.mdi-message-badge-outline:before{content:"\f1942"}.mdi-message-bookmark:before{content:"\f15ac"}.mdi-message-bookmark-outline:before{content:"\f15ad"}.mdi-message-bulleted:before{content:"\f06a2"}.mdi-message-bulleted-off:before{content:"\f06a3"}.mdi-message-check:before{content:"\f1b8a"}.mdi-message-check-outline:before{content:"\f1b8b"}.mdi-message-cog:before{content:"\f06f1"}.mdi-message-cog-outline:before{content:"\f1172"}.mdi-message-draw:before{content:"\f0363"}.mdi-message-fast:before{content:"\f19cc"}.mdi-message-fast-outline:before{content:"\f19cd"}.mdi-message-flash:before{content:"\f15a9"}.mdi-message-flash-outline:before{content:"\f15aa"}.mdi-message-image:before{content:"\f0364"}.mdi-message-image-outline:before{content:"\f116c"}.mdi-message-lock:before{content:"\f0fcc"}.mdi-message-lock-outline:before{content:"\f116d"}.mdi-message-minus:before{content:"\f116e"}.mdi-message-minus-outline:before{content:"\f116f"}.mdi-message-off:before{content:"\f164d"}.mdi-message-off-outline:before{content:"\f164e"}.mdi-message-outline:before{content:"\f0365"}.mdi-message-plus:before{content:"\f0653"}.mdi-message-plus-outline:before{content:"\f10bb"}.mdi-message-processing:before{content:"\f0366"}.mdi-message-processing-outline:before{content:"\f1170"}.mdi-message-question:before{content:"\f173a"}.mdi-message-question-outline:before{content:"\f173b"}.mdi-message-reply:before{content:"\f0367"}.mdi-message-reply-outline:before{content:"\f173d"}.mdi-message-reply-text:before{content:"\f0368"}.mdi-message-reply-text-outline:before{content:"\f173e"}.mdi-message-settings:before{content:"\f06f0"}.mdi-message-settings-outline:before{content:"\f1171"}.mdi-message-star:before{content:"\f069a"}.mdi-message-star-outline:before{content:"\f1250"}.mdi-message-text:before{content:"\f0369"}.mdi-message-text-clock:before{content:"\f1173"}.mdi-message-text-clock-outline:before{content:"\f1174"}.mdi-message-text-fast:before{content:"\f19ce"}.mdi-message-text-fast-outline:before{content:"\f19cf"}.mdi-message-text-lock:before{content:"\f0fcd"}.mdi-message-text-lock-outline:before{content:"\f1175"}.mdi-message-text-outline:before{content:"\f036a"}.mdi-message-video:before{content:"\f036b"}.mdi-meteor:before{content:"\f0629"}.mdi-meter-electric:before{content:"\f1a57"}.mdi-meter-electric-outline:before{content:"\f1a58"}.mdi-meter-gas:before{content:"\f1a59"}.mdi-meter-gas-outline:before{content:"\f1a5a"}.mdi-metronome:before{content:"\f07da"}.mdi-metronome-tick:before{content:"\f07db"}.mdi-micro-sd:before{content:"\f07dc"}.mdi-microphone:before{content:"\f036c"}.mdi-microphone-message:before{content:"\f050a"}.mdi-microphone-message-off:before{content:"\f050b"}.mdi-microphone-minus:before{content:"\f08b3"}.mdi-microphone-off:before{content:"\f036d"}.mdi-microphone-outline:before{content:"\f036e"}.mdi-microphone-plus:before{content:"\f08b4"}.mdi-microphone-question:before{content:"\f1989"}.mdi-microphone-question-outline:before{content:"\f198a"}.mdi-microphone-settings:before{content:"\f036f"}.mdi-microphone-variant:before{content:"\f0370"}.mdi-microphone-variant-off:before{content:"\f0371"}.mdi-microscope:before{content:"\f0654"}.mdi-microsoft:before{content:"\f0372"}.mdi-microsoft-access:before{content:"\f138e"}.mdi-microsoft-azure:before{content:"\f0805"}.mdi-microsoft-azure-devops:before{content:"\f0fd5"}.mdi-microsoft-bing:before{content:"\f00a4"}.mdi-microsoft-dynamics-365:before{content:"\f0988"}.mdi-microsoft-edge:before{content:"\f01e9"}.mdi-microsoft-excel:before{content:"\f138f"}.mdi-microsoft-internet-explorer:before{content:"\f0300"}.mdi-microsoft-office:before{content:"\f03c6"}.mdi-microsoft-onedrive:before{content:"\f03ca"}.mdi-microsoft-onenote:before{content:"\f0747"}.mdi-microsoft-outlook:before{content:"\f0d22"}.mdi-microsoft-powerpoint:before{content:"\f1390"}.mdi-microsoft-sharepoint:before{content:"\f1391"}.mdi-microsoft-teams:before{content:"\f02bb"}.mdi-microsoft-visual-studio:before{content:"\f0610"}.mdi-microsoft-visual-studio-code:before{content:"\f0a1e"}.mdi-microsoft-windows:before{content:"\f05b3"}.mdi-microsoft-windows-classic:before{content:"\f0a21"}.mdi-microsoft-word:before{content:"\f1392"}.mdi-microsoft-xbox:before{content:"\f05b9"}.mdi-microsoft-xbox-controller:before{content:"\f05ba"}.mdi-microsoft-xbox-controller-battery-alert:before{content:"\f074b"}.mdi-microsoft-xbox-controller-battery-charging:before{content:"\f0a22"}.mdi-microsoft-xbox-controller-battery-empty:before{content:"\f074c"}.mdi-microsoft-xbox-controller-battery-full:before{content:"\f074d"}.mdi-microsoft-xbox-controller-battery-low:before{content:"\f074e"}.mdi-microsoft-xbox-controller-battery-medium:before{content:"\f074f"}.mdi-microsoft-xbox-controller-battery-unknown:before{content:"\f0750"}.mdi-microsoft-xbox-controller-menu:before{content:"\f0e6f"}.mdi-microsoft-xbox-controller-off:before{content:"\f05bb"}.mdi-microsoft-xbox-controller-view:before{content:"\f0e70"}.mdi-microwave:before{content:"\f0c99"}.mdi-microwave-off:before{content:"\f1423"}.mdi-middleware:before{content:"\f0f5d"}.mdi-middleware-outline:before{content:"\f0f5e"}.mdi-midi:before{content:"\f08f1"}.mdi-midi-port:before{content:"\f08f2"}.mdi-mine:before{content:"\f0dda"}.mdi-minecraft:before{content:"\f0373"}.mdi-mini-sd:before{content:"\f0a05"}.mdi-minidisc:before{content:"\f0a06"}.mdi-minus:before{content:"\f0374"}.mdi-minus-box:before{content:"\f0375"}.mdi-minus-box-multiple:before{content:"\f1141"}.mdi-minus-box-multiple-outline:before{content:"\f1142"}.mdi-minus-box-outline:before{content:"\f06f2"}.mdi-minus-circle:before{content:"\f0376"}.mdi-minus-circle-multiple:before{content:"\f035a"}.mdi-minus-circle-multiple-outline:before{content:"\f0ad3"}.mdi-minus-circle-off:before{content:"\f1459"}.mdi-minus-circle-off-outline:before{content:"\f145a"}.mdi-minus-circle-outline:before{content:"\f0377"}.mdi-minus-network:before{content:"\f0378"}.mdi-minus-network-outline:before{content:"\f0c9a"}.mdi-minus-thick:before{content:"\f1639"}.mdi-mirror:before{content:"\f11fd"}.mdi-mirror-rectangle:before{content:"\f179f"}.mdi-mirror-variant:before{content:"\f17a0"}.mdi-mixed-martial-arts:before{content:"\f0d8f"}.mdi-mixed-reality:before{content:"\f087f"}.mdi-molecule:before{content:"\f0bac"}.mdi-molecule-co:before{content:"\f12fe"}.mdi-molecule-co2:before{content:"\f07e4"}.mdi-monitor:before{content:"\f0379"}.mdi-monitor-account:before{content:"\f1a5b"}.mdi-monitor-arrow-down:before{content:"\f19d0"}.mdi-monitor-arrow-down-variant:before{content:"\f19d1"}.mdi-monitor-cellphone:before{content:"\f0989"}.mdi-monitor-cellphone-star:before{content:"\f098a"}.mdi-monitor-dashboard:before{content:"\f0a07"}.mdi-monitor-edit:before{content:"\f12c6"}.mdi-monitor-eye:before{content:"\f13b4"}.mdi-monitor-lock:before{content:"\f0ddb"}.mdi-monitor-multiple:before{content:"\f037a"}.mdi-monitor-off:before{content:"\f0d90"}.mdi-monitor-screenshot:before{content:"\f0e51"}.mdi-monitor-share:before{content:"\f1483"}.mdi-monitor-shimmer:before{content:"\f1104"}.mdi-monitor-small:before{content:"\f1876"}.mdi-monitor-speaker:before{content:"\f0f5f"}.mdi-monitor-speaker-off:before{content:"\f0f60"}.mdi-monitor-star:before{content:"\f0ddc"}.mdi-monitor-vertical:before{content:"\f1c33"}.mdi-moon-first-quarter:before{content:"\f0f61"}.mdi-moon-full:before{content:"\f0f62"}.mdi-moon-last-quarter:before{content:"\f0f63"}.mdi-moon-new:before{content:"\f0f64"}.mdi-moon-waning-crescent:before{content:"\f0f65"}.mdi-moon-waning-gibbous:before{content:"\f0f66"}.mdi-moon-waxing-crescent:before{content:"\f0f67"}.mdi-moon-waxing-gibbous:before{content:"\f0f68"}.mdi-moped:before{content:"\f1086"}.mdi-moped-electric:before{content:"\f15b7"}.mdi-moped-electric-outline:before{content:"\f15b8"}.mdi-moped-outline:before{content:"\f15b9"}.mdi-more:before{content:"\f037b"}.mdi-mortar-pestle:before{content:"\f1748"}.mdi-mortar-pestle-plus:before{content:"\f03f1"}.mdi-mosque:before{content:"\f0d45"}.mdi-mosque-outline:before{content:"\f1827"}.mdi-mother-heart:before{content:"\f1314"}.mdi-mother-nurse:before{content:"\f0d21"}.mdi-motion:before{content:"\f15b2"}.mdi-motion-outline:before{content:"\f15b3"}.mdi-motion-pause:before{content:"\f1590"}.mdi-motion-pause-outline:before{content:"\f1592"}.mdi-motion-play:before{content:"\f158f"}.mdi-motion-play-outline:before{content:"\f1591"}.mdi-motion-sensor:before{content:"\f0d91"}.mdi-motion-sensor-off:before{content:"\f1435"}.mdi-motorbike:before{content:"\f037c"}.mdi-motorbike-electric:before{content:"\f15ba"}.mdi-motorbike-off:before{content:"\f1b16"}.mdi-mouse:before{content:"\f037d"}.mdi-mouse-bluetooth:before{content:"\f098b"}.mdi-mouse-left-click:before{content:"\f1d07"}.mdi-mouse-left-click-outline:before{content:"\f1d08"}.mdi-mouse-move-down:before{content:"\f1550"}.mdi-mouse-move-up:before{content:"\f1551"}.mdi-mouse-move-vertical:before{content:"\f1552"}.mdi-mouse-off:before{content:"\f037e"}.mdi-mouse-outline:before{content:"\f1d09"}.mdi-mouse-right-click:before{content:"\f1d0a"}.mdi-mouse-right-click-outline:before{content:"\f1d0b"}.mdi-mouse-scroll-wheel:before{content:"\f1d0c"}.mdi-mouse-variant:before{content:"\f037f"}.mdi-mouse-variant-off:before{content:"\f0380"}.mdi-move-resize:before{content:"\f0655"}.mdi-move-resize-variant:before{content:"\f0656"}.mdi-movie:before{content:"\f0381"}.mdi-movie-check:before{content:"\f16f3"}.mdi-movie-check-outline:before{content:"\f16f4"}.mdi-movie-cog:before{content:"\f16f5"}.mdi-movie-cog-outline:before{content:"\f16f6"}.mdi-movie-edit:before{content:"\f1122"}.mdi-movie-edit-outline:before{content:"\f1123"}.mdi-movie-filter:before{content:"\f1124"}.mdi-movie-filter-outline:before{content:"\f1125"}.mdi-movie-minus:before{content:"\f16f7"}.mdi-movie-minus-outline:before{content:"\f16f8"}.mdi-movie-off:before{content:"\f16f9"}.mdi-movie-off-outline:before{content:"\f16fa"}.mdi-movie-open:before{content:"\f0fce"}.mdi-movie-open-check:before{content:"\f16fb"}.mdi-movie-open-check-outline:before{content:"\f16fc"}.mdi-movie-open-cog:before{content:"\f16fd"}.mdi-movie-open-cog-outline:before{content:"\f16fe"}.mdi-movie-open-edit:before{content:"\f16ff"}.mdi-movie-open-edit-outline:before{content:"\f1700"}.mdi-movie-open-minus:before{content:"\f1701"}.mdi-movie-open-minus-outline:before{content:"\f1702"}.mdi-movie-open-off:before{content:"\f1703"}.mdi-movie-open-off-outline:before{content:"\f1704"}.mdi-movie-open-outline:before{content:"\f0fcf"}.mdi-movie-open-play:before{content:"\f1705"}.mdi-movie-open-play-outline:before{content:"\f1706"}.mdi-movie-open-plus:before{content:"\f1707"}.mdi-movie-open-plus-outline:before{content:"\f1708"}.mdi-movie-open-remove:before{content:"\f1709"}.mdi-movie-open-remove-outline:before{content:"\f170a"}.mdi-movie-open-settings:before{content:"\f170b"}.mdi-movie-open-settings-outline:before{content:"\f170c"}.mdi-movie-open-star:before{content:"\f170d"}.mdi-movie-open-star-outline:before{content:"\f170e"}.mdi-movie-outline:before{content:"\f0ddd"}.mdi-movie-play:before{content:"\f170f"}.mdi-movie-play-outline:before{content:"\f1710"}.mdi-movie-plus:before{content:"\f1711"}.mdi-movie-plus-outline:before{content:"\f1712"}.mdi-movie-remove:before{content:"\f1713"}.mdi-movie-remove-outline:before{content:"\f1714"}.mdi-movie-roll:before{content:"\f07de"}.mdi-movie-search:before{content:"\f11d2"}.mdi-movie-search-outline:before{content:"\f11d3"}.mdi-movie-settings:before{content:"\f1715"}.mdi-movie-settings-outline:before{content:"\f1716"}.mdi-movie-star:before{content:"\f1717"}.mdi-movie-star-outline:before{content:"\f1718"}.mdi-mower:before{content:"\f166f"}.mdi-mower-bag:before{content:"\f1670"}.mdi-mower-bag-on:before{content:"\f1b60"}.mdi-mower-on:before{content:"\f1b5f"}.mdi-muffin:before{content:"\f098c"}.mdi-multicast:before{content:"\f1893"}.mdi-multimedia:before{content:"\f1b97"}.mdi-multiplication:before{content:"\f0382"}.mdi-multiplication-box:before{content:"\f0383"}.mdi-mushroom:before{content:"\f07df"}.mdi-mushroom-off:before{content:"\f13fa"}.mdi-mushroom-off-outline:before{content:"\f13fb"}.mdi-mushroom-outline:before{content:"\f07e0"}.mdi-music:before{content:"\f075a"}.mdi-music-accidental-double-flat:before{content:"\f0f69"}.mdi-music-accidental-double-sharp:before{content:"\f0f6a"}.mdi-music-accidental-flat:before{content:"\f0f6b"}.mdi-music-accidental-natural:before{content:"\f0f6c"}.mdi-music-accidental-sharp:before{content:"\f0f6d"}.mdi-music-box:before{content:"\f0384"}.mdi-music-box-multiple:before{content:"\f0333"}.mdi-music-box-multiple-outline:before{content:"\f0f04"}.mdi-music-box-outline:before{content:"\f0385"}.mdi-music-circle:before{content:"\f0386"}.mdi-music-circle-outline:before{content:"\f0ad4"}.mdi-music-clef-alto:before{content:"\f0f6e"}.mdi-music-clef-bass:before{content:"\f0f6f"}.mdi-music-clef-treble:before{content:"\f0f70"}.mdi-music-note:before{content:"\f0387"}.mdi-music-note-bluetooth:before{content:"\f05fe"}.mdi-music-note-bluetooth-off:before{content:"\f05ff"}.mdi-music-note-eighth:before{content:"\f0388"}.mdi-music-note-eighth-dotted:before{content:"\f0f71"}.mdi-music-note-half:before{content:"\f0389"}.mdi-music-note-half-dotted:before{content:"\f0f72"}.mdi-music-note-minus:before{content:"\f1b89"}.mdi-music-note-off:before{content:"\f038a"}.mdi-music-note-off-outline:before{content:"\f0f73"}.mdi-music-note-outline:before{content:"\f0f74"}.mdi-music-note-plus:before{content:"\f0dde"}.mdi-music-note-quarter:before{content:"\f038b"}.mdi-music-note-quarter-dotted:before{content:"\f0f75"}.mdi-music-note-sixteenth:before{content:"\f038c"}.mdi-music-note-sixteenth-dotted:before{content:"\f0f76"}.mdi-music-note-whole:before{content:"\f038d"}.mdi-music-note-whole-dotted:before{content:"\f0f77"}.mdi-music-off:before{content:"\f075b"}.mdi-music-rest-eighth:before{content:"\f0f78"}.mdi-music-rest-half:before{content:"\f0f79"}.mdi-music-rest-quarter:before{content:"\f0f7a"}.mdi-music-rest-sixteenth:before{content:"\f0f7b"}.mdi-music-rest-whole:before{content:"\f0f7c"}.mdi-mustache:before{content:"\f15de"}.mdi-nail:before{content:"\f0ddf"}.mdi-nas:before{content:"\f08f3"}.mdi-nativescript:before{content:"\f0880"}.mdi-nature:before{content:"\f038e"}.mdi-nature-outline:before{content:"\f1c71"}.mdi-nature-people:before{content:"\f038f"}.mdi-nature-people-outline:before{content:"\f1c72"}.mdi-navigation:before{content:"\f0390"}.mdi-navigation-outline:before{content:"\f1607"}.mdi-navigation-variant:before{content:"\f18f0"}.mdi-navigation-variant-outline:before{content:"\f18f1"}.mdi-near-me:before{content:"\f05cd"}.mdi-necklace:before{content:"\f0f0b"}.mdi-needle:before{content:"\f0391"}.mdi-needle-off:before{content:"\f19d2"}.mdi-netflix:before{content:"\f0746"}.mdi-network:before{content:"\f06f3"}.mdi-network-off:before{content:"\f0c9b"}.mdi-network-off-outline:before{content:"\f0c9c"}.mdi-network-outline:before{content:"\f0c9d"}.mdi-network-pos:before{content:"\f1acb"}.mdi-network-strength-1:before{content:"\f08f4"}.mdi-network-strength-1-alert:before{content:"\f08f5"}.mdi-network-strength-2:before{content:"\f08f6"}.mdi-network-strength-2-alert:before{content:"\f08f7"}.mdi-network-strength-3:before{content:"\f08f8"}.mdi-network-strength-3-alert:before{content:"\f08f9"}.mdi-network-strength-4:before{content:"\f08fa"}.mdi-network-strength-4-alert:before{content:"\f08fb"}.mdi-network-strength-4-cog:before{content:"\f191a"}.mdi-network-strength-off:before{content:"\f08fc"}.mdi-network-strength-off-outline:before{content:"\f08fd"}.mdi-network-strength-outline:before{content:"\f08fe"}.mdi-new-box:before{content:"\f0394"}.mdi-newspaper:before{content:"\f0395"}.mdi-newspaper-check:before{content:"\f1943"}.mdi-newspaper-minus:before{content:"\f0f0c"}.mdi-newspaper-plus:before{content:"\f0f0d"}.mdi-newspaper-remove:before{content:"\f1944"}.mdi-newspaper-variant:before{content:"\f1001"}.mdi-newspaper-variant-multiple:before{content:"\f1002"}.mdi-newspaper-variant-multiple-outline:before{content:"\f1003"}.mdi-newspaper-variant-outline:before{content:"\f1004"}.mdi-nfc:before{content:"\f0396"}.mdi-nfc-search-variant:before{content:"\f0e53"}.mdi-nfc-tap:before{content:"\f0397"}.mdi-nfc-variant:before{content:"\f0398"}.mdi-nfc-variant-off:before{content:"\f0e54"}.mdi-ninja:before{content:"\f0774"}.mdi-nintendo-game-boy:before{content:"\f1393"}.mdi-nintendo-switch:before{content:"\f07e1"}.mdi-nintendo-wii:before{content:"\f05ab"}.mdi-nintendo-wiiu:before{content:"\f072d"}.mdi-nix:before{content:"\f1105"}.mdi-nodejs:before{content:"\f0399"}.mdi-noodles:before{content:"\f117e"}.mdi-not-equal:before{content:"\f098d"}.mdi-not-equal-variant:before{content:"\f098e"}.mdi-note:before{content:"\f039a"}.mdi-note-alert:before{content:"\f177d"}.mdi-note-alert-outline:before{content:"\f177e"}.mdi-note-check:before{content:"\f177f"}.mdi-note-check-outline:before{content:"\f1780"}.mdi-note-edit:before{content:"\f1781"}.mdi-note-edit-outline:before{content:"\f1782"}.mdi-note-minus:before{content:"\f164f"}.mdi-note-minus-outline:before{content:"\f1650"}.mdi-note-multiple:before{content:"\f06b8"}.mdi-note-multiple-outline:before{content:"\f06b9"}.mdi-note-off:before{content:"\f1783"}.mdi-note-off-outline:before{content:"\f1784"}.mdi-note-outline:before{content:"\f039b"}.mdi-note-plus:before{content:"\f039c"}.mdi-note-plus-outline:before{content:"\f039d"}.mdi-note-remove:before{content:"\f1651"}.mdi-note-remove-outline:before{content:"\f1652"}.mdi-note-search:before{content:"\f1653"}.mdi-note-search-outline:before{content:"\f1654"}.mdi-note-text:before{content:"\f039e"}.mdi-note-text-outline:before{content:"\f11d7"}.mdi-notebook:before{content:"\f082e"}.mdi-notebook-check:before{content:"\f14f5"}.mdi-notebook-check-outline:before{content:"\f14f6"}.mdi-notebook-edit:before{content:"\f14e7"}.mdi-notebook-edit-outline:before{content:"\f14e9"}.mdi-notebook-heart:before{content:"\f1a0b"}.mdi-notebook-heart-outline:before{content:"\f1a0c"}.mdi-notebook-minus:before{content:"\f1610"}.mdi-notebook-minus-outline:before{content:"\f1611"}.mdi-notebook-multiple:before{content:"\f0e55"}.mdi-notebook-outline:before{content:"\f0ebf"}.mdi-notebook-plus:before{content:"\f1612"}.mdi-notebook-plus-outline:before{content:"\f1613"}.mdi-notebook-remove:before{content:"\f1614"}.mdi-notebook-remove-outline:before{content:"\f1615"}.mdi-notification-clear-all:before{content:"\f039f"}.mdi-npm:before{content:"\f06f7"}.mdi-nuke:before{content:"\f06a4"}.mdi-null:before{content:"\f07e2"}.mdi-numeric:before{content:"\f03a0"}.mdi-numeric-0:before{content:"\f0b39"}.mdi-numeric-0-box:before{content:"\f03a1"}.mdi-numeric-0-box-multiple:before{content:"\f0f0e"}.mdi-numeric-0-box-multiple-outline:before{content:"\f03a2"}.mdi-numeric-0-box-outline:before{content:"\f03a3"}.mdi-numeric-0-circle:before{content:"\f0c9e"}.mdi-numeric-0-circle-outline:before{content:"\f0c9f"}.mdi-numeric-1:before{content:"\f0b3a"}.mdi-numeric-1-box:before{content:"\f03a4"}.mdi-numeric-1-box-multiple:before{content:"\f0f0f"}.mdi-numeric-1-box-multiple-outline:before{content:"\f03a5"}.mdi-numeric-1-box-outline:before{content:"\f03a6"}.mdi-numeric-1-circle:before{content:"\f0ca0"}.mdi-numeric-1-circle-outline:before{content:"\f0ca1"}.mdi-numeric-10:before{content:"\f0fe9"}.mdi-numeric-10-box:before{content:"\f0f7d"}.mdi-numeric-10-box-multiple:before{content:"\f0fea"}.mdi-numeric-10-box-multiple-outline:before{content:"\f0feb"}.mdi-numeric-10-box-outline:before{content:"\f0f7e"}.mdi-numeric-10-circle:before{content:"\f0fec"}.mdi-numeric-10-circle-outline:before{content:"\f0fed"}.mdi-numeric-2:before{content:"\f0b3b"}.mdi-numeric-2-box:before{content:"\f03a7"}.mdi-numeric-2-box-multiple:before{content:"\f0f10"}.mdi-numeric-2-box-multiple-outline:before{content:"\f03a8"}.mdi-numeric-2-box-outline:before{content:"\f03a9"}.mdi-numeric-2-circle:before{content:"\f0ca2"}.mdi-numeric-2-circle-outline:before{content:"\f0ca3"}.mdi-numeric-3:before{content:"\f0b3c"}.mdi-numeric-3-box:before{content:"\f03aa"}.mdi-numeric-3-box-multiple:before{content:"\f0f11"}.mdi-numeric-3-box-multiple-outline:before{content:"\f03ab"}.mdi-numeric-3-box-outline:before{content:"\f03ac"}.mdi-numeric-3-circle:before{content:"\f0ca4"}.mdi-numeric-3-circle-outline:before{content:"\f0ca5"}.mdi-numeric-4:before{content:"\f0b3d"}.mdi-numeric-4-box:before{content:"\f03ad"}.mdi-numeric-4-box-multiple:before{content:"\f0f12"}.mdi-numeric-4-box-multiple-outline:before{content:"\f03b2"}.mdi-numeric-4-box-outline:before{content:"\f03ae"}.mdi-numeric-4-circle:before{content:"\f0ca6"}.mdi-numeric-4-circle-outline:before{content:"\f0ca7"}.mdi-numeric-5:before{content:"\f0b3e"}.mdi-numeric-5-box:before{content:"\f03b1"}.mdi-numeric-5-box-multiple:before{content:"\f0f13"}.mdi-numeric-5-box-multiple-outline:before{content:"\f03af"}.mdi-numeric-5-box-outline:before{content:"\f03b0"}.mdi-numeric-5-circle:before{content:"\f0ca8"}.mdi-numeric-5-circle-outline:before{content:"\f0ca9"}.mdi-numeric-6:before{content:"\f0b3f"}.mdi-numeric-6-box:before{content:"\f03b3"}.mdi-numeric-6-box-multiple:before{content:"\f0f14"}.mdi-numeric-6-box-multiple-outline:before{content:"\f03b4"}.mdi-numeric-6-box-outline:before{content:"\f03b5"}.mdi-numeric-6-circle:before{content:"\f0caa"}.mdi-numeric-6-circle-outline:before{content:"\f0cab"}.mdi-numeric-7:before{content:"\f0b40"}.mdi-numeric-7-box:before{content:"\f03b6"}.mdi-numeric-7-box-multiple:before{content:"\f0f15"}.mdi-numeric-7-box-multiple-outline:before{content:"\f03b7"}.mdi-numeric-7-box-outline:before{content:"\f03b8"}.mdi-numeric-7-circle:before{content:"\f0cac"}.mdi-numeric-7-circle-outline:before{content:"\f0cad"}.mdi-numeric-8:before{content:"\f0b41"}.mdi-numeric-8-box:before{content:"\f03b9"}.mdi-numeric-8-box-multiple:before{content:"\f0f16"}.mdi-numeric-8-box-multiple-outline:before{content:"\f03ba"}.mdi-numeric-8-box-outline:before{content:"\f03bb"}.mdi-numeric-8-circle:before{content:"\f0cae"}.mdi-numeric-8-circle-outline:before{content:"\f0caf"}.mdi-numeric-9:before{content:"\f0b42"}.mdi-numeric-9-box:before{content:"\f03bc"}.mdi-numeric-9-box-multiple:before{content:"\f0f17"}.mdi-numeric-9-box-multiple-outline:before{content:"\f03bd"}.mdi-numeric-9-box-outline:before{content:"\f03be"}.mdi-numeric-9-circle:before{content:"\f0cb0"}.mdi-numeric-9-circle-outline:before{content:"\f0cb1"}.mdi-numeric-9-plus:before{content:"\f0fee"}.mdi-numeric-9-plus-box:before{content:"\f03bf"}.mdi-numeric-9-plus-box-multiple:before{content:"\f0f18"}.mdi-numeric-9-plus-box-multiple-outline:before{content:"\f03c0"}.mdi-numeric-9-plus-box-outline:before{content:"\f03c1"}.mdi-numeric-9-plus-circle:before{content:"\f0cb2"}.mdi-numeric-9-plus-circle-outline:before{content:"\f0cb3"}.mdi-numeric-negative-1:before{content:"\f1052"}.mdi-numeric-off:before{content:"\f19d3"}.mdi-numeric-positive-1:before{content:"\f15cb"}.mdi-nut:before{content:"\f06f8"}.mdi-nutrition:before{content:"\f03c2"}.mdi-nuxt:before{content:"\f1106"}.mdi-oar:before{content:"\f067c"}.mdi-ocarina:before{content:"\f0de0"}.mdi-oci:before{content:"\f12e9"}.mdi-ocr:before{content:"\f113a"}.mdi-octagon:before{content:"\f03c3"}.mdi-octagon-outline:before{content:"\f03c4"}.mdi-octagram:before{content:"\f06f9"}.mdi-octagram-edit:before{content:"\f1c34"}.mdi-octagram-edit-outline:before{content:"\f1c35"}.mdi-octagram-minus:before{content:"\f1c36"}.mdi-octagram-minus-outline:before{content:"\f1c37"}.mdi-octagram-outline:before{content:"\f0775"}.mdi-octagram-plus:before{content:"\f1c38"}.mdi-octagram-plus-outline:before{content:"\f1c39"}.mdi-octahedron:before{content:"\f1950"}.mdi-octahedron-off:before{content:"\f1951"}.mdi-odnoklassniki:before{content:"\f03c5"}.mdi-offer:before{content:"\f121b"}.mdi-office-building:before{content:"\f0991"}.mdi-office-building-cog:before{content:"\f1949"}.mdi-office-building-cog-outline:before{content:"\f194a"}.mdi-office-building-marker:before{content:"\f1520"}.mdi-office-building-marker-outline:before{content:"\f1521"}.mdi-office-building-minus:before{content:"\f1baa"}.mdi-office-building-minus-outline:before{content:"\f1bab"}.mdi-office-building-outline:before{content:"\f151f"}.mdi-office-building-plus:before{content:"\f1ba8"}.mdi-office-building-plus-outline:before{content:"\f1ba9"}.mdi-office-building-remove:before{content:"\f1bac"}.mdi-office-building-remove-outline:before{content:"\f1bad"}.mdi-oil:before{content:"\f03c7"}.mdi-oil-lamp:before{content:"\f0f19"}.mdi-oil-level:before{content:"\f1053"}.mdi-oil-temperature:before{content:"\f0ff8"}.mdi-om:before{content:"\f0973"}.mdi-omega:before{content:"\f03c9"}.mdi-one-up:before{content:"\f0bad"}.mdi-onepassword:before{content:"\f0881"}.mdi-opacity:before{content:"\f05cc"}.mdi-open-in-app:before{content:"\f03cb"}.mdi-open-in-new:before{content:"\f03cc"}.mdi-open-source-initiative:before{content:"\f0bae"}.mdi-openid:before{content:"\f03cd"}.mdi-opera:before{content:"\f03ce"}.mdi-orbit:before{content:"\f0018"}.mdi-orbit-variant:before{content:"\f15db"}.mdi-order-alphabetical-ascending:before{content:"\f020d"}.mdi-order-alphabetical-descending:before{content:"\f0d07"}.mdi-order-bool-ascending:before{content:"\f02be"}.mdi-order-bool-ascending-variant:before{content:"\f098f"}.mdi-order-bool-descending:before{content:"\f1384"}.mdi-order-bool-descending-variant:before{content:"\f0990"}.mdi-order-numeric-ascending:before{content:"\f0545"}.mdi-order-numeric-descending:before{content:"\f0546"}.mdi-origin:before{content:"\f0b43"}.mdi-ornament:before{content:"\f03cf"}.mdi-ornament-variant:before{content:"\f03d0"}.mdi-outdoor-lamp:before{content:"\f1054"}.mdi-overscan:before{content:"\f1005"}.mdi-owl:before{content:"\f03d2"}.mdi-pac-man:before{content:"\f0baf"}.mdi-package:before{content:"\f03d3"}.mdi-package-check:before{content:"\f1b51"}.mdi-package-down:before{content:"\f03d4"}.mdi-package-up:before{content:"\f03d5"}.mdi-package-variant:before{content:"\f03d6"}.mdi-package-variant-closed:before{content:"\f03d7"}.mdi-package-variant-closed-check:before{content:"\f1b52"}.mdi-package-variant-closed-minus:before{content:"\f19d4"}.mdi-package-variant-closed-plus:before{content:"\f19d5"}.mdi-package-variant-closed-remove:before{content:"\f19d6"}.mdi-package-variant-minus:before{content:"\f19d7"}.mdi-package-variant-plus:before{content:"\f19d8"}.mdi-package-variant-remove:before{content:"\f19d9"}.mdi-page-first:before{content:"\f0600"}.mdi-page-last:before{content:"\f0601"}.mdi-page-layout-body:before{content:"\f06fa"}.mdi-page-layout-footer:before{content:"\f06fb"}.mdi-page-layout-header:before{content:"\f06fc"}.mdi-page-layout-header-footer:before{content:"\f0f7f"}.mdi-page-layout-sidebar-left:before{content:"\f06fd"}.mdi-page-layout-sidebar-right:before{content:"\f06fe"}.mdi-page-next:before{content:"\f0bb0"}.mdi-page-next-outline:before{content:"\f0bb1"}.mdi-page-previous:before{content:"\f0bb2"}.mdi-page-previous-outline:before{content:"\f0bb3"}.mdi-pail:before{content:"\f1417"}.mdi-pail-minus:before{content:"\f1437"}.mdi-pail-minus-outline:before{content:"\f143c"}.mdi-pail-off:before{content:"\f1439"}.mdi-pail-off-outline:before{content:"\f143e"}.mdi-pail-outline:before{content:"\f143a"}.mdi-pail-plus:before{content:"\f1436"}.mdi-pail-plus-outline:before{content:"\f143b"}.mdi-pail-remove:before{content:"\f1438"}.mdi-pail-remove-outline:before{content:"\f143d"}.mdi-palette:before{content:"\f03d8"}.mdi-palette-advanced:before{content:"\f03d9"}.mdi-palette-outline:before{content:"\f0e0c"}.mdi-palette-swatch:before{content:"\f08b5"}.mdi-palette-swatch-outline:before{content:"\f135c"}.mdi-palette-swatch-variant:before{content:"\f195a"}.mdi-palm-tree:before{content:"\f1055"}.mdi-pan:before{content:"\f0bb4"}.mdi-pan-bottom-left:before{content:"\f0bb5"}.mdi-pan-bottom-right:before{content:"\f0bb6"}.mdi-pan-down:before{content:"\f0bb7"}.mdi-pan-horizontal:before{content:"\f0bb8"}.mdi-pan-left:before{content:"\f0bb9"}.mdi-pan-right:before{content:"\f0bba"}.mdi-pan-top-left:before{content:"\f0bbb"}.mdi-pan-top-right:before{content:"\f0bbc"}.mdi-pan-up:before{content:"\f0bbd"}.mdi-pan-vertical:before{content:"\f0bbe"}.mdi-panda:before{content:"\f03da"}.mdi-pandora:before{content:"\f03db"}.mdi-panorama:before{content:"\f03dc"}.mdi-panorama-fisheye:before{content:"\f03dd"}.mdi-panorama-horizontal:before{content:"\f1928"}.mdi-panorama-horizontal-outline:before{content:"\f03de"}.mdi-panorama-outline:before{content:"\f198c"}.mdi-panorama-sphere:before{content:"\f198d"}.mdi-panorama-sphere-outline:before{content:"\f198e"}.mdi-panorama-variant:before{content:"\f198f"}.mdi-panorama-variant-outline:before{content:"\f1990"}.mdi-panorama-vertical:before{content:"\f1929"}.mdi-panorama-vertical-outline:before{content:"\f03df"}.mdi-panorama-wide-angle:before{content:"\f195f"}.mdi-panorama-wide-angle-outline:before{content:"\f03e0"}.mdi-paper-cut-vertical:before{content:"\f03e1"}.mdi-paper-roll:before{content:"\f1157"}.mdi-paper-roll-outline:before{content:"\f1158"}.mdi-paperclip:before{content:"\f03e2"}.mdi-paperclip-check:before{content:"\f1ac6"}.mdi-paperclip-lock:before{content:"\f19da"}.mdi-paperclip-minus:before{content:"\f1ac7"}.mdi-paperclip-off:before{content:"\f1ac8"}.mdi-paperclip-plus:before{content:"\f1ac9"}.mdi-paperclip-remove:before{content:"\f1aca"}.mdi-parachute:before{content:"\f0cb4"}.mdi-parachute-outline:before{content:"\f0cb5"}.mdi-paragliding:before{content:"\f1745"}.mdi-parking:before{content:"\f03e3"}.mdi-party-popper:before{content:"\f1056"}.mdi-passport:before{content:"\f07e3"}.mdi-passport-alert:before{content:"\f1cb8"}.mdi-passport-biometric:before{content:"\f0de1"}.mdi-passport-cancel:before{content:"\f1cb9"}.mdi-passport-check:before{content:"\f1cba"}.mdi-passport-minus:before{content:"\f1cbb"}.mdi-passport-plus:before{content:"\f1cbc"}.mdi-passport-remove:before{content:"\f1cbd"}.mdi-pasta:before{content:"\f1160"}.mdi-patio-heater:before{content:"\f0f80"}.mdi-patreon:before{content:"\f0882"}.mdi-pause:before{content:"\f03e4"}.mdi-pause-box:before{content:"\f00bc"}.mdi-pause-box-outline:before{content:"\f1b7a"}.mdi-pause-circle:before{content:"\f03e5"}.mdi-pause-circle-outline:before{content:"\f03e6"}.mdi-pause-octagon:before{content:"\f03e7"}.mdi-pause-octagon-outline:before{content:"\f03e8"}.mdi-paw:before{content:"\f03e9"}.mdi-paw-off:before{content:"\f0657"}.mdi-paw-off-outline:before{content:"\f1676"}.mdi-paw-outline:before{content:"\f1675"}.mdi-peace:before{content:"\f0884"}.mdi-peanut:before{content:"\f0ffc"}.mdi-peanut-off:before{content:"\f0ffd"}.mdi-peanut-off-outline:before{content:"\f0fff"}.mdi-peanut-outline:before{content:"\f0ffe"}.mdi-pen:before{content:"\f03ea"}.mdi-pen-lock:before{content:"\f0de2"}.mdi-pen-minus:before{content:"\f0de3"}.mdi-pen-off:before{content:"\f0de4"}.mdi-pen-plus:before{content:"\f0de5"}.mdi-pen-remove:before{content:"\f0de6"}.mdi-pencil:before{content:"\f03eb"}.mdi-pencil-box:before{content:"\f03ec"}.mdi-pencil-box-multiple:before{content:"\f1144"}.mdi-pencil-box-multiple-outline:before{content:"\f1145"}.mdi-pencil-box-outline:before{content:"\f03ed"}.mdi-pencil-circle:before{content:"\f06ff"}.mdi-pencil-circle-outline:before{content:"\f0776"}.mdi-pencil-lock:before{content:"\f03ee"}.mdi-pencil-lock-outline:before{content:"\f0de7"}.mdi-pencil-minus:before{content:"\f0de8"}.mdi-pencil-minus-outline:before{content:"\f0de9"}.mdi-pencil-off:before{content:"\f03ef"}.mdi-pencil-off-outline:before{content:"\f0dea"}.mdi-pencil-outline:before{content:"\f0cb6"}.mdi-pencil-plus:before{content:"\f0deb"}.mdi-pencil-plus-outline:before{content:"\f0dec"}.mdi-pencil-remove:before{content:"\f0ded"}.mdi-pencil-remove-outline:before{content:"\f0dee"}.mdi-pencil-ruler:before{content:"\f1353"}.mdi-pencil-ruler-outline:before{content:"\f1c11"}.mdi-penguin:before{content:"\f0ec0"}.mdi-pentagon:before{content:"\f0701"}.mdi-pentagon-outline:before{content:"\f0700"}.mdi-pentagram:before{content:"\f1667"}.mdi-percent:before{content:"\f03f0"}.mdi-percent-box:before{content:"\f1a02"}.mdi-percent-box-outline:before{content:"\f1a03"}.mdi-percent-circle:before{content:"\f1a04"}.mdi-percent-circle-outline:before{content:"\f1a05"}.mdi-percent-outline:before{content:"\f1278"}.mdi-periodic-table:before{content:"\f08b6"}.mdi-perspective-less:before{content:"\f0d23"}.mdi-perspective-more:before{content:"\f0d24"}.mdi-ph:before{content:"\f17c5"}.mdi-phone:before{content:"\f03f2"}.mdi-phone-alert:before{content:"\f0f1a"}.mdi-phone-alert-outline:before{content:"\f118e"}.mdi-phone-bluetooth:before{content:"\f03f3"}.mdi-phone-bluetooth-outline:before{content:"\f118f"}.mdi-phone-cancel:before{content:"\f10bc"}.mdi-phone-cancel-outline:before{content:"\f1190"}.mdi-phone-check:before{content:"\f11a9"}.mdi-phone-check-outline:before{content:"\f11aa"}.mdi-phone-classic:before{content:"\f0602"}.mdi-phone-classic-off:before{content:"\f1279"}.mdi-phone-clock:before{content:"\f19db"}.mdi-phone-dial:before{content:"\f1559"}.mdi-phone-dial-outline:before{content:"\f155a"}.mdi-phone-forward:before{content:"\f03f4"}.mdi-phone-forward-outline:before{content:"\f1191"}.mdi-phone-hangup:before{content:"\f03f5"}.mdi-phone-hangup-outline:before{content:"\f1192"}.mdi-phone-in-talk:before{content:"\f03f6"}.mdi-phone-in-talk-outline:before{content:"\f1182"}.mdi-phone-incoming:before{content:"\f03f7"}.mdi-phone-incoming-outgoing:before{content:"\f1b3f"}.mdi-phone-incoming-outgoing-outline:before{content:"\f1b40"}.mdi-phone-incoming-outline:before{content:"\f1193"}.mdi-phone-lock:before{content:"\f03f8"}.mdi-phone-lock-outline:before{content:"\f1194"}.mdi-phone-log:before{content:"\f03f9"}.mdi-phone-log-outline:before{content:"\f1195"}.mdi-phone-message:before{content:"\f1196"}.mdi-phone-message-outline:before{content:"\f1197"}.mdi-phone-minus:before{content:"\f0658"}.mdi-phone-minus-outline:before{content:"\f1198"}.mdi-phone-missed:before{content:"\f03fa"}.mdi-phone-missed-outline:before{content:"\f11a5"}.mdi-phone-off:before{content:"\f0def"}.mdi-phone-off-outline:before{content:"\f11a6"}.mdi-phone-outgoing:before{content:"\f03fb"}.mdi-phone-outgoing-outline:before{content:"\f1199"}.mdi-phone-outline:before{content:"\f0df0"}.mdi-phone-paused:before{content:"\f03fc"}.mdi-phone-paused-outline:before{content:"\f119a"}.mdi-phone-plus:before{content:"\f0659"}.mdi-phone-plus-outline:before{content:"\f119b"}.mdi-phone-refresh:before{content:"\f1993"}.mdi-phone-refresh-outline:before{content:"\f1994"}.mdi-phone-remove:before{content:"\f152f"}.mdi-phone-remove-outline:before{content:"\f1530"}.mdi-phone-return:before{content:"\f082f"}.mdi-phone-return-outline:before{content:"\f119c"}.mdi-phone-ring:before{content:"\f11ab"}.mdi-phone-ring-outline:before{content:"\f11ac"}.mdi-phone-rotate-landscape:before{content:"\f0885"}.mdi-phone-rotate-portrait:before{content:"\f0886"}.mdi-phone-settings:before{content:"\f03fd"}.mdi-phone-settings-outline:before{content:"\f119d"}.mdi-phone-sync:before{content:"\f1995"}.mdi-phone-sync-outline:before{content:"\f1996"}.mdi-phone-voip:before{content:"\f03fe"}.mdi-pi:before{content:"\f03ff"}.mdi-pi-box:before{content:"\f0400"}.mdi-pi-hole:before{content:"\f0df1"}.mdi-piano:before{content:"\f067d"}.mdi-piano-off:before{content:"\f0698"}.mdi-pickaxe:before{content:"\f08b7"}.mdi-picture-in-picture-bottom-right:before{content:"\f0e57"}.mdi-picture-in-picture-bottom-right-outline:before{content:"\f0e58"}.mdi-picture-in-picture-top-right:before{content:"\f0e59"}.mdi-picture-in-picture-top-right-outline:before{content:"\f0e5a"}.mdi-pier:before{content:"\f0887"}.mdi-pier-crane:before{content:"\f0888"}.mdi-pig:before{content:"\f0401"}.mdi-pig-variant:before{content:"\f1006"}.mdi-pig-variant-outline:before{content:"\f1678"}.mdi-piggy-bank:before{content:"\f1007"}.mdi-piggy-bank-outline:before{content:"\f1679"}.mdi-pill:before{content:"\f0402"}.mdi-pill-multiple:before{content:"\f1b4c"}.mdi-pill-off:before{content:"\f1a5c"}.mdi-pillar:before{content:"\f0702"}.mdi-pin:before{content:"\f0403"}.mdi-pin-off:before{content:"\f0404"}.mdi-pin-off-outline:before{content:"\f0930"}.mdi-pin-outline:before{content:"\f0931"}.mdi-pine-tree:before{content:"\f0405"}.mdi-pine-tree-box:before{content:"\f0406"}.mdi-pine-tree-fire:before{content:"\f141a"}.mdi-pine-tree-variant:before{content:"\f1c73"}.mdi-pine-tree-variant-outline:before{content:"\f1c74"}.mdi-pinterest:before{content:"\f0407"}.mdi-pinwheel:before{content:"\f0ad5"}.mdi-pinwheel-outline:before{content:"\f0ad6"}.mdi-pipe:before{content:"\f07e5"}.mdi-pipe-disconnected:before{content:"\f07e6"}.mdi-pipe-leak:before{content:"\f0889"}.mdi-pipe-valve:before{content:"\f184d"}.mdi-pipe-wrench:before{content:"\f1354"}.mdi-pirate:before{content:"\f0a08"}.mdi-pistol:before{content:"\f0703"}.mdi-piston:before{content:"\f088a"}.mdi-pitchfork:before{content:"\f1553"}.mdi-pizza:before{content:"\f0409"}.mdi-plane-car:before{content:"\f1aff"}.mdi-plane-train:before{content:"\f1b00"}.mdi-play:before{content:"\f040a"}.mdi-play-box:before{content:"\f127a"}.mdi-play-box-edit-outline:before{content:"\f1c3a"}.mdi-play-box-lock:before{content:"\f1a16"}.mdi-play-box-lock-open:before{content:"\f1a17"}.mdi-play-box-lock-open-outline:before{content:"\f1a18"}.mdi-play-box-lock-outline:before{content:"\f1a19"}.mdi-play-box-multiple:before{content:"\f0d19"}.mdi-play-box-multiple-outline:before{content:"\f13e6"}.mdi-play-box-outline:before{content:"\f040b"}.mdi-play-circle:before{content:"\f040c"}.mdi-play-circle-outline:before{content:"\f040d"}.mdi-play-network:before{content:"\f088b"}.mdi-play-network-outline:before{content:"\f0cb7"}.mdi-play-outline:before{content:"\f0f1b"}.mdi-play-pause:before{content:"\f040e"}.mdi-play-protected-content:before{content:"\f040f"}.mdi-play-speed:before{content:"\f08ff"}.mdi-playlist-check:before{content:"\f05c7"}.mdi-playlist-edit:before{content:"\f0900"}.mdi-playlist-minus:before{content:"\f0410"}.mdi-playlist-music:before{content:"\f0cb8"}.mdi-playlist-music-outline:before{content:"\f0cb9"}.mdi-playlist-play:before{content:"\f0411"}.mdi-playlist-plus:before{content:"\f0412"}.mdi-playlist-remove:before{content:"\f0413"}.mdi-playlist-star:before{content:"\f0df2"}.mdi-plex:before{content:"\f06ba"}.mdi-pliers:before{content:"\f19a4"}.mdi-plus:before{content:"\f0415"}.mdi-plus-box:before{content:"\f0416"}.mdi-plus-box-multiple:before{content:"\f0334"}.mdi-plus-box-multiple-outline:before{content:"\f1143"}.mdi-plus-box-outline:before{content:"\f0704"}.mdi-plus-circle:before{content:"\f0417"}.mdi-plus-circle-multiple:before{content:"\f034c"}.mdi-plus-circle-multiple-outline:before{content:"\f0418"}.mdi-plus-circle-outline:before{content:"\f0419"}.mdi-plus-lock:before{content:"\f1a5d"}.mdi-plus-lock-open:before{content:"\f1a5e"}.mdi-plus-minus:before{content:"\f0992"}.mdi-plus-minus-box:before{content:"\f0993"}.mdi-plus-minus-variant:before{content:"\f14c9"}.mdi-plus-network:before{content:"\f041a"}.mdi-plus-network-outline:before{content:"\f0cba"}.mdi-plus-outline:before{content:"\f0705"}.mdi-plus-thick:before{content:"\f11ec"}.mdi-pocket:before{content:"\f1cbe"}.mdi-podcast:before{content:"\f0994"}.mdi-podium:before{content:"\f0d25"}.mdi-podium-bronze:before{content:"\f0d26"}.mdi-podium-gold:before{content:"\f0d27"}.mdi-podium-silver:before{content:"\f0d28"}.mdi-point-of-sale:before{content:"\f0d92"}.mdi-pokeball:before{content:"\f041d"}.mdi-pokemon-go:before{content:"\f0a09"}.mdi-poker-chip:before{content:"\f0830"}.mdi-polaroid:before{content:"\f041e"}.mdi-police-badge:before{content:"\f1167"}.mdi-police-badge-outline:before{content:"\f1168"}.mdi-police-station:before{content:"\f1839"}.mdi-poll:before{content:"\f041f"}.mdi-polo:before{content:"\f14c3"}.mdi-polymer:before{content:"\f0421"}.mdi-pool:before{content:"\f0606"}.mdi-pool-thermometer:before{content:"\f1a5f"}.mdi-popcorn:before{content:"\f0422"}.mdi-post:before{content:"\f1008"}.mdi-post-lamp:before{content:"\f1a60"}.mdi-post-outline:before{content:"\f1009"}.mdi-postage-stamp:before{content:"\f0cbb"}.mdi-pot:before{content:"\f02e5"}.mdi-pot-mix:before{content:"\f065b"}.mdi-pot-mix-outline:before{content:"\f0677"}.mdi-pot-outline:before{content:"\f02ff"}.mdi-pot-steam:before{content:"\f065a"}.mdi-pot-steam-outline:before{content:"\f0326"}.mdi-pound:before{content:"\f0423"}.mdi-pound-box:before{content:"\f0424"}.mdi-pound-box-outline:before{content:"\f117f"}.mdi-power:before{content:"\f0425"}.mdi-power-cycle:before{content:"\f0901"}.mdi-power-off:before{content:"\f0902"}.mdi-power-on:before{content:"\f0903"}.mdi-power-plug:before{content:"\f06a5"}.mdi-power-plug-battery:before{content:"\f1c3b"}.mdi-power-plug-battery-outline:before{content:"\f1c3c"}.mdi-power-plug-off:before{content:"\f06a6"}.mdi-power-plug-off-outline:before{content:"\f1424"}.mdi-power-plug-outline:before{content:"\f1425"}.mdi-power-settings:before{content:"\f0426"}.mdi-power-sleep:before{content:"\f0904"}.mdi-power-socket:before{content:"\f0427"}.mdi-power-socket-au:before{content:"\f0905"}.mdi-power-socket-ch:before{content:"\f0fb3"}.mdi-power-socket-de:before{content:"\f1107"}.mdi-power-socket-eu:before{content:"\f07e7"}.mdi-power-socket-fr:before{content:"\f1108"}.mdi-power-socket-it:before{content:"\f14ff"}.mdi-power-socket-jp:before{content:"\f1109"}.mdi-power-socket-uk:before{content:"\f07e8"}.mdi-power-socket-us:before{content:"\f07e9"}.mdi-power-standby:before{content:"\f0906"}.mdi-powershell:before{content:"\f0a0a"}.mdi-prescription:before{content:"\f0706"}.mdi-presentation:before{content:"\f0428"}.mdi-presentation-play:before{content:"\f0429"}.mdi-pretzel:before{content:"\f1562"}.mdi-printer:before{content:"\f042a"}.mdi-printer-3d:before{content:"\f042b"}.mdi-printer-3d-nozzle:before{content:"\f0e5b"}.mdi-printer-3d-nozzle-alert:before{content:"\f11c0"}.mdi-printer-3d-nozzle-alert-outline:before{content:"\f11c1"}.mdi-printer-3d-nozzle-heat:before{content:"\f18b8"}.mdi-printer-3d-nozzle-heat-outline:before{content:"\f18b9"}.mdi-printer-3d-nozzle-off:before{content:"\f1b19"}.mdi-printer-3d-nozzle-off-outline:before{content:"\f1b1a"}.mdi-printer-3d-nozzle-outline:before{content:"\f0e5c"}.mdi-printer-3d-off:before{content:"\f1b0e"}.mdi-printer-alert:before{content:"\f042c"}.mdi-printer-check:before{content:"\f1146"}.mdi-printer-eye:before{content:"\f1458"}.mdi-printer-off:before{content:"\f0e5d"}.mdi-printer-off-outline:before{content:"\f1785"}.mdi-printer-outline:before{content:"\f1786"}.mdi-printer-pos:before{content:"\f1057"}.mdi-printer-pos-alert:before{content:"\f1bbc"}.mdi-printer-pos-alert-outline:before{content:"\f1bbd"}.mdi-printer-pos-cancel:before{content:"\f1bbe"}.mdi-printer-pos-cancel-outline:before{content:"\f1bbf"}.mdi-printer-pos-check:before{content:"\f1bc0"}.mdi-printer-pos-check-outline:before{content:"\f1bc1"}.mdi-printer-pos-cog:before{content:"\f1bc2"}.mdi-printer-pos-cog-outline:before{content:"\f1bc3"}.mdi-printer-pos-edit:before{content:"\f1bc4"}.mdi-printer-pos-edit-outline:before{content:"\f1bc5"}.mdi-printer-pos-minus:before{content:"\f1bc6"}.mdi-printer-pos-minus-outline:before{content:"\f1bc7"}.mdi-printer-pos-network:before{content:"\f1bc8"}.mdi-printer-pos-network-outline:before{content:"\f1bc9"}.mdi-printer-pos-off:before{content:"\f1bca"}.mdi-printer-pos-off-outline:before{content:"\f1bcb"}.mdi-printer-pos-outline:before{content:"\f1bcc"}.mdi-printer-pos-pause:before{content:"\f1bcd"}.mdi-printer-pos-pause-outline:before{content:"\f1bce"}.mdi-printer-pos-play:before{content:"\f1bcf"}.mdi-printer-pos-play-outline:before{content:"\f1bd0"}.mdi-printer-pos-plus:before{content:"\f1bd1"}.mdi-printer-pos-plus-outline:before{content:"\f1bd2"}.mdi-printer-pos-refresh:before{content:"\f1bd3"}.mdi-printer-pos-refresh-outline:before{content:"\f1bd4"}.mdi-printer-pos-remove:before{content:"\f1bd5"}.mdi-printer-pos-remove-outline:before{content:"\f1bd6"}.mdi-printer-pos-star:before{content:"\f1bd7"}.mdi-printer-pos-star-outline:before{content:"\f1bd8"}.mdi-printer-pos-stop:before{content:"\f1bd9"}.mdi-printer-pos-stop-outline:before{content:"\f1bda"}.mdi-printer-pos-sync:before{content:"\f1bdb"}.mdi-printer-pos-sync-outline:before{content:"\f1bdc"}.mdi-printer-pos-wrench:before{content:"\f1bdd"}.mdi-printer-pos-wrench-outline:before{content:"\f1bde"}.mdi-printer-search:before{content:"\f1457"}.mdi-printer-settings:before{content:"\f0707"}.mdi-printer-wireless:before{content:"\f0a0b"}.mdi-priority-high:before{content:"\f0603"}.mdi-priority-low:before{content:"\f0604"}.mdi-professional-hexagon:before{content:"\f042d"}.mdi-progress-alert:before{content:"\f0cbc"}.mdi-progress-check:before{content:"\f0995"}.mdi-progress-clock:before{content:"\f0996"}.mdi-progress-close:before{content:"\f110a"}.mdi-progress-download:before{content:"\f0997"}.mdi-progress-helper:before{content:"\f1ba2"}.mdi-progress-pencil:before{content:"\f1787"}.mdi-progress-question:before{content:"\f1522"}.mdi-progress-star:before{content:"\f1788"}.mdi-progress-star-four-points:before{content:"\f1c3d"}.mdi-progress-tag:before{content:"\f1d0d"}.mdi-progress-upload:before{content:"\f0998"}.mdi-progress-wrench:before{content:"\f0cbd"}.mdi-projector:before{content:"\f042e"}.mdi-projector-off:before{content:"\f1a23"}.mdi-projector-screen:before{content:"\f042f"}.mdi-projector-screen-off:before{content:"\f180d"}.mdi-projector-screen-off-outline:before{content:"\f180e"}.mdi-projector-screen-outline:before{content:"\f1724"}.mdi-projector-screen-variant:before{content:"\f180f"}.mdi-projector-screen-variant-off:before{content:"\f1810"}.mdi-projector-screen-variant-off-outline:before{content:"\f1811"}.mdi-projector-screen-variant-outline:before{content:"\f1812"}.mdi-propane-tank:before{content:"\f1357"}.mdi-propane-tank-outline:before{content:"\f1358"}.mdi-protocol:before{content:"\f0fd8"}.mdi-publish:before{content:"\f06a7"}.mdi-publish-off:before{content:"\f1945"}.mdi-pulse:before{content:"\f0430"}.mdi-pump:before{content:"\f1402"}.mdi-pump-off:before{content:"\f1b22"}.mdi-pumpkin:before{content:"\f0bbf"}.mdi-purse:before{content:"\f0f1c"}.mdi-purse-outline:before{content:"\f0f1d"}.mdi-puzzle:before{content:"\f0431"}.mdi-puzzle-check:before{content:"\f1426"}.mdi-puzzle-check-outline:before{content:"\f1427"}.mdi-puzzle-edit:before{content:"\f14d3"}.mdi-puzzle-edit-outline:before{content:"\f14d9"}.mdi-puzzle-heart:before{content:"\f14d4"}.mdi-puzzle-heart-outline:before{content:"\f14da"}.mdi-puzzle-minus:before{content:"\f14d1"}.mdi-puzzle-minus-outline:before{content:"\f14d7"}.mdi-puzzle-outline:before{content:"\f0a66"}.mdi-puzzle-plus:before{content:"\f14d0"}.mdi-puzzle-plus-outline:before{content:"\f14d6"}.mdi-puzzle-remove:before{content:"\f14d2"}.mdi-puzzle-remove-outline:before{content:"\f14d8"}.mdi-puzzle-star:before{content:"\f14d5"}.mdi-puzzle-star-outline:before{content:"\f14db"}.mdi-pyramid:before{content:"\f1952"}.mdi-pyramid-off:before{content:"\f1953"}.mdi-qi:before{content:"\f0999"}.mdi-qqchat:before{content:"\f0605"}.mdi-qrcode:before{content:"\f0432"}.mdi-qrcode-edit:before{content:"\f08b8"}.mdi-qrcode-minus:before{content:"\f118c"}.mdi-qrcode-plus:before{content:"\f118b"}.mdi-qrcode-remove:before{content:"\f118d"}.mdi-qrcode-scan:before{content:"\f0433"}.mdi-quadcopter:before{content:"\f0434"}.mdi-quality-high:before{content:"\f0435"}.mdi-quality-low:before{content:"\f0a0c"}.mdi-quality-medium:before{content:"\f0a0d"}.mdi-queue-first-in-last-out:before{content:"\f1caf"}.mdi-quora:before{content:"\f0d29"}.mdi-rabbit:before{content:"\f0907"}.mdi-rabbit-variant:before{content:"\f1a61"}.mdi-rabbit-variant-outline:before{content:"\f1a62"}.mdi-racing-helmet:before{content:"\f0d93"}.mdi-racquetball:before{content:"\f0d94"}.mdi-radar:before{content:"\f0437"}.mdi-radiator:before{content:"\f0438"}.mdi-radiator-disabled:before{content:"\f0ad7"}.mdi-radiator-off:before{content:"\f0ad8"}.mdi-radio:before{content:"\f0439"}.mdi-radio-am:before{content:"\f0cbe"}.mdi-radio-fm:before{content:"\f0cbf"}.mdi-radio-handheld:before{content:"\f043a"}.mdi-radio-off:before{content:"\f121c"}.mdi-radio-tower:before{content:"\f043b"}.mdi-radioactive:before{content:"\f043c"}.mdi-radioactive-circle:before{content:"\f185d"}.mdi-radioactive-circle-outline:before{content:"\f185e"}.mdi-radioactive-off:before{content:"\f0ec1"}.mdi-radiobox-blank:before{content:"\f043d"}.mdi-radiobox-indeterminate-variant:before{content:"\f1c5e"}.mdi-radiobox-marked:before{content:"\f043e"}.mdi-radiology-box:before{content:"\f14c5"}.mdi-radiology-box-outline:before{content:"\f14c6"}.mdi-radius:before{content:"\f0cc0"}.mdi-radius-outline:before{content:"\f0cc1"}.mdi-railroad-light:before{content:"\f0f1e"}.mdi-rake:before{content:"\f1544"}.mdi-raspberry-pi:before{content:"\f043f"}.mdi-raw:before{content:"\f1a0f"}.mdi-raw-off:before{content:"\f1a10"}.mdi-ray-end:before{content:"\f0440"}.mdi-ray-end-arrow:before{content:"\f0441"}.mdi-ray-start:before{content:"\f0442"}.mdi-ray-start-arrow:before{content:"\f0443"}.mdi-ray-start-end:before{content:"\f0444"}.mdi-ray-start-vertex-end:before{content:"\f15d8"}.mdi-ray-vertex:before{content:"\f0445"}.mdi-razor-double-edge:before{content:"\f1997"}.mdi-razor-single-edge:before{content:"\f1998"}.mdi-react:before{content:"\f0708"}.mdi-read:before{content:"\f0447"}.mdi-receipt:before{content:"\f0824"}.mdi-receipt-clock:before{content:"\f1c3e"}.mdi-receipt-clock-outline:before{content:"\f1c3f"}.mdi-receipt-outline:before{content:"\f04f7"}.mdi-receipt-send:before{content:"\f1c40"}.mdi-receipt-send-outline:before{content:"\f1c41"}.mdi-receipt-text:before{content:"\f0449"}.mdi-receipt-text-arrow-left:before{content:"\f1c42"}.mdi-receipt-text-arrow-left-outline:before{content:"\f1c43"}.mdi-receipt-text-arrow-right:before{content:"\f1c44"}.mdi-receipt-text-arrow-right-outline:before{content:"\f1c45"}.mdi-receipt-text-check:before{content:"\f1a63"}.mdi-receipt-text-check-outline:before{content:"\f1a64"}.mdi-receipt-text-clock:before{content:"\f1c46"}.mdi-receipt-text-clock-outline:before{content:"\f1c47"}.mdi-receipt-text-edit:before{content:"\f1c48"}.mdi-receipt-text-edit-outline:before{content:"\f1c49"}.mdi-receipt-text-minus:before{content:"\f1a65"}.mdi-receipt-text-minus-outline:before{content:"\f1a66"}.mdi-receipt-text-outline:before{content:"\f19dc"}.mdi-receipt-text-plus:before{content:"\f1a67"}.mdi-receipt-text-plus-outline:before{content:"\f1a68"}.mdi-receipt-text-remove:before{content:"\f1a69"}.mdi-receipt-text-remove-outline:before{content:"\f1a6a"}.mdi-receipt-text-send:before{content:"\f1c4a"}.mdi-receipt-text-send-outline:before{content:"\f1c4b"}.mdi-record:before{content:"\f044a"}.mdi-record-circle:before{content:"\f0ec2"}.mdi-record-circle-outline:before{content:"\f0ec3"}.mdi-record-player:before{content:"\f099a"}.mdi-record-rec:before{content:"\f044b"}.mdi-rectangle:before{content:"\f0e5e"}.mdi-rectangle-outline:before{content:"\f0e5f"}.mdi-recycle:before{content:"\f044c"}.mdi-recycle-variant:before{content:"\f139d"}.mdi-reddit:before{content:"\f044d"}.mdi-redhat:before{content:"\f111b"}.mdi-redo:before{content:"\f044e"}.mdi-redo-variant:before{content:"\f044f"}.mdi-reflect-horizontal:before{content:"\f0a0e"}.mdi-reflect-vertical:before{content:"\f0a0f"}.mdi-refresh:before{content:"\f0450"}.mdi-refresh-auto:before{content:"\f18f2"}.mdi-refresh-circle:before{content:"\f1377"}.mdi-regex:before{content:"\f0451"}.mdi-registered-trademark:before{content:"\f0a67"}.mdi-reiterate:before{content:"\f1588"}.mdi-relation-many-to-many:before{content:"\f1496"}.mdi-relation-many-to-one:before{content:"\f1497"}.mdi-relation-many-to-one-or-many:before{content:"\f1498"}.mdi-relation-many-to-only-one:before{content:"\f1499"}.mdi-relation-many-to-zero-or-many:before{content:"\f149a"}.mdi-relation-many-to-zero-or-one:before{content:"\f149b"}.mdi-relation-one-or-many-to-many:before{content:"\f149c"}.mdi-relation-one-or-many-to-one:before{content:"\f149d"}.mdi-relation-one-or-many-to-one-or-many:before{content:"\f149e"}.mdi-relation-one-or-many-to-only-one:before{content:"\f149f"}.mdi-relation-one-or-many-to-zero-or-many:before{content:"\f14a0"}.mdi-relation-one-or-many-to-zero-or-one:before{content:"\f14a1"}.mdi-relation-one-to-many:before{content:"\f14a2"}.mdi-relation-one-to-one:before{content:"\f14a3"}.mdi-relation-one-to-one-or-many:before{content:"\f14a4"}.mdi-relation-one-to-only-one:before{content:"\f14a5"}.mdi-relation-one-to-zero-or-many:before{content:"\f14a6"}.mdi-relation-one-to-zero-or-one:before{content:"\f14a7"}.mdi-relation-only-one-to-many:before{content:"\f14a8"}.mdi-relation-only-one-to-one:before{content:"\f14a9"}.mdi-relation-only-one-to-one-or-many:before{content:"\f14aa"}.mdi-relation-only-one-to-only-one:before{content:"\f14ab"}.mdi-relation-only-one-to-zero-or-many:before{content:"\f14ac"}.mdi-relation-only-one-to-zero-or-one:before{content:"\f14ad"}.mdi-relation-zero-or-many-to-many:before{content:"\f14ae"}.mdi-relation-zero-or-many-to-one:before{content:"\f14af"}.mdi-relation-zero-or-many-to-one-or-many:before{content:"\f14b0"}.mdi-relation-zero-or-many-to-only-one:before{content:"\f14b1"}.mdi-relation-zero-or-many-to-zero-or-many:before{content:"\f14b2"}.mdi-relation-zero-or-many-to-zero-or-one:before{content:"\f14b3"}.mdi-relation-zero-or-one-to-many:before{content:"\f14b4"}.mdi-relation-zero-or-one-to-one:before{content:"\f14b5"}.mdi-relation-zero-or-one-to-one-or-many:before{content:"\f14b6"}.mdi-relation-zero-or-one-to-only-one:before{content:"\f14b7"}.mdi-relation-zero-or-one-to-zero-or-many:before{content:"\f14b8"}.mdi-relation-zero-or-one-to-zero-or-one:before{content:"\f14b9"}.mdi-relative-scale:before{content:"\f0452"}.mdi-reload:before{content:"\f0453"}.mdi-reload-alert:before{content:"\f110b"}.mdi-reminder:before{content:"\f088c"}.mdi-remote:before{content:"\f0454"}.mdi-remote-desktop:before{content:"\f08b9"}.mdi-remote-off:before{content:"\f0ec4"}.mdi-remote-tv:before{content:"\f0ec5"}.mdi-remote-tv-off:before{content:"\f0ec6"}.mdi-rename:before{content:"\f1c18"}.mdi-rename-box:before{content:"\f0455"}.mdi-rename-box-outline:before{content:"\f1c19"}.mdi-rename-outline:before{content:"\f1c1a"}.mdi-reorder-horizontal:before{content:"\f0688"}.mdi-reorder-vertical:before{content:"\f0689"}.mdi-repeat:before{content:"\f0456"}.mdi-repeat-off:before{content:"\f0457"}.mdi-repeat-once:before{content:"\f0458"}.mdi-repeat-variant:before{content:"\f0547"}.mdi-replay:before{content:"\f0459"}.mdi-reply:before{content:"\f045a"}.mdi-reply-all:before{content:"\f045b"}.mdi-reply-all-outline:before{content:"\f0f1f"}.mdi-reply-circle:before{content:"\f11ae"}.mdi-reply-outline:before{content:"\f0f20"}.mdi-reproduction:before{content:"\f045c"}.mdi-resistor:before{content:"\f0b44"}.mdi-resistor-nodes:before{content:"\f0b45"}.mdi-resize:before{content:"\f0a68"}.mdi-resize-bottom-right:before{content:"\f045d"}.mdi-responsive:before{content:"\f045e"}.mdi-restart:before{content:"\f0709"}.mdi-restart-alert:before{content:"\f110c"}.mdi-restart-off:before{content:"\f0d95"}.mdi-restore:before{content:"\f099b"}.mdi-restore-alert:before{content:"\f110d"}.mdi-rewind:before{content:"\f045f"}.mdi-rewind-10:before{content:"\f0d2a"}.mdi-rewind-15:before{content:"\f1946"}.mdi-rewind-30:before{content:"\f0d96"}.mdi-rewind-45:before{content:"\f1b13"}.mdi-rewind-5:before{content:"\f11f9"}.mdi-rewind-60:before{content:"\f160c"}.mdi-rewind-outline:before{content:"\f070a"}.mdi-rhombus:before{content:"\f070b"}.mdi-rhombus-medium:before{content:"\f0a10"}.mdi-rhombus-medium-outline:before{content:"\f14dc"}.mdi-rhombus-outline:before{content:"\f070c"}.mdi-rhombus-split:before{content:"\f0a11"}.mdi-rhombus-split-outline:before{content:"\f14dd"}.mdi-ribbon:before{content:"\f0460"}.mdi-rice:before{content:"\f07ea"}.mdi-rickshaw:before{content:"\f15bb"}.mdi-rickshaw-electric:before{content:"\f15bc"}.mdi-ring:before{content:"\f07eb"}.mdi-rivet:before{content:"\f0e60"}.mdi-road:before{content:"\f0461"}.mdi-road-variant:before{content:"\f0462"}.mdi-robber:before{content:"\f1058"}.mdi-robot:before{content:"\f06a9"}.mdi-robot-angry:before{content:"\f169d"}.mdi-robot-angry-outline:before{content:"\f169e"}.mdi-robot-confused:before{content:"\f169f"}.mdi-robot-confused-outline:before{content:"\f16a0"}.mdi-robot-dead:before{content:"\f16a1"}.mdi-robot-dead-outline:before{content:"\f16a2"}.mdi-robot-excited:before{content:"\f16a3"}.mdi-robot-excited-outline:before{content:"\f16a4"}.mdi-robot-happy:before{content:"\f1719"}.mdi-robot-happy-outline:before{content:"\f171a"}.mdi-robot-industrial:before{content:"\f0b46"}.mdi-robot-industrial-outline:before{content:"\f1a1a"}.mdi-robot-love:before{content:"\f16a5"}.mdi-robot-love-outline:before{content:"\f16a6"}.mdi-robot-mower:before{content:"\f11f7"}.mdi-robot-mower-outline:before{content:"\f11f3"}.mdi-robot-off:before{content:"\f16a7"}.mdi-robot-off-outline:before{content:"\f167b"}.mdi-robot-outline:before{content:"\f167a"}.mdi-robot-vacuum:before{content:"\f070d"}.mdi-robot-vacuum-alert:before{content:"\f1b5d"}.mdi-robot-vacuum-off:before{content:"\f1c01"}.mdi-robot-vacuum-variant:before{content:"\f0908"}.mdi-robot-vacuum-variant-alert:before{content:"\f1b5e"}.mdi-robot-vacuum-variant-off:before{content:"\f1c02"}.mdi-rocket:before{content:"\f0463"}.mdi-rocket-launch:before{content:"\f14de"}.mdi-rocket-launch-outline:before{content:"\f14df"}.mdi-rocket-outline:before{content:"\f13af"}.mdi-rodent:before{content:"\f1327"}.mdi-roller-shade:before{content:"\f1a6b"}.mdi-roller-shade-closed:before{content:"\f1a6c"}.mdi-roller-skate:before{content:"\f0d2b"}.mdi-roller-skate-off:before{content:"\f0145"}.mdi-rollerblade:before{content:"\f0d2c"}.mdi-rollerblade-off:before{content:"\f002e"}.mdi-rollupjs:before{content:"\f0bc0"}.mdi-rolodex:before{content:"\f1ab9"}.mdi-rolodex-outline:before{content:"\f1aba"}.mdi-roman-numeral-1:before{content:"\f1088"}.mdi-roman-numeral-10:before{content:"\f1091"}.mdi-roman-numeral-2:before{content:"\f1089"}.mdi-roman-numeral-3:before{content:"\f108a"}.mdi-roman-numeral-4:before{content:"\f108b"}.mdi-roman-numeral-5:before{content:"\f108c"}.mdi-roman-numeral-6:before{content:"\f108d"}.mdi-roman-numeral-7:before{content:"\f108e"}.mdi-roman-numeral-8:before{content:"\f108f"}.mdi-roman-numeral-9:before{content:"\f1090"}.mdi-room-service:before{content:"\f088d"}.mdi-room-service-outline:before{content:"\f0d97"}.mdi-rotate-360:before{content:"\f1999"}.mdi-rotate-3d:before{content:"\f0ec7"}.mdi-rotate-3d-variant:before{content:"\f0464"}.mdi-rotate-left:before{content:"\f0465"}.mdi-rotate-left-variant:before{content:"\f0466"}.mdi-rotate-orbit:before{content:"\f0d98"}.mdi-rotate-right:before{content:"\f0467"}.mdi-rotate-right-variant:before{content:"\f0468"}.mdi-rounded-corner:before{content:"\f0607"}.mdi-router:before{content:"\f11e2"}.mdi-router-network:before{content:"\f1087"}.mdi-router-network-wireless:before{content:"\f1c97"}.mdi-router-wireless:before{content:"\f0469"}.mdi-router-wireless-off:before{content:"\f15a3"}.mdi-router-wireless-settings:before{content:"\f0a69"}.mdi-routes:before{content:"\f046a"}.mdi-routes-clock:before{content:"\f1059"}.mdi-rowing:before{content:"\f0608"}.mdi-rss:before{content:"\f046b"}.mdi-rss-box:before{content:"\f046c"}.mdi-rss-off:before{content:"\f0f21"}.mdi-rug:before{content:"\f1475"}.mdi-rugby:before{content:"\f0d99"}.mdi-ruler:before{content:"\f046d"}.mdi-ruler-square:before{content:"\f0cc2"}.mdi-ruler-square-compass:before{content:"\f0ebe"}.mdi-run:before{content:"\f070e"}.mdi-run-fast:before{content:"\f046e"}.mdi-rv-truck:before{content:"\f11d4"}.mdi-sack:before{content:"\f0d2e"}.mdi-sack-outline:before{content:"\f1c4c"}.mdi-sack-percent:before{content:"\f0d2f"}.mdi-safe:before{content:"\f0a6a"}.mdi-safe-square:before{content:"\f127c"}.mdi-safe-square-outline:before{content:"\f127d"}.mdi-safety-goggles:before{content:"\f0d30"}.mdi-sail-boat:before{content:"\f0ec8"}.mdi-sail-boat-sink:before{content:"\f1aef"}.mdi-sale:before{content:"\f046f"}.mdi-sale-outline:before{content:"\f1a06"}.mdi-salesforce:before{content:"\f088e"}.mdi-sass:before{content:"\f07ec"}.mdi-satellite:before{content:"\f0470"}.mdi-satellite-uplink:before{content:"\f0909"}.mdi-satellite-variant:before{content:"\f0471"}.mdi-sausage:before{content:"\f08ba"}.mdi-sausage-off:before{content:"\f1789"}.mdi-saw-blade:before{content:"\f0e61"}.mdi-sawtooth-wave:before{content:"\f147a"}.mdi-saxophone:before{content:"\f0609"}.mdi-scale:before{content:"\f0472"}.mdi-scale-balance:before{content:"\f05d1"}.mdi-scale-bathroom:before{content:"\f0473"}.mdi-scale-off:before{content:"\f105a"}.mdi-scale-unbalanced:before{content:"\f19b8"}.mdi-scan-helper:before{content:"\f13d8"}.mdi-scanner:before{content:"\f06ab"}.mdi-scanner-off:before{content:"\f090a"}.mdi-scatter-plot:before{content:"\f0ec9"}.mdi-scatter-plot-outline:before{content:"\f0eca"}.mdi-scent:before{content:"\f1958"}.mdi-scent-off:before{content:"\f1959"}.mdi-school:before{content:"\f0474"}.mdi-school-outline:before{content:"\f1180"}.mdi-scissors-cutting:before{content:"\f0a6b"}.mdi-scooter:before{content:"\f15bd"}.mdi-scooter-electric:before{content:"\f15be"}.mdi-scoreboard:before{content:"\f127e"}.mdi-scoreboard-outline:before{content:"\f127f"}.mdi-screen-rotation:before{content:"\f0475"}.mdi-screen-rotation-lock:before{content:"\f0478"}.mdi-screw-flat-top:before{content:"\f0df3"}.mdi-screw-lag:before{content:"\f0df4"}.mdi-screw-machine-flat-top:before{content:"\f0df5"}.mdi-screw-machine-round-top:before{content:"\f0df6"}.mdi-screw-round-top:before{content:"\f0df7"}.mdi-screwdriver:before{content:"\f0476"}.mdi-script:before{content:"\f0bc1"}.mdi-script-outline:before{content:"\f0477"}.mdi-script-text:before{content:"\f0bc2"}.mdi-script-text-key:before{content:"\f1725"}.mdi-script-text-key-outline:before{content:"\f1726"}.mdi-script-text-outline:before{content:"\f0bc3"}.mdi-script-text-play:before{content:"\f1727"}.mdi-script-text-play-outline:before{content:"\f1728"}.mdi-sd:before{content:"\f0479"}.mdi-seal:before{content:"\f047a"}.mdi-seal-variant:before{content:"\f0fd9"}.mdi-search-web:before{content:"\f070f"}.mdi-seat:before{content:"\f0cc3"}.mdi-seat-flat:before{content:"\f047b"}.mdi-seat-flat-angled:before{content:"\f047c"}.mdi-seat-individual-suite:before{content:"\f047d"}.mdi-seat-legroom-extra:before{content:"\f047e"}.mdi-seat-legroom-normal:before{content:"\f047f"}.mdi-seat-legroom-reduced:before{content:"\f0480"}.mdi-seat-outline:before{content:"\f0cc4"}.mdi-seat-passenger:before{content:"\f1249"}.mdi-seat-recline-extra:before{content:"\f0481"}.mdi-seat-recline-normal:before{content:"\f0482"}.mdi-seatbelt:before{content:"\f0cc5"}.mdi-security:before{content:"\f0483"}.mdi-security-network:before{content:"\f0484"}.mdi-seed:before{content:"\f0e62"}.mdi-seed-off:before{content:"\f13fd"}.mdi-seed-off-outline:before{content:"\f13fe"}.mdi-seed-outline:before{content:"\f0e63"}.mdi-seed-plus:before{content:"\f1a6d"}.mdi-seed-plus-outline:before{content:"\f1a6e"}.mdi-seesaw:before{content:"\f15a4"}.mdi-segment:before{content:"\f0ecb"}.mdi-select:before{content:"\f0485"}.mdi-select-all:before{content:"\f0486"}.mdi-select-arrow-down:before{content:"\f1b59"}.mdi-select-arrow-up:before{content:"\f1b58"}.mdi-select-color:before{content:"\f0d31"}.mdi-select-compare:before{content:"\f0ad9"}.mdi-select-drag:before{content:"\f0a6c"}.mdi-select-group:before{content:"\f0f82"}.mdi-select-inverse:before{content:"\f0487"}.mdi-select-marker:before{content:"\f1280"}.mdi-select-multiple:before{content:"\f1281"}.mdi-select-multiple-marker:before{content:"\f1282"}.mdi-select-off:before{content:"\f0488"}.mdi-select-place:before{content:"\f0fda"}.mdi-select-remove:before{content:"\f17c1"}.mdi-select-search:before{content:"\f1204"}.mdi-selection:before{content:"\f0489"}.mdi-selection-drag:before{content:"\f0a6d"}.mdi-selection-ellipse:before{content:"\f0d32"}.mdi-selection-ellipse-arrow-inside:before{content:"\f0f22"}.mdi-selection-ellipse-remove:before{content:"\f17c2"}.mdi-selection-marker:before{content:"\f1283"}.mdi-selection-multiple:before{content:"\f1285"}.mdi-selection-multiple-marker:before{content:"\f1284"}.mdi-selection-off:before{content:"\f0777"}.mdi-selection-remove:before{content:"\f17c3"}.mdi-selection-search:before{content:"\f1205"}.mdi-semantic-web:before{content:"\f1316"}.mdi-send:before{content:"\f048a"}.mdi-send-check:before{content:"\f1161"}.mdi-send-check-outline:before{content:"\f1162"}.mdi-send-circle:before{content:"\f0df8"}.mdi-send-circle-outline:before{content:"\f0df9"}.mdi-send-clock:before{content:"\f1163"}.mdi-send-clock-outline:before{content:"\f1164"}.mdi-send-lock:before{content:"\f07ed"}.mdi-send-lock-outline:before{content:"\f1166"}.mdi-send-outline:before{content:"\f1165"}.mdi-send-variant:before{content:"\f1c4d"}.mdi-send-variant-clock:before{content:"\f1c7e"}.mdi-send-variant-clock-outline:before{content:"\f1c7f"}.mdi-send-variant-outline:before{content:"\f1c4e"}.mdi-serial-port:before{content:"\f065c"}.mdi-server:before{content:"\f048b"}.mdi-server-minus:before{content:"\f048c"}.mdi-server-minus-outline:before{content:"\f1c98"}.mdi-server-network:before{content:"\f048d"}.mdi-server-network-off:before{content:"\f048e"}.mdi-server-network-outline:before{content:"\f1c99"}.mdi-server-off:before{content:"\f048f"}.mdi-server-outline:before{content:"\f1c9a"}.mdi-server-plus:before{content:"\f0490"}.mdi-server-plus-outline:before{content:"\f1c9b"}.mdi-server-remove:before{content:"\f0491"}.mdi-server-security:before{content:"\f0492"}.mdi-set-all:before{content:"\f0778"}.mdi-set-center:before{content:"\f0779"}.mdi-set-center-right:before{content:"\f077a"}.mdi-set-left:before{content:"\f077b"}.mdi-set-left-center:before{content:"\f077c"}.mdi-set-left-right:before{content:"\f077d"}.mdi-set-merge:before{content:"\f14e0"}.mdi-set-none:before{content:"\f077e"}.mdi-set-right:before{content:"\f077f"}.mdi-set-split:before{content:"\f14e1"}.mdi-set-square:before{content:"\f145d"}.mdi-set-top-box:before{content:"\f099f"}.mdi-settings-helper:before{content:"\f0a6e"}.mdi-shaker:before{content:"\f110e"}.mdi-shaker-outline:before{content:"\f110f"}.mdi-shape:before{content:"\f0831"}.mdi-shape-circle-plus:before{content:"\f065d"}.mdi-shape-outline:before{content:"\f0832"}.mdi-shape-oval-plus:before{content:"\f11fa"}.mdi-shape-plus:before{content:"\f0495"}.mdi-shape-plus-outline:before{content:"\f1c4f"}.mdi-shape-polygon-plus:before{content:"\f065e"}.mdi-shape-rectangle-plus:before{content:"\f065f"}.mdi-shape-square-plus:before{content:"\f0660"}.mdi-shape-square-rounded-plus:before{content:"\f14fa"}.mdi-share:before{content:"\f0496"}.mdi-share-all:before{content:"\f11f4"}.mdi-share-all-outline:before{content:"\f11f5"}.mdi-share-circle:before{content:"\f11ad"}.mdi-share-off:before{content:"\f0f23"}.mdi-share-off-outline:before{content:"\f0f24"}.mdi-share-outline:before{content:"\f0932"}.mdi-share-variant:before{content:"\f0497"}.mdi-share-variant-outline:before{content:"\f1514"}.mdi-shark:before{content:"\f18ba"}.mdi-shark-fin:before{content:"\f1673"}.mdi-shark-fin-outline:before{content:"\f1674"}.mdi-shark-off:before{content:"\f18bb"}.mdi-sheep:before{content:"\f0cc6"}.mdi-shield:before{content:"\f0498"}.mdi-shield-account:before{content:"\f088f"}.mdi-shield-account-outline:before{content:"\f0a12"}.mdi-shield-account-variant:before{content:"\f15a7"}.mdi-shield-account-variant-outline:before{content:"\f15a8"}.mdi-shield-airplane:before{content:"\f06bb"}.mdi-shield-airplane-outline:before{content:"\f0cc7"}.mdi-shield-alert:before{content:"\f0ecc"}.mdi-shield-alert-outline:before{content:"\f0ecd"}.mdi-shield-bug:before{content:"\f13da"}.mdi-shield-bug-outline:before{content:"\f13db"}.mdi-shield-car:before{content:"\f0f83"}.mdi-shield-check:before{content:"\f0565"}.mdi-shield-check-outline:before{content:"\f0cc8"}.mdi-shield-cross:before{content:"\f0cc9"}.mdi-shield-cross-outline:before{content:"\f0cca"}.mdi-shield-crown:before{content:"\f18bc"}.mdi-shield-crown-outline:before{content:"\f18bd"}.mdi-shield-edit:before{content:"\f11a0"}.mdi-shield-edit-outline:before{content:"\f11a1"}.mdi-shield-half:before{content:"\f1360"}.mdi-shield-half-full:before{content:"\f0780"}.mdi-shield-home:before{content:"\f068a"}.mdi-shield-home-outline:before{content:"\f0ccb"}.mdi-shield-key:before{content:"\f0bc4"}.mdi-shield-key-outline:before{content:"\f0bc5"}.mdi-shield-link-variant:before{content:"\f0d33"}.mdi-shield-link-variant-outline:before{content:"\f0d34"}.mdi-shield-lock:before{content:"\f099d"}.mdi-shield-lock-open:before{content:"\f199a"}.mdi-shield-lock-open-outline:before{content:"\f199b"}.mdi-shield-lock-outline:before{content:"\f0ccc"}.mdi-shield-moon:before{content:"\f1828"}.mdi-shield-moon-outline:before{content:"\f1829"}.mdi-shield-off:before{content:"\f099e"}.mdi-shield-off-outline:before{content:"\f099c"}.mdi-shield-outline:before{content:"\f0499"}.mdi-shield-plus:before{content:"\f0ada"}.mdi-shield-plus-outline:before{content:"\f0adb"}.mdi-shield-refresh:before{content:"\f00aa"}.mdi-shield-refresh-outline:before{content:"\f01e0"}.mdi-shield-remove:before{content:"\f0adc"}.mdi-shield-remove-outline:before{content:"\f0add"}.mdi-shield-search:before{content:"\f0d9a"}.mdi-shield-star:before{content:"\f113b"}.mdi-shield-star-outline:before{content:"\f113c"}.mdi-shield-sun:before{content:"\f105d"}.mdi-shield-sun-outline:before{content:"\f105e"}.mdi-shield-sword:before{content:"\f18be"}.mdi-shield-sword-outline:before{content:"\f18bf"}.mdi-shield-sync:before{content:"\f11a2"}.mdi-shield-sync-outline:before{content:"\f11a3"}.mdi-shimmer:before{content:"\f1545"}.mdi-ship-wheel:before{content:"\f0833"}.mdi-shipping-pallet:before{content:"\f184e"}.mdi-shoe-ballet:before{content:"\f15ca"}.mdi-shoe-cleat:before{content:"\f15c7"}.mdi-shoe-formal:before{content:"\f0b47"}.mdi-shoe-heel:before{content:"\f0b48"}.mdi-shoe-print:before{content:"\f0dfa"}.mdi-shoe-sneaker:before{content:"\f15c8"}.mdi-shopping:before{content:"\f049a"}.mdi-shopping-music:before{content:"\f049b"}.mdi-shopping-outline:before{content:"\f11d5"}.mdi-shopping-search:before{content:"\f0f84"}.mdi-shopping-search-outline:before{content:"\f1a6f"}.mdi-shore:before{content:"\f14f9"}.mdi-shovel:before{content:"\f0710"}.mdi-shovel-off:before{content:"\f0711"}.mdi-shower:before{content:"\f09a0"}.mdi-shower-head:before{content:"\f09a1"}.mdi-shredder:before{content:"\f049c"}.mdi-shuffle:before{content:"\f049d"}.mdi-shuffle-disabled:before{content:"\f049e"}.mdi-shuffle-variant:before{content:"\f049f"}.mdi-shuriken:before{content:"\f137f"}.mdi-sickle:before{content:"\f18c0"}.mdi-sigma:before{content:"\f04a0"}.mdi-sigma-lower:before{content:"\f062b"}.mdi-sign-caution:before{content:"\f04a1"}.mdi-sign-direction:before{content:"\f0781"}.mdi-sign-direction-minus:before{content:"\f1000"}.mdi-sign-direction-plus:before{content:"\f0fdc"}.mdi-sign-direction-remove:before{content:"\f0fdd"}.mdi-sign-language:before{content:"\f1b4d"}.mdi-sign-language-outline:before{content:"\f1b4e"}.mdi-sign-pole:before{content:"\f14f8"}.mdi-sign-real-estate:before{content:"\f1118"}.mdi-sign-text:before{content:"\f0782"}.mdi-sign-yield:before{content:"\f1baf"}.mdi-signal:before{content:"\f04a2"}.mdi-signal-2g:before{content:"\f0712"}.mdi-signal-3g:before{content:"\f0713"}.mdi-signal-4g:before{content:"\f0714"}.mdi-signal-5g:before{content:"\f0a6f"}.mdi-signal-cellular-1:before{content:"\f08bc"}.mdi-signal-cellular-2:before{content:"\f08bd"}.mdi-signal-cellular-3:before{content:"\f08be"}.mdi-signal-cellular-outline:before{content:"\f08bf"}.mdi-signal-distance-variant:before{content:"\f0e64"}.mdi-signal-hspa:before{content:"\f0715"}.mdi-signal-hspa-plus:before{content:"\f0716"}.mdi-signal-off:before{content:"\f0783"}.mdi-signal-variant:before{content:"\f060a"}.mdi-signature:before{content:"\f0dfb"}.mdi-signature-freehand:before{content:"\f0dfc"}.mdi-signature-image:before{content:"\f0dfd"}.mdi-signature-text:before{content:"\f0dfe"}.mdi-silo:before{content:"\f1b9f"}.mdi-silo-outline:before{content:"\f0b49"}.mdi-silverware:before{content:"\f04a3"}.mdi-silverware-clean:before{content:"\f0fde"}.mdi-silverware-fork:before{content:"\f04a4"}.mdi-silverware-fork-knife:before{content:"\f0a70"}.mdi-silverware-spoon:before{content:"\f04a5"}.mdi-silverware-variant:before{content:"\f04a6"}.mdi-sim:before{content:"\f04a7"}.mdi-sim-alert:before{content:"\f04a8"}.mdi-sim-alert-outline:before{content:"\f15d3"}.mdi-sim-off:before{content:"\f04a9"}.mdi-sim-off-outline:before{content:"\f15d4"}.mdi-sim-outline:before{content:"\f15d5"}.mdi-simple-icons:before{content:"\f131d"}.mdi-sina-weibo:before{content:"\f0adf"}.mdi-sine-wave:before{content:"\f095b"}.mdi-sitemap:before{content:"\f04aa"}.mdi-sitemap-outline:before{content:"\f199c"}.mdi-size-l:before{content:"\f13a6"}.mdi-size-m:before{content:"\f13a5"}.mdi-size-s:before{content:"\f13a4"}.mdi-size-xl:before{content:"\f13a7"}.mdi-size-xs:before{content:"\f13a3"}.mdi-size-xxl:before{content:"\f13a8"}.mdi-size-xxs:before{content:"\f13a2"}.mdi-size-xxxl:before{content:"\f13a9"}.mdi-skate:before{content:"\f0d35"}.mdi-skate-off:before{content:"\f0699"}.mdi-skateboard:before{content:"\f14c2"}.mdi-skateboarding:before{content:"\f0501"}.mdi-skew-less:before{content:"\f0d36"}.mdi-skew-more:before{content:"\f0d37"}.mdi-ski:before{content:"\f1304"}.mdi-ski-cross-country:before{content:"\f1305"}.mdi-ski-water:before{content:"\f1306"}.mdi-skip-backward:before{content:"\f04ab"}.mdi-skip-backward-outline:before{content:"\f0f25"}.mdi-skip-forward:before{content:"\f04ac"}.mdi-skip-forward-outline:before{content:"\f0f26"}.mdi-skip-next:before{content:"\f04ad"}.mdi-skip-next-circle:before{content:"\f0661"}.mdi-skip-next-circle-outline:before{content:"\f0662"}.mdi-skip-next-outline:before{content:"\f0f27"}.mdi-skip-previous:before{content:"\f04ae"}.mdi-skip-previous-circle:before{content:"\f0663"}.mdi-skip-previous-circle-outline:before{content:"\f0664"}.mdi-skip-previous-outline:before{content:"\f0f28"}.mdi-skull:before{content:"\f068c"}.mdi-skull-crossbones:before{content:"\f0bc6"}.mdi-skull-crossbones-outline:before{content:"\f0bc7"}.mdi-skull-outline:before{content:"\f0bc8"}.mdi-skull-scan:before{content:"\f14c7"}.mdi-skull-scan-outline:before{content:"\f14c8"}.mdi-skype:before{content:"\f04af"}.mdi-skype-business:before{content:"\f04b0"}.mdi-slack:before{content:"\f04b1"}.mdi-slash-forward:before{content:"\f0fdf"}.mdi-slash-forward-box:before{content:"\f0fe0"}.mdi-sledding:before{content:"\f041b"}.mdi-sleep:before{content:"\f04b2"}.mdi-sleep-off:before{content:"\f04b3"}.mdi-slide:before{content:"\f15a5"}.mdi-slope-downhill:before{content:"\f0dff"}.mdi-slope-uphill:before{content:"\f0e00"}.mdi-slot-machine:before{content:"\f1114"}.mdi-slot-machine-outline:before{content:"\f1115"}.mdi-smart-card:before{content:"\f10bd"}.mdi-smart-card-off:before{content:"\f18f7"}.mdi-smart-card-off-outline:before{content:"\f18f8"}.mdi-smart-card-outline:before{content:"\f10be"}.mdi-smart-card-reader:before{content:"\f10bf"}.mdi-smart-card-reader-outline:before{content:"\f10c0"}.mdi-smog:before{content:"\f0a71"}.mdi-smoke:before{content:"\f1799"}.mdi-smoke-detector:before{content:"\f0392"}.mdi-smoke-detector-alert:before{content:"\f192e"}.mdi-smoke-detector-alert-outline:before{content:"\f192f"}.mdi-smoke-detector-off:before{content:"\f1809"}.mdi-smoke-detector-off-outline:before{content:"\f180a"}.mdi-smoke-detector-outline:before{content:"\f1808"}.mdi-smoke-detector-variant:before{content:"\f180b"}.mdi-smoke-detector-variant-alert:before{content:"\f1930"}.mdi-smoke-detector-variant-off:before{content:"\f180c"}.mdi-smoking:before{content:"\f04b4"}.mdi-smoking-off:before{content:"\f04b5"}.mdi-smoking-pipe:before{content:"\f140d"}.mdi-smoking-pipe-off:before{content:"\f1428"}.mdi-snail:before{content:"\f1677"}.mdi-snake:before{content:"\f150e"}.mdi-snapchat:before{content:"\f04b6"}.mdi-snowboard:before{content:"\f1307"}.mdi-snowflake:before{content:"\f0717"}.mdi-snowflake-alert:before{content:"\f0f29"}.mdi-snowflake-check:before{content:"\f1a70"}.mdi-snowflake-melt:before{content:"\f12cb"}.mdi-snowflake-off:before{content:"\f14e3"}.mdi-snowflake-thermometer:before{content:"\f1a71"}.mdi-snowflake-variant:before{content:"\f0f2a"}.mdi-snowman:before{content:"\f04b7"}.mdi-snowmobile:before{content:"\f06dd"}.mdi-snowshoeing:before{content:"\f1a72"}.mdi-soccer:before{content:"\f04b8"}.mdi-soccer-field:before{content:"\f0834"}.mdi-social-distance-2-meters:before{content:"\f1579"}.mdi-social-distance-6-feet:before{content:"\f157a"}.mdi-sofa:before{content:"\f04b9"}.mdi-sofa-outline:before{content:"\f156d"}.mdi-sofa-single:before{content:"\f156e"}.mdi-sofa-single-outline:before{content:"\f156f"}.mdi-solar-panel:before{content:"\f0d9b"}.mdi-solar-panel-large:before{content:"\f0d9c"}.mdi-solar-power:before{content:"\f0a72"}.mdi-solar-power-variant:before{content:"\f1a73"}.mdi-solar-power-variant-outline:before{content:"\f1a74"}.mdi-soldering-iron:before{content:"\f1092"}.mdi-solid:before{content:"\f068d"}.mdi-sony-playstation:before{content:"\f0414"}.mdi-sort:before{content:"\f04ba"}.mdi-sort-alphabetical-ascending:before{content:"\f05bd"}.mdi-sort-alphabetical-ascending-variant:before{content:"\f1148"}.mdi-sort-alphabetical-descending:before{content:"\f05bf"}.mdi-sort-alphabetical-descending-variant:before{content:"\f1149"}.mdi-sort-alphabetical-variant:before{content:"\f04bb"}.mdi-sort-ascending:before{content:"\f04bc"}.mdi-sort-bool-ascending:before{content:"\f1385"}.mdi-sort-bool-ascending-variant:before{content:"\f1386"}.mdi-sort-bool-descending:before{content:"\f1387"}.mdi-sort-bool-descending-variant:before{content:"\f1388"}.mdi-sort-calendar-ascending:before{content:"\f1547"}.mdi-sort-calendar-descending:before{content:"\f1548"}.mdi-sort-clock-ascending:before{content:"\f1549"}.mdi-sort-clock-ascending-outline:before{content:"\f154a"}.mdi-sort-clock-descending:before{content:"\f154b"}.mdi-sort-clock-descending-outline:before{content:"\f154c"}.mdi-sort-descending:before{content:"\f04bd"}.mdi-sort-numeric-ascending:before{content:"\f1389"}.mdi-sort-numeric-ascending-variant:before{content:"\f090d"}.mdi-sort-numeric-descending:before{content:"\f138a"}.mdi-sort-numeric-descending-variant:before{content:"\f0ad2"}.mdi-sort-numeric-variant:before{content:"\f04be"}.mdi-sort-reverse-variant:before{content:"\f033c"}.mdi-sort-variant:before{content:"\f04bf"}.mdi-sort-variant-lock:before{content:"\f0ccd"}.mdi-sort-variant-lock-open:before{content:"\f0cce"}.mdi-sort-variant-off:before{content:"\f1abb"}.mdi-sort-variant-remove:before{content:"\f1147"}.mdi-soundbar:before{content:"\f17db"}.mdi-soundcloud:before{content:"\f04c0"}.mdi-source-branch:before{content:"\f062c"}.mdi-source-branch-check:before{content:"\f14cf"}.mdi-source-branch-minus:before{content:"\f14cb"}.mdi-source-branch-plus:before{content:"\f14ca"}.mdi-source-branch-refresh:before{content:"\f14cd"}.mdi-source-branch-remove:before{content:"\f14cc"}.mdi-source-branch-sync:before{content:"\f14ce"}.mdi-source-commit:before{content:"\f0718"}.mdi-source-commit-end:before{content:"\f0719"}.mdi-source-commit-end-local:before{content:"\f071a"}.mdi-source-commit-local:before{content:"\f071b"}.mdi-source-commit-next-local:before{content:"\f071c"}.mdi-source-commit-start:before{content:"\f071d"}.mdi-source-commit-start-next-local:before{content:"\f071e"}.mdi-source-fork:before{content:"\f04c1"}.mdi-source-merge:before{content:"\f062d"}.mdi-source-pull:before{content:"\f04c2"}.mdi-source-repository:before{content:"\f0ccf"}.mdi-source-repository-multiple:before{content:"\f0cd0"}.mdi-soy-sauce:before{content:"\f07ee"}.mdi-soy-sauce-off:before{content:"\f13fc"}.mdi-spa:before{content:"\f0cd1"}.mdi-spa-outline:before{content:"\f0cd2"}.mdi-space-invaders:before{content:"\f0bc9"}.mdi-space-station:before{content:"\f1383"}.mdi-spade:before{content:"\f0e65"}.mdi-speaker:before{content:"\f04c3"}.mdi-speaker-bluetooth:before{content:"\f09a2"}.mdi-speaker-message:before{content:"\f1b11"}.mdi-speaker-multiple:before{content:"\f0d38"}.mdi-speaker-off:before{content:"\f04c4"}.mdi-speaker-pause:before{content:"\f1b73"}.mdi-speaker-play:before{content:"\f1b72"}.mdi-speaker-stop:before{content:"\f1b74"}.mdi-speaker-wireless:before{content:"\f071f"}.mdi-spear:before{content:"\f1845"}.mdi-speedometer:before{content:"\f04c5"}.mdi-speedometer-medium:before{content:"\f0f85"}.mdi-speedometer-slow:before{content:"\f0f86"}.mdi-spellcheck:before{content:"\f04c6"}.mdi-sphere:before{content:"\f1954"}.mdi-sphere-off:before{content:"\f1955"}.mdi-spider:before{content:"\f11ea"}.mdi-spider-outline:before{content:"\f1c75"}.mdi-spider-thread:before{content:"\f11eb"}.mdi-spider-web:before{content:"\f0bca"}.mdi-spirit-level:before{content:"\f14f1"}.mdi-spoon-sugar:before{content:"\f1429"}.mdi-spotify:before{content:"\f04c7"}.mdi-spotlight:before{content:"\f04c8"}.mdi-spotlight-beam:before{content:"\f04c9"}.mdi-spray:before{content:"\f0665"}.mdi-spray-bottle:before{content:"\f0ae0"}.mdi-sprinkler:before{content:"\f105f"}.mdi-sprinkler-fire:before{content:"\f199d"}.mdi-sprinkler-variant:before{content:"\f1060"}.mdi-sprout:before{content:"\f0e66"}.mdi-sprout-outline:before{content:"\f0e67"}.mdi-square:before{content:"\f0764"}.mdi-square-circle:before{content:"\f1500"}.mdi-square-circle-outline:before{content:"\f1c50"}.mdi-square-edit-outline:before{content:"\f090c"}.mdi-square-medium:before{content:"\f0a13"}.mdi-square-medium-outline:before{content:"\f0a14"}.mdi-square-off:before{content:"\f12ee"}.mdi-square-off-outline:before{content:"\f12ef"}.mdi-square-opacity:before{content:"\f1854"}.mdi-square-outline:before{content:"\f0763"}.mdi-square-root:before{content:"\f0784"}.mdi-square-root-box:before{content:"\f09a3"}.mdi-square-rounded:before{content:"\f14fb"}.mdi-square-rounded-badge:before{content:"\f1a07"}.mdi-square-rounded-badge-outline:before{content:"\f1a08"}.mdi-square-rounded-outline:before{content:"\f14fc"}.mdi-square-small:before{content:"\f0a15"}.mdi-square-wave:before{content:"\f147b"}.mdi-squeegee:before{content:"\f0ae1"}.mdi-ssh:before{content:"\f08c0"}.mdi-stack-exchange:before{content:"\f060b"}.mdi-stack-overflow:before{content:"\f04cc"}.mdi-stackpath:before{content:"\f0359"}.mdi-stadium:before{content:"\f0ff9"}.mdi-stadium-outline:before{content:"\f1b03"}.mdi-stadium-variant:before{content:"\f0720"}.mdi-stairs:before{content:"\f04cd"}.mdi-stairs-box:before{content:"\f139e"}.mdi-stairs-down:before{content:"\f12be"}.mdi-stairs-up:before{content:"\f12bd"}.mdi-stamper:before{content:"\f0d39"}.mdi-standard-definition:before{content:"\f07ef"}.mdi-star:before{content:"\f04ce"}.mdi-star-box:before{content:"\f0a73"}.mdi-star-box-multiple:before{content:"\f1286"}.mdi-star-box-multiple-outline:before{content:"\f1287"}.mdi-star-box-outline:before{content:"\f0a74"}.mdi-star-check:before{content:"\f1566"}.mdi-star-check-outline:before{content:"\f156a"}.mdi-star-circle:before{content:"\f04cf"}.mdi-star-circle-outline:before{content:"\f09a4"}.mdi-star-cog:before{content:"\f1668"}.mdi-star-cog-outline:before{content:"\f1669"}.mdi-star-crescent:before{content:"\f0979"}.mdi-star-david:before{content:"\f097a"}.mdi-star-face:before{content:"\f09a5"}.mdi-star-four-points:before{content:"\f0ae2"}.mdi-star-four-points-box:before{content:"\f1c51"}.mdi-star-four-points-box-outline:before{content:"\f1c52"}.mdi-star-four-points-circle:before{content:"\f1c53"}.mdi-star-four-points-circle-outline:before{content:"\f1c54"}.mdi-star-four-points-outline:before{content:"\f0ae3"}.mdi-star-four-points-small:before{content:"\f1c55"}.mdi-star-half:before{content:"\f0246"}.mdi-star-half-full:before{content:"\f04d0"}.mdi-star-minus:before{content:"\f1564"}.mdi-star-minus-outline:before{content:"\f1568"}.mdi-star-off:before{content:"\f04d1"}.mdi-star-off-outline:before{content:"\f155b"}.mdi-star-outline:before{content:"\f04d2"}.mdi-star-plus:before{content:"\f1563"}.mdi-star-plus-outline:before{content:"\f1567"}.mdi-star-remove:before{content:"\f1565"}.mdi-star-remove-outline:before{content:"\f1569"}.mdi-star-settings:before{content:"\f166a"}.mdi-star-settings-outline:before{content:"\f166b"}.mdi-star-shooting:before{content:"\f1741"}.mdi-star-shooting-outline:before{content:"\f1742"}.mdi-star-three-points:before{content:"\f0ae4"}.mdi-star-three-points-outline:before{content:"\f0ae5"}.mdi-state-machine:before{content:"\f11ef"}.mdi-steam:before{content:"\f04d3"}.mdi-steering:before{content:"\f04d4"}.mdi-steering-off:before{content:"\f090e"}.mdi-step-backward:before{content:"\f04d5"}.mdi-step-backward-2:before{content:"\f04d6"}.mdi-step-forward:before{content:"\f04d7"}.mdi-step-forward-2:before{content:"\f04d8"}.mdi-stethoscope:before{content:"\f04d9"}.mdi-sticker:before{content:"\f1364"}.mdi-sticker-alert:before{content:"\f1365"}.mdi-sticker-alert-outline:before{content:"\f1366"}.mdi-sticker-check:before{content:"\f1367"}.mdi-sticker-check-outline:before{content:"\f1368"}.mdi-sticker-circle-outline:before{content:"\f05d0"}.mdi-sticker-emoji:before{content:"\f0785"}.mdi-sticker-minus:before{content:"\f1369"}.mdi-sticker-minus-outline:before{content:"\f136a"}.mdi-sticker-outline:before{content:"\f136b"}.mdi-sticker-plus:before{content:"\f136c"}.mdi-sticker-plus-outline:before{content:"\f136d"}.mdi-sticker-remove:before{content:"\f136e"}.mdi-sticker-remove-outline:before{content:"\f136f"}.mdi-sticker-text:before{content:"\f178e"}.mdi-sticker-text-outline:before{content:"\f178f"}.mdi-stocking:before{content:"\f04da"}.mdi-stomach:before{content:"\f1093"}.mdi-stool:before{content:"\f195d"}.mdi-stool-outline:before{content:"\f195e"}.mdi-stop:before{content:"\f04db"}.mdi-stop-circle:before{content:"\f0666"}.mdi-stop-circle-outline:before{content:"\f0667"}.mdi-storage-tank:before{content:"\f1a75"}.mdi-storage-tank-outline:before{content:"\f1a76"}.mdi-store:before{content:"\f04dc"}.mdi-store-24-hour:before{content:"\f04dd"}.mdi-store-alert:before{content:"\f18c1"}.mdi-store-alert-outline:before{content:"\f18c2"}.mdi-store-check:before{content:"\f18c3"}.mdi-store-check-outline:before{content:"\f18c4"}.mdi-store-clock:before{content:"\f18c5"}.mdi-store-clock-outline:before{content:"\f18c6"}.mdi-store-cog:before{content:"\f18c7"}.mdi-store-cog-outline:before{content:"\f18c8"}.mdi-store-edit:before{content:"\f18c9"}.mdi-store-edit-outline:before{content:"\f18ca"}.mdi-store-marker:before{content:"\f18cb"}.mdi-store-marker-outline:before{content:"\f18cc"}.mdi-store-minus:before{content:"\f165e"}.mdi-store-minus-outline:before{content:"\f18cd"}.mdi-store-off:before{content:"\f18ce"}.mdi-store-off-outline:before{content:"\f18cf"}.mdi-store-outline:before{content:"\f1361"}.mdi-store-plus:before{content:"\f165f"}.mdi-store-plus-outline:before{content:"\f18d0"}.mdi-store-remove:before{content:"\f1660"}.mdi-store-remove-outline:before{content:"\f18d1"}.mdi-store-search:before{content:"\f18d2"}.mdi-store-search-outline:before{content:"\f18d3"}.mdi-store-settings:before{content:"\f18d4"}.mdi-store-settings-outline:before{content:"\f18d5"}.mdi-storefront:before{content:"\f07c7"}.mdi-storefront-check:before{content:"\f1b7d"}.mdi-storefront-check-outline:before{content:"\f1b7e"}.mdi-storefront-edit:before{content:"\f1b7f"}.mdi-storefront-edit-outline:before{content:"\f1b80"}.mdi-storefront-minus:before{content:"\f1b83"}.mdi-storefront-minus-outline:before{content:"\f1b84"}.mdi-storefront-outline:before{content:"\f10c1"}.mdi-storefront-plus:before{content:"\f1b81"}.mdi-storefront-plus-outline:before{content:"\f1b82"}.mdi-storefront-remove:before{content:"\f1b85"}.mdi-storefront-remove-outline:before{content:"\f1b86"}.mdi-stove:before{content:"\f04de"}.mdi-strategy:before{content:"\f11d6"}.mdi-stretch-to-page:before{content:"\f0f2b"}.mdi-stretch-to-page-outline:before{content:"\f0f2c"}.mdi-string-lights:before{content:"\f12ba"}.mdi-string-lights-off:before{content:"\f12bb"}.mdi-subdirectory-arrow-left:before{content:"\f060c"}.mdi-subdirectory-arrow-right:before{content:"\f060d"}.mdi-submarine:before{content:"\f156c"}.mdi-subtitles:before{content:"\f0a16"}.mdi-subtitles-outline:before{content:"\f0a17"}.mdi-subway:before{content:"\f06ac"}.mdi-subway-alert-variant:before{content:"\f0d9d"}.mdi-subway-variant:before{content:"\f04df"}.mdi-summit:before{content:"\f0786"}.mdi-sun-angle:before{content:"\f1b27"}.mdi-sun-angle-outline:before{content:"\f1b28"}.mdi-sun-clock:before{content:"\f1a77"}.mdi-sun-clock-outline:before{content:"\f1a78"}.mdi-sun-compass:before{content:"\f19a5"}.mdi-sun-snowflake:before{content:"\f1796"}.mdi-sun-snowflake-variant:before{content:"\f1a79"}.mdi-sun-thermometer:before{content:"\f18d6"}.mdi-sun-thermometer-outline:before{content:"\f18d7"}.mdi-sun-wireless:before{content:"\f17fe"}.mdi-sun-wireless-outline:before{content:"\f17ff"}.mdi-sunglasses:before{content:"\f04e0"}.mdi-surfing:before{content:"\f1746"}.mdi-surround-sound:before{content:"\f05c5"}.mdi-surround-sound-2-0:before{content:"\f07f0"}.mdi-surround-sound-2-1:before{content:"\f1729"}.mdi-surround-sound-3-1:before{content:"\f07f1"}.mdi-surround-sound-5-1:before{content:"\f07f2"}.mdi-surround-sound-5-1-2:before{content:"\f172a"}.mdi-surround-sound-7-1:before{content:"\f07f3"}.mdi-svg:before{content:"\f0721"}.mdi-swap-horizontal:before{content:"\f04e1"}.mdi-swap-horizontal-bold:before{content:"\f0bcd"}.mdi-swap-horizontal-circle:before{content:"\f0fe1"}.mdi-swap-horizontal-circle-outline:before{content:"\f0fe2"}.mdi-swap-horizontal-hidden:before{content:"\f1d0e"}.mdi-swap-horizontal-variant:before{content:"\f08c1"}.mdi-swap-vertical:before{content:"\f04e2"}.mdi-swap-vertical-bold:before{content:"\f0bce"}.mdi-swap-vertical-circle:before{content:"\f0fe3"}.mdi-swap-vertical-circle-outline:before{content:"\f0fe4"}.mdi-swap-vertical-variant:before{content:"\f08c2"}.mdi-swim:before{content:"\f04e3"}.mdi-switch:before{content:"\f04e4"}.mdi-sword:before{content:"\f04e5"}.mdi-sword-cross:before{content:"\f0787"}.mdi-syllabary-hangul:before{content:"\f1333"}.mdi-syllabary-hiragana:before{content:"\f1334"}.mdi-syllabary-katakana:before{content:"\f1335"}.mdi-syllabary-katakana-halfwidth:before{content:"\f1336"}.mdi-symbol:before{content:"\f1501"}.mdi-symfony:before{content:"\f0ae6"}.mdi-synagogue:before{content:"\f1b04"}.mdi-synagogue-outline:before{content:"\f1b05"}.mdi-sync:before{content:"\f04e6"}.mdi-sync-alert:before{content:"\f04e7"}.mdi-sync-circle:before{content:"\f1378"}.mdi-sync-off:before{content:"\f04e8"}.mdi-tab:before{content:"\f04e9"}.mdi-tab-minus:before{content:"\f0b4b"}.mdi-tab-plus:before{content:"\f075c"}.mdi-tab-remove:before{content:"\f0b4c"}.mdi-tab-search:before{content:"\f199e"}.mdi-tab-unselected:before{content:"\f04ea"}.mdi-table:before{content:"\f04eb"}.mdi-table-account:before{content:"\f13b9"}.mdi-table-alert:before{content:"\f13ba"}.mdi-table-arrow-down:before{content:"\f13bb"}.mdi-table-arrow-left:before{content:"\f13bc"}.mdi-table-arrow-right:before{content:"\f13bd"}.mdi-table-arrow-up:before{content:"\f13be"}.mdi-table-border:before{content:"\f0a18"}.mdi-table-cancel:before{content:"\f13bf"}.mdi-table-chair:before{content:"\f1061"}.mdi-table-check:before{content:"\f13c0"}.mdi-table-clock:before{content:"\f13c1"}.mdi-table-cog:before{content:"\f13c2"}.mdi-table-column:before{content:"\f0835"}.mdi-table-column-plus-after:before{content:"\f04ec"}.mdi-table-column-plus-before:before{content:"\f04ed"}.mdi-table-column-remove:before{content:"\f04ee"}.mdi-table-column-width:before{content:"\f04ef"}.mdi-table-edit:before{content:"\f04f0"}.mdi-table-eye:before{content:"\f1094"}.mdi-table-eye-off:before{content:"\f13c3"}.mdi-table-filter:before{content:"\f1b8c"}.mdi-table-furniture:before{content:"\f05bc"}.mdi-table-headers-eye:before{content:"\f121d"}.mdi-table-headers-eye-off:before{content:"\f121e"}.mdi-table-heart:before{content:"\f13c4"}.mdi-table-key:before{content:"\f13c5"}.mdi-table-large:before{content:"\f04f1"}.mdi-table-large-plus:before{content:"\f0f87"}.mdi-table-large-remove:before{content:"\f0f88"}.mdi-table-lock:before{content:"\f13c6"}.mdi-table-merge-cells:before{content:"\f09a6"}.mdi-table-minus:before{content:"\f13c7"}.mdi-table-multiple:before{content:"\f13c8"}.mdi-table-network:before{content:"\f13c9"}.mdi-table-of-contents:before{content:"\f0836"}.mdi-table-off:before{content:"\f13ca"}.mdi-table-picnic:before{content:"\f1743"}.mdi-table-pivot:before{content:"\f183c"}.mdi-table-plus:before{content:"\f0a75"}.mdi-table-question:before{content:"\f1b21"}.mdi-table-refresh:before{content:"\f13a0"}.mdi-table-remove:before{content:"\f0a76"}.mdi-table-row:before{content:"\f0837"}.mdi-table-row-height:before{content:"\f04f2"}.mdi-table-row-plus-after:before{content:"\f04f3"}.mdi-table-row-plus-before:before{content:"\f04f4"}.mdi-table-row-remove:before{content:"\f04f5"}.mdi-table-search:before{content:"\f090f"}.mdi-table-settings:before{content:"\f0838"}.mdi-table-split-cell:before{content:"\f142a"}.mdi-table-star:before{content:"\f13cb"}.mdi-table-sync:before{content:"\f13a1"}.mdi-table-tennis:before{content:"\f0e68"}.mdi-tablet:before{content:"\f04f6"}.mdi-tablet-cellphone:before{content:"\f09a7"}.mdi-tablet-dashboard:before{content:"\f0ece"}.mdi-taco:before{content:"\f0762"}.mdi-tag:before{content:"\f04f9"}.mdi-tag-arrow-down:before{content:"\f172b"}.mdi-tag-arrow-down-outline:before{content:"\f172c"}.mdi-tag-arrow-left:before{content:"\f172d"}.mdi-tag-arrow-left-outline:before{content:"\f172e"}.mdi-tag-arrow-right:before{content:"\f172f"}.mdi-tag-arrow-right-outline:before{content:"\f1730"}.mdi-tag-arrow-up:before{content:"\f1731"}.mdi-tag-arrow-up-outline:before{content:"\f1732"}.mdi-tag-check:before{content:"\f1a7a"}.mdi-tag-check-outline:before{content:"\f1a7b"}.mdi-tag-edit:before{content:"\f1c9c"}.mdi-tag-edit-outline:before{content:"\f1c9d"}.mdi-tag-faces:before{content:"\f04fa"}.mdi-tag-heart:before{content:"\f068b"}.mdi-tag-heart-outline:before{content:"\f0bcf"}.mdi-tag-hidden:before{content:"\f1c76"}.mdi-tag-minus:before{content:"\f0910"}.mdi-tag-minus-outline:before{content:"\f121f"}.mdi-tag-multiple:before{content:"\f04fb"}.mdi-tag-multiple-outline:before{content:"\f12f7"}.mdi-tag-off:before{content:"\f1220"}.mdi-tag-off-outline:before{content:"\f1221"}.mdi-tag-outline:before{content:"\f04fc"}.mdi-tag-plus:before{content:"\f0722"}.mdi-tag-plus-outline:before{content:"\f1222"}.mdi-tag-remove:before{content:"\f0723"}.mdi-tag-remove-outline:before{content:"\f1223"}.mdi-tag-search:before{content:"\f1907"}.mdi-tag-search-outline:before{content:"\f1908"}.mdi-tag-text:before{content:"\f1224"}.mdi-tag-text-outline:before{content:"\f04fd"}.mdi-tailwind:before{content:"\f13ff"}.mdi-tally-mark-1:before{content:"\f1abc"}.mdi-tally-mark-2:before{content:"\f1abd"}.mdi-tally-mark-3:before{content:"\f1abe"}.mdi-tally-mark-4:before{content:"\f1abf"}.mdi-tally-mark-5:before{content:"\f1ac0"}.mdi-tangram:before{content:"\f04f8"}.mdi-tank:before{content:"\f0d3a"}.mdi-tanker-truck:before{content:"\f0fe5"}.mdi-tape-drive:before{content:"\f16df"}.mdi-tape-measure:before{content:"\f0b4d"}.mdi-target:before{content:"\f04fe"}.mdi-target-account:before{content:"\f0bd0"}.mdi-target-variant:before{content:"\f0a77"}.mdi-taxi:before{content:"\f04ff"}.mdi-tea:before{content:"\f0d9e"}.mdi-tea-outline:before{content:"\f0d9f"}.mdi-teamviewer:before{content:"\f0500"}.mdi-teddy-bear:before{content:"\f18fb"}.mdi-telescope:before{content:"\f0b4e"}.mdi-television:before{content:"\f0502"}.mdi-television-ambient-light:before{content:"\f1356"}.mdi-television-box:before{content:"\f0839"}.mdi-television-classic:before{content:"\f07f4"}.mdi-television-classic-off:before{content:"\f083a"}.mdi-television-guide:before{content:"\f0503"}.mdi-television-off:before{content:"\f083b"}.mdi-television-pause:before{content:"\f0f89"}.mdi-television-play:before{content:"\f0ecf"}.mdi-television-shimmer:before{content:"\f1110"}.mdi-television-speaker:before{content:"\f1b1b"}.mdi-television-speaker-off:before{content:"\f1b1c"}.mdi-television-stop:before{content:"\f0f8a"}.mdi-temperature-celsius:before{content:"\f0504"}.mdi-temperature-fahrenheit:before{content:"\f0505"}.mdi-temperature-kelvin:before{content:"\f0506"}.mdi-temple-buddhist:before{content:"\f1b06"}.mdi-temple-buddhist-outline:before{content:"\f1b07"}.mdi-temple-hindu:before{content:"\f1b08"}.mdi-temple-hindu-outline:before{content:"\f1b09"}.mdi-tennis:before{content:"\f0da0"}.mdi-tennis-ball:before{content:"\f0507"}.mdi-tennis-ball-outline:before{content:"\f1c5f"}.mdi-tent:before{content:"\f0508"}.mdi-terraform:before{content:"\f1062"}.mdi-terrain:before{content:"\f0509"}.mdi-test-tube:before{content:"\f0668"}.mdi-test-tube-empty:before{content:"\f0911"}.mdi-test-tube-off:before{content:"\f0912"}.mdi-text:before{content:"\f09a8"}.mdi-text-account:before{content:"\f1570"}.mdi-text-box:before{content:"\f021a"}.mdi-text-box-check:before{content:"\f0ea6"}.mdi-text-box-check-outline:before{content:"\f0ea7"}.mdi-text-box-edit:before{content:"\f1a7c"}.mdi-text-box-edit-outline:before{content:"\f1a7d"}.mdi-text-box-minus:before{content:"\f0ea8"}.mdi-text-box-minus-outline:before{content:"\f0ea9"}.mdi-text-box-multiple:before{content:"\f0ab7"}.mdi-text-box-multiple-outline:before{content:"\f0ab8"}.mdi-text-box-outline:before{content:"\f09ed"}.mdi-text-box-plus:before{content:"\f0eaa"}.mdi-text-box-plus-outline:before{content:"\f0eab"}.mdi-text-box-remove:before{content:"\f0eac"}.mdi-text-box-remove-outline:before{content:"\f0ead"}.mdi-text-box-search:before{content:"\f0eae"}.mdi-text-box-search-outline:before{content:"\f0eaf"}.mdi-text-long:before{content:"\f09aa"}.mdi-text-recognition:before{content:"\f113d"}.mdi-text-search:before{content:"\f13b8"}.mdi-text-search-variant:before{content:"\f1a7e"}.mdi-text-shadow:before{content:"\f0669"}.mdi-text-short:before{content:"\f09a9"}.mdi-texture:before{content:"\f050c"}.mdi-texture-box:before{content:"\f0fe6"}.mdi-theater:before{content:"\f050d"}.mdi-theme-light-dark:before{content:"\f050e"}.mdi-thermometer:before{content:"\f050f"}.mdi-thermometer-alert:before{content:"\f0e01"}.mdi-thermometer-auto:before{content:"\f1b0f"}.mdi-thermometer-bluetooth:before{content:"\f1895"}.mdi-thermometer-check:before{content:"\f1a7f"}.mdi-thermometer-chevron-down:before{content:"\f0e02"}.mdi-thermometer-chevron-up:before{content:"\f0e03"}.mdi-thermometer-high:before{content:"\f10c2"}.mdi-thermometer-lines:before{content:"\f0510"}.mdi-thermometer-low:before{content:"\f10c3"}.mdi-thermometer-minus:before{content:"\f0e04"}.mdi-thermometer-off:before{content:"\f1531"}.mdi-thermometer-plus:before{content:"\f0e05"}.mdi-thermometer-probe:before{content:"\f1b2b"}.mdi-thermometer-probe-off:before{content:"\f1b2c"}.mdi-thermometer-water:before{content:"\f1a80"}.mdi-thermostat:before{content:"\f0393"}.mdi-thermostat-auto:before{content:"\f1b17"}.mdi-thermostat-box:before{content:"\f0891"}.mdi-thermostat-box-auto:before{content:"\f1b18"}.mdi-thermostat-cog:before{content:"\f1c80"}.mdi-thought-bubble:before{content:"\f07f6"}.mdi-thought-bubble-outline:before{content:"\f07f7"}.mdi-thumb-down:before{content:"\f0511"}.mdi-thumb-down-outline:before{content:"\f0512"}.mdi-thumb-up:before{content:"\f0513"}.mdi-thumb-up-outline:before{content:"\f0514"}.mdi-thumbs-up-down:before{content:"\f0515"}.mdi-thumbs-up-down-outline:before{content:"\f1914"}.mdi-ticket:before{content:"\f0516"}.mdi-ticket-account:before{content:"\f0517"}.mdi-ticket-confirmation:before{content:"\f0518"}.mdi-ticket-confirmation-outline:before{content:"\f13aa"}.mdi-ticket-outline:before{content:"\f0913"}.mdi-ticket-percent:before{content:"\f0724"}.mdi-ticket-percent-outline:before{content:"\f142b"}.mdi-tie:before{content:"\f0519"}.mdi-tilde:before{content:"\f0725"}.mdi-tilde-off:before{content:"\f18f3"}.mdi-timelapse:before{content:"\f051a"}.mdi-timeline:before{content:"\f0bd1"}.mdi-timeline-alert:before{content:"\f0f95"}.mdi-timeline-alert-outline:before{content:"\f0f98"}.mdi-timeline-check:before{content:"\f1532"}.mdi-timeline-check-outline:before{content:"\f1533"}.mdi-timeline-clock:before{content:"\f11fb"}.mdi-timeline-clock-outline:before{content:"\f11fc"}.mdi-timeline-minus:before{content:"\f1534"}.mdi-timeline-minus-outline:before{content:"\f1535"}.mdi-timeline-outline:before{content:"\f0bd2"}.mdi-timeline-plus:before{content:"\f0f96"}.mdi-timeline-plus-outline:before{content:"\f0f97"}.mdi-timeline-question:before{content:"\f0f99"}.mdi-timeline-question-outline:before{content:"\f0f9a"}.mdi-timeline-remove:before{content:"\f1536"}.mdi-timeline-remove-outline:before{content:"\f1537"}.mdi-timeline-text:before{content:"\f0bd3"}.mdi-timeline-text-outline:before{content:"\f0bd4"}.mdi-timer:before{content:"\f13ab"}.mdi-timer-10:before{content:"\f051c"}.mdi-timer-3:before{content:"\f051d"}.mdi-timer-alert:before{content:"\f1acc"}.mdi-timer-alert-outline:before{content:"\f1acd"}.mdi-timer-cancel:before{content:"\f1ace"}.mdi-timer-cancel-outline:before{content:"\f1acf"}.mdi-timer-check:before{content:"\f1ad0"}.mdi-timer-check-outline:before{content:"\f1ad1"}.mdi-timer-cog:before{content:"\f1925"}.mdi-timer-cog-outline:before{content:"\f1926"}.mdi-timer-edit:before{content:"\f1ad2"}.mdi-timer-edit-outline:before{content:"\f1ad3"}.mdi-timer-lock:before{content:"\f1ad4"}.mdi-timer-lock-open:before{content:"\f1ad5"}.mdi-timer-lock-open-outline:before{content:"\f1ad6"}.mdi-timer-lock-outline:before{content:"\f1ad7"}.mdi-timer-marker:before{content:"\f1ad8"}.mdi-timer-marker-outline:before{content:"\f1ad9"}.mdi-timer-minus:before{content:"\f1ada"}.mdi-timer-minus-outline:before{content:"\f1adb"}.mdi-timer-music:before{content:"\f1adc"}.mdi-timer-music-outline:before{content:"\f1add"}.mdi-timer-off:before{content:"\f13ac"}.mdi-timer-off-outline:before{content:"\f051e"}.mdi-timer-outline:before{content:"\f051b"}.mdi-timer-pause:before{content:"\f1ade"}.mdi-timer-pause-outline:before{content:"\f1adf"}.mdi-timer-play:before{content:"\f1ae0"}.mdi-timer-play-outline:before{content:"\f1ae1"}.mdi-timer-plus:before{content:"\f1ae2"}.mdi-timer-plus-outline:before{content:"\f1ae3"}.mdi-timer-refresh:before{content:"\f1ae4"}.mdi-timer-refresh-outline:before{content:"\f1ae5"}.mdi-timer-remove:before{content:"\f1ae6"}.mdi-timer-remove-outline:before{content:"\f1ae7"}.mdi-timer-sand:before{content:"\f051f"}.mdi-timer-sand-complete:before{content:"\f199f"}.mdi-timer-sand-empty:before{content:"\f06ad"}.mdi-timer-sand-full:before{content:"\f078c"}.mdi-timer-sand-paused:before{content:"\f19a0"}.mdi-timer-settings:before{content:"\f1923"}.mdi-timer-settings-outline:before{content:"\f1924"}.mdi-timer-star:before{content:"\f1ae8"}.mdi-timer-star-outline:before{content:"\f1ae9"}.mdi-timer-stop:before{content:"\f1aea"}.mdi-timer-stop-outline:before{content:"\f1aeb"}.mdi-timer-sync:before{content:"\f1aec"}.mdi-timer-sync-outline:before{content:"\f1aed"}.mdi-timetable:before{content:"\f0520"}.mdi-tire:before{content:"\f1896"}.mdi-toaster:before{content:"\f1063"}.mdi-toaster-off:before{content:"\f11b7"}.mdi-toaster-oven:before{content:"\f0cd3"}.mdi-toggle-switch:before{content:"\f0521"}.mdi-toggle-switch-off:before{content:"\f0522"}.mdi-toggle-switch-off-outline:before{content:"\f0a19"}.mdi-toggle-switch-outline:before{content:"\f0a1a"}.mdi-toggle-switch-variant:before{content:"\f1a25"}.mdi-toggle-switch-variant-off:before{content:"\f1a26"}.mdi-toilet:before{content:"\f09ab"}.mdi-toolbox:before{content:"\f09ac"}.mdi-toolbox-outline:before{content:"\f09ad"}.mdi-tools:before{content:"\f1064"}.mdi-tooltip:before{content:"\f0523"}.mdi-tooltip-account:before{content:"\f000c"}.mdi-tooltip-cellphone:before{content:"\f183b"}.mdi-tooltip-check:before{content:"\f155c"}.mdi-tooltip-check-outline:before{content:"\f155d"}.mdi-tooltip-edit:before{content:"\f0524"}.mdi-tooltip-edit-outline:before{content:"\f12c5"}.mdi-tooltip-image:before{content:"\f0525"}.mdi-tooltip-image-outline:before{content:"\f0bd5"}.mdi-tooltip-minus:before{content:"\f155e"}.mdi-tooltip-minus-outline:before{content:"\f155f"}.mdi-tooltip-outline:before{content:"\f0526"}.mdi-tooltip-plus:before{content:"\f0bd6"}.mdi-tooltip-plus-outline:before{content:"\f0527"}.mdi-tooltip-question:before{content:"\f1bba"}.mdi-tooltip-question-outline:before{content:"\f1bbb"}.mdi-tooltip-remove:before{content:"\f1560"}.mdi-tooltip-remove-outline:before{content:"\f1561"}.mdi-tooltip-text:before{content:"\f0528"}.mdi-tooltip-text-outline:before{content:"\f0bd7"}.mdi-tooth:before{content:"\f08c3"}.mdi-tooth-outline:before{content:"\f0529"}.mdi-toothbrush:before{content:"\f1129"}.mdi-toothbrush-electric:before{content:"\f112c"}.mdi-toothbrush-paste:before{content:"\f112a"}.mdi-torch:before{content:"\f1606"}.mdi-tortoise:before{content:"\f0d3b"}.mdi-toslink:before{content:"\f12b8"}.mdi-touch-text-outline:before{content:"\f1c60"}.mdi-tournament:before{content:"\f09ae"}.mdi-tow-truck:before{content:"\f083c"}.mdi-tower-beach:before{content:"\f0681"}.mdi-tower-fire:before{content:"\f0682"}.mdi-town-hall:before{content:"\f1875"}.mdi-toy-brick:before{content:"\f1288"}.mdi-toy-brick-marker:before{content:"\f1289"}.mdi-toy-brick-marker-outline:before{content:"\f128a"}.mdi-toy-brick-minus:before{content:"\f128b"}.mdi-toy-brick-minus-outline:before{content:"\f128c"}.mdi-toy-brick-outline:before{content:"\f128d"}.mdi-toy-brick-plus:before{content:"\f128e"}.mdi-toy-brick-plus-outline:before{content:"\f128f"}.mdi-toy-brick-remove:before{content:"\f1290"}.mdi-toy-brick-remove-outline:before{content:"\f1291"}.mdi-toy-brick-search:before{content:"\f1292"}.mdi-toy-brick-search-outline:before{content:"\f1293"}.mdi-track-light:before{content:"\f0914"}.mdi-track-light-off:before{content:"\f1b01"}.mdi-trackpad:before{content:"\f07f8"}.mdi-trackpad-lock:before{content:"\f0933"}.mdi-tractor:before{content:"\f0892"}.mdi-tractor-variant:before{content:"\f14c4"}.mdi-trademark:before{content:"\f0a78"}.mdi-traffic-cone:before{content:"\f137c"}.mdi-traffic-light:before{content:"\f052b"}.mdi-traffic-light-outline:before{content:"\f182a"}.mdi-train:before{content:"\f052c"}.mdi-train-bus:before{content:"\f1cc7"}.mdi-train-car:before{content:"\f0bd8"}.mdi-train-car-autorack:before{content:"\f1b2d"}.mdi-train-car-box:before{content:"\f1b2e"}.mdi-train-car-box-full:before{content:"\f1b2f"}.mdi-train-car-box-open:before{content:"\f1b30"}.mdi-train-car-caboose:before{content:"\f1b31"}.mdi-train-car-centerbeam:before{content:"\f1b32"}.mdi-train-car-centerbeam-full:before{content:"\f1b33"}.mdi-train-car-container:before{content:"\f1b34"}.mdi-train-car-flatbed:before{content:"\f1b35"}.mdi-train-car-flatbed-car:before{content:"\f1b36"}.mdi-train-car-flatbed-tank:before{content:"\f1b37"}.mdi-train-car-gondola:before{content:"\f1b38"}.mdi-train-car-gondola-full:before{content:"\f1b39"}.mdi-train-car-hopper:before{content:"\f1b3a"}.mdi-train-car-hopper-covered:before{content:"\f1b3b"}.mdi-train-car-hopper-full:before{content:"\f1b3c"}.mdi-train-car-intermodal:before{content:"\f1b3d"}.mdi-train-car-passenger:before{content:"\f1733"}.mdi-train-car-passenger-door:before{content:"\f1734"}.mdi-train-car-passenger-door-open:before{content:"\f1735"}.mdi-train-car-passenger-variant:before{content:"\f1736"}.mdi-train-car-tank:before{content:"\f1b3e"}.mdi-train-variant:before{content:"\f08c4"}.mdi-tram:before{content:"\f052d"}.mdi-tram-side:before{content:"\f0fe7"}.mdi-transcribe:before{content:"\f052e"}.mdi-transcribe-close:before{content:"\f052f"}.mdi-transfer:before{content:"\f1065"}.mdi-transfer-down:before{content:"\f0da1"}.mdi-transfer-left:before{content:"\f0da2"}.mdi-transfer-right:before{content:"\f0530"}.mdi-transfer-up:before{content:"\f0da3"}.mdi-transit-connection:before{content:"\f0d3c"}.mdi-transit-connection-horizontal:before{content:"\f1546"}.mdi-transit-connection-variant:before{content:"\f0d3d"}.mdi-transit-detour:before{content:"\f0f8b"}.mdi-transit-skip:before{content:"\f1515"}.mdi-transit-transfer:before{content:"\f06ae"}.mdi-transition:before{content:"\f0915"}.mdi-transition-masked:before{content:"\f0916"}.mdi-translate:before{content:"\f05ca"}.mdi-translate-off:before{content:"\f0e06"}.mdi-translate-variant:before{content:"\f1b99"}.mdi-transmission-tower:before{content:"\f0d3e"}.mdi-transmission-tower-export:before{content:"\f192c"}.mdi-transmission-tower-import:before{content:"\f192d"}.mdi-transmission-tower-off:before{content:"\f19dd"}.mdi-trash-can:before{content:"\f0a79"}.mdi-trash-can-outline:before{content:"\f0a7a"}.mdi-tray:before{content:"\f1294"}.mdi-tray-alert:before{content:"\f1295"}.mdi-tray-arrow-down:before{content:"\f0120"}.mdi-tray-arrow-up:before{content:"\f011d"}.mdi-tray-full:before{content:"\f1296"}.mdi-tray-minus:before{content:"\f1297"}.mdi-tray-plus:before{content:"\f1298"}.mdi-tray-remove:before{content:"\f1299"}.mdi-treasure-chest:before{content:"\f0726"}.mdi-treasure-chest-outline:before{content:"\f1c77"}.mdi-tree:before{content:"\f0531"}.mdi-tree-outline:before{content:"\f0e69"}.mdi-trello:before{content:"\f0532"}.mdi-trending-down:before{content:"\f0533"}.mdi-trending-neutral:before{content:"\f0534"}.mdi-trending-up:before{content:"\f0535"}.mdi-triangle:before{content:"\f0536"}.mdi-triangle-down:before{content:"\f1c56"}.mdi-triangle-down-outline:before{content:"\f1c57"}.mdi-triangle-outline:before{content:"\f0537"}.mdi-triangle-small-down:before{content:"\f1a09"}.mdi-triangle-small-up:before{content:"\f1a0a"}.mdi-triangle-wave:before{content:"\f147c"}.mdi-triforce:before{content:"\f0bd9"}.mdi-trophy:before{content:"\f0538"}.mdi-trophy-award:before{content:"\f0539"}.mdi-trophy-broken:before{content:"\f0da4"}.mdi-trophy-outline:before{content:"\f053a"}.mdi-trophy-variant:before{content:"\f053b"}.mdi-trophy-variant-outline:before{content:"\f053c"}.mdi-truck:before{content:"\f053d"}.mdi-truck-alert:before{content:"\f19de"}.mdi-truck-alert-outline:before{content:"\f19df"}.mdi-truck-cargo-container:before{content:"\f18d8"}.mdi-truck-check:before{content:"\f0cd4"}.mdi-truck-check-outline:before{content:"\f129a"}.mdi-truck-delivery:before{content:"\f053e"}.mdi-truck-delivery-outline:before{content:"\f129b"}.mdi-truck-fast:before{content:"\f0788"}.mdi-truck-fast-outline:before{content:"\f129c"}.mdi-truck-flatbed:before{content:"\f1891"}.mdi-truck-minus:before{content:"\f19ae"}.mdi-truck-minus-outline:before{content:"\f19bd"}.mdi-truck-off-road:before{content:"\f1c9e"}.mdi-truck-off-road-off:before{content:"\f1c9f"}.mdi-truck-outline:before{content:"\f129d"}.mdi-truck-plus:before{content:"\f19ad"}.mdi-truck-plus-outline:before{content:"\f19bc"}.mdi-truck-remove:before{content:"\f19af"}.mdi-truck-remove-outline:before{content:"\f19be"}.mdi-truck-snowflake:before{content:"\f19a6"}.mdi-truck-trailer:before{content:"\f0727"}.mdi-trumpet:before{content:"\f1096"}.mdi-tshirt-crew:before{content:"\f0a7b"}.mdi-tshirt-crew-outline:before{content:"\f053f"}.mdi-tshirt-v:before{content:"\f0a7c"}.mdi-tshirt-v-outline:before{content:"\f0540"}.mdi-tsunami:before{content:"\f1a81"}.mdi-tumble-dryer:before{content:"\f0917"}.mdi-tumble-dryer-alert:before{content:"\f11ba"}.mdi-tumble-dryer-off:before{content:"\f11bb"}.mdi-tune:before{content:"\f062e"}.mdi-tune-variant:before{content:"\f1542"}.mdi-tune-vertical:before{content:"\f066a"}.mdi-tune-vertical-variant:before{content:"\f1543"}.mdi-tunnel:before{content:"\f183d"}.mdi-tunnel-outline:before{content:"\f183e"}.mdi-turbine:before{content:"\f1a82"}.mdi-turkey:before{content:"\f171b"}.mdi-turnstile:before{content:"\f0cd5"}.mdi-turnstile-outline:before{content:"\f0cd6"}.mdi-turtle:before{content:"\f0cd7"}.mdi-twitch:before{content:"\f0543"}.mdi-twitter:before{content:"\f0544"}.mdi-two-factor-authentication:before{content:"\f09af"}.mdi-typewriter:before{content:"\f0f2d"}.mdi-ubisoft:before{content:"\f0bda"}.mdi-ubuntu:before{content:"\f0548"}.mdi-ufo:before{content:"\f10c4"}.mdi-ufo-outline:before{content:"\f10c5"}.mdi-ultra-high-definition:before{content:"\f07f9"}.mdi-umbraco:before{content:"\f0549"}.mdi-umbrella:before{content:"\f054a"}.mdi-umbrella-beach:before{content:"\f188a"}.mdi-umbrella-beach-outline:before{content:"\f188b"}.mdi-umbrella-closed:before{content:"\f09b0"}.mdi-umbrella-closed-outline:before{content:"\f13e2"}.mdi-umbrella-closed-variant:before{content:"\f13e1"}.mdi-umbrella-outline:before{content:"\f054b"}.mdi-underwear-outline:before{content:"\f1d0f"}.mdi-undo:before{content:"\f054c"}.mdi-undo-variant:before{content:"\f054d"}.mdi-unfold-less-horizontal:before{content:"\f054e"}.mdi-unfold-less-vertical:before{content:"\f0760"}.mdi-unfold-more-horizontal:before{content:"\f054f"}.mdi-unfold-more-vertical:before{content:"\f0761"}.mdi-ungroup:before{content:"\f0550"}.mdi-unicode:before{content:"\f0ed0"}.mdi-unicorn:before{content:"\f15c2"}.mdi-unicorn-variant:before{content:"\f15c3"}.mdi-unicycle:before{content:"\f15e5"}.mdi-unity:before{content:"\f06af"}.mdi-unreal:before{content:"\f09b1"}.mdi-update:before{content:"\f06b0"}.mdi-upload:before{content:"\f0552"}.mdi-upload-box:before{content:"\f1d10"}.mdi-upload-box-outline:before{content:"\f1d11"}.mdi-upload-circle:before{content:"\f1d12"}.mdi-upload-circle-outline:before{content:"\f1d13"}.mdi-upload-lock:before{content:"\f1373"}.mdi-upload-lock-outline:before{content:"\f1374"}.mdi-upload-multiple:before{content:"\f083d"}.mdi-upload-multiple-outline:before{content:"\f1d14"}.mdi-upload-network:before{content:"\f06f6"}.mdi-upload-network-outline:before{content:"\f0cd8"}.mdi-upload-off:before{content:"\f10c6"}.mdi-upload-off-outline:before{content:"\f10c7"}.mdi-upload-outline:before{content:"\f0e07"}.mdi-usb:before{content:"\f0553"}.mdi-usb-c-port:before{content:"\f1cbf"}.mdi-usb-flash-drive:before{content:"\f129e"}.mdi-usb-flash-drive-outline:before{content:"\f129f"}.mdi-usb-port:before{content:"\f11f0"}.mdi-vacuum:before{content:"\f19a1"}.mdi-vacuum-outline:before{content:"\f19a2"}.mdi-valve:before{content:"\f1066"}.mdi-valve-closed:before{content:"\f1067"}.mdi-valve-open:before{content:"\f1068"}.mdi-van-passenger:before{content:"\f07fa"}.mdi-van-utility:before{content:"\f07fb"}.mdi-vanish:before{content:"\f07fc"}.mdi-vanish-quarter:before{content:"\f1554"}.mdi-vanity-light:before{content:"\f11e1"}.mdi-variable:before{content:"\f0ae7"}.mdi-variable-box:before{content:"\f1111"}.mdi-vector-arrange-above:before{content:"\f0554"}.mdi-vector-arrange-below:before{content:"\f0555"}.mdi-vector-bezier:before{content:"\f0ae8"}.mdi-vector-circle:before{content:"\f0556"}.mdi-vector-circle-variant:before{content:"\f0557"}.mdi-vector-combine:before{content:"\f0558"}.mdi-vector-curve:before{content:"\f0559"}.mdi-vector-difference:before{content:"\f055a"}.mdi-vector-difference-ab:before{content:"\f055b"}.mdi-vector-difference-ba:before{content:"\f055c"}.mdi-vector-ellipse:before{content:"\f0893"}.mdi-vector-intersection:before{content:"\f055d"}.mdi-vector-line:before{content:"\f055e"}.mdi-vector-link:before{content:"\f0fe8"}.mdi-vector-point:before{content:"\f01c4"}.mdi-vector-point-edit:before{content:"\f09e8"}.mdi-vector-point-minus:before{content:"\f1b78"}.mdi-vector-point-plus:before{content:"\f1b79"}.mdi-vector-point-select:before{content:"\f055f"}.mdi-vector-polygon:before{content:"\f0560"}.mdi-vector-polygon-variant:before{content:"\f1856"}.mdi-vector-polyline:before{content:"\f0561"}.mdi-vector-polyline-edit:before{content:"\f1225"}.mdi-vector-polyline-minus:before{content:"\f1226"}.mdi-vector-polyline-plus:before{content:"\f1227"}.mdi-vector-polyline-remove:before{content:"\f1228"}.mdi-vector-radius:before{content:"\f074a"}.mdi-vector-rectangle:before{content:"\f05c6"}.mdi-vector-selection:before{content:"\f0562"}.mdi-vector-square:before{content:"\f0001"}.mdi-vector-square-close:before{content:"\f1857"}.mdi-vector-square-edit:before{content:"\f18d9"}.mdi-vector-square-minus:before{content:"\f18da"}.mdi-vector-square-open:before{content:"\f1858"}.mdi-vector-square-plus:before{content:"\f18db"}.mdi-vector-square-remove:before{content:"\f18dc"}.mdi-vector-triangle:before{content:"\f0563"}.mdi-vector-union:before{content:"\f0564"}.mdi-vhs:before{content:"\f0a1b"}.mdi-vibrate:before{content:"\f0566"}.mdi-vibrate-off:before{content:"\f0cd9"}.mdi-video:before{content:"\f0567"}.mdi-video-2d:before{content:"\f1a1c"}.mdi-video-3d:before{content:"\f07fd"}.mdi-video-3d-off:before{content:"\f13d9"}.mdi-video-3d-variant:before{content:"\f0ed1"}.mdi-video-4k-box:before{content:"\f083e"}.mdi-video-account:before{content:"\f0919"}.mdi-video-box:before{content:"\f00fd"}.mdi-video-box-off:before{content:"\f00fe"}.mdi-video-check:before{content:"\f1069"}.mdi-video-check-outline:before{content:"\f106a"}.mdi-video-high-definition:before{content:"\f152e"}.mdi-video-image:before{content:"\f091a"}.mdi-video-input-antenna:before{content:"\f083f"}.mdi-video-input-component:before{content:"\f0840"}.mdi-video-input-hdmi:before{content:"\f0841"}.mdi-video-input-scart:before{content:"\f0f8c"}.mdi-video-input-svideo:before{content:"\f0842"}.mdi-video-marker:before{content:"\f19a9"}.mdi-video-marker-outline:before{content:"\f19aa"}.mdi-video-minus:before{content:"\f09b2"}.mdi-video-minus-outline:before{content:"\f02ba"}.mdi-video-off:before{content:"\f0568"}.mdi-video-off-outline:before{content:"\f0bdb"}.mdi-video-outline:before{content:"\f0bdc"}.mdi-video-plus:before{content:"\f09b3"}.mdi-video-plus-outline:before{content:"\f01d3"}.mdi-video-stabilization:before{content:"\f091b"}.mdi-video-standard-definition:before{content:"\f1ca0"}.mdi-video-switch:before{content:"\f0569"}.mdi-video-switch-outline:before{content:"\f0790"}.mdi-video-vintage:before{content:"\f0a1c"}.mdi-video-wireless:before{content:"\f0ed2"}.mdi-video-wireless-outline:before{content:"\f0ed3"}.mdi-view-agenda:before{content:"\f056a"}.mdi-view-agenda-outline:before{content:"\f11d8"}.mdi-view-array:before{content:"\f056b"}.mdi-view-array-outline:before{content:"\f1485"}.mdi-view-carousel:before{content:"\f056c"}.mdi-view-carousel-outline:before{content:"\f1486"}.mdi-view-column:before{content:"\f056d"}.mdi-view-column-outline:before{content:"\f1487"}.mdi-view-comfy:before{content:"\f0e6a"}.mdi-view-comfy-outline:before{content:"\f1488"}.mdi-view-compact:before{content:"\f0e6b"}.mdi-view-compact-outline:before{content:"\f0e6c"}.mdi-view-dashboard:before{content:"\f056e"}.mdi-view-dashboard-edit:before{content:"\f1947"}.mdi-view-dashboard-edit-outline:before{content:"\f1948"}.mdi-view-dashboard-outline:before{content:"\f0a1d"}.mdi-view-dashboard-variant:before{content:"\f0843"}.mdi-view-dashboard-variant-outline:before{content:"\f1489"}.mdi-view-day:before{content:"\f056f"}.mdi-view-day-outline:before{content:"\f148a"}.mdi-view-gallery:before{content:"\f1888"}.mdi-view-gallery-outline:before{content:"\f1889"}.mdi-view-grid:before{content:"\f0570"}.mdi-view-grid-compact:before{content:"\f1c61"}.mdi-view-grid-outline:before{content:"\f11d9"}.mdi-view-grid-plus:before{content:"\f0f8d"}.mdi-view-grid-plus-outline:before{content:"\f11da"}.mdi-view-headline:before{content:"\f0571"}.mdi-view-list:before{content:"\f0572"}.mdi-view-list-outline:before{content:"\f148b"}.mdi-view-module:before{content:"\f0573"}.mdi-view-module-outline:before{content:"\f148c"}.mdi-view-parallel:before{content:"\f0728"}.mdi-view-parallel-outline:before{content:"\f148d"}.mdi-view-quilt:before{content:"\f0574"}.mdi-view-quilt-outline:before{content:"\f148e"}.mdi-view-sequential:before{content:"\f0729"}.mdi-view-sequential-outline:before{content:"\f148f"}.mdi-view-split-horizontal:before{content:"\f0bcb"}.mdi-view-split-vertical:before{content:"\f0bcc"}.mdi-view-stream:before{content:"\f0575"}.mdi-view-stream-outline:before{content:"\f1490"}.mdi-view-week:before{content:"\f0576"}.mdi-view-week-outline:before{content:"\f1491"}.mdi-vimeo:before{content:"\f0577"}.mdi-violin:before{content:"\f060f"}.mdi-virtual-reality:before{content:"\f0894"}.mdi-virus:before{content:"\f13b6"}.mdi-virus-off:before{content:"\f18e1"}.mdi-virus-off-outline:before{content:"\f18e2"}.mdi-virus-outline:before{content:"\f13b7"}.mdi-vlc:before{content:"\f057c"}.mdi-voicemail:before{content:"\f057d"}.mdi-volcano:before{content:"\f1a83"}.mdi-volcano-outline:before{content:"\f1a84"}.mdi-volleyball:before{content:"\f09b4"}.mdi-volume-equal:before{content:"\f1b10"}.mdi-volume-high:before{content:"\f057e"}.mdi-volume-low:before{content:"\f057f"}.mdi-volume-medium:before{content:"\f0580"}.mdi-volume-minus:before{content:"\f075e"}.mdi-volume-mute:before{content:"\f075f"}.mdi-volume-off:before{content:"\f0581"}.mdi-volume-plus:before{content:"\f075d"}.mdi-volume-source:before{content:"\f1120"}.mdi-volume-variant-off:before{content:"\f0e08"}.mdi-volume-vibrate:before{content:"\f1121"}.mdi-vote:before{content:"\f0a1f"}.mdi-vote-outline:before{content:"\f0a20"}.mdi-vpn:before{content:"\f0582"}.mdi-vuejs:before{content:"\f0844"}.mdi-vuetify:before{content:"\f0e6d"}.mdi-walk:before{content:"\f0583"}.mdi-wall:before{content:"\f07fe"}.mdi-wall-fire:before{content:"\f1a11"}.mdi-wall-sconce:before{content:"\f091c"}.mdi-wall-sconce-flat:before{content:"\f091d"}.mdi-wall-sconce-flat-outline:before{content:"\f17c9"}.mdi-wall-sconce-flat-variant:before{content:"\f041c"}.mdi-wall-sconce-flat-variant-outline:before{content:"\f17ca"}.mdi-wall-sconce-outline:before{content:"\f17cb"}.mdi-wall-sconce-round:before{content:"\f0748"}.mdi-wall-sconce-round-outline:before{content:"\f17cc"}.mdi-wall-sconce-round-variant:before{content:"\f091e"}.mdi-wall-sconce-round-variant-outline:before{content:"\f17cd"}.mdi-wallet:before{content:"\f0584"}.mdi-wallet-bifold:before{content:"\f1c58"}.mdi-wallet-bifold-outline:before{content:"\f1c59"}.mdi-wallet-giftcard:before{content:"\f0585"}.mdi-wallet-membership:before{content:"\f0586"}.mdi-wallet-outline:before{content:"\f0bdd"}.mdi-wallet-plus:before{content:"\f0f8e"}.mdi-wallet-plus-outline:before{content:"\f0f8f"}.mdi-wallet-travel:before{content:"\f0587"}.mdi-wallpaper:before{content:"\f0e09"}.mdi-wan:before{content:"\f0588"}.mdi-wardrobe:before{content:"\f0f90"}.mdi-wardrobe-outline:before{content:"\f0f91"}.mdi-warehouse:before{content:"\f0f81"}.mdi-washing-machine:before{content:"\f072a"}.mdi-washing-machine-alert:before{content:"\f11bc"}.mdi-washing-machine-off:before{content:"\f11bd"}.mdi-watch:before{content:"\f0589"}.mdi-watch-export:before{content:"\f058a"}.mdi-watch-export-variant:before{content:"\f0895"}.mdi-watch-import:before{content:"\f058b"}.mdi-watch-import-variant:before{content:"\f0896"}.mdi-watch-variant:before{content:"\f0897"}.mdi-watch-vibrate:before{content:"\f06b1"}.mdi-watch-vibrate-off:before{content:"\f0cda"}.mdi-water:before{content:"\f058c"}.mdi-water-alert:before{content:"\f1502"}.mdi-water-alert-outline:before{content:"\f1503"}.mdi-water-boiler:before{content:"\f0f92"}.mdi-water-boiler-alert:before{content:"\f11b3"}.mdi-water-boiler-auto:before{content:"\f1b98"}.mdi-water-boiler-off:before{content:"\f11b4"}.mdi-water-check:before{content:"\f1504"}.mdi-water-check-outline:before{content:"\f1505"}.mdi-water-circle:before{content:"\f1806"}.mdi-water-minus:before{content:"\f1506"}.mdi-water-minus-outline:before{content:"\f1507"}.mdi-water-off:before{content:"\f058d"}.mdi-water-off-outline:before{content:"\f1508"}.mdi-water-opacity:before{content:"\f1855"}.mdi-water-outline:before{content:"\f0e0a"}.mdi-water-percent:before{content:"\f058e"}.mdi-water-percent-alert:before{content:"\f1509"}.mdi-water-plus:before{content:"\f150a"}.mdi-water-plus-outline:before{content:"\f150b"}.mdi-water-polo:before{content:"\f12a0"}.mdi-water-pump:before{content:"\f058f"}.mdi-water-pump-off:before{content:"\f0f93"}.mdi-water-remove:before{content:"\f150c"}.mdi-water-remove-outline:before{content:"\f150d"}.mdi-water-sync:before{content:"\f17c6"}.mdi-water-thermometer:before{content:"\f1a85"}.mdi-water-thermometer-outline:before{content:"\f1a86"}.mdi-water-well:before{content:"\f106b"}.mdi-water-well-outline:before{content:"\f106c"}.mdi-waterfall:before{content:"\f1849"}.mdi-watering-can:before{content:"\f1481"}.mdi-watering-can-outline:before{content:"\f1482"}.mdi-watermark:before{content:"\f0612"}.mdi-wave:before{content:"\f0f2e"}.mdi-wave-arrow-down:before{content:"\f1cb0"}.mdi-wave-arrow-up:before{content:"\f1cb1"}.mdi-wave-undercurrent:before{content:"\f1cc0"}.mdi-waveform:before{content:"\f147d"}.mdi-waves:before{content:"\f078d"}.mdi-waves-arrow-left:before{content:"\f1859"}.mdi-waves-arrow-right:before{content:"\f185a"}.mdi-waves-arrow-up:before{content:"\f185b"}.mdi-waze:before{content:"\f0bde"}.mdi-weather-cloudy:before{content:"\f0590"}.mdi-weather-cloudy-alert:before{content:"\f0f2f"}.mdi-weather-cloudy-arrow-right:before{content:"\f0e6e"}.mdi-weather-cloudy-clock:before{content:"\f18f6"}.mdi-weather-dust:before{content:"\f1b5a"}.mdi-weather-fog:before{content:"\f0591"}.mdi-weather-hail:before{content:"\f0592"}.mdi-weather-hazy:before{content:"\f0f30"}.mdi-weather-hurricane:before{content:"\f0898"}.mdi-weather-hurricane-outline:before{content:"\f1c78"}.mdi-weather-lightning:before{content:"\f0593"}.mdi-weather-lightning-rainy:before{content:"\f067e"}.mdi-weather-moonset:before{content:"\f1d15"}.mdi-weather-moonset-down:before{content:"\f1d16"}.mdi-weather-moonset-up:before{content:"\f1d17"}.mdi-weather-night:before{content:"\f0594"}.mdi-weather-night-partly-cloudy:before{content:"\f0f31"}.mdi-weather-partly-cloudy:before{content:"\f0595"}.mdi-weather-partly-lightning:before{content:"\f0f32"}.mdi-weather-partly-rainy:before{content:"\f0f33"}.mdi-weather-partly-snowy:before{content:"\f0f34"}.mdi-weather-partly-snowy-rainy:before{content:"\f0f35"}.mdi-weather-pouring:before{content:"\f0596"}.mdi-weather-rainy:before{content:"\f0597"}.mdi-weather-snowy:before{content:"\f0598"}.mdi-weather-snowy-heavy:before{content:"\f0f36"}.mdi-weather-snowy-rainy:before{content:"\f067f"}.mdi-weather-sunny:before{content:"\f0599"}.mdi-weather-sunny-alert:before{content:"\f0f37"}.mdi-weather-sunny-off:before{content:"\f14e4"}.mdi-weather-sunset:before{content:"\f059a"}.mdi-weather-sunset-down:before{content:"\f059b"}.mdi-weather-sunset-up:before{content:"\f059c"}.mdi-weather-tornado:before{content:"\f0f38"}.mdi-weather-windy:before{content:"\f059d"}.mdi-weather-windy-variant:before{content:"\f059e"}.mdi-web:before{content:"\f059f"}.mdi-web-box:before{content:"\f0f94"}.mdi-web-cancel:before{content:"\f1790"}.mdi-web-check:before{content:"\f0789"}.mdi-web-clock:before{content:"\f124a"}.mdi-web-minus:before{content:"\f10a0"}.mdi-web-off:before{content:"\f0a8e"}.mdi-web-plus:before{content:"\f0033"}.mdi-web-refresh:before{content:"\f1791"}.mdi-web-remove:before{content:"\f0551"}.mdi-web-sync:before{content:"\f1792"}.mdi-webcam:before{content:"\f05a0"}.mdi-webcam-off:before{content:"\f1737"}.mdi-webhook:before{content:"\f062f"}.mdi-webpack:before{content:"\f072b"}.mdi-webrtc:before{content:"\f1248"}.mdi-wechat:before{content:"\f0611"}.mdi-weight:before{content:"\f05a1"}.mdi-weight-gram:before{content:"\f0d3f"}.mdi-weight-kilogram:before{content:"\f05a2"}.mdi-weight-lifter:before{content:"\f115d"}.mdi-weight-pound:before{content:"\f09b5"}.mdi-whatsapp:before{content:"\f05a3"}.mdi-wheel-barrow:before{content:"\f14f2"}.mdi-wheelchair:before{content:"\f1a87"}.mdi-wheelchair-accessibility:before{content:"\f05a4"}.mdi-whistle:before{content:"\f09b6"}.mdi-whistle-outline:before{content:"\f12bc"}.mdi-white-balance-auto:before{content:"\f05a5"}.mdi-white-balance-incandescent:before{content:"\f05a6"}.mdi-white-balance-iridescent:before{content:"\f05a7"}.mdi-white-balance-sunny:before{content:"\f05a8"}.mdi-widgets:before{content:"\f072c"}.mdi-widgets-outline:before{content:"\f1355"}.mdi-wifi:before{content:"\f05a9"}.mdi-wifi-alert:before{content:"\f16b5"}.mdi-wifi-arrow-down:before{content:"\f16b6"}.mdi-wifi-arrow-left:before{content:"\f16b7"}.mdi-wifi-arrow-left-right:before{content:"\f16b8"}.mdi-wifi-arrow-right:before{content:"\f16b9"}.mdi-wifi-arrow-up:before{content:"\f16ba"}.mdi-wifi-arrow-up-down:before{content:"\f16bb"}.mdi-wifi-cancel:before{content:"\f16bc"}.mdi-wifi-check:before{content:"\f16bd"}.mdi-wifi-cog:before{content:"\f16be"}.mdi-wifi-lock:before{content:"\f16bf"}.mdi-wifi-lock-open:before{content:"\f16c0"}.mdi-wifi-marker:before{content:"\f16c1"}.mdi-wifi-minus:before{content:"\f16c2"}.mdi-wifi-off:before{content:"\f05aa"}.mdi-wifi-plus:before{content:"\f16c3"}.mdi-wifi-refresh:before{content:"\f16c4"}.mdi-wifi-remove:before{content:"\f16c5"}.mdi-wifi-settings:before{content:"\f16c6"}.mdi-wifi-star:before{content:"\f0e0b"}.mdi-wifi-strength-1:before{content:"\f091f"}.mdi-wifi-strength-1-alert:before{content:"\f0920"}.mdi-wifi-strength-1-lock:before{content:"\f0921"}.mdi-wifi-strength-1-lock-open:before{content:"\f16cb"}.mdi-wifi-strength-2:before{content:"\f0922"}.mdi-wifi-strength-2-alert:before{content:"\f0923"}.mdi-wifi-strength-2-lock:before{content:"\f0924"}.mdi-wifi-strength-2-lock-open:before{content:"\f16cc"}.mdi-wifi-strength-3:before{content:"\f0925"}.mdi-wifi-strength-3-alert:before{content:"\f0926"}.mdi-wifi-strength-3-lock:before{content:"\f0927"}.mdi-wifi-strength-3-lock-open:before{content:"\f16cd"}.mdi-wifi-strength-4:before{content:"\f0928"}.mdi-wifi-strength-4-alert:before{content:"\f0929"}.mdi-wifi-strength-4-lock:before{content:"\f092a"}.mdi-wifi-strength-4-lock-open:before{content:"\f16ce"}.mdi-wifi-strength-alert-outline:before{content:"\f092b"}.mdi-wifi-strength-lock-open-outline:before{content:"\f16cf"}.mdi-wifi-strength-lock-outline:before{content:"\f092c"}.mdi-wifi-strength-off:before{content:"\f092d"}.mdi-wifi-strength-off-outline:before{content:"\f092e"}.mdi-wifi-strength-outline:before{content:"\f092f"}.mdi-wifi-sync:before{content:"\f16c7"}.mdi-wikipedia:before{content:"\f05ac"}.mdi-wind-power:before{content:"\f1a88"}.mdi-wind-power-outline:before{content:"\f1a89"}.mdi-wind-turbine:before{content:"\f0da5"}.mdi-wind-turbine-alert:before{content:"\f19ab"}.mdi-wind-turbine-check:before{content:"\f19ac"}.mdi-window-close:before{content:"\f05ad"}.mdi-window-closed:before{content:"\f05ae"}.mdi-window-closed-variant:before{content:"\f11db"}.mdi-window-maximize:before{content:"\f05af"}.mdi-window-minimize:before{content:"\f05b0"}.mdi-window-open:before{content:"\f05b1"}.mdi-window-open-variant:before{content:"\f11dc"}.mdi-window-restore:before{content:"\f05b2"}.mdi-window-shutter:before{content:"\f111c"}.mdi-window-shutter-alert:before{content:"\f111d"}.mdi-window-shutter-auto:before{content:"\f1ba3"}.mdi-window-shutter-cog:before{content:"\f1a8a"}.mdi-window-shutter-open:before{content:"\f111e"}.mdi-window-shutter-settings:before{content:"\f1a8b"}.mdi-windsock:before{content:"\f15fa"}.mdi-wiper:before{content:"\f0ae9"}.mdi-wiper-wash:before{content:"\f0da6"}.mdi-wiper-wash-alert:before{content:"\f18df"}.mdi-wizard-hat:before{content:"\f1477"}.mdi-wordpress:before{content:"\f05b4"}.mdi-wrap:before{content:"\f05b6"}.mdi-wrap-disabled:before{content:"\f0bdf"}.mdi-wrench:before{content:"\f05b7"}.mdi-wrench-check:before{content:"\f1b8f"}.mdi-wrench-check-outline:before{content:"\f1b90"}.mdi-wrench-clock:before{content:"\f19a3"}.mdi-wrench-clock-outline:before{content:"\f1b93"}.mdi-wrench-cog:before{content:"\f1b91"}.mdi-wrench-cog-outline:before{content:"\f1b92"}.mdi-wrench-outline:before{content:"\f0be0"}.mdi-xamarin:before{content:"\f0845"}.mdi-xml:before{content:"\f05c0"}.mdi-xmpp:before{content:"\f07ff"}.mdi-yahoo:before{content:"\f0b4f"}.mdi-yeast:before{content:"\f05c1"}.mdi-yin-yang:before{content:"\f0680"}.mdi-yoga:before{content:"\f117c"}.mdi-youtube:before{content:"\f05c3"}.mdi-youtube-gaming:before{content:"\f0848"}.mdi-youtube-studio:before{content:"\f0847"}.mdi-youtube-subscription:before{content:"\f0d40"}.mdi-youtube-tv:before{content:"\f0448"}.mdi-yurt:before{content:"\f1516"}.mdi-z-wave:before{content:"\f0aea"}.mdi-zend:before{content:"\f0aeb"}.mdi-zigbee:before{content:"\f0d41"}.mdi-zip-box:before{content:"\f05c4"}.mdi-zip-box-outline:before{content:"\f0ffa"}.mdi-zip-disk:before{content:"\f0a23"}.mdi-zodiac-aquarius:before{content:"\f0a7d"}.mdi-zodiac-aries:before{content:"\f0a7e"}.mdi-zodiac-cancer:before{content:"\f0a7f"}.mdi-zodiac-capricorn:before{content:"\f0a80"}.mdi-zodiac-gemini:before{content:"\f0a81"}.mdi-zodiac-leo:before{content:"\f0a82"}.mdi-zodiac-libra:before{content:"\f0a83"}.mdi-zodiac-pisces:before{content:"\f0a84"}.mdi-zodiac-sagittarius:before{content:"\f0a85"}.mdi-zodiac-scorpio:before{content:"\f0a86"}.mdi-zodiac-taurus:before{content:"\f0a87"}.mdi-zodiac-virgo:before{content:"\f0a88"}.mdi-blank:before{content:"\f68c";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:#0000008a}.mdi-dark.mdi-inactive:before{color:#00000042}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:#ffffff4d}.mdi-rotate-45:before{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mdi-rotate-90:before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-135:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg)}.mdi-rotate-180:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-225:before{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg)}.mdi-rotate-270:before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.mdi-rotate-315:before{-webkit-transform:rotate(315deg);-ms-transform:rotate(315deg);transform:rotate(315deg)}.mdi-flip-h:before{-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{-webkit-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{-webkit-animation:mdi-spin 2s infinite linear;animation:mdi-spin 2s infinite linear}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08);box-shadow:1px 0 #e6e6e6,-1px 0 #e6e6e6,0 1px #e6e6e6,0 -1px #e6e6e6,0 3px 13px #00000014}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1);animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none!important;box-shadow:none!important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:"";height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:#000000e6;fill:#000000e6;height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:#000000e6;fill:#000000e6}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{left:0}.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{right:0}.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:#0000001a}.numInputWrapper span:active{background:#0003}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:#00000080}.numInputWrapper:hover{background:#0000000d}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:#0000000d}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\fffd;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:#000000e6}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:#000000e6}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:#00000080;background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:#0000000d}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:#0000008a;line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translateZ(0);opacity:1}.dayContainer+.dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:#3939394d;background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:#3939391a}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 #569ff7,5px 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:#3939394d;background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:700}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:700;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}@keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}.grid-stack{position:relative}.grid-stack-rtl{direction:ltr}.grid-stack-rtl>.grid-stack-item{direction:rtl}.grid-stack-placeholder>.placeholder-content{background-color:#0000001a;margin:0;position:absolute;width:auto;z-index:0!important}.grid-stack>.grid-stack-item{position:absolute;padding:0}.grid-stack>.grid-stack-item>.grid-stack-item-content{margin:0;position:absolute;width:auto;overflow-x:hidden;overflow-y:auto}.grid-stack>.grid-stack-item.size-to-content:not(.size-to-content-max)>.grid-stack-item-content{overflow-y:hidden}.grid-stack-item>.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.grid-stack-item.ui-resizable-autohide>.ui-resizable-handle,.grid-stack-item.ui-resizable-disabled>.ui-resizable-handle{display:none}.grid-stack-item>.ui-resizable-ne,.grid-stack-item>.ui-resizable-nw,.grid-stack-item>.ui-resizable-se,.grid-stack-item>.ui-resizable-sw{background-image:url('data:image/svg+xml;utf8,');background-repeat:no-repeat;background-position:center}.grid-stack-item>.ui-resizable-ne{transform:translateY(10px) rotate(45deg)}.grid-stack-item>.ui-resizable-sw{transform:rotate(45deg)}.grid-stack-item>.ui-resizable-nw{transform:translateY(10px) rotate(-45deg)}.grid-stack-item>.ui-resizable-se{transform:rotate(-45deg)}.grid-stack-item>.ui-resizable-nw{cursor:nw-resize;width:20px;height:20px;top:0}.grid-stack-item>.ui-resizable-n{cursor:n-resize;height:10px;top:0;left:25px;right:25px}.grid-stack-item>.ui-resizable-ne{cursor:ne-resize;width:20px;height:20px;top:0}.grid-stack-item>.ui-resizable-e{cursor:e-resize;width:10px;top:15px;bottom:15px}.grid-stack-item>.ui-resizable-se{cursor:se-resize;width:20px;height:20px}.grid-stack-item>.ui-resizable-s{cursor:s-resize;height:10px;left:25px;bottom:0;right:25px}.grid-stack-item>.ui-resizable-sw{cursor:sw-resize;width:20px;height:20px}.grid-stack-item>.ui-resizable-w{cursor:w-resize;width:10px;top:15px;bottom:15px}.grid-stack-item.ui-draggable-dragging>.ui-resizable-handle{display:none!important}.grid-stack-item.ui-draggable-dragging{will-change:left,top;cursor:move}.grid-stack-item.ui-resizable-resizing{will-change:width,height}.ui-draggable-dragging,.ui-resizable-resizing{z-index:10000}.ui-draggable-dragging>.grid-stack-item-content,.ui-resizable-resizing>.grid-stack-item-content{box-shadow:1px 4px 6px #0003;opacity:.8}.grid-stack-animate,.grid-stack-animate .grid-stack-item{transition:left .3s,top .3s,height .3s,width .3s}.grid-stack-animate .grid-stack-item.grid-stack-placeholder,.grid-stack-animate .grid-stack-item.ui-draggable-dragging,.grid-stack-animate .grid-stack-item.ui-resizable-resizing{transition:left 0s,top 0s,height 0s,width 0s}.grid-stack>.grid-stack-item[gs-y="0"]{top:0}.grid-stack>.grid-stack-item[gs-x="0"]{left:0}.gs-12>.grid-stack-item{width:8.333%}.gs-12>.grid-stack-item[gs-x="1"]{left:8.333%}.gs-12>.grid-stack-item[gs-w="2"]{width:16.667%}.gs-12>.grid-stack-item[gs-x="2"]{left:16.667%}.gs-12>.grid-stack-item[gs-w="3"]{width:25%}.gs-12>.grid-stack-item[gs-x="3"]{left:25%}.gs-12>.grid-stack-item[gs-w="4"]{width:33.333%}.gs-12>.grid-stack-item[gs-x="4"]{left:33.333%}.gs-12>.grid-stack-item[gs-w="5"]{width:41.667%}.gs-12>.grid-stack-item[gs-x="5"]{left:41.667%}.gs-12>.grid-stack-item[gs-w="6"]{width:50%}.gs-12>.grid-stack-item[gs-x="6"]{left:50%}.gs-12>.grid-stack-item[gs-w="7"]{width:58.333%}.gs-12>.grid-stack-item[gs-x="7"]{left:58.333%}.gs-12>.grid-stack-item[gs-w="8"]{width:66.667%}.gs-12>.grid-stack-item[gs-x="8"]{left:66.667%}.gs-12>.grid-stack-item[gs-w="9"]{width:75%}.gs-12>.grid-stack-item[gs-x="9"]{left:75%}.gs-12>.grid-stack-item[gs-w="10"]{width:83.333%}.gs-12>.grid-stack-item[gs-x="10"]{left:83.333%}.gs-12>.grid-stack-item[gs-w="11"]{width:91.667%}.gs-12>.grid-stack-item[gs-x="11"]{left:91.667%}.gs-12>.grid-stack-item[gs-w="12"]{width:100%}.gs-1>.grid-stack-item{width:100%}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:100;src:local("Roboto Mono Thin "),local("Roboto Mono-Thin"),url("./roboto-mono-latin-100-JQJ4Z5FD.woff2") format("woff2"),url("./roboto-mono-latin-100-SMKVIC22.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:100;src:local("Roboto Mono Thin italic"),local("Roboto Mono-Thinitalic"),url("./roboto-mono-latin-100italic-SF7I3UQS.woff2") format("woff2"),url("./roboto-mono-latin-100italic-DARDHGP2.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:200;src:local("Roboto Mono Extra Light "),local("Roboto Mono-Extra Light"),url("./roboto-mono-latin-200-GAB3DPCB.woff2") format("woff2"),url("./roboto-mono-latin-200-GNXGWAU7.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:200;src:local("Roboto Mono Extra Light italic"),local("Roboto Mono-Extra Lightitalic"),url("./roboto-mono-latin-200italic-YC3AN6RQ.woff2") format("woff2"),url("./roboto-mono-latin-200italic-MBEOZD5A.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:300;src:local("Roboto Mono Light "),local("Roboto Mono-Light"),url("./roboto-mono-latin-300-76QG53G7.woff2") format("woff2"),url("./roboto-mono-latin-300-KB4HCXJB.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:300;src:local("Roboto Mono Light italic"),local("Roboto Mono-Lightitalic"),url("./roboto-mono-latin-300italic-ATWQWJG4.woff2") format("woff2"),url("./roboto-mono-latin-300italic-UCTTXECO.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:400;src:local("Roboto Mono Regular "),local("Roboto Mono-Regular"),url("./roboto-mono-latin-400-OKRWGZOX.woff2") format("woff2"),url("./roboto-mono-latin-400-L25YYWY3.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:400;src:local("Roboto Mono Regular italic"),local("Roboto Mono-Regularitalic"),url("./roboto-mono-latin-400italic-UPQRVZWX.woff2") format("woff2"),url("./roboto-mono-latin-400italic-3G7XMJ7A.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:500;src:local("Roboto Mono Medium "),local("Roboto Mono-Medium"),url("./roboto-mono-latin-500-67YXJMLO.woff2") format("woff2"),url("./roboto-mono-latin-500-4ZB2P7GK.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:500;src:local("Roboto Mono Medium italic"),local("Roboto Mono-Mediumitalic"),url("./roboto-mono-latin-500italic-U7WRIR22.woff2") format("woff2"),url("./roboto-mono-latin-500italic-RXGCSZS4.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:600;src:local("Roboto Mono SemiBold "),local("Roboto Mono-SemiBold"),url("./roboto-mono-latin-600-ZRZYGQNG.woff2") format("woff2"),url("./roboto-mono-latin-600-USMEYMTS.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:600;src:local("Roboto Mono SemiBold italic"),local("Roboto Mono-SemiBolditalic"),url("./roboto-mono-latin-600italic-THUILB76.woff2") format("woff2"),url("./roboto-mono-latin-600italic-TLIW3M4P.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:normal;font-display:swap;font-weight:700;src:local("Roboto Mono Bold "),local("Roboto Mono-Bold"),url("./roboto-mono-latin-700-QNNSSZIK.woff2") format("woff2"),url("./roboto-mono-latin-700-PEQVO3WV.woff") format("woff")}@font-face{font-family:Roboto Mono;font-style:italic;font-display:swap;font-weight:700;src:local("Roboto Mono Bold italic"),local("Roboto Mono-Bolditalic"),url("./roboto-mono-latin-700italic-WWLRMKIN.woff2") format("woff2"),url("./roboto-mono-latin-700italic-KTWD2UYU.woff") format("woff")}@font-face{font-family:Plus Jakarta Sans Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url("./plus-jakarta-sans-cyrillic-ext-wght-normal-3FNWYSHQ.woff2") format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Plus Jakarta Sans Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url("./plus-jakarta-sans-vietnamese-wght-normal-NNXUV3SN.woff2") format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Plus Jakarta Sans Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url("./plus-jakarta-sans-latin-ext-wght-normal-WWG75Y4U.woff2") format("woff2-variations");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Plus Jakarta Sans Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url("./plus-jakarta-sans-latin-wght-normal-S6EFCQOU.woff2") format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD} diff --git a/netbox/project-static/dist/netbox.css b/netbox/project-static/dist/netbox.css index b599521fa8..762cafd5dd 100644 --- a/netbox/project-static/dist/netbox.css +++ b/netbox/project-static/dist/netbox.css @@ -1 +1 @@ -@charset "UTF-8";:root,[data-bs-theme=light]{--tblr-black: #000000;--tblr-white: #ffffff;--tblr-gray: #667382;--tblr-gray-dark: #182433;--tblr-gray-100: #f6f8fb;--tblr-gray-200: #eef1f4;--tblr-gray-300: #dadfe5;--tblr-gray-400: #bbc3cd;--tblr-gray-500: #929dab;--tblr-gray-600: #667382;--tblr-gray-700: #3a4859;--tblr-gray-800: #182433;--tblr-gray-900: #040a11;--tblr-primary: #0054a6;--tblr-secondary: #667382;--tblr-success: #2fb344;--tblr-info: #4299e1;--tblr-warning: #f76707;--tblr-danger: #d63939;--tblr-light: #fcfdfe;--tblr-dark: #182433;--tblr-muted: #667382;--tblr-blue: #0054a6;--tblr-azure: #4299e1;--tblr-indigo: #4263eb;--tblr-purple: #ae3ec9;--tblr-pink: #d6336c;--tblr-red: #d63939;--tblr-orange: #f76707;--tblr-yellow: #f59f00;--tblr-lime: #74b816;--tblr-green: #2fb344;--tblr-teal: #0ca678;--tblr-cyan: #17a2b8;--tblr-facebook: #1877f2;--tblr-twitter: #1da1f2;--tblr-linkedin: #0a66c2;--tblr-google: #dc4e41;--tblr-youtube: #ff0000;--tblr-vimeo: #1ab7ea;--tblr-dribbble: #ea4c89;--tblr-github: #181717;--tblr-instagram: #e4405f;--tblr-pinterest: #bd081c;--tblr-vk: #6383a8;--tblr-rss: #ffa500;--tblr-flickr: #0063dc;--tblr-bitbucket: #0052cc;--tblr-tabler: #0054a6;--tblr-primary-rgb: 0, 84, 166;--tblr-secondary-rgb: 102, 115, 130;--tblr-success-rgb: 47, 179, 68;--tblr-info-rgb: 66, 153, 225;--tblr-warning-rgb: 247, 103, 7;--tblr-danger-rgb: 214, 57, 57;--tblr-light-rgb: 252, 253, 254;--tblr-dark-rgb: 24, 36, 51;--tblr-muted-rgb: 102, 115, 130;--tblr-blue-rgb: 0, 84, 166;--tblr-azure-rgb: 66, 153, 225;--tblr-indigo-rgb: 66, 99, 235;--tblr-purple-rgb: 174, 62, 201;--tblr-pink-rgb: 214, 51, 108;--tblr-red-rgb: 214, 57, 57;--tblr-orange-rgb: 247, 103, 7;--tblr-yellow-rgb: 245, 159, 0;--tblr-lime-rgb: 116, 184, 22;--tblr-green-rgb: 47, 179, 68;--tblr-teal-rgb: 12, 166, 120;--tblr-cyan-rgb: 23, 162, 184;--tblr-facebook-rgb: 24, 119, 242;--tblr-twitter-rgb: 29, 161, 242;--tblr-linkedin-rgb: 10, 102, 194;--tblr-google-rgb: 220, 78, 65;--tblr-youtube-rgb: 255, 0, 0;--tblr-vimeo-rgb: 26, 183, 234;--tblr-dribbble-rgb: 234, 76, 137;--tblr-github-rgb: 24, 23, 23;--tblr-instagram-rgb: 228, 64, 95;--tblr-pinterest-rgb: 189, 8, 28;--tblr-vk-rgb: 99, 131, 168;--tblr-rss-rgb: 255, 165, 0;--tblr-flickr-rgb: 0, 99, 220;--tblr-bitbucket-rgb: 0, 82, 204;--tblr-tabler-rgb: 0, 84, 166;--tblr-primary-text-emphasis: #002242;--tblr-secondary-text-emphasis: #292e34;--tblr-success-text-emphasis: #13481b;--tblr-info-text-emphasis: #1a3d5a;--tblr-warning-text-emphasis: #632903;--tblr-danger-text-emphasis: #561717;--tblr-light-text-emphasis: #3a4859;--tblr-dark-text-emphasis: #3a4859;--tblr-primary-bg-subtle: #ccdded;--tblr-secondary-bg-subtle: #e0e3e6;--tblr-success-bg-subtle: #d5f0da;--tblr-info-bg-subtle: #d9ebf9;--tblr-warning-bg-subtle: #fde1cd;--tblr-danger-bg-subtle: #f7d7d7;--tblr-light-bg-subtle: #fbfcfd;--tblr-dark-bg-subtle: #bbc3cd;--tblr-primary-border-subtle: #99bbdb;--tblr-secondary-border-subtle: #c2c7cd;--tblr-success-border-subtle: #ace1b4;--tblr-info-border-subtle: #b3d6f3;--tblr-warning-border-subtle: #fcc29c;--tblr-danger-border-subtle: #efb0b0;--tblr-light-border-subtle: #eef1f4;--tblr-dark-border-subtle: #929dab;--tblr-white-rgb: 255, 255, 255;--tblr-black-rgb: 0, 0, 0;--tblr-font-sans-serif: "Inter";--tblr-font-monospace: Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace;--tblr-gradient: linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0));--tblr-body-font-family: var(--tblr-font-sans-serif);--tblr-body-font-size: .875rem;--tblr-body-font-weight: 400;--tblr-body-line-height: 1.4285714286;--tblr-body-color: #182433;--tblr-body-color-rgb: 24, 36, 51;--tblr-body-bg: #f6f8fb;--tblr-body-bg-rgb: 246, 248, 251;--tblr-emphasis-color: #182433;--tblr-emphasis-color-rgb: 24, 36, 51;--tblr-secondary-color: rgba(24, 36, 51, .75);--tblr-secondary-color-rgb: 24, 36, 51;--tblr-secondary-bg: #eef1f4;--tblr-secondary-bg-rgb: 238, 241, 244;--tblr-tertiary-color: rgba(24, 36, 51, .5);--tblr-tertiary-color-rgb: 24, 36, 51;--tblr-tertiary-bg: #f6f8fb;--tblr-tertiary-bg-rgb: 246, 248, 251;--tblr-heading-color: inherit;--tblr-link-color: #0054a6;--tblr-link-color-rgb: 0, 84, 166;--tblr-link-decoration: none;--tblr-link-hover-color: #004385;--tblr-link-hover-color-rgb: 0, 67, 133;--tblr-link-hover-decoration: underline;--tblr-code-color: var(--tblr-gray-600);--tblr-highlight-color: #182433;--tblr-highlight-bg: #fdeccc;--tblr-border-width: 1px;--tblr-border-style: solid;--tblr-border-color: #dadfe5;--tblr-border-color-translucent: rgba(4, 32, 69, .14);--tblr-border-radius: 4px;--tblr-border-radius-sm: 2px;--tblr-border-radius-lg: 8px;--tblr-border-radius-xl: 1rem;--tblr-border-radius-xxl: 2rem;--tblr-border-radius-2xl: var(--tblr-border-radius-xxl);--tblr-border-radius-pill: 100rem;--tblr-box-shadow: rgba(var(--tblr-body-color-rgb), .04) 0 2px 4px 0;--tblr-box-shadow-sm: 0 .125rem .25rem rgba(0, 0, 0, .075);--tblr-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, .175);--tblr-box-shadow-inset: 0 0 transparent;--tblr-focus-ring-width: .25rem;--tblr-focus-ring-opacity: .25;--tblr-focus-ring-color: rgba(var(--tblr-primary-rgb), .25);--tblr-form-valid-color: #2fb344;--tblr-form-valid-border-color: #2fb344;--tblr-form-invalid-color: #d63939;--tblr-form-invalid-border-color: #d63939}[data-bs-theme=dark],body[data-bs-theme=dark] [data-bs-theme=light]{color-scheme:dark;--tblr-body-color: #fcfdfe;--tblr-body-color-rgb: 252, 253, 254;--tblr-body-bg: #040a11;--tblr-body-bg-rgb: 4, 10, 17;--tblr-emphasis-color: #ffffff;--tblr-emphasis-color-rgb: 255, 255, 255;--tblr-secondary-color: rgba(252, 253, 254, .75);--tblr-secondary-color-rgb: 252, 253, 254;--tblr-secondary-bg: #182433;--tblr-secondary-bg-rgb: 24, 36, 51;--tblr-tertiary-color: rgba(252, 253, 254, .5);--tblr-tertiary-color-rgb: 252, 253, 254;--tblr-tertiary-bg: #0e1722;--tblr-tertiary-bg-rgb: 14, 23, 34;--tblr-primary-text-emphasis: #6698ca;--tblr-secondary-text-emphasis: #a3abb4;--tblr-success-text-emphasis: #82d18f;--tblr-info-text-emphasis: #8ec2ed;--tblr-warning-text-emphasis: #faa46a;--tblr-danger-text-emphasis: #e68888;--tblr-light-text-emphasis: #f6f8fb;--tblr-dark-text-emphasis: #dadfe5;--tblr-primary-bg-subtle: #001121;--tblr-secondary-bg-subtle: #14171a;--tblr-success-bg-subtle: #09240e;--tblr-info-bg-subtle: #0d1f2d;--tblr-warning-bg-subtle: #311501;--tblr-danger-bg-subtle: #2b0b0b;--tblr-light-bg-subtle: #182433;--tblr-dark-bg-subtle: #0c121a;--tblr-primary-border-subtle: #003264;--tblr-secondary-border-subtle: #3d454e;--tblr-success-border-subtle: #1c6b29;--tblr-info-border-subtle: #285c87;--tblr-warning-border-subtle: #943e04;--tblr-danger-border-subtle: #802222;--tblr-light-border-subtle: #3a4859;--tblr-dark-border-subtle: #182433;--tblr-heading-color: inherit;--tblr-link-color: #6698ca;--tblr-link-hover-color: #85add5;--tblr-link-color-rgb: 102, 152, 202;--tblr-link-hover-color-rgb: 133, 173, 213;--tblr-code-color: var(--tblr-gray-300);--tblr-highlight-color: #fcfdfe;--tblr-highlight-bg: #624000;--tblr-border-color: #1f2e41;--tblr-border-color-translucent: rgba(72, 110, 149, .14);--tblr-form-valid-color: #82d18f;--tblr-form-valid-border-color: #82d18f;--tblr-form-invalid-color: #e68888;--tblr-form-invalid-border-color: #e68888}*,*:before,*:after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--tblr-body-font-family);font-size:var(--tblr-body-font-size);font-weight:var(--tblr-body-font-weight);line-height:var(--tblr-body-line-height);color:var(--tblr-body-color);text-align:var(--tblr-body-text-align);background-color:var(--tblr-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr,.hr{margin:2rem 0;color:inherit;border:0;border-top:var(--tblr-border-width) solid;opacity:.16}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:var(--tblr-spacer);font-weight:var(--tblr-font-weight-bold);line-height:1.2;color:var(--tblr-heading-color)}h1,.h1{font-size:1.5rem}h2,.h2{font-size:1.25rem}h3,.h3{font-size:1rem}h4,.h4{font-size:.875rem}h5,.h5{font-size:.75rem}h6,.h6{font-size:.625rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:600}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:85.714285%}mark,.mark{padding:.1875em;color:var(--tblr-highlight-color);background-color:var(--tblr-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--tblr-link-color-rgb),var(--tblr-link-opacity, 1));text-decoration:none}a:hover{--tblr-link-color-rgb: var(--tblr-link-hover-color-rgb);text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--tblr-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:85.714285%;color:var(--tblr-light)}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:85.714285%;color:var(--tblr-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.25rem .5rem;font-size:var(--tblr-font-size-h5);color:var(--tblr-text-secondary-dark);background-color:var(--tblr-code-bg);border-radius:2px}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--tblr-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:.875rem;font-weight:var(--tblr-font-weight-normal)}.display-1{font-size:5rem;font-weight:300;line-height:1.2}.display-2{font-size:4.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}.display-5{font-size:3rem;font-weight:300;line-height:1.2}.display-6{font-size:2rem;font-weight:300;line-height:1.2}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:85.714285%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:.875rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:85.714285%;color:#667382}.blockquote-footer:before{content:"\2014\a0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--tblr-body-bg);border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-box-shadow-sm);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:85.714285%;color:var(--tblr-secondary-color)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width: 576px){.container-sm,.container{max-width:540px}}@media (min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media (min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media (min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media (min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--tblr-breakpoint-xs: 0;--tblr-breakpoint-sm: 576px;--tblr-breakpoint-md: 768px;--tblr-breakpoint-lg: 992px;--tblr-breakpoint-xl: 1200px;--tblr-breakpoint-xxl: 1400px}.row{--tblr-gutter-x: var(--tblr-page-padding);--tblr-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--tblr-gutter-y));margin-right:calc(-.5 * var(--tblr-gutter-x));margin-left:calc(-.5 * var(--tblr-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-top:var(--tblr-gutter-y)}.grid{display:grid;grid-template-rows:repeat(var(--tblr-rows, 1),1fr);grid-template-columns:repeat(var(--tblr-columns, 12),1fr);gap:var(--tblr-gap, var(--tblr-page-padding))}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media (min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media (min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media (min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media (min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media (min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--tblr-gutter-x: 0}.g-0,.gy-0{--tblr-gutter-y: 0}.g-1,.gx-1{--tblr-gutter-x: .25rem}.g-1,.gy-1{--tblr-gutter-y: .25rem}.g-2,.gx-2{--tblr-gutter-x: .5rem}.g-2,.gy-2{--tblr-gutter-y: .5rem}.g-3,.gx-3{--tblr-gutter-x: 1rem}.g-3,.gy-3{--tblr-gutter-y: 1rem}.g-4,.gx-4{--tblr-gutter-x: 1.5rem}.g-4,.gy-4{--tblr-gutter-y: 1.5rem}.g-5,.gx-5{--tblr-gutter-x: 2rem}.g-5,.gy-5{--tblr-gutter-y: 2rem}.g-6,.gx-6{--tblr-gutter-x: 3rem}.g-6,.gy-6{--tblr-gutter-y: 3rem}.g-7,.gx-7{--tblr-gutter-x: 5rem}.g-7,.gy-7{--tblr-gutter-y: 5rem}.g-8,.gx-8{--tblr-gutter-x: 8rem}.g-8,.gy-8{--tblr-gutter-y: 8rem}@media (min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--tblr-gutter-x: 0}.g-sm-0,.gy-sm-0{--tblr-gutter-y: 0}.g-sm-1,.gx-sm-1{--tblr-gutter-x: .25rem}.g-sm-1,.gy-sm-1{--tblr-gutter-y: .25rem}.g-sm-2,.gx-sm-2{--tblr-gutter-x: .5rem}.g-sm-2,.gy-sm-2{--tblr-gutter-y: .5rem}.g-sm-3,.gx-sm-3{--tblr-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--tblr-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--tblr-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--tblr-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--tblr-gutter-x: 2rem}.g-sm-5,.gy-sm-5{--tblr-gutter-y: 2rem}.g-sm-6,.gx-sm-6{--tblr-gutter-x: 3rem}.g-sm-6,.gy-sm-6{--tblr-gutter-y: 3rem}.g-sm-7,.gx-sm-7{--tblr-gutter-x: 5rem}.g-sm-7,.gy-sm-7{--tblr-gutter-y: 5rem}.g-sm-8,.gx-sm-8{--tblr-gutter-x: 8rem}.g-sm-8,.gy-sm-8{--tblr-gutter-y: 8rem}}@media (min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--tblr-gutter-x: 0}.g-md-0,.gy-md-0{--tblr-gutter-y: 0}.g-md-1,.gx-md-1{--tblr-gutter-x: .25rem}.g-md-1,.gy-md-1{--tblr-gutter-y: .25rem}.g-md-2,.gx-md-2{--tblr-gutter-x: .5rem}.g-md-2,.gy-md-2{--tblr-gutter-y: .5rem}.g-md-3,.gx-md-3{--tblr-gutter-x: 1rem}.g-md-3,.gy-md-3{--tblr-gutter-y: 1rem}.g-md-4,.gx-md-4{--tblr-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--tblr-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--tblr-gutter-x: 2rem}.g-md-5,.gy-md-5{--tblr-gutter-y: 2rem}.g-md-6,.gx-md-6{--tblr-gutter-x: 3rem}.g-md-6,.gy-md-6{--tblr-gutter-y: 3rem}.g-md-7,.gx-md-7{--tblr-gutter-x: 5rem}.g-md-7,.gy-md-7{--tblr-gutter-y: 5rem}.g-md-8,.gx-md-8{--tblr-gutter-x: 8rem}.g-md-8,.gy-md-8{--tblr-gutter-y: 8rem}}@media (min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--tblr-gutter-x: 0}.g-lg-0,.gy-lg-0{--tblr-gutter-y: 0}.g-lg-1,.gx-lg-1{--tblr-gutter-x: .25rem}.g-lg-1,.gy-lg-1{--tblr-gutter-y: .25rem}.g-lg-2,.gx-lg-2{--tblr-gutter-x: .5rem}.g-lg-2,.gy-lg-2{--tblr-gutter-y: .5rem}.g-lg-3,.gx-lg-3{--tblr-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--tblr-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--tblr-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--tblr-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--tblr-gutter-x: 2rem}.g-lg-5,.gy-lg-5{--tblr-gutter-y: 2rem}.g-lg-6,.gx-lg-6{--tblr-gutter-x: 3rem}.g-lg-6,.gy-lg-6{--tblr-gutter-y: 3rem}.g-lg-7,.gx-lg-7{--tblr-gutter-x: 5rem}.g-lg-7,.gy-lg-7{--tblr-gutter-y: 5rem}.g-lg-8,.gx-lg-8{--tblr-gutter-x: 8rem}.g-lg-8,.gy-lg-8{--tblr-gutter-y: 8rem}}@media (min-width: 1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--tblr-gutter-x: 0}.g-xl-0,.gy-xl-0{--tblr-gutter-y: 0}.g-xl-1,.gx-xl-1{--tblr-gutter-x: .25rem}.g-xl-1,.gy-xl-1{--tblr-gutter-y: .25rem}.g-xl-2,.gx-xl-2{--tblr-gutter-x: .5rem}.g-xl-2,.gy-xl-2{--tblr-gutter-y: .5rem}.g-xl-3,.gx-xl-3{--tblr-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--tblr-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--tblr-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--tblr-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--tblr-gutter-x: 2rem}.g-xl-5,.gy-xl-5{--tblr-gutter-y: 2rem}.g-xl-6,.gx-xl-6{--tblr-gutter-x: 3rem}.g-xl-6,.gy-xl-6{--tblr-gutter-y: 3rem}.g-xl-7,.gx-xl-7{--tblr-gutter-x: 5rem}.g-xl-7,.gy-xl-7{--tblr-gutter-y: 5rem}.g-xl-8,.gx-xl-8{--tblr-gutter-x: 8rem}.g-xl-8,.gy-xl-8{--tblr-gutter-y: 8rem}}@media (min-width: 1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--tblr-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--tblr-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--tblr-gutter-x: .25rem}.g-xxl-1,.gy-xxl-1{--tblr-gutter-y: .25rem}.g-xxl-2,.gx-xxl-2{--tblr-gutter-x: .5rem}.g-xxl-2,.gy-xxl-2{--tblr-gutter-y: .5rem}.g-xxl-3,.gx-xxl-3{--tblr-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--tblr-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--tblr-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--tblr-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--tblr-gutter-x: 2rem}.g-xxl-5,.gy-xxl-5{--tblr-gutter-y: 2rem}.g-xxl-6,.gx-xxl-6{--tblr-gutter-x: 3rem}.g-xxl-6,.gy-xxl-6{--tblr-gutter-y: 3rem}.g-xxl-7,.gx-xxl-7{--tblr-gutter-x: 5rem}.g-xxl-7,.gy-xxl-7{--tblr-gutter-y: 5rem}.g-xxl-8,.gx-xxl-8{--tblr-gutter-x: 8rem}.g-xxl-8,.gy-xxl-8{--tblr-gutter-y: 8rem}}.table,.markdown>table{--tblr-table-color-type: initial;--tblr-table-bg-type: initial;--tblr-table-color-state: initial;--tblr-table-bg-state: initial;--tblr-table-color: inherit;--tblr-table-bg: transparent;--tblr-table-border-color: var(--tblr-border-color-translucent);--tblr-table-accent-bg: transparent;--tblr-table-striped-color: inherit;--tblr-table-striped-bg: var(--tblr-bg-surface-tertiary);--tblr-table-active-color: inherit;--tblr-table-active-bg: rgba(var(--tblr-emphasis-color-rgb), .1);--tblr-table-hover-color: inherit;--tblr-table-hover-bg: rgba(var(--tblr-emphasis-color-rgb), .075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--tblr-table-border-color)}.table>:not(caption)>*>*,.markdown>table>:not(caption)>*>*{padding:.5rem;color:var(--tblr-table-color-state, var(--tblr-table-color-type, var(--tblr-table-color)));background-color:var(--tblr-table-bg);border-bottom-width:var(--tblr-border-width);box-shadow:inset 0 0 0 9999px var(--tblr-table-bg-state, var(--tblr-table-bg-type, var(--tblr-table-accent-bg)))}.table>tbody,.markdown>table>tbody{vertical-align:inherit}.table>thead,.markdown>table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--tblr-border-width) * 2) solid var(--tblr-border-color-translucent)}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*,.markdown>table>:not(caption)>*{border-width:var(--tblr-border-width) 0}.table-bordered>:not(caption)>*>*,.markdown>table>:not(caption)>*>*{border-width:0 var(--tblr-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(2n)>*{--tblr-table-color-type: var(--tblr-table-striped-color);--tblr-table-bg-type: var(--tblr-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--tblr-table-color-type: var(--tblr-table-striped-color);--tblr-table-bg-type: var(--tblr-table-striped-bg)}.table-active{--tblr-table-color-state: var(--tblr-table-active-color);--tblr-table-bg-state: var(--tblr-table-active-bg)}.table-hover>tbody>tr:hover>*{--tblr-table-color-state: var(--tblr-table-hover-color);--tblr-table-bg-state: var(--tblr-table-hover-bg)}.table-primary{--tblr-table-color: #182433;--tblr-table-bg: #ccdded;--tblr-table-border-color: #a8b8c8;--tblr-table-striped-bg: #c3d4e4;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #bacbda;--tblr-table-active-color: #fcfdfe;--tblr-table-hover-bg: #bfcfdf;--tblr-table-hover-color: #fcfdfe;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-secondary{--tblr-table-color: #182433;--tblr-table-bg: #e0e3e6;--tblr-table-border-color: #b8bdc2;--tblr-table-striped-bg: #d6d9dd;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #ccd0d4;--tblr-table-active-color: #fcfdfe;--tblr-table-hover-bg: #d1d5d9;--tblr-table-hover-color: #182433;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-success{--tblr-table-color: #182433;--tblr-table-bg: #d5f0da;--tblr-table-border-color: #afc7b9;--tblr-table-striped-bg: #cce6d2;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #c2dcc9;--tblr-table-active-color: #182433;--tblr-table-hover-bg: #c7e1cd;--tblr-table-hover-color: #182433;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-info{--tblr-table-color: #182433;--tblr-table-bg: #d9ebf9;--tblr-table-border-color: #b2c3d1;--tblr-table-striped-bg: #cfe1ef;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #c6d7e5;--tblr-table-active-color: #182433;--tblr-table-hover-bg: #cbdcea;--tblr-table-hover-color: #182433;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-warning{--tblr-table-color: #182433;--tblr-table-bg: #fde1cd;--tblr-table-border-color: #cfbbae;--tblr-table-striped-bg: #f2d8c5;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #e6cebe;--tblr-table-active-color: #182433;--tblr-table-hover-bg: #ecd3c1;--tblr-table-hover-color: #182433;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-danger{--tblr-table-color: #182433;--tblr-table-bg: #f7d7d7;--tblr-table-border-color: #cab3b6;--tblr-table-striped-bg: #eccecf;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #e1c5c7;--tblr-table-active-color: #fcfdfe;--tblr-table-hover-bg: #e6cacb;--tblr-table-hover-color: #fcfdfe;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-light{--tblr-table-color: #182433;--tblr-table-bg: #fcfdfe;--tblr-table-border-color: #ced2d5;--tblr-table-striped-bg: #f1f2f4;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #e5e7ea;--tblr-table-active-color: #182433;--tblr-table-hover-bg: #ebedef;--tblr-table-hover-color: #182433;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-dark{--tblr-table-color: #fcfdfe;--tblr-table-bg: #182433;--tblr-table-border-color: #464f5c;--tblr-table-striped-bg: #232f3d;--tblr-table-striped-color: #fcfdfe;--tblr-table-active-bg: #2f3a47;--tblr-table-active-color: #fcfdfe;--tblr-table-hover-bg: #293442;--tblr-table-hover-color: #fcfdfe;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem;font-size:.875rem;font-weight:var(--tblr-font-weight-medium)}.col-form-label{padding-top:calc(.5625rem + var(--tblr-border-width));padding-bottom:calc(.5625rem + var(--tblr-border-width));margin-bottom:0;font-size:inherit;font-weight:var(--tblr-font-weight-medium);line-height:1.4285714286}.col-form-label-lg{padding-top:calc(.5rem + var(--tblr-border-width));padding-bottom:calc(.5rem + var(--tblr-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.125rem + var(--tblr-border-width));padding-bottom:calc(.125rem + var(--tblr-border-width));font-size:.75rem}.form-text{margin-top:.25rem;font-size:85.714285%;color:var(--tblr-secondary-color)}.form-control{display:block;width:100%;padding:.5625rem .75rem;font-family:var(--tblr-font-sans-serif);font-size:.875rem;font-weight:400;line-height:1.4285714286;color:var(--tblr-body-color);appearance:none;background-color:var(--tblr-bg-forms);background-clip:padding-box;border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-box-shadow-input);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--tblr-body-color);background-color:var(--tblr-bg-forms);border-color:#80aad3;outline:0;box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.4285714286em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:#929dab;opacity:1}.form-control:disabled{background-color:var(--tblr-bg-surface-secondary);opacity:1}.form-control::file-selector-button{padding:.5625rem .75rem;margin:-.5625rem -.75rem;margin-inline-end:.75rem;color:var(--tblr-body-color);background-color:var(--tblr-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--tblr-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--tblr-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.5625rem 0;margin-bottom:0;line-height:1.4285714286;color:var(--tblr-body-color);background-color:transparent;border:solid transparent;border-width:var(--tblr-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.4285714286em + .25rem + calc(var(--tblr-border-width) * 2));padding:.125rem .25rem;font-size:.75rem;border-radius:var(--tblr-border-radius-sm)}.form-control-sm::file-selector-button{padding:.125rem .25rem;margin:-.125rem -.25rem;margin-inline-end:.25rem}.form-control-lg{min-height:calc(1.4285714286em + 1rem + calc(var(--tblr-border-width) * 2));padding:.5rem .75rem;font-size:1.25rem;border-radius:var(--tblr-border-radius-lg)}.form-control-lg::file-selector-button{padding:.5rem .75rem;margin:-.5rem -.75rem;margin-inline-end:.75rem}textarea.form-control{min-height:calc(1.4285714286em + 1.125rem + calc(var(--tblr-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.4285714286em + .25rem + calc(var(--tblr-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.4285714286em + 1rem + calc(var(--tblr-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.4285714286em + 1.125rem + calc(var(--tblr-border-width) * 2));padding:.5625rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--tblr-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--tblr-border-radius)}.form-control-color.form-control-sm{height:calc(1.4285714286em + .25rem + calc(var(--tblr-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.4285714286em + 1rem + calc(var(--tblr-border-width) * 2))}.form-select{--tblr-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23929dab' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.5625rem 2.25rem .5625rem .75rem;font-family:var(--tblr-font-sans-serif);font-size:.875rem;font-weight:400;line-height:1.4285714286;color:var(--tblr-body-color);appearance:none;background-color:var(--tblr-bg-forms);background-image:var(--tblr-form-select-bg-img),var(--tblr-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-box-shadow-input);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#80aad3;outline:0;box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--tblr-bg-surface-secondary)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--tblr-body-color)}.form-select-sm{padding-top:.125rem;padding-bottom:.125rem;padding-left:.25rem;font-size:.75rem;border-radius:var(--tblr-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:.75rem;font-size:1.25rem;border-radius:var(--tblr-border-radius-lg)}[data-bs-theme=dark] .form-select,body[data-bs-theme=dark] [data-bs-theme=light] .form-select{--tblr-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23fcfdfe' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.25rem;padding-left:2rem;margin-bottom:.75rem}.form-check .form-check-input{float:left;margin-left:-2rem}.form-check-reverse{padding-right:2rem;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-2rem;margin-left:0}.form-check-input{--tblr-form-check-bg: var(--tblr-bg-forms);flex-shrink:0;width:1.25rem;height:1.25rem;margin-top:.0892857143rem;vertical-align:top;appearance:none;background-color:var(--tblr-form-check-bg);background-image:var(--tblr-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:var(--tblr-border-radius)}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#80aad3;outline:0;box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-check-input:checked{background-color:var(--tblr-primary);border-color:var(--tblr-border-color-translucent)}.form-check-input:checked[type=checkbox]{--tblr-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--tblr-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:var(--tblr-primary);border-color:var(--tblr-primary);--tblr-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{cursor:default;opacity:.7}.form-switch{padding-left:2.5rem}.form-switch .form-check-input{--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23dadfe5'/%3e%3c/svg%3e");width:2rem;margin-left:-2.5rem;background-image:var(--tblr-form-switch-bg);background-position:left center;border-radius:2rem;transition:background-position .15s ease-in-out}.form-switch .form-check-input:focus{--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2380aad3'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5rem;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5rem;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.4}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.25rem;padding:0;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #f6f8fb,0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #f6f8fb,0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.375rem;appearance:none;background-color:var(--tblr-primary);border:2px var(--tblr-border-style) #ffffff;border-radius:1rem;box-shadow:0 .1rem .25rem #0000001a;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b3cce4}.form-range::-webkit-slider-runnable-track{width:100%;height:.25rem;color:transparent;cursor:pointer;background-color:var(--tblr-border-color);border-color:transparent;border-radius:1rem;box-shadow:var(--tblr-box-shadow-inset)}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;background-color:var(--tblr-primary);border:2px var(--tblr-border-style) #ffffff;border-radius:1rem;box-shadow:0 .1rem .25rem #0000001a;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b3cce4}.form-range::-moz-range-track{width:100%;height:.25rem;color:transparent;cursor:pointer;background-color:var(--tblr-border-color);border-color:transparent;border-radius:1rem;box-shadow:var(--tblr-box-shadow-inset)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--tblr-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--tblr-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--tblr-border-width) * 2));min-height:calc(3.5rem + calc(var(--tblr-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--tblr-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--tblr-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control:focus~label:after,.form-floating>.form-control:not(:placeholder-shown)~label:after,.form-floating>.form-control-plaintext~label:after,.form-floating>.form-select~label:after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:var(--tblr-bg-forms);border-radius:var(--tblr-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--tblr-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--tblr-border-width) 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#667382}.form-floating>:disabled~label:after,.form-floating>.form-control:disabled~label:after{background-color:var(--tblr-bg-surface-secondary)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.5625rem .75rem;font-size:.875rem;font-weight:400;line-height:1.4285714286;color:var(--tblr-secondary);text-align:center;white-space:nowrap;background-color:var(--tblr-bg-surface-secondary);border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem .75rem;font-size:1.25rem;border-radius:var(--tblr-border-radius-lg)}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.125rem .25rem;font-size:.75rem;border-radius:var(--tblr-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--tblr-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:85.714285%;color:var(--tblr-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:var(--tblr-spacer-2) var(--tblr-spacer-2);margin-top:.1rem;font-size:.765625rem;color:#fff;background-color:var(--tblr-success);border-radius:var(--tblr-border-radius)}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:var(--tblr-form-valid-border-color);padding-right:calc(1.4285714286em + 1.125rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.3571428572em + .28125rem) center;background-size:calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:var(--tblr-form-valid-border-color);box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.4285714286em + 1.125rem);background-position:top calc(.3571428572em + .28125rem) right calc(.3571428572em + .28125rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:var(--tblr-form-valid-border-color)}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--tblr-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:var(--tblr-form-valid-border-color);box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-success-rgb),.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.4285714286em + 1.125rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:var(--tblr-form-valid-border-color)}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:var(--tblr-form-valid-color)}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(var(--tblr-success-rgb),.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:var(--tblr-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:85.714285%;color:var(--tblr-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:var(--tblr-spacer-2) var(--tblr-spacer-2);margin-top:.1rem;font-size:.765625rem;color:#fff;background-color:var(--tblr-danger);border-radius:var(--tblr-border-radius)}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:var(--tblr-form-invalid-border-color);padding-right:calc(1.4285714286em + 1.125rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.3571428572em + .28125rem) center;background-size:calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:var(--tblr-form-invalid-border-color);box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.4285714286em + 1.125rem);background-position:top calc(.3571428572em + .28125rem) right calc(.3571428572em + .28125rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:var(--tblr-form-invalid-border-color)}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--tblr-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:var(--tblr-form-invalid-border-color);box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-danger-rgb),.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.4285714286em + 1.125rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:var(--tblr-form-invalid-border-color)}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:var(--tblr-form-invalid-color)}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--tblr-danger-rgb),.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:var(--tblr-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--tblr-btn-padding-x: .5rem;--tblr-btn-padding-y: .25rem;--tblr-btn-font-family: var(--tblr-font-sans-serif);--tblr-btn-font-size: .875rem;--tblr-btn-font-weight: var(--tblr-font-weight-medium);--tblr-btn-line-height: 1.4285714286;--tblr-btn-color: var(--tblr-body-color);--tblr-btn-bg: transparent;--tblr-btn-border-width: var(--tblr-border-width);--tblr-btn-border-color: transparent;--tblr-btn-border-radius: var(--tblr-border-radius);--tblr-btn-hover-border-color: transparent;--tblr-btn-box-shadow: var(--tblr-box-shadow-input);--tblr-btn-disabled-opacity: .4;--tblr-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--tblr-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--tblr-btn-padding-y) var(--tblr-btn-padding-x);font-family:var(--tblr-btn-font-family);font-size:var(--tblr-btn-font-size);font-weight:var(--tblr-btn-font-weight);line-height:var(--tblr-btn-line-height);color:var(--tblr-btn-color);text-align:center;vertical-align:middle;cursor:pointer;user-select:none;border:var(--tblr-btn-border-width) solid var(--tblr-btn-border-color);border-radius:var(--tblr-btn-border-radius);background-color:var(--tblr-btn-bg);box-shadow:var(--tblr-btn-box-shadow);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--tblr-btn-hover-color);text-decoration:none;background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--tblr-btn-color);background-color:var(--tblr-btn-bg);border-color:var(--tblr-btn-border-color)}.btn:focus-visible{color:var(--tblr-btn-hover-color);background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color);outline:0;box-shadow:var(--tblr-btn-box-shadow),var(--tblr-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--tblr-btn-hover-border-color);outline:0;box-shadow:var(--tblr-btn-box-shadow),var(--tblr-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--tblr-btn-active-color);background-color:var(--tblr-btn-active-bg);border-color:var(--tblr-btn-active-border-color);box-shadow:var(--tblr-btn-active-shadow)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--tblr-btn-active-shadow),var(--tblr-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--tblr-btn-active-shadow),var(--tblr-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--tblr-btn-disabled-color);pointer-events:none;background-color:var(--tblr-btn-disabled-bg);border-color:var(--tblr-btn-disabled-border-color);opacity:var(--tblr-btn-disabled-opacity);box-shadow:none}.btn-link{--tblr-btn-font-weight: 400;--tblr-btn-color: var(--tblr-link-color);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-link-hover-color);--tblr-btn-hover-border-color: transparent;--tblr-btn-active-color: var(--tblr-link-hover-color);--tblr-btn-active-border-color: transparent;--tblr-btn-disabled-color: #667382;--tblr-btn-disabled-border-color: transparent;--tblr-btn-box-shadow: 0 0 0 #000;--tblr-btn-focus-shadow-rgb: 38, 109, 179;text-decoration:none}.btn-link:hover,.btn-link:focus-visible{text-decoration:underline}.btn-link:focus-visible{color:var(--tblr-btn-color)}.btn-link:hover{color:var(--tblr-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--tblr-btn-padding-y: .5rem;--tblr-btn-padding-x: .75rem;--tblr-btn-font-size: 1.25rem;--tblr-btn-border-radius: var(--tblr-border-radius-lg)}.btn-sm,.btn-group-sm>.btn{--tblr-btn-padding-y: .125rem;--tblr-btn-padding-x: .25rem;--tblr-btn-font-size: .75rem;--tblr-btn-border-radius: var(--tblr-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-45deg)}.dropdown-menu{--tblr-dropdown-zindex: 1000;--tblr-dropdown-min-width: 11rem;--tblr-dropdown-padding-x: 0;--tblr-dropdown-padding-y: .25rem;--tblr-dropdown-spacer: 1px;--tblr-dropdown-font-size: .875rem;--tblr-dropdown-color: var(--tblr-body-color);--tblr-dropdown-bg: var(--tblr-bg-surface);--tblr-dropdown-border-color: var(--tblr-border-color-translucent);--tblr-dropdown-border-radius: var(--tblr-border-radius);--tblr-dropdown-border-width: var(--tblr-border-width);--tblr-dropdown-inner-border-radius: calc(var(--tblr-border-radius) - var(--tblr-border-width));--tblr-dropdown-divider-bg: var(--tblr-border-color-translucent);--tblr-dropdown-divider-margin-y: var(--tblr-spacer);--tblr-dropdown-box-shadow: var(--tblr-box-shadow-dropdown);--tblr-dropdown-link-color: inherit;--tblr-dropdown-link-hover-color: inherit;--tblr-dropdown-link-hover-bg: rgba(var(--tblr-secondary-rgb), .08);--tblr-dropdown-link-active-color: var(--tblr-primary);--tblr-dropdown-link-active-bg: var(--tblr-active-bg);--tblr-dropdown-link-disabled-color: var(--tblr-tertiary-color);--tblr-dropdown-item-padding-x: .75rem;--tblr-dropdown-item-padding-y: .5rem;--tblr-dropdown-header-color: #667382;--tblr-dropdown-header-padding-x: .75rem;--tblr-dropdown-header-padding-y: .25rem;position:absolute;z-index:var(--tblr-dropdown-zindex);display:none;min-width:var(--tblr-dropdown-min-width);padding:var(--tblr-dropdown-padding-y) var(--tblr-dropdown-padding-x);margin:0;font-size:var(--tblr-dropdown-font-size);color:var(--tblr-dropdown-color);text-align:left;list-style:none;background-color:var(--tblr-dropdown-bg);background-clip:padding-box;border:var(--tblr-dropdown-border-width) solid var(--tblr-dropdown-border-color);border-radius:var(--tblr-dropdown-border-radius);box-shadow:var(--tblr-dropdown-box-shadow)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--tblr-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--tblr-dropdown-spacer)}.dropup .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(135deg)}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--tblr-dropdown-spacer)}.dropend .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-135deg)}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--tblr-dropdown-spacer)}.dropstart .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(45deg)}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{height:0;margin:var(--tblr-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--tblr-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--tblr-dropdown-item-padding-y) var(--tblr-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--tblr-dropdown-link-color);text-align:inherit;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--tblr-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--tblr-dropdown-link-hover-color);text-decoration:none;background-color:var(--tblr-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--tblr-dropdown-link-active-color);text-decoration:none;background-color:var(--tblr-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--tblr-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--tblr-dropdown-header-padding-y) var(--tblr-dropdown-header-padding-x);margin-bottom:0;font-size:.765625rem;color:var(--tblr-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--tblr-dropdown-item-padding-y) var(--tblr-dropdown-item-padding-x);color:var(--tblr-dropdown-link-color)}.dropdown-menu-dark{--tblr-dropdown-color: #dadfe5;--tblr-dropdown-bg: #182433;--tblr-dropdown-border-color: var(--tblr-border-color-translucent);--tblr-dropdown-box-shadow: ;--tblr-dropdown-link-color: #dadfe5;--tblr-dropdown-link-hover-color: #ffffff;--tblr-dropdown-divider-bg: var(--tblr-border-color-translucent);--tblr-dropdown-link-hover-bg: rgba(255, 255, 255, .15);--tblr-dropdown-link-active-color: var(--tblr-primary);--tblr-dropdown-link-active-bg: var(--tblr-active-bg);--tblr-dropdown-link-disabled-color: #929dab;--tblr-dropdown-header-color: #929dab}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--tblr-border-radius)}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(var(--tblr-border-width) * -1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.1875rem;padding-left:.1875rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.btn-group.show .dropdown-toggle{box-shadow:inset 0 3px 5px #00000020}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(var(--tblr-border-width) * -1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--tblr-nav-link-padding-x: .75rem;--tblr-nav-link-padding-y: .5rem;--tblr-nav-link-font-weight: ;--tblr-nav-link-color: var(--tblr-secondary);--tblr-nav-link-hover-color: var(--tblr-link-hover-color);--tblr-nav-link-disabled-color: var(--tblr-disabled-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--tblr-nav-link-padding-y) var(--tblr-nav-link-padding-x);font-size:var(--tblr-nav-link-font-size);font-weight:var(--tblr-nav-link-font-weight);color:var(--tblr-nav-link-color);background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-link:hover,.nav-link:focus{color:var(--tblr-nav-link-hover-color);text-decoration:none}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.nav-link.disabled,.nav-link:disabled{color:var(--tblr-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--tblr-nav-tabs-border-width: var(--tblr-border-width);--tblr-nav-tabs-border-color: var(--tblr-border-color);--tblr-nav-tabs-border-radius: var(--tblr-border-radius);--tblr-nav-tabs-link-hover-border-color: var(--tblr-border-color) var(--tblr-border-color) var(--tblr-border-color);--tblr-nav-tabs-link-active-color: var(--tblr-body-color);--tblr-nav-tabs-link-active-bg: var(--tblr-body-bg);--tblr-nav-tabs-link-active-border-color: var(--tblr-border-color) var(--tblr-border-color) var(--tblr-border-color);border-bottom:var(--tblr-nav-tabs-border-width) solid var(--tblr-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--tblr-nav-tabs-border-width));border:var(--tblr-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--tblr-nav-tabs-border-radius);border-top-right-radius:var(--tblr-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--tblr-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--tblr-nav-tabs-link-active-color);background-color:var(--tblr-nav-tabs-link-active-bg);border-color:var(--tblr-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--tblr-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--tblr-nav-pills-border-radius: var(--tblr-border-radius);--tblr-nav-pills-link-active-color: var(--tblr-primary);--tblr-nav-pills-link-active-bg: rgba(var(--tblr-secondary-rgb), .15)}.nav-pills .nav-link{border-radius:var(--tblr-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--tblr-nav-pills-link-active-color);background-color:var(--tblr-nav-pills-link-active-bg)}.nav-underline{--tblr-nav-underline-gap: 1rem;--tblr-nav-underline-border-width: .125rem;--tblr-nav-underline-link-active-color: var(--tblr-emphasis-color);gap:var(--tblr-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--tblr-nav-underline-border-width) solid transparent}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:600;color:var(--tblr-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--tblr-navbar-padding-x: 0;--tblr-navbar-padding-y: .25rem;--tblr-navbar-color: var(--tblr-body-color);--tblr-navbar-hover-color: rgba(var(--tblr-emphasis-color-rgb), .8);--tblr-navbar-disabled-color: var(--tblr-disabled-color);--tblr-navbar-active-color: var(--tblr-body-color) color;--tblr-navbar-brand-padding-y: .5rem;--tblr-navbar-brand-margin-end: 1rem;--tblr-navbar-brand-font-size: 1.25rem;--tblr-navbar-brand-color: var(--tblr-body-color);--tblr-navbar-brand-hover-color: var(--tblr-body-color) color;--tblr-navbar-nav-link-padding-x: .75rem;--tblr-navbar-toggler-padding-y: 0;--tblr-navbar-toggler-padding-x: 0;--tblr-navbar-toggler-font-size: 1rem;--tblr-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2824, 36, 51, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--tblr-navbar-toggler-border-color: rgba(var(--tblr-emphasis-color-rgb), .15);--tblr-navbar-toggler-border-radius: var(--tblr-border-radius);--tblr-navbar-toggler-focus-width: 0;--tblr-navbar-toggler-transition: box-shadow .15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--tblr-navbar-padding-y) var(--tblr-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--tblr-navbar-brand-padding-y);padding-bottom:var(--tblr-navbar-brand-padding-y);margin-right:var(--tblr-navbar-brand-margin-end);font-size:var(--tblr-navbar-brand-font-size);color:var(--tblr-navbar-brand-color);white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--tblr-navbar-brand-hover-color);text-decoration:none}.navbar-nav{--tblr-nav-link-padding-x: 0;--tblr-nav-link-padding-y: .5rem;--tblr-nav-link-font-weight: ;--tblr-nav-link-color: var(--tblr-navbar-color);--tblr-nav-link-hover-color: var(--tblr-navbar-hover-color);--tblr-nav-link-disabled-color: var(--tblr-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--tblr-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--tblr-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--tblr-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--tblr-navbar-toggler-padding-y) var(--tblr-navbar-toggler-padding-x);font-size:var(--tblr-navbar-toggler-font-size);line-height:1;color:var(--tblr-navbar-color);background-color:transparent;border:var(--tblr-border-width) solid var(--tblr-navbar-toggler-border-color);border-radius:var(--tblr-navbar-toggler-border-radius);transition:var(--tblr-navbar-toggler-transition)}@media (prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--tblr-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--tblr-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--tblr-scroll-height, 75vh);overflow-y:auto}@media (min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark],body[data-bs-theme=dark] .navbar[data-bs-theme=light]{--tblr-navbar-color: rgba(255, 255, 255, .7);--tblr-navbar-hover-color: rgba(255, 255, 255, .75);--tblr-navbar-disabled-color: var(--tblr-disabled-color);--tblr-navbar-active-color: #ffffff;--tblr-navbar-brand-color: #ffffff;--tblr-navbar-brand-hover-color: #ffffff;--tblr-navbar-toggler-border-color: rgba(255, 255, 255, .1);--tblr-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.7%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon,body[data-bs-theme=dark] [data-bs-theme=light] .navbar-toggler-icon{--tblr-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.7%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--tblr-card-spacer-y: 1.25rem;--tblr-card-spacer-x: 1.25rem;--tblr-card-title-spacer-y: 1.25rem;--tblr-card-title-color: ;--tblr-card-subtitle-color: ;--tblr-card-border-width: var(--tblr-border-width);--tblr-card-border-color: var(--tblr-border-color-translucent);--tblr-card-border-radius: var(--tblr-border-radius);--tblr-card-box-shadow: var(--tblr-shadow-card);--tblr-card-inner-border-radius: calc(var(--tblr-border-radius) - (var(--tblr-border-width)));--tblr-card-cap-padding-y: 1.25rem;--tblr-card-cap-padding-x: 1.25rem;--tblr-card-cap-bg: var(--tblr-bg-surface-tertiary);--tblr-card-cap-color: inherit;--tblr-card-height: ;--tblr-card-color: inherit;--tblr-card-bg: var(--tblr-bg-surface);--tblr-card-img-overlay-padding: 1rem;--tblr-card-group-margin: 1.5rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--tblr-card-height);color:var(--tblr-body-color);word-wrap:break-word;background-color:var(--tblr-card-bg);background-clip:border-box;border:var(--tblr-card-border-width) solid var(--tblr-card-border-color);border-radius:var(--tblr-card-border-radius);box-shadow:var(--tblr-card-box-shadow)}.card>hr,.card>.hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--tblr-card-inner-border-radius);border-top-right-radius:var(--tblr-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--tblr-card-inner-border-radius);border-bottom-left-radius:var(--tblr-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--tblr-card-spacer-y) var(--tblr-card-spacer-x);color:var(--tblr-card-color)}.card-title{margin-bottom:var(--tblr-card-title-spacer-y);color:var(--tblr-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--tblr-card-title-spacer-y));margin-bottom:0;color:var(--tblr-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:var(--tblr-card-spacer-x)}.card-header{padding:var(--tblr-card-cap-padding-y) var(--tblr-card-cap-padding-x);margin-bottom:0;color:var(--tblr-card-cap-color);background-color:var(--tblr-card-cap-bg);border-bottom:var(--tblr-card-border-width) solid var(--tblr-card-border-color)}.card-header:first-child{border-radius:var(--tblr-card-inner-border-radius) var(--tblr-card-inner-border-radius) 0 0}.card-footer{padding:var(--tblr-card-cap-padding-y) var(--tblr-card-cap-padding-x);color:var(--tblr-card-cap-color);background-color:var(--tblr-card-cap-bg);border-top:var(--tblr-card-border-width) solid var(--tblr-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--tblr-card-inner-border-radius) var(--tblr-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--tblr-card-cap-padding-x));margin-bottom:calc(-1 * var(--tblr-card-cap-padding-y));margin-left:calc(-.5 * var(--tblr-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--tblr-card-bg);border-bottom-color:var(--tblr-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--tblr-card-cap-padding-x));margin-left:calc(-.5 * var(--tblr-card-cap-padding-x))}.card-img-overlay{position:absolute;inset:0;padding:var(--tblr-card-img-overlay-padding);border-radius:var(--tblr-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--tblr-card-inner-border-radius);border-top-right-radius:var(--tblr-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--tblr-card-inner-border-radius);border-bottom-left-radius:var(--tblr-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--tblr-card-group-margin)}@media (min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--tblr-accordion-color: var(--tblr-body-color);--tblr-accordion-bg: transparent;--tblr-accordion-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, border-radius .15s ease;--tblr-accordion-border-color: var(--tblr-border-color-translucent);--tblr-accordion-border-width: var(--tblr-border-width);--tblr-accordion-border-radius: var(--tblr-border-radius);--tblr-accordion-inner-border-radius: calc(var(--tblr-border-radius) - (var(--tblr-border-width)));--tblr-accordion-btn-padding-x: 1.25rem;--tblr-accordion-btn-padding-y: 1rem;--tblr-accordion-btn-color: var(--tblr-body-color);--tblr-accordion-btn-bg: transparent;--tblr-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23182433' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--tblr-accordion-btn-icon-width: 1rem;--tblr-accordion-btn-icon-transform: rotate(-180deg);--tblr-accordion-btn-icon-transition: transform .2s ease-in-out;--tblr-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23002242' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--tblr-accordion-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--tblr-primary-rgb), .25);--tblr-accordion-body-padding-x: 1.25rem;--tblr-accordion-body-padding-y: 1rem;--tblr-accordion-active-color: inherit;--tblr-accordion-active-bg: transparent}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--tblr-accordion-btn-padding-y) var(--tblr-accordion-btn-padding-x);font-size:.875rem;color:var(--tblr-accordion-btn-color);text-align:left;background-color:var(--tblr-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--tblr-accordion-transition)}@media (prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--tblr-accordion-active-color);background-color:var(--tblr-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--tblr-accordion-border-width)) 0 var(--tblr-accordion-border-color)}.accordion-button:not(.collapsed):after{background-image:var(--tblr-accordion-btn-active-icon);transform:var(--tblr-accordion-btn-icon-transform)}.accordion-button:after{flex-shrink:0;width:var(--tblr-accordion-btn-icon-width);height:var(--tblr-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--tblr-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--tblr-accordion-btn-icon-width);transition:var(--tblr-accordion-btn-icon-transition)}@media (prefers-reduced-motion: reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;outline:0;box-shadow:var(--tblr-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--tblr-accordion-color);background-color:var(--tblr-accordion-bg);border:var(--tblr-accordion-border-width) solid var(--tblr-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--tblr-accordion-border-radius);border-top-right-radius:var(--tblr-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--tblr-accordion-inner-border-radius);border-top-right-radius:var(--tblr-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--tblr-accordion-border-radius);border-bottom-left-radius:var(--tblr-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--tblr-accordion-inner-border-radius);border-bottom-left-radius:var(--tblr-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--tblr-accordion-border-radius);border-bottom-left-radius:var(--tblr-accordion-border-radius)}.accordion-body{padding:var(--tblr-accordion-body-padding-y) var(--tblr-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}.accordion-flush>.accordion-item>.accordion-collapse{border-radius:0}[data-bs-theme=dark] .accordion-button:after{--tblr-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236698ca'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--tblr-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236698ca'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--tblr-breadcrumb-padding-x: 0;--tblr-breadcrumb-padding-y: 0;--tblr-breadcrumb-margin-bottom: 1rem;--tblr-breadcrumb-bg: ;--tblr-breadcrumb-border-radius: ;--tblr-breadcrumb-divider-color: var(--tblr-secondary);--tblr-breadcrumb-item-padding-x: .5rem;--tblr-breadcrumb-item-active-color: inherit;display:flex;flex-wrap:wrap;padding:var(--tblr-breadcrumb-padding-y) var(--tblr-breadcrumb-padding-x);margin-bottom:var(--tblr-breadcrumb-margin-bottom);font-size:var(--tblr-breadcrumb-font-size);list-style:none;background-color:var(--tblr-breadcrumb-bg);border-radius:var(--tblr-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--tblr-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:var(--tblr-breadcrumb-item-padding-x);color:var(--tblr-breadcrumb-divider-color);content:var(--tblr-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--tblr-breadcrumb-item-active-color)}.pagination{--tblr-pagination-padding-x: .25rem;--tblr-pagination-padding-y: .25rem;--tblr-pagination-font-size: .875rem;--tblr-pagination-color: var(--tblr-secondary);--tblr-pagination-bg: transparent;--tblr-pagination-border-width: 0;--tblr-pagination-border-color: var(--tblr-border-color);--tblr-pagination-border-radius: var(--tblr-border-radius);--tblr-pagination-hover-color: var(--tblr-link-hover-color);--tblr-pagination-hover-bg: var(--tblr-tertiary-bg);--tblr-pagination-hover-border-color: var(--tblr-border-color);--tblr-pagination-focus-color: var(--tblr-link-hover-color);--tblr-pagination-focus-bg: var(--tblr-secondary-bg);--tblr-pagination-focus-box-shadow: 0 0 0 .25rem rgba(var(--tblr-primary-rgb), .25);--tblr-pagination-active-color: #ffffff;--tblr-pagination-active-bg: var(--tblr-primary);--tblr-pagination-active-border-color: var(--tblr-primary);--tblr-pagination-disabled-color: var(--tblr-disabled-color);--tblr-pagination-disabled-bg: transparent;--tblr-pagination-disabled-border-color: var(--tblr-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--tblr-pagination-padding-y) var(--tblr-pagination-padding-x);font-size:var(--tblr-pagination-font-size);color:var(--tblr-pagination-color);background-color:var(--tblr-pagination-bg);border:var(--tblr-pagination-border-width) solid var(--tblr-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--tblr-pagination-hover-color);text-decoration:none;background-color:var(--tblr-pagination-hover-bg);border-color:var(--tblr-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--tblr-pagination-focus-color);background-color:var(--tblr-pagination-focus-bg);outline:0;box-shadow:var(--tblr-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--tblr-pagination-active-color);background-color:var(--tblr-pagination-active-bg);border-color:var(--tblr-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--tblr-pagination-disabled-color);pointer-events:none;background-color:var(--tblr-pagination-disabled-bg);border-color:var(--tblr-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:-0}.page-item:first-child .page-link{border-top-left-radius:var(--tblr-pagination-border-radius);border-bottom-left-radius:var(--tblr-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--tblr-pagination-border-radius);border-bottom-right-radius:var(--tblr-pagination-border-radius)}.pagination-lg{--tblr-pagination-padding-x: 1.5rem;--tblr-pagination-padding-y: .75rem;--tblr-pagination-font-size: 1.09375rem;--tblr-pagination-border-radius: var(--tblr-border-radius-lg)}.pagination-sm{--tblr-pagination-padding-x: .5rem;--tblr-pagination-padding-y: .25rem;--tblr-pagination-font-size: .765625rem;--tblr-pagination-border-radius: var(--tblr-border-radius-sm)}.badge{--tblr-badge-padding-x: .5em;--tblr-badge-padding-y: .25em;--tblr-badge-font-size: 85.714285%;--tblr-badge-font-weight: var(--tblr-font-weight-medium);--tblr-badge-color: var(--tblr-secondary);--tblr-badge-border-radius: var(--tblr-border-radius);display:inline-block;padding:var(--tblr-badge-padding-y) var(--tblr-badge-padding-x);font-size:var(--tblr-badge-font-size);font-weight:var(--tblr-badge-font-weight);line-height:1;color:var(--tblr-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--tblr-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--tblr-alert-bg: transparent;--tblr-alert-padding-x: 1rem;--tblr-alert-padding-y: .75rem;--tblr-alert-margin-bottom: 1rem;--tblr-alert-color: inherit;--tblr-alert-border-color: transparent;--tblr-alert-border: var(--tblr-border-width) solid var(--tblr-alert-border-color);--tblr-alert-border-radius: var(--tblr-border-radius);--tblr-alert-link-color: inherit;position:relative;padding:var(--tblr-alert-padding-y) var(--tblr-alert-padding-x);margin-bottom:var(--tblr-alert-margin-bottom);color:var(--tblr-alert-color);background-color:var(--tblr-alert-bg);border:var(--tblr-alert-border);border-radius:var(--tblr-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:var(--tblr-font-weight-bold);color:var(--tblr-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:.9375rem 1rem}.alert-primary{--tblr-alert-color: var(--tblr-primary-text-emphasis);--tblr-alert-bg: var(--tblr-primary-bg-subtle);--tblr-alert-border-color: var(--tblr-primary-border-subtle);--tblr-alert-link-color: var(--tblr-primary-text-emphasis)}.alert-secondary{--tblr-alert-color: var(--tblr-secondary-text-emphasis);--tblr-alert-bg: var(--tblr-secondary-bg-subtle);--tblr-alert-border-color: var(--tblr-secondary-border-subtle);--tblr-alert-link-color: var(--tblr-secondary-text-emphasis)}.alert-success{--tblr-alert-color: var(--tblr-success-text-emphasis);--tblr-alert-bg: var(--tblr-success-bg-subtle);--tblr-alert-border-color: var(--tblr-success-border-subtle);--tblr-alert-link-color: var(--tblr-success-text-emphasis)}.alert-info{--tblr-alert-color: var(--tblr-info-text-emphasis);--tblr-alert-bg: var(--tblr-info-bg-subtle);--tblr-alert-border-color: var(--tblr-info-border-subtle);--tblr-alert-link-color: var(--tblr-info-text-emphasis)}.alert-warning{--tblr-alert-color: var(--tblr-warning-text-emphasis);--tblr-alert-bg: var(--tblr-warning-bg-subtle);--tblr-alert-border-color: var(--tblr-warning-border-subtle);--tblr-alert-link-color: var(--tblr-warning-text-emphasis)}.alert-danger{--tblr-alert-color: var(--tblr-danger-text-emphasis);--tblr-alert-bg: var(--tblr-danger-bg-subtle);--tblr-alert-border-color: var(--tblr-danger-border-subtle);--tblr-alert-link-color: var(--tblr-danger-text-emphasis)}.alert-light{--tblr-alert-color: var(--tblr-light-text-emphasis);--tblr-alert-bg: var(--tblr-light-bg-subtle);--tblr-alert-border-color: var(--tblr-light-border-subtle);--tblr-alert-link-color: var(--tblr-light-text-emphasis)}.alert-dark{--tblr-alert-color: var(--tblr-dark-text-emphasis);--tblr-alert-bg: var(--tblr-dark-bg-subtle);--tblr-alert-border-color: var(--tblr-dark-border-subtle);--tblr-alert-link-color: var(--tblr-dark-text-emphasis)}.alert-muted{--tblr-alert-color: var(--tblr-muted-text-emphasis);--tblr-alert-bg: var(--tblr-muted-bg-subtle);--tblr-alert-border-color: var(--tblr-muted-border-subtle);--tblr-alert-link-color: var(--tblr-muted-text-emphasis)}.alert-blue{--tblr-alert-color: var(--tblr-blue-text-emphasis);--tblr-alert-bg: var(--tblr-blue-bg-subtle);--tblr-alert-border-color: var(--tblr-blue-border-subtle);--tblr-alert-link-color: var(--tblr-blue-text-emphasis)}.alert-azure{--tblr-alert-color: var(--tblr-azure-text-emphasis);--tblr-alert-bg: var(--tblr-azure-bg-subtle);--tblr-alert-border-color: var(--tblr-azure-border-subtle);--tblr-alert-link-color: var(--tblr-azure-text-emphasis)}.alert-indigo{--tblr-alert-color: var(--tblr-indigo-text-emphasis);--tblr-alert-bg: var(--tblr-indigo-bg-subtle);--tblr-alert-border-color: var(--tblr-indigo-border-subtle);--tblr-alert-link-color: var(--tblr-indigo-text-emphasis)}.alert-purple{--tblr-alert-color: var(--tblr-purple-text-emphasis);--tblr-alert-bg: var(--tblr-purple-bg-subtle);--tblr-alert-border-color: var(--tblr-purple-border-subtle);--tblr-alert-link-color: var(--tblr-purple-text-emphasis)}.alert-pink{--tblr-alert-color: var(--tblr-pink-text-emphasis);--tblr-alert-bg: var(--tblr-pink-bg-subtle);--tblr-alert-border-color: var(--tblr-pink-border-subtle);--tblr-alert-link-color: var(--tblr-pink-text-emphasis)}.alert-red{--tblr-alert-color: var(--tblr-red-text-emphasis);--tblr-alert-bg: var(--tblr-red-bg-subtle);--tblr-alert-border-color: var(--tblr-red-border-subtle);--tblr-alert-link-color: var(--tblr-red-text-emphasis)}.alert-orange{--tblr-alert-color: var(--tblr-orange-text-emphasis);--tblr-alert-bg: var(--tblr-orange-bg-subtle);--tblr-alert-border-color: var(--tblr-orange-border-subtle);--tblr-alert-link-color: var(--tblr-orange-text-emphasis)}.alert-yellow{--tblr-alert-color: var(--tblr-yellow-text-emphasis);--tblr-alert-bg: var(--tblr-yellow-bg-subtle);--tblr-alert-border-color: var(--tblr-yellow-border-subtle);--tblr-alert-link-color: var(--tblr-yellow-text-emphasis)}.alert-lime{--tblr-alert-color: var(--tblr-lime-text-emphasis);--tblr-alert-bg: var(--tblr-lime-bg-subtle);--tblr-alert-border-color: var(--tblr-lime-border-subtle);--tblr-alert-link-color: var(--tblr-lime-text-emphasis)}.alert-green{--tblr-alert-color: var(--tblr-green-text-emphasis);--tblr-alert-bg: var(--tblr-green-bg-subtle);--tblr-alert-border-color: var(--tblr-green-border-subtle);--tblr-alert-link-color: var(--tblr-green-text-emphasis)}.alert-teal{--tblr-alert-color: var(--tblr-teal-text-emphasis);--tblr-alert-bg: var(--tblr-teal-bg-subtle);--tblr-alert-border-color: var(--tblr-teal-border-subtle);--tblr-alert-link-color: var(--tblr-teal-text-emphasis)}.alert-cyan{--tblr-alert-color: var(--tblr-cyan-text-emphasis);--tblr-alert-bg: var(--tblr-cyan-bg-subtle);--tblr-alert-border-color: var(--tblr-cyan-border-subtle);--tblr-alert-link-color: var(--tblr-cyan-text-emphasis)}.alert-facebook{--tblr-alert-color: var(--tblr-facebook-text-emphasis);--tblr-alert-bg: var(--tblr-facebook-bg-subtle);--tblr-alert-border-color: var(--tblr-facebook-border-subtle);--tblr-alert-link-color: var(--tblr-facebook-text-emphasis)}.alert-twitter{--tblr-alert-color: var(--tblr-twitter-text-emphasis);--tblr-alert-bg: var(--tblr-twitter-bg-subtle);--tblr-alert-border-color: var(--tblr-twitter-border-subtle);--tblr-alert-link-color: var(--tblr-twitter-text-emphasis)}.alert-linkedin{--tblr-alert-color: var(--tblr-linkedin-text-emphasis);--tblr-alert-bg: var(--tblr-linkedin-bg-subtle);--tblr-alert-border-color: var(--tblr-linkedin-border-subtle);--tblr-alert-link-color: var(--tblr-linkedin-text-emphasis)}.alert-google{--tblr-alert-color: var(--tblr-google-text-emphasis);--tblr-alert-bg: var(--tblr-google-bg-subtle);--tblr-alert-border-color: var(--tblr-google-border-subtle);--tblr-alert-link-color: var(--tblr-google-text-emphasis)}.alert-youtube{--tblr-alert-color: var(--tblr-youtube-text-emphasis);--tblr-alert-bg: var(--tblr-youtube-bg-subtle);--tblr-alert-border-color: var(--tblr-youtube-border-subtle);--tblr-alert-link-color: var(--tblr-youtube-text-emphasis)}.alert-vimeo{--tblr-alert-color: var(--tblr-vimeo-text-emphasis);--tblr-alert-bg: var(--tblr-vimeo-bg-subtle);--tblr-alert-border-color: var(--tblr-vimeo-border-subtle);--tblr-alert-link-color: var(--tblr-vimeo-text-emphasis)}.alert-dribbble{--tblr-alert-color: var(--tblr-dribbble-text-emphasis);--tblr-alert-bg: var(--tblr-dribbble-bg-subtle);--tblr-alert-border-color: var(--tblr-dribbble-border-subtle);--tblr-alert-link-color: var(--tblr-dribbble-text-emphasis)}.alert-github{--tblr-alert-color: var(--tblr-github-text-emphasis);--tblr-alert-bg: var(--tblr-github-bg-subtle);--tblr-alert-border-color: var(--tblr-github-border-subtle);--tblr-alert-link-color: var(--tblr-github-text-emphasis)}.alert-instagram{--tblr-alert-color: var(--tblr-instagram-text-emphasis);--tblr-alert-bg: var(--tblr-instagram-bg-subtle);--tblr-alert-border-color: var(--tblr-instagram-border-subtle);--tblr-alert-link-color: var(--tblr-instagram-text-emphasis)}.alert-pinterest{--tblr-alert-color: var(--tblr-pinterest-text-emphasis);--tblr-alert-bg: var(--tblr-pinterest-bg-subtle);--tblr-alert-border-color: var(--tblr-pinterest-border-subtle);--tblr-alert-link-color: var(--tblr-pinterest-text-emphasis)}.alert-vk{--tblr-alert-color: var(--tblr-vk-text-emphasis);--tblr-alert-bg: var(--tblr-vk-bg-subtle);--tblr-alert-border-color: var(--tblr-vk-border-subtle);--tblr-alert-link-color: var(--tblr-vk-text-emphasis)}.alert-rss{--tblr-alert-color: var(--tblr-rss-text-emphasis);--tblr-alert-bg: var(--tblr-rss-bg-subtle);--tblr-alert-border-color: var(--tblr-rss-border-subtle);--tblr-alert-link-color: var(--tblr-rss-text-emphasis)}.alert-flickr{--tblr-alert-color: var(--tblr-flickr-text-emphasis);--tblr-alert-bg: var(--tblr-flickr-bg-subtle);--tblr-alert-border-color: var(--tblr-flickr-border-subtle);--tblr-alert-link-color: var(--tblr-flickr-text-emphasis)}.alert-bitbucket{--tblr-alert-color: var(--tblr-bitbucket-text-emphasis);--tblr-alert-bg: var(--tblr-bitbucket-bg-subtle);--tblr-alert-border-color: var(--tblr-bitbucket-border-subtle);--tblr-alert-link-color: var(--tblr-bitbucket-text-emphasis)}.alert-tabler{--tblr-alert-color: var(--tblr-tabler-text-emphasis);--tblr-alert-bg: var(--tblr-tabler-bg-subtle);--tblr-alert-border-color: var(--tblr-tabler-border-subtle);--tblr-alert-link-color: var(--tblr-tabler-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress,.progress-stacked{--tblr-progress-height: .5rem;--tblr-progress-font-size: .65625rem;--tblr-progress-bg: var(--tblr-border-color);--tblr-progress-border-radius: var(--tblr-border-radius);--tblr-progress-box-shadow: var(--tblr-box-shadow-inset);--tblr-progress-bar-color: #ffffff;--tblr-progress-bar-bg: var(--tblr-primary);--tblr-progress-bar-transition: width .6s ease;display:flex;height:var(--tblr-progress-height);overflow:hidden;font-size:var(--tblr-progress-font-size);background-color:var(--tblr-progress-bg);border-radius:var(--tblr-progress-border-radius);box-shadow:var(--tblr-progress-box-shadow)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--tblr-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--tblr-progress-bar-bg);transition:var(--tblr-progress-bar-transition)}@media (prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--tblr-progress-height) var(--tblr-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--tblr-list-group-color: var(--tblr-body-color);--tblr-list-group-bg: inherit;--tblr-list-group-border-color: var(--tblr-border-color);--tblr-list-group-border-width: var(--tblr-border-width);--tblr-list-group-border-radius: var(--tblr-border-radius);--tblr-list-group-item-padding-x: 1.25rem;--tblr-list-group-item-padding-y: 1.25rem;--tblr-list-group-action-color: inherit;--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: rgba(var(--tblr-secondary-rgb), .08);--tblr-list-group-action-active-color: var(--tblr-body-color);--tblr-list-group-action-active-bg: var(--tblr-secondary-bg);--tblr-list-group-disabled-color: var(--tblr-secondary-color);--tblr-list-group-disabled-bg: inherit;--tblr-list-group-active-color: inherit;--tblr-list-group-active-bg: var(--tblr-active-bg);--tblr-list-group-active-border-color: var(--tblr-border-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--tblr-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item:before{content:counters(section,".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--tblr-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--tblr-list-group-action-hover-color);text-decoration:none;background-color:var(--tblr-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--tblr-list-group-action-active-color);background-color:var(--tblr-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--tblr-list-group-item-padding-y) var(--tblr-list-group-item-padding-x);color:var(--tblr-list-group-color);background-color:var(--tblr-list-group-bg);border:var(--tblr-list-group-border-width) solid var(--tblr-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--tblr-list-group-disabled-color);pointer-events:none;background-color:var(--tblr-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--tblr-list-group-active-color);background-color:var(--tblr-list-group-active-bg);border-color:var(--tblr-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--tblr-list-group-border-width));border-top-width:var(--tblr-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media (min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--tblr-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--tblr-list-group-color: var(--tblr-primary-text-emphasis);--tblr-list-group-bg: var(--tblr-primary-bg-subtle);--tblr-list-group-border-color: var(--tblr-primary-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-primary-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-primary-border-subtle);--tblr-list-group-active-color: var(--tblr-primary-bg-subtle);--tblr-list-group-active-bg: var(--tblr-primary-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-primary-text-emphasis)}.list-group-item-secondary{--tblr-list-group-color: var(--tblr-secondary-text-emphasis);--tblr-list-group-bg: var(--tblr-secondary-bg-subtle);--tblr-list-group-border-color: var(--tblr-secondary-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-secondary-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-secondary-border-subtle);--tblr-list-group-active-color: var(--tblr-secondary-bg-subtle);--tblr-list-group-active-bg: var(--tblr-secondary-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-secondary-text-emphasis)}.list-group-item-success{--tblr-list-group-color: var(--tblr-success-text-emphasis);--tblr-list-group-bg: var(--tblr-success-bg-subtle);--tblr-list-group-border-color: var(--tblr-success-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-success-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-success-border-subtle);--tblr-list-group-active-color: var(--tblr-success-bg-subtle);--tblr-list-group-active-bg: var(--tblr-success-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-success-text-emphasis)}.list-group-item-info{--tblr-list-group-color: var(--tblr-info-text-emphasis);--tblr-list-group-bg: var(--tblr-info-bg-subtle);--tblr-list-group-border-color: var(--tblr-info-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-info-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-info-border-subtle);--tblr-list-group-active-color: var(--tblr-info-bg-subtle);--tblr-list-group-active-bg: var(--tblr-info-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-info-text-emphasis)}.list-group-item-warning{--tblr-list-group-color: var(--tblr-warning-text-emphasis);--tblr-list-group-bg: var(--tblr-warning-bg-subtle);--tblr-list-group-border-color: var(--tblr-warning-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-warning-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-warning-border-subtle);--tblr-list-group-active-color: var(--tblr-warning-bg-subtle);--tblr-list-group-active-bg: var(--tblr-warning-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-warning-text-emphasis)}.list-group-item-danger{--tblr-list-group-color: var(--tblr-danger-text-emphasis);--tblr-list-group-bg: var(--tblr-danger-bg-subtle);--tblr-list-group-border-color: var(--tblr-danger-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-danger-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-danger-border-subtle);--tblr-list-group-active-color: var(--tblr-danger-bg-subtle);--tblr-list-group-active-bg: var(--tblr-danger-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-danger-text-emphasis)}.list-group-item-light{--tblr-list-group-color: var(--tblr-light-text-emphasis);--tblr-list-group-bg: var(--tblr-light-bg-subtle);--tblr-list-group-border-color: var(--tblr-light-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-light-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-light-border-subtle);--tblr-list-group-active-color: var(--tblr-light-bg-subtle);--tblr-list-group-active-bg: var(--tblr-light-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-light-text-emphasis)}.list-group-item-dark{--tblr-list-group-color: var(--tblr-dark-text-emphasis);--tblr-list-group-bg: var(--tblr-dark-bg-subtle);--tblr-list-group-border-color: var(--tblr-dark-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-dark-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-dark-border-subtle);--tblr-list-group-active-color: var(--tblr-dark-bg-subtle);--tblr-list-group-active-bg: var(--tblr-dark-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-dark-text-emphasis)}.list-group-item-muted{--tblr-list-group-color: var(--tblr-muted-text-emphasis);--tblr-list-group-bg: var(--tblr-muted-bg-subtle);--tblr-list-group-border-color: var(--tblr-muted-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-muted-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-muted-border-subtle);--tblr-list-group-active-color: var(--tblr-muted-bg-subtle);--tblr-list-group-active-bg: var(--tblr-muted-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-muted-text-emphasis)}.list-group-item-blue{--tblr-list-group-color: var(--tblr-blue-text-emphasis);--tblr-list-group-bg: var(--tblr-blue-bg-subtle);--tblr-list-group-border-color: var(--tblr-blue-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-blue-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-blue-border-subtle);--tblr-list-group-active-color: var(--tblr-blue-bg-subtle);--tblr-list-group-active-bg: var(--tblr-blue-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-blue-text-emphasis)}.list-group-item-azure{--tblr-list-group-color: var(--tblr-azure-text-emphasis);--tblr-list-group-bg: var(--tblr-azure-bg-subtle);--tblr-list-group-border-color: var(--tblr-azure-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-azure-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-azure-border-subtle);--tblr-list-group-active-color: var(--tblr-azure-bg-subtle);--tblr-list-group-active-bg: var(--tblr-azure-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-azure-text-emphasis)}.list-group-item-indigo{--tblr-list-group-color: var(--tblr-indigo-text-emphasis);--tblr-list-group-bg: var(--tblr-indigo-bg-subtle);--tblr-list-group-border-color: var(--tblr-indigo-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-indigo-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-indigo-border-subtle);--tblr-list-group-active-color: var(--tblr-indigo-bg-subtle);--tblr-list-group-active-bg: var(--tblr-indigo-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-indigo-text-emphasis)}.list-group-item-purple{--tblr-list-group-color: var(--tblr-purple-text-emphasis);--tblr-list-group-bg: var(--tblr-purple-bg-subtle);--tblr-list-group-border-color: var(--tblr-purple-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-purple-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-purple-border-subtle);--tblr-list-group-active-color: var(--tblr-purple-bg-subtle);--tblr-list-group-active-bg: var(--tblr-purple-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-purple-text-emphasis)}.list-group-item-pink{--tblr-list-group-color: var(--tblr-pink-text-emphasis);--tblr-list-group-bg: var(--tblr-pink-bg-subtle);--tblr-list-group-border-color: var(--tblr-pink-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-pink-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-pink-border-subtle);--tblr-list-group-active-color: var(--tblr-pink-bg-subtle);--tblr-list-group-active-bg: var(--tblr-pink-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-pink-text-emphasis)}.list-group-item-red{--tblr-list-group-color: var(--tblr-red-text-emphasis);--tblr-list-group-bg: var(--tblr-red-bg-subtle);--tblr-list-group-border-color: var(--tblr-red-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-red-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-red-border-subtle);--tblr-list-group-active-color: var(--tblr-red-bg-subtle);--tblr-list-group-active-bg: var(--tblr-red-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-red-text-emphasis)}.list-group-item-orange{--tblr-list-group-color: var(--tblr-orange-text-emphasis);--tblr-list-group-bg: var(--tblr-orange-bg-subtle);--tblr-list-group-border-color: var(--tblr-orange-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-orange-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-orange-border-subtle);--tblr-list-group-active-color: var(--tblr-orange-bg-subtle);--tblr-list-group-active-bg: var(--tblr-orange-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-orange-text-emphasis)}.list-group-item-yellow{--tblr-list-group-color: var(--tblr-yellow-text-emphasis);--tblr-list-group-bg: var(--tblr-yellow-bg-subtle);--tblr-list-group-border-color: var(--tblr-yellow-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-yellow-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-yellow-border-subtle);--tblr-list-group-active-color: var(--tblr-yellow-bg-subtle);--tblr-list-group-active-bg: var(--tblr-yellow-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-yellow-text-emphasis)}.list-group-item-lime{--tblr-list-group-color: var(--tblr-lime-text-emphasis);--tblr-list-group-bg: var(--tblr-lime-bg-subtle);--tblr-list-group-border-color: var(--tblr-lime-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-lime-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-lime-border-subtle);--tblr-list-group-active-color: var(--tblr-lime-bg-subtle);--tblr-list-group-active-bg: var(--tblr-lime-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-lime-text-emphasis)}.list-group-item-green{--tblr-list-group-color: var(--tblr-green-text-emphasis);--tblr-list-group-bg: var(--tblr-green-bg-subtle);--tblr-list-group-border-color: var(--tblr-green-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-green-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-green-border-subtle);--tblr-list-group-active-color: var(--tblr-green-bg-subtle);--tblr-list-group-active-bg: var(--tblr-green-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-green-text-emphasis)}.list-group-item-teal{--tblr-list-group-color: var(--tblr-teal-text-emphasis);--tblr-list-group-bg: var(--tblr-teal-bg-subtle);--tblr-list-group-border-color: var(--tblr-teal-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-teal-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-teal-border-subtle);--tblr-list-group-active-color: var(--tblr-teal-bg-subtle);--tblr-list-group-active-bg: var(--tblr-teal-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-teal-text-emphasis)}.list-group-item-cyan{--tblr-list-group-color: var(--tblr-cyan-text-emphasis);--tblr-list-group-bg: var(--tblr-cyan-bg-subtle);--tblr-list-group-border-color: var(--tblr-cyan-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-cyan-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-cyan-border-subtle);--tblr-list-group-active-color: var(--tblr-cyan-bg-subtle);--tblr-list-group-active-bg: var(--tblr-cyan-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-cyan-text-emphasis)}.list-group-item-facebook{--tblr-list-group-color: var(--tblr-facebook-text-emphasis);--tblr-list-group-bg: var(--tblr-facebook-bg-subtle);--tblr-list-group-border-color: var(--tblr-facebook-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-facebook-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-facebook-border-subtle);--tblr-list-group-active-color: var(--tblr-facebook-bg-subtle);--tblr-list-group-active-bg: var(--tblr-facebook-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-facebook-text-emphasis)}.list-group-item-twitter{--tblr-list-group-color: var(--tblr-twitter-text-emphasis);--tblr-list-group-bg: var(--tblr-twitter-bg-subtle);--tblr-list-group-border-color: var(--tblr-twitter-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-twitter-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-twitter-border-subtle);--tblr-list-group-active-color: var(--tblr-twitter-bg-subtle);--tblr-list-group-active-bg: var(--tblr-twitter-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-twitter-text-emphasis)}.list-group-item-linkedin{--tblr-list-group-color: var(--tblr-linkedin-text-emphasis);--tblr-list-group-bg: var(--tblr-linkedin-bg-subtle);--tblr-list-group-border-color: var(--tblr-linkedin-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-linkedin-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-linkedin-border-subtle);--tblr-list-group-active-color: var(--tblr-linkedin-bg-subtle);--tblr-list-group-active-bg: var(--tblr-linkedin-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-linkedin-text-emphasis)}.list-group-item-google{--tblr-list-group-color: var(--tblr-google-text-emphasis);--tblr-list-group-bg: var(--tblr-google-bg-subtle);--tblr-list-group-border-color: var(--tblr-google-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-google-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-google-border-subtle);--tblr-list-group-active-color: var(--tblr-google-bg-subtle);--tblr-list-group-active-bg: var(--tblr-google-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-google-text-emphasis)}.list-group-item-youtube{--tblr-list-group-color: var(--tblr-youtube-text-emphasis);--tblr-list-group-bg: var(--tblr-youtube-bg-subtle);--tblr-list-group-border-color: var(--tblr-youtube-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-youtube-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-youtube-border-subtle);--tblr-list-group-active-color: var(--tblr-youtube-bg-subtle);--tblr-list-group-active-bg: var(--tblr-youtube-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-youtube-text-emphasis)}.list-group-item-vimeo{--tblr-list-group-color: var(--tblr-vimeo-text-emphasis);--tblr-list-group-bg: var(--tblr-vimeo-bg-subtle);--tblr-list-group-border-color: var(--tblr-vimeo-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-vimeo-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-vimeo-border-subtle);--tblr-list-group-active-color: var(--tblr-vimeo-bg-subtle);--tblr-list-group-active-bg: var(--tblr-vimeo-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-vimeo-text-emphasis)}.list-group-item-dribbble{--tblr-list-group-color: var(--tblr-dribbble-text-emphasis);--tblr-list-group-bg: var(--tblr-dribbble-bg-subtle);--tblr-list-group-border-color: var(--tblr-dribbble-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-dribbble-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-dribbble-border-subtle);--tblr-list-group-active-color: var(--tblr-dribbble-bg-subtle);--tblr-list-group-active-bg: var(--tblr-dribbble-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-dribbble-text-emphasis)}.list-group-item-github{--tblr-list-group-color: var(--tblr-github-text-emphasis);--tblr-list-group-bg: var(--tblr-github-bg-subtle);--tblr-list-group-border-color: var(--tblr-github-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-github-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-github-border-subtle);--tblr-list-group-active-color: var(--tblr-github-bg-subtle);--tblr-list-group-active-bg: var(--tblr-github-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-github-text-emphasis)}.list-group-item-instagram{--tblr-list-group-color: var(--tblr-instagram-text-emphasis);--tblr-list-group-bg: var(--tblr-instagram-bg-subtle);--tblr-list-group-border-color: var(--tblr-instagram-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-instagram-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-instagram-border-subtle);--tblr-list-group-active-color: var(--tblr-instagram-bg-subtle);--tblr-list-group-active-bg: var(--tblr-instagram-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-instagram-text-emphasis)}.list-group-item-pinterest{--tblr-list-group-color: var(--tblr-pinterest-text-emphasis);--tblr-list-group-bg: var(--tblr-pinterest-bg-subtle);--tblr-list-group-border-color: var(--tblr-pinterest-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-pinterest-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-pinterest-border-subtle);--tblr-list-group-active-color: var(--tblr-pinterest-bg-subtle);--tblr-list-group-active-bg: var(--tblr-pinterest-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-pinterest-text-emphasis)}.list-group-item-vk{--tblr-list-group-color: var(--tblr-vk-text-emphasis);--tblr-list-group-bg: var(--tblr-vk-bg-subtle);--tblr-list-group-border-color: var(--tblr-vk-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-vk-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-vk-border-subtle);--tblr-list-group-active-color: var(--tblr-vk-bg-subtle);--tblr-list-group-active-bg: var(--tblr-vk-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-vk-text-emphasis)}.list-group-item-rss{--tblr-list-group-color: var(--tblr-rss-text-emphasis);--tblr-list-group-bg: var(--tblr-rss-bg-subtle);--tblr-list-group-border-color: var(--tblr-rss-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-rss-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-rss-border-subtle);--tblr-list-group-active-color: var(--tblr-rss-bg-subtle);--tblr-list-group-active-bg: var(--tblr-rss-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-rss-text-emphasis)}.list-group-item-flickr{--tblr-list-group-color: var(--tblr-flickr-text-emphasis);--tblr-list-group-bg: var(--tblr-flickr-bg-subtle);--tblr-list-group-border-color: var(--tblr-flickr-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-flickr-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-flickr-border-subtle);--tblr-list-group-active-color: var(--tblr-flickr-bg-subtle);--tblr-list-group-active-bg: var(--tblr-flickr-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-flickr-text-emphasis)}.list-group-item-bitbucket{--tblr-list-group-color: var(--tblr-bitbucket-text-emphasis);--tblr-list-group-bg: var(--tblr-bitbucket-bg-subtle);--tblr-list-group-border-color: var(--tblr-bitbucket-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-bitbucket-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-bitbucket-border-subtle);--tblr-list-group-active-color: var(--tblr-bitbucket-bg-subtle);--tblr-list-group-active-bg: var(--tblr-bitbucket-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-bitbucket-text-emphasis)}.list-group-item-tabler{--tblr-list-group-color: var(--tblr-tabler-text-emphasis);--tblr-list-group-bg: var(--tblr-tabler-bg-subtle);--tblr-list-group-border-color: var(--tblr-tabler-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-tabler-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-tabler-border-subtle);--tblr-list-group-active-color: var(--tblr-tabler-bg-subtle);--tblr-list-group-active-bg: var(--tblr-tabler-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-tabler-text-emphasis)}.btn-close{--tblr-btn-close-color: #182433;--tblr-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23182433'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--tblr-btn-close-opacity: .4;--tblr-btn-close-hover-opacity: .75;--tblr-btn-close-focus-shadow: 0 0 0 .25rem rgba(var(--tblr-primary-rgb), .25);--tblr-btn-close-focus-opacity: 1;--tblr-btn-close-disabled-opacity: .25;--tblr-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em;color:var(--tblr-btn-close-color);background:transparent var(--tblr-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:4px;opacity:var(--tblr-btn-close-opacity)}.btn-close:hover{color:var(--tblr-btn-close-color);text-decoration:none;opacity:var(--tblr-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--tblr-btn-close-focus-shadow);opacity:var(--tblr-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:var(--tblr-btn-close-disabled-opacity)}.btn-close-white,[data-bs-theme=dark] .btn-close,body[data-bs-theme=dark] [data-bs-theme=light] .btn-close{filter:var(--tblr-btn-close-white-filter)}.toast{--tblr-toast-zindex: 1090;--tblr-toast-padding-x: .75rem;--tblr-toast-padding-y: .5rem;--tblr-toast-spacing: calc(var(--tblr-page-padding) * 2);--tblr-toast-max-width: 350px;--tblr-toast-font-size: .875rem;--tblr-toast-color: ;--tblr-toast-bg: rgba(var(--tblr-body-bg-rgb), .85);--tblr-toast-border-width: var(--tblr-border-width);--tblr-toast-border-color: var(--tblr-border-color);--tblr-toast-border-radius: var(--tblr-border-radius);--tblr-toast-box-shadow: var(--tblr-box-shadow);--tblr-toast-header-color: var(--tblr-secondary);--tblr-toast-header-bg: rgba(var(--tblr-body-bg-rgb), .85);--tblr-toast-header-border-color: var(--tblr-border-color);width:var(--tblr-toast-max-width);max-width:100%;font-size:var(--tblr-toast-font-size);color:var(--tblr-toast-color);pointer-events:auto;background-color:var(--tblr-toast-bg);background-clip:padding-box;border:var(--tblr-toast-border-width) solid var(--tblr-toast-border-color);box-shadow:var(--tblr-toast-box-shadow);border-radius:var(--tblr-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--tblr-toast-zindex: 1090;position:absolute;z-index:var(--tblr-toast-zindex);width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--tblr-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--tblr-toast-padding-y) var(--tblr-toast-padding-x);color:var(--tblr-toast-header-color);background-color:var(--tblr-toast-header-bg);background-clip:padding-box;border-bottom:var(--tblr-toast-border-width) solid var(--tblr-toast-header-border-color);border-top-left-radius:calc(var(--tblr-toast-border-radius) - var(--tblr-toast-border-width));border-top-right-radius:calc(var(--tblr-toast-border-radius) - var(--tblr-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--tblr-toast-padding-x));margin-left:var(--tblr-toast-padding-x)}.toast-body{padding:var(--tblr-toast-padding-x);word-wrap:break-word}.modal{--tblr-modal-zindex: 1055;--tblr-modal-width: 540px;--tblr-modal-padding: 1.5rem;--tblr-modal-margin: .5rem;--tblr-modal-color: ;--tblr-modal-bg: var(--tblr-bg-surface);--tblr-modal-border-color: transparent;--tblr-modal-border-width: var(--tblr-border-width);--tblr-modal-border-radius: var(--tblr-border-radius-lg);--tblr-modal-box-shadow: var(--tblr-box-shadow-sm);--tblr-modal-inner-border-radius: calc(var(--tblr-modal-border-radius) - 1px);--tblr-modal-header-padding-x: 1.5rem;--tblr-modal-header-padding-y: 1.5rem;--tblr-modal-header-padding: 1.5rem;--tblr-modal-header-border-color: var(--tblr-border-color);--tblr-modal-header-border-width: var(--tblr-border-width);--tblr-modal-title-line-height: 1.4285714286;--tblr-modal-footer-gap: .75rem;--tblr-modal-footer-bg: var(--tblr-bg-surface-tertiary);--tblr-modal-footer-border-color: var(--tblr-border-color);--tblr-modal-footer-border-width: var(--tblr-border-width);position:fixed;top:0;left:0;z-index:var(--tblr-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--tblr-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-1rem)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--tblr-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--tblr-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--tblr-modal-color);pointer-events:auto;background-color:var(--tblr-modal-bg);background-clip:padding-box;border:var(--tblr-modal-border-width) solid var(--tblr-modal-border-color);border-radius:var(--tblr-modal-border-radius);box-shadow:var(--tblr-modal-box-shadow);outline:0}.modal-backdrop{--tblr-backdrop-zindex: 1050;--tblr-backdrop-bg: #182433;--tblr-backdrop-opacity: .24;position:fixed;top:0;left:0;z-index:var(--tblr-backdrop-zindex);width:100vw;height:100vh;background-color:var(--tblr-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--tblr-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--tblr-modal-header-padding);border-bottom:var(--tblr-modal-header-border-width) solid var(--tblr-modal-header-border-color);border-top-left-radius:var(--tblr-modal-inner-border-radius);border-top-right-radius:var(--tblr-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--tblr-modal-header-padding-y) * .5) calc(var(--tblr-modal-header-padding-x) * .5);margin:calc(-.5 * var(--tblr-modal-header-padding-y)) calc(-.5 * var(--tblr-modal-header-padding-x)) calc(-.5 * var(--tblr-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--tblr-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--tblr-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--tblr-modal-padding) - var(--tblr-modal-footer-gap) * .5);background-color:var(--tblr-modal-footer-bg);border-top:var(--tblr-modal-footer-border-width) solid var(--tblr-modal-footer-border-color);border-bottom-right-radius:var(--tblr-modal-inner-border-radius);border-bottom-left-radius:var(--tblr-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--tblr-modal-footer-gap) * .5)}@media (min-width: 576px){.modal{--tblr-modal-margin: 1.75rem;--tblr-modal-box-shadow: var(--tblr-box-shadow)}.modal-dialog{max-width:var(--tblr-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--tblr-modal-width: 380px}}@media (min-width: 992px){.modal-lg,.modal-xl{--tblr-modal-width: 720px}}@media (min-width: 1200px){.modal-xl{--tblr-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--tblr-tooltip-zindex: 1080;--tblr-tooltip-max-width: 200px;--tblr-tooltip-padding-x: var(--tblr-spacer-2);--tblr-tooltip-padding-y: var(--tblr-spacer-2);--tblr-tooltip-margin: ;--tblr-tooltip-font-size: .765625rem;--tblr-tooltip-color: var(--tblr-light);--tblr-tooltip-bg: var(--tblr-bg-surface-dark);--tblr-tooltip-border-radius: var(--tblr-border-radius);--tblr-tooltip-opacity: .9;--tblr-tooltip-arrow-width: .8rem;--tblr-tooltip-arrow-height: .4rem;z-index:var(--tblr-tooltip-zindex);display:block;margin:var(--tblr-tooltip-margin);font-family:var(--tblr-font-sans-serif);font-style:normal;font-weight:400;line-height:1.4285714286;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--tblr-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--tblr-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--tblr-tooltip-arrow-width);height:var(--tblr-tooltip-arrow-height)}.tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1 * var(--tblr-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before{top:-1px;border-width:var(--tblr-tooltip-arrow-height) calc(var(--tblr-tooltip-arrow-width) * .5) 0;border-top-color:var(--tblr-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1 * var(--tblr-tooltip-arrow-height));width:var(--tblr-tooltip-arrow-height);height:var(--tblr-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before{right:-1px;border-width:calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height) calc(var(--tblr-tooltip-arrow-width) * .5) 0;border-right-color:var(--tblr-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1 * var(--tblr-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before{bottom:-1px;border-width:0 calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height);border-bottom-color:var(--tblr-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1 * var(--tblr-tooltip-arrow-height));width:var(--tblr-tooltip-arrow-height);height:var(--tblr-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before{left:-1px;border-width:calc(var(--tblr-tooltip-arrow-width) * .5) 0 calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height);border-left-color:var(--tblr-tooltip-bg)}.tooltip-inner{max-width:var(--tblr-tooltip-max-width);padding:var(--tblr-tooltip-padding-y) var(--tblr-tooltip-padding-x);color:var(--tblr-tooltip-color);text-align:center;background-color:var(--tblr-tooltip-bg);border-radius:var(--tblr-tooltip-border-radius)}.popover{--tblr-popover-zindex: 1070;--tblr-popover-max-width: 276px;--tblr-popover-font-size: .765625rem;--tblr-popover-bg: var(--tblr-bg-surface);--tblr-popover-border-width: var(--tblr-border-width);--tblr-popover-border-color: var(--tblr-border-color);--tblr-popover-border-radius: var(--tblr-border-radius-lg);--tblr-popover-inner-border-radius: calc(var(--tblr-border-radius-lg) - var(--tblr-border-width));--tblr-popover-box-shadow: var(--tblr-box-shadow);--tblr-popover-header-padding-x: 1rem;--tblr-popover-header-padding-y: .5rem;--tblr-popover-header-font-size: .875rem;--tblr-popover-header-color: inherit;--tblr-popover-header-bg: transparent;--tblr-popover-body-padding-x: 1rem;--tblr-popover-body-padding-y: 1rem;--tblr-popover-body-color: inherit;--tblr-popover-arrow-width: 1rem;--tblr-popover-arrow-height: .5rem;--tblr-popover-arrow-border: var(--tblr-popover-border-color);z-index:var(--tblr-popover-zindex);display:block;max-width:var(--tblr-popover-max-width);font-family:var(--tblr-font-sans-serif);font-style:normal;font-weight:400;line-height:1.4285714286;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--tblr-popover-font-size);word-wrap:break-word;background-color:var(--tblr-popover-bg);background-clip:padding-box;border:var(--tblr-popover-border-width) solid var(--tblr-popover-border-color);border-radius:var(--tblr-popover-border-radius);box-shadow:var(--tblr-popover-box-shadow)}.popover .popover-arrow{display:block;width:var(--tblr-popover-arrow-width);height:var(--tblr-popover-arrow-height)}.popover .popover-arrow:before,.popover .popover-arrow:after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width))}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{border-width:var(--tblr-popover-arrow-height) calc(var(--tblr-popover-arrow-width) * .5) 0}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before{bottom:0;border-top-color:var(--tblr-popover-arrow-border)}.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{bottom:var(--tblr-popover-border-width);border-top-color:var(--tblr-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width));width:var(--tblr-popover-arrow-height);height:var(--tblr-popover-arrow-width)}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{border-width:calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height) calc(var(--tblr-popover-arrow-width) * .5) 0}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before{left:0;border-right-color:var(--tblr-popover-arrow-border)}.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{left:var(--tblr-popover-border-width);border-right-color:var(--tblr-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width))}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{border-width:0 calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height)}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before{top:0;border-bottom-color:var(--tblr-popover-arrow-border)}.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{top:var(--tblr-popover-border-width);border-bottom-color:var(--tblr-popover-bg)}.bs-popover-bottom .popover-header:before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before{position:absolute;top:0;left:50%;display:block;width:var(--tblr-popover-arrow-width);margin-left:calc(-.5 * var(--tblr-popover-arrow-width));content:"";border-bottom:var(--tblr-popover-border-width) solid var(--tblr-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width));width:var(--tblr-popover-arrow-height);height:var(--tblr-popover-arrow-width)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{border-width:calc(var(--tblr-popover-arrow-width) * .5) 0 calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before{right:0;border-left-color:var(--tblr-popover-arrow-border)}.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{right:var(--tblr-popover-border-width);border-left-color:var(--tblr-popover-bg)}.popover-header{padding:var(--tblr-popover-header-padding-y) var(--tblr-popover-header-padding-x);margin-bottom:0;font-size:var(--tblr-popover-header-font-size);color:var(--tblr-popover-header-color);background-color:var(--tblr-popover-header-bg);border-bottom:var(--tblr-popover-border-width) solid var(--tblr-popover-border-color);border-top-left-radius:var(--tblr-popover-inner-border-radius);border-top-right-radius:var(--tblr-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--tblr-popover-body-padding-y) var(--tblr-popover-body-padding-x);color:var(--tblr-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translate(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translate(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:1.5rem;height:1.5rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='15 18 9 12 15 6'%3e%3c/polyline%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='9 18 15 12 9 6'%3e%3c/polyline%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--tblr-spinner-width);height:var(--tblr-spinner-height);vertical-align:var(--tblr-spinner-vertical-align);border-radius:50%;animation:var(--tblr-spinner-animation-speed) linear infinite var(--tblr-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--tblr-spinner-width: 1.5rem;--tblr-spinner-height: 1.5rem;--tblr-spinner-vertical-align: -.125em;--tblr-spinner-border-width: 2px;--tblr-spinner-animation-speed: .75s;--tblr-spinner-animation-name: spinner-border;border:var(--tblr-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--tblr-spinner-width: 1rem;--tblr-spinner-height: 1rem;--tblr-spinner-border-width: 1px}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--tblr-spinner-width: 1.5rem;--tblr-spinner-height: 1.5rem;--tblr-spinner-vertical-align: -.125em;--tblr-spinner-animation-speed: .75s;--tblr-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--tblr-spinner-width: 1rem;--tblr-spinner-height: 1rem}@media (prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--tblr-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--tblr-offcanvas-zindex: 1045;--tblr-offcanvas-width: 400px;--tblr-offcanvas-height: 30vh;--tblr-offcanvas-padding-x: 1.5rem;--tblr-offcanvas-padding-y: 1.5rem;--tblr-offcanvas-color: var(--tblr-body-color);--tblr-offcanvas-bg: var(--tblr-bg-surface);--tblr-offcanvas-border-width: var(--tblr-border-width);--tblr-offcanvas-border-color: var(--tblr-border-color);--tblr-offcanvas-box-shadow: var(--tblr-box-shadow-sm);--tblr-offcanvas-transition: transform .3s ease-in-out;--tblr-offcanvas-title-line-height: 1.4285714286}@media (max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media (max-width: 575.98px) and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media (max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media (min-width: 576px){.offcanvas-sm{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media (max-width: 767.98px) and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media (max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media (min-width: 768px){.offcanvas-md{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media (max-width: 991.98px) and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media (max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media (min-width: 992px){.offcanvas-lg{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media (max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media (min-width: 1200px){.offcanvas-xl{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media (max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media (min-width: 1400px){.offcanvas-xxl{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}@media (prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#182433}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.24}.offcanvas-header{display:flex;align-items:center;padding:var(--tblr-offcanvas-padding-y) var(--tblr-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--tblr-offcanvas-padding-y) * .5) calc(var(--tblr-offcanvas-padding-x) * .5);margin:calc(-.5 * var(--tblr-offcanvas-padding-y)) calc(-.5 * var(--tblr-offcanvas-padding-x)) calc(-.5 * var(--tblr-offcanvas-padding-y)) auto}.offcanvas-title{margin-bottom:0;line-height:var(--tblr-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--tblr-offcanvas-padding-y) var(--tblr-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.2}.placeholder.btn:before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.1}}.placeholder-wave{mask-image:linear-gradient(130deg,#000 55%,#000000e6,#000 95%);mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{to{mask-position:-200% 0%}}.clearfix:after{display:block;clear:both;content:""}.text-bg-primary{color:#fcfdfe!important;background-color:RGBA(var(--tblr-primary-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-secondary,.text-bg-gray{color:#fcfdfe!important;background-color:RGBA(var(--tblr-secondary-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-success{color:#fcfdfe!important;background-color:RGBA(var(--tblr-success-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-info{color:#fcfdfe!important;background-color:RGBA(var(--tblr-info-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-warning{color:#fcfdfe!important;background-color:RGBA(var(--tblr-warning-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-danger{color:#fcfdfe!important;background-color:RGBA(var(--tblr-danger-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-light,.text-bg-white{color:#182433!important;background-color:RGBA(var(--tblr-light-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-dark,.text-bg-black{color:#fcfdfe!important;background-color:RGBA(var(--tblr-dark-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-muted{color:#fcfdfe!important;background-color:RGBA(var(--tblr-muted-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-blue{color:#fcfdfe!important;background-color:RGBA(var(--tblr-blue-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-azure{color:#fcfdfe!important;background-color:RGBA(var(--tblr-azure-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-indigo{color:#fcfdfe!important;background-color:RGBA(var(--tblr-indigo-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-purple{color:#fcfdfe!important;background-color:RGBA(var(--tblr-purple-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-pink{color:#fcfdfe!important;background-color:RGBA(var(--tblr-pink-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-red{color:#fcfdfe!important;background-color:RGBA(var(--tblr-red-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-orange{color:#fcfdfe!important;background-color:RGBA(var(--tblr-orange-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-yellow{color:#fcfdfe!important;background-color:RGBA(var(--tblr-yellow-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-lime{color:#fcfdfe!important;background-color:RGBA(var(--tblr-lime-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-green{color:#fcfdfe!important;background-color:RGBA(var(--tblr-green-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-teal{color:#fcfdfe!important;background-color:RGBA(var(--tblr-teal-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-cyan{color:#fcfdfe!important;background-color:RGBA(var(--tblr-cyan-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-facebook{color:#fcfdfe!important;background-color:RGBA(var(--tblr-facebook-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-twitter{color:#fcfdfe!important;background-color:RGBA(var(--tblr-twitter-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-linkedin{color:#fcfdfe!important;background-color:RGBA(var(--tblr-linkedin-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-google{color:#fcfdfe!important;background-color:RGBA(var(--tblr-google-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-youtube{color:#fcfdfe!important;background-color:RGBA(var(--tblr-youtube-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-vimeo{color:#fcfdfe!important;background-color:RGBA(var(--tblr-vimeo-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-dribbble{color:#fcfdfe!important;background-color:RGBA(var(--tblr-dribbble-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-github{color:#fcfdfe!important;background-color:RGBA(var(--tblr-github-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-instagram{color:#fcfdfe!important;background-color:RGBA(var(--tblr-instagram-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-pinterest{color:#fcfdfe!important;background-color:RGBA(var(--tblr-pinterest-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-vk{color:#fcfdfe!important;background-color:RGBA(var(--tblr-vk-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-rss{color:#fcfdfe!important;background-color:RGBA(var(--tblr-rss-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-flickr{color:#fcfdfe!important;background-color:RGBA(var(--tblr-flickr-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-bitbucket{color:#fcfdfe!important;background-color:RGBA(var(--tblr-bitbucket-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-tabler{color:#fcfdfe!important;background-color:RGBA(var(--tblr-tabler-rgb),var(--tblr-bg-opacity, 1))!important}.link-primary{color:RGBA(var(--tblr-primary-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-primary-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-primary:hover,.link-primary:focus{color:RGBA(0,67,133,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(0,67,133,var(--tblr-link-underline-opacity, 1))!important}.link-secondary{color:RGBA(var(--tblr-secondary-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-secondary-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-secondary:hover,.link-secondary:focus{color:RGBA(82,92,104,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(82,92,104,var(--tblr-link-underline-opacity, 1))!important}.link-success{color:RGBA(var(--tblr-success-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-success-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-success:hover,.link-success:focus{color:RGBA(38,143,54,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(38,143,54,var(--tblr-link-underline-opacity, 1))!important}.link-info{color:RGBA(var(--tblr-info-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-info-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-info:hover,.link-info:focus{color:RGBA(53,122,180,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(53,122,180,var(--tblr-link-underline-opacity, 1))!important}.link-warning{color:RGBA(var(--tblr-warning-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-warning-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-warning:hover,.link-warning:focus{color:RGBA(198,82,6,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(198,82,6,var(--tblr-link-underline-opacity, 1))!important}.link-danger{color:RGBA(var(--tblr-danger-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-danger-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-danger:hover,.link-danger:focus{color:RGBA(171,46,46,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(171,46,46,var(--tblr-link-underline-opacity, 1))!important}.link-light{color:RGBA(var(--tblr-light-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-light-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-light:hover,.link-light:focus{color:RGBA(253,253,254,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(253,253,254,var(--tblr-link-underline-opacity, 1))!important}.link-dark{color:RGBA(var(--tblr-dark-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-dark-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-dark:hover,.link-dark:focus{color:RGBA(19,29,41,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(19,29,41,var(--tblr-link-underline-opacity, 1))!important}.link-muted{color:RGBA(var(--tblr-muted-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-muted-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-muted:hover,.link-muted:focus{color:RGBA(82,92,104,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(82,92,104,var(--tblr-link-underline-opacity, 1))!important}.link-blue{color:RGBA(var(--tblr-blue-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-blue-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-blue:hover,.link-blue:focus{color:RGBA(0,67,133,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(0,67,133,var(--tblr-link-underline-opacity, 1))!important}.link-azure{color:RGBA(var(--tblr-azure-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-azure-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-azure:hover,.link-azure:focus{color:RGBA(53,122,180,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(53,122,180,var(--tblr-link-underline-opacity, 1))!important}.link-indigo{color:RGBA(var(--tblr-indigo-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-indigo-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-indigo:hover,.link-indigo:focus{color:RGBA(53,79,188,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(53,79,188,var(--tblr-link-underline-opacity, 1))!important}.link-purple{color:RGBA(var(--tblr-purple-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-purple-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-purple:hover,.link-purple:focus{color:RGBA(139,50,161,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(139,50,161,var(--tblr-link-underline-opacity, 1))!important}.link-pink{color:RGBA(var(--tblr-pink-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-pink-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-pink:hover,.link-pink:focus{color:RGBA(171,41,86,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(171,41,86,var(--tblr-link-underline-opacity, 1))!important}.link-red{color:RGBA(var(--tblr-red-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-red-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-red:hover,.link-red:focus{color:RGBA(171,46,46,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(171,46,46,var(--tblr-link-underline-opacity, 1))!important}.link-orange{color:RGBA(var(--tblr-orange-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-orange-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-orange:hover,.link-orange:focus{color:RGBA(198,82,6,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(198,82,6,var(--tblr-link-underline-opacity, 1))!important}.link-yellow{color:RGBA(var(--tblr-yellow-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-yellow-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-yellow:hover,.link-yellow:focus{color:RGBA(196,127,0,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(196,127,0,var(--tblr-link-underline-opacity, 1))!important}.link-lime{color:RGBA(var(--tblr-lime-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-lime-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-lime:hover,.link-lime:focus{color:RGBA(93,147,18,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(93,147,18,var(--tblr-link-underline-opacity, 1))!important}.link-green{color:RGBA(var(--tblr-green-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-green-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-green:hover,.link-green:focus{color:RGBA(38,143,54,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(38,143,54,var(--tblr-link-underline-opacity, 1))!important}.link-teal{color:RGBA(var(--tblr-teal-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-teal-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-teal:hover,.link-teal:focus{color:RGBA(10,133,96,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(10,133,96,var(--tblr-link-underline-opacity, 1))!important}.link-cyan{color:RGBA(var(--tblr-cyan-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-cyan-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-cyan:hover,.link-cyan:focus{color:RGBA(18,130,147,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(18,130,147,var(--tblr-link-underline-opacity, 1))!important}.link-facebook{color:RGBA(var(--tblr-facebook-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-facebook-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-facebook:hover,.link-facebook:focus{color:RGBA(19,95,194,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(19,95,194,var(--tblr-link-underline-opacity, 1))!important}.link-twitter{color:RGBA(var(--tblr-twitter-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-twitter-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-twitter:hover,.link-twitter:focus{color:RGBA(23,129,194,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(23,129,194,var(--tblr-link-underline-opacity, 1))!important}.link-linkedin{color:RGBA(var(--tblr-linkedin-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-linkedin-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-linkedin:hover,.link-linkedin:focus{color:RGBA(8,82,155,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(8,82,155,var(--tblr-link-underline-opacity, 1))!important}.link-google{color:RGBA(var(--tblr-google-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-google-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-google:hover,.link-google:focus{color:RGBA(176,62,52,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(176,62,52,var(--tblr-link-underline-opacity, 1))!important}.link-youtube{color:RGBA(var(--tblr-youtube-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-youtube-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-youtube:hover,.link-youtube:focus{color:RGBA(204,0,0,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(204,0,0,var(--tblr-link-underline-opacity, 1))!important}.link-vimeo{color:RGBA(var(--tblr-vimeo-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-vimeo-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-vimeo:hover,.link-vimeo:focus{color:RGBA(21,146,187,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(21,146,187,var(--tblr-link-underline-opacity, 1))!important}.link-dribbble{color:RGBA(var(--tblr-dribbble-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-dribbble-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-dribbble:hover,.link-dribbble:focus{color:RGBA(187,61,110,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(187,61,110,var(--tblr-link-underline-opacity, 1))!important}.link-github{color:RGBA(var(--tblr-github-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-github-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-github:hover,.link-github:focus{color:RGBA(19,18,18,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(19,18,18,var(--tblr-link-underline-opacity, 1))!important}.link-instagram{color:RGBA(var(--tblr-instagram-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-instagram-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-instagram:hover,.link-instagram:focus{color:RGBA(182,51,76,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(182,51,76,var(--tblr-link-underline-opacity, 1))!important}.link-pinterest{color:RGBA(var(--tblr-pinterest-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-pinterest-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-pinterest:hover,.link-pinterest:focus{color:RGBA(151,6,22,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(151,6,22,var(--tblr-link-underline-opacity, 1))!important}.link-vk{color:RGBA(var(--tblr-vk-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-vk-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-vk:hover,.link-vk:focus{color:RGBA(79,105,134,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(79,105,134,var(--tblr-link-underline-opacity, 1))!important}.link-rss{color:RGBA(var(--tblr-rss-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-rss-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-rss:hover,.link-rss:focus{color:RGBA(204,132,0,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(204,132,0,var(--tblr-link-underline-opacity, 1))!important}.link-flickr{color:RGBA(var(--tblr-flickr-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-flickr-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-flickr:hover,.link-flickr:focus{color:RGBA(0,79,176,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(0,79,176,var(--tblr-link-underline-opacity, 1))!important}.link-bitbucket{color:RGBA(var(--tblr-bitbucket-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-bitbucket-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-bitbucket:hover,.link-bitbucket:focus{color:RGBA(0,66,163,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(0,66,163,var(--tblr-link-underline-opacity, 1))!important}.link-tabler{color:RGBA(var(--tblr-tabler-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-tabler-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-tabler:hover,.link-tabler:focus{color:RGBA(0,67,133,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(0,67,133,var(--tblr-link-underline-opacity, 1))!important}.link-body-emphasis{color:RGBA(var(--tblr-emphasis-color-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-emphasis-color-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--tblr-emphasis-color-rgb),var(--tblr-link-opacity, .75))!important;text-decoration-color:RGBA(var(--tblr-emphasis-color-rgb),var(--tblr-link-underline-opacity, .75))!important}.focus-ring:focus{outline:0;box-shadow:var(--tblr-focus-ring-x, 0) var(--tblr-focus-ring-y, 0) var(--tblr-focus-ring-blur, 0) var(--tblr-focus-ring-width) var(--tblr-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;text-decoration-color:rgba(var(--tblr-link-color-rgb),var(--tblr-link-opacity, .5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--tblr-icon-link-transform, translate3d(.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio:before{display:block;padding-top:var(--tblr-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--tblr-aspect-ratio: 100%}.ratio-2x1{--tblr-aspect-ratio: 50%}.ratio-1x2{--tblr-aspect-ratio: 200%}.ratio-3x1{--tblr-aspect-ratio: 33.3333333333%}.ratio-1x3{--tblr-aspect-ratio: 300%}.ratio-4x3{--tblr-aspect-ratio: 75%}.ratio-3x4{--tblr-aspect-ratio: 133.3333333333%}.ratio-16x9{--tblr-aspect-ratio: 56.25%}.ratio-9x16{--tblr-aspect-ratio: 177.7777777778%}.ratio-21x9{--tblr-aspect-ratio: 42.8571428571%}.ratio-9x21{--tblr-aspect-ratio: 233.3333333333%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media (min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute!important}.stretched-link:after{position:absolute;inset:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--tblr-border-width);min-height:1em;background-color:currentcolor;opacity:.16}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{object-fit:contain!important}.object-fit-cover{object-fit:cover!important}.object-fit-fill{object-fit:fill!important}.object-fit-scale{object-fit:scale-down!important}.object-fit-none{object-fit:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--tblr-box-shadow)!important}.shadow-sm{box-shadow:var(--tblr-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--tblr-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--tblr-focus-ring-color: rgba(var(--tblr-primary-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-secondary{--tblr-focus-ring-color: rgba(var(--tblr-secondary-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-success{--tblr-focus-ring-color: rgba(var(--tblr-success-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-info{--tblr-focus-ring-color: rgba(var(--tblr-info-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-warning{--tblr-focus-ring-color: rgba(var(--tblr-warning-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-danger{--tblr-focus-ring-color: rgba(var(--tblr-danger-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-light{--tblr-focus-ring-color: rgba(var(--tblr-light-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-dark{--tblr-focus-ring-color: rgba(var(--tblr-dark-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-muted{--tblr-focus-ring-color: rgba(var(--tblr-muted-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-blue{--tblr-focus-ring-color: rgba(var(--tblr-blue-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-azure{--tblr-focus-ring-color: rgba(var(--tblr-azure-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-indigo{--tblr-focus-ring-color: rgba(var(--tblr-indigo-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-purple{--tblr-focus-ring-color: rgba(var(--tblr-purple-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-pink{--tblr-focus-ring-color: rgba(var(--tblr-pink-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-red{--tblr-focus-ring-color: rgba(var(--tblr-red-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-orange{--tblr-focus-ring-color: rgba(var(--tblr-orange-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-yellow{--tblr-focus-ring-color: rgba(var(--tblr-yellow-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-lime{--tblr-focus-ring-color: rgba(var(--tblr-lime-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-green{--tblr-focus-ring-color: rgba(var(--tblr-green-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-teal{--tblr-focus-ring-color: rgba(var(--tblr-teal-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-cyan{--tblr-focus-ring-color: rgba(var(--tblr-cyan-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-facebook{--tblr-focus-ring-color: rgba(var(--tblr-facebook-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-twitter{--tblr-focus-ring-color: rgba(var(--tblr-twitter-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-linkedin{--tblr-focus-ring-color: rgba(var(--tblr-linkedin-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-google{--tblr-focus-ring-color: rgba(var(--tblr-google-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-youtube{--tblr-focus-ring-color: rgba(var(--tblr-youtube-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-vimeo{--tblr-focus-ring-color: rgba(var(--tblr-vimeo-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-dribbble{--tblr-focus-ring-color: rgba(var(--tblr-dribbble-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-github{--tblr-focus-ring-color: rgba(var(--tblr-github-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-instagram{--tblr-focus-ring-color: rgba(var(--tblr-instagram-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-pinterest{--tblr-focus-ring-color: rgba(var(--tblr-pinterest-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-vk{--tblr-focus-ring-color: rgba(var(--tblr-vk-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-rss{--tblr-focus-ring-color: rgba(var(--tblr-rss-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-flickr{--tblr-focus-ring-color: rgba(var(--tblr-flickr-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-bitbucket{--tblr-focus-ring-color: rgba(var(--tblr-bitbucket-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-tabler{--tblr-focus-ring-color: rgba(var(--tblr-tabler-rgb), var(--tblr-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translate(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-wide{border:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-0{border:0!important}.border-top{border-top:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-top-wide{border-top:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-end-wide{border-right:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-bottom-wide{border-bottom:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-start-wide{border-left:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-start-0{border-left:0!important}.border-primary{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-primary-rgb),var(--tblr-border-opacity))!important}.border-secondary{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-secondary-rgb),var(--tblr-border-opacity))!important}.border-success{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-success-rgb),var(--tblr-border-opacity))!important}.border-info{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-info-rgb),var(--tblr-border-opacity))!important}.border-warning{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-warning-rgb),var(--tblr-border-opacity))!important}.border-danger{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-danger-rgb),var(--tblr-border-opacity))!important}.border-light{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-light-rgb),var(--tblr-border-opacity))!important}.border-dark{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-dark-rgb),var(--tblr-border-opacity))!important}.border-muted{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-muted-rgb),var(--tblr-border-opacity))!important}.border-blue{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-blue-rgb),var(--tblr-border-opacity))!important}.border-azure{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-azure-rgb),var(--tblr-border-opacity))!important}.border-indigo{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-indigo-rgb),var(--tblr-border-opacity))!important}.border-purple{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-purple-rgb),var(--tblr-border-opacity))!important}.border-pink{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-pink-rgb),var(--tblr-border-opacity))!important}.border-red{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-red-rgb),var(--tblr-border-opacity))!important}.border-orange{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-orange-rgb),var(--tblr-border-opacity))!important}.border-yellow{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-yellow-rgb),var(--tblr-border-opacity))!important}.border-lime{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-lime-rgb),var(--tblr-border-opacity))!important}.border-green{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-green-rgb),var(--tblr-border-opacity))!important}.border-teal{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-teal-rgb),var(--tblr-border-opacity))!important}.border-cyan{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-cyan-rgb),var(--tblr-border-opacity))!important}.border-facebook{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-facebook-rgb),var(--tblr-border-opacity))!important}.border-twitter{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-twitter-rgb),var(--tblr-border-opacity))!important}.border-linkedin{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-linkedin-rgb),var(--tblr-border-opacity))!important}.border-google{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-google-rgb),var(--tblr-border-opacity))!important}.border-youtube{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-youtube-rgb),var(--tblr-border-opacity))!important}.border-vimeo{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-vimeo-rgb),var(--tblr-border-opacity))!important}.border-dribbble{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-dribbble-rgb),var(--tblr-border-opacity))!important}.border-github{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-github-rgb),var(--tblr-border-opacity))!important}.border-instagram{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-instagram-rgb),var(--tblr-border-opacity))!important}.border-pinterest{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-pinterest-rgb),var(--tblr-border-opacity))!important}.border-vk{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-vk-rgb),var(--tblr-border-opacity))!important}.border-rss{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-rss-rgb),var(--tblr-border-opacity))!important}.border-flickr{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-flickr-rgb),var(--tblr-border-opacity))!important}.border-bitbucket{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-border-opacity))!important}.border-tabler{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-tabler-rgb),var(--tblr-border-opacity))!important}.border-black{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-black-rgb),var(--tblr-border-opacity))!important}.border-white{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-white-rgb),var(--tblr-border-opacity))!important}.border-primary-subtle{border-color:var(--tblr-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--tblr-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--tblr-success-border-subtle)!important}.border-info-subtle{border-color:var(--tblr-info-border-subtle)!important}.border-warning-subtle{border-color:var(--tblr-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--tblr-danger-border-subtle)!important}.border-light-subtle{border-color:var(--tblr-light-border-subtle)!important}.border-dark-subtle{border-color:var(--tblr-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--tblr-border-opacity: .1}.border-opacity-25{--tblr-border-opacity: .25}.border-opacity-50{--tblr-border-opacity: .5}.border-opacity-75{--tblr-border-opacity: .75}.border-opacity-100{--tblr-border-opacity: 1}.w-25{width:25%!important}.w-33{width:33.33333%!important}.w-50{width:50%!important}.w-66{width:66.66666%!important}.w-75{width:75%!important}.w-100{width:100%!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-33{height:33.33333%!important}.h-50{height:50%!important}.h-66{height:66.66666%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:2rem!important}.m-6{margin:3rem!important}.m-7{margin:5rem!important}.m-8{margin:8rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:2rem!important;margin-left:2rem!important}.mx-6{margin-right:3rem!important;margin-left:3rem!important}.mx-7{margin-right:5rem!important;margin-left:5rem!important}.mx-8{margin-right:8rem!important;margin-left:8rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.my-7{margin-top:5rem!important;margin-bottom:5rem!important}.my-8{margin-top:8rem!important;margin-bottom:8rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:2rem!important}.mt-6{margin-top:3rem!important}.mt-7{margin-top:5rem!important}.mt-8{margin-top:8rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:2rem!important}.me-6{margin-right:3rem!important}.me-7{margin-right:5rem!important}.me-8{margin-right:8rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:2rem!important}.mb-6{margin-bottom:3rem!important}.mb-7{margin-bottom:5rem!important}.mb-8{margin-bottom:8rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:2rem!important}.ms-6{margin-left:3rem!important}.ms-7{margin-left:5rem!important}.ms-8{margin-left:8rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:2rem!important}.p-6{padding:3rem!important}.p-7{padding:5rem!important}.p-8{padding:8rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:2rem!important;padding-left:2rem!important}.px-6{padding-right:3rem!important;padding-left:3rem!important}.px-7{padding-right:5rem!important;padding-left:5rem!important}.px-8{padding-right:8rem!important;padding-left:8rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.py-7{padding-top:5rem!important;padding-bottom:5rem!important}.py-8{padding-top:8rem!important;padding-bottom:8rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:2rem!important}.pt-6{padding-top:3rem!important}.pt-7{padding-top:5rem!important}.pt-8{padding-top:8rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:2rem!important}.pe-6{padding-right:3rem!important}.pe-7{padding-right:5rem!important}.pe-8{padding-right:8rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:2rem!important}.pb-6{padding-bottom:3rem!important}.pb-7{padding-bottom:5rem!important}.pb-8{padding-bottom:8rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:2rem!important}.ps-6{padding-left:3rem!important}.ps-7{padding-left:5rem!important}.ps-8{padding-left:8rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:2rem!important}.gap-6{gap:3rem!important}.gap-7{gap:5rem!important}.gap-8{gap:8rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:2rem!important}.row-gap-6{row-gap:3rem!important}.row-gap-7{row-gap:5rem!important}.row-gap-8{row-gap:8rem!important}.column-gap-0{column-gap:0!important}.column-gap-1{column-gap:.25rem!important}.column-gap-2{column-gap:.5rem!important}.column-gap-3{column-gap:1rem!important}.column-gap-4{column-gap:1.5rem!important}.column-gap-5{column-gap:2rem!important}.column-gap-6{column-gap:3rem!important}.column-gap-7{column-gap:5rem!important}.column-gap-8{column-gap:8rem!important}.font-monospace{font-family:var(--tblr-font-monospace)!important}.fs-1{font-size:1.5rem!important}.fs-2{font-size:1.25rem!important}.fs-3{font-size:1rem!important}.fs-4{font-size:.875rem!important}.fs-5{font-size:.75rem!important}.fs-6{font-size:.625rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold,.fw-bold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.1428571429!important}.lh-base{line-height:1.4285714286!important}.lh-lg{line-height:1.7142857143!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-muted{--tblr-text-opacity: 1;color:var(--tblr-secondary-color)!important}.text-black{--tblr-text-opacity: 1;color:rgba(var(--tblr-black-rgb),var(--tblr-text-opacity))!important}.text-white{--tblr-text-opacity: 1;color:rgba(var(--tblr-white-rgb),var(--tblr-text-opacity))!important}.text-body{--tblr-text-opacity: 1;color:rgba(var(--tblr-body-color-rgb),var(--tblr-text-opacity))!important}.text-black-50{--tblr-text-opacity: 1;color:#00000080!important}.text-white-50{--tblr-text-opacity: 1;color:#ffffff80!important}.text-body-secondary{--tblr-text-opacity: 1;color:var(--tblr-secondary-color)!important}.text-body-tertiary{--tblr-text-opacity: 1;color:var(--tblr-tertiary-color)!important}.text-body-emphasis{--tblr-text-opacity: 1;color:var(--tblr-emphasis-color)!important}.text-reset{--tblr-text-opacity: 1;color:inherit!important}.text-opacity-25{--tblr-text-opacity: .25}.text-opacity-50{--tblr-text-opacity: .5}.text-opacity-75{--tblr-text-opacity: .75}.text-opacity-100{--tblr-text-opacity: 1}.text-primary-emphasis{color:var(--tblr-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--tblr-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--tblr-success-text-emphasis)!important}.text-info-emphasis{color:var(--tblr-info-text-emphasis)!important}.text-warning-emphasis{color:var(--tblr-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--tblr-danger-text-emphasis)!important}.text-light-emphasis{color:var(--tblr-light-text-emphasis)!important}.text-dark-emphasis{color:var(--tblr-dark-text-emphasis)!important}.link-opacity-10,.link-opacity-10-hover:hover{--tblr-link-opacity: .1}.link-opacity-25,.link-opacity-25-hover:hover{--tblr-link-opacity: .25}.link-opacity-50,.link-opacity-50-hover:hover{--tblr-link-opacity: .5}.link-opacity-75,.link-opacity-75-hover:hover{--tblr-link-opacity: .75}.link-opacity-100,.link-opacity-100-hover:hover{--tblr-link-opacity: 1}.link-offset-1,.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2,.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3,.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-primary{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-primary-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-secondary{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-secondary-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-success{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-success-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-info{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-info-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-warning{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-warning-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-danger{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-danger-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-light{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-light-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-dark{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-dark-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-muted{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-muted-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-blue{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-blue-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-azure{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-azure-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-indigo{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-indigo-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-purple{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-purple-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-pink{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-pink-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-red{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-red-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-orange{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-orange-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-yellow{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-yellow-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-lime{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-lime-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-green{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-green-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-teal{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-teal-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-cyan{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-cyan-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-facebook{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-facebook-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-twitter{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-twitter-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-linkedin{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-linkedin-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-google{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-google-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-youtube{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-youtube-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-vimeo{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-vimeo-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-dribbble{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-dribbble-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-github{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-github-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-instagram{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-instagram-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-pinterest{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-pinterest-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-vk{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-vk-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-rss{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-rss-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-flickr{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-flickr-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-bitbucket{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-tabler{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-tabler-rgb),var(--tblr-link-underline-opacity))!important}.link-underline{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-link-color-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-underline-opacity-0,.link-underline-opacity-0-hover:hover{--tblr-link-underline-opacity: 0}.link-underline-opacity-10,.link-underline-opacity-10-hover:hover{--tblr-link-underline-opacity: .1}.link-underline-opacity-25,.link-underline-opacity-25-hover:hover{--tblr-link-underline-opacity: .25}.link-underline-opacity-50,.link-underline-opacity-50-hover:hover{--tblr-link-underline-opacity: .5}.link-underline-opacity-75,.link-underline-opacity-75-hover:hover{--tblr-link-underline-opacity: .75}.link-underline-opacity-100,.link-underline-opacity-100-hover:hover{--tblr-link-underline-opacity: 1}.bg-black{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-black-rgb),var(--tblr-bg-opacity))!important}.bg-body{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-body-bg-rgb),var(--tblr-bg-opacity))!important}.bg-transparent{--tblr-bg-opacity: 1;background-color:transparent!important}.bg-body-secondary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-secondary-bg-rgb),var(--tblr-bg-opacity))!important}.bg-body-tertiary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-tertiary-bg-rgb),var(--tblr-bg-opacity))!important}.bg-opacity-10{--tblr-bg-opacity: .1}.bg-opacity-25{--tblr-bg-opacity: .25}.bg-opacity-50{--tblr-bg-opacity: .5}.bg-opacity-75{--tblr-bg-opacity: .75}.bg-opacity-100{--tblr-bg-opacity: 1}.bg-primary-subtle{background-color:var(--tblr-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--tblr-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--tblr-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--tblr-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--tblr-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--tblr-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--tblr-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--tblr-dark-bg-subtle)!important}.bg-gradient{background-image:var(--tblr-gradient)!important}.user-select-all{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--tblr-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--tblr-border-radius-sm)!important}.rounded-2{border-radius:var(--tblr-border-radius)!important}.rounded-3{border-radius:var(--tblr-border-radius-lg)!important}.rounded-4{border-radius:var(--tblr-border-radius-xl)!important}.rounded-5{border-radius:var(--tblr-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--tblr-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--tblr-border-radius)!important;border-top-right-radius:var(--tblr-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--tblr-border-radius-sm)!important;border-top-right-radius:var(--tblr-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--tblr-border-radius)!important;border-top-right-radius:var(--tblr-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--tblr-border-radius-lg)!important;border-top-right-radius:var(--tblr-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--tblr-border-radius-xl)!important;border-top-right-radius:var(--tblr-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--tblr-border-radius-xxl)!important;border-top-right-radius:var(--tblr-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--tblr-border-radius-pill)!important;border-top-right-radius:var(--tblr-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--tblr-border-radius)!important;border-bottom-right-radius:var(--tblr-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--tblr-border-radius-sm)!important;border-bottom-right-radius:var(--tblr-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--tblr-border-radius)!important;border-bottom-right-radius:var(--tblr-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--tblr-border-radius-lg)!important;border-bottom-right-radius:var(--tblr-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--tblr-border-radius-xl)!important;border-bottom-right-radius:var(--tblr-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--tblr-border-radius-xxl)!important;border-bottom-right-radius:var(--tblr-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--tblr-border-radius-pill)!important;border-bottom-right-radius:var(--tblr-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--tblr-border-radius)!important;border-bottom-left-radius:var(--tblr-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--tblr-border-radius-sm)!important;border-bottom-left-radius:var(--tblr-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--tblr-border-radius)!important;border-bottom-left-radius:var(--tblr-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--tblr-border-radius-lg)!important;border-bottom-left-radius:var(--tblr-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--tblr-border-radius-xl)!important;border-bottom-left-radius:var(--tblr-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--tblr-border-radius-xxl)!important;border-bottom-left-radius:var(--tblr-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--tblr-border-radius-pill)!important;border-bottom-left-radius:var(--tblr-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--tblr-border-radius)!important;border-top-left-radius:var(--tblr-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--tblr-border-radius-sm)!important;border-top-left-radius:var(--tblr-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--tblr-border-radius)!important;border-top-left-radius:var(--tblr-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--tblr-border-radius-lg)!important;border-top-left-radius:var(--tblr-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--tblr-border-radius-xl)!important;border-top-left-radius:var(--tblr-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--tblr-border-radius-xxl)!important;border-top-left-radius:var(--tblr-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--tblr-border-radius-pill)!important;border-top-left-radius:var(--tblr-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}.object-contain{object-fit:contain!important}.object-cover{object-fit:cover!important}.object-fill{object-fit:fill!important}.object-scale-down{object-fit:scale-down!important}.object-none{object-fit:none!important}.tracking-tight{letter-spacing:-.05em!important}.tracking-normal{letter-spacing:0!important}.tracking-wide{letter-spacing:.05em!important}.cursor-auto{cursor:auto!important}.cursor-pointer{cursor:pointer!important}.cursor-move{cursor:move!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-zoom-in{cursor:zoom-in!important}.cursor-zoom-out{cursor:zoom-out!important}.cursor-default{cursor:default!important}.cursor-none{cursor:none!important}.cursor-help{cursor:help!important}.cursor-progress{cursor:progress!important}.cursor-wait{cursor:wait!important}.cursor-text{cursor:text!important}.cursor-v-text{cursor:vertical-text!important}.cursor-grab{cursor:grab!important}.cursor-grabbing{cursor:grabbing!important}.border-x{border-left:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important;border-right:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-x-wide{border-left:2px var(--tblr-border-style) rgba(4,32,69,.14)!important;border-right:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-x-0{border-left:0!important;border-right:0!important}.border-y{border-top:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important;border-bottom:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-y-wide{border-top:2px var(--tblr-border-style) rgba(4,32,69,.14)!important;border-bottom:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-y-0{border-top:0!important;border-bottom:0!important}.columns-2{columns:2!important}.columns-3{columns:3!important}.columns-4{columns:4!important}@media (min-width: 576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{object-fit:contain!important}.object-fit-sm-cover{object-fit:cover!important}.object-fit-sm-fill{object-fit:fill!important}.object-fit-sm-scale{object-fit:scale-down!important}.object-fit-sm-none{object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:2rem!important}.m-sm-6{margin:3rem!important}.m-sm-7{margin:5rem!important}.m-sm-8{margin:8rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:2rem!important;margin-left:2rem!important}.mx-sm-6{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-7{margin-right:5rem!important;margin-left:5rem!important}.mx-sm-8{margin-right:8rem!important;margin-left:8rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-sm-6{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-7{margin-top:5rem!important;margin-bottom:5rem!important}.my-sm-8{margin-top:8rem!important;margin-bottom:8rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:2rem!important}.mt-sm-6{margin-top:3rem!important}.mt-sm-7{margin-top:5rem!important}.mt-sm-8{margin-top:8rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:2rem!important}.me-sm-6{margin-right:3rem!important}.me-sm-7{margin-right:5rem!important}.me-sm-8{margin-right:8rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:2rem!important}.mb-sm-6{margin-bottom:3rem!important}.mb-sm-7{margin-bottom:5rem!important}.mb-sm-8{margin-bottom:8rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:2rem!important}.ms-sm-6{margin-left:3rem!important}.ms-sm-7{margin-left:5rem!important}.ms-sm-8{margin-left:8rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:2rem!important}.p-sm-6{padding:3rem!important}.p-sm-7{padding:5rem!important}.p-sm-8{padding:8rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:2rem!important;padding-left:2rem!important}.px-sm-6{padding-right:3rem!important;padding-left:3rem!important}.px-sm-7{padding-right:5rem!important;padding-left:5rem!important}.px-sm-8{padding-right:8rem!important;padding-left:8rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-sm-6{padding-top:3rem!important;padding-bottom:3rem!important}.py-sm-7{padding-top:5rem!important;padding-bottom:5rem!important}.py-sm-8{padding-top:8rem!important;padding-bottom:8rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:2rem!important}.pt-sm-6{padding-top:3rem!important}.pt-sm-7{padding-top:5rem!important}.pt-sm-8{padding-top:8rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:2rem!important}.pe-sm-6{padding-right:3rem!important}.pe-sm-7{padding-right:5rem!important}.pe-sm-8{padding-right:8rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:2rem!important}.pb-sm-6{padding-bottom:3rem!important}.pb-sm-7{padding-bottom:5rem!important}.pb-sm-8{padding-bottom:8rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:2rem!important}.ps-sm-6{padding-left:3rem!important}.ps-sm-7{padding-left:5rem!important}.ps-sm-8{padding-left:8rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:2rem!important}.gap-sm-6{gap:3rem!important}.gap-sm-7{gap:5rem!important}.gap-sm-8{gap:8rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:2rem!important}.row-gap-sm-6{row-gap:3rem!important}.row-gap-sm-7{row-gap:5rem!important}.row-gap-sm-8{row-gap:8rem!important}.column-gap-sm-0{column-gap:0!important}.column-gap-sm-1{column-gap:.25rem!important}.column-gap-sm-2{column-gap:.5rem!important}.column-gap-sm-3{column-gap:1rem!important}.column-gap-sm-4{column-gap:1.5rem!important}.column-gap-sm-5{column-gap:2rem!important}.column-gap-sm-6{column-gap:3rem!important}.column-gap-sm-7{column-gap:5rem!important}.column-gap-sm-8{column-gap:8rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}.columns-sm-2{columns:2!important}.columns-sm-3{columns:3!important}.columns-sm-4{columns:4!important}}@media (min-width: 768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{object-fit:contain!important}.object-fit-md-cover{object-fit:cover!important}.object-fit-md-fill{object-fit:fill!important}.object-fit-md-scale{object-fit:scale-down!important}.object-fit-md-none{object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:2rem!important}.m-md-6{margin:3rem!important}.m-md-7{margin:5rem!important}.m-md-8{margin:8rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:2rem!important;margin-left:2rem!important}.mx-md-6{margin-right:3rem!important;margin-left:3rem!important}.mx-md-7{margin-right:5rem!important;margin-left:5rem!important}.mx-md-8{margin-right:8rem!important;margin-left:8rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-md-6{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-7{margin-top:5rem!important;margin-bottom:5rem!important}.my-md-8{margin-top:8rem!important;margin-bottom:8rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:2rem!important}.mt-md-6{margin-top:3rem!important}.mt-md-7{margin-top:5rem!important}.mt-md-8{margin-top:8rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:2rem!important}.me-md-6{margin-right:3rem!important}.me-md-7{margin-right:5rem!important}.me-md-8{margin-right:8rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:2rem!important}.mb-md-6{margin-bottom:3rem!important}.mb-md-7{margin-bottom:5rem!important}.mb-md-8{margin-bottom:8rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:2rem!important}.ms-md-6{margin-left:3rem!important}.ms-md-7{margin-left:5rem!important}.ms-md-8{margin-left:8rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:2rem!important}.p-md-6{padding:3rem!important}.p-md-7{padding:5rem!important}.p-md-8{padding:8rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:2rem!important;padding-left:2rem!important}.px-md-6{padding-right:3rem!important;padding-left:3rem!important}.px-md-7{padding-right:5rem!important;padding-left:5rem!important}.px-md-8{padding-right:8rem!important;padding-left:8rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-md-6{padding-top:3rem!important;padding-bottom:3rem!important}.py-md-7{padding-top:5rem!important;padding-bottom:5rem!important}.py-md-8{padding-top:8rem!important;padding-bottom:8rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:2rem!important}.pt-md-6{padding-top:3rem!important}.pt-md-7{padding-top:5rem!important}.pt-md-8{padding-top:8rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:2rem!important}.pe-md-6{padding-right:3rem!important}.pe-md-7{padding-right:5rem!important}.pe-md-8{padding-right:8rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:2rem!important}.pb-md-6{padding-bottom:3rem!important}.pb-md-7{padding-bottom:5rem!important}.pb-md-8{padding-bottom:8rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:2rem!important}.ps-md-6{padding-left:3rem!important}.ps-md-7{padding-left:5rem!important}.ps-md-8{padding-left:8rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:2rem!important}.gap-md-6{gap:3rem!important}.gap-md-7{gap:5rem!important}.gap-md-8{gap:8rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:2rem!important}.row-gap-md-6{row-gap:3rem!important}.row-gap-md-7{row-gap:5rem!important}.row-gap-md-8{row-gap:8rem!important}.column-gap-md-0{column-gap:0!important}.column-gap-md-1{column-gap:.25rem!important}.column-gap-md-2{column-gap:.5rem!important}.column-gap-md-3{column-gap:1rem!important}.column-gap-md-4{column-gap:1.5rem!important}.column-gap-md-5{column-gap:2rem!important}.column-gap-md-6{column-gap:3rem!important}.column-gap-md-7{column-gap:5rem!important}.column-gap-md-8{column-gap:8rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}.columns-md-2{columns:2!important}.columns-md-3{columns:3!important}.columns-md-4{columns:4!important}}@media (min-width: 992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{object-fit:contain!important}.object-fit-lg-cover{object-fit:cover!important}.object-fit-lg-fill{object-fit:fill!important}.object-fit-lg-scale{object-fit:scale-down!important}.object-fit-lg-none{object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:2rem!important}.m-lg-6{margin:3rem!important}.m-lg-7{margin:5rem!important}.m-lg-8{margin:8rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:2rem!important;margin-left:2rem!important}.mx-lg-6{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-7{margin-right:5rem!important;margin-left:5rem!important}.mx-lg-8{margin-right:8rem!important;margin-left:8rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-lg-6{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-7{margin-top:5rem!important;margin-bottom:5rem!important}.my-lg-8{margin-top:8rem!important;margin-bottom:8rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:2rem!important}.mt-lg-6{margin-top:3rem!important}.mt-lg-7{margin-top:5rem!important}.mt-lg-8{margin-top:8rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:2rem!important}.me-lg-6{margin-right:3rem!important}.me-lg-7{margin-right:5rem!important}.me-lg-8{margin-right:8rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:2rem!important}.mb-lg-6{margin-bottom:3rem!important}.mb-lg-7{margin-bottom:5rem!important}.mb-lg-8{margin-bottom:8rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:2rem!important}.ms-lg-6{margin-left:3rem!important}.ms-lg-7{margin-left:5rem!important}.ms-lg-8{margin-left:8rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:2rem!important}.p-lg-6{padding:3rem!important}.p-lg-7{padding:5rem!important}.p-lg-8{padding:8rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:2rem!important;padding-left:2rem!important}.px-lg-6{padding-right:3rem!important;padding-left:3rem!important}.px-lg-7{padding-right:5rem!important;padding-left:5rem!important}.px-lg-8{padding-right:8rem!important;padding-left:8rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-lg-6{padding-top:3rem!important;padding-bottom:3rem!important}.py-lg-7{padding-top:5rem!important;padding-bottom:5rem!important}.py-lg-8{padding-top:8rem!important;padding-bottom:8rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:2rem!important}.pt-lg-6{padding-top:3rem!important}.pt-lg-7{padding-top:5rem!important}.pt-lg-8{padding-top:8rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:2rem!important}.pe-lg-6{padding-right:3rem!important}.pe-lg-7{padding-right:5rem!important}.pe-lg-8{padding-right:8rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:2rem!important}.pb-lg-6{padding-bottom:3rem!important}.pb-lg-7{padding-bottom:5rem!important}.pb-lg-8{padding-bottom:8rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:2rem!important}.ps-lg-6{padding-left:3rem!important}.ps-lg-7{padding-left:5rem!important}.ps-lg-8{padding-left:8rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:2rem!important}.gap-lg-6{gap:3rem!important}.gap-lg-7{gap:5rem!important}.gap-lg-8{gap:8rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:2rem!important}.row-gap-lg-6{row-gap:3rem!important}.row-gap-lg-7{row-gap:5rem!important}.row-gap-lg-8{row-gap:8rem!important}.column-gap-lg-0{column-gap:0!important}.column-gap-lg-1{column-gap:.25rem!important}.column-gap-lg-2{column-gap:.5rem!important}.column-gap-lg-3{column-gap:1rem!important}.column-gap-lg-4{column-gap:1.5rem!important}.column-gap-lg-5{column-gap:2rem!important}.column-gap-lg-6{column-gap:3rem!important}.column-gap-lg-7{column-gap:5rem!important}.column-gap-lg-8{column-gap:8rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}.columns-lg-2{columns:2!important}.columns-lg-3{columns:3!important}.columns-lg-4{columns:4!important}}@media (min-width: 1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{object-fit:contain!important}.object-fit-xl-cover{object-fit:cover!important}.object-fit-xl-fill{object-fit:fill!important}.object-fit-xl-scale{object-fit:scale-down!important}.object-fit-xl-none{object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:2rem!important}.m-xl-6{margin:3rem!important}.m-xl-7{margin:5rem!important}.m-xl-8{margin:8rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:2rem!important;margin-left:2rem!important}.mx-xl-6{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-7{margin-right:5rem!important;margin-left:5rem!important}.mx-xl-8{margin-right:8rem!important;margin-left:8rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-xl-6{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-7{margin-top:5rem!important;margin-bottom:5rem!important}.my-xl-8{margin-top:8rem!important;margin-bottom:8rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:2rem!important}.mt-xl-6{margin-top:3rem!important}.mt-xl-7{margin-top:5rem!important}.mt-xl-8{margin-top:8rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:2rem!important}.me-xl-6{margin-right:3rem!important}.me-xl-7{margin-right:5rem!important}.me-xl-8{margin-right:8rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:2rem!important}.mb-xl-6{margin-bottom:3rem!important}.mb-xl-7{margin-bottom:5rem!important}.mb-xl-8{margin-bottom:8rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:2rem!important}.ms-xl-6{margin-left:3rem!important}.ms-xl-7{margin-left:5rem!important}.ms-xl-8{margin-left:8rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:2rem!important}.p-xl-6{padding:3rem!important}.p-xl-7{padding:5rem!important}.p-xl-8{padding:8rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:2rem!important;padding-left:2rem!important}.px-xl-6{padding-right:3rem!important;padding-left:3rem!important}.px-xl-7{padding-right:5rem!important;padding-left:5rem!important}.px-xl-8{padding-right:8rem!important;padding-left:8rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-xl-6{padding-top:3rem!important;padding-bottom:3rem!important}.py-xl-7{padding-top:5rem!important;padding-bottom:5rem!important}.py-xl-8{padding-top:8rem!important;padding-bottom:8rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:2rem!important}.pt-xl-6{padding-top:3rem!important}.pt-xl-7{padding-top:5rem!important}.pt-xl-8{padding-top:8rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:2rem!important}.pe-xl-6{padding-right:3rem!important}.pe-xl-7{padding-right:5rem!important}.pe-xl-8{padding-right:8rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:2rem!important}.pb-xl-6{padding-bottom:3rem!important}.pb-xl-7{padding-bottom:5rem!important}.pb-xl-8{padding-bottom:8rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:2rem!important}.ps-xl-6{padding-left:3rem!important}.ps-xl-7{padding-left:5rem!important}.ps-xl-8{padding-left:8rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:2rem!important}.gap-xl-6{gap:3rem!important}.gap-xl-7{gap:5rem!important}.gap-xl-8{gap:8rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:2rem!important}.row-gap-xl-6{row-gap:3rem!important}.row-gap-xl-7{row-gap:5rem!important}.row-gap-xl-8{row-gap:8rem!important}.column-gap-xl-0{column-gap:0!important}.column-gap-xl-1{column-gap:.25rem!important}.column-gap-xl-2{column-gap:.5rem!important}.column-gap-xl-3{column-gap:1rem!important}.column-gap-xl-4{column-gap:1.5rem!important}.column-gap-xl-5{column-gap:2rem!important}.column-gap-xl-6{column-gap:3rem!important}.column-gap-xl-7{column-gap:5rem!important}.column-gap-xl-8{column-gap:8rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}.columns-xl-2{columns:2!important}.columns-xl-3{columns:3!important}.columns-xl-4{columns:4!important}}@media (min-width: 1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{object-fit:contain!important}.object-fit-xxl-cover{object-fit:cover!important}.object-fit-xxl-fill{object-fit:fill!important}.object-fit-xxl-scale{object-fit:scale-down!important}.object-fit-xxl-none{object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:2rem!important}.m-xxl-6{margin:3rem!important}.m-xxl-7{margin:5rem!important}.m-xxl-8{margin:8rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:2rem!important;margin-left:2rem!important}.mx-xxl-6{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-7{margin-right:5rem!important;margin-left:5rem!important}.mx-xxl-8{margin-right:8rem!important;margin-left:8rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-xxl-6{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-7{margin-top:5rem!important;margin-bottom:5rem!important}.my-xxl-8{margin-top:8rem!important;margin-bottom:8rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:2rem!important}.mt-xxl-6{margin-top:3rem!important}.mt-xxl-7{margin-top:5rem!important}.mt-xxl-8{margin-top:8rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:2rem!important}.me-xxl-6{margin-right:3rem!important}.me-xxl-7{margin-right:5rem!important}.me-xxl-8{margin-right:8rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:2rem!important}.mb-xxl-6{margin-bottom:3rem!important}.mb-xxl-7{margin-bottom:5rem!important}.mb-xxl-8{margin-bottom:8rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:2rem!important}.ms-xxl-6{margin-left:3rem!important}.ms-xxl-7{margin-left:5rem!important}.ms-xxl-8{margin-left:8rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:2rem!important}.p-xxl-6{padding:3rem!important}.p-xxl-7{padding:5rem!important}.p-xxl-8{padding:8rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:2rem!important;padding-left:2rem!important}.px-xxl-6{padding-right:3rem!important;padding-left:3rem!important}.px-xxl-7{padding-right:5rem!important;padding-left:5rem!important}.px-xxl-8{padding-right:8rem!important;padding-left:8rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-xxl-6{padding-top:3rem!important;padding-bottom:3rem!important}.py-xxl-7{padding-top:5rem!important;padding-bottom:5rem!important}.py-xxl-8{padding-top:8rem!important;padding-bottom:8rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:2rem!important}.pt-xxl-6{padding-top:3rem!important}.pt-xxl-7{padding-top:5rem!important}.pt-xxl-8{padding-top:8rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:2rem!important}.pe-xxl-6{padding-right:3rem!important}.pe-xxl-7{padding-right:5rem!important}.pe-xxl-8{padding-right:8rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:2rem!important}.pb-xxl-6{padding-bottom:3rem!important}.pb-xxl-7{padding-bottom:5rem!important}.pb-xxl-8{padding-bottom:8rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:2rem!important}.ps-xxl-6{padding-left:3rem!important}.ps-xxl-7{padding-left:5rem!important}.ps-xxl-8{padding-left:8rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:2rem!important}.gap-xxl-6{gap:3rem!important}.gap-xxl-7{gap:5rem!important}.gap-xxl-8{gap:8rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:2rem!important}.row-gap-xxl-6{row-gap:3rem!important}.row-gap-xxl-7{row-gap:5rem!important}.row-gap-xxl-8{row-gap:8rem!important}.column-gap-xxl-0{column-gap:0!important}.column-gap-xxl-1{column-gap:.25rem!important}.column-gap-xxl-2{column-gap:.5rem!important}.column-gap-xxl-3{column-gap:1rem!important}.column-gap-xxl-4{column-gap:1.5rem!important}.column-gap-xxl-5{column-gap:2rem!important}.column-gap-xxl-6{column-gap:3rem!important}.column-gap-xxl-7{column-gap:5rem!important}.column-gap-xxl-8{column-gap:8rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}.columns-xxl-2{columns:2!important}.columns-xxl-3{columns:3!important}.columns-xxl-4{columns:4!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}:root,:host{font-size:16px;height:100%}:root,:host,[data-bs-theme=light]{--tblr-primary: #0054a6;--tblr-primary-rgb: 0, 84, 166;--tblr-primary-fg: var(--tblr-light);--tblr-primary-darken: #004c95;--tblr-primary-lt: #e6eef6;--tblr-primary-lt-rgb: 230, 238, 246;--tblr-secondary: #667382;--tblr-secondary-rgb: 102, 115, 130;--tblr-secondary-fg: var(--tblr-light);--tblr-secondary-darken: #5c6875;--tblr-secondary-lt: #f0f1f3;--tblr-secondary-lt-rgb: 240, 241, 243;--tblr-success: #2fb344;--tblr-success-rgb: 47, 179, 68;--tblr-success-fg: var(--tblr-light);--tblr-success-darken: #2aa13d;--tblr-success-lt: #eaf7ec;--tblr-success-lt-rgb: 234, 247, 236;--tblr-info: #4299e1;--tblr-info-rgb: 66, 153, 225;--tblr-info-fg: var(--tblr-light);--tblr-info-darken: #3b8acb;--tblr-info-lt: #ecf5fc;--tblr-info-lt-rgb: 236, 245, 252;--tblr-warning: #f76707;--tblr-warning-rgb: 247, 103, 7;--tblr-warning-fg: var(--tblr-light);--tblr-warning-darken: #de5d06;--tblr-warning-lt: #fef0e6;--tblr-warning-lt-rgb: 254, 240, 230;--tblr-danger: #d63939;--tblr-danger-rgb: 214, 57, 57;--tblr-danger-fg: var(--tblr-light);--tblr-danger-darken: #c13333;--tblr-danger-lt: #fbebeb;--tblr-danger-lt-rgb: 251, 235, 235;--tblr-light: #fcfdfe;--tblr-light-rgb: 252, 253, 254;--tblr-light-fg: var(--tblr-dark);--tblr-light-darken: #e3e4e5;--tblr-light-lt: white;--tblr-light-lt-rgb: 255, 255, 255;--tblr-dark: #182433;--tblr-dark-rgb: 24, 36, 51;--tblr-dark-fg: var(--tblr-light);--tblr-dark-darken: #16202e;--tblr-dark-lt: #e8e9eb;--tblr-dark-lt-rgb: 232, 233, 235;--tblr-muted: #667382;--tblr-muted-rgb: 102, 115, 130;--tblr-muted-fg: var(--tblr-light);--tblr-muted-darken: #5c6875;--tblr-muted-lt: #f0f1f3;--tblr-muted-lt-rgb: 240, 241, 243;--tblr-blue: #0054a6;--tblr-blue-rgb: 0, 84, 166;--tblr-blue-fg: var(--tblr-light);--tblr-blue-darken: #004c95;--tblr-blue-lt: #e6eef6;--tblr-blue-lt-rgb: 230, 238, 246;--tblr-azure: #4299e1;--tblr-azure-rgb: 66, 153, 225;--tblr-azure-fg: var(--tblr-light);--tblr-azure-darken: #3b8acb;--tblr-azure-lt: #ecf5fc;--tblr-azure-lt-rgb: 236, 245, 252;--tblr-indigo: #4263eb;--tblr-indigo-rgb: 66, 99, 235;--tblr-indigo-fg: var(--tblr-light);--tblr-indigo-darken: #3b59d4;--tblr-indigo-lt: #eceffd;--tblr-indigo-lt-rgb: 236, 239, 253;--tblr-purple: #ae3ec9;--tblr-purple-rgb: 174, 62, 201;--tblr-purple-fg: var(--tblr-light);--tblr-purple-darken: #9d38b5;--tblr-purple-lt: #f7ecfa;--tblr-purple-lt-rgb: 247, 236, 250;--tblr-pink: #d6336c;--tblr-pink-rgb: 214, 51, 108;--tblr-pink-fg: var(--tblr-light);--tblr-pink-darken: #c12e61;--tblr-pink-lt: #fbebf0;--tblr-pink-lt-rgb: 251, 235, 240;--tblr-red: #d63939;--tblr-red-rgb: 214, 57, 57;--tblr-red-fg: var(--tblr-light);--tblr-red-darken: #c13333;--tblr-red-lt: #fbebeb;--tblr-red-lt-rgb: 251, 235, 235;--tblr-orange: #f76707;--tblr-orange-rgb: 247, 103, 7;--tblr-orange-fg: var(--tblr-light);--tblr-orange-darken: #de5d06;--tblr-orange-lt: #fef0e6;--tblr-orange-lt-rgb: 254, 240, 230;--tblr-yellow: #f59f00;--tblr-yellow-rgb: 245, 159, 0;--tblr-yellow-fg: var(--tblr-light);--tblr-yellow-darken: #dd8f00;--tblr-yellow-lt: #fef5e6;--tblr-yellow-lt-rgb: 254, 245, 230;--tblr-lime: #74b816;--tblr-lime-rgb: 116, 184, 22;--tblr-lime-fg: var(--tblr-light);--tblr-lime-darken: #68a614;--tblr-lime-lt: #f1f8e8;--tblr-lime-lt-rgb: 241, 248, 232;--tblr-green: #2fb344;--tblr-green-rgb: 47, 179, 68;--tblr-green-fg: var(--tblr-light);--tblr-green-darken: #2aa13d;--tblr-green-lt: #eaf7ec;--tblr-green-lt-rgb: 234, 247, 236;--tblr-teal: #0ca678;--tblr-teal-rgb: 12, 166, 120;--tblr-teal-fg: var(--tblr-light);--tblr-teal-darken: #0b956c;--tblr-teal-lt: #e7f6f2;--tblr-teal-lt-rgb: 231, 246, 242;--tblr-cyan: #17a2b8;--tblr-cyan-rgb: 23, 162, 184;--tblr-cyan-fg: var(--tblr-light);--tblr-cyan-darken: #1592a6;--tblr-cyan-lt: #e8f6f8;--tblr-cyan-lt-rgb: 232, 246, 248;--tblr-facebook: #1877f2;--tblr-facebook-rgb: 24, 119, 242;--tblr-facebook-fg: var(--tblr-light);--tblr-facebook-darken: #166bda;--tblr-facebook-lt: #e8f1fe;--tblr-facebook-lt-rgb: 232, 241, 254;--tblr-twitter: #1da1f2;--tblr-twitter-rgb: 29, 161, 242;--tblr-twitter-fg: var(--tblr-light);--tblr-twitter-darken: #1a91da;--tblr-twitter-lt: #e8f6fe;--tblr-twitter-lt-rgb: 232, 246, 254;--tblr-linkedin: #0a66c2;--tblr-linkedin-rgb: 10, 102, 194;--tblr-linkedin-fg: var(--tblr-light);--tblr-linkedin-darken: #095caf;--tblr-linkedin-lt: #e7f0f9;--tblr-linkedin-lt-rgb: 231, 240, 249;--tblr-google: #dc4e41;--tblr-google-rgb: 220, 78, 65;--tblr-google-fg: var(--tblr-light);--tblr-google-darken: #c6463b;--tblr-google-lt: #fcedec;--tblr-google-lt-rgb: 252, 237, 236;--tblr-youtube: #ff0000;--tblr-youtube-rgb: 255, 0, 0;--tblr-youtube-fg: var(--tblr-light);--tblr-youtube-darken: #e60000;--tblr-youtube-lt: #ffe6e6;--tblr-youtube-lt-rgb: 255, 230, 230;--tblr-vimeo: #1ab7ea;--tblr-vimeo-rgb: 26, 183, 234;--tblr-vimeo-fg: var(--tblr-light);--tblr-vimeo-darken: #17a5d3;--tblr-vimeo-lt: #e8f8fd;--tblr-vimeo-lt-rgb: 232, 248, 253;--tblr-dribbble: #ea4c89;--tblr-dribbble-rgb: 234, 76, 137;--tblr-dribbble-fg: var(--tblr-light);--tblr-dribbble-darken: #d3447b;--tblr-dribbble-lt: #fdedf3;--tblr-dribbble-lt-rgb: 253, 237, 243;--tblr-github: #181717;--tblr-github-rgb: 24, 23, 23;--tblr-github-fg: var(--tblr-light);--tblr-github-darken: #161515;--tblr-github-lt: #e8e8e8;--tblr-github-lt-rgb: 232, 232, 232;--tblr-instagram: #e4405f;--tblr-instagram-rgb: 228, 64, 95;--tblr-instagram-fg: var(--tblr-light);--tblr-instagram-darken: #cd3a56;--tblr-instagram-lt: #fcecef;--tblr-instagram-lt-rgb: 252, 236, 239;--tblr-pinterest: #bd081c;--tblr-pinterest-rgb: 189, 8, 28;--tblr-pinterest-fg: var(--tblr-light);--tblr-pinterest-darken: #aa0719;--tblr-pinterest-lt: #f8e6e8;--tblr-pinterest-lt-rgb: 248, 230, 232;--tblr-vk: #6383a8;--tblr-vk-rgb: 99, 131, 168;--tblr-vk-fg: var(--tblr-light);--tblr-vk-darken: #597697;--tblr-vk-lt: #eff3f6;--tblr-vk-lt-rgb: 239, 243, 246;--tblr-rss: #ffa500;--tblr-rss-rgb: 255, 165, 0;--tblr-rss-fg: var(--tblr-light);--tblr-rss-darken: #e69500;--tblr-rss-lt: #fff6e6;--tblr-rss-lt-rgb: 255, 246, 230;--tblr-flickr: #0063dc;--tblr-flickr-rgb: 0, 99, 220;--tblr-flickr-fg: var(--tblr-light);--tblr-flickr-darken: #0059c6;--tblr-flickr-lt: #e6effc;--tblr-flickr-lt-rgb: 230, 239, 252;--tblr-bitbucket: #0052cc;--tblr-bitbucket-rgb: 0, 82, 204;--tblr-bitbucket-fg: var(--tblr-light);--tblr-bitbucket-darken: #004ab8;--tblr-bitbucket-lt: #e6eefa;--tblr-bitbucket-lt-rgb: 230, 238, 250;--tblr-tabler: #0054a6;--tblr-tabler-rgb: 0, 84, 166;--tblr-tabler-fg: var(--tblr-light);--tblr-tabler-darken: #004c95;--tblr-tabler-lt: #e6eef6;--tblr-tabler-lt-rgb: 230, 238, 246;--tblr-gray-50: #fcfdfe;--tblr-gray-50-rgb: 252, 253, 254;--tblr-gray-50-fg: var(--tblr-dark);--tblr-gray-50-darken: #e3e4e5;--tblr-gray-50-lt: white;--tblr-gray-50-lt-rgb: 255, 255, 255;--tblr-gray-100: #f6f8fb;--tblr-gray-100-rgb: 246, 248, 251;--tblr-gray-100-fg: var(--tblr-dark);--tblr-gray-100-darken: #dddfe2;--tblr-gray-100-lt: #fefeff;--tblr-gray-100-lt-rgb: 254, 254, 255;--tblr-gray-200: #eef1f4;--tblr-gray-200-rgb: 238, 241, 244;--tblr-gray-200-fg: var(--tblr-dark);--tblr-gray-200-darken: #d6d9dc;--tblr-gray-200-lt: #fdfefe;--tblr-gray-200-lt-rgb: 253, 254, 254;--tblr-gray-300: #dadfe5;--tblr-gray-300-rgb: 218, 223, 229;--tblr-gray-300-fg: var(--tblr-dark);--tblr-gray-300-darken: #c4c9ce;--tblr-gray-300-lt: #fbfcfc;--tblr-gray-300-lt-rgb: 251, 252, 252;--tblr-gray-400: #bbc3cd;--tblr-gray-400-rgb: 187, 195, 205;--tblr-gray-400-fg: var(--tblr-light);--tblr-gray-400-darken: #a8b0b9;--tblr-gray-400-lt: #f8f9fa;--tblr-gray-400-lt-rgb: 248, 249, 250;--tblr-gray-500: #929dab;--tblr-gray-500-rgb: 146, 157, 171;--tblr-gray-500-fg: var(--tblr-light);--tblr-gray-500-darken: #838d9a;--tblr-gray-500-lt: #f4f5f7;--tblr-gray-500-lt-rgb: 244, 245, 247;--tblr-gray-600: #667382;--tblr-gray-600-rgb: 102, 115, 130;--tblr-gray-600-fg: var(--tblr-light);--tblr-gray-600-darken: #5c6875;--tblr-gray-600-lt: #f0f1f3;--tblr-gray-600-lt-rgb: 240, 241, 243;--tblr-gray-700: #3a4859;--tblr-gray-700-rgb: 58, 72, 89;--tblr-gray-700-fg: var(--tblr-light);--tblr-gray-700-darken: #344150;--tblr-gray-700-lt: #ebedee;--tblr-gray-700-lt-rgb: 235, 237, 238;--tblr-gray-800: #182433;--tblr-gray-800-rgb: 24, 36, 51;--tblr-gray-800-fg: var(--tblr-light);--tblr-gray-800-darken: #16202e;--tblr-gray-800-lt: #e8e9eb;--tblr-gray-800-lt-rgb: 232, 233, 235;--tblr-gray-900: #040a11;--tblr-gray-900-rgb: 4, 10, 17;--tblr-gray-900-fg: var(--tblr-light);--tblr-gray-900-darken: #04090f;--tblr-gray-900-lt: #e6e7e7;--tblr-gray-900-lt-rgb: 230, 231, 231;--tblr-spacer-0: 0;--tblr-spacer-1: .25rem;--tblr-spacer-2: .5rem;--tblr-spacer-3: 1rem;--tblr-spacer-4: 1.5rem;--tblr-spacer-5: 2rem;--tblr-spacer-6: 3rem;--tblr-spacer-7: 5rem;--tblr-spacer-8: 8rem;--tblr-spacer: 1rem;--tblr-bg-surface: var(--tblr-white);--tblr-bg-surface-secondary: var(--tblr-gray-100);--tblr-bg-surface-tertiary: var(--tblr-gray-50);--tblr-bg-surface-dark: var(--tblr-dark);--tblr-bg-forms: var(--tblr-bg-surface);--tblr-border-color: #dadfe5;--tblr-border-color-translucent: rgba(4, 32, 69, .14);--tblr-border-dark-color: #bbc3cd;--tblr-border-dark-color-translucent: rgba(4, 32, 69, .27);--tblr-border-active-color: #b6bcc3;--tblr-icon-color: var(--tblr-gray-500);--tblr-active-bg: rgba(var(--tblr-primary-rgb), .04);--tblr-disabled-bg: var(--tblr-bg-surface-secondary);--tblr-disabled-color: var(--tblr-gray-300);--tblr-code-color: var(--tblr-gray-600);--tblr-code-bg: var(--tblr-bg-surface-secondary);--tblr-dark-mode-border-color: #1f2e41;--tblr-dark-mode-border-color-translucent: rgba(72, 110, 149, .14);--tblr-dark-mode-border-color-active: #2c415d;--tblr-dark-mode-border-dark-color: #1f2e41;--tblr-page-padding: var(--tblr-spacer-3);--tblr-page-padding-y: var(--tblr-spacer-4);--tblr-font-weight-light: 300;--tblr-font-weight-normal: 400;--tblr-font-weight-medium: 500;--tblr-font-weight-bold: 600;--tblr-font-weight-headings: var(--tblr-font-weight-bold);--tblr-font-size-h1: 1.5rem;--tblr-font-size-h2: 1.25rem;--tblr-font-size-h3: 1rem;--tblr-font-size-h4: .875rem;--tblr-font-size-h5: .75rem;--tblr-font-size-h6: .625rem;--tblr-line-height-h1: 2rem;--tblr-line-height-h2: 1.75rem;--tblr-line-height-h3: 1.5rem;--tblr-line-height-h4: 1.25rem;--tblr-line-height-h5: 1rem;--tblr-line-height-h6: 1rem;--tblr-box-shadow: rgba(var(--tblr-body-color-rgb), .04) 0 2px 4px 0;--tblr-box-shadow-border: inset 0 0 0 1px var(--tblr-border-color-translucent);--tblr-box-shadow-transparent: 0 0 0 0 transparent;--tblr-box-shadow-input: 0 1px 1px rgba(var(--tblr-body-color-rgb), .06);--tblr-box-shadow-card: 0 0 4px rgba(var(--tblr-body-color-rgb), .04);--tblr-box-shadow-card-hover: rgba(var(--tblr-body-color-rgb), .16) 0 2px 16px 0;--tblr-box-shadow-dropdown: 0 16px 24px 2px rgba(0, 0, 0, .07), 0 6px 30px 5px rgba(0, 0, 0, .06), 0 8px 10px -5px rgba(0, 0, 0, .1)}@media (max-width: 991.98px){:root,:host,[data-bs-theme=light]{--tblr-page-padding: var(--tblr-spacer-2)}}@keyframes pulse{0%{opacity:1;transform:scale3d(.8,.8,.8)}50%{transform:scaleZ(1);opacity:1}to{opacity:1;transform:scale3d(.8,.8,.8)}}@keyframes tada{0%{transform:scaleZ(1)}10%,5%{transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-5deg)}15%,25%,35%,45%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,5deg)}20%,30%,40%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-5deg)}50%{transform:scaleZ(1)}}@keyframes rotate-360{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes blink{0%{opacity:0}50%{opacity:1}to{opacity:0}}body{letter-spacing:0;touch-action:manipulation;text-rendering:optimizeLegibility;font-feature-settings:"liga" 0;position:relative;min-height:100%;height:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media print{body{background:transparent}}*{scrollbar-color:rgba(var(--tblr-scrollbar-color, var(--tblr-body-color-rgb)),.16) transparent}*::-webkit-scrollbar{width:1rem;height:1rem;transition:background .3s}@media (prefers-reduced-motion: reduce){*::-webkit-scrollbar{transition:none}}*::-webkit-scrollbar-thumb{border-radius:1rem;border:5px solid transparent;box-shadow:inset 0 0 0 1rem rgba(var(--tblr-scrollbar-color, var(--tblr-body-color-rgb)),.16)}*::-webkit-scrollbar-track{background:transparent}*:hover::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem rgba(var(--tblr-scrollbar-color, var(--tblr-body-color-rgb)),.32)}*::-webkit-scrollbar-corner{background:transparent}.layout-fluid .container,.layout-fluid [class^=container-],.layout-fluid [class*=" container-"]{max-width:100%}.layout-boxed{--tblr-theme-boxed-border-radius: 0;--tblr-theme-boxed-width: 1320px}@media (min-width: 768px){.layout-boxed{background:#182433 linear-gradient(to right,rgba(255,255,255,.1),transparent) fixed;padding:1rem;--tblr-theme-boxed-border-radius: 4px}}.layout-boxed .page{margin:0 auto;max-width:var(--tblr-theme-boxed-width);border-radius:var(--tblr-theme-boxed-border-radius);color:var(--tblr-body-color)}@media (min-width: 768px){.layout-boxed .page{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);background:var(--tblr-body-bg)}}.layout-boxed .page>.navbar:first-child{border-top-left-radius:var(--tblr-theme-boxed-border-radius);border-top-right-radius:var(--tblr-theme-boxed-border-radius)}.navbar{--tblr-navbar-bg: var(--tblr-bg-surface);--tblr-navbar-border-width: var(--tblr-border-width);--tblr-navbar-active-border-color: var(--tblr-primary);--tblr-navbar-active-bg: rgba(0, 0, 0, .06);--tblr-navbar-color: var(--tblr-body-color);--tblr-navbar-border-color: var(--tblr-border-color);align-items:stretch;min-height:3.5rem;box-shadow:inset 0 calc(-1 * var(--tblr-navbar-border-width)) 0 0 var(--tblr-navbar-border-color);background:var(--tblr-navbar-bg);color:var(--tblr-navbar-color)}.navbar-collapse .navbar{flex-grow:1}.navbar.collapsing{min-height:0}.navbar .dropdown-menu{position:absolute;z-index:1030}.navbar .navbar-nav{min-height:3rem}.navbar .navbar-nav .nav-link{position:relative;min-width:2rem;min-height:2rem;justify-content:center;border-radius:var(--tblr-border-radius)}.navbar .navbar-nav .nav-link .badge{position:absolute;top:.375rem;right:.375rem;transform:translate(50%,-50%)}.navbar-nav{margin:0;padding:0}@media (max-width: 575.98px){.navbar-expand-sm .navbar-collapse{flex-direction:column}.navbar-expand-sm .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-sm .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-sm .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-sm .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-sm .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-sm .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-sm .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 576px){.navbar-expand-sm .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-sm .nav-item.active{position:relative}.navbar-expand-sm .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-sm.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-sm.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-sm.navbar-vertical~.navbar,.navbar-expand-sm.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-sm.navbar-vertical.navbar-right~.navbar,.navbar-expand-sm.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:18rem}}@media (max-width: 767.98px){.navbar-expand-md .navbar-collapse{flex-direction:column}.navbar-expand-md .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-md .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-md .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-md .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-md .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-md .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-md .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 768px){.navbar-expand-md .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-md .nav-item.active{position:relative}.navbar-expand-md .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-md.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-md.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-md.navbar-vertical~.navbar,.navbar-expand-md.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-md.navbar-vertical.navbar-right~.navbar,.navbar-expand-md.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:18rem}}@media (max-width: 991.98px){.navbar-expand-lg .navbar-collapse{flex-direction:column}.navbar-expand-lg .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-lg .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-lg .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-lg .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-lg .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-lg .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-lg .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 992px){.navbar-expand-lg .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-lg .nav-item.active{position:relative}.navbar-expand-lg .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-lg.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-lg.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-lg.navbar-vertical~.navbar,.navbar-expand-lg.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-lg.navbar-vertical.navbar-right~.navbar,.navbar-expand-lg.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:18rem}}@media (max-width: 1199.98px){.navbar-expand-xl .navbar-collapse{flex-direction:column}.navbar-expand-xl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-xl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-xl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-xl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-xl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-xl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-xl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 1200px){.navbar-expand-xl .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-xl .nav-item.active{position:relative}.navbar-expand-xl .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-xl.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xl.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xl.navbar-vertical~.navbar,.navbar-expand-xl.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-xl.navbar-vertical.navbar-right~.navbar,.navbar-expand-xl.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:18rem}}@media (max-width: 1399.98px){.navbar-expand-xxl .navbar-collapse{flex-direction:column}.navbar-expand-xxl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-xxl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-xxl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-xxl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-xxl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-xxl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-xxl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 1400px){.navbar-expand-xxl .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-xxl .nav-item.active{position:relative}.navbar-expand-xxl .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-xxl.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xxl.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xxl.navbar-vertical~.navbar,.navbar-expand-xxl.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-xxl.navbar-vertical.navbar-right~.navbar,.navbar-expand-xxl.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:18rem}}.navbar-expand .navbar-collapse{flex-direction:column}.navbar-expand .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}.navbar-expand .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand .nav-item.active{position:relative}.navbar-expand .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand.navbar-vertical~.navbar,.navbar-expand.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand.navbar-vertical.navbar-right~.navbar,.navbar-expand.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:18rem}.navbar-brand{display:inline-flex;align-items:center;font-weight:var(--tblr-font-weight-bold);margin:0;line-height:1;gap:.5rem}.navbar-brand-image{height:2rem;width:auto}.navbar-toggler{border:0;width:2rem;height:2rem;position:relative;display:flex;align-items:center;justify-content:center}.navbar-toggler-icon{height:2px;width:1.25em;background:currentColor;border-radius:10px;transition:top .2s .2s,bottom .2s .2s,transform .2s,opacity 0s .2s;position:relative}@media (prefers-reduced-motion: reduce){.navbar-toggler-icon{transition:none}}.navbar-toggler-icon:before,.navbar-toggler-icon:after{content:"";display:block;height:inherit;width:inherit;border-radius:inherit;background:inherit;position:absolute;left:0;transition:inherit}@media (prefers-reduced-motion: reduce){.navbar-toggler-icon:before,.navbar-toggler-icon:after{transition:none}}.navbar-toggler-icon:before{top:-.45em}.navbar-toggler-icon:after{bottom:-.45em}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon{transform:rotate(45deg);transition:top .3s,bottom .3s,transform .3s .3s,opacity 0s .3s}@media (prefers-reduced-motion: reduce){.navbar-toggler[aria-expanded=true] .navbar-toggler-icon{transition:none}}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon:before{top:0;transform:rotate(-90deg)}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon:after{bottom:0;opacity:0}.navbar-transparent{--tblr-navbar-border-color: transparent !important;background:transparent!important}.navbar-nav{align-items:stretch}.navbar-nav .nav-item{display:flex;flex-direction:column;justify-content:center}.navbar-side{margin:0;display:flex;flex-direction:row;align-items:center;justify-content:space-around}@media (min-width: 576px){.navbar-vertical.navbar-expand-sm{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media (min-width: 576px) and (prefers-reduced-motion: reduce){.navbar-vertical.navbar-expand-sm{transition:none}}@media (min-width: 576px){.navbar-vertical.navbar-expand-sm.navbar-right{left:auto;right:0}.navbar-vertical.navbar-expand-sm .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-sm .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-sm .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-sm .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-sm>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-sm~.page{padding-left:18rem}.navbar-vertical.navbar-expand-sm~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-sm.navbar-right~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-sm .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-sm .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-sm .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 768px){.navbar-vertical.navbar-expand-md{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media (min-width: 768px) and (prefers-reduced-motion: reduce){.navbar-vertical.navbar-expand-md{transition:none}}@media (min-width: 768px){.navbar-vertical.navbar-expand-md.navbar-right{left:auto;right:0}.navbar-vertical.navbar-expand-md .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-md .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-md .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-md .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-md>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-md~.page{padding-left:18rem}.navbar-vertical.navbar-expand-md~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-md.navbar-right~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-md .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-md .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-md .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-md .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-md .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 992px){.navbar-vertical.navbar-expand-lg{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media (min-width: 992px) and (prefers-reduced-motion: reduce){.navbar-vertical.navbar-expand-lg{transition:none}}@media (min-width: 992px){.navbar-vertical.navbar-expand-lg.navbar-right{left:auto;right:0}.navbar-vertical.navbar-expand-lg .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-lg .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-lg .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-lg .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-lg>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-lg~.page{padding-left:18rem}.navbar-vertical.navbar-expand-lg~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-lg.navbar-right~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-lg .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-lg .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-lg .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 1200px){.navbar-vertical.navbar-expand-xl{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media (min-width: 1200px) and (prefers-reduced-motion: reduce){.navbar-vertical.navbar-expand-xl{transition:none}}@media (min-width: 1200px){.navbar-vertical.navbar-expand-xl.navbar-right{left:auto;right:0}.navbar-vertical.navbar-expand-xl .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-xl .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-xl .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-xl .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-xl>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-xl~.page{padding-left:18rem}.navbar-vertical.navbar-expand-xl~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-xl.navbar-right~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-xl .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-xl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-xl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 1400px){.navbar-vertical.navbar-expand-xxl{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media (min-width: 1400px) and (prefers-reduced-motion: reduce){.navbar-vertical.navbar-expand-xxl{transition:none}}@media (min-width: 1400px){.navbar-vertical.navbar-expand-xxl.navbar-right{left:auto;right:0}.navbar-vertical.navbar-expand-xxl .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-xxl .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-xxl .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-xxl .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-xxl>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-xxl~.page{padding-left:18rem}.navbar-vertical.navbar-expand-xxl~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-xxl.navbar-right~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-xxl .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-xxl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-xxl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}.navbar-vertical.navbar-expand{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}@media (prefers-reduced-motion: reduce){.navbar-vertical.navbar-expand{transition:none}}.navbar-vertical.navbar-expand.navbar-right{left:auto;right:0}.navbar-vertical.navbar-expand .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand~.page{padding-left:18rem}.navbar-vertical.navbar-expand~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand.navbar-right~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}.navbar-overlap:after{content:"";height:9rem;position:absolute;top:100%;left:0;right:0;background:inherit;z-index:-1;box-shadow:inherit}.page{display:flex;flex-direction:column;position:relative;min-height:100%}.page-center .container{margin-top:auto;margin-bottom:auto}.page-wrapper{flex:1;display:flex;flex-direction:column}@media print{.page-wrapper{margin:0!important}}.page-wrapper-full .page-body:first-child{margin:0;border-top:0}.page-body{margin-top:var(--tblr-page-padding-y);margin-bottom:var(--tblr-page-padding-y)}.page-body-card{background:var(--tblr-bg-surface);border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);padding:var(--tblr-page-padding) 0;margin-bottom:0;flex:1}.page-body~.page-body-card{margin-top:0}.page-cover{background:no-repeat center/cover;min-height:9rem}@media (min-width: 768px){.page-cover{min-height:12rem}}@media (min-width: 992px){.page-cover{min-height:15rem}}.page-cover-overlay{position:relative}.page-cover-overlay:after{content:"";position:absolute;inset:0;background-image:linear-gradient(180deg,#0000,#0009)}.page-header{display:flex;flex-wrap:wrap;min-height:2.25rem;flex-direction:column;justify-content:center}.page-wrapper .page-header{margin:var(--tblr-page-padding-y) 0 0}.page-header-border{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);padding:var(--tblr-page-padding-y) 0;margin:0!important;background-color:var(--tblr-bg-surface)}.page-pretitle{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary)}.page-title{margin:0;font-size:var(--tblr-font-size-h2);line-height:var(--tblr-line-height-h4);font-weight:var(--tblr-font-weight-headings);color:inherit;display:flex;align-items:center}.page-title svg{width:1.5rem;height:1.5rem;margin-right:.25rem}.page-title-lg{font-size:1.5rem;line-height:2rem}.page-subtitle{margin-top:.25rem;color:var(--tblr-secondary)}.page-cover{--tblr-page-cover-blur: 20px;--tblr-page-cover-padding: 1rem;min-height:6rem;padding:var(--tblr-page-cover-padding) 0;position:relative;overflow:hidden}.page-cover-img{position:absolute;top:calc(-2 * var(--tblr-page-cover-blur, 0));left:calc(-2 * var(--tblr-page-cover-blur, 0));right:calc(-2 * var(--tblr-page-cover-blur, 0));bottom:calc(-2 * var(--tblr-page-cover-blur, 0));pointer-events:none;filter:blur(var(--tblr-page-cover-blur));object-fit:cover;background-size:cover;background-position:center;z-index:-1}.page-tabs{margin-top:.5rem;position:relative}.page-header-tabs .nav-bordered{border:0}.page-header-tabs+.page-body-card{margin-top:0}.footer{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);background-color:#fff;padding:2rem 0;color:var(--tblr-secondary);margin-top:auto}.footer-transparent{background-color:transparent;border-top:0}body:not(.theme-dark):not([data-bs-theme=dark]) .hide-theme-light{display:none!important}body.theme-dark .hide-theme-dark,body[data-bs-theme=dark] .hide-theme-dark{display:none!important}[data-bs-theme=dark],body[data-bs-theme=dark] [data-bs-theme=light]{--tblr-body-color: #fcfdfe;--tblr-body-color-rgb: 252, 253, 254;--tblr-muted: #3a4859;--tblr-body-bg: #151f2c;--tblr-body-bg-rgb: 21, 31, 44;--tblr-emphasis-color: #ffffff;--tblr-emphasis-color-rgb: 255, 255, 255;--tblr-bg-forms: #151f2c;--tblr-bg-surface: #182433;--tblr-bg-surface-dark: #151f2c;--tblr-bg-surface-secondary: #1b293a;--tblr-bg-surface-tertiary: #151f2c;--tblr-link-color: #0069cf;--tblr-link-hover-color: #0054a6;--tblr-active-bg: #1b293a;--tblr-disabled-color: var(--tblr-gray-700);--tblr-border-color: var(--tblr-dark-mode-border-color);--tblr-border-color-translucent: var( --tblr-dark-mode-border-color-translucent );--tblr-border-dark-color: var(--tblr-dark-mode-border-dark-color);--tblr-border-color-active: var( --tblr-dark-mode-border-color-active );--tblr-btn-color: #151f2c;--tblr-code-color: var(--tblr-body-color);--tblr-code-bg: #1f2e41;--tblr-primary-lt: #16293f;--tblr-primary-lt-rgb: 22, 41, 63;--tblr-secondary-lt: #202c3b;--tblr-secondary-lt-rgb: 32, 44, 59;--tblr-success-lt: #1a3235;--tblr-success-lt-rgb: 26, 50, 53;--tblr-info-lt: #1c3044;--tblr-info-lt-rgb: 28, 48, 68;--tblr-warning-lt: #2e2b2f;--tblr-warning-lt-rgb: 46, 43, 47;--tblr-danger-lt: #2b2634;--tblr-danger-lt-rgb: 43, 38, 52;--tblr-light-lt: #2f3a47;--tblr-light-lt-rgb: 47, 58, 71;--tblr-dark-lt: #182433;--tblr-dark-lt-rgb: 24, 36, 51;--tblr-muted-lt: #202c3b;--tblr-muted-lt-rgb: 32, 44, 59;--tblr-blue-lt: #16293f;--tblr-blue-lt-rgb: 22, 41, 63;--tblr-azure-lt: #1c3044;--tblr-azure-lt-rgb: 28, 48, 68;--tblr-indigo-lt: #1c2a45;--tblr-indigo-lt-rgb: 28, 42, 69;--tblr-purple-lt: #272742;--tblr-purple-lt-rgb: 39, 39, 66;--tblr-pink-lt: #2b2639;--tblr-pink-lt-rgb: 43, 38, 57;--tblr-red-lt: #2b2634;--tblr-red-lt-rgb: 43, 38, 52;--tblr-orange-lt: #2e2b2f;--tblr-orange-lt-rgb: 46, 43, 47;--tblr-yellow-lt: #2e302e;--tblr-yellow-lt-rgb: 46, 48, 46;--tblr-lime-lt: #213330;--tblr-lime-lt-rgb: 33, 51, 48;--tblr-green-lt: #1a3235;--tblr-green-lt-rgb: 26, 50, 53;--tblr-teal-lt: #17313a;--tblr-teal-lt-rgb: 23, 49, 58;--tblr-cyan-lt: #183140;--tblr-cyan-lt-rgb: 24, 49, 64;--tblr-facebook-lt: #182c46;--tblr-facebook-lt-rgb: 24, 44, 70;--tblr-twitter-lt: #193146;--tblr-twitter-lt-rgb: 25, 49, 70;--tblr-linkedin-lt: #172b41;--tblr-linkedin-lt-rgb: 23, 43, 65;--tblr-google-lt: #2c2834;--tblr-google-lt-rgb: 44, 40, 52;--tblr-youtube-lt: #2f202e;--tblr-youtube-lt-rgb: 47, 32, 46;--tblr-vimeo-lt: #183345;--tblr-vimeo-lt-rgb: 24, 51, 69;--tblr-dribbble-lt: #2d283c;--tblr-dribbble-lt-rgb: 45, 40, 60;--tblr-github-lt: #182330;--tblr-github-lt-rgb: 24, 35, 48;--tblr-instagram-lt: #2c2737;--tblr-instagram-lt-rgb: 44, 39, 55;--tblr-pinterest-lt: #292131;--tblr-pinterest-lt-rgb: 41, 33, 49;--tblr-vk-lt: #202e3f;--tblr-vk-lt-rgb: 32, 46, 63;--tblr-rss-lt: #2f312e;--tblr-rss-lt-rgb: 47, 49, 46;--tblr-flickr-lt: #162a44;--tblr-flickr-lt-rgb: 22, 42, 68;--tblr-bitbucket-lt: #162942;--tblr-bitbucket-lt-rgb: 22, 41, 66;--tblr-tabler-lt: #16293f;--tblr-tabler-lt-rgb: 22, 41, 63}[data-bs-theme=dark] .navbar-brand-autodark .navbar-brand-image{filter:brightness(0) invert(1)}.accordion{--tblr-accordion-color: var(--tblr-body-color)}.accordion-button:focus:not(:focus-visible){outline:none;box-shadow:none}.accordion-button:after{opacity:.7}.accordion-button:not(.collapsed){font-weight:var(--tblr-font-weight-bold);border-bottom-color:transparent;box-shadow:none}.accordion-button:not(.collapsed):after{opacity:1}.alert{--tblr-alert-color: var(--tblr-secondary);--tblr-alert-bg: var(--tblr-surface);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);border-left:.25rem var(--tblr-border-style) var(--tblr-alert-color);box-shadow:#1824330a 0 2px 4px}.alert>:last-child{margin-bottom:0}.alert-important{border-color:transparent;background:var(--tblr-alert-color);color:#fff}.alert-important .alert-icon,.alert-important .alert-link,.alert-important .alert-title,.alert-important .alert-link:hover{color:inherit}.alert-important .btn-close{filter:var(--tblr-btn-close-white-filter)}.alert-link,.alert-link:hover{color:var(--tblr-alert-color)}.alert-primary{--tblr-alert-color: var(--tblr-primary)}.alert-secondary{--tblr-alert-color: var(--tblr-secondary)}.alert-success{--tblr-alert-color: var(--tblr-success)}.alert-info{--tblr-alert-color: var(--tblr-info)}.alert-warning{--tblr-alert-color: var(--tblr-warning)}.alert-danger{--tblr-alert-color: var(--tblr-danger)}.alert-light{--tblr-alert-color: var(--tblr-light)}.alert-dark{--tblr-alert-color: var(--tblr-dark)}.alert-muted{--tblr-alert-color: var(--tblr-muted)}.alert-blue{--tblr-alert-color: var(--tblr-blue)}.alert-azure{--tblr-alert-color: var(--tblr-azure)}.alert-indigo{--tblr-alert-color: var(--tblr-indigo)}.alert-purple{--tblr-alert-color: var(--tblr-purple)}.alert-pink{--tblr-alert-color: var(--tblr-pink)}.alert-red{--tblr-alert-color: var(--tblr-red)}.alert-orange{--tblr-alert-color: var(--tblr-orange)}.alert-yellow{--tblr-alert-color: var(--tblr-yellow)}.alert-lime{--tblr-alert-color: var(--tblr-lime)}.alert-green{--tblr-alert-color: var(--tblr-green)}.alert-teal{--tblr-alert-color: var(--tblr-teal)}.alert-cyan{--tblr-alert-color: var(--tblr-cyan)}.alert-facebook{--tblr-alert-color: var(--tblr-facebook)}.alert-twitter{--tblr-alert-color: var(--tblr-twitter)}.alert-linkedin{--tblr-alert-color: var(--tblr-linkedin)}.alert-google{--tblr-alert-color: var(--tblr-google)}.alert-youtube{--tblr-alert-color: var(--tblr-youtube)}.alert-vimeo{--tblr-alert-color: var(--tblr-vimeo)}.alert-dribbble{--tblr-alert-color: var(--tblr-dribbble)}.alert-github{--tblr-alert-color: var(--tblr-github)}.alert-instagram{--tblr-alert-color: var(--tblr-instagram)}.alert-pinterest{--tblr-alert-color: var(--tblr-pinterest)}.alert-vk{--tblr-alert-color: var(--tblr-vk)}.alert-rss{--tblr-alert-color: var(--tblr-rss)}.alert-flickr{--tblr-alert-color: var(--tblr-flickr)}.alert-bitbucket{--tblr-alert-color: var(--tblr-bitbucket)}.alert-tabler{--tblr-alert-color: var(--tblr-tabler)}.alert-icon{color:var(--tblr-alert-color);width:1.5rem!important;height:1.5rem!important;margin:-.125rem 1rem -.125rem 0}.alert-title{font-size:.875rem;line-height:1.25rem;font-weight:var(--tblr-font-weight-bold);margin-bottom:.25rem;color:var(--tblr-alert-color)}.avatar{--tblr-avatar-size: 2.5rem;--tblr-avatar-status-size: .75rem;--tblr-avatar-bg: var(--tblr-bg-surface-secondary);--tblr-avatar-box-shadow: var(--tblr-box-shadow-border);--tblr-avatar-font-size: 1rem;--tblr-avatar-icon-size: 1.5rem;position:relative;width:var(--tblr-avatar-size);height:var(--tblr-avatar-size);font-size:var(--tblr-avatar-font-size);font-weight:var(--tblr-font-weight-medium);line-height:1;display:inline-flex;align-items:center;justify-content:center;color:var(--tblr-secondary);text-align:center;text-transform:uppercase;vertical-align:bottom;user-select:none;background:var(--tblr-avatar-bg) no-repeat center/cover;border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-avatar-box-shadow)}.avatar .icon{width:var(--tblr-avatar-icon-size);height:var(--tblr-avatar-icon-size)}.avatar .badge{position:absolute;right:0;bottom:0;border-radius:100rem;box-shadow:0 0 0 calc(var(--tblr-avatar-status-size) / 4) var(--tblr-bg-surface)}a.avatar{cursor:pointer}.avatar-rounded{border-radius:100rem}.avatar-xxs{--tblr-avatar-size: 1rem;--tblr-avatar-status-size: .25rem;--tblr-avatar-font-size: .5rem;--tblr-avatar-icon-size: .75rem}.avatar-xxs .badge:empty{width:.25rem;height:.25rem}.avatar-xs{--tblr-avatar-size: 1.25rem;--tblr-avatar-status-size: .375rem;--tblr-avatar-font-size: .625rem;--tblr-avatar-icon-size: 1rem}.avatar-xs .badge:empty{width:.375rem;height:.375rem}.avatar-sm{--tblr-avatar-size: 2rem;--tblr-avatar-status-size: .5rem;--tblr-avatar-font-size: .75rem;--tblr-avatar-icon-size: 1.25rem}.avatar-sm .badge:empty{width:.5rem;height:.5rem}.avatar-md{--tblr-avatar-size: 2.5rem;--tblr-avatar-status-size: .75rem;--tblr-avatar-font-size: .875rem;--tblr-avatar-icon-size: 1.5rem}.avatar-md .badge:empty{width:.75rem;height:.75rem}.avatar-lg{--tblr-avatar-size: 3rem;--tblr-avatar-status-size: .75rem;--tblr-avatar-font-size: 1.25rem;--tblr-avatar-icon-size: 2rem}.avatar-lg .badge:empty{width:.75rem;height:.75rem}.avatar-xl{--tblr-avatar-size: 5rem;--tblr-avatar-status-size: 1rem;--tblr-avatar-font-size: 2rem;--tblr-avatar-icon-size: 3rem}.avatar-xl .badge:empty{width:1rem;height:1rem}.avatar-2xl{--tblr-avatar-size: 7rem;--tblr-avatar-status-size: 1rem;--tblr-avatar-font-size: 3rem;--tblr-avatar-icon-size: 5rem}.avatar-2xl .badge:empty{width:1rem;height:1rem}.avatar-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.avatar-list a.avatar:hover{z-index:1}.avatar-list-stacked{display:block;--tblr-list-gap: 0}.avatar-list-stacked .avatar{margin-right:calc(-.5 * var(--tblr-avatar-size))!important;box-shadow:var(--tblr-avatar-box-shadow),0 0 0 2px var(--tblr-card-cap-bg, var(--tblr-card-bg, var(--tblr-bg-surface)))}.avatar-upload{width:4rem;height:4rem;border:var(--tblr-border-width) dashed var(--tblr-border-color);background:var(--tblr-bg-forms);flex-direction:column;transition:color .3s,background-color .3s}@media (prefers-reduced-motion: reduce){.avatar-upload{transition:none}}.avatar-upload svg{width:1.5rem;height:1.5rem;stroke-width:1}.avatar-upload:hover{border-color:var(--tblr-primary);color:var(--tblr-primary);text-decoration:none}.avatar-upload-text{font-size:.625rem;line-height:1;margin-top:.25rem}.avatar-cover{margin-top:calc(-.5 * var(--tblr-avatar-size));box-shadow:0 0 0 .25rem var(--tblr-card-bg, var(--tblr-body-bg))}.badge{justify-content:center;align-items:center;background:var(--tblr-bg-surface-secondary);overflow:hidden;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) transparent;min-width:1.35714285em;font-weight:var(--tblr-font-weight-bold);letter-spacing:.04em;vertical-align:bottom}a.badge{color:var(--tblr-bg-surface)}.badge .avatar{box-sizing:content-box;width:1.25rem;height:1.25rem;margin:0 .5rem 0 -.5rem}.badge .icon{width:1em;height:1em;font-size:1rem;stroke-width:2}.badge:empty,.badge-empty{display:inline-block;width:.5rem;height:.5rem;min-width:0;min-height:auto;padding:0;border-radius:100rem;vertical-align:baseline}.badge-outline{background-color:transparent;border:var(--tblr-border-width) var(--tblr-border-style) currentColor}.badge-pill{border-radius:100rem}.badges-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.badge-notification{position:absolute!important;top:0!important;right:0!important;transform:translate(50%,-50%);z-index:1}.badge-blink{animation:blink 2s infinite}.breadcrumb{--tblr-breadcrumb-item-active-font-weight: var(--tblr-font-weight-bold);--tblr-breadcrumb-item-disabled-color: var(--tblr-disabled-color);--tblr-breadcrumb-link-color: var(--tblr-link-color);padding:0;margin:0;background:transparent}.breadcrumb a{color:var(--tblr-breadcrumb-link-color)}.breadcrumb a:hover{text-decoration:underline}.breadcrumb-muted{--tblr-breadcrumb-link-color: var(--tblr-secondary)}.breadcrumb-item.active{font-weight:var(--tblr-breadcrumb-item-active-font-weight)}.breadcrumb-item.active a{color:inherit;pointer-events:none}.breadcrumb-item.disabled{color:var(--tblr-breadcrumb-item-disabled-color)}.breadcrumb-item.disabled:before{color:inherit}.breadcrumb-item.disabled a{color:inherit;pointer-events:none}.breadcrumb-dots{--tblr-breadcrumb-divider: "\b7"}.breadcrumb-arrows{--tblr-breadcrumb-divider: "\203a"}.breadcrumb-bullets{--tblr-breadcrumb-divider: "\2022"}.btn{--tblr-btn-icon-size: 1.25rem;--tblr-btn-bg: var(--tblr-bg-surface);--tblr-btn-color: var(--tblr-body-color);--tblr-btn-border-color: var(--tblr-border-color);--tblr-btn-hover-bg: var(--tblr-btn-bg);--tblr-btn-hover-border-color: var(--tblr-border-color-active);--tblr-btn-box-shadow: var(--tblr-box-shadow-input);--tblr-btn-active-color: var(--tblr-primary);--tblr-btn-active-bg: rgba(var(--tblr-primary-rgb), .04);--tblr-btn-active-border-color: var(--tblr-primary);display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;box-shadow:var(--tblr-btn-box-shadow)}.btn .icon{width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);min-width:var(--tblr-btn-icon-size);margin:0 calc(var(--tblr-btn-padding-x) / 2) 0 calc(var(--tblr-btn-padding-x) / -4);vertical-align:bottom;color:inherit}.btn .avatar{width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);margin:0 calc(var(--tblr-btn-padding-x) / 2) 0 calc(var(--tblr-btn-padding-x) / -4)}.btn .icon-right{margin:0 calc(var(--tblr-btn-padding-x) / -4) 0 calc(var(--tblr-btn-padding-x) / 2)}.btn .badge{top:auto}.btn-check+.btn:hover{color:var(--tblr-btn-hover-color);background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color)}.btn-link{color:#0054a6;background-color:transparent;border-color:transparent;box-shadow:none}.btn-link .icon{color:inherit}.btn-link:hover{color:#004385;border-color:transparent}.btn-primary{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-primary-fg);--tblr-btn-bg: var(--tblr-primary);--tblr-btn-hover-color: var(--tblr-primary-fg);--tblr-btn-hover-bg: rgba(var(--tblr-primary-rgb), .8);--tblr-btn-active-color: var(--tblr-primary-fg);--tblr-btn-active-bg: rgba(var(--tblr-primary-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-primary);--tblr-btn-disabled-color: var(--tblr-primary-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-primary{--tblr-btn-color: var(--tblr-primary);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-primary);--tblr-btn-hover-color: var(--tblr-primary-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-primary);--tblr-btn-active-color: var(--tblr-primary-fg);--tblr-btn-active-bg: var(--tblr-primary);--tblr-btn-disabled-color: var(--tblr-primary);--tblr-btn-disabled-border-color: var(--tblr-primary)}.btn-secondary{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-secondary-fg);--tblr-btn-bg: var(--tblr-secondary);--tblr-btn-hover-color: var(--tblr-secondary-fg);--tblr-btn-hover-bg: rgba(var(--tblr-secondary-rgb), .8);--tblr-btn-active-color: var(--tblr-secondary-fg);--tblr-btn-active-bg: rgba(var(--tblr-secondary-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-secondary);--tblr-btn-disabled-color: var(--tblr-secondary-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-secondary{--tblr-btn-color: var(--tblr-secondary);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-secondary);--tblr-btn-hover-color: var(--tblr-secondary-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-secondary);--tblr-btn-active-color: var(--tblr-secondary-fg);--tblr-btn-active-bg: var(--tblr-secondary);--tblr-btn-disabled-color: var(--tblr-secondary);--tblr-btn-disabled-border-color: var(--tblr-secondary)}.btn-success{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-success-fg);--tblr-btn-bg: var(--tblr-success);--tblr-btn-hover-color: var(--tblr-success-fg);--tblr-btn-hover-bg: rgba(var(--tblr-success-rgb), .8);--tblr-btn-active-color: var(--tblr-success-fg);--tblr-btn-active-bg: rgba(var(--tblr-success-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-success);--tblr-btn-disabled-color: var(--tblr-success-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-success{--tblr-btn-color: var(--tblr-success);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-success);--tblr-btn-hover-color: var(--tblr-success-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-success);--tblr-btn-active-color: var(--tblr-success-fg);--tblr-btn-active-bg: var(--tblr-success);--tblr-btn-disabled-color: var(--tblr-success);--tblr-btn-disabled-border-color: var(--tblr-success)}.btn-info{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-info-fg);--tblr-btn-bg: var(--tblr-info);--tblr-btn-hover-color: var(--tblr-info-fg);--tblr-btn-hover-bg: rgba(var(--tblr-info-rgb), .8);--tblr-btn-active-color: var(--tblr-info-fg);--tblr-btn-active-bg: rgba(var(--tblr-info-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-info);--tblr-btn-disabled-color: var(--tblr-info-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-info{--tblr-btn-color: var(--tblr-info);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-info);--tblr-btn-hover-color: var(--tblr-info-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-info);--tblr-btn-active-color: var(--tblr-info-fg);--tblr-btn-active-bg: var(--tblr-info);--tblr-btn-disabled-color: var(--tblr-info);--tblr-btn-disabled-border-color: var(--tblr-info)}.btn-warning{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-warning-fg);--tblr-btn-bg: var(--tblr-warning);--tblr-btn-hover-color: var(--tblr-warning-fg);--tblr-btn-hover-bg: rgba(var(--tblr-warning-rgb), .8);--tblr-btn-active-color: var(--tblr-warning-fg);--tblr-btn-active-bg: rgba(var(--tblr-warning-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-warning);--tblr-btn-disabled-color: var(--tblr-warning-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-warning{--tblr-btn-color: var(--tblr-warning);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-warning);--tblr-btn-hover-color: var(--tblr-warning-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-warning);--tblr-btn-active-color: var(--tblr-warning-fg);--tblr-btn-active-bg: var(--tblr-warning);--tblr-btn-disabled-color: var(--tblr-warning);--tblr-btn-disabled-border-color: var(--tblr-warning)}.btn-danger{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-danger-fg);--tblr-btn-bg: var(--tblr-danger);--tblr-btn-hover-color: var(--tblr-danger-fg);--tblr-btn-hover-bg: rgba(var(--tblr-danger-rgb), .8);--tblr-btn-active-color: var(--tblr-danger-fg);--tblr-btn-active-bg: rgba(var(--tblr-danger-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-danger);--tblr-btn-disabled-color: var(--tblr-danger-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-danger{--tblr-btn-color: var(--tblr-danger);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-danger);--tblr-btn-hover-color: var(--tblr-danger-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-danger);--tblr-btn-active-color: var(--tblr-danger-fg);--tblr-btn-active-bg: var(--tblr-danger);--tblr-btn-disabled-color: var(--tblr-danger);--tblr-btn-disabled-border-color: var(--tblr-danger)}.btn-light{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-light-fg);--tblr-btn-bg: var(--tblr-light);--tblr-btn-hover-color: var(--tblr-light-fg);--tblr-btn-hover-bg: rgba(var(--tblr-light-rgb), .8);--tblr-btn-active-color: var(--tblr-light-fg);--tblr-btn-active-bg: rgba(var(--tblr-light-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-light);--tblr-btn-disabled-color: var(--tblr-light-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-light{--tblr-btn-color: var(--tblr-light);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-light);--tblr-btn-hover-color: var(--tblr-light-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-light);--tblr-btn-active-color: var(--tblr-light-fg);--tblr-btn-active-bg: var(--tblr-light);--tblr-btn-disabled-color: var(--tblr-light);--tblr-btn-disabled-border-color: var(--tblr-light)}.btn-dark{--tblr-btn-border-color: var(--tblr-dark-mode-border-color);--tblr-btn-hover-border-color: var(--tblr-dark-mode-border-color-active);--tblr-btn-active-border-color: var(--tblr-dark-mode-border-color-active);--tblr-btn-color: var(--tblr-dark-fg);--tblr-btn-bg: var(--tblr-dark);--tblr-btn-hover-color: var(--tblr-dark-fg);--tblr-btn-hover-bg: rgba(var(--tblr-dark-rgb), .8);--tblr-btn-active-color: var(--tblr-dark-fg);--tblr-btn-active-bg: rgba(var(--tblr-dark-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-dark);--tblr-btn-disabled-color: var(--tblr-dark-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-dark{--tblr-btn-color: var(--tblr-dark);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-dark);--tblr-btn-hover-color: var(--tblr-dark-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-dark);--tblr-btn-active-color: var(--tblr-dark-fg);--tblr-btn-active-bg: var(--tblr-dark);--tblr-btn-disabled-color: var(--tblr-dark);--tblr-btn-disabled-border-color: var(--tblr-dark)}.btn-muted{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-muted-fg);--tblr-btn-bg: var(--tblr-muted);--tblr-btn-hover-color: var(--tblr-muted-fg);--tblr-btn-hover-bg: rgba(var(--tblr-muted-rgb), .8);--tblr-btn-active-color: var(--tblr-muted-fg);--tblr-btn-active-bg: rgba(var(--tblr-muted-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-muted);--tblr-btn-disabled-color: var(--tblr-muted-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-muted{--tblr-btn-color: var(--tblr-muted);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-muted);--tblr-btn-hover-color: var(--tblr-muted-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-muted);--tblr-btn-active-color: var(--tblr-muted-fg);--tblr-btn-active-bg: var(--tblr-muted);--tblr-btn-disabled-color: var(--tblr-muted);--tblr-btn-disabled-border-color: var(--tblr-muted)}.btn-blue{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-blue-fg);--tblr-btn-bg: var(--tblr-blue);--tblr-btn-hover-color: var(--tblr-blue-fg);--tblr-btn-hover-bg: rgba(var(--tblr-blue-rgb), .8);--tblr-btn-active-color: var(--tblr-blue-fg);--tblr-btn-active-bg: rgba(var(--tblr-blue-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-blue);--tblr-btn-disabled-color: var(--tblr-blue-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-blue{--tblr-btn-color: var(--tblr-blue);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-blue);--tblr-btn-hover-color: var(--tblr-blue-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-blue);--tblr-btn-active-color: var(--tblr-blue-fg);--tblr-btn-active-bg: var(--tblr-blue);--tblr-btn-disabled-color: var(--tblr-blue);--tblr-btn-disabled-border-color: var(--tblr-blue)}.btn-azure{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-azure-fg);--tblr-btn-bg: var(--tblr-azure);--tblr-btn-hover-color: var(--tblr-azure-fg);--tblr-btn-hover-bg: rgba(var(--tblr-azure-rgb), .8);--tblr-btn-active-color: var(--tblr-azure-fg);--tblr-btn-active-bg: rgba(var(--tblr-azure-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-azure);--tblr-btn-disabled-color: var(--tblr-azure-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-azure{--tblr-btn-color: var(--tblr-azure);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-azure);--tblr-btn-hover-color: var(--tblr-azure-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-azure);--tblr-btn-active-color: var(--tblr-azure-fg);--tblr-btn-active-bg: var(--tblr-azure);--tblr-btn-disabled-color: var(--tblr-azure);--tblr-btn-disabled-border-color: var(--tblr-azure)}.btn-indigo{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-indigo-fg);--tblr-btn-bg: var(--tblr-indigo);--tblr-btn-hover-color: var(--tblr-indigo-fg);--tblr-btn-hover-bg: rgba(var(--tblr-indigo-rgb), .8);--tblr-btn-active-color: var(--tblr-indigo-fg);--tblr-btn-active-bg: rgba(var(--tblr-indigo-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-indigo);--tblr-btn-disabled-color: var(--tblr-indigo-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-indigo{--tblr-btn-color: var(--tblr-indigo);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-indigo);--tblr-btn-hover-color: var(--tblr-indigo-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-indigo);--tblr-btn-active-color: var(--tblr-indigo-fg);--tblr-btn-active-bg: var(--tblr-indigo);--tblr-btn-disabled-color: var(--tblr-indigo);--tblr-btn-disabled-border-color: var(--tblr-indigo)}.btn-purple{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-purple-fg);--tblr-btn-bg: var(--tblr-purple);--tblr-btn-hover-color: var(--tblr-purple-fg);--tblr-btn-hover-bg: rgba(var(--tblr-purple-rgb), .8);--tblr-btn-active-color: var(--tblr-purple-fg);--tblr-btn-active-bg: rgba(var(--tblr-purple-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-purple);--tblr-btn-disabled-color: var(--tblr-purple-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-purple{--tblr-btn-color: var(--tblr-purple);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-purple);--tblr-btn-hover-color: var(--tblr-purple-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-purple);--tblr-btn-active-color: var(--tblr-purple-fg);--tblr-btn-active-bg: var(--tblr-purple);--tblr-btn-disabled-color: var(--tblr-purple);--tblr-btn-disabled-border-color: var(--tblr-purple)}.btn-pink{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-pink-fg);--tblr-btn-bg: var(--tblr-pink);--tblr-btn-hover-color: var(--tblr-pink-fg);--tblr-btn-hover-bg: rgba(var(--tblr-pink-rgb), .8);--tblr-btn-active-color: var(--tblr-pink-fg);--tblr-btn-active-bg: rgba(var(--tblr-pink-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-pink);--tblr-btn-disabled-color: var(--tblr-pink-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-pink{--tblr-btn-color: var(--tblr-pink);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-pink);--tblr-btn-hover-color: var(--tblr-pink-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-pink);--tblr-btn-active-color: var(--tblr-pink-fg);--tblr-btn-active-bg: var(--tblr-pink);--tblr-btn-disabled-color: var(--tblr-pink);--tblr-btn-disabled-border-color: var(--tblr-pink)}.btn-red{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-red-fg);--tblr-btn-bg: var(--tblr-red);--tblr-btn-hover-color: var(--tblr-red-fg);--tblr-btn-hover-bg: rgba(var(--tblr-red-rgb), .8);--tblr-btn-active-color: var(--tblr-red-fg);--tblr-btn-active-bg: rgba(var(--tblr-red-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-red);--tblr-btn-disabled-color: var(--tblr-red-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-red{--tblr-btn-color: var(--tblr-red);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-red);--tblr-btn-hover-color: var(--tblr-red-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-red);--tblr-btn-active-color: var(--tblr-red-fg);--tblr-btn-active-bg: var(--tblr-red);--tblr-btn-disabled-color: var(--tblr-red);--tblr-btn-disabled-border-color: var(--tblr-red)}.btn-orange{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-orange-fg);--tblr-btn-bg: var(--tblr-orange);--tblr-btn-hover-color: var(--tblr-orange-fg);--tblr-btn-hover-bg: rgba(var(--tblr-orange-rgb), .8);--tblr-btn-active-color: var(--tblr-orange-fg);--tblr-btn-active-bg: rgba(var(--tblr-orange-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-orange);--tblr-btn-disabled-color: var(--tblr-orange-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-orange{--tblr-btn-color: var(--tblr-orange);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-orange);--tblr-btn-hover-color: var(--tblr-orange-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-orange);--tblr-btn-active-color: var(--tblr-orange-fg);--tblr-btn-active-bg: var(--tblr-orange);--tblr-btn-disabled-color: var(--tblr-orange);--tblr-btn-disabled-border-color: var(--tblr-orange)}.btn-yellow{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-yellow-fg);--tblr-btn-bg: var(--tblr-yellow);--tblr-btn-hover-color: var(--tblr-yellow-fg);--tblr-btn-hover-bg: rgba(var(--tblr-yellow-rgb), .8);--tblr-btn-active-color: var(--tblr-yellow-fg);--tblr-btn-active-bg: rgba(var(--tblr-yellow-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-yellow);--tblr-btn-disabled-color: var(--tblr-yellow-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-yellow{--tblr-btn-color: var(--tblr-yellow);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-yellow);--tblr-btn-hover-color: var(--tblr-yellow-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-yellow);--tblr-btn-active-color: var(--tblr-yellow-fg);--tblr-btn-active-bg: var(--tblr-yellow);--tblr-btn-disabled-color: var(--tblr-yellow);--tblr-btn-disabled-border-color: var(--tblr-yellow)}.btn-lime{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-lime-fg);--tblr-btn-bg: var(--tblr-lime);--tblr-btn-hover-color: var(--tblr-lime-fg);--tblr-btn-hover-bg: rgba(var(--tblr-lime-rgb), .8);--tblr-btn-active-color: var(--tblr-lime-fg);--tblr-btn-active-bg: rgba(var(--tblr-lime-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-lime);--tblr-btn-disabled-color: var(--tblr-lime-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-lime{--tblr-btn-color: var(--tblr-lime);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-lime);--tblr-btn-hover-color: var(--tblr-lime-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-lime);--tblr-btn-active-color: var(--tblr-lime-fg);--tblr-btn-active-bg: var(--tblr-lime);--tblr-btn-disabled-color: var(--tblr-lime);--tblr-btn-disabled-border-color: var(--tblr-lime)}.btn-green{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-green-fg);--tblr-btn-bg: var(--tblr-green);--tblr-btn-hover-color: var(--tblr-green-fg);--tblr-btn-hover-bg: rgba(var(--tblr-green-rgb), .8);--tblr-btn-active-color: var(--tblr-green-fg);--tblr-btn-active-bg: rgba(var(--tblr-green-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-green);--tblr-btn-disabled-color: var(--tblr-green-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-green{--tblr-btn-color: var(--tblr-green);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-green);--tblr-btn-hover-color: var(--tblr-green-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-green);--tblr-btn-active-color: var(--tblr-green-fg);--tblr-btn-active-bg: var(--tblr-green);--tblr-btn-disabled-color: var(--tblr-green);--tblr-btn-disabled-border-color: var(--tblr-green)}.btn-teal{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-teal-fg);--tblr-btn-bg: var(--tblr-teal);--tblr-btn-hover-color: var(--tblr-teal-fg);--tblr-btn-hover-bg: rgba(var(--tblr-teal-rgb), .8);--tblr-btn-active-color: var(--tblr-teal-fg);--tblr-btn-active-bg: rgba(var(--tblr-teal-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-teal);--tblr-btn-disabled-color: var(--tblr-teal-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-teal{--tblr-btn-color: var(--tblr-teal);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-teal);--tblr-btn-hover-color: var(--tblr-teal-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-teal);--tblr-btn-active-color: var(--tblr-teal-fg);--tblr-btn-active-bg: var(--tblr-teal);--tblr-btn-disabled-color: var(--tblr-teal);--tblr-btn-disabled-border-color: var(--tblr-teal)}.btn-cyan{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-cyan-fg);--tblr-btn-bg: var(--tblr-cyan);--tblr-btn-hover-color: var(--tblr-cyan-fg);--tblr-btn-hover-bg: rgba(var(--tblr-cyan-rgb), .8);--tblr-btn-active-color: var(--tblr-cyan-fg);--tblr-btn-active-bg: rgba(var(--tblr-cyan-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-cyan);--tblr-btn-disabled-color: var(--tblr-cyan-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-cyan{--tblr-btn-color: var(--tblr-cyan);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-cyan);--tblr-btn-hover-color: var(--tblr-cyan-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-cyan);--tblr-btn-active-color: var(--tblr-cyan-fg);--tblr-btn-active-bg: var(--tblr-cyan);--tblr-btn-disabled-color: var(--tblr-cyan);--tblr-btn-disabled-border-color: var(--tblr-cyan)}.btn-facebook{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-facebook-fg);--tblr-btn-bg: var(--tblr-facebook);--tblr-btn-hover-color: var(--tblr-facebook-fg);--tblr-btn-hover-bg: rgba(var(--tblr-facebook-rgb), .8);--tblr-btn-active-color: var(--tblr-facebook-fg);--tblr-btn-active-bg: rgba(var(--tblr-facebook-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-facebook);--tblr-btn-disabled-color: var(--tblr-facebook-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-facebook{--tblr-btn-color: var(--tblr-facebook);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-facebook);--tblr-btn-hover-color: var(--tblr-facebook-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-facebook);--tblr-btn-active-color: var(--tblr-facebook-fg);--tblr-btn-active-bg: var(--tblr-facebook);--tblr-btn-disabled-color: var(--tblr-facebook);--tblr-btn-disabled-border-color: var(--tblr-facebook)}.btn-twitter{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-twitter-fg);--tblr-btn-bg: var(--tblr-twitter);--tblr-btn-hover-color: var(--tblr-twitter-fg);--tblr-btn-hover-bg: rgba(var(--tblr-twitter-rgb), .8);--tblr-btn-active-color: var(--tblr-twitter-fg);--tblr-btn-active-bg: rgba(var(--tblr-twitter-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-twitter);--tblr-btn-disabled-color: var(--tblr-twitter-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-twitter{--tblr-btn-color: var(--tblr-twitter);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-twitter);--tblr-btn-hover-color: var(--tblr-twitter-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-twitter);--tblr-btn-active-color: var(--tblr-twitter-fg);--tblr-btn-active-bg: var(--tblr-twitter);--tblr-btn-disabled-color: var(--tblr-twitter);--tblr-btn-disabled-border-color: var(--tblr-twitter)}.btn-linkedin{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-linkedin-fg);--tblr-btn-bg: var(--tblr-linkedin);--tblr-btn-hover-color: var(--tblr-linkedin-fg);--tblr-btn-hover-bg: rgba(var(--tblr-linkedin-rgb), .8);--tblr-btn-active-color: var(--tblr-linkedin-fg);--tblr-btn-active-bg: rgba(var(--tblr-linkedin-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-linkedin);--tblr-btn-disabled-color: var(--tblr-linkedin-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-linkedin{--tblr-btn-color: var(--tblr-linkedin);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-linkedin);--tblr-btn-hover-color: var(--tblr-linkedin-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-linkedin);--tblr-btn-active-color: var(--tblr-linkedin-fg);--tblr-btn-active-bg: var(--tblr-linkedin);--tblr-btn-disabled-color: var(--tblr-linkedin);--tblr-btn-disabled-border-color: var(--tblr-linkedin)}.btn-google{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-google-fg);--tblr-btn-bg: var(--tblr-google);--tblr-btn-hover-color: var(--tblr-google-fg);--tblr-btn-hover-bg: rgba(var(--tblr-google-rgb), .8);--tblr-btn-active-color: var(--tblr-google-fg);--tblr-btn-active-bg: rgba(var(--tblr-google-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-google);--tblr-btn-disabled-color: var(--tblr-google-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-google{--tblr-btn-color: var(--tblr-google);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-google);--tblr-btn-hover-color: var(--tblr-google-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-google);--tblr-btn-active-color: var(--tblr-google-fg);--tblr-btn-active-bg: var(--tblr-google);--tblr-btn-disabled-color: var(--tblr-google);--tblr-btn-disabled-border-color: var(--tblr-google)}.btn-youtube{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-youtube-fg);--tblr-btn-bg: var(--tblr-youtube);--tblr-btn-hover-color: var(--tblr-youtube-fg);--tblr-btn-hover-bg: rgba(var(--tblr-youtube-rgb), .8);--tblr-btn-active-color: var(--tblr-youtube-fg);--tblr-btn-active-bg: rgba(var(--tblr-youtube-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-youtube);--tblr-btn-disabled-color: var(--tblr-youtube-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-youtube{--tblr-btn-color: var(--tblr-youtube);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-youtube);--tblr-btn-hover-color: var(--tblr-youtube-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-youtube);--tblr-btn-active-color: var(--tblr-youtube-fg);--tblr-btn-active-bg: var(--tblr-youtube);--tblr-btn-disabled-color: var(--tblr-youtube);--tblr-btn-disabled-border-color: var(--tblr-youtube)}.btn-vimeo{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-vimeo-fg);--tblr-btn-bg: var(--tblr-vimeo);--tblr-btn-hover-color: var(--tblr-vimeo-fg);--tblr-btn-hover-bg: rgba(var(--tblr-vimeo-rgb), .8);--tblr-btn-active-color: var(--tblr-vimeo-fg);--tblr-btn-active-bg: rgba(var(--tblr-vimeo-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-vimeo);--tblr-btn-disabled-color: var(--tblr-vimeo-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-vimeo{--tblr-btn-color: var(--tblr-vimeo);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-vimeo);--tblr-btn-hover-color: var(--tblr-vimeo-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-vimeo);--tblr-btn-active-color: var(--tblr-vimeo-fg);--tblr-btn-active-bg: var(--tblr-vimeo);--tblr-btn-disabled-color: var(--tblr-vimeo);--tblr-btn-disabled-border-color: var(--tblr-vimeo)}.btn-dribbble{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-dribbble-fg);--tblr-btn-bg: var(--tblr-dribbble);--tblr-btn-hover-color: var(--tblr-dribbble-fg);--tblr-btn-hover-bg: rgba(var(--tblr-dribbble-rgb), .8);--tblr-btn-active-color: var(--tblr-dribbble-fg);--tblr-btn-active-bg: rgba(var(--tblr-dribbble-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-dribbble);--tblr-btn-disabled-color: var(--tblr-dribbble-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-dribbble{--tblr-btn-color: var(--tblr-dribbble);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-dribbble);--tblr-btn-hover-color: var(--tblr-dribbble-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-dribbble);--tblr-btn-active-color: var(--tblr-dribbble-fg);--tblr-btn-active-bg: var(--tblr-dribbble);--tblr-btn-disabled-color: var(--tblr-dribbble);--tblr-btn-disabled-border-color: var(--tblr-dribbble)}.btn-github{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-github-fg);--tblr-btn-bg: var(--tblr-github);--tblr-btn-hover-color: var(--tblr-github-fg);--tblr-btn-hover-bg: rgba(var(--tblr-github-rgb), .8);--tblr-btn-active-color: var(--tblr-github-fg);--tblr-btn-active-bg: rgba(var(--tblr-github-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-github);--tblr-btn-disabled-color: var(--tblr-github-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-github{--tblr-btn-color: var(--tblr-github);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-github);--tblr-btn-hover-color: var(--tblr-github-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-github);--tblr-btn-active-color: var(--tblr-github-fg);--tblr-btn-active-bg: var(--tblr-github);--tblr-btn-disabled-color: var(--tblr-github);--tblr-btn-disabled-border-color: var(--tblr-github)}.btn-instagram{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-instagram-fg);--tblr-btn-bg: var(--tblr-instagram);--tblr-btn-hover-color: var(--tblr-instagram-fg);--tblr-btn-hover-bg: rgba(var(--tblr-instagram-rgb), .8);--tblr-btn-active-color: var(--tblr-instagram-fg);--tblr-btn-active-bg: rgba(var(--tblr-instagram-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-instagram);--tblr-btn-disabled-color: var(--tblr-instagram-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-instagram{--tblr-btn-color: var(--tblr-instagram);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-instagram);--tblr-btn-hover-color: var(--tblr-instagram-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-instagram);--tblr-btn-active-color: var(--tblr-instagram-fg);--tblr-btn-active-bg: var(--tblr-instagram);--tblr-btn-disabled-color: var(--tblr-instagram);--tblr-btn-disabled-border-color: var(--tblr-instagram)}.btn-pinterest{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-pinterest-fg);--tblr-btn-bg: var(--tblr-pinterest);--tblr-btn-hover-color: var(--tblr-pinterest-fg);--tblr-btn-hover-bg: rgba(var(--tblr-pinterest-rgb), .8);--tblr-btn-active-color: var(--tblr-pinterest-fg);--tblr-btn-active-bg: rgba(var(--tblr-pinterest-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-pinterest);--tblr-btn-disabled-color: var(--tblr-pinterest-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-pinterest{--tblr-btn-color: var(--tblr-pinterest);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-pinterest);--tblr-btn-hover-color: var(--tblr-pinterest-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-pinterest);--tblr-btn-active-color: var(--tblr-pinterest-fg);--tblr-btn-active-bg: var(--tblr-pinterest);--tblr-btn-disabled-color: var(--tblr-pinterest);--tblr-btn-disabled-border-color: var(--tblr-pinterest)}.btn-vk{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-vk-fg);--tblr-btn-bg: var(--tblr-vk);--tblr-btn-hover-color: var(--tblr-vk-fg);--tblr-btn-hover-bg: rgba(var(--tblr-vk-rgb), .8);--tblr-btn-active-color: var(--tblr-vk-fg);--tblr-btn-active-bg: rgba(var(--tblr-vk-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-vk);--tblr-btn-disabled-color: var(--tblr-vk-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-vk{--tblr-btn-color: var(--tblr-vk);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-vk);--tblr-btn-hover-color: var(--tblr-vk-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-vk);--tblr-btn-active-color: var(--tblr-vk-fg);--tblr-btn-active-bg: var(--tblr-vk);--tblr-btn-disabled-color: var(--tblr-vk);--tblr-btn-disabled-border-color: var(--tblr-vk)}.btn-rss{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-rss-fg);--tblr-btn-bg: var(--tblr-rss);--tblr-btn-hover-color: var(--tblr-rss-fg);--tblr-btn-hover-bg: rgba(var(--tblr-rss-rgb), .8);--tblr-btn-active-color: var(--tblr-rss-fg);--tblr-btn-active-bg: rgba(var(--tblr-rss-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-rss);--tblr-btn-disabled-color: var(--tblr-rss-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-rss{--tblr-btn-color: var(--tblr-rss);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-rss);--tblr-btn-hover-color: var(--tblr-rss-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-rss);--tblr-btn-active-color: var(--tblr-rss-fg);--tblr-btn-active-bg: var(--tblr-rss);--tblr-btn-disabled-color: var(--tblr-rss);--tblr-btn-disabled-border-color: var(--tblr-rss)}.btn-flickr{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-flickr-fg);--tblr-btn-bg: var(--tblr-flickr);--tblr-btn-hover-color: var(--tblr-flickr-fg);--tblr-btn-hover-bg: rgba(var(--tblr-flickr-rgb), .8);--tblr-btn-active-color: var(--tblr-flickr-fg);--tblr-btn-active-bg: rgba(var(--tblr-flickr-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-flickr);--tblr-btn-disabled-color: var(--tblr-flickr-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-flickr{--tblr-btn-color: var(--tblr-flickr);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-flickr);--tblr-btn-hover-color: var(--tblr-flickr-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-flickr);--tblr-btn-active-color: var(--tblr-flickr-fg);--tblr-btn-active-bg: var(--tblr-flickr);--tblr-btn-disabled-color: var(--tblr-flickr);--tblr-btn-disabled-border-color: var(--tblr-flickr)}.btn-bitbucket{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-bitbucket-fg);--tblr-btn-bg: var(--tblr-bitbucket);--tblr-btn-hover-color: var(--tblr-bitbucket-fg);--tblr-btn-hover-bg: rgba(var(--tblr-bitbucket-rgb), .8);--tblr-btn-active-color: var(--tblr-bitbucket-fg);--tblr-btn-active-bg: rgba(var(--tblr-bitbucket-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-bitbucket);--tblr-btn-disabled-color: var(--tblr-bitbucket-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-bitbucket{--tblr-btn-color: var(--tblr-bitbucket);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-bitbucket);--tblr-btn-hover-color: var(--tblr-bitbucket-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-bitbucket);--tblr-btn-active-color: var(--tblr-bitbucket-fg);--tblr-btn-active-bg: var(--tblr-bitbucket);--tblr-btn-disabled-color: var(--tblr-bitbucket);--tblr-btn-disabled-border-color: var(--tblr-bitbucket)}.btn-tabler{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-tabler-fg);--tblr-btn-bg: var(--tblr-tabler);--tblr-btn-hover-color: var(--tblr-tabler-fg);--tblr-btn-hover-bg: rgba(var(--tblr-tabler-rgb), .8);--tblr-btn-active-color: var(--tblr-tabler-fg);--tblr-btn-active-bg: rgba(var(--tblr-tabler-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-tabler);--tblr-btn-disabled-color: var(--tblr-tabler-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-tabler{--tblr-btn-color: var(--tblr-tabler);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-tabler);--tblr-btn-hover-color: var(--tblr-tabler-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-tabler);--tblr-btn-active-color: var(--tblr-tabler-fg);--tblr-btn-active-bg: var(--tblr-tabler);--tblr-btn-disabled-color: var(--tblr-tabler);--tblr-btn-disabled-border-color: var(--tblr-tabler)}.btn-ghost-primary{--tblr-btn-color: var(--tblr-primary);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-primary-fg);--tblr-btn-hover-bg: var(--tblr-primary);--tblr-btn-hover-border-color: var(--tblr-primary);--tblr-btn-active-color: var(--tblr-primary-fg);--tblr-btn-active-bg: var(--tblr-primary);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-primary);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-secondary{--tblr-btn-color: var(--tblr-secondary);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-secondary-fg);--tblr-btn-hover-bg: var(--tblr-secondary);--tblr-btn-hover-border-color: var(--tblr-secondary);--tblr-btn-active-color: var(--tblr-secondary-fg);--tblr-btn-active-bg: var(--tblr-secondary);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-secondary);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-success{--tblr-btn-color: var(--tblr-success);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-success-fg);--tblr-btn-hover-bg: var(--tblr-success);--tblr-btn-hover-border-color: var(--tblr-success);--tblr-btn-active-color: var(--tblr-success-fg);--tblr-btn-active-bg: var(--tblr-success);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-success);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-info{--tblr-btn-color: var(--tblr-info);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-info-fg);--tblr-btn-hover-bg: var(--tblr-info);--tblr-btn-hover-border-color: var(--tblr-info);--tblr-btn-active-color: var(--tblr-info-fg);--tblr-btn-active-bg: var(--tblr-info);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-info);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-warning{--tblr-btn-color: var(--tblr-warning);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-warning-fg);--tblr-btn-hover-bg: var(--tblr-warning);--tblr-btn-hover-border-color: var(--tblr-warning);--tblr-btn-active-color: var(--tblr-warning-fg);--tblr-btn-active-bg: var(--tblr-warning);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-warning);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-danger{--tblr-btn-color: var(--tblr-danger);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-danger-fg);--tblr-btn-hover-bg: var(--tblr-danger);--tblr-btn-hover-border-color: var(--tblr-danger);--tblr-btn-active-color: var(--tblr-danger-fg);--tblr-btn-active-bg: var(--tblr-danger);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-danger);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-light{--tblr-btn-color: var(--tblr-light);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-light-fg);--tblr-btn-hover-bg: var(--tblr-light);--tblr-btn-hover-border-color: var(--tblr-light);--tblr-btn-active-color: var(--tblr-light-fg);--tblr-btn-active-bg: var(--tblr-light);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-light);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-dark{--tblr-btn-color: var(--tblr-dark);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-dark-fg);--tblr-btn-hover-bg: var(--tblr-dark);--tblr-btn-hover-border-color: var(--tblr-dark);--tblr-btn-active-color: var(--tblr-dark-fg);--tblr-btn-active-bg: var(--tblr-dark);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-dark);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-muted{--tblr-btn-color: var(--tblr-muted);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-muted-fg);--tblr-btn-hover-bg: var(--tblr-muted);--tblr-btn-hover-border-color: var(--tblr-muted);--tblr-btn-active-color: var(--tblr-muted-fg);--tblr-btn-active-bg: var(--tblr-muted);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-muted);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-blue{--tblr-btn-color: var(--tblr-blue);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-blue-fg);--tblr-btn-hover-bg: var(--tblr-blue);--tblr-btn-hover-border-color: var(--tblr-blue);--tblr-btn-active-color: var(--tblr-blue-fg);--tblr-btn-active-bg: var(--tblr-blue);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-blue);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-azure{--tblr-btn-color: var(--tblr-azure);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-azure-fg);--tblr-btn-hover-bg: var(--tblr-azure);--tblr-btn-hover-border-color: var(--tblr-azure);--tblr-btn-active-color: var(--tblr-azure-fg);--tblr-btn-active-bg: var(--tblr-azure);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-azure);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-indigo{--tblr-btn-color: var(--tblr-indigo);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-indigo-fg);--tblr-btn-hover-bg: var(--tblr-indigo);--tblr-btn-hover-border-color: var(--tblr-indigo);--tblr-btn-active-color: var(--tblr-indigo-fg);--tblr-btn-active-bg: var(--tblr-indigo);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-indigo);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-purple{--tblr-btn-color: var(--tblr-purple);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-purple-fg);--tblr-btn-hover-bg: var(--tblr-purple);--tblr-btn-hover-border-color: var(--tblr-purple);--tblr-btn-active-color: var(--tblr-purple-fg);--tblr-btn-active-bg: var(--tblr-purple);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-purple);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-pink{--tblr-btn-color: var(--tblr-pink);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-pink-fg);--tblr-btn-hover-bg: var(--tblr-pink);--tblr-btn-hover-border-color: var(--tblr-pink);--tblr-btn-active-color: var(--tblr-pink-fg);--tblr-btn-active-bg: var(--tblr-pink);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-pink);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-red{--tblr-btn-color: var(--tblr-red);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-red-fg);--tblr-btn-hover-bg: var(--tblr-red);--tblr-btn-hover-border-color: var(--tblr-red);--tblr-btn-active-color: var(--tblr-red-fg);--tblr-btn-active-bg: var(--tblr-red);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-red);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-orange{--tblr-btn-color: var(--tblr-orange);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-orange-fg);--tblr-btn-hover-bg: var(--tblr-orange);--tblr-btn-hover-border-color: var(--tblr-orange);--tblr-btn-active-color: var(--tblr-orange-fg);--tblr-btn-active-bg: var(--tblr-orange);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-orange);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-yellow{--tblr-btn-color: var(--tblr-yellow);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-yellow-fg);--tblr-btn-hover-bg: var(--tblr-yellow);--tblr-btn-hover-border-color: var(--tblr-yellow);--tblr-btn-active-color: var(--tblr-yellow-fg);--tblr-btn-active-bg: var(--tblr-yellow);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-yellow);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-lime{--tblr-btn-color: var(--tblr-lime);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-lime-fg);--tblr-btn-hover-bg: var(--tblr-lime);--tblr-btn-hover-border-color: var(--tblr-lime);--tblr-btn-active-color: var(--tblr-lime-fg);--tblr-btn-active-bg: var(--tblr-lime);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-lime);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-green{--tblr-btn-color: var(--tblr-green);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-green-fg);--tblr-btn-hover-bg: var(--tblr-green);--tblr-btn-hover-border-color: var(--tblr-green);--tblr-btn-active-color: var(--tblr-green-fg);--tblr-btn-active-bg: var(--tblr-green);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-green);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-teal{--tblr-btn-color: var(--tblr-teal);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-teal-fg);--tblr-btn-hover-bg: var(--tblr-teal);--tblr-btn-hover-border-color: var(--tblr-teal);--tblr-btn-active-color: var(--tblr-teal-fg);--tblr-btn-active-bg: var(--tblr-teal);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-teal);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-cyan{--tblr-btn-color: var(--tblr-cyan);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-cyan-fg);--tblr-btn-hover-bg: var(--tblr-cyan);--tblr-btn-hover-border-color: var(--tblr-cyan);--tblr-btn-active-color: var(--tblr-cyan-fg);--tblr-btn-active-bg: var(--tblr-cyan);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-cyan);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-facebook{--tblr-btn-color: var(--tblr-facebook);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-facebook-fg);--tblr-btn-hover-bg: var(--tblr-facebook);--tblr-btn-hover-border-color: var(--tblr-facebook);--tblr-btn-active-color: var(--tblr-facebook-fg);--tblr-btn-active-bg: var(--tblr-facebook);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-facebook);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-twitter{--tblr-btn-color: var(--tblr-twitter);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-twitter-fg);--tblr-btn-hover-bg: var(--tblr-twitter);--tblr-btn-hover-border-color: var(--tblr-twitter);--tblr-btn-active-color: var(--tblr-twitter-fg);--tblr-btn-active-bg: var(--tblr-twitter);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-twitter);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-linkedin{--tblr-btn-color: var(--tblr-linkedin);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-linkedin-fg);--tblr-btn-hover-bg: var(--tblr-linkedin);--tblr-btn-hover-border-color: var(--tblr-linkedin);--tblr-btn-active-color: var(--tblr-linkedin-fg);--tblr-btn-active-bg: var(--tblr-linkedin);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-linkedin);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-google{--tblr-btn-color: var(--tblr-google);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-google-fg);--tblr-btn-hover-bg: var(--tblr-google);--tblr-btn-hover-border-color: var(--tblr-google);--tblr-btn-active-color: var(--tblr-google-fg);--tblr-btn-active-bg: var(--tblr-google);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-google);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-youtube{--tblr-btn-color: var(--tblr-youtube);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-youtube-fg);--tblr-btn-hover-bg: var(--tblr-youtube);--tblr-btn-hover-border-color: var(--tblr-youtube);--tblr-btn-active-color: var(--tblr-youtube-fg);--tblr-btn-active-bg: var(--tblr-youtube);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-youtube);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-vimeo{--tblr-btn-color: var(--tblr-vimeo);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-vimeo-fg);--tblr-btn-hover-bg: var(--tblr-vimeo);--tblr-btn-hover-border-color: var(--tblr-vimeo);--tblr-btn-active-color: var(--tblr-vimeo-fg);--tblr-btn-active-bg: var(--tblr-vimeo);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-vimeo);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-dribbble{--tblr-btn-color: var(--tblr-dribbble);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-dribbble-fg);--tblr-btn-hover-bg: var(--tblr-dribbble);--tblr-btn-hover-border-color: var(--tblr-dribbble);--tblr-btn-active-color: var(--tblr-dribbble-fg);--tblr-btn-active-bg: var(--tblr-dribbble);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-dribbble);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-github{--tblr-btn-color: var(--tblr-github);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-github-fg);--tblr-btn-hover-bg: var(--tblr-github);--tblr-btn-hover-border-color: var(--tblr-github);--tblr-btn-active-color: var(--tblr-github-fg);--tblr-btn-active-bg: var(--tblr-github);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-github);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-instagram{--tblr-btn-color: var(--tblr-instagram);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-instagram-fg);--tblr-btn-hover-bg: var(--tblr-instagram);--tblr-btn-hover-border-color: var(--tblr-instagram);--tblr-btn-active-color: var(--tblr-instagram-fg);--tblr-btn-active-bg: var(--tblr-instagram);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-instagram);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-pinterest{--tblr-btn-color: var(--tblr-pinterest);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-pinterest-fg);--tblr-btn-hover-bg: var(--tblr-pinterest);--tblr-btn-hover-border-color: var(--tblr-pinterest);--tblr-btn-active-color: var(--tblr-pinterest-fg);--tblr-btn-active-bg: var(--tblr-pinterest);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-pinterest);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-vk{--tblr-btn-color: var(--tblr-vk);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-vk-fg);--tblr-btn-hover-bg: var(--tblr-vk);--tblr-btn-hover-border-color: var(--tblr-vk);--tblr-btn-active-color: var(--tblr-vk-fg);--tblr-btn-active-bg: var(--tblr-vk);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-vk);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-rss{--tblr-btn-color: var(--tblr-rss);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-rss-fg);--tblr-btn-hover-bg: var(--tblr-rss);--tblr-btn-hover-border-color: var(--tblr-rss);--tblr-btn-active-color: var(--tblr-rss-fg);--tblr-btn-active-bg: var(--tblr-rss);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-rss);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-flickr{--tblr-btn-color: var(--tblr-flickr);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-flickr-fg);--tblr-btn-hover-bg: var(--tblr-flickr);--tblr-btn-hover-border-color: var(--tblr-flickr);--tblr-btn-active-color: var(--tblr-flickr-fg);--tblr-btn-active-bg: var(--tblr-flickr);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-flickr);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-bitbucket{--tblr-btn-color: var(--tblr-bitbucket);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-bitbucket-fg);--tblr-btn-hover-bg: var(--tblr-bitbucket);--tblr-btn-hover-border-color: var(--tblr-bitbucket);--tblr-btn-active-color: var(--tblr-bitbucket-fg);--tblr-btn-active-bg: var(--tblr-bitbucket);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-bitbucket);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-tabler{--tblr-btn-color: var(--tblr-tabler);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-tabler-fg);--tblr-btn-hover-bg: var(--tblr-tabler);--tblr-btn-hover-border-color: var(--tblr-tabler);--tblr-btn-active-color: var(--tblr-tabler-fg);--tblr-btn-active-bg: var(--tblr-tabler);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-tabler);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-sm,.btn-group-sm>.btn{--tblr-btn-line-height: 1.5;--tblr-btn-icon-size: .75rem}.btn-lg,.btn-group-lg>.btn{--tblr-btn-line-height: 1.5;--tblr-btn-icon-size: 2rem}.btn-pill{padding-right:1.5em;padding-left:1.5em;border-radius:10rem}.btn-pill[class*=btn-icon]{padding:.375rem 15px}.btn-square{border-radius:0}.btn-icon{min-width:calc(var(--tblr-btn-line-height) * var(--tblr-btn-font-size) + var(--tblr-btn-padding-y) * 2 + var(--tblr-btn-border-width) * 2);min-height:calc(var(--tblr-btn-line-height) * var(--tblr-btn-font-size) + var(--tblr-btn-padding-y) * 2 + var(--tblr-btn-border-width) * 2);padding-left:0;padding-right:0}.btn-icon .icon{margin:calc(-1 * var(--tblr-btn-padding-x))}.btn-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.btn-floating{position:fixed;z-index:1030;bottom:1.5rem;right:1.5rem;border-radius:100rem}.btn-loading{position:relative;color:transparent!important;text-shadow:none!important;pointer-events:none}.btn-loading>*{opacity:0}.btn-loading:after{content:"";display:inline-block;vertical-align:text-bottom;border:2px var(--tblr-border-style) currentColor;border-right-color:transparent;border-radius:100rem;color:var(--tblr-btn-color);position:absolute;width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);left:calc(50% - var(--tblr-btn-icon-size) / 2);top:calc(50% - var(--tblr-btn-icon-size) / 2);animation:spinner-border .75s linear infinite}.btn-action{padding:0;border:0;color:var(--tblr-secondary);display:inline-flex;width:2rem;height:2rem;align-items:center;justify-content:center;border-radius:var(--tblr-border-radius);background:transparent}.btn-action:after{content:none}.btn-action:focus{outline:none;box-shadow:none}.btn-action:hover,.btn-action.show{color:var(--tblr-body-color);background:var(--tblr-active-bg)}.btn-action.show{color:var(--tblr-primary)}.btn-action .icon{margin:0;width:1.25rem;height:1.25rem;font-size:1.25rem;stroke-width:1}.btn-actions{display:flex}.btn-group,.btn-group-vertical{box-shadow:var(--tblr-box-shadow-input)}.btn-group>.btn-check:checked+.btn,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:5}.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus{z-index:1}.calendar{display:block;font-size:.765625rem;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.calendar-nav{display:flex;align-items:center}.calendar-title{flex:1;text-align:center}.calendar-body,.calendar-header{display:flex;flex-wrap:wrap;justify-content:flex-start;padding:.5rem 0}.calendar-header{color:var(--tblr-secondary)}.calendar-date{flex:0 0 14.2857142857%;max-width:14.2857142857%;padding:.2rem;text-align:center;border:0}.calendar-date.prev-month,.calendar-date.next-month{opacity:.25}.calendar-date .date-item{position:relative;display:inline-block;width:1.4rem;height:1.4rem;line-height:1.4rem;color:#66758c;text-align:center;text-decoration:none;white-space:nowrap;vertical-align:middle;cursor:pointer;background:0 0;border:var(--tblr-border-width) var(--tblr-border-style) transparent;border-radius:100rem;outline:0;transition:background .3s,border .3s,box-shadow .32s,color .3s}@media (prefers-reduced-motion: reduce){.calendar-date .date-item{transition:none}}.calendar-date .date-item:hover{color:var(--tblr-primary);text-decoration:none;background:#fefeff;border-color:var(--tblr-border-color)}.calendar-date .date-today{color:var(--tblr-primary);border-color:var(--tblr-border-color)}.calendar-range{position:relative}.calendar-range:before{position:absolute;top:50%;right:0;left:0;height:1.4rem;content:"";background:rgba(var(--tblr-primary-rgb),.1);transform:translateY(-50%)}.calendar-range.range-start .date-item,.calendar-range.range-end .date-item{color:#fff;background:var(--tblr-primary);border-color:var(--tblr-primary)}.calendar-range.range-start:before{left:50%}.calendar-range.range-end:before{right:50%}.carousel-indicators-vertical{left:auto;top:0;margin:0 1rem 0 0;flex-direction:column}.carousel-indicators-vertical [data-bs-target]{margin:3px 0;width:3px;height:30px;border:0;border-left:10px var(--tblr-border-style) transparent;border-right:10px var(--tblr-border-style) transparent}.carousel-indicators-dot [data-bs-target]{width:.5rem;height:.5rem;border-radius:100rem;border:10px var(--tblr-border-style) transparent;margin:0}.carousel-indicators-thumb [data-bs-target]{width:2rem;height:auto;background:no-repeat center/cover;border:0;border-radius:var(--tblr-border-radius);box-shadow:rgba(var(--tblr-body-color-rgb),.04) 0 2px 4px;margin:0 3px;opacity:.75}@media (min-width: 992px){.carousel-indicators-thumb [data-bs-target]{width:4rem}}.carousel-indicators-thumb [data-bs-target]:before{content:"";padding-top:var(--tblr-aspect-ratio, 100%);display:block}.carousel-indicators-thumb.carousel-indicators-vertical [data-bs-target]{margin:3px 0}.carousel-caption-background{background:red;position:absolute;left:0;right:0;bottom:0;height:90%;background:linear-gradient(0deg,#182433e6,#18243300)}.card{transition:transform .3s ease-out,opacity .3s ease-out,box-shadow .3s ease-out}@media (prefers-reduced-motion: reduce){.card{transition:none}}@media print{.card{border:none;box-shadow:none}}a.card{color:inherit}a.card:hover{text-decoration:none;box-shadow:rgba(var(--tblr-body-color-rgb),.16) 0 2px 16px}.card .card{box-shadow:none}.card-borderless,.card-borderless .card-header,.card-borderless .card-footer{border-color:transparent}.card-stamp{--tblr-stamp-size: 7rem;position:absolute;top:0;right:0;width:calc(var(--tblr-stamp-size) * 1);height:calc(var(--tblr-stamp-size) * 1);max-height:100%;border-top-right-radius:4px;opacity:.2;overflow:hidden;pointer-events:none}.card-stamp-lg{--tblr-stamp-size: 13rem}.card-stamp-icon{background:var(--tblr-secondary);color:var(--tblr-card-bg, var(--tblr-bg-surface));display:flex;align-items:center;justify-content:center;border-radius:100rem;width:calc(var(--tblr-stamp-size) * 1);height:calc(var(--tblr-stamp-size) * 1);position:relative;top:calc(var(--tblr-stamp-size) * -.25);right:calc(var(--tblr-stamp-size) * -.25);font-size:calc(var(--tblr-stamp-size) * .75);transform:rotate(10deg)}.card-stamp-icon .icon{stroke-width:2;width:calc(var(--tblr-stamp-size) * .75);height:calc(var(--tblr-stamp-size) * .75)}.card-img,.card-img-start{border-top-left-radius:calc(var(--tblr-border-radius) - (var(--tblr-border-width)));border-bottom-left-radius:calc(var(--tblr-border-radius) - (var(--tblr-border-width)))}.card-img,.card-img-end{border-top-right-radius:calc(var(--tblr-border-radius) - (var(--tblr-border-width)));border-bottom-right-radius:calc(var(--tblr-border-radius) - (var(--tblr-border-width)))}.card-img-overlay{display:flex;flex-direction:column;justify-content:flex-end}.card-img-overlay-dark{background-image:linear-gradient(180deg,#0000,#0009)}.card-inactive{pointer-events:none;box-shadow:none}.card-inactive .card-body{opacity:.64}.card-active{--tblr-card-border-color: var(--tblr-primary);--tblr-card-bg: var(--tblr-active-bg)}.card-btn{display:flex;align-items:center;justify-content:center;padding:1.25rem;text-align:center;transition:background .3s;border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);flex:1;color:inherit;font-weight:var(--tblr-font-weight-medium)}@media (prefers-reduced-motion: reduce){.card-btn{transition:none}}.card-btn:hover{text-decoration:none;background:rgba(var(--tblr-primary-rgb),.04)}.card-btn+.card-btn{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-stacked{--tblr-card-stacked-offset: .25rem;position:relative}.card-stacked:after{position:absolute;top:calc(-1 * var(--tblr-card-stacked-offset));right:var(--tblr-card-stacked-offset);left:var(--tblr-card-stacked-offset);height:var(--tblr-card-stacked-offset);content:"";background:var(--tblr-card-bg, var(--tblr-bg-surface));border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-card-border-color);border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-cover{position:relative;padding:1.25rem;background:#666 no-repeat center/cover}.card-cover:before{position:absolute;inset:0;content:"";background:#1824337a}.card-cover:first-child,.card-cover:first-child:before{border-radius:4px 4px 0 0}.card-cover-blurred:before{backdrop-filter:blur(2px)}.card-actions{margin:-.5rem -.5rem -.5rem auto;padding-left:.5rem}.card-actions a{text-decoration:none}.card-header{color:inherit;display:flex;align-items:center;background:transparent}.card-header:first-child{border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-header-light{border-bottom-color:transparent;background:var(--tblr-bg-surface-tertiary)}.card-header-tabs{background:var(--tblr-bg-surface-tertiary);flex:1;margin:calc(var(--tblr-card-cap-padding-y) * -1) calc(var(--tblr-card-cap-padding-x) * -1) calc(var(--tblr-card-cap-padding-y) * -1);padding:calc(var(--tblr-card-cap-padding-y) * .5) calc(var(--tblr-card-cap-padding-x) * .5) 0}.card-header-pills{flex:1;margin-top:-.5rem;margin-bottom:-.5rem}.card-rotate-left{transform:rotate(-1.5deg)}.card-rotate-right{transform:rotate(1.5deg)}.card-link{color:inherit}.card-link:hover{color:inherit;text-decoration:none;box-shadow:0 1px 6px #00000014}.card-link-rotate:hover{transform:rotate(1.5deg);opacity:1}.card-link-pop:hover{transform:translateY(-2px);opacity:1}.card-footer{margin-top:auto}.card-footer:last-child{border-radius:0 0 var(--tblr-card-border-radius) var(--tblr-card-border-radius)}.card-footer-transparent{background:transparent;border-color:transparent;padding-top:0}.card-footer-borderless{border-top:none}.card-progress{height:.25rem}.card-progress:last-child{border-radius:0 0 2px 2px}.card-progress:first-child{border-radius:2px 2px 0 0}.card-meta{color:var(--tblr-secondary)}.card-title{display:block;margin:0 0 1rem;font-size:1rem;font-weight:var(--tblr-font-weight-medium);color:inherit;line-height:1.5rem}a.card-title:hover{color:inherit}.card-header .card-title{margin:0}.card-subtitle{margin-bottom:1.25rem;color:var(--tblr-secondary);font-weight:400}.card-header .card-subtitle{margin:0}.card-title .card-subtitle{margin:0 0 0 .25rem;font-size:.875rem}.card-body{position:relative}.card-body>:last-child{margin-bottom:0}.card-sm>.card-body{padding:1rem}@media (min-width: 768px){.card-md>.card-body{padding:2.5rem}}@media (min-width: 768px){.card-lg>.card-body{padding:2rem}}@media (min-width: 992px){.card-lg>.card-body{padding:4rem}}@media print{.card-body{padding:0}}.card-body+.card-body{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-body-scrollable{overflow:auto}.card-options{top:1.5rem;right:.75rem;display:flex;margin-left:auto}.card-options-link{display:inline-block;min-width:1rem;margin-left:.25rem;color:var(--tblr-secondary)}.card-status-top{position:absolute;top:0;right:0;left:0;height:2px;border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-status-start{position:absolute;right:auto;bottom:0;width:2px;height:100%;border-radius:var(--tblr-card-border-radius) 0 0 var(--tblr-card-border-radius)}.card-status-bottom{position:absolute;top:initial;bottom:0;width:100%;height:2px;border-radius:0 0 var(--tblr-card-border-radius) var(--tblr-card-border-radius)}.card-table{margin-bottom:0!important}.card-table tr td:first-child,.card-table tr th:first-child{padding-left:1.25rem;border-left:0}.card-table tr td:last-child,.card-table tr th:last-child{padding-right:1.25rem;border-right:0}.card-table thead tr:first-child,.card-table tbody tr:first-child,.card-table tfoot tr:first-child,.card-table thead tr:first-child td,.card-table thead tr:first-child th,.card-table tbody tr:first-child td,.card-table tbody tr:first-child th,.card-table tfoot tr:first-child td,.card-table tfoot tr:first-child th{border-top:0}.card-body+.card-table{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-table-border-color)}.card-code{padding:0}.card-code .highlight{margin:0;border:0}.card-code pre{margin:0!important;border:0!important}.card-chart{position:relative;z-index:1;height:3.5rem}.card-avatar{margin-left:auto;margin-right:auto;box-shadow:0 0 0 .25rem var(--tblr-card-bg, var(--tblr-bg-surface));margin-top:calc(-1 * var(--tblr-avatar-size) * .5)}.card-body+.card-list-group{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-list-group .list-group-item{padding-right:1.25rem;padding-left:1.25rem;border-right:0;border-left:0;border-radius:0}.card-list-group .list-group-item:last-child{border-bottom:0}.card-list-group .list-group-item:first-child{border-top:0}.card-tabs .nav-tabs{position:relative;z-index:1000;border-bottom:0}.card-tabs .nav-tabs .nav-link{background:var(--tblr-bg-surface-tertiary);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.card-tabs .nav-tabs .nav-link.active,.card-tabs .nav-tabs .nav-link:active,.card-tabs .nav-tabs .nav-link:hover{border-color:var(--tblr-border-color-translucent);color:var(--tblr-body-color)}.card-tabs .nav-tabs .nav-link.active{color:inherit;background:var(--tblr-card-bg, var(--tblr-bg-surface));border-bottom-color:transparent}.card-tabs .nav-tabs .nav-item:not(:first-child) .nav-link{border-top-left-radius:0}.card-tabs .nav-tabs .nav-item:not(:last-child) .nav-link{border-top-right-radius:0}.card-tabs .nav-tabs .nav-item+.nav-item{margin-left:calc(-1 * var(--tblr-border-width))}.card-tabs .nav-tabs-bottom,.card-tabs .nav-tabs-bottom .nav-link{margin-bottom:0}.card-tabs .nav-tabs-bottom .nav-link.active{border-top-color:transparent}.card-tabs .nav-tabs-bottom .nav-item{margin-top:calc(-1 * var(--tblr-border-width));margin-bottom:0}.card-tabs .nav-tabs-bottom .nav-item .nav-link{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);border-radius:0 0 var(--tblr-border-radius) var(--tblr-border-radius)}.card-tabs .nav-tabs-bottom .nav-item:not(:first-child) .nav-link{border-bottom-left-radius:0}.card-tabs .nav-tabs-bottom .nav-item:not(:last-child) .nav-link{border-bottom-right-radius:0}.card-tabs .card{border-bottom-left-radius:0}.card-tabs .nav-tabs+.tab-content .card{border-bottom-left-radius:var(--tblr-card-border-radius);border-top-left-radius:0}.card-note{--tblr-card-bg: #fff7dd;--tblr-card-border-color: #fff1c9}.btn-close{cursor:pointer}.btn-close:focus{outline:none}.dropdown-menu{user-select:none}.dropdown-menu.card{padding:0;min-width:25rem;display:none}.dropdown-menu.card.show{display:flex}.dropdown-item{min-width:11rem;display:flex;align-items:center;margin:0;line-height:1.4285714286}.dropdown-item-icon{width:1.25rem!important;height:1.25rem!important;margin-right:.5rem;color:var(--tblr-secondary);opacity:.7;text-align:center}.dropdown-item-indicator{margin-right:.5rem;margin-left:-.25rem;height:1.25rem;display:inline-flex;line-height:1;vertical-align:bottom;align-items:center}.dropdown-header{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);padding-bottom:.25rem;pointer-events:none}.dropdown-menu-scrollable{height:auto;max-height:13rem;overflow-x:hidden}.dropdown-menu-column{min-width:11rem}.dropdown-menu-column .dropdown-item{min-width:0}.dropdown-menu-columns{display:flex;flex:0 .25rem}.dropdown-menu-arrow:before{content:"";position:absolute;top:-.25rem;left:.75rem;display:block;background:inherit;width:14px;height:14px;transform:rotate(45deg);transform-origin:center;border:1px solid;border-color:inherit;z-index:-1;clip:rect(0px,9px,9px,0px)}.dropdown-menu-arrow.dropdown-menu-end:before{right:.75rem;left:auto}.dropend>.dropdown-menu{margin-top:calc(-.25rem - 1px);margin-left:-.25rem}.dropend .dropdown-toggle:after{margin-left:auto}.dropdown-menu-card{padding:0}.dropdown-menu-card>.card{margin:0;border:0;box-shadow:none}.datagrid{--tblr-datagrid-padding: 1.5rem;--tblr-datagrid-item-width: 15rem;display:grid;grid-gap:var(--tblr-datagrid-padding);grid-template-columns:repeat(auto-fit,minmax(var(--tblr-datagrid-item-width),1fr))}.datagrid-title{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);margin-bottom:.25rem}.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:1rem;text-align:center}@media (min-width: 768px){.empty{padding:3rem}}.empty-icon{margin:0 0 1rem;width:3rem;height:3rem;line-height:1;color:var(--tblr-secondary)}.empty-icon svg{width:100%;height:100%}.empty-img{margin:0 0 2rem;line-height:1}.empty-img img{height:8rem;width:auto}.empty-header{margin:0 0 1rem;font-size:4rem;font-weight:var(--tblr-font-weight-light);line-height:1;color:var(--tblr-secondary)}.empty-title{font-size:1.25rem;line-height:1.75rem;font-weight:var(--tblr-font-weight-bold)}.empty-title,.empty-subtitle{margin:0 0 .5rem}.empty-action{margin-top:1.5rem}.empty-bordered{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.row>*{min-width:0}.col-separator{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.container-slim{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:16rem}.container-tight{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:30rem}.container-narrow{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:45rem}.row-0{margin-right:0;margin-left:0}.row-0>.col,.row-0>[class*=col-]{padding-right:0;padding-left:0}.row-0 .card{margin-bottom:0}.row-sm{margin-right:-.375rem;margin-left:-.375rem}.row-sm>.col,.row-sm>[class*=col-]{padding-right:.375rem;padding-left:.375rem}.row-sm .card{margin-bottom:.75rem}.row-md{margin-right:-1.5rem;margin-left:-1.5rem}.row-md>.col,.row-md>[class*=col-]{padding-right:1.5rem;padding-left:1.5rem}.row-md .card{margin-bottom:3rem}.row-lg{margin-right:-3rem;margin-left:-3rem}.row-lg>.col,.row-lg>[class*=col-]{padding-right:3rem;padding-left:3rem}.row-lg .card{margin-bottom:6rem}.row-deck>.col,.row-deck>[class*=col-]{display:flex;align-items:stretch}.row-deck>.col .card,.row-deck>[class*=col-] .card{flex:1 1 auto}.row-cards{--tblr-gutter-x: var(--tblr-page-padding);--tblr-gutter-y: var(--tblr-page-padding);min-width:0}.row-cards .row-cards{flex:1}.space-y{display:flex;flex-direction:column;gap:1rem}.space-x{display:flex;gap:1rem}.space-y-0{display:flex;flex-direction:column;gap:0}.space-x-0{display:flex;gap:0}.space-y-1{display:flex;flex-direction:column;gap:.25rem}.space-x-1{display:flex;gap:.25rem}.space-y-2{display:flex;flex-direction:column;gap:.5rem}.space-x-2{display:flex;gap:.5rem}.space-y-3{display:flex;flex-direction:column;gap:1rem}.space-x-3{display:flex;gap:1rem}.space-y-4{display:flex;flex-direction:column;gap:1.5rem}.space-x-4{display:flex;gap:1.5rem}.space-y-5{display:flex;flex-direction:column;gap:2rem}.space-x-5{display:flex;gap:2rem}.space-y-6{display:flex;flex-direction:column;gap:3rem}.space-x-6{display:flex;gap:3rem}.space-y-7{display:flex;flex-direction:column;gap:5rem}.space-x-7{display:flex;gap:5rem}.space-y-8{display:flex;flex-direction:column;gap:8rem}.space-x-8{display:flex;gap:8rem}.divide-y>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y>:not(template):not(:first-child){padding-top:1rem!important}.divide-y>:not(template):not(:last-child){padding-bottom:1rem!important}.divide-x>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x>:not(template):not(:first-child){padding-left:1rem!important}.divide-x>:not(template):not(:last-child){padding-right:1rem!important}.divide-y-0>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-0>:not(template):not(:first-child){padding-top:0!important}.divide-y-0>:not(template):not(:last-child){padding-bottom:0!important}.divide-x-0>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-0>:not(template):not(:first-child){padding-left:0!important}.divide-x-0>:not(template):not(:last-child){padding-right:0!important}.divide-y-1>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-1>:not(template):not(:first-child){padding-top:.25rem!important}.divide-y-1>:not(template):not(:last-child){padding-bottom:.25rem!important}.divide-x-1>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-1>:not(template):not(:first-child){padding-left:.25rem!important}.divide-x-1>:not(template):not(:last-child){padding-right:.25rem!important}.divide-y-2>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-2>:not(template):not(:first-child){padding-top:.5rem!important}.divide-y-2>:not(template):not(:last-child){padding-bottom:.5rem!important}.divide-x-2>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-2>:not(template):not(:first-child){padding-left:.5rem!important}.divide-x-2>:not(template):not(:last-child){padding-right:.5rem!important}.divide-y-3>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-3>:not(template):not(:first-child){padding-top:1rem!important}.divide-y-3>:not(template):not(:last-child){padding-bottom:1rem!important}.divide-x-3>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-3>:not(template):not(:first-child){padding-left:1rem!important}.divide-x-3>:not(template):not(:last-child){padding-right:1rem!important}.divide-y-4>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-4>:not(template):not(:first-child){padding-top:1.5rem!important}.divide-y-4>:not(template):not(:last-child){padding-bottom:1.5rem!important}.divide-x-4>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-4>:not(template):not(:first-child){padding-left:1.5rem!important}.divide-x-4>:not(template):not(:last-child){padding-right:1.5rem!important}.divide-y-5>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-5>:not(template):not(:first-child){padding-top:2rem!important}.divide-y-5>:not(template):not(:last-child){padding-bottom:2rem!important}.divide-x-5>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-5>:not(template):not(:first-child){padding-left:2rem!important}.divide-x-5>:not(template):not(:last-child){padding-right:2rem!important}.divide-y-6>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-6>:not(template):not(:first-child){padding-top:3rem!important}.divide-y-6>:not(template):not(:last-child){padding-bottom:3rem!important}.divide-x-6>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-6>:not(template):not(:first-child){padding-left:3rem!important}.divide-x-6>:not(template):not(:last-child){padding-right:3rem!important}.divide-y-7>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-7>:not(template):not(:first-child){padding-top:5rem!important}.divide-y-7>:not(template):not(:last-child){padding-bottom:5rem!important}.divide-x-7>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-7>:not(template):not(:first-child){padding-left:5rem!important}.divide-x-7>:not(template):not(:last-child){padding-right:5rem!important}.divide-y-8>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-8>:not(template):not(:first-child){padding-top:8rem!important}.divide-y-8>:not(template):not(:last-child){padding-bottom:8rem!important}.divide-x-8>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-8>:not(template):not(:first-child){padding-left:8rem!important}.divide-x-8>:not(template):not(:last-child){padding-right:8rem!important}.divide-y-fill{display:flex;flex-direction:column;height:100%}.divide-y-fill>:not(template){flex:1;display:flex;justify-content:center;flex-direction:column}.icon{--tblr-icon-size: 1.25rem;width:var(--tblr-icon-size);height:var(--tblr-icon-size);font-size:var(--tblr-icon-size);vertical-align:bottom;stroke-width:1.5}.icon:hover{text-decoration:none}.icon-inline{--tblr-icon-size: 1rem;vertical-align:-.2rem}.icon-filled{fill:currentColor}.icon-sm{--tblr-icon-size: 1rem;stroke-width:1}.icon-md{--tblr-icon-size: 2.5rem;stroke-width:1}.icon-lg{--tblr-icon-size: 3.5rem;stroke-width:1}.icon-pulse{transition:all .15s ease 0s;animation:pulse 2s ease infinite;animation-fill-mode:both}.icon-tada{transition:all .15s ease 0s;animation:tada 3s ease infinite;animation-fill-mode:both}.icon-rotate{transition:all .15s ease 0s;animation:rotate-360 3s linear infinite;animation-fill-mode:both}.img-responsive{--tblr-img-responsive-ratio: 75%;background:no-repeat center/cover;padding-top:var(--tblr-img-responsive-ratio)}.img-responsive-grid{padding-top:calc(var(--tblr-img-responsive-ratio) - var(--tblr-gutter-y) / 2)}.img-responsive-1x1{--tblr-img-responsive-ratio: 100%}.img-responsive-2x1{--tblr-img-responsive-ratio: 50%}.img-responsive-1x2{--tblr-img-responsive-ratio: 200%}.img-responsive-3x1{--tblr-img-responsive-ratio: 33.3333333333%}.img-responsive-1x3{--tblr-img-responsive-ratio: 300%}.img-responsive-4x3{--tblr-img-responsive-ratio: 75%}.img-responsive-3x4{--tblr-img-responsive-ratio: 133.3333333333%}.img-responsive-16x9{--tblr-img-responsive-ratio: 56.25%}.img-responsive-9x16{--tblr-img-responsive-ratio: 177.7777777778%}.img-responsive-21x9{--tblr-img-responsive-ratio: 42.8571428571%}.img-responsive-9x21{--tblr-img-responsive-ratio: 233.3333333333%}textarea[cols]{height:auto}.col-form-label,.form-label{display:block;font-weight:var(--tblr-font-weight-medium)}.col-form-label.required:after,.form-label.required:after{content:"*";margin-left:.25rem;color:#d63939}.form-label-description{float:right;font-weight:var(--tblr-font-weight-normal);color:var(--tblr-secondary)}.form-hint{display:block;color:var(--tblr-secondary)}.form-hint:last-child{margin-bottom:0}.form-hint+.form-control{margin-top:.25rem}.form-label+.form-hint{margin-top:-.25rem}.input-group+.form-hint,.form-control+.form-hint,.form-select+.form-hint{margin-top:.5rem}.form-select:-moz-focusring{color:var(--tblr-body-color)}.form-control:-webkit-autofill{box-shadow:0 0 0 1000px var(--tblr-body-bg) inset;color:var(--tblr-body-color);-webkit-text-fill-color:var(--tblr-body-color)}.form-control:disabled,.form-control.disabled{color:var(--tblr-secondary);user-select:none}.form-control[size]{width:auto}.form-control-light{background-color:var(--tblr-gray-100);border-color:transparent}.form-control-dark{background-color:#0000001a;color:#fff;border-color:transparent}.form-control-dark:focus{background-color:#0000001a;box-shadow:none;border-color:#ffffff3d}.form-control-dark::placeholder{color:#fff9}.form-control-rounded{border-radius:10rem}.form-control-flush{padding:0;background:none!important;border-color:transparent!important;resize:none;box-shadow:none!important;line-height:inherit}.form-footer{margin-top:2rem}.form-fieldset{padding:1rem;margin-bottom:1rem;background:var(--tblr-body-bg);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.form-help{display:inline-flex;font-weight:var(--tblr-font-weight-bold);align-items:center;justify-content:center;width:1.125rem;height:1.125rem;font-size:.75rem;color:var(--tblr-secondary);text-align:center;text-decoration:none;cursor:pointer;user-select:none;background:var(--tblr-gray-100);border-radius:100rem;transition:background-color .3s,color .3s}@media (prefers-reduced-motion: reduce){.form-help{transition:none}}.form-help:hover,.form-help[aria-describedby]{color:#fff;background:var(--tblr-primary)}.input-group{box-shadow:var(--tblr-box-shadow-input);border-radius:var(--tblr-border-radius)}.input-group .form-control,.input-group .btn{box-shadow:none}.input-group-link{font-size:.75rem}.input-group-flat:focus-within{box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25);border-radius:var(--tblr-border-radius)}.input-group-flat:focus-within .form-control,.input-group-flat:focus-within .input-group-text{border-color:#80aad3!important}.input-group-flat .form-control:focus{border-color:var(--tblr-border-color);box-shadow:none}.input-group-flat .form-control:not(:last-child){border-right:0}.input-group-flat .form-control:not(:first-child){border-left:0}.input-group-flat .input-group-text{background:var(--tblr-bg-forms);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.input-group-flat .input-group-text{transition:none}}.input-group-flat .input-group-text:first-child{padding-right:0}.input-group-flat .input-group-text:last-child{padding-left:0}.form-file-button{margin-left:0;border-left:0}.input-icon{position:relative}.input-icon .form-control:not(:last-child),.input-icon .form-select:not(:last-child){padding-right:2.5rem}.input-icon .form-control:not(:first-child),.input-icon .form-select:not(:last-child){padding-left:2.5rem}.input-icon-addon{position:absolute;top:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;min-width:2.5rem;color:var(--tblr-icon-color);pointer-events:none;font-size:1.2em}.input-icon-addon:last-child{right:0;left:auto}.form-colorinput{position:relative;display:inline-block;margin:0;line-height:1;cursor:pointer}.form-colorinput-input{position:absolute;z-index:-1;opacity:0}.form-colorinput-color{display:block;width:1.5rem;height:1.5rem;color:#fff;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);border-radius:3px;box-shadow:0 1px 2px #0000000d}.form-colorinput-color:before{position:absolute;top:0;left:0;width:100%;height:100%;content:"";background:no-repeat center center/1.25rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e");opacity:0;transition:opacity .3s}@media (prefers-reduced-motion: reduce){.form-colorinput-color:before{transition:none}}.form-colorinput-input:checked~.form-colorinput-color:before{opacity:1}.form-colorinput-input:focus~.form-colorinput-color{border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-colorinput-light .form-colorinput-color:before{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23182433' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-imagecheck{position:relative;margin:0;cursor:pointer}.form-imagecheck-input{position:absolute;z-index:-1;opacity:0}.form-imagecheck-figure{position:relative;display:block;margin:0;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:3px}.form-imagecheck-input:focus~.form-imagecheck-figure{border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-imagecheck-input:checked~.form-imagecheck-figure{border-color:var(--tblr-primary)}.form-imagecheck-figure:before{position:absolute;top:.25rem;left:.25rem;z-index:1;display:block;width:1.25rem;height:1.25rem;color:#fff;pointer-events:none;content:"";user-select:none;background:var(--tblr-bg-forms);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius);transition:opacity .3s}@media (prefers-reduced-motion: reduce){.form-imagecheck-figure:before{transition:none}}.form-imagecheck-input:checked~.form-imagecheck-figure:before{background-color:var(--tblr-primary);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e");background-repeat:repeat;background-position:center;background-size:1.25rem;border-color:var(--tblr-border-color-translucent)}.form-imagecheck-input[type=radio]~.form-imagecheck-figure:before{border-radius:50%}.form-imagecheck-input[type=radio]:checked~.form-imagecheck-figure:before{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-imagecheck-image{max-width:100%;display:block;opacity:.64;transition:opacity .3s}@media (prefers-reduced-motion: reduce){.form-imagecheck-image{transition:none}}.form-imagecheck-image:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.form-imagecheck-image:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.form-imagecheck:hover .form-imagecheck-image,.form-imagecheck-input:focus~.form-imagecheck-figure .form-imagecheck-image,.form-imagecheck-input:checked~.form-imagecheck-figure .form-imagecheck-image{opacity:1}.form-imagecheck-caption{padding:.25rem;font-size:.765625rem;color:var(--tblr-secondary);text-align:center;transition:color .3s}@media (prefers-reduced-motion: reduce){.form-imagecheck-caption{transition:none}}.form-imagecheck:hover .form-imagecheck-caption,.form-imagecheck-input:focus~.form-imagecheck-figure .form-imagecheck-caption,.form-imagecheck-input:checked~.form-imagecheck-figure .form-imagecheck-caption{color:var(--tblr-body-color)}.form-selectgroup{display:inline-flex;margin:0 -.5rem -.5rem 0;flex-wrap:wrap}.form-selectgroup .form-selectgroup-item{margin:0 .5rem .5rem 0}.form-selectgroup-vertical{flex-direction:column}.form-selectgroup-item{display:block;position:relative}.form-selectgroup-input{position:absolute;top:0;left:0;z-index:-1;opacity:0}.form-selectgroup-label{position:relative;display:block;min-width:calc(1.4285714286em + 1.125rem + calc(var(--tblr-border-width) * 2));margin:0;padding:.5625rem .75rem;font-size:.875rem;line-height:1.4285714286;color:var(--tblr-secondary);background:var(--tblr-bg-forms);text-align:center;cursor:pointer;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:3px;box-shadow:var(--tblr-box-shadow-input);transition:border-color .3s,background .3s,color .3s}@media (prefers-reduced-motion: reduce){.form-selectgroup-label{transition:none}}.form-selectgroup-label .icon:only-child{margin:0 -.25rem}.form-selectgroup-label:hover{color:var(--tblr-body-color)}.form-selectgroup-check{display:inline-block;width:1.25rem;height:1.25rem;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);vertical-align:middle;box-shadow:var(--tblr-box-shadow-input)}.form-selectgroup-input[type=checkbox]+.form-selectgroup-label .form-selectgroup-check{border-radius:var(--tblr-border-radius)}.form-selectgroup-input[type=radio]+.form-selectgroup-label .form-selectgroup-check{border-radius:50%}.form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-check{background-color:var(--tblr-primary);background-repeat:repeat;background-position:center;background-size:1.25rem;border-color:var(--tblr-border-color-translucent)}.form-selectgroup-input[type=checkbox]:checked+.form-selectgroup-label .form-selectgroup-check{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-selectgroup-input[type=radio]:checked+.form-selectgroup-label .form-selectgroup-check{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-selectgroup-check-floated{position:absolute;top:.5625rem;right:.5625rem}.form-selectgroup-input:checked+.form-selectgroup-label{z-index:1;color:var(--tblr-primary);background:rgba(var(--tblr-primary-rgb),.04);border-color:var(--tblr-primary)}.form-selectgroup-input:focus+.form-selectgroup-label{z-index:2;color:var(--tblr-primary);border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-selectgroup-boxes .form-selectgroup-label{text-align:left;padding:1.25rem;color:inherit}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label{color:inherit}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-title{color:var(--tblr-primary)}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-label-content{opacity:1}.form-selectgroup-pills{flex-wrap:wrap;align-items:flex-start}.form-selectgroup-pills .form-selectgroup-item{flex-grow:0}.form-selectgroup-pills .form-selectgroup-label{border-radius:50px}.form-control-color::-webkit-color-swatch{border:none}[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}.form-control::file-selector-button{background-color:var(--tblr-btn-color, var(--tblr-tertiary-bg))}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--tblr-btn-color, var(--tblr-secondary-bg))}.form-check{user-select:none}.form-check.form-check-highlight .form-check-input:not(:checked)~.form-check-label{color:var(--tblr-secondary)}.form-check .form-check-label-off{color:var(--tblr-secondary)}.form-check .form-check-input:checked~.form-check-label-off{display:none}.form-check .form-check-input:not(:checked)~.form-check-label-on{display:none}.form-check-input{background-size:1.25rem;margin-top:0rem;box-shadow:var(--tblr-box-shadow-input)}.form-switch .form-check-input{transition:background-color .3s,background-position .3s}@media (prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-check-label{display:block}.form-check-label.required:after{content:"*";margin-left:.25rem;color:#d63939}.form-check-description{display:block;color:var(--tblr-secondary);font-size:.75rem;margin-top:.25rem}.form-check-single,.form-check-single .form-check-input{margin:0}.form-switch .form-check-input{height:1.25rem;margin-top:0rem}.form-switch-lg{padding-left:3.5rem;min-height:1.5rem}.form-switch-lg .form-check-input{height:1.5rem;width:2.75rem;background-size:1.5rem;margin-left:-3.5rem}.form-switch-lg .form-check-label{padding-top:.125rem}.form-check-input:checked{border:none}.form-select.is-invalid-lite,.form-control.is-invalid-lite,.form-select.is-valid-lite,.form-control.is-valid-lite{border-color:var(--tblr-border-color)!important}.legend{--tblr-legend-size: .75em;display:inline-block;background:var(--tblr-border-color);width:var(--tblr-legend-size);height:var(--tblr-legend-size);border-radius:var(--tblr-border-radius-sm);border:1px solid var(--tblr-border-color-translucent)}.list-group{margin-left:0;margin-right:0}.list-group-header{background:var(--tblr-bg-surface-tertiary);padding:.5rem 1.25rem;font-size:.75rem;font-weight:var(--tblr-font-weight-medium);line-height:1;text-transform:uppercase;color:var(--tblr-secondary);border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.list-group-flush>.list-group-header:last-child{border-bottom-width:0}.list-group-item{background-color:inherit}.list-group-item.active{background-color:rgba(var(--tblr-secondary-rgb),.08);border-left-color:#0054a6;border-left-width:2px}.list-group-item:active,.list-group-item:focus,.list-group-item:hover{background-color:rgba(var(--tblr-secondary-rgb),.08)}.list-group-item.disabled,.list-group-item:disabled{color:#929dab;background-color:rgba(var(--tblr-secondary-rgb),.08)}.list-bordered .list-item{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);margin-top:-1px}.list-bordered .list-item:first-child{border-top:none}.list-group-hoverable .list-group-item-actions{opacity:0;transition:opacity .3s}@media (prefers-reduced-motion: reduce){.list-group-hoverable .list-group-item-actions{transition:none}}.list-group-hoverable .list-group-item:hover .list-group-item-actions,.list-group-hoverable .list-group-item-actions.show{opacity:1}.list-group-transparent{--tblr-list-group-border-radius: 0;margin:0 -1.25rem}.list-group-transparent .list-group-item{background:none;border:0}.list-group-transparent .list-group-item .icon{color:var(--tblr-secondary)}.list-group-transparent .list-group-item.active{font-weight:var(--tblr-font-weight-bold);color:inherit;background:var(--tblr-active-bg)}.list-group-transparent .list-group-item.active .icon{color:inherit}.list-separated-item{padding:1rem 0}.list-separated-item:first-child{padding-top:0}.list-separated-item:last-child{padding-bottom:0}.list-separated-item+.list-separated-item{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.list-inline-item:not(:last-child){margin-right:auto;margin-inline-end:.5rem}.list-inline-dots .list-inline-item+.list-inline-item:before{content:" \b7 ";margin-inline-end:.5rem}.loader{position:relative;display:block;width:2.5rem;height:2.5rem;color:#0054a6;vertical-align:middle}.loader:after{position:absolute;top:0;left:0;width:100%;height:100%;content:"";border:1px var(--tblr-border-style);border-color:transparent;border-top-color:currentColor;border-left-color:currentColor;border-radius:100rem;animation:rotate-360 .6s linear;animation-iteration-count:infinite}.dimmer{position:relative}.dimmer .loader{position:absolute;top:50%;right:0;left:0;display:none;margin:0 auto;transform:translateY(-50%)}.dimmer.active .loader{display:block}.dimmer.active .dimmer-content{pointer-events:none;opacity:.1}@keyframes animated-dots{0%{transform:translate(-100%)}}.animated-dots{display:inline-block;overflow:hidden;vertical-align:bottom}.animated-dots:after{display:inline-block;content:"...";animation:animated-dots 1.2s steps(4,jump-none) infinite}.modal-content .btn-close{position:absolute;top:0;right:0;width:3.5rem;height:3.5rem;margin:0;padding:0;z-index:10}.modal-body{scrollbar-color:rgba(var(--tblr-scrollbar-color, var(--tblr-body-color-rgb)),.16) transparent}.modal-body::-webkit-scrollbar{width:1rem;height:1rem;transition:background .3s}@media (prefers-reduced-motion: reduce){.modal-body::-webkit-scrollbar{transition:none}}.modal-body::-webkit-scrollbar-thumb{border-radius:1rem;border:5px solid transparent;box-shadow:inset 0 0 0 1rem rgba(var(--tblr-scrollbar-color, var(--tblr-body-color-rgb)),.16)}.modal-body::-webkit-scrollbar-track{background:transparent}.modal-body:hover::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem rgba(var(--tblr-scrollbar-color, var(--tblr-body-color-rgb)),.32)}.modal-body::-webkit-scrollbar-corner{background:transparent}.modal-body .modal-title{margin-bottom:1rem}.modal-body+.modal-body{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.modal-status{position:absolute;top:0;left:0;right:0;height:2px;background:var(--tblr-secondary);border-radius:var(--tblr-border-radius-lg) var(--tblr-border-radius-lg) 0 0}.modal-header{align-items:center;min-height:3.5rem;background:transparent;padding:0 3.5rem 0 1.5rem}.modal-title{font-size:1rem;font-weight:var(--tblr-font-weight-bold);color:inherit;line-height:1.4285714286}.modal-footer{padding-top:.75rem;padding-bottom:.75rem}.modal-blur{backdrop-filter:blur(4px)}.modal-full-width{max-width:none;margin:0 .5rem}.nav-vertical,.nav-vertical .nav{flex-direction:column;flex-wrap:nowrap}.nav-vertical .nav{margin-left:1.25rem;border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);padding-left:.5rem}.nav-vertical .nav-link.active,.nav-vertical .nav-item.show .nav-link{font-weight:var(--tblr-font-weight-bold)}.nav-vertical.nav-pills{margin:0 -.75rem}.nav-bordered{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.nav-bordered .nav-item+.nav-item{margin-left:1.25rem}.nav-bordered .nav-link{padding-left:0;padding-right:0;margin:0 0 -var(--tblr-border-width);border:0;border-bottom:2px var(--tblr-border-style) transparent;color:var(--tblr-secondary)}.nav-bordered .nav-link.active,.nav-bordered .nav-item.show .nav-link{color:var(--tblr-primary);border-color:var(--tblr-primary)}.nav-link{display:flex;transition:color .3s;align-items:center}@media (prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link-toggle{margin-left:auto;padding:0 .25rem;transition:transform .3s}@media (prefers-reduced-motion: reduce){.nav-link-toggle{transition:none}}.nav-link-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-45deg)}.nav-link-toggle:after{margin:0}.nav-link[aria-expanded=true] .nav-link-toggle{transform:rotate(180deg)}.nav-link-icon{width:1.25rem;height:1.25rem;margin-right:.5rem;color:var(--tblr-icon-color)}.nav-link-icon svg{display:block;height:100%}.nav-fill .nav-item .nav-link{justify-content:center}.stars{display:inline-flex;color:#bbc3cd;font-size:.75rem}.stars .star:not(:first-child){margin-left:.25rem}.pagination{user-select:none}.page-link{min-width:1.75rem;border-radius:var(--tblr-border-radius)}.page-item{text-align:center}.page-item:not(.active) .page-link:hover{background:transparent}.page-item.page-prev,.page-item.page-next{flex:0 0 50%;text-align:left}.page-item.page-next{margin-left:auto;text-align:right}.page-item-subtitle{margin-bottom:2px;font-size:12px;color:var(--tblr-secondary);text-transform:uppercase}.page-item.disabled .page-item-subtitle{color:var(--tblr-disabled-color)}.page-item-title{font-size:1rem;font-weight:var(--tblr-font-weight-normal);color:var(--tblr-body-color)}.page-link:hover .page-item-title{color:#0054a6}.page-item.disabled .page-item-title{color:var(--tblr-disabled-color)}@keyframes progress-indeterminate{0%{right:100%;left:-35%}to,60%{right:-90%;left:100%}}.progress{position:relative;width:100%;line-height:.5rem;appearance:none}.progress::-webkit-progress-bar{background:var(--tblr-progress-bg)}.progress::-webkit-progress-value{background-color:var(--tblr-primary)}.progress::-moz-progress-bar{background-color:var(--tblr-primary)}.progress::-ms-fill{background-color:var(--tblr-primary);border:none}.progress-sm{height:.25rem}.progress-bar{height:100%}.progress-bar-indeterminate:after,.progress-bar-indeterminate:before{position:absolute;top:0;bottom:0;left:0;content:"";background-color:inherit;will-change:left,right}.progress-bar-indeterminate:before{animation:progress-indeterminate 1.5s cubic-bezier(.65,.815,.735,.395) infinite}.progress-separated .progress-bar{box-shadow:0 0 0 2px var(--tblr-card-bg, var(--tblr-bg-surface))}.progressbg{position:relative;padding:.25rem .5rem;display:flex}.progressbg-text{position:relative;z-index:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progressbg-progress{position:absolute;inset:0;z-index:0;height:100%;background:transparent;pointer-events:none}.progressbg-value{font-weight:var(--tblr-font-weight-medium);margin-left:auto;padding-left:2rem}.ribbon{--tblr-ribbon-margin: .25rem;--tblr-ribbon-border-radius: var(--tblr-border-radius);position:absolute;top:.75rem;right:calc(-1 * var(--tblr-ribbon-margin));z-index:1;padding:.25rem .75rem;font-size:.625rem;font-weight:var(--tblr-font-weight-bold);line-height:1;color:#fff;text-align:center;text-transform:uppercase;background:var(--tblr-primary);border-color:var(--tblr-primary);border-radius:var(--tblr-ribbon-border-radius) 0 var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius);display:inline-flex;align-items:center;justify-content:center;min-height:2rem;min-width:2rem}.ribbon:before{position:absolute;right:0;bottom:100%;width:0;height:0;content:"";filter:brightness(70%);border:calc(var(--tblr-ribbon-margin) * .5) var(--tblr-border-style);border-color:inherit;border-top-color:transparent;border-right-color:transparent}.ribbon.bg-blue{border-color:var(--tblr-blue)}.ribbon.bg-blue-lt{border-color:rgba(var(--tblr-blue-rgb),.1)!important}.ribbon.bg-azure{border-color:var(--tblr-azure)}.ribbon.bg-azure-lt{border-color:rgba(var(--tblr-azure-rgb),.1)!important}.ribbon.bg-indigo{border-color:var(--tblr-indigo)}.ribbon.bg-indigo-lt{border-color:rgba(var(--tblr-indigo-rgb),.1)!important}.ribbon.bg-purple{border-color:var(--tblr-purple)}.ribbon.bg-purple-lt{border-color:rgba(var(--tblr-purple-rgb),.1)!important}.ribbon.bg-pink{border-color:var(--tblr-pink)}.ribbon.bg-pink-lt{border-color:rgba(var(--tblr-pink-rgb),.1)!important}.ribbon.bg-red{border-color:var(--tblr-red)}.ribbon.bg-red-lt{border-color:rgba(var(--tblr-red-rgb),.1)!important}.ribbon.bg-orange{border-color:var(--tblr-orange)}.ribbon.bg-orange-lt{border-color:rgba(var(--tblr-orange-rgb),.1)!important}.ribbon.bg-yellow{border-color:var(--tblr-yellow)}.ribbon.bg-yellow-lt{border-color:rgba(var(--tblr-yellow-rgb),.1)!important}.ribbon.bg-lime{border-color:var(--tblr-lime)}.ribbon.bg-lime-lt{border-color:rgba(var(--tblr-lime-rgb),.1)!important}.ribbon.bg-green{border-color:var(--tblr-green)}.ribbon.bg-green-lt{border-color:rgba(var(--tblr-green-rgb),.1)!important}.ribbon.bg-teal{border-color:var(--tblr-teal)}.ribbon.bg-teal-lt{border-color:rgba(var(--tblr-teal-rgb),.1)!important}.ribbon.bg-cyan{border-color:var(--tblr-cyan)}.ribbon.bg-cyan-lt{border-color:rgba(var(--tblr-cyan-rgb),.1)!important}.ribbon .icon{width:1.25rem;height:1.25rem;font-size:1.25rem}.ribbon-top{top:calc(-1 * var(--tblr-ribbon-margin));right:.75rem;width:2rem;padding:.5rem 0;border-radius:0 var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius)}.ribbon-top:before{top:0;right:100%;bottom:auto;border-color:inherit;border-top-color:transparent;border-left-color:transparent}.ribbon-top.ribbon-start{right:auto;left:.75rem}.ribbon-top.ribbon-start:before{top:0;right:100%;left:auto}.ribbon-start{right:auto;left:calc(-1 * var(--tblr-ribbon-margin))}.ribbon-start:before{top:auto;bottom:100%;left:0;border-color:inherit;border-top-color:transparent;border-left-color:transparent}.ribbon-bottom{top:auto;bottom:.75rem}.ribbon-bookmark{padding-left:.25rem;border-radius:0 0 var(--tblr-ribbon-border-radius) 0}.ribbon-bookmark:after{position:absolute;top:0;right:100%;display:block;width:0;height:0;content:"";border:1rem var(--tblr-border-style);border-color:inherit;border-right-width:0;border-left-color:transparent;border-left-width:.5rem}.ribbon-bookmark.ribbon-left{padding-right:.5rem}.ribbon-bookmark.ribbon-left:after{right:auto;left:100%;border-right-color:transparent;border-right-width:.5rem;border-left-width:0}.ribbon-bookmark.ribbon-top{padding-right:0;padding-bottom:.25rem;padding-left:0;border-radius:0 var(--tblr-ribbon-border-radius) 0 0}.ribbon-bookmark.ribbon-top:after{top:100%;right:0;left:0;border-color:inherit;border-width:1rem;border-top-width:0;border-bottom-color:transparent;border-bottom-width:.5rem}.markdown{line-height:1.7142857143}.markdown>:first-child{margin-top:0}.markdown>:last-child,.markdown>:last-child .highlight{margin-bottom:0}@media (min-width: 768px){.markdown>hr,.markdown>.hr{margin-top:3em;margin-bottom:3em}}.markdown>h1,.markdown>.h1,.markdown>h2,.markdown>.h2,.markdown>h3,.markdown>.h3,.markdown>h4,.markdown>.h4,.markdown>h5,.markdown>.h5,.markdown>h6,.markdown>.h6{font-weight:var(--tblr-font-weight-bold)}.markdown>blockquote{font-size:1rem;margin:1.5rem 0;padding:.5rem 1.5rem}.markdown>img{border-radius:var(--tblr-border-radius)}.placeholder:not(.btn):not([class*=bg-]){background-color:currentColor!important}.placeholder:not(.avatar):not([class*=card-img-]){border-radius:var(--tblr-border-radius)}.steps{--tblr-steps-color: var(--tblr-primary);--tblr-steps-inactive-color: var(--tblr-border-color);--tblr-steps-dot-size: .5rem;--tblr-steps-border-width: 2px;display:flex;flex-wrap:nowrap;width:100%;padding:0;margin:0;list-style:none}.steps-blue{--tblr-steps-color: var(--tblr-blue)}.steps-azure{--tblr-steps-color: var(--tblr-azure)}.steps-indigo{--tblr-steps-color: var(--tblr-indigo)}.steps-purple{--tblr-steps-color: var(--tblr-purple)}.steps-pink{--tblr-steps-color: var(--tblr-pink)}.steps-red{--tblr-steps-color: var(--tblr-red)}.steps-orange{--tblr-steps-color: var(--tblr-orange)}.steps-yellow{--tblr-steps-color: var(--tblr-yellow)}.steps-lime{--tblr-steps-color: var(--tblr-lime)}.steps-green{--tblr-steps-color: var(--tblr-green)}.steps-teal{--tblr-steps-color: var(--tblr-teal)}.steps-cyan{--tblr-steps-color: var(--tblr-cyan)}.step-item{position:relative;flex:1 1 0;min-height:1rem;margin-top:0;color:inherit;text-align:center;cursor:default;padding-top:calc(var(--tblr-steps-dot-size))}a.step-item{cursor:pointer}a.step-item:hover{color:inherit}.step-item:after,.step-item:before{background:var(--tblr-steps-color)}.step-item:not(:last-child):after{position:absolute;left:50%;width:100%;content:"";transform:translateY(-50%)}.step-item:after{top:calc(var(--tblr-steps-dot-size) * .5);height:var(--tblr-steps-border-width)}.step-item:before{content:"";position:absolute;top:0;left:50%;z-index:1;box-sizing:content-box;display:flex;align-items:center;justify-content:center;border-radius:100rem;transform:translate(-50%);color:var(--tblr-white);width:var(--tblr-steps-dot-size);height:var(--tblr-steps-dot-size)}.step-item.active{font-weight:var(--tblr-font-weight-bold)}.step-item.active:after{background:var(--tblr-steps-inactive-color)}.step-item.active~.step-item{color:var(--tblr-disabled-color)}.step-item.active~.step-item:after,.step-item.active~.step-item:before{background:var(--tblr-steps-inactive-color)}.steps-counter{--tblr-steps-dot-size: 1.5rem;counter-reset:steps}.steps-counter .step-item{counter-increment:steps}.steps-counter .step-item:before{content:counter(steps)}.steps-vertical{--tblr-steps-dot-offset: 6px;flex-direction:column}.steps-vertical.steps-counter{--tblr-steps-dot-offset: -2px}.steps-vertical .step-item{text-align:left;padding-top:0;padding-left:calc(var(--tblr-steps-dot-size) + 1rem);min-height:auto}.steps-vertical .step-item:not(:first-child){margin-top:1rem}.steps-vertical .step-item:before{top:var(--tblr-steps-dot-offset);left:0;transform:translate(0)}.steps-vertical .step-item:not(:last-child):after{position:absolute;content:"";transform:translate(-50%);top:var(--tblr-steps-dot-offset);left:calc(var(--tblr-steps-dot-size) * .5);width:var(--tblr-steps-border-width);height:calc(100% + 1rem)}@keyframes status-pulsate-main{40%{transform:scale(1.25)}60%{transform:scale(1.25)}}@keyframes status-pulsate-secondary{10%{transform:scale(1)}30%{transform:scale(3)}80%{transform:scale(3)}to{transform:scale(1)}}@keyframes status-pulsate-tertiary{25%{transform:scale(1)}80%{transform:scale(3);opacity:0}to{transform:scale(3);opacity:0}}.status{--tblr-status-height: 1.5rem;--tblr-status-color: #667382;--tblr-status-color-rgb: 102, 115, 130;display:inline-flex;align-items:center;height:var(--tblr-status-height);padding:.25rem .75rem;gap:.5rem;color:var(--tblr-status-color);background:rgba(var(--tblr-status-color-rgb),.1);font-size:.875rem;text-transform:none;letter-spacing:normal;border-radius:100rem;font-weight:var(--tblr-font-weight-medium);line-height:1;margin:0}.status .status-dot{background:var(--tblr-status-color)}.status .icon{font-size:1.25rem}.status-lite{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)!important;background:transparent!important;color:var(--tblr-body-color)!important}.status-primary{--tblr-status-color: #0054a6;--tblr-status-color-rgb: 0, 84, 166}.status-secondary{--tblr-status-color: #667382;--tblr-status-color-rgb: 102, 115, 130}.status-success{--tblr-status-color: #2fb344;--tblr-status-color-rgb: 47, 179, 68}.status-info{--tblr-status-color: #4299e1;--tblr-status-color-rgb: 66, 153, 225}.status-warning{--tblr-status-color: #f76707;--tblr-status-color-rgb: 247, 103, 7}.status-danger{--tblr-status-color: #d63939;--tblr-status-color-rgb: 214, 57, 57}.status-light{--tblr-status-color: #fcfdfe;--tblr-status-color-rgb: 252, 253, 254}.status-dark{--tblr-status-color: #182433;--tblr-status-color-rgb: 24, 36, 51}.status-muted{--tblr-status-color: #667382;--tblr-status-color-rgb: 102, 115, 130}.status-blue{--tblr-status-color: #0054a6;--tblr-status-color-rgb: 0, 84, 166}.status-azure{--tblr-status-color: #4299e1;--tblr-status-color-rgb: 66, 153, 225}.status-indigo{--tblr-status-color: #4263eb;--tblr-status-color-rgb: 66, 99, 235}.status-purple{--tblr-status-color: #ae3ec9;--tblr-status-color-rgb: 174, 62, 201}.status-pink{--tblr-status-color: #d6336c;--tblr-status-color-rgb: 214, 51, 108}.status-red{--tblr-status-color: #d63939;--tblr-status-color-rgb: 214, 57, 57}.status-orange{--tblr-status-color: #f76707;--tblr-status-color-rgb: 247, 103, 7}.status-yellow{--tblr-status-color: #f59f00;--tblr-status-color-rgb: 245, 159, 0}.status-lime{--tblr-status-color: #74b816;--tblr-status-color-rgb: 116, 184, 22}.status-green{--tblr-status-color: #2fb344;--tblr-status-color-rgb: 47, 179, 68}.status-teal{--tblr-status-color: #0ca678;--tblr-status-color-rgb: 12, 166, 120}.status-cyan{--tblr-status-color: #17a2b8;--tblr-status-color-rgb: 23, 162, 184}.status-facebook{--tblr-status-color: #1877f2;--tblr-status-color-rgb: 24, 119, 242}.status-twitter{--tblr-status-color: #1da1f2;--tblr-status-color-rgb: 29, 161, 242}.status-linkedin{--tblr-status-color: #0a66c2;--tblr-status-color-rgb: 10, 102, 194}.status-google{--tblr-status-color: #dc4e41;--tblr-status-color-rgb: 220, 78, 65}.status-youtube{--tblr-status-color: #ff0000;--tblr-status-color-rgb: 255, 0, 0}.status-vimeo{--tblr-status-color: #1ab7ea;--tblr-status-color-rgb: 26, 183, 234}.status-dribbble{--tblr-status-color: #ea4c89;--tblr-status-color-rgb: 234, 76, 137}.status-github{--tblr-status-color: #181717;--tblr-status-color-rgb: 24, 23, 23}.status-instagram{--tblr-status-color: #e4405f;--tblr-status-color-rgb: 228, 64, 95}.status-pinterest{--tblr-status-color: #bd081c;--tblr-status-color-rgb: 189, 8, 28}.status-vk{--tblr-status-color: #6383a8;--tblr-status-color-rgb: 99, 131, 168}.status-rss{--tblr-status-color: #ffa500;--tblr-status-color-rgb: 255, 165, 0}.status-flickr{--tblr-status-color: #0063dc;--tblr-status-color-rgb: 0, 99, 220}.status-bitbucket{--tblr-status-color: #0052cc;--tblr-status-color-rgb: 0, 82, 204}.status-tabler{--tblr-status-color: #0054a6;--tblr-status-color-rgb: 0, 84, 166}.status-dot{--tblr-status-dot-color: var(--tblr-status-color, #667382);--tblr-status-size: .5rem;position:relative;display:inline-block;width:var(--tblr-status-size);height:var(--tblr-status-size);background:var(--tblr-status-dot-color);border-radius:100rem}.status-dot-animated:before{content:"";position:absolute;inset:0;z-index:0;background:inherit;border-radius:inherit;opacity:.6;animation:1s linear 2s backwards infinite status-pulsate-tertiary}.status-indicator{--tblr-status-indicator-size: 2.5rem;--tblr-status-indicator-color: var(--tblr-status-color, #667382);display:block;position:relative;width:var(--tblr-status-indicator-size);height:var(--tblr-status-indicator-size)}.status-indicator-circle{--tblr-status-circle-size: .75rem;position:absolute;left:50%;top:50%;margin:calc(var(--tblr-status-circle-size) / -2) 0 0 calc(var(--tblr-status-circle-size) / -2);width:var(--tblr-status-circle-size);height:var(--tblr-status-circle-size);border-radius:100rem;background:var(--tblr-status-color)}.status-indicator-circle:nth-child(1){z-index:3}.status-indicator-circle:nth-child(2){z-index:2;opacity:.1}.status-indicator-circle:nth-child(3){z-index:1;opacity:.3}.status-indicator-animated .status-indicator-circle:nth-child(1){animation:2s linear 1s infinite backwards status-pulsate-main}.status-indicator-animated .status-indicator-circle:nth-child(2){animation:2s linear 1s infinite backwards status-pulsate-secondary}.status-indicator-animated .status-indicator-circle:nth-child(3){animation:2s linear 1s infinite backwards status-pulsate-tertiary}.switch-icon{display:inline-block;line-height:1;border:0;padding:0;background:transparent;width:1.25rem;height:1.25rem;vertical-align:bottom;position:relative;cursor:pointer}.switch-icon.disabled{pointer-events:none;opacity:.4}.switch-icon:focus{outline:none}.switch-icon svg{display:block;width:100%;height:100%}.switch-icon .switch-icon-a,.switch-icon .switch-icon-b{display:block;width:100%;height:100%}.switch-icon .switch-icon-a{opacity:1}.switch-icon .switch-icon-b{position:absolute;top:0;left:0;opacity:0}.switch-icon.active .switch-icon-a{opacity:0}.switch-icon.active .switch-icon-b{opacity:1}.switch-icon-fade .switch-icon-a,.switch-icon-fade .switch-icon-b{transition:opacity .5s}@media (prefers-reduced-motion: reduce){.switch-icon-fade .switch-icon-a,.switch-icon-fade .switch-icon-b{transition:none}}.switch-icon-scale .switch-icon-a,.switch-icon-scale .switch-icon-b{transition:opacity .5s,transform 0s .5s}@media (prefers-reduced-motion: reduce){.switch-icon-scale .switch-icon-a,.switch-icon-scale .switch-icon-b{transition:none}}.switch-icon-scale .switch-icon-b{transform:scale(1.5)}.switch-icon-scale.active .switch-icon-a,.switch-icon-scale.active .switch-icon-b{transition:opacity 0s,transform .5s}@media (prefers-reduced-motion: reduce){.switch-icon-scale.active .switch-icon-a,.switch-icon-scale.active .switch-icon-b{transition:none}}.switch-icon-scale.active .switch-icon-b{transform:scale(1)}.switch-icon-flip{perspective:10em}.switch-icon-flip .switch-icon-a,.switch-icon-flip .switch-icon-b{backface-visibility:hidden;transform-style:preserve-3d;transition:opacity 0s .2s,transform .4s ease-in-out}@media (prefers-reduced-motion: reduce){.switch-icon-flip .switch-icon-a,.switch-icon-flip .switch-icon-b{transition:none}}.switch-icon-flip .switch-icon-a{opacity:1;transform:rotateY(0)}.switch-icon-flip .switch-icon-b{opacity:1;transform:rotateY(-180deg)}.switch-icon-flip.active .switch-icon-a{opacity:1;transform:rotateY(180deg)}.switch-icon-flip.active .switch-icon-b{opacity:1;transform:rotateY(0)}.switch-icon-slide-up,.switch-icon-slide-left,.switch-icon-slide-right,.switch-icon-slide-down{overflow:hidden}.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-up .switch-icon-b,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-down .switch-icon-a,.switch-icon-slide-down .switch-icon-b{transition:opacity .3s,transform .3s}@media (prefers-reduced-motion: reduce){.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-up .switch-icon-b,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-down .switch-icon-a,.switch-icon-slide-down .switch-icon-b{transition:none}}.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-down .switch-icon-a{transform:translateY(0)}.switch-icon-slide-up .switch-icon-b,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-down .switch-icon-b{transform:translateY(100%)}.switch-icon-slide-up.active .switch-icon-a,.switch-icon-slide-left.active .switch-icon-a,.switch-icon-slide-right.active .switch-icon-a,.switch-icon-slide-down.active .switch-icon-a{transform:translateY(-100%)}.switch-icon-slide-up.active .switch-icon-b,.switch-icon-slide-left.active .switch-icon-b,.switch-icon-slide-right.active .switch-icon-b,.switch-icon-slide-down.active .switch-icon-b{transform:translateY(0)}.switch-icon-slide-left .switch-icon-a{transform:translate(0)}.switch-icon-slide-left .switch-icon-b{transform:translate(100%)}.switch-icon-slide-left.active .switch-icon-a{transform:translate(-100%)}.switch-icon-slide-left.active .switch-icon-b,.switch-icon-slide-right .switch-icon-a{transform:translate(0)}.switch-icon-slide-right .switch-icon-b{transform:translate(-100%)}.switch-icon-slide-right.active .switch-icon-a{transform:translate(100%)}.switch-icon-slide-right.active .switch-icon-b{transform:translate(0)}.switch-icon-slide-down .switch-icon-a{transform:translateY(0)}.switch-icon-slide-down .switch-icon-b{transform:translateY(-100%)}.switch-icon-slide-down.active .switch-icon-a{transform:translateY(100%)}.switch-icon-slide-down.active .switch-icon-b{transform:translateY(0)}.table thead th,.markdown>table thead th{background:var(--tblr-bg-surface-tertiary);font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);padding-top:.5rem;padding-bottom:.5rem;white-space:nowrap}@media print{.table thead th,.markdown>table thead th{background:transparent}}.table-responsive .table,.table-responsive .markdown>table{margin-bottom:0}.table-responsive+.card-footer{border-top:0}.table-transparent thead th{background:transparent}.table-nowrap>:not(caption)>*>*{white-space:nowrap}.table-vcenter>:not(caption)>*>*{vertical-align:middle}.table-center>:not(caption)>*>*{text-align:center}.td-truncate{max-width:1px;width:100%}.table-mobile{display:block}.table-mobile thead{display:none}.table-mobile tbody,.table-mobile tr{display:flex;flex-direction:column}.table-mobile td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile .btn{display:block}@media (max-width: 575.98px){.table-mobile-sm{display:block}.table-mobile-sm thead{display:none}.table-mobile-sm tbody,.table-mobile-sm tr{display:flex;flex-direction:column}.table-mobile-sm td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-sm td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-sm tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-sm .btn{display:block}}@media (max-width: 767.98px){.table-mobile-md{display:block}.table-mobile-md thead{display:none}.table-mobile-md tbody,.table-mobile-md tr{display:flex;flex-direction:column}.table-mobile-md td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-md td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-md tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-md .btn{display:block}}@media (max-width: 991.98px){.table-mobile-lg{display:block}.table-mobile-lg thead{display:none}.table-mobile-lg tbody,.table-mobile-lg tr{display:flex;flex-direction:column}.table-mobile-lg td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-lg td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-lg tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-lg .btn{display:block}}@media (max-width: 1199.98px){.table-mobile-xl{display:block}.table-mobile-xl thead{display:none}.table-mobile-xl tbody,.table-mobile-xl tr{display:flex;flex-direction:column}.table-mobile-xl td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-xl td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-xl tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-xl .btn{display:block}}@media (max-width: 1399.98px){.table-mobile-xxl{display:block}.table-mobile-xxl thead{display:none}.table-mobile-xxl tbody,.table-mobile-xxl tr{display:flex;flex-direction:column}.table-mobile-xxl td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-xxl td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-xxl tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-xxl .btn{display:block}}.table-sort{font:inherit;color:inherit;text-transform:inherit;letter-spacing:inherit;border:0;background:inherit;display:block;width:100%;text-align:inherit;transition:color .3s;margin:-.5rem;padding:.5rem}@media (prefers-reduced-motion: reduce){.table-sort{transition:none}}.table-sort:hover,.table-sort.asc,.table-sort.desc{color:var(--tblr-body-color)}.table-sort:after{content:"";display:inline-flex;width:1rem;height:1rem;vertical-align:bottom;mask-image:url("data:image/svg+xml,");background:currentColor;margin-left:.25rem}.table-sort.asc:after{mask-image:url("data:image/svg+xml,")}.table-sort.desc:after{mask-image:url("data:image/svg+xml,")}.table-borderless thead th{background:transparent}.tag{--tblr-tag-height: 1.5rem;border:1px solid var(--tblr-border-color);display:inline-flex;align-items:center;height:var(--tblr-tag-height);border-radius:var(--tblr-border-radius);padding:0 .5rem;background:var(--tblr-bg-surface);box-shadow:var(--tblr-box-shadow-input);gap:.5rem}.tag .btn-close{margin-right:-.25rem;margin-left:-.125rem;padding:0;width:1rem;height:1rem;font-size:.5rem}.tag-badge{--tblr-badge-font-size: .625rem;--tblr-badge-padding-x: .25rem;--tblr-badge-padding-y: .125rem;margin-right:-.25rem}.tag-avatar,.tag-flag,.tag-payment,.tag-icon,.tag-check{margin-left:-.25rem}.tag-icon{color:var(--tblr-secondary);margin-right:-.125rem;width:1rem;height:1rem}.tag-check{width:1rem;height:1rem;background-size:1rem}.tags-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.toast{background:#fff;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);box-shadow:#1824330a 0 2px 4px}.toast .toast-header{user-select:none}.toast button[data-bs-dismiss=toast]{outline:none}.toast-primary{--tblr-toast-color: #0054a6}.toast-secondary{--tblr-toast-color: #667382}.toast-success{--tblr-toast-color: #2fb344}.toast-info{--tblr-toast-color: #4299e1}.toast-warning{--tblr-toast-color: #f76707}.toast-danger{--tblr-toast-color: #d63939}.toast-light{--tblr-toast-color: #fcfdfe}.toast-dark{--tblr-toast-color: #182433}.toast-muted{--tblr-toast-color: #667382}.toast-blue{--tblr-toast-color: #0054a6}.toast-azure{--tblr-toast-color: #4299e1}.toast-indigo{--tblr-toast-color: #4263eb}.toast-purple{--tblr-toast-color: #ae3ec9}.toast-pink{--tblr-toast-color: #d6336c}.toast-red{--tblr-toast-color: #d63939}.toast-orange{--tblr-toast-color: #f76707}.toast-yellow{--tblr-toast-color: #f59f00}.toast-lime{--tblr-toast-color: #74b816}.toast-green{--tblr-toast-color: #2fb344}.toast-teal{--tblr-toast-color: #0ca678}.toast-cyan{--tblr-toast-color: #17a2b8}.toast-facebook{--tblr-toast-color: #1877f2}.toast-twitter{--tblr-toast-color: #1da1f2}.toast-linkedin{--tblr-toast-color: #0a66c2}.toast-google{--tblr-toast-color: #dc4e41}.toast-youtube{--tblr-toast-color: #ff0000}.toast-vimeo{--tblr-toast-color: #1ab7ea}.toast-dribbble{--tblr-toast-color: #ea4c89}.toast-github{--tblr-toast-color: #181717}.toast-instagram{--tblr-toast-color: #e4405f}.toast-pinterest{--tblr-toast-color: #bd081c}.toast-vk{--tblr-toast-color: #6383a8}.toast-rss{--tblr-toast-color: #ffa500}.toast-flickr{--tblr-toast-color: #0063dc}.toast-bitbucket{--tblr-toast-color: #0052cc}.toast-tabler{--tblr-toast-color: #0054a6}.toolbar{display:flex;flex-wrap:nowrap;flex-shrink:0;margin:0 -.5rem}.toolbar>*{margin:0 .5rem}.tracking{--tblr-tracking-height: 1.5rem;--tblr-tracking-gap-width: .125rem;--tblr-tracking-block-border-radius: var(--tblr-border-radius);display:flex;gap:var(--tblr-tracking-gap-width)}.tracking-squares{--tblr-tracking-block-border-radius: var(--tblr-border-radius-sm)}.tracking-squares .tracking-block{height:auto}.tracking-squares .tracking-block:before{content:"";display:block;padding-top:100%}.tracking-block{flex:1;border-radius:var(--tblr-tracking-block-border-radius);height:var(--tblr-tracking-height);min-width:.25rem;background:var(--tblr-border-color)}.timeline{--tblr-timeline-icon-size: 2.5rem;position:relative;list-style:none;padding:0}.timeline-event{position:relative}.timeline-event:not(:last-child){margin-bottom:var(--tblr-page-padding)}.timeline-event:not(:last-child):before{content:"";position:absolute;top:var(--tblr-timeline-icon-size);left:calc(var(--tblr-timeline-icon-size) / 2);bottom:calc(-1 * var(--tblr-page-padding));width:var(--tblr-border-width);background-color:var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.timeline-event-icon{position:absolute;display:flex;align-items:center;justify-content:center;width:var(--tblr-timeline-icon-size, 2.5rem);height:var(--tblr-timeline-icon-size, 2.5rem);background:var(--tblr-gray-200);color:var(--tblr-secondary);border-radius:var(--tblr-border-radius);z-index:5}.timeline-event-card{margin-left:calc(var(--tblr-timeline-icon-size, 2.5rem) + var(--tblr-page-padding))}.timeline-simple .timeline-event-icon{display:none}.timeline-simple .timeline-event-card{margin-left:0}.hr-text{display:flex;align-items:center;margin:2rem 0;font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);height:1px}.hr-text:after,.hr-text:before{flex:1 1 auto;height:1px;background-color:var(--tblr-border-color)}.hr-text:before{content:"";margin-right:.5rem}.hr-text:after{content:"";margin-left:.5rem}.hr-text>*:first-child{padding-right:.5rem;padding-left:0;color:var(--tblr-secondary)}.hr-text.hr-text-left:before{content:none}.hr-text.hr-text-left>*:first-child{padding-right:.5rem;padding-left:.5rem}.hr-text.hr-text-right:before{content:""}.hr-text.hr-text-right:after{content:none}.hr-text.hr-text-right>*:first-child{padding-right:0;padding-left:.5rem}.card>.hr-text{margin:0}.hr-text-spaceless{margin:-.5rem 0}.lead{line-height:1.4}a{text-decoration-skip-ink:auto}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a,.h1 a,.h2 a,.h3 a,.h4 a,.h5 a,.h6 a,h1 a:hover,h2 a:hover,h3 a:hover,h4 a:hover,h5 a:hover,h6 a:hover,.h1 a:hover,.h2 a:hover,.h3 a:hover,.h4 a:hover,.h5 a:hover,.h6 a:hover{color:inherit}h1,.h1{font-size:var(--tblr-font-size-h1);line-height:var(--tblr-line-height-h1)}h2,.h2{font-size:var(--tblr-font-size-h2);line-height:var(--tblr-line-height-h2)}h3,.h3{font-size:var(--tblr-font-size-h3);line-height:var(--tblr-line-height-h3)}h4,.h4{font-size:var(--tblr-font-size-h4);line-height:var(--tblr-line-height-h4)}h5,.h5{font-size:var(--tblr-font-size-h5);line-height:var(--tblr-line-height-h5)}h6,.h6{font-size:var(--tblr-font-size-h6);line-height:var(--tblr-line-height-h6)}strong,.strong,b{font-weight:var(--tblr-font-weight-bold)}blockquote{padding-left:1rem;border-left:2px var(--tblr-border-style) var(--tblr-border-color)}blockquote p{margin-bottom:1rem}blockquote cite{display:block;text-align:right}blockquote cite:before{content:"\2014 "}ul,ol{padding-left:1.5rem}hr,.hr{margin:2rem 0}dl dd:last-child{margin-bottom:0}pre{padding:1rem;background:var(--tblr-bg-surface-dark);color:var(--tblr-light);border-radius:var(--tblr-border-radius)}pre code{background:transparent}code{background:var(--tblr-code-bg);padding:2px 4px;border-radius:var(--tblr-border-radius)}kbd,.kbd{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);display:inline-block;box-sizing:border-box;max-width:100%;font-size:var(--tblr-font-size-h5);font-weight:var(--tblr-font-weight-medium);line-height:1;vertical-align:baseline;border-radius:var(--tblr-border-radius)}img{max-width:100%}.list-unstyled{margin-left:0}::selection{background-color:rgba(var(--tblr-primary-rgb),.16)}[class^=link-].disabled,[class*=" link-"].disabled{color:var(--tblr-disabled-color);pointer-events:none}.subheader{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary)}.chart{display:block;min-height:10rem}.chart text{font-family:inherit}.chart-sm{height:2.5rem}.chart-lg{height:15rem}.chart-square{height:5.75rem}.chart-sparkline{position:relative;width:4rem;height:2.5rem;line-height:1;min-height:0!important}.chart-sparkline-sm{height:1.5rem}.chart-sparkline-square{width:2.5rem}.chart-sparkline-wide{width:6rem}.chart-sparkline-label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:.625rem}.chart-sparkline-label .icon{width:1rem;height:1rem;font-size:1rem}.offcanvas-header{border-bottom:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)}.offcanvas-footer{padding:1.5rem}.offcanvas-title{font-size:1rem;font-weight:var(--tblr-font-weight-medium);line-height:1.5rem}.offcanvas-narrow{width:20rem}.chat-bubbles{display:flex;flex-direction:column;gap:1rem}.chat-bubble{background:var(--tblr-bg-surface-secondary);border-radius:var(--tblr-border-radius-lg);padding:1rem;position:relative}.chat-bubble-me{background-color:var(--tblr-primary-lt);box-shadow:none}.chat-bubble-title{margin-bottom:.25rem}.chat-bubble-author{font-weight:600}.chat-bubble-date{color:var(--tblr-secondary)}.chat-bubble-body>*:last-child{margin-bottom:0}.bg-white-overlay{color:#fff;background-color:#fcfdfe3d}.bg-dark-overlay{color:#fff;background-color:#1824333d}.bg-cover{background-repeat:no-repeat;background-size:cover;background-position:center}.bg-primary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-primary-rgb),var(--tblr-bg-opacity))!important}.bg-primary-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-primary-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-primary-lt-rgb),var(--tblr-bg-opacity))!important}.border-primary{border-color:#0054a6!important}.bg-secondary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-secondary-rgb),var(--tblr-bg-opacity))!important}.bg-secondary-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-secondary-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-secondary-lt-rgb),var(--tblr-bg-opacity))!important}.border-secondary{border-color:#667382!important}.bg-success{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-success-rgb),var(--tblr-bg-opacity))!important}.bg-success-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-success-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-success-lt-rgb),var(--tblr-bg-opacity))!important}.border-success{border-color:#2fb344!important}.bg-info{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-info-rgb),var(--tblr-bg-opacity))!important}.bg-info-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-info-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-info-lt-rgb),var(--tblr-bg-opacity))!important}.border-info{border-color:#4299e1!important}.bg-warning{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-warning-rgb),var(--tblr-bg-opacity))!important}.bg-warning-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-warning-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-warning-lt-rgb),var(--tblr-bg-opacity))!important}.border-warning{border-color:#f76707!important}.bg-danger{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-danger-rgb),var(--tblr-bg-opacity))!important}.bg-danger-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-danger-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-danger-lt-rgb),var(--tblr-bg-opacity))!important}.border-danger{border-color:#d63939!important}.bg-light{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-light-rgb),var(--tblr-bg-opacity))!important}.bg-light-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-light-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-light-lt-rgb),var(--tblr-bg-opacity))!important}.border-light{border-color:#fcfdfe!important}.bg-dark{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-dark-rgb),var(--tblr-bg-opacity))!important}.bg-dark-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-dark-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-dark-lt-rgb),var(--tblr-bg-opacity))!important}.border-dark{border-color:#182433!important}.bg-muted{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-muted-rgb),var(--tblr-bg-opacity))!important}.bg-muted-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-muted-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-muted-lt-rgb),var(--tblr-bg-opacity))!important}.border-muted{border-color:#667382!important}.bg-blue{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-blue-rgb),var(--tblr-bg-opacity))!important}.bg-blue-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-blue-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-blue-lt-rgb),var(--tblr-bg-opacity))!important}.border-blue{border-color:#0054a6!important}.bg-azure{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-azure-rgb),var(--tblr-bg-opacity))!important}.bg-azure-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-azure-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-azure-lt-rgb),var(--tblr-bg-opacity))!important}.border-azure{border-color:#4299e1!important}.bg-indigo{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-indigo-rgb),var(--tblr-bg-opacity))!important}.bg-indigo-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-indigo-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-indigo-lt-rgb),var(--tblr-bg-opacity))!important}.border-indigo{border-color:#4263eb!important}.bg-purple{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-purple-rgb),var(--tblr-bg-opacity))!important}.bg-purple-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-purple-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-purple-lt-rgb),var(--tblr-bg-opacity))!important}.border-purple{border-color:#ae3ec9!important}.bg-pink{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-pink-rgb),var(--tblr-bg-opacity))!important}.bg-pink-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-pink-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-pink-lt-rgb),var(--tblr-bg-opacity))!important}.border-pink{border-color:#d6336c!important}.bg-red{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-red-rgb),var(--tblr-bg-opacity))!important}.bg-red-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-red-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-red-lt-rgb),var(--tblr-bg-opacity))!important}.border-red{border-color:#d63939!important}.bg-orange{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-orange-rgb),var(--tblr-bg-opacity))!important}.bg-orange-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-orange-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-orange-lt-rgb),var(--tblr-bg-opacity))!important}.border-orange{border-color:#f76707!important}.bg-yellow{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-yellow-rgb),var(--tblr-bg-opacity))!important}.bg-yellow-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-yellow-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-yellow-lt-rgb),var(--tblr-bg-opacity))!important}.border-yellow{border-color:#f59f00!important}.bg-lime{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-lime-rgb),var(--tblr-bg-opacity))!important}.bg-lime-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-lime-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-lime-lt-rgb),var(--tblr-bg-opacity))!important}.border-lime{border-color:#74b816!important}.bg-green{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-green-rgb),var(--tblr-bg-opacity))!important}.bg-green-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-green-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-green-lt-rgb),var(--tblr-bg-opacity))!important}.border-green{border-color:#2fb344!important}.bg-teal{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-teal-rgb),var(--tblr-bg-opacity))!important}.bg-teal-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-teal-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-teal-lt-rgb),var(--tblr-bg-opacity))!important}.border-teal{border-color:#0ca678!important}.bg-cyan{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-cyan-rgb),var(--tblr-bg-opacity))!important}.bg-cyan-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-cyan-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-cyan-lt-rgb),var(--tblr-bg-opacity))!important}.border-cyan{border-color:#17a2b8!important}.bg-facebook{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-facebook-rgb),var(--tblr-bg-opacity))!important}.bg-facebook-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-facebook-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-facebook-lt-rgb),var(--tblr-bg-opacity))!important}.border-facebook{border-color:#1877f2!important}.bg-twitter{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-twitter-rgb),var(--tblr-bg-opacity))!important}.bg-twitter-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-twitter-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-twitter-lt-rgb),var(--tblr-bg-opacity))!important}.border-twitter{border-color:#1da1f2!important}.bg-linkedin{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-linkedin-rgb),var(--tblr-bg-opacity))!important}.bg-linkedin-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-linkedin-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-linkedin-lt-rgb),var(--tblr-bg-opacity))!important}.border-linkedin{border-color:#0a66c2!important}.bg-google{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-google-rgb),var(--tblr-bg-opacity))!important}.bg-google-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-google-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-google-lt-rgb),var(--tblr-bg-opacity))!important}.border-google{border-color:#dc4e41!important}.bg-youtube{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-youtube-rgb),var(--tblr-bg-opacity))!important}.bg-youtube-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-youtube-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-youtube-lt-rgb),var(--tblr-bg-opacity))!important}.border-youtube{border-color:red!important}.bg-vimeo{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-vimeo-rgb),var(--tblr-bg-opacity))!important}.bg-vimeo-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-vimeo-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-vimeo-lt-rgb),var(--tblr-bg-opacity))!important}.border-vimeo{border-color:#1ab7ea!important}.bg-dribbble{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-dribbble-rgb),var(--tblr-bg-opacity))!important}.bg-dribbble-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-dribbble-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-dribbble-lt-rgb),var(--tblr-bg-opacity))!important}.border-dribbble{border-color:#ea4c89!important}.bg-github{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-github-rgb),var(--tblr-bg-opacity))!important}.bg-github-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-github-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-github-lt-rgb),var(--tblr-bg-opacity))!important}.border-github{border-color:#181717!important}.bg-instagram{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-instagram-rgb),var(--tblr-bg-opacity))!important}.bg-instagram-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-instagram-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-instagram-lt-rgb),var(--tblr-bg-opacity))!important}.border-instagram{border-color:#e4405f!important}.bg-pinterest{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-pinterest-rgb),var(--tblr-bg-opacity))!important}.bg-pinterest-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-pinterest-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-pinterest-lt-rgb),var(--tblr-bg-opacity))!important}.border-pinterest{border-color:#bd081c!important}.bg-vk{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-vk-rgb),var(--tblr-bg-opacity))!important}.bg-vk-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-vk-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-vk-lt-rgb),var(--tblr-bg-opacity))!important}.border-vk{border-color:#6383a8!important}.bg-rss{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-rss-rgb),var(--tblr-bg-opacity))!important}.bg-rss-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-rss-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-rss-lt-rgb),var(--tblr-bg-opacity))!important}.border-rss{border-color:orange!important}.bg-flickr{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-flickr-rgb),var(--tblr-bg-opacity))!important}.bg-flickr-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-flickr-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-flickr-lt-rgb),var(--tblr-bg-opacity))!important}.border-flickr{border-color:#0063dc!important}.bg-bitbucket{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-bg-opacity))!important}.bg-bitbucket-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-bitbucket-lt-rgb),var(--tblr-bg-opacity))!important}.border-bitbucket{border-color:#0052cc!important}.bg-tabler{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-tabler-rgb),var(--tblr-bg-opacity))!important}.bg-tabler-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-tabler-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-tabler-lt-rgb),var(--tblr-bg-opacity))!important}.border-tabler{border-color:#0054a6!important}.bg-white{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-white-rgb),var(--tblr-bg-opacity))!important}.bg-white-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-white-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-white-lt-rgb),var(--tblr-bg-opacity))!important}.border-white{border-color:#fff!important}.text-primary{--tblr-text-opacity: 1;color:rgba(var(--tblr-primary-rgb),var(--tblr-text-opacity))!important}.text-primary-fg{color:var(--tblr-primary-fg)!important}.text-secondary{--tblr-text-opacity: 1;color:rgba(var(--tblr-secondary-rgb),var(--tblr-text-opacity))!important}.text-secondary-fg{color:var(--tblr-secondary-fg)!important}.text-success{--tblr-text-opacity: 1;color:rgba(var(--tblr-success-rgb),var(--tblr-text-opacity))!important}.text-success-fg{color:var(--tblr-success-fg)!important}.text-info{--tblr-text-opacity: 1;color:rgba(var(--tblr-info-rgb),var(--tblr-text-opacity))!important}.text-info-fg{color:var(--tblr-info-fg)!important}.text-warning{--tblr-text-opacity: 1;color:rgba(var(--tblr-warning-rgb),var(--tblr-text-opacity))!important}.text-warning-fg{color:var(--tblr-warning-fg)!important}.text-danger{--tblr-text-opacity: 1;color:rgba(var(--tblr-danger-rgb),var(--tblr-text-opacity))!important}.text-danger-fg{color:var(--tblr-danger-fg)!important}.text-light{--tblr-text-opacity: 1;color:rgba(var(--tblr-light-rgb),var(--tblr-text-opacity))!important}.text-light-fg{color:var(--tblr-light-fg)!important}.text-dark{--tblr-text-opacity: 1;color:rgba(var(--tblr-dark-rgb),var(--tblr-text-opacity))!important}.text-dark-fg{color:var(--tblr-dark-fg)!important}.text-muted{--tblr-text-opacity: 1;color:rgba(var(--tblr-muted-rgb),var(--tblr-text-opacity))!important}.text-muted-fg{color:var(--tblr-muted-fg)!important}.text-blue{--tblr-text-opacity: 1;color:rgba(var(--tblr-blue-rgb),var(--tblr-text-opacity))!important}.text-blue-fg{color:var(--tblr-blue-fg)!important}.text-azure{--tblr-text-opacity: 1;color:rgba(var(--tblr-azure-rgb),var(--tblr-text-opacity))!important}.text-azure-fg{color:var(--tblr-azure-fg)!important}.text-indigo{--tblr-text-opacity: 1;color:rgba(var(--tblr-indigo-rgb),var(--tblr-text-opacity))!important}.text-indigo-fg{color:var(--tblr-indigo-fg)!important}.text-purple{--tblr-text-opacity: 1;color:rgba(var(--tblr-purple-rgb),var(--tblr-text-opacity))!important}.text-purple-fg{color:var(--tblr-purple-fg)!important}.text-pink{--tblr-text-opacity: 1;color:rgba(var(--tblr-pink-rgb),var(--tblr-text-opacity))!important}.text-pink-fg{color:var(--tblr-pink-fg)!important}.text-red{--tblr-text-opacity: 1;color:rgba(var(--tblr-red-rgb),var(--tblr-text-opacity))!important}.text-red-fg{color:var(--tblr-red-fg)!important}.text-orange{--tblr-text-opacity: 1;color:rgba(var(--tblr-orange-rgb),var(--tblr-text-opacity))!important}.text-orange-fg{color:var(--tblr-orange-fg)!important}.text-yellow{--tblr-text-opacity: 1;color:rgba(var(--tblr-yellow-rgb),var(--tblr-text-opacity))!important}.text-yellow-fg{color:var(--tblr-yellow-fg)!important}.text-lime{--tblr-text-opacity: 1;color:rgba(var(--tblr-lime-rgb),var(--tblr-text-opacity))!important}.text-lime-fg{color:var(--tblr-lime-fg)!important}.text-green{--tblr-text-opacity: 1;color:rgba(var(--tblr-green-rgb),var(--tblr-text-opacity))!important}.text-green-fg{color:var(--tblr-green-fg)!important}.text-teal{--tblr-text-opacity: 1;color:rgba(var(--tblr-teal-rgb),var(--tblr-text-opacity))!important}.text-teal-fg{color:var(--tblr-teal-fg)!important}.text-cyan{--tblr-text-opacity: 1;color:rgba(var(--tblr-cyan-rgb),var(--tblr-text-opacity))!important}.text-cyan-fg{color:var(--tblr-cyan-fg)!important}.text-facebook{--tblr-text-opacity: 1;color:rgba(var(--tblr-facebook-rgb),var(--tblr-text-opacity))!important}.text-facebook-fg{color:var(--tblr-facebook-fg)!important}.text-twitter{--tblr-text-opacity: 1;color:rgba(var(--tblr-twitter-rgb),var(--tblr-text-opacity))!important}.text-twitter-fg{color:var(--tblr-twitter-fg)!important}.text-linkedin{--tblr-text-opacity: 1;color:rgba(var(--tblr-linkedin-rgb),var(--tblr-text-opacity))!important}.text-linkedin-fg{color:var(--tblr-linkedin-fg)!important}.text-google{--tblr-text-opacity: 1;color:rgba(var(--tblr-google-rgb),var(--tblr-text-opacity))!important}.text-google-fg{color:var(--tblr-google-fg)!important}.text-youtube{--tblr-text-opacity: 1;color:rgba(var(--tblr-youtube-rgb),var(--tblr-text-opacity))!important}.text-youtube-fg{color:var(--tblr-youtube-fg)!important}.text-vimeo{--tblr-text-opacity: 1;color:rgba(var(--tblr-vimeo-rgb),var(--tblr-text-opacity))!important}.text-vimeo-fg{color:var(--tblr-vimeo-fg)!important}.text-dribbble{--tblr-text-opacity: 1;color:rgba(var(--tblr-dribbble-rgb),var(--tblr-text-opacity))!important}.text-dribbble-fg{color:var(--tblr-dribbble-fg)!important}.text-github{--tblr-text-opacity: 1;color:rgba(var(--tblr-github-rgb),var(--tblr-text-opacity))!important}.text-github-fg{color:var(--tblr-github-fg)!important}.text-instagram{--tblr-text-opacity: 1;color:rgba(var(--tblr-instagram-rgb),var(--tblr-text-opacity))!important}.text-instagram-fg{color:var(--tblr-instagram-fg)!important}.text-pinterest{--tblr-text-opacity: 1;color:rgba(var(--tblr-pinterest-rgb),var(--tblr-text-opacity))!important}.text-pinterest-fg{color:var(--tblr-pinterest-fg)!important}.text-vk{--tblr-text-opacity: 1;color:rgba(var(--tblr-vk-rgb),var(--tblr-text-opacity))!important}.text-vk-fg{color:var(--tblr-vk-fg)!important}.text-rss{--tblr-text-opacity: 1;color:rgba(var(--tblr-rss-rgb),var(--tblr-text-opacity))!important}.text-rss-fg{color:var(--tblr-rss-fg)!important}.text-flickr{--tblr-text-opacity: 1;color:rgba(var(--tblr-flickr-rgb),var(--tblr-text-opacity))!important}.text-flickr-fg{color:var(--tblr-flickr-fg)!important}.text-bitbucket{--tblr-text-opacity: 1;color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-text-opacity))!important}.text-bitbucket-fg{color:var(--tblr-bitbucket-fg)!important}.text-tabler{--tblr-text-opacity: 1;color:rgba(var(--tblr-tabler-rgb),var(--tblr-text-opacity))!important}.text-tabler-fg{color:var(--tblr-tabler-fg)!important}.bg-gray-50{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-50-rgb),var(--tblr-bg-opacity))!important}.text-gray-50-fg{color:#182433!important}.bg-gray-100{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-100-rgb),var(--tblr-bg-opacity))!important}.text-gray-100-fg{color:#182433!important}.bg-gray-200{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-200-rgb),var(--tblr-bg-opacity))!important}.text-gray-200-fg{color:#182433!important}.bg-gray-300{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-300-rgb),var(--tblr-bg-opacity))!important}.text-gray-300-fg{color:#182433!important}.bg-gray-400{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-400-rgb),var(--tblr-bg-opacity))!important}.text-gray-400-fg{color:#fcfdfe!important}.bg-gray-500{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-500-rgb),var(--tblr-bg-opacity))!important}.text-gray-500-fg{color:#fcfdfe!important}.bg-gray-600{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-600-rgb),var(--tblr-bg-opacity))!important}.text-gray-600-fg{color:#fcfdfe!important}.bg-gray-700{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-700-rgb),var(--tblr-bg-opacity))!important}.text-gray-700-fg{color:#fcfdfe!important}.bg-gray-800{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-800-rgb),var(--tblr-bg-opacity))!important}.text-gray-800-fg{color:#fcfdfe!important}.bg-gray-900{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-900-rgb),var(--tblr-bg-opacity))!important}.text-gray-900-fg{color:#fcfdfe!important}.scrollable{overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.scrollable.hover{overflow-y:hidden}.scrollable.hover>*{margin-top:-1px}.scrollable.hover:hover,.scrollable.hover:focus,.scrollable.hover:active{overflow:visible;overflow-y:auto}.touch .scrollable{overflow-y:auto!important}.scroll-x,.scroll-y{overflow:hidden;-webkit-overflow-scrolling:touch}.scroll-y{overflow-y:auto}.scroll-x{overflow-x:auto}.no-scroll{overflow:hidden}.w-0{width:0!important}.h-0{height:0!important}.w-1{width:.25rem!important}.h-1{height:.25rem!important}.w-2{width:.5rem!important}.h-2{height:.5rem!important}.w-3{width:1rem!important}.h-3{height:1rem!important}.w-4{width:1.5rem!important}.h-4{height:1.5rem!important}.w-5{width:2rem!important}.h-5{height:2rem!important}.w-6{width:3rem!important}.h-6{height:3rem!important}.w-7{width:5rem!important}.h-7{height:5rem!important}.w-8{width:8rem!important}.h-8{height:8rem!important}.w-auto{width:auto!important}.h-auto{height:auto!important}.w-px{width:1px!important}.h-px{height:1px!important}.w-full{width:100%!important}.h-full{height:100%!important}.opacity-0{opacity:0!important}.opacity-5{opacity:.05!important}.opacity-10{opacity:.1!important}.opacity-15{opacity:.15!important}.opacity-20{opacity:.2!important}.opacity-25{opacity:.25!important}.opacity-30{opacity:.3!important}.opacity-35{opacity:.35!important}.opacity-40{opacity:.4!important}.opacity-45{opacity:.45!important}.opacity-50{opacity:.5!important}.opacity-55{opacity:.55!important}.opacity-60{opacity:.6!important}.opacity-65{opacity:.65!important}.opacity-70{opacity:.7!important}.opacity-75{opacity:.75!important}.opacity-80{opacity:.8!important}.opacity-85{opacity:.85!important}.opacity-90{opacity:.9!important}.opacity-95{opacity:.95!important}.opacity-100{opacity:1!important}.hover-shadow-sm:hover{box-shadow:0 .125rem .25rem #00000013!important}.hover-shadow:hover{box-shadow:rgba(var(--tblr-body-color-rgb),.04) 0 2px 4px!important}.hover-shadow-lg:hover{box-shadow:0 1rem 3rem #0000002d!important}.hover-shadow-none:hover{box-shadow:none!important}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.ts-control{border:1px solid var(--tblr-border-color);padding:.5625rem .75rem;width:100%;overflow:hidden;position:relative;z-index:1;box-sizing:border-box;box-shadow:none;border-radius:var(--tblr-border-radius);display:flex;flex-wrap:wrap}.ts-wrapper.multi.has-items .ts-control{padding:calc(.5625rem - 1px + -0) .75rem calc(.5625rem - 4px + -0)}.full .ts-control{background-color:var(--tblr-bg-forms)}.disabled .ts-control,.disabled .ts-control *{cursor:default!important}.focus .ts-control{box-shadow:none}.ts-control>*{vertical-align:baseline;display:inline-block}.ts-wrapper.multi .ts-control>div{cursor:pointer;margin:0 3px 3px 0;padding:1px 5px;background:#efefef;color:#182433;border:0 solid #dadfe5}.ts-wrapper.multi .ts-control>div.active{background:#0054a6;color:#fff;border:0 solid rgba(0,0,0,0)}.ts-wrapper.multi.disabled .ts-control>div,.ts-wrapper.multi.disabled .ts-control>div.active{color:#727272;background:#fff;border:0 solid white}.ts-control>input{flex:1 1 auto;min-width:7rem;display:inline-block!important;padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0!important;text-indent:0!important;border:0 none!important;background:none!important;line-height:inherit!important;user-select:auto!important;box-shadow:none!important}.ts-control>input::-ms-clear{display:none}.ts-control>input:focus{outline:none!important}.has-items .ts-control>input{margin:0 4px!important}.ts-control.rtl{text-align:right}.ts-control.rtl.single .ts-control:after{left:calc(.75rem + 5px);right:auto}.ts-control.rtl .ts-control>input{margin:0 4px 0 -2px!important}.disabled .ts-control{opacity:.5;background-color:var(--tblr-bg-surface-secondary)}.input-hidden .ts-control>input{opacity:0;position:absolute;left:-10000px}.ts-dropdown{position:absolute;top:100%;left:0;width:100%;z-index:10;border:1px solid #d0d0d0;background:#fff;margin:.25rem 0 0;border-top:0 none;box-sizing:border-box;box-shadow:0 1px 3px #0000001a;border-radius:0 0 var(--tblr-border-radius) var(--tblr-border-radius)}.ts-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.ts-dropdown [data-selectable] .highlight{background:#ffed2866;border-radius:1px}.ts-dropdown .option,.ts-dropdown .optgroup-header,.ts-dropdown .no-results,.ts-dropdown .create{padding:3px .75rem}.ts-dropdown .option,.ts-dropdown [data-disabled],.ts-dropdown [data-disabled] [data-selectable].option{cursor:inherit;opacity:.5}.ts-dropdown [data-selectable].option{opacity:1;cursor:pointer}.ts-dropdown .optgroup:first-child .optgroup-header{border-top:0 none}.ts-dropdown .optgroup-header{color:#667382;background:var(--tblr-bg-surface);cursor:default}.ts-dropdown .active{background-color:rgba(var(--tblr-secondary-rgb),.08);color:inherit}.ts-dropdown .active.create{color:inherit}.ts-dropdown .create{color:#18243380}.ts-dropdown .spinner{display:inline-block;width:30px;height:30px;margin:3px .75rem}.ts-dropdown .spinner:after{content:" ";display:block;width:24px;height:24px;margin:3px;border-radius:50%;border:5px solid #d0d0d0;border-color:#d0d0d0 transparent #d0d0d0 transparent;animation:lds-dual-ring 1.2s linear infinite}@keyframes lds-dual-ring{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ts-dropdown-content{overflow:hidden auto;max-height:200px;scroll-behavior:smooth}.ts-wrapper.plugin-drag_drop .ts-dragging{color:transparent!important}.ts-wrapper.plugin-drag_drop .ts-dragging>*{visibility:hidden!important}.plugin-checkbox_options:not(.rtl) .option input{margin-right:.5rem}.plugin-checkbox_options.rtl .option input{margin-left:.5rem}.plugin-clear_button{--ts-pr-clear-button: 1em}.plugin-clear_button .clear-button{opacity:0;position:absolute;top:50%;transform:translateY(-50%);right:calc(.75rem - 5px);margin-right:0!important;background:transparent!important;transition:opacity .5s;cursor:pointer}.plugin-clear_button.form-select .clear-button,.plugin-clear_button.single .clear-button{right:max(var(--ts-pr-caret),.75rem)}.plugin-clear_button.focus.has-items .clear-button,.plugin-clear_button:not(.disabled):hover.has-items .clear-button{opacity:1}.ts-wrapper .dropdown-header{position:relative;padding:6px .75rem;border-bottom:1px solid #d0d0d0;background:color-mix(#fff,#d0d0d0,85%);border-radius:var(--tblr-border-radius) var(--tblr-border-radius) 0 0}.ts-wrapper .dropdown-header-close{position:absolute;right:.75rem;top:50%;color:#182433;opacity:.4;margin-top:-12px;line-height:20px;font-size:20px!important}.ts-wrapper .dropdown-header-close:hover{color:#000}.plugin-dropdown_input.focus.dropdown-active .ts-control{box-shadow:none;border:1px solid var(--tblr-border-color);box-shadow:var(--tblr-box-shadow-input)}.plugin-dropdown_input .dropdown-input{border:1px solid #d0d0d0;border-width:0 0 1px;display:block;padding:.5625rem .75rem;box-shadow:none;width:100%;background:transparent}.plugin-dropdown_input.focus .ts-dropdown .dropdown-input{border-color:#80aad3;outline:0;box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.plugin-dropdown_input .items-placeholder{border:0 none!important;box-shadow:none!important;width:100%}.plugin-dropdown_input.has-items .items-placeholder,.plugin-dropdown_input.dropdown-active .items-placeholder{display:none!important}.ts-wrapper.plugin-input_autogrow.has-items .ts-control>input{min-width:0}.ts-wrapper.plugin-input_autogrow.has-items.focus .ts-control>input{flex:none;min-width:4px}.ts-wrapper.plugin-input_autogrow.has-items.focus .ts-control>input::placeholder{color:transparent}.ts-dropdown.plugin-optgroup_columns .ts-dropdown-content{display:flex}.ts-dropdown.plugin-optgroup_columns .optgroup{border-right:1px solid #f2f2f2;border-top:0 none;flex-grow:1;flex-basis:0;min-width:0}.ts-dropdown.plugin-optgroup_columns .optgroup:last-child{border-right:0 none}.ts-dropdown.plugin-optgroup_columns .optgroup:before{display:none}.ts-dropdown.plugin-optgroup_columns .optgroup-header{border-top:0 none}.ts-wrapper.plugin-remove_button .item{display:inline-flex;align-items:center}.ts-wrapper.plugin-remove_button .item .remove{color:inherit;text-decoration:none;vertical-align:middle;display:inline-block;padding:0 5px;border-radius:0 2px 2px 0;box-sizing:border-box}.ts-wrapper.plugin-remove_button .item .remove:hover{background:#0000000d}.ts-wrapper.plugin-remove_button.disabled .item .remove:hover{background:none}.ts-wrapper.plugin-remove_button .remove-single{position:absolute;right:0;top:0;font-size:23px}.ts-wrapper.plugin-remove_button:not(.rtl) .item{padding-right:0!important}.ts-wrapper.plugin-remove_button:not(.rtl) .item .remove{border-left:1px solid #dadfe5;margin-left:5px}.ts-wrapper.plugin-remove_button:not(.rtl) .item.active .remove{border-left-color:#0000}.ts-wrapper.plugin-remove_button:not(.rtl).disabled .item .remove{border-left-color:#fff}.ts-wrapper.plugin-remove_button.rtl .item{padding-left:0!important}.ts-wrapper.plugin-remove_button.rtl .item .remove{border-right:1px solid #dadfe5;margin-right:5px}.ts-wrapper.plugin-remove_button.rtl .item.active .remove{border-right-color:#0000}.ts-wrapper.plugin-remove_button.rtl.disabled .item .remove{border-right-color:#fff}:root{--ts-pr-clear-button: 0;--ts-pr-caret: 0;--ts-pr-min: .75rem}.ts-wrapper.single .ts-control,.ts-wrapper.single .ts-control input{cursor:pointer}.ts-control:not(.rtl){padding-right:max(var(--ts-pr-min),var(--ts-pr-clear-button) + var(--ts-pr-caret))!important}.ts-control.rtl{padding-left:max(var(--ts-pr-min),var(--ts-pr-clear-button) + var(--ts-pr-caret))!important}.ts-wrapper{position:relative}.ts-dropdown,.ts-control,.ts-control input{color:#182433;font-family:inherit;font-size:inherit;line-height:1.4285714286}.ts-control,.ts-wrapper.single.input-active .ts-control{background:var(--tblr-bg-forms);cursor:text}.ts-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;clip-path:inset(50%)!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;white-space:nowrap!important}.ts-dropdown,.ts-dropdown.form-control,.ts-dropdown.form-select{height:auto;padding:0;z-index:1000;background:#fff;border:1px solid var(--tblr-border-color-translucent);border-radius:4px;box-shadow:0 6px 12px #0000002d}.ts-dropdown .optgroup-header{font-size:.765625rem;line-height:1.4285714286}.ts-dropdown .optgroup:first-child:before{display:none}.ts-dropdown .optgroup:before{content:" ";display:block;height:0;margin:var(--tblr-spacer) 0;overflow:hidden;border-top:1px solid var(--tblr-border-color-translucent);margin-left:-.75rem;margin-right:-.75rem}.ts-dropdown .create{padding-left:.75rem}.ts-dropdown-content{padding:5px 0}.ts-control{box-shadow:var(--tblr-box-shadow-input);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:flex;align-items:center}@media (prefers-reduced-motion: reduce){.ts-control{transition:none}}.focus .ts-control{border-color:#80aad3;outline:0;box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.ts-control .item{display:flex;align-items:center}.ts-wrapper.is-invalid,.was-validated .invalid,.was-validated :invalid+.ts-wrapper{border-color:var(--tblr-form-invalid-color)}.ts-wrapper.is-invalid:not(.single),.was-validated .invalid:not(.single),.was-validated :invalid+.ts-wrapper:not(.single){background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-position:right calc(.3571428572em + .28125rem) center;background-size:calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem);background-repeat:no-repeat}.ts-wrapper.is-invalid.single,.was-validated .invalid.single,.was-validated :invalid+.ts-wrapper.single{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23929dab' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem);background-repeat:no-repeat}.ts-wrapper.is-invalid.focus .ts-control,.was-validated .invalid.focus .ts-control,.was-validated :invalid+.ts-wrapper.focus .ts-control{border-color:var(--tblr-form-invalid-color);box-shadow:0 0 0 .25rem rgba(var(--tblr-form-invalid-color),.25)}.ts-wrapper.is-valid,.was-validated .valid,.was-validated :valid+.ts-wrapper{border-color:var(--tblr-form-valid-color)}.ts-wrapper.is-valid:not(.single),.was-validated .valid:not(.single),.was-validated :valid+.ts-wrapper:not(.single){background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-position:right calc(.3571428572em + .28125rem) center;background-size:calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem);background-repeat:no-repeat}.ts-wrapper.is-valid.single,.was-validated .valid.single,.was-validated :valid+.ts-wrapper.single{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23929dab' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem);background-repeat:no-repeat}.ts-wrapper.is-valid.focus .ts-control,.was-validated .valid.focus .ts-control,.was-validated :valid+.ts-wrapper.focus .ts-control{border-color:var(--tblr-form-valid-color);box-shadow:0 0 0 .25rem rgba(var(--tblr-form-valid-color),.25)}.ts-wrapper{min-height:calc(1.4285714286em + 1.125rem + calc(var(--tblr-border-width) * 2));display:flex}.input-group-sm>.ts-wrapper,.ts-wrapper.form-select-sm,.ts-wrapper.form-control-sm{min-height:calc(1.4285714286em + .25rem + calc(var(--tblr-border-width) * 2))}.input-group-sm>.ts-wrapper .ts-control,.ts-wrapper.form-select-sm .ts-control,.ts-wrapper.form-control-sm .ts-control{border-radius:var(--tblr-border-radius-sm);font-size:.75rem}.input-group-sm>.ts-wrapper.has-items .ts-control,.ts-wrapper.form-select-sm.has-items .ts-control,.ts-wrapper.form-control-sm.has-items .ts-control{font-size:.75rem;padding-bottom:0}.input-group-sm>.ts-wrapper.multi.has-items .ts-control,.ts-wrapper.form-select-sm.multi.has-items .ts-control,.ts-wrapper.form-control-sm.multi.has-items .ts-control{padding-top:calc((calc(1.4285714286em + .25rem + calc(var(--tblr-border-width) * 2)) - 1.4285714286 * .75rem - 4px) / 2)!important}.ts-wrapper.multi.has-items .ts-control{padding-left:calc(.75rem - 5px);--ts-pr-min: calc(.75rem - 5px) }.ts-wrapper.multi .ts-control>div{border-radius:calc(var(--tblr-border-radius) - 1px)}.input-group-lg>.ts-wrapper,.ts-wrapper.form-control-lg,.ts-wrapper.form-select-lg{min-height:calc(1.4285714286em + 1rem + calc(var(--tblr-border-width) * 2))}.input-group-lg>.ts-wrapper .ts-control,.ts-wrapper.form-control-lg .ts-control,.ts-wrapper.form-select-lg .ts-control{border-radius:var(--tblr-border-radius-lg);font-size:1.25rem}.ts-wrapper:not(.form-control,.form-select){padding:0;border:none;height:auto;box-shadow:none;background:none}.ts-wrapper:not(.form-control,.form-select).single .ts-control{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23929dab' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px}.ts-wrapper.form-select,.ts-wrapper.single{--ts-pr-caret: 2.25rem}.ts-wrapper.form-control,.ts-wrapper.form-select{padding:0!important;height:auto;box-shadow:none;display:flex}.ts-wrapper.form-control .ts-control,.ts-wrapper.form-control.single.input-active .ts-control,.ts-wrapper.form-select .ts-control,.ts-wrapper.form-select.single.input-active .ts-control{border:none!important}.ts-wrapper.form-control:not(.disabled) .ts-control,.ts-wrapper.form-control:not(.disabled).single.input-active .ts-control,.ts-wrapper.form-select:not(.disabled) .ts-control,.ts-wrapper.form-select:not(.disabled).single.input-active .ts-control{background:transparent!important}.input-group>.ts-wrapper{flex-grow:1;width:1%}.input-group>.ts-wrapper:not(:nth-child(2))>.ts-control{border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.ts-wrapper:not(:last-child)>.ts-control{border-top-right-radius:0;border-bottom-right-radius:0}:root{--ts-pr-clear-button: 0rem;--ts-pr-caret: 0rem}.ts-input,.ts-control{color:inherit}.ts-control .dropdown-menu{width:100%;height:auto}.ts-wrapper .form-control,.ts-wrapper .form-select,.ts-wrapper.form-control,.ts-wrapper.form-select{box-shadow:var(--tblr-box-shadow-input)}.ts-wrapper.is-invalid .ts-control,.ts-wrapper.is-valid .ts-control{--ts-pr-clear-button: 1.5rem}.ts-dropdown{background:var(--tblr-bg-surface);color:var(--tblr-body-color);box-shadow:var(--tblr-box-shadow-dropdown)}.ts-dropdown .option{padding:.5rem .75rem}.ts-control,.ts-control input{color:var(--tblr-body-color)}.ts-control input::placeholder{color:#929dab}.ts-wrapper.multi .ts-control>div{background:var(--tblr-bg-surface-secondary);border:1px solid var(--tblr-border-color);color:var(--tblr-body-color)}html{scroll-behavior:auto!important}.table-responsive .dropdown,.table-responsive .btn-group,.table-responsive .btn-group-vertical{position:static}.progress{min-width:80px}hr.dropdown-divider,.dropdown-divider.hr{margin-bottom:.25rem;margin-top:.25rem}*{font-feature-settings:"liga" 0;font-variant-ligatures:none}pre{background-color:transparent;color:inherit}.btn{display:inline-block}.btn-sm,.btn-group-sm>.btn{border-radius:4px}.nav-tabs .nav-link,.dropdown-item{display:inline-block}table a{filter:brightness(110%)}[data-bs-theme=dark] ::selection,body[data-bs-theme=dark] [data-bs-theme=light] ::selection{background-color:rgba(var(--tblr-primary-rgb),.48)}pre code{padding:unset}.dropdown-toggle:after{font-family:Material Design Icons;content:"\f0140";padding-right:9px;border-bottom:none;border-left:none;transform:none;vertical-align:.05em;height:auto}.ts-wrapper.multi .ts-control{padding:7px 7px 3px}.ts-wrapper.multi .ts-control div{margin:0 4px 4px 0}.badge a{color:inherit;text-decoration:none}.page-body .card{margin-bottom:1rem}.page-body .card .card-header,.page-body .card .card-body,.page-body .card .card-footer{padding:.75rem}.page-body .card .card-header{background:var(--tblr-bg-surface-tertiary)}.page-body .card .list-group-item{padding:.5rem .75rem}.page-body .card .table,.page-body .card .markdown>table{margin-bottom:0}form.object-edit{margin:auto;max-width:800px}.col-form-label.required{font-weight:700}.col-form-label.required:after{position:absolute;display:inline-block;margin-left:0;font-family:Material Design Icons;font-size:8px;content:"\f06c4"}.has-errors input,.has-errors select,.has-errors textarea{border:1px solid #d63939}.page{background-color:var(--tblr-bg-surface-secondary)}.page-header{background-color:var(--tblr-bg-surface);min-height:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item a{color:inherit}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item .btn-group{visibility:hidden}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:hover{background-color:#3a4859}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:hover a{text-decoration:none}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:hover .btn-group{visibility:visible}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active{background-color:#3a4859}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active a{color:#fff}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active .btn-group{visibility:visible}.progress{height:20px}.progress .progress-label{display:flex;flex-direction:column;justify-content:center;padding-left:.25rem}table.object-list tbody>tr:last-child>td{border-bottom-width:0}table.object-list th.asc>a:after{content:"\f0140";font-family:Material Design Icons}table.object-list th.desc>a:after{content:"\f0143";font-family:Material Design Icons}table.attr-table th{font-weight:400;width:min-content}table.attr-table th,table.attr-table td{border-bottom-style:dashed}table.attr-table tr:last-child{border-bottom-style:hidden}table.attr-table td{overflow-wrap:anywhere}td pre{margin-bottom:0}.page-tabs{border-bottom:1px solid var(--tblr-border-color-translucent)}.page-tabs .nav-tabs{position:relative;border:none}.page-tabs .nav-tabs .nav-link.active,.page-tabs .nav-tabs .nav-link:active,.page-tabs .nav-tabs .nav-link:hover{border-color:var(--tblr-border-color-translucent);border-bottom-color:transparent}.page-tabs .nav-tabs .nav-link.active{color:inherit;background:var(--tblr-bg-surface-secondary);border-bottom-color:transparent}pre.change-data{border-radius:0;padding:0}pre.change-data>span{display:block;padding-right:1rem;padding-left:1rem}pre.change-data>span.added{background-color:#2fb344}pre.change-data>span.removed{background-color:#d63939}pre.change-diff{border-color:transparent}pre.change-diff.change-added{background-color:#2fb344}pre.change-diff.change-removed{background-color:#d63939}pre.block{padding:1rem;border:1px solid #dadfe5;border-radius:4px}tr[data-cable-status=connected]{background-color:#2fb34426}tr[data-cable-status=planned]{background-color:#0054a626}tr[data-cable-status=decommissioning]{background-color:#f59f0026}tr[data-mark-connected=true]{background-color:#2fb34426}tr[data-virtual=true]{background-color:#0054a626}tr[data-enabled=disabled]{background-color:#d6393926}tr[data-cable-status=connected] button.mark-installed{display:none}tr:not([data-cable-status=connected]) button.mark-planned{display:none}.rendered-markdown table{width:100%}.rendered-markdown table th{border-bottom:2px solid #dddddd;padding:8px}.rendered-markdown table td{border-top:1px solid #dddddd;padding:8px}.rendered-markdown table th[align=left]{text-align:left}.rendered-markdown table th[align=center]{text-align:center}.rendered-markdown table th[align=right]{text-align:right}td>.rendered-markdown{max-height:200px;overflow-y:scroll}td>.rendered-markdown p:last-of-type{margin-bottom:0}.markdown-widget .preview{border:1px solid #dadfe5;border-radius:4px;min-height:200px}span.color-label{display:inline-block;width:5rem;height:1rem;padding:.25em .5em;border:1px solid #303030;border-radius:4px}.record-depth{display:inline;user-select:none;opacity:33%}.record-depth span:only-of-type,.record-depth span:last-of-type{margin-right:.25rem}.hide-last-child :last-child{visibility:hidden;opacity:0} +@charset "UTF-8";:root,[data-bs-theme=light]{--tblr-black: #000000;--tblr-white: #ffffff;--tblr-gray: #667382;--tblr-gray-dark: #182433;--tblr-gray-100: #f6f8fb;--tblr-gray-200: #eef1f4;--tblr-gray-300: #dadfe5;--tblr-gray-400: #bbc3cd;--tblr-gray-500: #929dab;--tblr-gray-600: #667382;--tblr-gray-700: #3a4859;--tblr-gray-800: #182433;--tblr-gray-900: #040a11;--tblr-primary: #00857D;--tblr-secondary: #667382;--tblr-success: #2fb344;--tblr-info: #4299e1;--tblr-warning: #f76707;--tblr-danger: #d63939;--tblr-light: #fcfdfe;--tblr-dark: #182433;--tblr-muted: #667382;--tblr-blue: #0054a6;--tblr-azure: #4299e1;--tblr-indigo: #4263eb;--tblr-purple: #ae3ec9;--tblr-pink: #d6336c;--tblr-red: #d63939;--tblr-orange: #f76707;--tblr-yellow: #f59f00;--tblr-lime: #74b816;--tblr-green: #2fb344;--tblr-teal: #0ca678;--tblr-cyan: #17a2b8;--tblr-facebook: #1877f2;--tblr-twitter: #1da1f2;--tblr-linkedin: #0a66c2;--tblr-google: #dc4e41;--tblr-youtube: #ff0000;--tblr-vimeo: #1ab7ea;--tblr-dribbble: #ea4c89;--tblr-github: #181717;--tblr-instagram: #e4405f;--tblr-pinterest: #bd081c;--tblr-vk: #6383a8;--tblr-rss: #ffa500;--tblr-flickr: #0063dc;--tblr-bitbucket: #0052cc;--tblr-tabler: #0054a6;--tblr-primary-rgb: 0, 133, 125;--tblr-secondary-rgb: 102, 115, 130;--tblr-success-rgb: 47, 179, 68;--tblr-info-rgb: 66, 153, 225;--tblr-warning-rgb: 247, 103, 7;--tblr-danger-rgb: 214, 57, 57;--tblr-light-rgb: 252, 253, 254;--tblr-dark-rgb: 24, 36, 51;--tblr-muted-rgb: 102, 115, 130;--tblr-blue-rgb: 0, 84, 166;--tblr-azure-rgb: 66, 153, 225;--tblr-indigo-rgb: 66, 99, 235;--tblr-purple-rgb: 174, 62, 201;--tblr-pink-rgb: 214, 51, 108;--tblr-red-rgb: 214, 57, 57;--tblr-orange-rgb: 247, 103, 7;--tblr-yellow-rgb: 245, 159, 0;--tblr-lime-rgb: 116, 184, 22;--tblr-green-rgb: 47, 179, 68;--tblr-teal-rgb: 12, 166, 120;--tblr-cyan-rgb: 23, 162, 184;--tblr-facebook-rgb: 24, 119, 242;--tblr-twitter-rgb: 29, 161, 242;--tblr-linkedin-rgb: 10, 102, 194;--tblr-google-rgb: 220, 78, 65;--tblr-youtube-rgb: 255, 0, 0;--tblr-vimeo-rgb: 26, 183, 234;--tblr-dribbble-rgb: 234, 76, 137;--tblr-github-rgb: 24, 23, 23;--tblr-instagram-rgb: 228, 64, 95;--tblr-pinterest-rgb: 189, 8, 28;--tblr-vk-rgb: 99, 131, 168;--tblr-rss-rgb: 255, 165, 0;--tblr-flickr-rgb: 0, 99, 220;--tblr-bitbucket-rgb: 0, 82, 204;--tblr-tabler-rgb: 0, 84, 166;--tblr-primary-text-emphasis: #003532;--tblr-secondary-text-emphasis: #292e34;--tblr-success-text-emphasis: #13481b;--tblr-info-text-emphasis: #1a3d5a;--tblr-warning-text-emphasis: #632903;--tblr-danger-text-emphasis: #561717;--tblr-light-text-emphasis: #3a4859;--tblr-dark-text-emphasis: #3a4859;--tblr-primary-bg-subtle: #cce7e5;--tblr-secondary-bg-subtle: #e0e3e6;--tblr-success-bg-subtle: #d5f0da;--tblr-info-bg-subtle: #d9ebf9;--tblr-warning-bg-subtle: #fde1cd;--tblr-danger-bg-subtle: #f7d7d7;--tblr-light-bg-subtle: #fbfcfd;--tblr-dark-bg-subtle: #bbc3cd;--tblr-primary-border-subtle: #99cecb;--tblr-secondary-border-subtle: #c2c7cd;--tblr-success-border-subtle: #ace1b4;--tblr-info-border-subtle: #b3d6f3;--tblr-warning-border-subtle: #fcc29c;--tblr-danger-border-subtle: #efb0b0;--tblr-light-border-subtle: #eef1f4;--tblr-dark-border-subtle: #929dab;--tblr-white-rgb: 255, 255, 255;--tblr-black-rgb: 0, 0, 0;--tblr-font-sans-serif: "Plus Jakarta Sans Variable", system-ui, sans-serif;--tblr-font-monospace: Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace;--tblr-gradient: linear-gradient(180deg, rgba(255, 255, 255, .15), rgba(255, 255, 255, 0));--tblr-body-font-family: var(--tblr-font-sans-serif);--tblr-body-font-size: .875rem;--tblr-body-font-weight: 500;--tblr-body-line-height: 1.4285714286;--tblr-body-color: #182433;--tblr-body-color-rgb: 24, 36, 51;--tblr-body-bg: #f6f8fb;--tblr-body-bg-rgb: 246, 248, 251;--tblr-emphasis-color: #182433;--tblr-emphasis-color-rgb: 24, 36, 51;--tblr-secondary-color: rgba(24, 36, 51, .75);--tblr-secondary-color-rgb: 24, 36, 51;--tblr-secondary-bg: #eef1f4;--tblr-secondary-bg-rgb: 238, 241, 244;--tblr-tertiary-color: rgba(24, 36, 51, .5);--tblr-tertiary-color-rgb: 24, 36, 51;--tblr-tertiary-bg: #f6f8fb;--tblr-tertiary-bg-rgb: 246, 248, 251;--tblr-heading-color: inherit;--tblr-link-color: #00857D;--tblr-link-color-rgb: 0, 133, 125;--tblr-link-decoration: none;--tblr-link-hover-color: #006a64;--tblr-link-hover-color-rgb: 0, 106, 100;--tblr-link-hover-decoration: underline;--tblr-code-color: var(--tblr-gray-600);--tblr-highlight-color: #182433;--tblr-highlight-bg: #fdeccc;--tblr-border-width: 1px;--tblr-border-style: solid;--tblr-border-color: #dadfe5;--tblr-border-color-translucent: rgba(4, 32, 69, .14);--tblr-border-radius: 4px;--tblr-border-radius-sm: 2px;--tblr-border-radius-lg: 8px;--tblr-border-radius-xl: 1rem;--tblr-border-radius-xxl: 2rem;--tblr-border-radius-2xl: var(--tblr-border-radius-xxl);--tblr-border-radius-pill: 100rem;--tblr-box-shadow: rgba(var(--tblr-body-color-rgb), .04) 0 2px 4px 0;--tblr-box-shadow-sm: 0 .125rem .25rem rgba(0, 0, 0, .075);--tblr-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, .175);--tblr-box-shadow-inset: 0 0 transparent;--tblr-focus-ring-width: .25rem;--tblr-focus-ring-opacity: .25;--tblr-focus-ring-color: rgba(var(--tblr-primary-rgb), .25);--tblr-form-valid-color: #2fb344;--tblr-form-valid-border-color: #2fb344;--tblr-form-invalid-color: #d63939;--tblr-form-invalid-border-color: #d63939}[data-bs-theme=dark],body[data-bs-theme=dark] [data-bs-theme=light]{color-scheme:dark;--tblr-body-color: #fcfdfe;--tblr-body-color-rgb: 252, 253, 254;--tblr-body-bg: #040a11;--tblr-body-bg-rgb: 4, 10, 17;--tblr-emphasis-color: #ffffff;--tblr-emphasis-color-rgb: 255, 255, 255;--tblr-secondary-color: rgba(252, 253, 254, .75);--tblr-secondary-color-rgb: 252, 253, 254;--tblr-secondary-bg: #182433;--tblr-secondary-bg-rgb: 24, 36, 51;--tblr-tertiary-color: rgba(252, 253, 254, .5);--tblr-tertiary-color-rgb: 252, 253, 254;--tblr-tertiary-bg: #0e1722;--tblr-tertiary-bg-rgb: 14, 23, 34;--tblr-primary-text-emphasis: #66b6b1;--tblr-secondary-text-emphasis: #a3abb4;--tblr-success-text-emphasis: #82d18f;--tblr-info-text-emphasis: #8ec2ed;--tblr-warning-text-emphasis: #faa46a;--tblr-danger-text-emphasis: #e68888;--tblr-light-text-emphasis: #f6f8fb;--tblr-dark-text-emphasis: #dadfe5;--tblr-primary-bg-subtle: #001b19;--tblr-secondary-bg-subtle: #14171a;--tblr-success-bg-subtle: #09240e;--tblr-info-bg-subtle: #0d1f2d;--tblr-warning-bg-subtle: #311501;--tblr-danger-bg-subtle: #2b0b0b;--tblr-light-bg-subtle: #182433;--tblr-dark-bg-subtle: #0c121a;--tblr-primary-border-subtle: #00504b;--tblr-secondary-border-subtle: #3d454e;--tblr-success-border-subtle: #1c6b29;--tblr-info-border-subtle: #285c87;--tblr-warning-border-subtle: #943e04;--tblr-danger-border-subtle: #802222;--tblr-light-border-subtle: #3a4859;--tblr-dark-border-subtle: #182433;--tblr-heading-color: inherit;--tblr-link-color: #66b6b1;--tblr-link-hover-color: #85c5c1;--tblr-link-color-rgb: 102, 182, 177;--tblr-link-hover-color-rgb: 133, 197, 193;--tblr-code-color: var(--tblr-gray-300);--tblr-highlight-color: #fcfdfe;--tblr-highlight-bg: #624000;--tblr-border-color: #1f2e41;--tblr-border-color-translucent: rgba(72, 110, 149, .14);--tblr-form-valid-color: #82d18f;--tblr-form-valid-border-color: #82d18f;--tblr-form-invalid-color: #e68888;--tblr-form-invalid-border-color: #e68888}*,*:before,*:after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--tblr-body-font-family);font-size:var(--tblr-body-font-size);font-weight:var(--tblr-body-font-weight);line-height:var(--tblr-body-line-height);color:var(--tblr-body-color);text-align:var(--tblr-body-text-align);background-color:var(--tblr-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr,.hr{margin:2rem 0;color:inherit;border:0;border-top:var(--tblr-border-width) solid;opacity:.16}h6,.h6,h5,.h5,h4,.h4,h3,.field-group h2,.field-group .h2,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:var(--tblr-spacer);font-weight:var(--tblr-font-weight-bold);line-height:1.2;color:var(--tblr-heading-color)}h1,.h1{font-size:1.5rem}h2,.h2{font-size:1.25rem}h3,.field-group h2,.field-group .h2,.h3{font-size:1rem}h4,.h4{font-size:.875rem}h5,.h5{font-size:.75rem}h6,.h6{font-size:.625rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:600}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:85.714285%}mark,.mark{padding:.1875em;color:var(--tblr-highlight-color);background-color:var(--tblr-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--tblr-link-color-rgb),var(--tblr-link-opacity, 1));text-decoration:none}a:hover{--tblr-link-color-rgb: var(--tblr-link-hover-color-rgb);text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--tblr-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:85.714285%;color:var(--tblr-light)}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:85.714285%;color:var(--tblr-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.25rem .5rem;font-size:var(--tblr-font-size-h5);color:var(--tblr-text-secondary-dark);background-color:var(--tblr-code-bg);border-radius:2px}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--tblr-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:.875rem;font-weight:var(--tblr-font-weight-normal)}.display-1{font-size:5rem;font-weight:300;line-height:1.2}.display-2{font-size:4.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}.display-5{font-size:3rem;font-weight:300;line-height:1.2}.display-6{font-size:2rem;font-weight:300;line-height:1.2}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:85.714285%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:.875rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:85.714285%;color:#667382}.blockquote-footer:before{content:"\2014\a0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--tblr-body-bg);border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-box-shadow-sm);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:85.714285%;color:var(--tblr-secondary-color)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width: 576px){.container-sm,.container{max-width:540px}}@media (min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media (min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media (min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media (min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--tblr-breakpoint-xs: 0;--tblr-breakpoint-sm: 576px;--tblr-breakpoint-md: 768px;--tblr-breakpoint-lg: 992px;--tblr-breakpoint-xl: 1200px;--tblr-breakpoint-xxl: 1400px}.row{--tblr-gutter-x: var(--tblr-page-padding);--tblr-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--tblr-gutter-y));margin-right:calc(-.5 * var(--tblr-gutter-x));margin-left:calc(-.5 * var(--tblr-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-top:var(--tblr-gutter-y)}.grid{display:grid;grid-template-rows:repeat(var(--tblr-rows, 1),1fr);grid-template-columns:repeat(var(--tblr-columns, 12),1fr);gap:var(--tblr-gap, var(--tblr-page-padding))}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media (min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media (min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media (min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media (min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media (min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--tblr-gutter-x: 0}.g-0,.gy-0{--tblr-gutter-y: 0}.g-1,.gx-1{--tblr-gutter-x: .25rem}.g-1,.gy-1{--tblr-gutter-y: .25rem}.g-2,.gx-2{--tblr-gutter-x: .5rem}.g-2,.gy-2{--tblr-gutter-y: .5rem}.g-3,.gx-3{--tblr-gutter-x: 1rem}.g-3,.gy-3{--tblr-gutter-y: 1rem}.g-4,.gx-4{--tblr-gutter-x: 1.5rem}.g-4,.gy-4{--tblr-gutter-y: 1.5rem}.g-5,.gx-5{--tblr-gutter-x: 2rem}.g-5,.gy-5{--tblr-gutter-y: 2rem}.g-6,.gx-6{--tblr-gutter-x: 3rem}.g-6,.gy-6{--tblr-gutter-y: 3rem}.g-7,.gx-7{--tblr-gutter-x: 5rem}.g-7,.gy-7{--tblr-gutter-y: 5rem}.g-8,.gx-8{--tblr-gutter-x: 8rem}.g-8,.gy-8{--tblr-gutter-y: 8rem}@media (min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--tblr-gutter-x: 0}.g-sm-0,.gy-sm-0{--tblr-gutter-y: 0}.g-sm-1,.gx-sm-1{--tblr-gutter-x: .25rem}.g-sm-1,.gy-sm-1{--tblr-gutter-y: .25rem}.g-sm-2,.gx-sm-2{--tblr-gutter-x: .5rem}.g-sm-2,.gy-sm-2{--tblr-gutter-y: .5rem}.g-sm-3,.gx-sm-3{--tblr-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--tblr-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--tblr-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--tblr-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--tblr-gutter-x: 2rem}.g-sm-5,.gy-sm-5{--tblr-gutter-y: 2rem}.g-sm-6,.gx-sm-6{--tblr-gutter-x: 3rem}.g-sm-6,.gy-sm-6{--tblr-gutter-y: 3rem}.g-sm-7,.gx-sm-7{--tblr-gutter-x: 5rem}.g-sm-7,.gy-sm-7{--tblr-gutter-y: 5rem}.g-sm-8,.gx-sm-8{--tblr-gutter-x: 8rem}.g-sm-8,.gy-sm-8{--tblr-gutter-y: 8rem}}@media (min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--tblr-gutter-x: 0}.g-md-0,.gy-md-0{--tblr-gutter-y: 0}.g-md-1,.gx-md-1{--tblr-gutter-x: .25rem}.g-md-1,.gy-md-1{--tblr-gutter-y: .25rem}.g-md-2,.gx-md-2{--tblr-gutter-x: .5rem}.g-md-2,.gy-md-2{--tblr-gutter-y: .5rem}.g-md-3,.gx-md-3{--tblr-gutter-x: 1rem}.g-md-3,.gy-md-3{--tblr-gutter-y: 1rem}.g-md-4,.gx-md-4{--tblr-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--tblr-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--tblr-gutter-x: 2rem}.g-md-5,.gy-md-5{--tblr-gutter-y: 2rem}.g-md-6,.gx-md-6{--tblr-gutter-x: 3rem}.g-md-6,.gy-md-6{--tblr-gutter-y: 3rem}.g-md-7,.gx-md-7{--tblr-gutter-x: 5rem}.g-md-7,.gy-md-7{--tblr-gutter-y: 5rem}.g-md-8,.gx-md-8{--tblr-gutter-x: 8rem}.g-md-8,.gy-md-8{--tblr-gutter-y: 8rem}}@media (min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--tblr-gutter-x: 0}.g-lg-0,.gy-lg-0{--tblr-gutter-y: 0}.g-lg-1,.gx-lg-1{--tblr-gutter-x: .25rem}.g-lg-1,.gy-lg-1{--tblr-gutter-y: .25rem}.g-lg-2,.gx-lg-2{--tblr-gutter-x: .5rem}.g-lg-2,.gy-lg-2{--tblr-gutter-y: .5rem}.g-lg-3,.gx-lg-3{--tblr-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--tblr-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--tblr-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--tblr-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--tblr-gutter-x: 2rem}.g-lg-5,.gy-lg-5{--tblr-gutter-y: 2rem}.g-lg-6,.gx-lg-6{--tblr-gutter-x: 3rem}.g-lg-6,.gy-lg-6{--tblr-gutter-y: 3rem}.g-lg-7,.gx-lg-7{--tblr-gutter-x: 5rem}.g-lg-7,.gy-lg-7{--tblr-gutter-y: 5rem}.g-lg-8,.gx-lg-8{--tblr-gutter-x: 8rem}.g-lg-8,.gy-lg-8{--tblr-gutter-y: 8rem}}@media (min-width: 1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--tblr-gutter-x: 0}.g-xl-0,.gy-xl-0{--tblr-gutter-y: 0}.g-xl-1,.gx-xl-1{--tblr-gutter-x: .25rem}.g-xl-1,.gy-xl-1{--tblr-gutter-y: .25rem}.g-xl-2,.gx-xl-2{--tblr-gutter-x: .5rem}.g-xl-2,.gy-xl-2{--tblr-gutter-y: .5rem}.g-xl-3,.gx-xl-3{--tblr-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--tblr-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--tblr-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--tblr-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--tblr-gutter-x: 2rem}.g-xl-5,.gy-xl-5{--tblr-gutter-y: 2rem}.g-xl-6,.gx-xl-6{--tblr-gutter-x: 3rem}.g-xl-6,.gy-xl-6{--tblr-gutter-y: 3rem}.g-xl-7,.gx-xl-7{--tblr-gutter-x: 5rem}.g-xl-7,.gy-xl-7{--tblr-gutter-y: 5rem}.g-xl-8,.gx-xl-8{--tblr-gutter-x: 8rem}.g-xl-8,.gy-xl-8{--tblr-gutter-y: 8rem}}@media (min-width: 1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--tblr-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--tblr-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--tblr-gutter-x: .25rem}.g-xxl-1,.gy-xxl-1{--tblr-gutter-y: .25rem}.g-xxl-2,.gx-xxl-2{--tblr-gutter-x: .5rem}.g-xxl-2,.gy-xxl-2{--tblr-gutter-y: .5rem}.g-xxl-3,.gx-xxl-3{--tblr-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--tblr-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--tblr-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--tblr-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--tblr-gutter-x: 2rem}.g-xxl-5,.gy-xxl-5{--tblr-gutter-y: 2rem}.g-xxl-6,.gx-xxl-6{--tblr-gutter-x: 3rem}.g-xxl-6,.gy-xxl-6{--tblr-gutter-y: 3rem}.g-xxl-7,.gx-xxl-7{--tblr-gutter-x: 5rem}.g-xxl-7,.gy-xxl-7{--tblr-gutter-y: 5rem}.g-xxl-8,.gx-xxl-8{--tblr-gutter-x: 8rem}.g-xxl-8,.gy-xxl-8{--tblr-gutter-y: 8rem}}.table,.markdown>table{--tblr-table-color-type: initial;--tblr-table-bg-type: initial;--tblr-table-color-state: initial;--tblr-table-bg-state: initial;--tblr-table-color: inherit;--tblr-table-bg: transparent;--tblr-table-border-color: var(--tblr-border-color-translucent);--tblr-table-accent-bg: transparent;--tblr-table-striped-color: inherit;--tblr-table-striped-bg: var(--tblr-bg-surface-tertiary);--tblr-table-active-color: inherit;--tblr-table-active-bg: rgba(var(--tblr-emphasis-color-rgb), .1);--tblr-table-hover-color: inherit;--tblr-table-hover-bg: rgba(var(--tblr-emphasis-color-rgb), .075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--tblr-table-border-color)}.table>:not(caption)>*>*,.markdown>table>:not(caption)>*>*{padding:.5rem;color:var(--tblr-table-color-state, var(--tblr-table-color-type, var(--tblr-table-color)));background-color:var(--tblr-table-bg);border-bottom-width:var(--tblr-border-width);box-shadow:inset 0 0 0 9999px var(--tblr-table-bg-state, var(--tblr-table-bg-type, var(--tblr-table-accent-bg)))}.table>tbody,.markdown>table>tbody{vertical-align:inherit}.table>thead,.markdown>table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--tblr-border-width) * 2) solid var(--tblr-border-color-translucent)}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*,.markdown>table>:not(caption)>*{border-width:var(--tblr-border-width) 0}.table-bordered>:not(caption)>*>*,.markdown>table>:not(caption)>*>*{border-width:0 var(--tblr-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(2n)>*{--tblr-table-color-type: var(--tblr-table-striped-color);--tblr-table-bg-type: var(--tblr-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--tblr-table-color-type: var(--tblr-table-striped-color);--tblr-table-bg-type: var(--tblr-table-striped-bg)}.table-active{--tblr-table-color-state: var(--tblr-table-active-color);--tblr-table-bg-state: var(--tblr-table-active-bg)}.table-hover>tbody>tr:hover>*{--tblr-table-color-state: var(--tblr-table-hover-color);--tblr-table-bg-state: var(--tblr-table-hover-bg)}.table-primary{--tblr-table-color: #182433;--tblr-table-bg: #cce7e5;--tblr-table-border-color: #a8c0c1;--tblr-table-striped-bg: #c3dddc;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #bad4d3;--tblr-table-active-color: #fcfdfe;--tblr-table-hover-bg: #bfd8d8;--tblr-table-hover-color: #182433;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-secondary{--tblr-table-color: #182433;--tblr-table-bg: #e0e3e6;--tblr-table-border-color: #b8bdc2;--tblr-table-striped-bg: #d6d9dd;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #ccd0d4;--tblr-table-active-color: #fcfdfe;--tblr-table-hover-bg: #d1d5d9;--tblr-table-hover-color: #182433;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-success{--tblr-table-color: #182433;--tblr-table-bg: #d5f0da;--tblr-table-border-color: #afc7b9;--tblr-table-striped-bg: #cce6d2;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #c2dcc9;--tblr-table-active-color: #182433;--tblr-table-hover-bg: #c7e1cd;--tblr-table-hover-color: #182433;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-info{--tblr-table-color: #182433;--tblr-table-bg: #d9ebf9;--tblr-table-border-color: #b2c3d1;--tblr-table-striped-bg: #cfe1ef;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #c6d7e5;--tblr-table-active-color: #182433;--tblr-table-hover-bg: #cbdcea;--tblr-table-hover-color: #182433;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-warning{--tblr-table-color: #182433;--tblr-table-bg: #fde1cd;--tblr-table-border-color: #cfbbae;--tblr-table-striped-bg: #f2d8c5;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #e6cebe;--tblr-table-active-color: #182433;--tblr-table-hover-bg: #ecd3c1;--tblr-table-hover-color: #182433;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-danger{--tblr-table-color: #182433;--tblr-table-bg: #f7d7d7;--tblr-table-border-color: #cab3b6;--tblr-table-striped-bg: #eccecf;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #e1c5c7;--tblr-table-active-color: #fcfdfe;--tblr-table-hover-bg: #e6cacb;--tblr-table-hover-color: #fcfdfe;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-light{--tblr-table-color: #182433;--tblr-table-bg: #fcfdfe;--tblr-table-border-color: #ced2d5;--tblr-table-striped-bg: #f1f2f4;--tblr-table-striped-color: #182433;--tblr-table-active-bg: #e5e7ea;--tblr-table-active-color: #182433;--tblr-table-hover-bg: #ebedef;--tblr-table-hover-color: #182433;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-dark{--tblr-table-color: #fcfdfe;--tblr-table-bg: #182433;--tblr-table-border-color: #464f5c;--tblr-table-striped-bg: #232f3d;--tblr-table-striped-color: #fcfdfe;--tblr-table-active-bg: #2f3a47;--tblr-table-active-color: #fcfdfe;--tblr-table-hover-bg: #293442;--tblr-table-hover-color: #fcfdfe;color:var(--tblr-table-color);border-color:var(--tblr-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem;font-size:.875rem;font-weight:var(--tblr-font-weight-medium)}.col-form-label{padding-top:calc(.5625rem + var(--tblr-border-width));padding-bottom:calc(.5625rem + var(--tblr-border-width));margin-bottom:0;font-size:inherit;font-weight:var(--tblr-font-weight-medium);line-height:1.4285714286}.col-form-label-lg{padding-top:calc(.5rem + var(--tblr-border-width));padding-bottom:calc(.5rem + var(--tblr-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.125rem + var(--tblr-border-width));padding-bottom:calc(.125rem + var(--tblr-border-width));font-size:.75rem}.form-text{margin-top:.25rem;font-size:85.714285%;color:var(--tblr-secondary-color)}.form-control{display:block;width:100%;padding:.5625rem .75rem;font-family:var(--tblr-font-sans-serif);font-size:.875rem;font-weight:500;line-height:1.4285714286;color:var(--tblr-body-color);appearance:none;background-color:var(--tblr-bg-forms);background-clip:padding-box;border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-box-shadow-input);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--tblr-body-color);background-color:var(--tblr-bg-forms);border-color:#80c2be;outline:0;box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.4285714286em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:#929dab;opacity:1}.form-control:disabled{background-color:var(--tblr-bg-surface-secondary);opacity:1}.form-control::file-selector-button{padding:.5625rem .75rem;margin:-.5625rem -.75rem;margin-inline-end:.75rem;color:var(--tblr-body-color);background-color:var(--tblr-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--tblr-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--tblr-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.5625rem 0;margin-bottom:0;line-height:1.4285714286;color:var(--tblr-body-color);background-color:transparent;border:solid transparent;border-width:var(--tblr-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.4285714286em + .25rem + calc(var(--tblr-border-width) * 2));padding:.125rem .25rem;font-size:.75rem;border-radius:var(--tblr-border-radius-sm)}.form-control-sm::file-selector-button{padding:.125rem .25rem;margin:-.125rem -.25rem;margin-inline-end:.25rem}.form-control-lg{min-height:calc(1.4285714286em + 1rem + calc(var(--tblr-border-width) * 2));padding:.5rem .75rem;font-size:1.25rem;border-radius:var(--tblr-border-radius-lg)}.form-control-lg::file-selector-button{padding:.5rem .75rem;margin:-.5rem -.75rem;margin-inline-end:.75rem}textarea.form-control{min-height:calc(1.4285714286em + 1.125rem + calc(var(--tblr-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.4285714286em + .25rem + calc(var(--tblr-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.4285714286em + 1rem + calc(var(--tblr-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.4285714286em + 1.125rem + calc(var(--tblr-border-width) * 2));padding:.5625rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--tblr-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--tblr-border-radius)}.form-control-color.form-control-sm{height:calc(1.4285714286em + .25rem + calc(var(--tblr-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.4285714286em + 1rem + calc(var(--tblr-border-width) * 2))}.form-select{--tblr-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23929dab' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.5625rem 2.25rem .5625rem .75rem;font-family:var(--tblr-font-sans-serif);font-size:.875rem;font-weight:500;line-height:1.4285714286;color:var(--tblr-body-color);appearance:none;background-color:var(--tblr-bg-forms);background-image:var(--tblr-form-select-bg-img),var(--tblr-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-box-shadow-input);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#80c2be;outline:0;box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--tblr-bg-surface-secondary)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--tblr-body-color)}.form-select-sm{padding-top:.125rem;padding-bottom:.125rem;padding-left:.25rem;font-size:.75rem;border-radius:var(--tblr-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:.75rem;font-size:1.25rem;border-radius:var(--tblr-border-radius-lg)}[data-bs-theme=dark] .form-select,body[data-bs-theme=dark] [data-bs-theme=light] .form-select{--tblr-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23fcfdfe' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.25rem;padding-left:2rem;margin-bottom:.75rem}.form-check .form-check-input{float:left;margin-left:-2rem}.form-check-reverse{padding-right:2rem;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-2rem;margin-left:0}.form-check-input{--tblr-form-check-bg: var(--tblr-bg-forms);flex-shrink:0;width:1.25rem;height:1.25rem;margin-top:.0892857143rem;vertical-align:top;appearance:none;background-color:var(--tblr-form-check-bg);background-image:var(--tblr-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:var(--tblr-border-radius)}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#80c2be;outline:0;box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-check-input:checked{background-color:var(--tblr-primary);border-color:var(--tblr-border-color-translucent)}.form-check-input:checked[type=checkbox]{--tblr-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--tblr-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:var(--tblr-primary);border-color:var(--tblr-primary);--tblr-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{cursor:default;opacity:.7}.form-switch{padding-left:2.5rem}.form-switch .form-check-input{--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23dadfe5'/%3e%3c/svg%3e");width:2rem;margin-left:-2.5rem;background-image:var(--tblr-form-switch-bg);background-position:left center;border-radius:2rem;transition:background-position .15s ease-in-out}.form-switch .form-check-input:focus{--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2380c2be'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5rem;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5rem;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.4}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--tblr-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.25rem;padding:0;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #f6f8fb,0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #f6f8fb,0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.375rem;appearance:none;background-color:var(--tblr-primary);border:2px var(--tblr-border-style) #ffffff;border-radius:1rem;box-shadow:0 .1rem .25rem #0000001a;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b3dad8}.form-range::-webkit-slider-runnable-track{width:100%;height:.25rem;color:transparent;cursor:pointer;background-color:var(--tblr-border-color);border-color:transparent;border-radius:1rem;box-shadow:var(--tblr-box-shadow-inset)}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;background-color:var(--tblr-primary);border:2px var(--tblr-border-style) #ffffff;border-radius:1rem;box-shadow:0 .1rem .25rem #0000001a;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b3dad8}.form-range::-moz-range-track{width:100%;height:.25rem;color:transparent;cursor:pointer;background-color:var(--tblr-border-color);border-color:transparent;border-radius:1rem;box-shadow:var(--tblr-box-shadow-inset)}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--tblr-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--tblr-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--tblr-border-width) * 2));min-height:calc(3.5rem + calc(var(--tblr-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--tblr-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--tblr-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control:focus~label:after,.form-floating>.form-control:not(:placeholder-shown)~label:after,.form-floating>.form-control-plaintext~label:after,.form-floating>.form-select~label:after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:var(--tblr-bg-forms);border-radius:var(--tblr-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--tblr-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translate(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--tblr-border-width) 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#667382}.form-floating>:disabled~label:after,.form-floating>.form-control:disabled~label:after{background-color:var(--tblr-bg-surface-secondary)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.5625rem .75rem;font-size:.875rem;font-weight:500;line-height:1.4285714286;color:var(--tblr-secondary);text-align:center;white-space:nowrap;background-color:var(--tblr-bg-surface-secondary);border:var(--tblr-border-width) solid var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem .75rem;font-size:1.25rem;border-radius:var(--tblr-border-radius-lg)}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.125rem .25rem;font-size:.75rem;border-radius:var(--tblr-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--tblr-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:85.714285%;color:var(--tblr-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:var(--tblr-spacer-2) var(--tblr-spacer-2);margin-top:.1rem;font-size:.765625rem;color:#fff;background-color:var(--tblr-success);border-radius:var(--tblr-border-radius)}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:var(--tblr-form-valid-border-color);padding-right:calc(1.4285714286em + 1.125rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.3571428572em + .28125rem) center;background-size:calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:var(--tblr-form-valid-border-color);box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.4285714286em + 1.125rem);background-position:top calc(.3571428572em + .28125rem) right calc(.3571428572em + .28125rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:var(--tblr-form-valid-border-color)}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--tblr-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:var(--tblr-form-valid-border-color);box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-success-rgb),.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.4285714286em + 1.125rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:var(--tblr-form-valid-border-color)}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:var(--tblr-form-valid-color)}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(var(--tblr-success-rgb),.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:var(--tblr-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:85.714285%;color:var(--tblr-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:var(--tblr-spacer-2) var(--tblr-spacer-2);margin-top:.1rem;font-size:.765625rem;color:#fff;background-color:var(--tblr-danger);border-radius:var(--tblr-border-radius)}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:var(--tblr-form-invalid-border-color);padding-right:calc(1.4285714286em + 1.125rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.3571428572em + .28125rem) center;background-size:calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:var(--tblr-form-invalid-border-color);box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.4285714286em + 1.125rem);background-position:top calc(.3571428572em + .28125rem) right calc(.3571428572em + .28125rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:var(--tblr-form-invalid-border-color)}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--tblr-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:var(--tblr-form-invalid-border-color);box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-danger-rgb),.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.4285714286em + 1.125rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:var(--tblr-form-invalid-border-color)}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:var(--tblr-form-invalid-color)}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--tblr-danger-rgb),.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:var(--tblr-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--tblr-btn-padding-x: .5rem;--tblr-btn-padding-y: .25rem;--tblr-btn-font-family: var(--tblr-font-sans-serif);--tblr-btn-font-size: .875rem;--tblr-btn-font-weight: var(--tblr-font-weight-medium);--tblr-btn-line-height: 1.4285714286;--tblr-btn-color: var(--tblr-body-color);--tblr-btn-bg: transparent;--tblr-btn-border-width: var(--tblr-border-width);--tblr-btn-border-color: transparent;--tblr-btn-border-radius: var(--tblr-border-radius);--tblr-btn-hover-border-color: transparent;--tblr-btn-box-shadow: var(--tblr-box-shadow-input);--tblr-btn-disabled-opacity: .4;--tblr-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--tblr-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--tblr-btn-padding-y) var(--tblr-btn-padding-x);font-family:var(--tblr-btn-font-family);font-size:var(--tblr-btn-font-size);font-weight:var(--tblr-btn-font-weight);line-height:var(--tblr-btn-line-height);color:var(--tblr-btn-color);text-align:center;vertical-align:middle;cursor:pointer;user-select:none;border:var(--tblr-btn-border-width) solid var(--tblr-btn-border-color);border-radius:var(--tblr-btn-border-radius);background-color:var(--tblr-btn-bg);box-shadow:var(--tblr-btn-box-shadow);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--tblr-btn-hover-color);text-decoration:none;background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--tblr-btn-color);background-color:var(--tblr-btn-bg);border-color:var(--tblr-btn-border-color)}.btn:focus-visible{color:var(--tblr-btn-hover-color);background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color);outline:0;box-shadow:var(--tblr-btn-box-shadow),var(--tblr-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--tblr-btn-hover-border-color);outline:0;box-shadow:var(--tblr-btn-box-shadow),var(--tblr-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--tblr-btn-active-color);background-color:var(--tblr-btn-active-bg);border-color:var(--tblr-btn-active-border-color);box-shadow:var(--tblr-btn-active-shadow)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--tblr-btn-active-shadow),var(--tblr-btn-focus-box-shadow)}.btn-check:checked:focus-visible+.btn{box-shadow:var(--tblr-btn-active-shadow),var(--tblr-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--tblr-btn-disabled-color);pointer-events:none;background-color:var(--tblr-btn-disabled-bg);border-color:var(--tblr-btn-disabled-border-color);opacity:var(--tblr-btn-disabled-opacity);box-shadow:none}.btn-link{--tblr-btn-font-weight: 400;--tblr-btn-color: var(--tblr-link-color);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-link-hover-color);--tblr-btn-hover-border-color: transparent;--tblr-btn-active-color: var(--tblr-link-hover-color);--tblr-btn-active-border-color: transparent;--tblr-btn-disabled-color: #667382;--tblr-btn-disabled-border-color: transparent;--tblr-btn-box-shadow: 0 0 0 #000;--tblr-btn-focus-shadow-rgb: 38, 151, 144;text-decoration:none}.btn-link:hover,.btn-link:focus-visible{text-decoration:underline}.btn-link:focus-visible{color:var(--tblr-btn-color)}.btn-link:hover{color:var(--tblr-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--tblr-btn-padding-y: .5rem;--tblr-btn-padding-x: .75rem;--tblr-btn-font-size: 1.25rem;--tblr-btn-border-radius: var(--tblr-border-radius-lg)}.btn-sm,.btn-group-sm>.btn{--tblr-btn-padding-y: .125rem;--tblr-btn-padding-x: .25rem;--tblr-btn-font-size: .75rem;--tblr-btn-border-radius: var(--tblr-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-45deg)}.dropdown-menu{--tblr-dropdown-zindex: 1000;--tblr-dropdown-min-width: 11rem;--tblr-dropdown-padding-x: 0;--tblr-dropdown-padding-y: .25rem;--tblr-dropdown-spacer: 1px;--tblr-dropdown-font-size: .875rem;--tblr-dropdown-color: var(--tblr-body-color);--tblr-dropdown-bg: var(--tblr-bg-surface);--tblr-dropdown-border-color: var(--tblr-border-color-translucent);--tblr-dropdown-border-radius: var(--tblr-border-radius);--tblr-dropdown-border-width: var(--tblr-border-width);--tblr-dropdown-inner-border-radius: calc(var(--tblr-border-radius) - var(--tblr-border-width));--tblr-dropdown-divider-bg: var(--tblr-border-color-translucent);--tblr-dropdown-divider-margin-y: var(--tblr-spacer);--tblr-dropdown-box-shadow: var(--tblr-box-shadow-dropdown);--tblr-dropdown-link-color: inherit;--tblr-dropdown-link-hover-color: inherit;--tblr-dropdown-link-hover-bg: rgba(var(--tblr-secondary-rgb), .08);--tblr-dropdown-link-active-color: var(--tblr-primary);--tblr-dropdown-link-active-bg: var(--tblr-active-bg);--tblr-dropdown-link-disabled-color: var(--tblr-tertiary-color);--tblr-dropdown-item-padding-x: .75rem;--tblr-dropdown-item-padding-y: .5rem;--tblr-dropdown-header-color: #667382;--tblr-dropdown-header-padding-x: .75rem;--tblr-dropdown-header-padding-y: .25rem;position:absolute;z-index:var(--tblr-dropdown-zindex);display:none;min-width:var(--tblr-dropdown-min-width);padding:var(--tblr-dropdown-padding-y) var(--tblr-dropdown-padding-x);margin:0;font-size:var(--tblr-dropdown-font-size);color:var(--tblr-dropdown-color);text-align:left;list-style:none;background-color:var(--tblr-dropdown-bg);background-clip:padding-box;border:var(--tblr-dropdown-border-width) solid var(--tblr-dropdown-border-color);border-radius:var(--tblr-dropdown-border-radius);box-shadow:var(--tblr-dropdown-box-shadow)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--tblr-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--tblr-dropdown-spacer)}.dropup .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(135deg)}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--tblr-dropdown-spacer)}.dropend .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-135deg)}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--tblr-dropdown-spacer)}.dropstart .dropdown-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(45deg)}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{height:0;margin:var(--tblr-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--tblr-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--tblr-dropdown-item-padding-y) var(--tblr-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--tblr-dropdown-link-color);text-align:inherit;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--tblr-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--tblr-dropdown-link-hover-color);text-decoration:none;background-color:var(--tblr-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--tblr-dropdown-link-active-color);text-decoration:none;background-color:var(--tblr-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--tblr-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--tblr-dropdown-header-padding-y) var(--tblr-dropdown-header-padding-x);margin-bottom:0;font-size:.765625rem;color:var(--tblr-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--tblr-dropdown-item-padding-y) var(--tblr-dropdown-item-padding-x);color:var(--tblr-dropdown-link-color)}.dropdown-menu-dark{--tblr-dropdown-color: #dadfe5;--tblr-dropdown-bg: #182433;--tblr-dropdown-border-color: var(--tblr-border-color-translucent);--tblr-dropdown-box-shadow: ;--tblr-dropdown-link-color: #dadfe5;--tblr-dropdown-link-hover-color: #ffffff;--tblr-dropdown-divider-bg: var(--tblr-border-color-translucent);--tblr-dropdown-link-hover-bg: rgba(255, 255, 255, .15);--tblr-dropdown-link-active-color: var(--tblr-primary);--tblr-dropdown-link-active-bg: var(--tblr-active-bg);--tblr-dropdown-link-disabled-color: #929dab;--tblr-dropdown-header-color: #929dab}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--tblr-border-radius)}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(var(--tblr-border-width) * -1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.1875rem;padding-left:.1875rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.btn-group.show .dropdown-toggle{box-shadow:inset 0 3px 5px #00000020}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(var(--tblr-border-width) * -1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--tblr-nav-link-padding-x: .75rem;--tblr-nav-link-padding-y: .5rem;--tblr-nav-link-font-weight: ;--tblr-nav-link-color: var(--tblr-secondary);--tblr-nav-link-hover-color: var(--tblr-link-hover-color);--tblr-nav-link-disabled-color: var(--tblr-disabled-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--tblr-nav-link-padding-y) var(--tblr-nav-link-padding-x);font-size:var(--tblr-nav-link-font-size);font-weight:var(--tblr-nav-link-font-weight);color:var(--tblr-nav-link-color);background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-link:hover,.nav-link:focus{color:var(--tblr-nav-link-hover-color);text-decoration:none}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.nav-link.disabled,.nav-link:disabled{color:var(--tblr-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--tblr-nav-tabs-border-width: var(--tblr-border-width);--tblr-nav-tabs-border-color: var(--tblr-border-color);--tblr-nav-tabs-border-radius: var(--tblr-border-radius);--tblr-nav-tabs-link-hover-border-color: var(--tblr-border-color) var(--tblr-border-color) var(--tblr-border-color);--tblr-nav-tabs-link-active-color: var(--tblr-body-color);--tblr-nav-tabs-link-active-bg: var(--tblr-body-bg);--tblr-nav-tabs-link-active-border-color: var(--tblr-border-color) var(--tblr-border-color) var(--tblr-border-color);border-bottom:var(--tblr-nav-tabs-border-width) solid var(--tblr-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--tblr-nav-tabs-border-width));border:var(--tblr-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--tblr-nav-tabs-border-radius);border-top-right-radius:var(--tblr-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--tblr-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--tblr-nav-tabs-link-active-color);background-color:var(--tblr-nav-tabs-link-active-bg);border-color:var(--tblr-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--tblr-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--tblr-nav-pills-border-radius: var(--tblr-border-radius);--tblr-nav-pills-link-active-color: var(--tblr-primary);--tblr-nav-pills-link-active-bg: rgba(var(--tblr-secondary-rgb), .15)}.nav-pills .nav-link{border-radius:var(--tblr-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--tblr-nav-pills-link-active-color);background-color:var(--tblr-nav-pills-link-active-bg)}.nav-underline{--tblr-nav-underline-gap: 1rem;--tblr-nav-underline-border-width: .125rem;--tblr-nav-underline-link-active-color: var(--tblr-emphasis-color);gap:var(--tblr-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--tblr-nav-underline-border-width) solid transparent}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:600;color:var(--tblr-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--tblr-navbar-padding-x: 0;--tblr-navbar-padding-y: .25rem;--tblr-navbar-color: var(--tblr-body-color);--tblr-navbar-hover-color: rgba(var(--tblr-emphasis-color-rgb), .8);--tblr-navbar-disabled-color: var(--tblr-disabled-color);--tblr-navbar-active-color: var(--tblr-body-color) color;--tblr-navbar-brand-padding-y: .5rem;--tblr-navbar-brand-margin-end: 1rem;--tblr-navbar-brand-font-size: 1.25rem;--tblr-navbar-brand-color: var(--tblr-body-color);--tblr-navbar-brand-hover-color: var(--tblr-body-color) color;--tblr-navbar-nav-link-padding-x: .75rem;--tblr-navbar-toggler-padding-y: 0;--tblr-navbar-toggler-padding-x: 0;--tblr-navbar-toggler-font-size: 1rem;--tblr-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2824, 36, 51, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--tblr-navbar-toggler-border-color: rgba(var(--tblr-emphasis-color-rgb), .15);--tblr-navbar-toggler-border-radius: var(--tblr-border-radius);--tblr-navbar-toggler-focus-width: 0;--tblr-navbar-toggler-transition: box-shadow .15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--tblr-navbar-padding-y) var(--tblr-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--tblr-navbar-brand-padding-y);padding-bottom:var(--tblr-navbar-brand-padding-y);margin-right:var(--tblr-navbar-brand-margin-end);font-size:var(--tblr-navbar-brand-font-size);color:var(--tblr-navbar-brand-color);white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--tblr-navbar-brand-hover-color);text-decoration:none}.navbar-nav{--tblr-nav-link-padding-x: 0;--tblr-nav-link-padding-y: .5rem;--tblr-nav-link-font-weight: ;--tblr-nav-link-color: var(--tblr-navbar-color);--tblr-nav-link-hover-color: var(--tblr-navbar-hover-color);--tblr-nav-link-disabled-color: var(--tblr-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--tblr-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--tblr-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--tblr-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--tblr-navbar-toggler-padding-y) var(--tblr-navbar-toggler-padding-x);font-size:var(--tblr-navbar-toggler-font-size);line-height:1;color:var(--tblr-navbar-color);background-color:transparent;border:var(--tblr-border-width) solid var(--tblr-navbar-toggler-border-color);border-radius:var(--tblr-navbar-toggler-border-radius);transition:var(--tblr-navbar-toggler-transition)}@media (prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--tblr-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--tblr-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--tblr-scroll-height, 75vh);overflow-y:auto}@media (min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--tblr-navbar-nav-link-padding-x);padding-left:var(--tblr-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;box-shadow:none;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark],body[data-bs-theme=dark] .navbar[data-bs-theme=light]{--tblr-navbar-color: rgba(255, 255, 255, .7);--tblr-navbar-hover-color: rgba(255, 255, 255, .75);--tblr-navbar-disabled-color: var(--tblr-disabled-color);--tblr-navbar-active-color: #ffffff;--tblr-navbar-brand-color: #ffffff;--tblr-navbar-brand-hover-color: #ffffff;--tblr-navbar-toggler-border-color: rgba(255, 255, 255, .1);--tblr-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.7%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon,body[data-bs-theme=dark] [data-bs-theme=light] .navbar-toggler-icon{--tblr-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.7%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--tblr-card-spacer-y: 1.25rem;--tblr-card-spacer-x: 1.25rem;--tblr-card-title-spacer-y: 1.25rem;--tblr-card-title-color: ;--tblr-card-subtitle-color: ;--tblr-card-border-width: var(--tblr-border-width);--tblr-card-border-color: var(--tblr-border-color-translucent);--tblr-card-border-radius: var(--tblr-border-radius);--tblr-card-box-shadow: var(--tblr-shadow-card);--tblr-card-inner-border-radius: calc(var(--tblr-border-radius) - (var(--tblr-border-width)));--tblr-card-cap-padding-y: 1.25rem;--tblr-card-cap-padding-x: 1.25rem;--tblr-card-cap-bg: var(--tblr-bg-surface-tertiary);--tblr-card-cap-color: inherit;--tblr-card-height: ;--tblr-card-color: inherit;--tblr-card-bg: var(--tblr-bg-surface);--tblr-card-img-overlay-padding: 1rem;--tblr-card-group-margin: 1.5rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--tblr-card-height);color:var(--tblr-body-color);word-wrap:break-word;background-color:var(--tblr-card-bg);background-clip:border-box;border:var(--tblr-card-border-width) solid var(--tblr-card-border-color);border-radius:var(--tblr-card-border-radius);box-shadow:var(--tblr-card-box-shadow)}.card>hr,.card>.hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--tblr-card-inner-border-radius);border-top-right-radius:var(--tblr-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--tblr-card-inner-border-radius);border-bottom-left-radius:var(--tblr-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--tblr-card-spacer-y) var(--tblr-card-spacer-x);color:var(--tblr-card-color)}.card-title{margin-bottom:var(--tblr-card-title-spacer-y);color:var(--tblr-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--tblr-card-title-spacer-y));margin-bottom:0;color:var(--tblr-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:var(--tblr-card-spacer-x)}.card-header{padding:var(--tblr-card-cap-padding-y) var(--tblr-card-cap-padding-x);margin-bottom:0;color:var(--tblr-card-cap-color);background-color:var(--tblr-card-cap-bg);border-bottom:var(--tblr-card-border-width) solid var(--tblr-card-border-color)}.card-header:first-child{border-radius:var(--tblr-card-inner-border-radius) var(--tblr-card-inner-border-radius) 0 0}.card-footer{padding:var(--tblr-card-cap-padding-y) var(--tblr-card-cap-padding-x);color:var(--tblr-card-cap-color);background-color:var(--tblr-card-cap-bg);border-top:var(--tblr-card-border-width) solid var(--tblr-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--tblr-card-inner-border-radius) var(--tblr-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--tblr-card-cap-padding-x));margin-bottom:calc(-1 * var(--tblr-card-cap-padding-y));margin-left:calc(-.5 * var(--tblr-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--tblr-card-bg);border-bottom-color:var(--tblr-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--tblr-card-cap-padding-x));margin-left:calc(-.5 * var(--tblr-card-cap-padding-x))}.card-img-overlay{position:absolute;inset:0;padding:var(--tblr-card-img-overlay-padding);border-radius:var(--tblr-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--tblr-card-inner-border-radius);border-top-right-radius:var(--tblr-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--tblr-card-inner-border-radius);border-bottom-left-radius:var(--tblr-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--tblr-card-group-margin)}@media (min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--tblr-accordion-color: var(--tblr-body-color);--tblr-accordion-bg: transparent;--tblr-accordion-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, border-radius .15s ease;--tblr-accordion-border-color: var(--tblr-border-color-translucent);--tblr-accordion-border-width: var(--tblr-border-width);--tblr-accordion-border-radius: var(--tblr-border-radius);--tblr-accordion-inner-border-radius: calc(var(--tblr-border-radius) - (var(--tblr-border-width)));--tblr-accordion-btn-padding-x: 1.25rem;--tblr-accordion-btn-padding-y: 1rem;--tblr-accordion-btn-color: var(--tblr-body-color);--tblr-accordion-btn-bg: transparent;--tblr-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23182433' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--tblr-accordion-btn-icon-width: 1rem;--tblr-accordion-btn-icon-transform: rotate(-180deg);--tblr-accordion-btn-icon-transition: transform .2s ease-in-out;--tblr-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23003532' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='M2 5L8 11L14 5'/%3e%3c/svg%3e");--tblr-accordion-btn-focus-box-shadow: 0 0 0 .25rem rgba(var(--tblr-primary-rgb), .25);--tblr-accordion-body-padding-x: 1.25rem;--tblr-accordion-body-padding-y: 1rem;--tblr-accordion-active-color: inherit;--tblr-accordion-active-bg: transparent}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--tblr-accordion-btn-padding-y) var(--tblr-accordion-btn-padding-x);font-size:.875rem;color:var(--tblr-accordion-btn-color);text-align:left;background-color:var(--tblr-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--tblr-accordion-transition)}@media (prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--tblr-accordion-active-color);background-color:var(--tblr-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--tblr-accordion-border-width)) 0 var(--tblr-accordion-border-color)}.accordion-button:not(.collapsed):after{background-image:var(--tblr-accordion-btn-active-icon);transform:var(--tblr-accordion-btn-icon-transform)}.accordion-button:after{flex-shrink:0;width:var(--tblr-accordion-btn-icon-width);height:var(--tblr-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--tblr-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--tblr-accordion-btn-icon-width);transition:var(--tblr-accordion-btn-icon-transition)}@media (prefers-reduced-motion: reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;outline:0;box-shadow:var(--tblr-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--tblr-accordion-color);background-color:var(--tblr-accordion-bg);border:var(--tblr-accordion-border-width) solid var(--tblr-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--tblr-accordion-border-radius);border-top-right-radius:var(--tblr-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--tblr-accordion-inner-border-radius);border-top-right-radius:var(--tblr-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--tblr-accordion-border-radius);border-bottom-left-radius:var(--tblr-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--tblr-accordion-inner-border-radius);border-bottom-left-radius:var(--tblr-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--tblr-accordion-border-radius);border-bottom-left-radius:var(--tblr-accordion-border-radius)}.accordion-body{padding:var(--tblr-accordion-body-padding-y) var(--tblr-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}.accordion-flush>.accordion-item>.accordion-collapse{border-radius:0}[data-bs-theme=dark] .accordion-button:after{--tblr-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2366b6b1'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--tblr-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2366b6b1'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--tblr-breadcrumb-padding-x: 0;--tblr-breadcrumb-padding-y: 0;--tblr-breadcrumb-margin-bottom: 1rem;--tblr-breadcrumb-bg: ;--tblr-breadcrumb-border-radius: ;--tblr-breadcrumb-divider-color: var(--tblr-secondary);--tblr-breadcrumb-item-padding-x: .5rem;--tblr-breadcrumb-item-active-color: inherit;display:flex;flex-wrap:wrap;padding:var(--tblr-breadcrumb-padding-y) var(--tblr-breadcrumb-padding-x);margin-bottom:var(--tblr-breadcrumb-margin-bottom);font-size:var(--tblr-breadcrumb-font-size);list-style:none;background-color:var(--tblr-breadcrumb-bg);border-radius:var(--tblr-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--tblr-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:var(--tblr-breadcrumb-item-padding-x);color:var(--tblr-breadcrumb-divider-color);content:var(--tblr-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--tblr-breadcrumb-item-active-color)}.pagination{--tblr-pagination-padding-x: .25rem;--tblr-pagination-padding-y: .25rem;--tblr-pagination-font-size: .875rem;--tblr-pagination-color: var(--tblr-secondary);--tblr-pagination-bg: transparent;--tblr-pagination-border-width: 0;--tblr-pagination-border-color: var(--tblr-border-color);--tblr-pagination-border-radius: var(--tblr-border-radius);--tblr-pagination-hover-color: var(--tblr-link-hover-color);--tblr-pagination-hover-bg: var(--tblr-tertiary-bg);--tblr-pagination-hover-border-color: var(--tblr-border-color);--tblr-pagination-focus-color: var(--tblr-link-hover-color);--tblr-pagination-focus-bg: var(--tblr-secondary-bg);--tblr-pagination-focus-box-shadow: 0 0 0 .25rem rgba(var(--tblr-primary-rgb), .25);--tblr-pagination-active-color: #ffffff;--tblr-pagination-active-bg: var(--tblr-primary);--tblr-pagination-active-border-color: var(--tblr-primary);--tblr-pagination-disabled-color: var(--tblr-disabled-color);--tblr-pagination-disabled-bg: transparent;--tblr-pagination-disabled-border-color: var(--tblr-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--tblr-pagination-padding-y) var(--tblr-pagination-padding-x);font-size:var(--tblr-pagination-font-size);color:var(--tblr-pagination-color);background-color:var(--tblr-pagination-bg);border:var(--tblr-pagination-border-width) solid var(--tblr-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--tblr-pagination-hover-color);text-decoration:none;background-color:var(--tblr-pagination-hover-bg);border-color:var(--tblr-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--tblr-pagination-focus-color);background-color:var(--tblr-pagination-focus-bg);outline:0;box-shadow:var(--tblr-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--tblr-pagination-active-color);background-color:var(--tblr-pagination-active-bg);border-color:var(--tblr-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--tblr-pagination-disabled-color);pointer-events:none;background-color:var(--tblr-pagination-disabled-bg);border-color:var(--tblr-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:-0}.page-item:first-child .page-link{border-top-left-radius:var(--tblr-pagination-border-radius);border-bottom-left-radius:var(--tblr-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--tblr-pagination-border-radius);border-bottom-right-radius:var(--tblr-pagination-border-radius)}.pagination-lg{--tblr-pagination-padding-x: 1.5rem;--tblr-pagination-padding-y: .75rem;--tblr-pagination-font-size: 1.09375rem;--tblr-pagination-border-radius: var(--tblr-border-radius-lg)}.pagination-sm{--tblr-pagination-padding-x: .5rem;--tblr-pagination-padding-y: .25rem;--tblr-pagination-font-size: .765625rem;--tblr-pagination-border-radius: var(--tblr-border-radius-sm)}.badge{--tblr-badge-padding-x: .5em;--tblr-badge-padding-y: .25em;--tblr-badge-font-size: 85.714285%;--tblr-badge-font-weight: var(--tblr-font-weight-medium);--tblr-badge-color: var(--tblr-secondary);--tblr-badge-border-radius: var(--tblr-border-radius);display:inline-block;padding:var(--tblr-badge-padding-y) var(--tblr-badge-padding-x);font-size:var(--tblr-badge-font-size);font-weight:var(--tblr-badge-font-weight);line-height:1;color:var(--tblr-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--tblr-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--tblr-alert-bg: transparent;--tblr-alert-padding-x: 1rem;--tblr-alert-padding-y: .75rem;--tblr-alert-margin-bottom: 1rem;--tblr-alert-color: inherit;--tblr-alert-border-color: transparent;--tblr-alert-border: var(--tblr-border-width) solid var(--tblr-alert-border-color);--tblr-alert-border-radius: var(--tblr-border-radius);--tblr-alert-link-color: inherit;position:relative;padding:var(--tblr-alert-padding-y) var(--tblr-alert-padding-x);margin-bottom:var(--tblr-alert-margin-bottom);color:var(--tblr-alert-color);background-color:var(--tblr-alert-bg);border:var(--tblr-alert-border);border-radius:var(--tblr-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:var(--tblr-font-weight-bold);color:var(--tblr-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:.9375rem 1rem}.alert-primary{--tblr-alert-color: var(--tblr-primary-text-emphasis);--tblr-alert-bg: var(--tblr-primary-bg-subtle);--tblr-alert-border-color: var(--tblr-primary-border-subtle);--tblr-alert-link-color: var(--tblr-primary-text-emphasis)}.alert-secondary{--tblr-alert-color: var(--tblr-secondary-text-emphasis);--tblr-alert-bg: var(--tblr-secondary-bg-subtle);--tblr-alert-border-color: var(--tblr-secondary-border-subtle);--tblr-alert-link-color: var(--tblr-secondary-text-emphasis)}.alert-success{--tblr-alert-color: var(--tblr-success-text-emphasis);--tblr-alert-bg: var(--tblr-success-bg-subtle);--tblr-alert-border-color: var(--tblr-success-border-subtle);--tblr-alert-link-color: var(--tblr-success-text-emphasis)}.alert-info{--tblr-alert-color: var(--tblr-info-text-emphasis);--tblr-alert-bg: var(--tblr-info-bg-subtle);--tblr-alert-border-color: var(--tblr-info-border-subtle);--tblr-alert-link-color: var(--tblr-info-text-emphasis)}.alert-warning{--tblr-alert-color: var(--tblr-warning-text-emphasis);--tblr-alert-bg: var(--tblr-warning-bg-subtle);--tblr-alert-border-color: var(--tblr-warning-border-subtle);--tblr-alert-link-color: var(--tblr-warning-text-emphasis)}.alert-danger{--tblr-alert-color: var(--tblr-danger-text-emphasis);--tblr-alert-bg: var(--tblr-danger-bg-subtle);--tblr-alert-border-color: var(--tblr-danger-border-subtle);--tblr-alert-link-color: var(--tblr-danger-text-emphasis)}.alert-light{--tblr-alert-color: var(--tblr-light-text-emphasis);--tblr-alert-bg: var(--tblr-light-bg-subtle);--tblr-alert-border-color: var(--tblr-light-border-subtle);--tblr-alert-link-color: var(--tblr-light-text-emphasis)}.alert-dark{--tblr-alert-color: var(--tblr-dark-text-emphasis);--tblr-alert-bg: var(--tblr-dark-bg-subtle);--tblr-alert-border-color: var(--tblr-dark-border-subtle);--tblr-alert-link-color: var(--tblr-dark-text-emphasis)}.alert-muted{--tblr-alert-color: var(--tblr-muted-text-emphasis);--tblr-alert-bg: var(--tblr-muted-bg-subtle);--tblr-alert-border-color: var(--tblr-muted-border-subtle);--tblr-alert-link-color: var(--tblr-muted-text-emphasis)}.alert-blue{--tblr-alert-color: var(--tblr-blue-text-emphasis);--tblr-alert-bg: var(--tblr-blue-bg-subtle);--tblr-alert-border-color: var(--tblr-blue-border-subtle);--tblr-alert-link-color: var(--tblr-blue-text-emphasis)}.alert-azure{--tblr-alert-color: var(--tblr-azure-text-emphasis);--tblr-alert-bg: var(--tblr-azure-bg-subtle);--tblr-alert-border-color: var(--tblr-azure-border-subtle);--tblr-alert-link-color: var(--tblr-azure-text-emphasis)}.alert-indigo{--tblr-alert-color: var(--tblr-indigo-text-emphasis);--tblr-alert-bg: var(--tblr-indigo-bg-subtle);--tblr-alert-border-color: var(--tblr-indigo-border-subtle);--tblr-alert-link-color: var(--tblr-indigo-text-emphasis)}.alert-purple{--tblr-alert-color: var(--tblr-purple-text-emphasis);--tblr-alert-bg: var(--tblr-purple-bg-subtle);--tblr-alert-border-color: var(--tblr-purple-border-subtle);--tblr-alert-link-color: var(--tblr-purple-text-emphasis)}.alert-pink{--tblr-alert-color: var(--tblr-pink-text-emphasis);--tblr-alert-bg: var(--tblr-pink-bg-subtle);--tblr-alert-border-color: var(--tblr-pink-border-subtle);--tblr-alert-link-color: var(--tblr-pink-text-emphasis)}.alert-red{--tblr-alert-color: var(--tblr-red-text-emphasis);--tblr-alert-bg: var(--tblr-red-bg-subtle);--tblr-alert-border-color: var(--tblr-red-border-subtle);--tblr-alert-link-color: var(--tblr-red-text-emphasis)}.alert-orange{--tblr-alert-color: var(--tblr-orange-text-emphasis);--tblr-alert-bg: var(--tblr-orange-bg-subtle);--tblr-alert-border-color: var(--tblr-orange-border-subtle);--tblr-alert-link-color: var(--tblr-orange-text-emphasis)}.alert-yellow{--tblr-alert-color: var(--tblr-yellow-text-emphasis);--tblr-alert-bg: var(--tblr-yellow-bg-subtle);--tblr-alert-border-color: var(--tblr-yellow-border-subtle);--tblr-alert-link-color: var(--tblr-yellow-text-emphasis)}.alert-lime{--tblr-alert-color: var(--tblr-lime-text-emphasis);--tblr-alert-bg: var(--tblr-lime-bg-subtle);--tblr-alert-border-color: var(--tblr-lime-border-subtle);--tblr-alert-link-color: var(--tblr-lime-text-emphasis)}.alert-green{--tblr-alert-color: var(--tblr-green-text-emphasis);--tblr-alert-bg: var(--tblr-green-bg-subtle);--tblr-alert-border-color: var(--tblr-green-border-subtle);--tblr-alert-link-color: var(--tblr-green-text-emphasis)}.alert-teal{--tblr-alert-color: var(--tblr-teal-text-emphasis);--tblr-alert-bg: var(--tblr-teal-bg-subtle);--tblr-alert-border-color: var(--tblr-teal-border-subtle);--tblr-alert-link-color: var(--tblr-teal-text-emphasis)}.alert-cyan{--tblr-alert-color: var(--tblr-cyan-text-emphasis);--tblr-alert-bg: var(--tblr-cyan-bg-subtle);--tblr-alert-border-color: var(--tblr-cyan-border-subtle);--tblr-alert-link-color: var(--tblr-cyan-text-emphasis)}.alert-facebook{--tblr-alert-color: var(--tblr-facebook-text-emphasis);--tblr-alert-bg: var(--tblr-facebook-bg-subtle);--tblr-alert-border-color: var(--tblr-facebook-border-subtle);--tblr-alert-link-color: var(--tblr-facebook-text-emphasis)}.alert-twitter{--tblr-alert-color: var(--tblr-twitter-text-emphasis);--tblr-alert-bg: var(--tblr-twitter-bg-subtle);--tblr-alert-border-color: var(--tblr-twitter-border-subtle);--tblr-alert-link-color: var(--tblr-twitter-text-emphasis)}.alert-linkedin{--tblr-alert-color: var(--tblr-linkedin-text-emphasis);--tblr-alert-bg: var(--tblr-linkedin-bg-subtle);--tblr-alert-border-color: var(--tblr-linkedin-border-subtle);--tblr-alert-link-color: var(--tblr-linkedin-text-emphasis)}.alert-google{--tblr-alert-color: var(--tblr-google-text-emphasis);--tblr-alert-bg: var(--tblr-google-bg-subtle);--tblr-alert-border-color: var(--tblr-google-border-subtle);--tblr-alert-link-color: var(--tblr-google-text-emphasis)}.alert-youtube{--tblr-alert-color: var(--tblr-youtube-text-emphasis);--tblr-alert-bg: var(--tblr-youtube-bg-subtle);--tblr-alert-border-color: var(--tblr-youtube-border-subtle);--tblr-alert-link-color: var(--tblr-youtube-text-emphasis)}.alert-vimeo{--tblr-alert-color: var(--tblr-vimeo-text-emphasis);--tblr-alert-bg: var(--tblr-vimeo-bg-subtle);--tblr-alert-border-color: var(--tblr-vimeo-border-subtle);--tblr-alert-link-color: var(--tblr-vimeo-text-emphasis)}.alert-dribbble{--tblr-alert-color: var(--tblr-dribbble-text-emphasis);--tblr-alert-bg: var(--tblr-dribbble-bg-subtle);--tblr-alert-border-color: var(--tblr-dribbble-border-subtle);--tblr-alert-link-color: var(--tblr-dribbble-text-emphasis)}.alert-github{--tblr-alert-color: var(--tblr-github-text-emphasis);--tblr-alert-bg: var(--tblr-github-bg-subtle);--tblr-alert-border-color: var(--tblr-github-border-subtle);--tblr-alert-link-color: var(--tblr-github-text-emphasis)}.alert-instagram{--tblr-alert-color: var(--tblr-instagram-text-emphasis);--tblr-alert-bg: var(--tblr-instagram-bg-subtle);--tblr-alert-border-color: var(--tblr-instagram-border-subtle);--tblr-alert-link-color: var(--tblr-instagram-text-emphasis)}.alert-pinterest{--tblr-alert-color: var(--tblr-pinterest-text-emphasis);--tblr-alert-bg: var(--tblr-pinterest-bg-subtle);--tblr-alert-border-color: var(--tblr-pinterest-border-subtle);--tblr-alert-link-color: var(--tblr-pinterest-text-emphasis)}.alert-vk{--tblr-alert-color: var(--tblr-vk-text-emphasis);--tblr-alert-bg: var(--tblr-vk-bg-subtle);--tblr-alert-border-color: var(--tblr-vk-border-subtle);--tblr-alert-link-color: var(--tblr-vk-text-emphasis)}.alert-rss{--tblr-alert-color: var(--tblr-rss-text-emphasis);--tblr-alert-bg: var(--tblr-rss-bg-subtle);--tblr-alert-border-color: var(--tblr-rss-border-subtle);--tblr-alert-link-color: var(--tblr-rss-text-emphasis)}.alert-flickr{--tblr-alert-color: var(--tblr-flickr-text-emphasis);--tblr-alert-bg: var(--tblr-flickr-bg-subtle);--tblr-alert-border-color: var(--tblr-flickr-border-subtle);--tblr-alert-link-color: var(--tblr-flickr-text-emphasis)}.alert-bitbucket{--tblr-alert-color: var(--tblr-bitbucket-text-emphasis);--tblr-alert-bg: var(--tblr-bitbucket-bg-subtle);--tblr-alert-border-color: var(--tblr-bitbucket-border-subtle);--tblr-alert-link-color: var(--tblr-bitbucket-text-emphasis)}.alert-tabler{--tblr-alert-color: var(--tblr-tabler-text-emphasis);--tblr-alert-bg: var(--tblr-tabler-bg-subtle);--tblr-alert-border-color: var(--tblr-tabler-border-subtle);--tblr-alert-link-color: var(--tblr-tabler-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress,.progress-stacked{--tblr-progress-height: .5rem;--tblr-progress-font-size: .65625rem;--tblr-progress-bg: var(--tblr-border-color);--tblr-progress-border-radius: var(--tblr-border-radius);--tblr-progress-box-shadow: var(--tblr-box-shadow-inset);--tblr-progress-bar-color: #ffffff;--tblr-progress-bar-bg: var(--tblr-primary);--tblr-progress-bar-transition: width .6s ease;display:flex;height:var(--tblr-progress-height);overflow:hidden;font-size:var(--tblr-progress-font-size);background-color:var(--tblr-progress-bg);border-radius:var(--tblr-progress-border-radius);box-shadow:var(--tblr-progress-box-shadow)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--tblr-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--tblr-progress-bar-bg);transition:var(--tblr-progress-bar-transition)}@media (prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--tblr-progress-height) var(--tblr-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--tblr-list-group-color: var(--tblr-body-color);--tblr-list-group-bg: inherit;--tblr-list-group-border-color: var(--tblr-border-color);--tblr-list-group-border-width: var(--tblr-border-width);--tblr-list-group-border-radius: var(--tblr-border-radius);--tblr-list-group-item-padding-x: 1.25rem;--tblr-list-group-item-padding-y: 1.25rem;--tblr-list-group-action-color: inherit;--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: rgba(var(--tblr-secondary-rgb), .08);--tblr-list-group-action-active-color: var(--tblr-body-color);--tblr-list-group-action-active-bg: var(--tblr-secondary-bg);--tblr-list-group-disabled-color: var(--tblr-secondary-color);--tblr-list-group-disabled-bg: inherit;--tblr-list-group-active-color: inherit;--tblr-list-group-active-bg: var(--tblr-active-bg);--tblr-list-group-active-border-color: var(--tblr-border-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--tblr-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item:before{content:counters(section,".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--tblr-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--tblr-list-group-action-hover-color);text-decoration:none;background-color:var(--tblr-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--tblr-list-group-action-active-color);background-color:var(--tblr-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--tblr-list-group-item-padding-y) var(--tblr-list-group-item-padding-x);color:var(--tblr-list-group-color);background-color:var(--tblr-list-group-bg);border:var(--tblr-list-group-border-width) solid var(--tblr-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--tblr-list-group-disabled-color);pointer-events:none;background-color:var(--tblr-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--tblr-list-group-active-color);background-color:var(--tblr-list-group-active-bg);border-color:var(--tblr-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--tblr-list-group-border-width));border-top-width:var(--tblr-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}@media (min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--tblr-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--tblr-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--tblr-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--tblr-list-group-border-width));border-left-width:var(--tblr-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--tblr-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--tblr-list-group-color: var(--tblr-primary-text-emphasis);--tblr-list-group-bg: var(--tblr-primary-bg-subtle);--tblr-list-group-border-color: var(--tblr-primary-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-primary-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-primary-border-subtle);--tblr-list-group-active-color: var(--tblr-primary-bg-subtle);--tblr-list-group-active-bg: var(--tblr-primary-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-primary-text-emphasis)}.list-group-item-secondary{--tblr-list-group-color: var(--tblr-secondary-text-emphasis);--tblr-list-group-bg: var(--tblr-secondary-bg-subtle);--tblr-list-group-border-color: var(--tblr-secondary-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-secondary-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-secondary-border-subtle);--tblr-list-group-active-color: var(--tblr-secondary-bg-subtle);--tblr-list-group-active-bg: var(--tblr-secondary-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-secondary-text-emphasis)}.list-group-item-success{--tblr-list-group-color: var(--tblr-success-text-emphasis);--tblr-list-group-bg: var(--tblr-success-bg-subtle);--tblr-list-group-border-color: var(--tblr-success-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-success-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-success-border-subtle);--tblr-list-group-active-color: var(--tblr-success-bg-subtle);--tblr-list-group-active-bg: var(--tblr-success-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-success-text-emphasis)}.list-group-item-info{--tblr-list-group-color: var(--tblr-info-text-emphasis);--tblr-list-group-bg: var(--tblr-info-bg-subtle);--tblr-list-group-border-color: var(--tblr-info-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-info-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-info-border-subtle);--tblr-list-group-active-color: var(--tblr-info-bg-subtle);--tblr-list-group-active-bg: var(--tblr-info-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-info-text-emphasis)}.list-group-item-warning{--tblr-list-group-color: var(--tblr-warning-text-emphasis);--tblr-list-group-bg: var(--tblr-warning-bg-subtle);--tblr-list-group-border-color: var(--tblr-warning-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-warning-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-warning-border-subtle);--tblr-list-group-active-color: var(--tblr-warning-bg-subtle);--tblr-list-group-active-bg: var(--tblr-warning-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-warning-text-emphasis)}.list-group-item-danger{--tblr-list-group-color: var(--tblr-danger-text-emphasis);--tblr-list-group-bg: var(--tblr-danger-bg-subtle);--tblr-list-group-border-color: var(--tblr-danger-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-danger-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-danger-border-subtle);--tblr-list-group-active-color: var(--tblr-danger-bg-subtle);--tblr-list-group-active-bg: var(--tblr-danger-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-danger-text-emphasis)}.list-group-item-light{--tblr-list-group-color: var(--tblr-light-text-emphasis);--tblr-list-group-bg: var(--tblr-light-bg-subtle);--tblr-list-group-border-color: var(--tblr-light-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-light-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-light-border-subtle);--tblr-list-group-active-color: var(--tblr-light-bg-subtle);--tblr-list-group-active-bg: var(--tblr-light-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-light-text-emphasis)}.list-group-item-dark{--tblr-list-group-color: var(--tblr-dark-text-emphasis);--tblr-list-group-bg: var(--tblr-dark-bg-subtle);--tblr-list-group-border-color: var(--tblr-dark-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-dark-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-dark-border-subtle);--tblr-list-group-active-color: var(--tblr-dark-bg-subtle);--tblr-list-group-active-bg: var(--tblr-dark-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-dark-text-emphasis)}.list-group-item-muted{--tblr-list-group-color: var(--tblr-muted-text-emphasis);--tblr-list-group-bg: var(--tblr-muted-bg-subtle);--tblr-list-group-border-color: var(--tblr-muted-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-muted-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-muted-border-subtle);--tblr-list-group-active-color: var(--tblr-muted-bg-subtle);--tblr-list-group-active-bg: var(--tblr-muted-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-muted-text-emphasis)}.list-group-item-blue{--tblr-list-group-color: var(--tblr-blue-text-emphasis);--tblr-list-group-bg: var(--tblr-blue-bg-subtle);--tblr-list-group-border-color: var(--tblr-blue-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-blue-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-blue-border-subtle);--tblr-list-group-active-color: var(--tblr-blue-bg-subtle);--tblr-list-group-active-bg: var(--tblr-blue-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-blue-text-emphasis)}.list-group-item-azure{--tblr-list-group-color: var(--tblr-azure-text-emphasis);--tblr-list-group-bg: var(--tblr-azure-bg-subtle);--tblr-list-group-border-color: var(--tblr-azure-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-azure-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-azure-border-subtle);--tblr-list-group-active-color: var(--tblr-azure-bg-subtle);--tblr-list-group-active-bg: var(--tblr-azure-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-azure-text-emphasis)}.list-group-item-indigo{--tblr-list-group-color: var(--tblr-indigo-text-emphasis);--tblr-list-group-bg: var(--tblr-indigo-bg-subtle);--tblr-list-group-border-color: var(--tblr-indigo-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-indigo-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-indigo-border-subtle);--tblr-list-group-active-color: var(--tblr-indigo-bg-subtle);--tblr-list-group-active-bg: var(--tblr-indigo-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-indigo-text-emphasis)}.list-group-item-purple{--tblr-list-group-color: var(--tblr-purple-text-emphasis);--tblr-list-group-bg: var(--tblr-purple-bg-subtle);--tblr-list-group-border-color: var(--tblr-purple-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-purple-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-purple-border-subtle);--tblr-list-group-active-color: var(--tblr-purple-bg-subtle);--tblr-list-group-active-bg: var(--tblr-purple-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-purple-text-emphasis)}.list-group-item-pink{--tblr-list-group-color: var(--tblr-pink-text-emphasis);--tblr-list-group-bg: var(--tblr-pink-bg-subtle);--tblr-list-group-border-color: var(--tblr-pink-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-pink-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-pink-border-subtle);--tblr-list-group-active-color: var(--tblr-pink-bg-subtle);--tblr-list-group-active-bg: var(--tblr-pink-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-pink-text-emphasis)}.list-group-item-red{--tblr-list-group-color: var(--tblr-red-text-emphasis);--tblr-list-group-bg: var(--tblr-red-bg-subtle);--tblr-list-group-border-color: var(--tblr-red-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-red-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-red-border-subtle);--tblr-list-group-active-color: var(--tblr-red-bg-subtle);--tblr-list-group-active-bg: var(--tblr-red-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-red-text-emphasis)}.list-group-item-orange{--tblr-list-group-color: var(--tblr-orange-text-emphasis);--tblr-list-group-bg: var(--tblr-orange-bg-subtle);--tblr-list-group-border-color: var(--tblr-orange-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-orange-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-orange-border-subtle);--tblr-list-group-active-color: var(--tblr-orange-bg-subtle);--tblr-list-group-active-bg: var(--tblr-orange-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-orange-text-emphasis)}.list-group-item-yellow{--tblr-list-group-color: var(--tblr-yellow-text-emphasis);--tblr-list-group-bg: var(--tblr-yellow-bg-subtle);--tblr-list-group-border-color: var(--tblr-yellow-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-yellow-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-yellow-border-subtle);--tblr-list-group-active-color: var(--tblr-yellow-bg-subtle);--tblr-list-group-active-bg: var(--tblr-yellow-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-yellow-text-emphasis)}.list-group-item-lime{--tblr-list-group-color: var(--tblr-lime-text-emphasis);--tblr-list-group-bg: var(--tblr-lime-bg-subtle);--tblr-list-group-border-color: var(--tblr-lime-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-lime-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-lime-border-subtle);--tblr-list-group-active-color: var(--tblr-lime-bg-subtle);--tblr-list-group-active-bg: var(--tblr-lime-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-lime-text-emphasis)}.list-group-item-green{--tblr-list-group-color: var(--tblr-green-text-emphasis);--tblr-list-group-bg: var(--tblr-green-bg-subtle);--tblr-list-group-border-color: var(--tblr-green-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-green-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-green-border-subtle);--tblr-list-group-active-color: var(--tblr-green-bg-subtle);--tblr-list-group-active-bg: var(--tblr-green-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-green-text-emphasis)}.list-group-item-teal{--tblr-list-group-color: var(--tblr-teal-text-emphasis);--tblr-list-group-bg: var(--tblr-teal-bg-subtle);--tblr-list-group-border-color: var(--tblr-teal-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-teal-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-teal-border-subtle);--tblr-list-group-active-color: var(--tblr-teal-bg-subtle);--tblr-list-group-active-bg: var(--tblr-teal-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-teal-text-emphasis)}.list-group-item-cyan{--tblr-list-group-color: var(--tblr-cyan-text-emphasis);--tblr-list-group-bg: var(--tblr-cyan-bg-subtle);--tblr-list-group-border-color: var(--tblr-cyan-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-cyan-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-cyan-border-subtle);--tblr-list-group-active-color: var(--tblr-cyan-bg-subtle);--tblr-list-group-active-bg: var(--tblr-cyan-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-cyan-text-emphasis)}.list-group-item-facebook{--tblr-list-group-color: var(--tblr-facebook-text-emphasis);--tblr-list-group-bg: var(--tblr-facebook-bg-subtle);--tblr-list-group-border-color: var(--tblr-facebook-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-facebook-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-facebook-border-subtle);--tblr-list-group-active-color: var(--tblr-facebook-bg-subtle);--tblr-list-group-active-bg: var(--tblr-facebook-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-facebook-text-emphasis)}.list-group-item-twitter{--tblr-list-group-color: var(--tblr-twitter-text-emphasis);--tblr-list-group-bg: var(--tblr-twitter-bg-subtle);--tblr-list-group-border-color: var(--tblr-twitter-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-twitter-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-twitter-border-subtle);--tblr-list-group-active-color: var(--tblr-twitter-bg-subtle);--tblr-list-group-active-bg: var(--tblr-twitter-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-twitter-text-emphasis)}.list-group-item-linkedin{--tblr-list-group-color: var(--tblr-linkedin-text-emphasis);--tblr-list-group-bg: var(--tblr-linkedin-bg-subtle);--tblr-list-group-border-color: var(--tblr-linkedin-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-linkedin-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-linkedin-border-subtle);--tblr-list-group-active-color: var(--tblr-linkedin-bg-subtle);--tblr-list-group-active-bg: var(--tblr-linkedin-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-linkedin-text-emphasis)}.list-group-item-google{--tblr-list-group-color: var(--tblr-google-text-emphasis);--tblr-list-group-bg: var(--tblr-google-bg-subtle);--tblr-list-group-border-color: var(--tblr-google-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-google-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-google-border-subtle);--tblr-list-group-active-color: var(--tblr-google-bg-subtle);--tblr-list-group-active-bg: var(--tblr-google-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-google-text-emphasis)}.list-group-item-youtube{--tblr-list-group-color: var(--tblr-youtube-text-emphasis);--tblr-list-group-bg: var(--tblr-youtube-bg-subtle);--tblr-list-group-border-color: var(--tblr-youtube-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-youtube-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-youtube-border-subtle);--tblr-list-group-active-color: var(--tblr-youtube-bg-subtle);--tblr-list-group-active-bg: var(--tblr-youtube-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-youtube-text-emphasis)}.list-group-item-vimeo{--tblr-list-group-color: var(--tblr-vimeo-text-emphasis);--tblr-list-group-bg: var(--tblr-vimeo-bg-subtle);--tblr-list-group-border-color: var(--tblr-vimeo-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-vimeo-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-vimeo-border-subtle);--tblr-list-group-active-color: var(--tblr-vimeo-bg-subtle);--tblr-list-group-active-bg: var(--tblr-vimeo-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-vimeo-text-emphasis)}.list-group-item-dribbble{--tblr-list-group-color: var(--tblr-dribbble-text-emphasis);--tblr-list-group-bg: var(--tblr-dribbble-bg-subtle);--tblr-list-group-border-color: var(--tblr-dribbble-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-dribbble-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-dribbble-border-subtle);--tblr-list-group-active-color: var(--tblr-dribbble-bg-subtle);--tblr-list-group-active-bg: var(--tblr-dribbble-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-dribbble-text-emphasis)}.list-group-item-github{--tblr-list-group-color: var(--tblr-github-text-emphasis);--tblr-list-group-bg: var(--tblr-github-bg-subtle);--tblr-list-group-border-color: var(--tblr-github-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-github-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-github-border-subtle);--tblr-list-group-active-color: var(--tblr-github-bg-subtle);--tblr-list-group-active-bg: var(--tblr-github-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-github-text-emphasis)}.list-group-item-instagram{--tblr-list-group-color: var(--tblr-instagram-text-emphasis);--tblr-list-group-bg: var(--tblr-instagram-bg-subtle);--tblr-list-group-border-color: var(--tblr-instagram-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-instagram-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-instagram-border-subtle);--tblr-list-group-active-color: var(--tblr-instagram-bg-subtle);--tblr-list-group-active-bg: var(--tblr-instagram-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-instagram-text-emphasis)}.list-group-item-pinterest{--tblr-list-group-color: var(--tblr-pinterest-text-emphasis);--tblr-list-group-bg: var(--tblr-pinterest-bg-subtle);--tblr-list-group-border-color: var(--tblr-pinterest-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-pinterest-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-pinterest-border-subtle);--tblr-list-group-active-color: var(--tblr-pinterest-bg-subtle);--tblr-list-group-active-bg: var(--tblr-pinterest-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-pinterest-text-emphasis)}.list-group-item-vk{--tblr-list-group-color: var(--tblr-vk-text-emphasis);--tblr-list-group-bg: var(--tblr-vk-bg-subtle);--tblr-list-group-border-color: var(--tblr-vk-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-vk-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-vk-border-subtle);--tblr-list-group-active-color: var(--tblr-vk-bg-subtle);--tblr-list-group-active-bg: var(--tblr-vk-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-vk-text-emphasis)}.list-group-item-rss{--tblr-list-group-color: var(--tblr-rss-text-emphasis);--tblr-list-group-bg: var(--tblr-rss-bg-subtle);--tblr-list-group-border-color: var(--tblr-rss-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-rss-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-rss-border-subtle);--tblr-list-group-active-color: var(--tblr-rss-bg-subtle);--tblr-list-group-active-bg: var(--tblr-rss-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-rss-text-emphasis)}.list-group-item-flickr{--tblr-list-group-color: var(--tblr-flickr-text-emphasis);--tblr-list-group-bg: var(--tblr-flickr-bg-subtle);--tblr-list-group-border-color: var(--tblr-flickr-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-flickr-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-flickr-border-subtle);--tblr-list-group-active-color: var(--tblr-flickr-bg-subtle);--tblr-list-group-active-bg: var(--tblr-flickr-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-flickr-text-emphasis)}.list-group-item-bitbucket{--tblr-list-group-color: var(--tblr-bitbucket-text-emphasis);--tblr-list-group-bg: var(--tblr-bitbucket-bg-subtle);--tblr-list-group-border-color: var(--tblr-bitbucket-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-bitbucket-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-bitbucket-border-subtle);--tblr-list-group-active-color: var(--tblr-bitbucket-bg-subtle);--tblr-list-group-active-bg: var(--tblr-bitbucket-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-bitbucket-text-emphasis)}.list-group-item-tabler{--tblr-list-group-color: var(--tblr-tabler-text-emphasis);--tblr-list-group-bg: var(--tblr-tabler-bg-subtle);--tblr-list-group-border-color: var(--tblr-tabler-border-subtle);--tblr-list-group-action-hover-color: var(--tblr-emphasis-color);--tblr-list-group-action-hover-bg: var(--tblr-tabler-border-subtle);--tblr-list-group-action-active-color: var(--tblr-emphasis-color);--tblr-list-group-action-active-bg: var(--tblr-tabler-border-subtle);--tblr-list-group-active-color: var(--tblr-tabler-bg-subtle);--tblr-list-group-active-bg: var(--tblr-tabler-text-emphasis);--tblr-list-group-active-border-color: var(--tblr-tabler-text-emphasis)}.btn-close{--tblr-btn-close-color: #182433;--tblr-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23182433'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--tblr-btn-close-opacity: .4;--tblr-btn-close-hover-opacity: .75;--tblr-btn-close-focus-shadow: 0 0 0 .25rem rgba(var(--tblr-primary-rgb), .25);--tblr-btn-close-focus-opacity: 1;--tblr-btn-close-disabled-opacity: .25;--tblr-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em;color:var(--tblr-btn-close-color);background:transparent var(--tblr-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:4px;opacity:var(--tblr-btn-close-opacity)}.btn-close:hover{color:var(--tblr-btn-close-color);text-decoration:none;opacity:var(--tblr-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--tblr-btn-close-focus-shadow);opacity:var(--tblr-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:var(--tblr-btn-close-disabled-opacity)}.btn-close-white,[data-bs-theme=dark] .btn-close,body[data-bs-theme=dark] [data-bs-theme=light] .btn-close{filter:var(--tblr-btn-close-white-filter)}.toast{--tblr-toast-zindex: 1090;--tblr-toast-padding-x: .75rem;--tblr-toast-padding-y: .5rem;--tblr-toast-spacing: calc(var(--tblr-page-padding) * 2);--tblr-toast-max-width: 350px;--tblr-toast-font-size: .875rem;--tblr-toast-color: ;--tblr-toast-bg: rgba(var(--tblr-body-bg-rgb), .85);--tblr-toast-border-width: var(--tblr-border-width);--tblr-toast-border-color: var(--tblr-border-color);--tblr-toast-border-radius: var(--tblr-border-radius);--tblr-toast-box-shadow: var(--tblr-box-shadow);--tblr-toast-header-color: var(--tblr-secondary);--tblr-toast-header-bg: rgba(var(--tblr-body-bg-rgb), .85);--tblr-toast-header-border-color: var(--tblr-border-color);width:var(--tblr-toast-max-width);max-width:100%;font-size:var(--tblr-toast-font-size);color:var(--tblr-toast-color);pointer-events:auto;background-color:var(--tblr-toast-bg);background-clip:padding-box;border:var(--tblr-toast-border-width) solid var(--tblr-toast-border-color);box-shadow:var(--tblr-toast-box-shadow);border-radius:var(--tblr-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--tblr-toast-zindex: 1090;position:absolute;z-index:var(--tblr-toast-zindex);width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--tblr-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--tblr-toast-padding-y) var(--tblr-toast-padding-x);color:var(--tblr-toast-header-color);background-color:var(--tblr-toast-header-bg);background-clip:padding-box;border-bottom:var(--tblr-toast-border-width) solid var(--tblr-toast-header-border-color);border-top-left-radius:calc(var(--tblr-toast-border-radius) - var(--tblr-toast-border-width));border-top-right-radius:calc(var(--tblr-toast-border-radius) - var(--tblr-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--tblr-toast-padding-x));margin-left:var(--tblr-toast-padding-x)}.toast-body{padding:var(--tblr-toast-padding-x);word-wrap:break-word}.modal{--tblr-modal-zindex: 1055;--tblr-modal-width: 540px;--tblr-modal-padding: 1.5rem;--tblr-modal-margin: .5rem;--tblr-modal-color: ;--tblr-modal-bg: var(--tblr-bg-surface);--tblr-modal-border-color: transparent;--tblr-modal-border-width: var(--tblr-border-width);--tblr-modal-border-radius: var(--tblr-border-radius-lg);--tblr-modal-box-shadow: var(--tblr-box-shadow-sm);--tblr-modal-inner-border-radius: calc(var(--tblr-modal-border-radius) - 1px);--tblr-modal-header-padding-x: 1.5rem;--tblr-modal-header-padding-y: 1.5rem;--tblr-modal-header-padding: 1.5rem;--tblr-modal-header-border-color: var(--tblr-border-color);--tblr-modal-header-border-width: var(--tblr-border-width);--tblr-modal-title-line-height: 1.4285714286;--tblr-modal-footer-gap: .75rem;--tblr-modal-footer-bg: var(--tblr-bg-surface-tertiary);--tblr-modal-footer-border-color: var(--tblr-border-color);--tblr-modal-footer-border-width: var(--tblr-border-width);position:fixed;top:0;left:0;z-index:var(--tblr-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--tblr-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-1rem)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--tblr-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--tblr-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--tblr-modal-color);pointer-events:auto;background-color:var(--tblr-modal-bg);background-clip:padding-box;border:var(--tblr-modal-border-width) solid var(--tblr-modal-border-color);border-radius:var(--tblr-modal-border-radius);box-shadow:var(--tblr-modal-box-shadow);outline:0}.modal-backdrop{--tblr-backdrop-zindex: 1050;--tblr-backdrop-bg: #182433;--tblr-backdrop-opacity: .24;position:fixed;top:0;left:0;z-index:var(--tblr-backdrop-zindex);width:100vw;height:100vh;background-color:var(--tblr-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--tblr-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;padding:var(--tblr-modal-header-padding);border-bottom:var(--tblr-modal-header-border-width) solid var(--tblr-modal-header-border-color);border-top-left-radius:var(--tblr-modal-inner-border-radius);border-top-right-radius:var(--tblr-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--tblr-modal-header-padding-y) * .5) calc(var(--tblr-modal-header-padding-x) * .5);margin:calc(-.5 * var(--tblr-modal-header-padding-y)) calc(-.5 * var(--tblr-modal-header-padding-x)) calc(-.5 * var(--tblr-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--tblr-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--tblr-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--tblr-modal-padding) - var(--tblr-modal-footer-gap) * .5);background-color:var(--tblr-modal-footer-bg);border-top:var(--tblr-modal-footer-border-width) solid var(--tblr-modal-footer-border-color);border-bottom-right-radius:var(--tblr-modal-inner-border-radius);border-bottom-left-radius:var(--tblr-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--tblr-modal-footer-gap) * .5)}@media (min-width: 576px){.modal{--tblr-modal-margin: 1.75rem;--tblr-modal-box-shadow: var(--tblr-box-shadow)}.modal-dialog{max-width:var(--tblr-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--tblr-modal-width: 380px}}@media (min-width: 992px){.modal-lg,.modal-xl{--tblr-modal-width: 720px}}@media (min-width: 1200px){.modal-xl{--tblr-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--tblr-tooltip-zindex: 1080;--tblr-tooltip-max-width: 200px;--tblr-tooltip-padding-x: var(--tblr-spacer-2);--tblr-tooltip-padding-y: var(--tblr-spacer-2);--tblr-tooltip-margin: ;--tblr-tooltip-font-size: .765625rem;--tblr-tooltip-color: var(--tblr-light);--tblr-tooltip-bg: var(--tblr-bg-surface-dark);--tblr-tooltip-border-radius: var(--tblr-border-radius);--tblr-tooltip-opacity: .9;--tblr-tooltip-arrow-width: .8rem;--tblr-tooltip-arrow-height: .4rem;z-index:var(--tblr-tooltip-zindex);display:block;margin:var(--tblr-tooltip-margin);font-family:var(--tblr-font-sans-serif);font-style:normal;font-weight:400;line-height:1.4285714286;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--tblr-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--tblr-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--tblr-tooltip-arrow-width);height:var(--tblr-tooltip-arrow-height)}.tooltip .tooltip-arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1 * var(--tblr-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before{top:-1px;border-width:var(--tblr-tooltip-arrow-height) calc(var(--tblr-tooltip-arrow-width) * .5) 0;border-top-color:var(--tblr-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1 * var(--tblr-tooltip-arrow-height));width:var(--tblr-tooltip-arrow-height);height:var(--tblr-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before{right:-1px;border-width:calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height) calc(var(--tblr-tooltip-arrow-width) * .5) 0;border-right-color:var(--tblr-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1 * var(--tblr-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before{bottom:-1px;border-width:0 calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height);border-bottom-color:var(--tblr-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1 * var(--tblr-tooltip-arrow-height));width:var(--tblr-tooltip-arrow-height);height:var(--tblr-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before{left:-1px;border-width:calc(var(--tblr-tooltip-arrow-width) * .5) 0 calc(var(--tblr-tooltip-arrow-width) * .5) var(--tblr-tooltip-arrow-height);border-left-color:var(--tblr-tooltip-bg)}.tooltip-inner{max-width:var(--tblr-tooltip-max-width);padding:var(--tblr-tooltip-padding-y) var(--tblr-tooltip-padding-x);color:var(--tblr-tooltip-color);text-align:center;background-color:var(--tblr-tooltip-bg);border-radius:var(--tblr-tooltip-border-radius)}.popover{--tblr-popover-zindex: 1070;--tblr-popover-max-width: 276px;--tblr-popover-font-size: .765625rem;--tblr-popover-bg: var(--tblr-bg-surface);--tblr-popover-border-width: var(--tblr-border-width);--tblr-popover-border-color: var(--tblr-border-color);--tblr-popover-border-radius: var(--tblr-border-radius-lg);--tblr-popover-inner-border-radius: calc(var(--tblr-border-radius-lg) - var(--tblr-border-width));--tblr-popover-box-shadow: var(--tblr-box-shadow);--tblr-popover-header-padding-x: 1rem;--tblr-popover-header-padding-y: .5rem;--tblr-popover-header-font-size: .875rem;--tblr-popover-header-color: inherit;--tblr-popover-header-bg: transparent;--tblr-popover-body-padding-x: 1rem;--tblr-popover-body-padding-y: 1rem;--tblr-popover-body-color: inherit;--tblr-popover-arrow-width: 1rem;--tblr-popover-arrow-height: .5rem;--tblr-popover-arrow-border: var(--tblr-popover-border-color);z-index:var(--tblr-popover-zindex);display:block;max-width:var(--tblr-popover-max-width);font-family:var(--tblr-font-sans-serif);font-style:normal;font-weight:400;line-height:1.4285714286;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--tblr-popover-font-size);word-wrap:break-word;background-color:var(--tblr-popover-bg);background-clip:padding-box;border:var(--tblr-popover-border-width) solid var(--tblr-popover-border-color);border-radius:var(--tblr-popover-border-radius);box-shadow:var(--tblr-popover-box-shadow)}.popover .popover-arrow{display:block;width:var(--tblr-popover-arrow-width);height:var(--tblr-popover-arrow-height)}.popover .popover-arrow:before,.popover .popover-arrow:after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width))}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{border-width:var(--tblr-popover-arrow-height) calc(var(--tblr-popover-arrow-width) * .5) 0}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before{bottom:0;border-top-color:var(--tblr-popover-arrow-border)}.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{bottom:var(--tblr-popover-border-width);border-top-color:var(--tblr-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width));width:var(--tblr-popover-arrow-height);height:var(--tblr-popover-arrow-width)}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{border-width:calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height) calc(var(--tblr-popover-arrow-width) * .5) 0}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before{left:0;border-right-color:var(--tblr-popover-arrow-border)}.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{left:var(--tblr-popover-border-width);border-right-color:var(--tblr-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width))}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{border-width:0 calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height)}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before{top:0;border-bottom-color:var(--tblr-popover-arrow-border)}.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{top:var(--tblr-popover-border-width);border-bottom-color:var(--tblr-popover-bg)}.bs-popover-bottom .popover-header:before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before{position:absolute;top:0;left:50%;display:block;width:var(--tblr-popover-arrow-width);margin-left:calc(-.5 * var(--tblr-popover-arrow-width));content:"";border-bottom:var(--tblr-popover-border-width) solid var(--tblr-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1 * (var(--tblr-popover-arrow-height)) - var(--tblr-popover-border-width));width:var(--tblr-popover-arrow-height);height:var(--tblr-popover-arrow-width)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{border-width:calc(var(--tblr-popover-arrow-width) * .5) 0 calc(var(--tblr-popover-arrow-width) * .5) var(--tblr-popover-arrow-height)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before{right:0;border-left-color:var(--tblr-popover-arrow-border)}.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{right:var(--tblr-popover-border-width);border-left-color:var(--tblr-popover-bg)}.popover-header{padding:var(--tblr-popover-header-padding-y) var(--tblr-popover-header-padding-x);margin-bottom:0;font-size:var(--tblr-popover-header-font-size);color:var(--tblr-popover-header-color);background-color:var(--tblr-popover-header-bg);border-bottom:var(--tblr-popover-border-width) solid var(--tblr-popover-border-color);border-top-left-radius:var(--tblr-popover-inner-border-radius);border-top-right-radius:var(--tblr-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--tblr-popover-body-padding-y) var(--tblr-popover-body-padding-x);color:var(--tblr-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translate(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translate(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:1.5rem;height:1.5rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='15 18 9 12 15 6'%3e%3c/polyline%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='9 18 15 12 9 6'%3e%3c/polyline%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--tblr-spinner-width);height:var(--tblr-spinner-height);vertical-align:var(--tblr-spinner-vertical-align);border-radius:50%;animation:var(--tblr-spinner-animation-speed) linear infinite var(--tblr-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--tblr-spinner-width: 1.5rem;--tblr-spinner-height: 1.5rem;--tblr-spinner-vertical-align: -.125em;--tblr-spinner-border-width: 2px;--tblr-spinner-animation-speed: .75s;--tblr-spinner-animation-name: spinner-border;border:var(--tblr-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--tblr-spinner-width: 1rem;--tblr-spinner-height: 1rem;--tblr-spinner-border-width: 1px}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--tblr-spinner-width: 1.5rem;--tblr-spinner-height: 1.5rem;--tblr-spinner-vertical-align: -.125em;--tblr-spinner-animation-speed: .75s;--tblr-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--tblr-spinner-width: 1rem;--tblr-spinner-height: 1rem}@media (prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--tblr-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--tblr-offcanvas-zindex: 1045;--tblr-offcanvas-width: 400px;--tblr-offcanvas-height: 30vh;--tblr-offcanvas-padding-x: 1.5rem;--tblr-offcanvas-padding-y: 1.5rem;--tblr-offcanvas-color: var(--tblr-body-color);--tblr-offcanvas-bg: var(--tblr-bg-surface);--tblr-offcanvas-border-width: var(--tblr-border-width);--tblr-offcanvas-border-color: var(--tblr-border-color);--tblr-offcanvas-box-shadow: var(--tblr-box-shadow-sm);--tblr-offcanvas-transition: transform .3s ease-in-out;--tblr-offcanvas-title-line-height: 1.4285714286}@media (max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media (max-width: 575.98px) and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media (max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media (min-width: 576px){.offcanvas-sm{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media (max-width: 767.98px) and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media (max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media (min-width: 768px){.offcanvas-md{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media (max-width: 991.98px) and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media (max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media (min-width: 992px){.offcanvas-lg{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media (max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media (min-width: 1200px){.offcanvas-xl{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}}@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media (max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media (min-width: 1400px){.offcanvas-xxl{--tblr-offcanvas-height: auto;--tblr-offcanvas-border-width: 0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--tblr-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--tblr-offcanvas-color);visibility:hidden;background-color:var(--tblr-offcanvas-bg);background-clip:padding-box;outline:0;box-shadow:var(--tblr-offcanvas-box-shadow);transition:var(--tblr-offcanvas-transition)}@media (prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--tblr-offcanvas-width);border-right:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--tblr-offcanvas-width);border-left:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translate(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-bottom:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--tblr-offcanvas-height);max-height:100%;border-top:var(--tblr-offcanvas-border-width) solid var(--tblr-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#182433}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.24}.offcanvas-header{display:flex;align-items:center;padding:var(--tblr-offcanvas-padding-y) var(--tblr-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--tblr-offcanvas-padding-y) * .5) calc(var(--tblr-offcanvas-padding-x) * .5);margin:calc(-.5 * var(--tblr-offcanvas-padding-y)) calc(-.5 * var(--tblr-offcanvas-padding-x)) calc(-.5 * var(--tblr-offcanvas-padding-y)) auto}.offcanvas-title{margin-bottom:0;line-height:var(--tblr-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--tblr-offcanvas-padding-y) var(--tblr-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.2}.placeholder.btn:before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.1}}.placeholder-wave{mask-image:linear-gradient(130deg,#000 55%,#000000e6,#000 95%);mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{to{mask-position:-200% 0%}}.clearfix:after{display:block;clear:both;content:""}.text-bg-primary{color:#fcfdfe!important;background-color:RGBA(var(--tblr-primary-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-secondary,.text-bg-gray{color:#fcfdfe!important;background-color:RGBA(var(--tblr-secondary-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-success{color:#fcfdfe!important;background-color:RGBA(var(--tblr-success-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-info{color:#fcfdfe!important;background-color:RGBA(var(--tblr-info-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-warning{color:#fcfdfe!important;background-color:RGBA(var(--tblr-warning-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-danger{color:#fcfdfe!important;background-color:RGBA(var(--tblr-danger-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-light,.text-bg-white{color:#182433!important;background-color:RGBA(var(--tblr-light-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-dark,.text-bg-black{color:#fcfdfe!important;background-color:RGBA(var(--tblr-dark-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-muted{color:#fcfdfe!important;background-color:RGBA(var(--tblr-muted-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-blue{color:#fcfdfe!important;background-color:RGBA(var(--tblr-blue-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-azure{color:#fcfdfe!important;background-color:RGBA(var(--tblr-azure-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-indigo{color:#fcfdfe!important;background-color:RGBA(var(--tblr-indigo-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-purple{color:#fcfdfe!important;background-color:RGBA(var(--tblr-purple-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-pink{color:#fcfdfe!important;background-color:RGBA(var(--tblr-pink-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-red{color:#fcfdfe!important;background-color:RGBA(var(--tblr-red-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-orange{color:#fcfdfe!important;background-color:RGBA(var(--tblr-orange-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-yellow{color:#fcfdfe!important;background-color:RGBA(var(--tblr-yellow-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-lime{color:#fcfdfe!important;background-color:RGBA(var(--tblr-lime-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-green{color:#fcfdfe!important;background-color:RGBA(var(--tblr-green-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-teal{color:#fcfdfe!important;background-color:RGBA(var(--tblr-teal-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-cyan{color:#fcfdfe!important;background-color:RGBA(var(--tblr-cyan-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-facebook{color:#fcfdfe!important;background-color:RGBA(var(--tblr-facebook-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-twitter{color:#fcfdfe!important;background-color:RGBA(var(--tblr-twitter-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-linkedin{color:#fcfdfe!important;background-color:RGBA(var(--tblr-linkedin-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-google{color:#fcfdfe!important;background-color:RGBA(var(--tblr-google-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-youtube{color:#fcfdfe!important;background-color:RGBA(var(--tblr-youtube-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-vimeo{color:#fcfdfe!important;background-color:RGBA(var(--tblr-vimeo-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-dribbble{color:#fcfdfe!important;background-color:RGBA(var(--tblr-dribbble-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-github{color:#fcfdfe!important;background-color:RGBA(var(--tblr-github-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-instagram{color:#fcfdfe!important;background-color:RGBA(var(--tblr-instagram-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-pinterest{color:#fcfdfe!important;background-color:RGBA(var(--tblr-pinterest-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-vk{color:#fcfdfe!important;background-color:RGBA(var(--tblr-vk-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-rss{color:#fcfdfe!important;background-color:RGBA(var(--tblr-rss-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-flickr{color:#fcfdfe!important;background-color:RGBA(var(--tblr-flickr-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-bitbucket{color:#fcfdfe!important;background-color:RGBA(var(--tblr-bitbucket-rgb),var(--tblr-bg-opacity, 1))!important}.text-bg-tabler{color:#fcfdfe!important;background-color:RGBA(var(--tblr-tabler-rgb),var(--tblr-bg-opacity, 1))!important}.link-primary{color:RGBA(var(--tblr-primary-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-primary-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-primary:hover,.link-primary:focus{color:RGBA(0,106,100,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(0,106,100,var(--tblr-link-underline-opacity, 1))!important}.link-secondary{color:RGBA(var(--tblr-secondary-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-secondary-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-secondary:hover,.link-secondary:focus{color:RGBA(82,92,104,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(82,92,104,var(--tblr-link-underline-opacity, 1))!important}.link-success{color:RGBA(var(--tblr-success-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-success-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-success:hover,.link-success:focus{color:RGBA(38,143,54,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(38,143,54,var(--tblr-link-underline-opacity, 1))!important}.link-info{color:RGBA(var(--tblr-info-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-info-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-info:hover,.link-info:focus{color:RGBA(53,122,180,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(53,122,180,var(--tblr-link-underline-opacity, 1))!important}.link-warning{color:RGBA(var(--tblr-warning-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-warning-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-warning:hover,.link-warning:focus{color:RGBA(198,82,6,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(198,82,6,var(--tblr-link-underline-opacity, 1))!important}.link-danger{color:RGBA(var(--tblr-danger-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-danger-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-danger:hover,.link-danger:focus{color:RGBA(171,46,46,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(171,46,46,var(--tblr-link-underline-opacity, 1))!important}.link-light{color:RGBA(var(--tblr-light-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-light-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-light:hover,.link-light:focus{color:RGBA(253,253,254,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(253,253,254,var(--tblr-link-underline-opacity, 1))!important}.link-dark{color:RGBA(var(--tblr-dark-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-dark-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-dark:hover,.link-dark:focus{color:RGBA(19,29,41,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(19,29,41,var(--tblr-link-underline-opacity, 1))!important}.link-muted{color:RGBA(var(--tblr-muted-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-muted-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-muted:hover,.link-muted:focus{color:RGBA(82,92,104,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(82,92,104,var(--tblr-link-underline-opacity, 1))!important}.link-blue{color:RGBA(var(--tblr-blue-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-blue-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-blue:hover,.link-blue:focus{color:RGBA(0,67,133,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(0,67,133,var(--tblr-link-underline-opacity, 1))!important}.link-azure{color:RGBA(var(--tblr-azure-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-azure-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-azure:hover,.link-azure:focus{color:RGBA(53,122,180,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(53,122,180,var(--tblr-link-underline-opacity, 1))!important}.link-indigo{color:RGBA(var(--tblr-indigo-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-indigo-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-indigo:hover,.link-indigo:focus{color:RGBA(53,79,188,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(53,79,188,var(--tblr-link-underline-opacity, 1))!important}.link-purple{color:RGBA(var(--tblr-purple-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-purple-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-purple:hover,.link-purple:focus{color:RGBA(139,50,161,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(139,50,161,var(--tblr-link-underline-opacity, 1))!important}.link-pink{color:RGBA(var(--tblr-pink-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-pink-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-pink:hover,.link-pink:focus{color:RGBA(171,41,86,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(171,41,86,var(--tblr-link-underline-opacity, 1))!important}.link-red{color:RGBA(var(--tblr-red-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-red-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-red:hover,.link-red:focus{color:RGBA(171,46,46,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(171,46,46,var(--tblr-link-underline-opacity, 1))!important}.link-orange{color:RGBA(var(--tblr-orange-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-orange-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-orange:hover,.link-orange:focus{color:RGBA(198,82,6,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(198,82,6,var(--tblr-link-underline-opacity, 1))!important}.link-yellow{color:RGBA(var(--tblr-yellow-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-yellow-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-yellow:hover,.link-yellow:focus{color:RGBA(196,127,0,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(196,127,0,var(--tblr-link-underline-opacity, 1))!important}.link-lime{color:RGBA(var(--tblr-lime-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-lime-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-lime:hover,.link-lime:focus{color:RGBA(93,147,18,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(93,147,18,var(--tblr-link-underline-opacity, 1))!important}.link-green{color:RGBA(var(--tblr-green-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-green-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-green:hover,.link-green:focus{color:RGBA(38,143,54,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(38,143,54,var(--tblr-link-underline-opacity, 1))!important}.link-teal{color:RGBA(var(--tblr-teal-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-teal-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-teal:hover,.link-teal:focus{color:RGBA(10,133,96,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(10,133,96,var(--tblr-link-underline-opacity, 1))!important}.link-cyan{color:RGBA(var(--tblr-cyan-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-cyan-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-cyan:hover,.link-cyan:focus{color:RGBA(18,130,147,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(18,130,147,var(--tblr-link-underline-opacity, 1))!important}.link-facebook{color:RGBA(var(--tblr-facebook-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-facebook-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-facebook:hover,.link-facebook:focus{color:RGBA(19,95,194,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(19,95,194,var(--tblr-link-underline-opacity, 1))!important}.link-twitter{color:RGBA(var(--tblr-twitter-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-twitter-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-twitter:hover,.link-twitter:focus{color:RGBA(23,129,194,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(23,129,194,var(--tblr-link-underline-opacity, 1))!important}.link-linkedin{color:RGBA(var(--tblr-linkedin-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-linkedin-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-linkedin:hover,.link-linkedin:focus{color:RGBA(8,82,155,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(8,82,155,var(--tblr-link-underline-opacity, 1))!important}.link-google{color:RGBA(var(--tblr-google-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-google-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-google:hover,.link-google:focus{color:RGBA(176,62,52,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(176,62,52,var(--tblr-link-underline-opacity, 1))!important}.link-youtube{color:RGBA(var(--tblr-youtube-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-youtube-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-youtube:hover,.link-youtube:focus{color:RGBA(204,0,0,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(204,0,0,var(--tblr-link-underline-opacity, 1))!important}.link-vimeo{color:RGBA(var(--tblr-vimeo-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-vimeo-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-vimeo:hover,.link-vimeo:focus{color:RGBA(21,146,187,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(21,146,187,var(--tblr-link-underline-opacity, 1))!important}.link-dribbble{color:RGBA(var(--tblr-dribbble-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-dribbble-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-dribbble:hover,.link-dribbble:focus{color:RGBA(187,61,110,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(187,61,110,var(--tblr-link-underline-opacity, 1))!important}.link-github{color:RGBA(var(--tblr-github-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-github-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-github:hover,.link-github:focus{color:RGBA(19,18,18,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(19,18,18,var(--tblr-link-underline-opacity, 1))!important}.link-instagram{color:RGBA(var(--tblr-instagram-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-instagram-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-instagram:hover,.link-instagram:focus{color:RGBA(182,51,76,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(182,51,76,var(--tblr-link-underline-opacity, 1))!important}.link-pinterest{color:RGBA(var(--tblr-pinterest-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-pinterest-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-pinterest:hover,.link-pinterest:focus{color:RGBA(151,6,22,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(151,6,22,var(--tblr-link-underline-opacity, 1))!important}.link-vk{color:RGBA(var(--tblr-vk-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-vk-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-vk:hover,.link-vk:focus{color:RGBA(79,105,134,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(79,105,134,var(--tblr-link-underline-opacity, 1))!important}.link-rss{color:RGBA(var(--tblr-rss-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-rss-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-rss:hover,.link-rss:focus{color:RGBA(204,132,0,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(204,132,0,var(--tblr-link-underline-opacity, 1))!important}.link-flickr{color:RGBA(var(--tblr-flickr-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-flickr-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-flickr:hover,.link-flickr:focus{color:RGBA(0,79,176,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(0,79,176,var(--tblr-link-underline-opacity, 1))!important}.link-bitbucket{color:RGBA(var(--tblr-bitbucket-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-bitbucket-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-bitbucket:hover,.link-bitbucket:focus{color:RGBA(0,66,163,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(0,66,163,var(--tblr-link-underline-opacity, 1))!important}.link-tabler{color:RGBA(var(--tblr-tabler-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-tabler-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-tabler:hover,.link-tabler:focus{color:RGBA(0,67,133,var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(0,67,133,var(--tblr-link-underline-opacity, 1))!important}.link-body-emphasis{color:RGBA(var(--tblr-emphasis-color-rgb),var(--tblr-link-opacity, 1))!important;text-decoration-color:RGBA(var(--tblr-emphasis-color-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--tblr-emphasis-color-rgb),var(--tblr-link-opacity, .75))!important;text-decoration-color:RGBA(var(--tblr-emphasis-color-rgb),var(--tblr-link-underline-opacity, .75))!important}.focus-ring:focus{outline:0;box-shadow:var(--tblr-focus-ring-x, 0) var(--tblr-focus-ring-y, 0) var(--tblr-focus-ring-blur, 0) var(--tblr-focus-ring-width) var(--tblr-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;text-decoration-color:rgba(var(--tblr-link-color-rgb),var(--tblr-link-opacity, .5));text-underline-offset:.25em;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--tblr-icon-link-transform, translate3d(.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio:before{display:block;padding-top:var(--tblr-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--tblr-aspect-ratio: 100%}.ratio-2x1{--tblr-aspect-ratio: 50%}.ratio-1x2{--tblr-aspect-ratio: 200%}.ratio-3x1{--tblr-aspect-ratio: 33.3333333333%}.ratio-1x3{--tblr-aspect-ratio: 300%}.ratio-4x3{--tblr-aspect-ratio: 75%}.ratio-3x4{--tblr-aspect-ratio: 133.3333333333%}.ratio-16x9{--tblr-aspect-ratio: 56.25%}.ratio-9x16{--tblr-aspect-ratio: 177.7777777778%}.ratio-21x9{--tblr-aspect-ratio: 42.8571428571%}.ratio-9x21{--tblr-aspect-ratio: 233.3333333333%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media (min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media (min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute!important}.stretched-link:after{position:absolute;inset:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--tblr-border-width);min-height:1em;background-color:currentcolor;opacity:.16}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{object-fit:contain!important}.object-fit-cover{object-fit:cover!important}.object-fit-fill{object-fit:fill!important}.object-fit-scale{object-fit:scale-down!important}.object-fit-none{object-fit:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--tblr-box-shadow)!important}.shadow-sm{box-shadow:var(--tblr-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--tblr-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--tblr-focus-ring-color: rgba(var(--tblr-primary-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-secondary{--tblr-focus-ring-color: rgba(var(--tblr-secondary-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-success{--tblr-focus-ring-color: rgba(var(--tblr-success-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-info{--tblr-focus-ring-color: rgba(var(--tblr-info-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-warning{--tblr-focus-ring-color: rgba(var(--tblr-warning-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-danger{--tblr-focus-ring-color: rgba(var(--tblr-danger-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-light{--tblr-focus-ring-color: rgba(var(--tblr-light-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-dark{--tblr-focus-ring-color: rgba(var(--tblr-dark-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-muted{--tblr-focus-ring-color: rgba(var(--tblr-muted-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-blue{--tblr-focus-ring-color: rgba(var(--tblr-blue-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-azure{--tblr-focus-ring-color: rgba(var(--tblr-azure-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-indigo{--tblr-focus-ring-color: rgba(var(--tblr-indigo-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-purple{--tblr-focus-ring-color: rgba(var(--tblr-purple-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-pink{--tblr-focus-ring-color: rgba(var(--tblr-pink-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-red{--tblr-focus-ring-color: rgba(var(--tblr-red-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-orange{--tblr-focus-ring-color: rgba(var(--tblr-orange-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-yellow{--tblr-focus-ring-color: rgba(var(--tblr-yellow-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-lime{--tblr-focus-ring-color: rgba(var(--tblr-lime-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-green{--tblr-focus-ring-color: rgba(var(--tblr-green-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-teal{--tblr-focus-ring-color: rgba(var(--tblr-teal-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-cyan{--tblr-focus-ring-color: rgba(var(--tblr-cyan-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-facebook{--tblr-focus-ring-color: rgba(var(--tblr-facebook-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-twitter{--tblr-focus-ring-color: rgba(var(--tblr-twitter-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-linkedin{--tblr-focus-ring-color: rgba(var(--tblr-linkedin-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-google{--tblr-focus-ring-color: rgba(var(--tblr-google-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-youtube{--tblr-focus-ring-color: rgba(var(--tblr-youtube-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-vimeo{--tblr-focus-ring-color: rgba(var(--tblr-vimeo-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-dribbble{--tblr-focus-ring-color: rgba(var(--tblr-dribbble-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-github{--tblr-focus-ring-color: rgba(var(--tblr-github-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-instagram{--tblr-focus-ring-color: rgba(var(--tblr-instagram-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-pinterest{--tblr-focus-ring-color: rgba(var(--tblr-pinterest-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-vk{--tblr-focus-ring-color: rgba(var(--tblr-vk-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-rss{--tblr-focus-ring-color: rgba(var(--tblr-rss-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-flickr{--tblr-focus-ring-color: rgba(var(--tblr-flickr-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-bitbucket{--tblr-focus-ring-color: rgba(var(--tblr-bitbucket-rgb), var(--tblr-focus-ring-opacity))}.focus-ring-tabler{--tblr-focus-ring-color: rgba(var(--tblr-tabler-rgb), var(--tblr-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translate(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-wide{border:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-0{border:0!important}.border-top{border-top:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-top-wide{border-top:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-end-wide{border-right:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-bottom-wide{border-bottom:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-start-wide{border-left:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-start-0{border-left:0!important}.border-primary{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-primary-rgb),var(--tblr-border-opacity))!important}.border-secondary{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-secondary-rgb),var(--tblr-border-opacity))!important}.border-success{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-success-rgb),var(--tblr-border-opacity))!important}.border-info{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-info-rgb),var(--tblr-border-opacity))!important}.border-warning{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-warning-rgb),var(--tblr-border-opacity))!important}.border-danger{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-danger-rgb),var(--tblr-border-opacity))!important}.border-light{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-light-rgb),var(--tblr-border-opacity))!important}.border-dark{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-dark-rgb),var(--tblr-border-opacity))!important}.border-muted{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-muted-rgb),var(--tblr-border-opacity))!important}.border-blue{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-blue-rgb),var(--tblr-border-opacity))!important}.border-azure{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-azure-rgb),var(--tblr-border-opacity))!important}.border-indigo{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-indigo-rgb),var(--tblr-border-opacity))!important}.border-purple{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-purple-rgb),var(--tblr-border-opacity))!important}.border-pink{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-pink-rgb),var(--tblr-border-opacity))!important}.border-red{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-red-rgb),var(--tblr-border-opacity))!important}.border-orange{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-orange-rgb),var(--tblr-border-opacity))!important}.border-yellow{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-yellow-rgb),var(--tblr-border-opacity))!important}.border-lime{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-lime-rgb),var(--tblr-border-opacity))!important}.border-green{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-green-rgb),var(--tblr-border-opacity))!important}.border-teal{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-teal-rgb),var(--tblr-border-opacity))!important}.border-cyan{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-cyan-rgb),var(--tblr-border-opacity))!important}.border-facebook{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-facebook-rgb),var(--tblr-border-opacity))!important}.border-twitter{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-twitter-rgb),var(--tblr-border-opacity))!important}.border-linkedin{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-linkedin-rgb),var(--tblr-border-opacity))!important}.border-google{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-google-rgb),var(--tblr-border-opacity))!important}.border-youtube{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-youtube-rgb),var(--tblr-border-opacity))!important}.border-vimeo{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-vimeo-rgb),var(--tblr-border-opacity))!important}.border-dribbble{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-dribbble-rgb),var(--tblr-border-opacity))!important}.border-github{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-github-rgb),var(--tblr-border-opacity))!important}.border-instagram{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-instagram-rgb),var(--tblr-border-opacity))!important}.border-pinterest{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-pinterest-rgb),var(--tblr-border-opacity))!important}.border-vk{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-vk-rgb),var(--tblr-border-opacity))!important}.border-rss{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-rss-rgb),var(--tblr-border-opacity))!important}.border-flickr{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-flickr-rgb),var(--tblr-border-opacity))!important}.border-bitbucket{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-border-opacity))!important}.border-tabler{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-tabler-rgb),var(--tblr-border-opacity))!important}.border-black{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-black-rgb),var(--tblr-border-opacity))!important}.border-white{--tblr-border-opacity: 1;border-color:rgba(var(--tblr-white-rgb),var(--tblr-border-opacity))!important}.border-primary-subtle{border-color:var(--tblr-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--tblr-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--tblr-success-border-subtle)!important}.border-info-subtle{border-color:var(--tblr-info-border-subtle)!important}.border-warning-subtle{border-color:var(--tblr-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--tblr-danger-border-subtle)!important}.border-light-subtle{border-color:var(--tblr-light-border-subtle)!important}.border-dark-subtle{border-color:var(--tblr-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--tblr-border-opacity: .1}.border-opacity-25{--tblr-border-opacity: .25}.border-opacity-50{--tblr-border-opacity: .5}.border-opacity-75{--tblr-border-opacity: .75}.border-opacity-100{--tblr-border-opacity: 1}.w-25{width:25%!important}.w-33{width:33.33333%!important}.w-50{width:50%!important}.w-66{width:66.66666%!important}.w-75{width:75%!important}.w-100{width:100%!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-33{height:33.33333%!important}.h-50{height:50%!important}.h-66{height:66.66666%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:2rem!important}.m-6{margin:3rem!important}.m-7{margin:5rem!important}.m-8{margin:8rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:2rem!important;margin-left:2rem!important}.mx-6{margin-right:3rem!important;margin-left:3rem!important}.mx-7{margin-right:5rem!important;margin-left:5rem!important}.mx-8{margin-right:8rem!important;margin-left:8rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-6{margin-top:3rem!important;margin-bottom:3rem!important}.my-7{margin-top:5rem!important;margin-bottom:5rem!important}.my-8{margin-top:8rem!important;margin-bottom:8rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:2rem!important}.mt-6{margin-top:3rem!important}.mt-7{margin-top:5rem!important}.mt-8{margin-top:8rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:2rem!important}.me-6{margin-right:3rem!important}.me-7{margin-right:5rem!important}.me-8{margin-right:8rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:2rem!important}.mb-6{margin-bottom:3rem!important}.mb-7{margin-bottom:5rem!important}.mb-8{margin-bottom:8rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:2rem!important}.ms-6{margin-left:3rem!important}.ms-7{margin-left:5rem!important}.ms-8{margin-left:8rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:2rem!important}.p-6{padding:3rem!important}.p-7{padding:5rem!important}.p-8{padding:8rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:2rem!important;padding-left:2rem!important}.px-6{padding-right:3rem!important;padding-left:3rem!important}.px-7{padding-right:5rem!important;padding-left:5rem!important}.px-8{padding-right:8rem!important;padding-left:8rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-6{padding-top:3rem!important;padding-bottom:3rem!important}.py-7{padding-top:5rem!important;padding-bottom:5rem!important}.py-8{padding-top:8rem!important;padding-bottom:8rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:2rem!important}.pt-6{padding-top:3rem!important}.pt-7{padding-top:5rem!important}.pt-8{padding-top:8rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:2rem!important}.pe-6{padding-right:3rem!important}.pe-7{padding-right:5rem!important}.pe-8{padding-right:8rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:2rem!important}.pb-6{padding-bottom:3rem!important}.pb-7{padding-bottom:5rem!important}.pb-8{padding-bottom:8rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:2rem!important}.ps-6{padding-left:3rem!important}.ps-7{padding-left:5rem!important}.ps-8{padding-left:8rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:2rem!important}.gap-6{gap:3rem!important}.gap-7{gap:5rem!important}.gap-8{gap:8rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:2rem!important}.row-gap-6{row-gap:3rem!important}.row-gap-7{row-gap:5rem!important}.row-gap-8{row-gap:8rem!important}.column-gap-0{column-gap:0!important}.column-gap-1{column-gap:.25rem!important}.column-gap-2{column-gap:.5rem!important}.column-gap-3{column-gap:1rem!important}.column-gap-4{column-gap:1.5rem!important}.column-gap-5{column-gap:2rem!important}.column-gap-6{column-gap:3rem!important}.column-gap-7{column-gap:5rem!important}.column-gap-8{column-gap:8rem!important}.font-monospace{font-family:var(--tblr-font-monospace)!important}.fs-1{font-size:1.5rem!important}.fs-2{font-size:1.25rem!important}.fs-3{font-size:1rem!important}.fs-4{font-size:.875rem!important}.fs-5{font-size:.75rem!important}.fs-6{font-size:.625rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold,.fw-bold{font-weight:600!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.1428571429!important}.lh-base{line-height:1.4285714286!important}.lh-lg{line-height:1.7142857143!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-muted{--tblr-text-opacity: 1;color:var(--tblr-secondary-color)!important}.text-black{--tblr-text-opacity: 1;color:rgba(var(--tblr-black-rgb),var(--tblr-text-opacity))!important}.text-white{--tblr-text-opacity: 1;color:rgba(var(--tblr-white-rgb),var(--tblr-text-opacity))!important}.text-body{--tblr-text-opacity: 1;color:rgba(var(--tblr-body-color-rgb),var(--tblr-text-opacity))!important}.text-black-50{--tblr-text-opacity: 1;color:#00000080!important}.text-white-50{--tblr-text-opacity: 1;color:#ffffff80!important}.text-body-secondary{--tblr-text-opacity: 1;color:var(--tblr-secondary-color)!important}.text-body-tertiary{--tblr-text-opacity: 1;color:var(--tblr-tertiary-color)!important}.text-body-emphasis{--tblr-text-opacity: 1;color:var(--tblr-emphasis-color)!important}.text-reset{--tblr-text-opacity: 1;color:inherit!important}.text-opacity-25{--tblr-text-opacity: .25}.text-opacity-50{--tblr-text-opacity: .5}.text-opacity-75{--tblr-text-opacity: .75}.text-opacity-100{--tblr-text-opacity: 1}.text-primary-emphasis{color:var(--tblr-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--tblr-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--tblr-success-text-emphasis)!important}.text-info-emphasis{color:var(--tblr-info-text-emphasis)!important}.text-warning-emphasis{color:var(--tblr-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--tblr-danger-text-emphasis)!important}.text-light-emphasis{color:var(--tblr-light-text-emphasis)!important}.text-dark-emphasis{color:var(--tblr-dark-text-emphasis)!important}.link-opacity-10,.link-opacity-10-hover:hover{--tblr-link-opacity: .1}.link-opacity-25,.link-opacity-25-hover:hover{--tblr-link-opacity: .25}.link-opacity-50,.link-opacity-50-hover:hover{--tblr-link-opacity: .5}.link-opacity-75,.link-opacity-75-hover:hover{--tblr-link-opacity: .75}.link-opacity-100,.link-opacity-100-hover:hover{--tblr-link-opacity: 1}.link-offset-1,.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2,.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3,.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-primary{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-primary-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-secondary{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-secondary-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-success{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-success-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-info{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-info-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-warning{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-warning-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-danger{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-danger-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-light{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-light-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-dark{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-dark-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-muted{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-muted-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-blue{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-blue-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-azure{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-azure-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-indigo{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-indigo-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-purple{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-purple-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-pink{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-pink-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-red{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-red-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-orange{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-orange-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-yellow{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-yellow-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-lime{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-lime-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-green{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-green-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-teal{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-teal-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-cyan{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-cyan-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-facebook{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-facebook-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-twitter{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-twitter-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-linkedin{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-linkedin-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-google{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-google-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-youtube{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-youtube-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-vimeo{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-vimeo-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-dribbble{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-dribbble-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-github{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-github-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-instagram{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-instagram-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-pinterest{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-pinterest-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-vk{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-vk-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-rss{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-rss-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-flickr{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-flickr-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-bitbucket{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-link-underline-opacity))!important}.link-underline-tabler{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-tabler-rgb),var(--tblr-link-underline-opacity))!important}.link-underline{--tblr-link-underline-opacity: 1;text-decoration-color:rgba(var(--tblr-link-color-rgb),var(--tblr-link-underline-opacity, 1))!important}.link-underline-opacity-0,.link-underline-opacity-0-hover:hover{--tblr-link-underline-opacity: 0}.link-underline-opacity-10,.link-underline-opacity-10-hover:hover{--tblr-link-underline-opacity: .1}.link-underline-opacity-25,.link-underline-opacity-25-hover:hover{--tblr-link-underline-opacity: .25}.link-underline-opacity-50,.link-underline-opacity-50-hover:hover{--tblr-link-underline-opacity: .5}.link-underline-opacity-75,.link-underline-opacity-75-hover:hover{--tblr-link-underline-opacity: .75}.link-underline-opacity-100,.link-underline-opacity-100-hover:hover{--tblr-link-underline-opacity: 1}.bg-black{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-black-rgb),var(--tblr-bg-opacity))!important}.bg-body{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-body-bg-rgb),var(--tblr-bg-opacity))!important}.bg-transparent{--tblr-bg-opacity: 1;background-color:transparent!important}.bg-body-secondary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-secondary-bg-rgb),var(--tblr-bg-opacity))!important}.bg-body-tertiary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-tertiary-bg-rgb),var(--tblr-bg-opacity))!important}.bg-opacity-10{--tblr-bg-opacity: .1}.bg-opacity-25{--tblr-bg-opacity: .25}.bg-opacity-50{--tblr-bg-opacity: .5}.bg-opacity-75{--tblr-bg-opacity: .75}.bg-opacity-100{--tblr-bg-opacity: 1}.bg-primary-subtle{background-color:var(--tblr-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--tblr-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--tblr-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--tblr-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--tblr-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--tblr-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--tblr-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--tblr-dark-bg-subtle)!important}.bg-gradient{background-image:var(--tblr-gradient)!important}.user-select-all{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--tblr-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--tblr-border-radius-sm)!important}.rounded-2{border-radius:var(--tblr-border-radius)!important}.rounded-3{border-radius:var(--tblr-border-radius-lg)!important}.rounded-4{border-radius:var(--tblr-border-radius-xl)!important}.rounded-5{border-radius:var(--tblr-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--tblr-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--tblr-border-radius)!important;border-top-right-radius:var(--tblr-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--tblr-border-radius-sm)!important;border-top-right-radius:var(--tblr-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--tblr-border-radius)!important;border-top-right-radius:var(--tblr-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--tblr-border-radius-lg)!important;border-top-right-radius:var(--tblr-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--tblr-border-radius-xl)!important;border-top-right-radius:var(--tblr-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--tblr-border-radius-xxl)!important;border-top-right-radius:var(--tblr-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--tblr-border-radius-pill)!important;border-top-right-radius:var(--tblr-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--tblr-border-radius)!important;border-bottom-right-radius:var(--tblr-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--tblr-border-radius-sm)!important;border-bottom-right-radius:var(--tblr-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--tblr-border-radius)!important;border-bottom-right-radius:var(--tblr-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--tblr-border-radius-lg)!important;border-bottom-right-radius:var(--tblr-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--tblr-border-radius-xl)!important;border-bottom-right-radius:var(--tblr-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--tblr-border-radius-xxl)!important;border-bottom-right-radius:var(--tblr-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--tblr-border-radius-pill)!important;border-bottom-right-radius:var(--tblr-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--tblr-border-radius)!important;border-bottom-left-radius:var(--tblr-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--tblr-border-radius-sm)!important;border-bottom-left-radius:var(--tblr-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--tblr-border-radius)!important;border-bottom-left-radius:var(--tblr-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--tblr-border-radius-lg)!important;border-bottom-left-radius:var(--tblr-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--tblr-border-radius-xl)!important;border-bottom-left-radius:var(--tblr-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--tblr-border-radius-xxl)!important;border-bottom-left-radius:var(--tblr-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--tblr-border-radius-pill)!important;border-bottom-left-radius:var(--tblr-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--tblr-border-radius)!important;border-top-left-radius:var(--tblr-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--tblr-border-radius-sm)!important;border-top-left-radius:var(--tblr-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--tblr-border-radius)!important;border-top-left-radius:var(--tblr-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--tblr-border-radius-lg)!important;border-top-left-radius:var(--tblr-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--tblr-border-radius-xl)!important;border-top-left-radius:var(--tblr-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--tblr-border-radius-xxl)!important;border-top-left-radius:var(--tblr-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--tblr-border-radius-pill)!important;border-top-left-radius:var(--tblr-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}.object-contain{object-fit:contain!important}.object-cover{object-fit:cover!important}.object-fill{object-fit:fill!important}.object-scale-down{object-fit:scale-down!important}.object-none{object-fit:none!important}.tracking-tight{letter-spacing:-.05em!important}.tracking-normal{letter-spacing:0!important}.tracking-wide{letter-spacing:.05em!important}.cursor-auto{cursor:auto!important}.cursor-pointer{cursor:pointer!important}.cursor-move{cursor:move!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-zoom-in{cursor:zoom-in!important}.cursor-zoom-out{cursor:zoom-out!important}.cursor-default{cursor:default!important}.cursor-none{cursor:none!important}.cursor-help{cursor:help!important}.cursor-progress{cursor:progress!important}.cursor-wait{cursor:wait!important}.cursor-text{cursor:text!important}.cursor-v-text{cursor:vertical-text!important}.cursor-grab{cursor:grab!important}.cursor-grabbing{cursor:grabbing!important}.border-x{border-left:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important;border-right:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-x-wide{border-left:2px var(--tblr-border-style) rgba(4,32,69,.14)!important;border-right:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-x-0{border-left:0!important;border-right:0!important}.border-y{border-top:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important;border-bottom:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-y-wide{border-top:2px var(--tblr-border-style) rgba(4,32,69,.14)!important;border-bottom:2px var(--tblr-border-style) rgba(4,32,69,.14)!important}.border-y-0{border-top:0!important;border-bottom:0!important}.columns-2{columns:2!important}.columns-3{columns:3!important}.columns-4{columns:4!important}@media (min-width: 576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{object-fit:contain!important}.object-fit-sm-cover{object-fit:cover!important}.object-fit-sm-fill{object-fit:fill!important}.object-fit-sm-scale{object-fit:scale-down!important}.object-fit-sm-none{object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:2rem!important}.m-sm-6{margin:3rem!important}.m-sm-7{margin:5rem!important}.m-sm-8{margin:8rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:2rem!important;margin-left:2rem!important}.mx-sm-6{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-7{margin-right:5rem!important;margin-left:5rem!important}.mx-sm-8{margin-right:8rem!important;margin-left:8rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-sm-6{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-7{margin-top:5rem!important;margin-bottom:5rem!important}.my-sm-8{margin-top:8rem!important;margin-bottom:8rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:2rem!important}.mt-sm-6{margin-top:3rem!important}.mt-sm-7{margin-top:5rem!important}.mt-sm-8{margin-top:8rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:2rem!important}.me-sm-6{margin-right:3rem!important}.me-sm-7{margin-right:5rem!important}.me-sm-8{margin-right:8rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:2rem!important}.mb-sm-6{margin-bottom:3rem!important}.mb-sm-7{margin-bottom:5rem!important}.mb-sm-8{margin-bottom:8rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:2rem!important}.ms-sm-6{margin-left:3rem!important}.ms-sm-7{margin-left:5rem!important}.ms-sm-8{margin-left:8rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:2rem!important}.p-sm-6{padding:3rem!important}.p-sm-7{padding:5rem!important}.p-sm-8{padding:8rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:2rem!important;padding-left:2rem!important}.px-sm-6{padding-right:3rem!important;padding-left:3rem!important}.px-sm-7{padding-right:5rem!important;padding-left:5rem!important}.px-sm-8{padding-right:8rem!important;padding-left:8rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-sm-6{padding-top:3rem!important;padding-bottom:3rem!important}.py-sm-7{padding-top:5rem!important;padding-bottom:5rem!important}.py-sm-8{padding-top:8rem!important;padding-bottom:8rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:2rem!important}.pt-sm-6{padding-top:3rem!important}.pt-sm-7{padding-top:5rem!important}.pt-sm-8{padding-top:8rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:2rem!important}.pe-sm-6{padding-right:3rem!important}.pe-sm-7{padding-right:5rem!important}.pe-sm-8{padding-right:8rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:2rem!important}.pb-sm-6{padding-bottom:3rem!important}.pb-sm-7{padding-bottom:5rem!important}.pb-sm-8{padding-bottom:8rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:2rem!important}.ps-sm-6{padding-left:3rem!important}.ps-sm-7{padding-left:5rem!important}.ps-sm-8{padding-left:8rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:2rem!important}.gap-sm-6{gap:3rem!important}.gap-sm-7{gap:5rem!important}.gap-sm-8{gap:8rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:2rem!important}.row-gap-sm-6{row-gap:3rem!important}.row-gap-sm-7{row-gap:5rem!important}.row-gap-sm-8{row-gap:8rem!important}.column-gap-sm-0{column-gap:0!important}.column-gap-sm-1{column-gap:.25rem!important}.column-gap-sm-2{column-gap:.5rem!important}.column-gap-sm-3{column-gap:1rem!important}.column-gap-sm-4{column-gap:1.5rem!important}.column-gap-sm-5{column-gap:2rem!important}.column-gap-sm-6{column-gap:3rem!important}.column-gap-sm-7{column-gap:5rem!important}.column-gap-sm-8{column-gap:8rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}.columns-sm-2{columns:2!important}.columns-sm-3{columns:3!important}.columns-sm-4{columns:4!important}}@media (min-width: 768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{object-fit:contain!important}.object-fit-md-cover{object-fit:cover!important}.object-fit-md-fill{object-fit:fill!important}.object-fit-md-scale{object-fit:scale-down!important}.object-fit-md-none{object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:2rem!important}.m-md-6{margin:3rem!important}.m-md-7{margin:5rem!important}.m-md-8{margin:8rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:2rem!important;margin-left:2rem!important}.mx-md-6{margin-right:3rem!important;margin-left:3rem!important}.mx-md-7{margin-right:5rem!important;margin-left:5rem!important}.mx-md-8{margin-right:8rem!important;margin-left:8rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-md-6{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-7{margin-top:5rem!important;margin-bottom:5rem!important}.my-md-8{margin-top:8rem!important;margin-bottom:8rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:2rem!important}.mt-md-6{margin-top:3rem!important}.mt-md-7{margin-top:5rem!important}.mt-md-8{margin-top:8rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:2rem!important}.me-md-6{margin-right:3rem!important}.me-md-7{margin-right:5rem!important}.me-md-8{margin-right:8rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:2rem!important}.mb-md-6{margin-bottom:3rem!important}.mb-md-7{margin-bottom:5rem!important}.mb-md-8{margin-bottom:8rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:2rem!important}.ms-md-6{margin-left:3rem!important}.ms-md-7{margin-left:5rem!important}.ms-md-8{margin-left:8rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:2rem!important}.p-md-6{padding:3rem!important}.p-md-7{padding:5rem!important}.p-md-8{padding:8rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:2rem!important;padding-left:2rem!important}.px-md-6{padding-right:3rem!important;padding-left:3rem!important}.px-md-7{padding-right:5rem!important;padding-left:5rem!important}.px-md-8{padding-right:8rem!important;padding-left:8rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-md-6{padding-top:3rem!important;padding-bottom:3rem!important}.py-md-7{padding-top:5rem!important;padding-bottom:5rem!important}.py-md-8{padding-top:8rem!important;padding-bottom:8rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:2rem!important}.pt-md-6{padding-top:3rem!important}.pt-md-7{padding-top:5rem!important}.pt-md-8{padding-top:8rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:2rem!important}.pe-md-6{padding-right:3rem!important}.pe-md-7{padding-right:5rem!important}.pe-md-8{padding-right:8rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:2rem!important}.pb-md-6{padding-bottom:3rem!important}.pb-md-7{padding-bottom:5rem!important}.pb-md-8{padding-bottom:8rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:2rem!important}.ps-md-6{padding-left:3rem!important}.ps-md-7{padding-left:5rem!important}.ps-md-8{padding-left:8rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:2rem!important}.gap-md-6{gap:3rem!important}.gap-md-7{gap:5rem!important}.gap-md-8{gap:8rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:2rem!important}.row-gap-md-6{row-gap:3rem!important}.row-gap-md-7{row-gap:5rem!important}.row-gap-md-8{row-gap:8rem!important}.column-gap-md-0{column-gap:0!important}.column-gap-md-1{column-gap:.25rem!important}.column-gap-md-2{column-gap:.5rem!important}.column-gap-md-3{column-gap:1rem!important}.column-gap-md-4{column-gap:1.5rem!important}.column-gap-md-5{column-gap:2rem!important}.column-gap-md-6{column-gap:3rem!important}.column-gap-md-7{column-gap:5rem!important}.column-gap-md-8{column-gap:8rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}.columns-md-2{columns:2!important}.columns-md-3{columns:3!important}.columns-md-4{columns:4!important}}@media (min-width: 992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{object-fit:contain!important}.object-fit-lg-cover{object-fit:cover!important}.object-fit-lg-fill{object-fit:fill!important}.object-fit-lg-scale{object-fit:scale-down!important}.object-fit-lg-none{object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:2rem!important}.m-lg-6{margin:3rem!important}.m-lg-7{margin:5rem!important}.m-lg-8{margin:8rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:2rem!important;margin-left:2rem!important}.mx-lg-6{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-7{margin-right:5rem!important;margin-left:5rem!important}.mx-lg-8{margin-right:8rem!important;margin-left:8rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-lg-6{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-7{margin-top:5rem!important;margin-bottom:5rem!important}.my-lg-8{margin-top:8rem!important;margin-bottom:8rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:2rem!important}.mt-lg-6{margin-top:3rem!important}.mt-lg-7{margin-top:5rem!important}.mt-lg-8{margin-top:8rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:2rem!important}.me-lg-6{margin-right:3rem!important}.me-lg-7{margin-right:5rem!important}.me-lg-8{margin-right:8rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:2rem!important}.mb-lg-6{margin-bottom:3rem!important}.mb-lg-7{margin-bottom:5rem!important}.mb-lg-8{margin-bottom:8rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:2rem!important}.ms-lg-6{margin-left:3rem!important}.ms-lg-7{margin-left:5rem!important}.ms-lg-8{margin-left:8rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:2rem!important}.p-lg-6{padding:3rem!important}.p-lg-7{padding:5rem!important}.p-lg-8{padding:8rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:2rem!important;padding-left:2rem!important}.px-lg-6{padding-right:3rem!important;padding-left:3rem!important}.px-lg-7{padding-right:5rem!important;padding-left:5rem!important}.px-lg-8{padding-right:8rem!important;padding-left:8rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-lg-6{padding-top:3rem!important;padding-bottom:3rem!important}.py-lg-7{padding-top:5rem!important;padding-bottom:5rem!important}.py-lg-8{padding-top:8rem!important;padding-bottom:8rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:2rem!important}.pt-lg-6{padding-top:3rem!important}.pt-lg-7{padding-top:5rem!important}.pt-lg-8{padding-top:8rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:2rem!important}.pe-lg-6{padding-right:3rem!important}.pe-lg-7{padding-right:5rem!important}.pe-lg-8{padding-right:8rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:2rem!important}.pb-lg-6{padding-bottom:3rem!important}.pb-lg-7{padding-bottom:5rem!important}.pb-lg-8{padding-bottom:8rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:2rem!important}.ps-lg-6{padding-left:3rem!important}.ps-lg-7{padding-left:5rem!important}.ps-lg-8{padding-left:8rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:2rem!important}.gap-lg-6{gap:3rem!important}.gap-lg-7{gap:5rem!important}.gap-lg-8{gap:8rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:2rem!important}.row-gap-lg-6{row-gap:3rem!important}.row-gap-lg-7{row-gap:5rem!important}.row-gap-lg-8{row-gap:8rem!important}.column-gap-lg-0{column-gap:0!important}.column-gap-lg-1{column-gap:.25rem!important}.column-gap-lg-2{column-gap:.5rem!important}.column-gap-lg-3{column-gap:1rem!important}.column-gap-lg-4{column-gap:1.5rem!important}.column-gap-lg-5{column-gap:2rem!important}.column-gap-lg-6{column-gap:3rem!important}.column-gap-lg-7{column-gap:5rem!important}.column-gap-lg-8{column-gap:8rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}.columns-lg-2{columns:2!important}.columns-lg-3{columns:3!important}.columns-lg-4{columns:4!important}}@media (min-width: 1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{object-fit:contain!important}.object-fit-xl-cover{object-fit:cover!important}.object-fit-xl-fill{object-fit:fill!important}.object-fit-xl-scale{object-fit:scale-down!important}.object-fit-xl-none{object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:2rem!important}.m-xl-6{margin:3rem!important}.m-xl-7{margin:5rem!important}.m-xl-8{margin:8rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:2rem!important;margin-left:2rem!important}.mx-xl-6{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-7{margin-right:5rem!important;margin-left:5rem!important}.mx-xl-8{margin-right:8rem!important;margin-left:8rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-xl-6{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-7{margin-top:5rem!important;margin-bottom:5rem!important}.my-xl-8{margin-top:8rem!important;margin-bottom:8rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:2rem!important}.mt-xl-6{margin-top:3rem!important}.mt-xl-7{margin-top:5rem!important}.mt-xl-8{margin-top:8rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:2rem!important}.me-xl-6{margin-right:3rem!important}.me-xl-7{margin-right:5rem!important}.me-xl-8{margin-right:8rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:2rem!important}.mb-xl-6{margin-bottom:3rem!important}.mb-xl-7{margin-bottom:5rem!important}.mb-xl-8{margin-bottom:8rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:2rem!important}.ms-xl-6{margin-left:3rem!important}.ms-xl-7{margin-left:5rem!important}.ms-xl-8{margin-left:8rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:2rem!important}.p-xl-6{padding:3rem!important}.p-xl-7{padding:5rem!important}.p-xl-8{padding:8rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:2rem!important;padding-left:2rem!important}.px-xl-6{padding-right:3rem!important;padding-left:3rem!important}.px-xl-7{padding-right:5rem!important;padding-left:5rem!important}.px-xl-8{padding-right:8rem!important;padding-left:8rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-xl-6{padding-top:3rem!important;padding-bottom:3rem!important}.py-xl-7{padding-top:5rem!important;padding-bottom:5rem!important}.py-xl-8{padding-top:8rem!important;padding-bottom:8rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:2rem!important}.pt-xl-6{padding-top:3rem!important}.pt-xl-7{padding-top:5rem!important}.pt-xl-8{padding-top:8rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:2rem!important}.pe-xl-6{padding-right:3rem!important}.pe-xl-7{padding-right:5rem!important}.pe-xl-8{padding-right:8rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:2rem!important}.pb-xl-6{padding-bottom:3rem!important}.pb-xl-7{padding-bottom:5rem!important}.pb-xl-8{padding-bottom:8rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:2rem!important}.ps-xl-6{padding-left:3rem!important}.ps-xl-7{padding-left:5rem!important}.ps-xl-8{padding-left:8rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:2rem!important}.gap-xl-6{gap:3rem!important}.gap-xl-7{gap:5rem!important}.gap-xl-8{gap:8rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:2rem!important}.row-gap-xl-6{row-gap:3rem!important}.row-gap-xl-7{row-gap:5rem!important}.row-gap-xl-8{row-gap:8rem!important}.column-gap-xl-0{column-gap:0!important}.column-gap-xl-1{column-gap:.25rem!important}.column-gap-xl-2{column-gap:.5rem!important}.column-gap-xl-3{column-gap:1rem!important}.column-gap-xl-4{column-gap:1.5rem!important}.column-gap-xl-5{column-gap:2rem!important}.column-gap-xl-6{column-gap:3rem!important}.column-gap-xl-7{column-gap:5rem!important}.column-gap-xl-8{column-gap:8rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}.columns-xl-2{columns:2!important}.columns-xl-3{columns:3!important}.columns-xl-4{columns:4!important}}@media (min-width: 1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{object-fit:contain!important}.object-fit-xxl-cover{object-fit:cover!important}.object-fit-xxl-fill{object-fit:fill!important}.object-fit-xxl-scale{object-fit:scale-down!important}.object-fit-xxl-none{object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:2rem!important}.m-xxl-6{margin:3rem!important}.m-xxl-7{margin:5rem!important}.m-xxl-8{margin:8rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:2rem!important;margin-left:2rem!important}.mx-xxl-6{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-7{margin-right:5rem!important;margin-left:5rem!important}.mx-xxl-8{margin-right:8rem!important;margin-left:8rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:2rem!important;margin-bottom:2rem!important}.my-xxl-6{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-7{margin-top:5rem!important;margin-bottom:5rem!important}.my-xxl-8{margin-top:8rem!important;margin-bottom:8rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:2rem!important}.mt-xxl-6{margin-top:3rem!important}.mt-xxl-7{margin-top:5rem!important}.mt-xxl-8{margin-top:8rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:2rem!important}.me-xxl-6{margin-right:3rem!important}.me-xxl-7{margin-right:5rem!important}.me-xxl-8{margin-right:8rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:2rem!important}.mb-xxl-6{margin-bottom:3rem!important}.mb-xxl-7{margin-bottom:5rem!important}.mb-xxl-8{margin-bottom:8rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:2rem!important}.ms-xxl-6{margin-left:3rem!important}.ms-xxl-7{margin-left:5rem!important}.ms-xxl-8{margin-left:8rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:2rem!important}.p-xxl-6{padding:3rem!important}.p-xxl-7{padding:5rem!important}.p-xxl-8{padding:8rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:2rem!important;padding-left:2rem!important}.px-xxl-6{padding-right:3rem!important;padding-left:3rem!important}.px-xxl-7{padding-right:5rem!important;padding-left:5rem!important}.px-xxl-8{padding-right:8rem!important;padding-left:8rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:2rem!important;padding-bottom:2rem!important}.py-xxl-6{padding-top:3rem!important;padding-bottom:3rem!important}.py-xxl-7{padding-top:5rem!important;padding-bottom:5rem!important}.py-xxl-8{padding-top:8rem!important;padding-bottom:8rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:2rem!important}.pt-xxl-6{padding-top:3rem!important}.pt-xxl-7{padding-top:5rem!important}.pt-xxl-8{padding-top:8rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:2rem!important}.pe-xxl-6{padding-right:3rem!important}.pe-xxl-7{padding-right:5rem!important}.pe-xxl-8{padding-right:8rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:2rem!important}.pb-xxl-6{padding-bottom:3rem!important}.pb-xxl-7{padding-bottom:5rem!important}.pb-xxl-8{padding-bottom:8rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:2rem!important}.ps-xxl-6{padding-left:3rem!important}.ps-xxl-7{padding-left:5rem!important}.ps-xxl-8{padding-left:8rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:2rem!important}.gap-xxl-6{gap:3rem!important}.gap-xxl-7{gap:5rem!important}.gap-xxl-8{gap:8rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:2rem!important}.row-gap-xxl-6{row-gap:3rem!important}.row-gap-xxl-7{row-gap:5rem!important}.row-gap-xxl-8{row-gap:8rem!important}.column-gap-xxl-0{column-gap:0!important}.column-gap-xxl-1{column-gap:.25rem!important}.column-gap-xxl-2{column-gap:.5rem!important}.column-gap-xxl-3{column-gap:1rem!important}.column-gap-xxl-4{column-gap:1.5rem!important}.column-gap-xxl-5{column-gap:2rem!important}.column-gap-xxl-6{column-gap:3rem!important}.column-gap-xxl-7{column-gap:5rem!important}.column-gap-xxl-8{column-gap:8rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}.columns-xxl-2{columns:2!important}.columns-xxl-3{columns:3!important}.columns-xxl-4{columns:4!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}:root,:host{font-size:16px;height:100%}:root,:host,[data-bs-theme=light]{--tblr-primary: #00857D;--tblr-primary-rgb: 0, 133, 125;--tblr-primary-fg: var(--tblr-light);--tblr-primary-darken: #007871;--tblr-primary-lt: #e6f3f2;--tblr-primary-lt-rgb: 230, 243, 242;--tblr-secondary: #667382;--tblr-secondary-rgb: 102, 115, 130;--tblr-secondary-fg: var(--tblr-light);--tblr-secondary-darken: #5c6875;--tblr-secondary-lt: #f0f1f3;--tblr-secondary-lt-rgb: 240, 241, 243;--tblr-success: #2fb344;--tblr-success-rgb: 47, 179, 68;--tblr-success-fg: var(--tblr-light);--tblr-success-darken: #2aa13d;--tblr-success-lt: #eaf7ec;--tblr-success-lt-rgb: 234, 247, 236;--tblr-info: #4299e1;--tblr-info-rgb: 66, 153, 225;--tblr-info-fg: var(--tblr-light);--tblr-info-darken: #3b8acb;--tblr-info-lt: #ecf5fc;--tblr-info-lt-rgb: 236, 245, 252;--tblr-warning: #f76707;--tblr-warning-rgb: 247, 103, 7;--tblr-warning-fg: var(--tblr-light);--tblr-warning-darken: #de5d06;--tblr-warning-lt: #fef0e6;--tblr-warning-lt-rgb: 254, 240, 230;--tblr-danger: #d63939;--tblr-danger-rgb: 214, 57, 57;--tblr-danger-fg: var(--tblr-light);--tblr-danger-darken: #c13333;--tblr-danger-lt: #fbebeb;--tblr-danger-lt-rgb: 251, 235, 235;--tblr-light: #fcfdfe;--tblr-light-rgb: 252, 253, 254;--tblr-light-fg: var(--tblr-dark);--tblr-light-darken: #e3e4e5;--tblr-light-lt: white;--tblr-light-lt-rgb: 255, 255, 255;--tblr-dark: #182433;--tblr-dark-rgb: 24, 36, 51;--tblr-dark-fg: var(--tblr-light);--tblr-dark-darken: #16202e;--tblr-dark-lt: #e8e9eb;--tblr-dark-lt-rgb: 232, 233, 235;--tblr-muted: #667382;--tblr-muted-rgb: 102, 115, 130;--tblr-muted-fg: var(--tblr-light);--tblr-muted-darken: #5c6875;--tblr-muted-lt: #f0f1f3;--tblr-muted-lt-rgb: 240, 241, 243;--tblr-blue: #0054a6;--tblr-blue-rgb: 0, 84, 166;--tblr-blue-fg: var(--tblr-light);--tblr-blue-darken: #004c95;--tblr-blue-lt: #e6eef6;--tblr-blue-lt-rgb: 230, 238, 246;--tblr-azure: #4299e1;--tblr-azure-rgb: 66, 153, 225;--tblr-azure-fg: var(--tblr-light);--tblr-azure-darken: #3b8acb;--tblr-azure-lt: #ecf5fc;--tblr-azure-lt-rgb: 236, 245, 252;--tblr-indigo: #4263eb;--tblr-indigo-rgb: 66, 99, 235;--tblr-indigo-fg: var(--tblr-light);--tblr-indigo-darken: #3b59d4;--tblr-indigo-lt: #eceffd;--tblr-indigo-lt-rgb: 236, 239, 253;--tblr-purple: #ae3ec9;--tblr-purple-rgb: 174, 62, 201;--tblr-purple-fg: var(--tblr-light);--tblr-purple-darken: #9d38b5;--tblr-purple-lt: #f7ecfa;--tblr-purple-lt-rgb: 247, 236, 250;--tblr-pink: #d6336c;--tblr-pink-rgb: 214, 51, 108;--tblr-pink-fg: var(--tblr-light);--tblr-pink-darken: #c12e61;--tblr-pink-lt: #fbebf0;--tblr-pink-lt-rgb: 251, 235, 240;--tblr-red: #d63939;--tblr-red-rgb: 214, 57, 57;--tblr-red-fg: var(--tblr-light);--tblr-red-darken: #c13333;--tblr-red-lt: #fbebeb;--tblr-red-lt-rgb: 251, 235, 235;--tblr-orange: #f76707;--tblr-orange-rgb: 247, 103, 7;--tblr-orange-fg: var(--tblr-light);--tblr-orange-darken: #de5d06;--tblr-orange-lt: #fef0e6;--tblr-orange-lt-rgb: 254, 240, 230;--tblr-yellow: #f59f00;--tblr-yellow-rgb: 245, 159, 0;--tblr-yellow-fg: var(--tblr-light);--tblr-yellow-darken: #dd8f00;--tblr-yellow-lt: #fef5e6;--tblr-yellow-lt-rgb: 254, 245, 230;--tblr-lime: #74b816;--tblr-lime-rgb: 116, 184, 22;--tblr-lime-fg: var(--tblr-light);--tblr-lime-darken: #68a614;--tblr-lime-lt: #f1f8e8;--tblr-lime-lt-rgb: 241, 248, 232;--tblr-green: #2fb344;--tblr-green-rgb: 47, 179, 68;--tblr-green-fg: var(--tblr-light);--tblr-green-darken: #2aa13d;--tblr-green-lt: #eaf7ec;--tblr-green-lt-rgb: 234, 247, 236;--tblr-teal: #0ca678;--tblr-teal-rgb: 12, 166, 120;--tblr-teal-fg: var(--tblr-light);--tblr-teal-darken: #0b956c;--tblr-teal-lt: #e7f6f2;--tblr-teal-lt-rgb: 231, 246, 242;--tblr-cyan: #17a2b8;--tblr-cyan-rgb: 23, 162, 184;--tblr-cyan-fg: var(--tblr-light);--tblr-cyan-darken: #1592a6;--tblr-cyan-lt: #e8f6f8;--tblr-cyan-lt-rgb: 232, 246, 248;--tblr-facebook: #1877f2;--tblr-facebook-rgb: 24, 119, 242;--tblr-facebook-fg: var(--tblr-light);--tblr-facebook-darken: #166bda;--tblr-facebook-lt: #e8f1fe;--tblr-facebook-lt-rgb: 232, 241, 254;--tblr-twitter: #1da1f2;--tblr-twitter-rgb: 29, 161, 242;--tblr-twitter-fg: var(--tblr-light);--tblr-twitter-darken: #1a91da;--tblr-twitter-lt: #e8f6fe;--tblr-twitter-lt-rgb: 232, 246, 254;--tblr-linkedin: #0a66c2;--tblr-linkedin-rgb: 10, 102, 194;--tblr-linkedin-fg: var(--tblr-light);--tblr-linkedin-darken: #095caf;--tblr-linkedin-lt: #e7f0f9;--tblr-linkedin-lt-rgb: 231, 240, 249;--tblr-google: #dc4e41;--tblr-google-rgb: 220, 78, 65;--tblr-google-fg: var(--tblr-light);--tblr-google-darken: #c6463b;--tblr-google-lt: #fcedec;--tblr-google-lt-rgb: 252, 237, 236;--tblr-youtube: #ff0000;--tblr-youtube-rgb: 255, 0, 0;--tblr-youtube-fg: var(--tblr-light);--tblr-youtube-darken: #e60000;--tblr-youtube-lt: #ffe6e6;--tblr-youtube-lt-rgb: 255, 230, 230;--tblr-vimeo: #1ab7ea;--tblr-vimeo-rgb: 26, 183, 234;--tblr-vimeo-fg: var(--tblr-light);--tblr-vimeo-darken: #17a5d3;--tblr-vimeo-lt: #e8f8fd;--tblr-vimeo-lt-rgb: 232, 248, 253;--tblr-dribbble: #ea4c89;--tblr-dribbble-rgb: 234, 76, 137;--tblr-dribbble-fg: var(--tblr-light);--tblr-dribbble-darken: #d3447b;--tblr-dribbble-lt: #fdedf3;--tblr-dribbble-lt-rgb: 253, 237, 243;--tblr-github: #181717;--tblr-github-rgb: 24, 23, 23;--tblr-github-fg: var(--tblr-light);--tblr-github-darken: #161515;--tblr-github-lt: #e8e8e8;--tblr-github-lt-rgb: 232, 232, 232;--tblr-instagram: #e4405f;--tblr-instagram-rgb: 228, 64, 95;--tblr-instagram-fg: var(--tblr-light);--tblr-instagram-darken: #cd3a56;--tblr-instagram-lt: #fcecef;--tblr-instagram-lt-rgb: 252, 236, 239;--tblr-pinterest: #bd081c;--tblr-pinterest-rgb: 189, 8, 28;--tblr-pinterest-fg: var(--tblr-light);--tblr-pinterest-darken: #aa0719;--tblr-pinterest-lt: #f8e6e8;--tblr-pinterest-lt-rgb: 248, 230, 232;--tblr-vk: #6383a8;--tblr-vk-rgb: 99, 131, 168;--tblr-vk-fg: var(--tblr-light);--tblr-vk-darken: #597697;--tblr-vk-lt: #eff3f6;--tblr-vk-lt-rgb: 239, 243, 246;--tblr-rss: #ffa500;--tblr-rss-rgb: 255, 165, 0;--tblr-rss-fg: var(--tblr-light);--tblr-rss-darken: #e69500;--tblr-rss-lt: #fff6e6;--tblr-rss-lt-rgb: 255, 246, 230;--tblr-flickr: #0063dc;--tblr-flickr-rgb: 0, 99, 220;--tblr-flickr-fg: var(--tblr-light);--tblr-flickr-darken: #0059c6;--tblr-flickr-lt: #e6effc;--tblr-flickr-lt-rgb: 230, 239, 252;--tblr-bitbucket: #0052cc;--tblr-bitbucket-rgb: 0, 82, 204;--tblr-bitbucket-fg: var(--tblr-light);--tblr-bitbucket-darken: #004ab8;--tblr-bitbucket-lt: #e6eefa;--tblr-bitbucket-lt-rgb: 230, 238, 250;--tblr-tabler: #0054a6;--tblr-tabler-rgb: 0, 84, 166;--tblr-tabler-fg: var(--tblr-light);--tblr-tabler-darken: #004c95;--tblr-tabler-lt: #e6eef6;--tblr-tabler-lt-rgb: 230, 238, 246;--tblr-gray-50: #fcfdfe;--tblr-gray-50-rgb: 252, 253, 254;--tblr-gray-50-fg: var(--tblr-dark);--tblr-gray-50-darken: #e3e4e5;--tblr-gray-50-lt: white;--tblr-gray-50-lt-rgb: 255, 255, 255;--tblr-gray-100: #f6f8fb;--tblr-gray-100-rgb: 246, 248, 251;--tblr-gray-100-fg: var(--tblr-dark);--tblr-gray-100-darken: #dddfe2;--tblr-gray-100-lt: #fefeff;--tblr-gray-100-lt-rgb: 254, 254, 255;--tblr-gray-200: #eef1f4;--tblr-gray-200-rgb: 238, 241, 244;--tblr-gray-200-fg: var(--tblr-dark);--tblr-gray-200-darken: #d6d9dc;--tblr-gray-200-lt: #fdfefe;--tblr-gray-200-lt-rgb: 253, 254, 254;--tblr-gray-300: #dadfe5;--tblr-gray-300-rgb: 218, 223, 229;--tblr-gray-300-fg: var(--tblr-dark);--tblr-gray-300-darken: #c4c9ce;--tblr-gray-300-lt: #fbfcfc;--tblr-gray-300-lt-rgb: 251, 252, 252;--tblr-gray-400: #bbc3cd;--tblr-gray-400-rgb: 187, 195, 205;--tblr-gray-400-fg: var(--tblr-light);--tblr-gray-400-darken: #a8b0b9;--tblr-gray-400-lt: #f8f9fa;--tblr-gray-400-lt-rgb: 248, 249, 250;--tblr-gray-500: #929dab;--tblr-gray-500-rgb: 146, 157, 171;--tblr-gray-500-fg: var(--tblr-light);--tblr-gray-500-darken: #838d9a;--tblr-gray-500-lt: #f4f5f7;--tblr-gray-500-lt-rgb: 244, 245, 247;--tblr-gray-600: #667382;--tblr-gray-600-rgb: 102, 115, 130;--tblr-gray-600-fg: var(--tblr-light);--tblr-gray-600-darken: #5c6875;--tblr-gray-600-lt: #f0f1f3;--tblr-gray-600-lt-rgb: 240, 241, 243;--tblr-gray-700: #3a4859;--tblr-gray-700-rgb: 58, 72, 89;--tblr-gray-700-fg: var(--tblr-light);--tblr-gray-700-darken: #344150;--tblr-gray-700-lt: #ebedee;--tblr-gray-700-lt-rgb: 235, 237, 238;--tblr-gray-800: #182433;--tblr-gray-800-rgb: 24, 36, 51;--tblr-gray-800-fg: var(--tblr-light);--tblr-gray-800-darken: #16202e;--tblr-gray-800-lt: #e8e9eb;--tblr-gray-800-lt-rgb: 232, 233, 235;--tblr-gray-900: #040a11;--tblr-gray-900-rgb: 4, 10, 17;--tblr-gray-900-fg: var(--tblr-light);--tblr-gray-900-darken: #04090f;--tblr-gray-900-lt: #e6e7e7;--tblr-gray-900-lt-rgb: 230, 231, 231;--tblr-spacer-0: 0;--tblr-spacer-1: .25rem;--tblr-spacer-2: .5rem;--tblr-spacer-3: 1rem;--tblr-spacer-4: 1.5rem;--tblr-spacer-5: 2rem;--tblr-spacer-6: 3rem;--tblr-spacer-7: 5rem;--tblr-spacer-8: 8rem;--tblr-spacer: 1rem;--tblr-bg-surface: var(--tblr-white);--tblr-bg-surface-secondary: var(--tblr-gray-100);--tblr-bg-surface-tertiary: var(--tblr-gray-50);--tblr-bg-surface-dark: var(--tblr-dark);--tblr-bg-forms: var(--tblr-bg-surface);--tblr-border-color: #dadfe5;--tblr-border-color-translucent: rgba(4, 32, 69, .14);--tblr-border-dark-color: #bbc3cd;--tblr-border-dark-color-translucent: rgba(4, 32, 69, .27);--tblr-border-active-color: #b6bcc3;--tblr-icon-color: var(--tblr-gray-500);--tblr-active-bg: rgba(var(--tblr-primary-rgb), .04);--tblr-disabled-bg: var(--tblr-bg-surface-secondary);--tblr-disabled-color: var(--tblr-gray-300);--tblr-code-color: var(--tblr-gray-600);--tblr-code-bg: var(--tblr-bg-surface-secondary);--tblr-dark-mode-border-color: #1f2e41;--tblr-dark-mode-border-color-translucent: rgba(72, 110, 149, .14);--tblr-dark-mode-border-color-active: #2c415d;--tblr-dark-mode-border-dark-color: #1f2e41;--tblr-page-padding: var(--tblr-spacer-3);--tblr-page-padding-y: var(--tblr-spacer-4);--tblr-font-weight-light: 300;--tblr-font-weight-normal: 400;--tblr-font-weight-medium: 500;--tblr-font-weight-bold: 600;--tblr-font-weight-headings: var(--tblr-font-weight-bold);--tblr-font-size-h1: 1.5rem;--tblr-font-size-h2: 1.25rem;--tblr-font-size-h3: 1rem;--tblr-font-size-h4: .875rem;--tblr-font-size-h5: .75rem;--tblr-font-size-h6: .625rem;--tblr-line-height-h1: 2rem;--tblr-line-height-h2: 1.75rem;--tblr-line-height-h3: 1.5rem;--tblr-line-height-h4: 1.25rem;--tblr-line-height-h5: 1rem;--tblr-line-height-h6: 1rem;--tblr-box-shadow: rgba(var(--tblr-body-color-rgb), .04) 0 2px 4px 0;--tblr-box-shadow-border: inset 0 0 0 1px var(--tblr-border-color-translucent);--tblr-box-shadow-transparent: 0 0 0 0 transparent;--tblr-box-shadow-input: 0 1px 1px rgba(var(--tblr-body-color-rgb), .06);--tblr-box-shadow-card: 0 0 4px rgba(var(--tblr-body-color-rgb), .04);--tblr-box-shadow-card-hover: rgba(var(--tblr-body-color-rgb), .16) 0 2px 16px 0;--tblr-box-shadow-dropdown: 0 16px 24px 2px rgba(0, 0, 0, .07), 0 6px 30px 5px rgba(0, 0, 0, .06), 0 8px 10px -5px rgba(0, 0, 0, .1)}@media (max-width: 991.98px){:root,:host,[data-bs-theme=light]{--tblr-page-padding: var(--tblr-spacer-2)}}@keyframes pulse{0%{opacity:1;transform:scale3d(.8,.8,.8)}50%{transform:scaleZ(1);opacity:1}to{opacity:1;transform:scale3d(.8,.8,.8)}}@keyframes tada{0%{transform:scaleZ(1)}10%,5%{transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-5deg)}15%,25%,35%,45%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,5deg)}20%,30%,40%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-5deg)}50%{transform:scaleZ(1)}}@keyframes rotate-360{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes blink{0%{opacity:0}50%{opacity:1}to{opacity:0}}body{letter-spacing:0;touch-action:manipulation;text-rendering:optimizeLegibility;font-feature-settings:"liga" 0;position:relative;min-height:100%;height:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media print{body{background:transparent}}*{scrollbar-color:rgba(var(--tblr-scrollbar-color, var(--tblr-body-color-rgb)),.16) transparent}*::-webkit-scrollbar{width:1rem;height:1rem;transition:background .3s}@media (prefers-reduced-motion: reduce){*::-webkit-scrollbar{transition:none}}*::-webkit-scrollbar-thumb{border-radius:1rem;border:5px solid transparent;box-shadow:inset 0 0 0 1rem rgba(var(--tblr-scrollbar-color, var(--tblr-body-color-rgb)),.16)}*::-webkit-scrollbar-track{background:transparent}*:hover::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem rgba(var(--tblr-scrollbar-color, var(--tblr-body-color-rgb)),.32)}*::-webkit-scrollbar-corner{background:transparent}.layout-fluid .container,.layout-fluid [class^=container-],.layout-fluid [class*=" container-"]{max-width:100%}.layout-boxed{--tblr-theme-boxed-border-radius: 0;--tblr-theme-boxed-width: 1320px}@media (min-width: 768px){.layout-boxed{background:#182433 linear-gradient(to right,rgba(255,255,255,.1),transparent) fixed;padding:1rem;--tblr-theme-boxed-border-radius: 4px}}.layout-boxed .page{margin:0 auto;max-width:var(--tblr-theme-boxed-width);border-radius:var(--tblr-theme-boxed-border-radius);color:var(--tblr-body-color)}@media (min-width: 768px){.layout-boxed .page{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);background:var(--tblr-body-bg)}}.layout-boxed .page>.navbar:first-child{border-top-left-radius:var(--tblr-theme-boxed-border-radius);border-top-right-radius:var(--tblr-theme-boxed-border-radius)}.navbar{--tblr-navbar-bg: var(--tblr-bg-surface);--tblr-navbar-border-width: var(--tblr-border-width);--tblr-navbar-active-border-color: #00857D;--tblr-navbar-active-bg: rgba(0, 0, 0, .06);--tblr-navbar-color: var(--tblr-body-color);--tblr-navbar-border-color: var(--tblr-border-color);align-items:stretch;min-height:3.5rem;box-shadow:inset 0 calc(-1 * var(--tblr-navbar-border-width)) 0 0 var(--tblr-navbar-border-color);background:var(--tblr-navbar-bg);color:var(--tblr-navbar-color)}.navbar-collapse .navbar{flex-grow:1}.navbar.collapsing{min-height:0}.navbar .dropdown-menu{position:absolute;z-index:1030}.navbar .navbar-nav{min-height:3rem}.navbar .navbar-nav .nav-link{position:relative;min-width:2rem;min-height:2rem;justify-content:center;border-radius:var(--tblr-border-radius)}.navbar .navbar-nav .nav-link .badge{position:absolute;top:.375rem;right:.375rem;transform:translate(50%,-50%)}.navbar-nav{margin:0;padding:0}@media (max-width: 575.98px){.navbar-expand-sm .navbar-collapse{flex-direction:column}.navbar-expand-sm .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-sm .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-sm .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-sm .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-sm .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-sm .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-sm .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 576px){.navbar-expand-sm .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-sm .nav-item.active{position:relative}.navbar-expand-sm .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-sm.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-sm.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-sm.navbar-vertical~.navbar,.navbar-expand-sm.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-sm.navbar-vertical.navbar-right~.navbar,.navbar-expand-sm.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:18rem}}@media (max-width: 767.98px){.navbar-expand-md .navbar-collapse{flex-direction:column}.navbar-expand-md .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-md .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-md .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-md .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-md .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-md .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-md .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 768px){.navbar-expand-md .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-md .nav-item.active{position:relative}.navbar-expand-md .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-md.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-md.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-md.navbar-vertical~.navbar,.navbar-expand-md.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-md.navbar-vertical.navbar-right~.navbar,.navbar-expand-md.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:18rem}}@media (max-width: 991.98px){.navbar-expand-lg .navbar-collapse{flex-direction:column}.navbar-expand-lg .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-lg .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-lg .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-lg .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-lg .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-lg .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-lg .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 992px){.navbar-expand-lg .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-lg .nav-item.active{position:relative}.navbar-expand-lg .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-lg.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-lg.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-lg.navbar-vertical~.navbar,.navbar-expand-lg.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-lg.navbar-vertical.navbar-right~.navbar,.navbar-expand-lg.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:18rem}}@media (max-width: 1199.98px){.navbar-expand-xl .navbar-collapse{flex-direction:column}.navbar-expand-xl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-xl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-xl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-xl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-xl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-xl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-xl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 1200px){.navbar-expand-xl .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-xl .nav-item.active{position:relative}.navbar-expand-xl .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-xl.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xl.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xl.navbar-vertical~.navbar,.navbar-expand-xl.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-xl.navbar-vertical.navbar-right~.navbar,.navbar-expand-xl.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:18rem}}@media (max-width: 1399.98px){.navbar-expand-xxl .navbar-collapse{flex-direction:column}.navbar-expand-xxl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand-xxl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand-xxl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand-xxl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand-xxl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand-xxl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand-xxl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 1400px){.navbar-expand-xxl .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand-xxl .nav-item.active{position:relative}.navbar-expand-xxl .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand-xxl.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xxl.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand-xxl.navbar-vertical~.navbar,.navbar-expand-xxl.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand-xxl.navbar-vertical.navbar-right~.navbar,.navbar-expand-xxl.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:18rem}}.navbar-expand .navbar-collapse{flex-direction:column}.navbar-expand .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-expand .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-expand .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-expand .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-expand .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-expand .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-expand .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}.navbar-expand .navbar-collapse{width:auto;flex:1 1 auto}.navbar-expand .nav-item.active{position:relative}.navbar-expand .nav-item.active:after{content:"";position:absolute;left:0;right:0;bottom:-.25rem;border:0 var(--tblr-border-style) var(--tblr-navbar-active-border-color);border-bottom-width:2px}.navbar-expand.navbar-vertical{box-shadow:inset calc(-1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand.navbar-vertical.navbar-right{box-shadow:inset calc(1 * var(--tblr-navbar-border-width)) 0 0 0 var(--tblr-navbar-border-color)}.navbar-expand.navbar-vertical~.navbar,.navbar-expand.navbar-vertical~.page-wrapper{margin-left:18rem}.navbar-expand.navbar-vertical.navbar-right~.navbar,.navbar-expand.navbar-vertical.navbar-right~.page-wrapper{margin-left:0;margin-right:18rem}.navbar-brand{display:inline-flex;align-items:center;font-weight:var(--tblr-font-weight-bold);margin:0;line-height:1;gap:.5rem}.navbar-brand-image{height:2rem;width:auto}.navbar-toggler{border:0;width:2rem;height:2rem;position:relative;display:flex;align-items:center;justify-content:center}.navbar-toggler-icon{height:2px;width:1.25em;background:currentColor;border-radius:10px;transition:top .2s .2s,bottom .2s .2s,transform .2s,opacity 0s .2s;position:relative}@media (prefers-reduced-motion: reduce){.navbar-toggler-icon{transition:none}}.navbar-toggler-icon:before,.navbar-toggler-icon:after{content:"";display:block;height:inherit;width:inherit;border-radius:inherit;background:inherit;position:absolute;left:0;transition:inherit}@media (prefers-reduced-motion: reduce){.navbar-toggler-icon:before,.navbar-toggler-icon:after{transition:none}}.navbar-toggler-icon:before{top:-.45em}.navbar-toggler-icon:after{bottom:-.45em}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon{transform:rotate(45deg);transition:top .3s,bottom .3s,transform .3s .3s,opacity 0s .3s}@media (prefers-reduced-motion: reduce){.navbar-toggler[aria-expanded=true] .navbar-toggler-icon{transition:none}}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon:before{top:0;transform:rotate(-90deg)}.navbar-toggler[aria-expanded=true] .navbar-toggler-icon:after{bottom:0;opacity:0}.navbar-transparent{--tblr-navbar-border-color: transparent !important;background:transparent!important}.navbar-nav{align-items:stretch}.navbar-nav .nav-item{display:flex;flex-direction:column;justify-content:center}.navbar-side{margin:0;display:flex;flex-direction:row;align-items:center;justify-content:space-around}@media (min-width: 576px){.navbar-vertical.navbar-expand-sm{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media (min-width: 576px) and (prefers-reduced-motion: reduce){.navbar-vertical.navbar-expand-sm{transition:none}}@media (min-width: 576px){.navbar-vertical.navbar-expand-sm.navbar-right{left:auto;right:0}.navbar-vertical.navbar-expand-sm .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-sm .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-sm .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-sm .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-sm>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-sm~.page{padding-left:18rem}.navbar-vertical.navbar-expand-sm~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-sm.navbar-right~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-sm .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-sm .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-sm .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-sm .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 768px){.navbar-vertical.navbar-expand-md{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media (min-width: 768px) and (prefers-reduced-motion: reduce){.navbar-vertical.navbar-expand-md{transition:none}}@media (min-width: 768px){.navbar-vertical.navbar-expand-md.navbar-right{left:auto;right:0}.navbar-vertical.navbar-expand-md .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-md .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-md .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-md .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-md>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-md~.page{padding-left:18rem}.navbar-vertical.navbar-expand-md~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-md.navbar-right~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-md .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-md .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-md .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-md .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-md .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-md .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 992px){.navbar-vertical.navbar-expand-lg{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media (min-width: 992px) and (prefers-reduced-motion: reduce){.navbar-vertical.navbar-expand-lg{transition:none}}@media (min-width: 992px){.navbar-vertical.navbar-expand-lg.navbar-right{left:auto;right:0}.navbar-vertical.navbar-expand-lg .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-lg .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-lg .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-lg .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-lg>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-lg~.page{padding-left:18rem}.navbar-vertical.navbar-expand-lg~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-lg.navbar-right~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-lg .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-lg .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-lg .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 1200px){.navbar-vertical.navbar-expand-xl{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media (min-width: 1200px) and (prefers-reduced-motion: reduce){.navbar-vertical.navbar-expand-xl{transition:none}}@media (min-width: 1200px){.navbar-vertical.navbar-expand-xl.navbar-right{left:auto;right:0}.navbar-vertical.navbar-expand-xl .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-xl .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-xl .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-xl .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-xl>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-xl~.page{padding-left:18rem}.navbar-vertical.navbar-expand-xl~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-xl.navbar-right~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-xl .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-xl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-xl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-xl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}@media (min-width: 1400px){.navbar-vertical.navbar-expand-xxl{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}}@media (min-width: 1400px) and (prefers-reduced-motion: reduce){.navbar-vertical.navbar-expand-xxl{transition:none}}@media (min-width: 1400px){.navbar-vertical.navbar-expand-xxl.navbar-right{left:auto;right:0}.navbar-vertical.navbar-expand-xxl .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand-xxl .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand-xxl .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand-xxl .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand-xxl>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand-xxl~.page{padding-left:18rem}.navbar-vertical.navbar-expand-xxl~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand-xxl.navbar-right~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand-xxl .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand-xxl .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand-xxl .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand-xxl .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}}.navbar-vertical.navbar-expand{width:18rem;position:fixed;top:0;left:0;bottom:0;z-index:1030;align-items:flex-start;transition:transform .3s;overflow-y:scroll;padding:0}@media (prefers-reduced-motion: reduce){.navbar-vertical.navbar-expand{transition:none}}.navbar-vertical.navbar-expand.navbar-right{left:auto;right:0}.navbar-vertical.navbar-expand .navbar-brand{padding:.75rem 0;justify-content:center}.navbar-vertical.navbar-expand .navbar-collapse{align-items:stretch}.navbar-vertical.navbar-expand .navbar-nav{flex-direction:column;flex-grow:1;min-height:auto}.navbar-vertical.navbar-expand .navbar-nav .nav-link{padding-top:.5rem;padding-bottom:.5rem}.navbar-vertical.navbar-expand>[class^=container]{flex-direction:column;align-items:stretch;min-height:100%;justify-content:flex-start;padding:0}.navbar-vertical.navbar-expand~.page{padding-left:18rem}.navbar-vertical.navbar-expand~.page [class^=container]{padding-left:1.5rem;padding-right:1.5rem}.navbar-vertical.navbar-expand.navbar-right~.page{padding-left:0;padding-right:18rem}.navbar-vertical.navbar-expand .navbar-collapse{flex-direction:column}.navbar-vertical.navbar-expand .navbar-collapse [class^=container]{flex-direction:column;align-items:stretch;padding:0}.navbar-vertical.navbar-expand .navbar-collapse .navbar-nav{margin-left:0;margin-right:0}.navbar-vertical.navbar-expand .navbar-collapse .navbar-nav .nav-link{padding:.5rem calc(calc(var(--tblr-page-padding) * 2) / 2);justify-content:flex-start}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu-columns{flex-direction:column}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu{padding:0;background:transparent;position:static;color:inherit;box-shadow:none;border:none;min-width:0;margin:0}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item{min-width:0;display:flex;width:auto;padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 1.75rem);color:inherit}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item.active,.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-item:active{background:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 3.25rem)}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-menu .dropdown-menu .dropdown-menu .dropdown-item{padding-left:calc(calc(calc(var(--tblr-page-padding) * 2) / 2) + 4.75rem)}.navbar-vertical.navbar-expand .navbar-collapse .dropdown-toggle:after{margin-left:auto}.navbar-vertical.navbar-expand .navbar-collapse .nav-item.active:after{border-bottom-width:0;border-left-width:3px;right:auto;top:0;bottom:0}.navbar-overlap:after{content:"";height:9rem;position:absolute;top:100%;left:0;right:0;background:inherit;z-index:-1;box-shadow:inherit}.page{display:flex;flex-direction:column;position:relative;min-height:100%}.page-center .container{margin-top:auto;margin-bottom:auto}.page-wrapper{flex:1;display:flex;flex-direction:column}@media print{.page-wrapper{margin:0!important}}.page-wrapper-full .page-body:first-child{margin:0;border-top:0}.page-body{margin-top:var(--tblr-page-padding-y);margin-bottom:var(--tblr-page-padding-y)}.page-body-card{background:var(--tblr-bg-surface);border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);padding:var(--tblr-page-padding) 0;margin-bottom:0;flex:1}.page-body~.page-body-card{margin-top:0}.page-cover{background:no-repeat center/cover;min-height:9rem}@media (min-width: 768px){.page-cover{min-height:12rem}}@media (min-width: 992px){.page-cover{min-height:15rem}}.page-cover-overlay{position:relative}.page-cover-overlay:after{content:"";position:absolute;inset:0;background-image:linear-gradient(180deg,#0000,#0009)}.page-header{display:flex;flex-wrap:wrap;min-height:2.25rem;flex-direction:column;justify-content:center}.page-wrapper .page-header{margin:var(--tblr-page-padding-y) 0 0}.page-header-border{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);padding:var(--tblr-page-padding-y) 0;margin:0!important;background-color:var(--tblr-bg-surface)}.page-pretitle{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary)}.page-title{margin:0;font-size:var(--tblr-font-size-h2);line-height:var(--tblr-line-height-h4);font-weight:var(--tblr-font-weight-headings);color:inherit;display:flex;align-items:center}.page-title svg{width:1.5rem;height:1.5rem;margin-right:.25rem}.page-title-lg{font-size:1.5rem;line-height:2rem}.page-subtitle{margin-top:.25rem;color:var(--tblr-secondary)}.page-cover{--tblr-page-cover-blur: 20px;--tblr-page-cover-padding: 1rem;min-height:6rem;padding:var(--tblr-page-cover-padding) 0;position:relative;overflow:hidden}.page-cover-img{position:absolute;top:calc(-2 * var(--tblr-page-cover-blur, 0));left:calc(-2 * var(--tblr-page-cover-blur, 0));right:calc(-2 * var(--tblr-page-cover-blur, 0));bottom:calc(-2 * var(--tblr-page-cover-blur, 0));pointer-events:none;filter:blur(var(--tblr-page-cover-blur));object-fit:cover;background-size:cover;background-position:center;z-index:-1}.page-tabs{margin-top:.5rem;position:relative}.page-header-tabs .nav-bordered{border:0}.page-header-tabs+.page-body-card{margin-top:0}.footer{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);background-color:#fff;padding:2rem 0;color:var(--tblr-secondary);margin-top:auto}.footer-transparent{background-color:transparent;border-top:0}body:not(.theme-dark):not([data-bs-theme=dark]) .hide-theme-light{display:none!important}body.theme-dark .hide-theme-dark,body[data-bs-theme=dark] .hide-theme-dark{display:none!important}[data-bs-theme=dark],body[data-bs-theme=dark] [data-bs-theme=light]{--tblr-body-color: #fcfdfe;--tblr-body-color-rgb: 252, 253, 254;--tblr-muted: #3a4859;--tblr-body-bg: #151f2c;--tblr-body-bg-rgb: 21, 31, 44;--tblr-emphasis-color: #ffffff;--tblr-emphasis-color-rgb: 255, 255, 255;--tblr-bg-forms: #151f2c;--tblr-bg-surface: #182433;--tblr-bg-surface-dark: #151f2c;--tblr-bg-surface-secondary: #1b293a;--tblr-bg-surface-tertiary: #151f2c;--tblr-link-color: #00aea3;--tblr-link-hover-color: #00857D;--tblr-active-bg: #1b293a;--tblr-disabled-color: var(--tblr-gray-700);--tblr-border-color: var(--tblr-dark-mode-border-color);--tblr-border-color-translucent: var( --tblr-dark-mode-border-color-translucent );--tblr-border-dark-color: var(--tblr-dark-mode-border-dark-color);--tblr-border-color-active: var( --tblr-dark-mode-border-color-active );--tblr-btn-color: #151f2c;--tblr-code-color: var(--tblr-body-color);--tblr-code-bg: #1f2e41;--tblr-primary-lt: #162e3a;--tblr-primary-lt-rgb: 22, 46, 58;--tblr-secondary-lt: #202c3b;--tblr-secondary-lt-rgb: 32, 44, 59;--tblr-success-lt: #1a3235;--tblr-success-lt-rgb: 26, 50, 53;--tblr-info-lt: #1c3044;--tblr-info-lt-rgb: 28, 48, 68;--tblr-warning-lt: #2e2b2f;--tblr-warning-lt-rgb: 46, 43, 47;--tblr-danger-lt: #2b2634;--tblr-danger-lt-rgb: 43, 38, 52;--tblr-light-lt: #2f3a47;--tblr-light-lt-rgb: 47, 58, 71;--tblr-dark-lt: #182433;--tblr-dark-lt-rgb: 24, 36, 51;--tblr-muted-lt: #202c3b;--tblr-muted-lt-rgb: 32, 44, 59;--tblr-blue-lt: #16293f;--tblr-blue-lt-rgb: 22, 41, 63;--tblr-azure-lt: #1c3044;--tblr-azure-lt-rgb: 28, 48, 68;--tblr-indigo-lt: #1c2a45;--tblr-indigo-lt-rgb: 28, 42, 69;--tblr-purple-lt: #272742;--tblr-purple-lt-rgb: 39, 39, 66;--tblr-pink-lt: #2b2639;--tblr-pink-lt-rgb: 43, 38, 57;--tblr-red-lt: #2b2634;--tblr-red-lt-rgb: 43, 38, 52;--tblr-orange-lt: #2e2b2f;--tblr-orange-lt-rgb: 46, 43, 47;--tblr-yellow-lt: #2e302e;--tblr-yellow-lt-rgb: 46, 48, 46;--tblr-lime-lt: #213330;--tblr-lime-lt-rgb: 33, 51, 48;--tblr-green-lt: #1a3235;--tblr-green-lt-rgb: 26, 50, 53;--tblr-teal-lt: #17313a;--tblr-teal-lt-rgb: 23, 49, 58;--tblr-cyan-lt: #183140;--tblr-cyan-lt-rgb: 24, 49, 64;--tblr-facebook-lt: #182c46;--tblr-facebook-lt-rgb: 24, 44, 70;--tblr-twitter-lt: #193146;--tblr-twitter-lt-rgb: 25, 49, 70;--tblr-linkedin-lt: #172b41;--tblr-linkedin-lt-rgb: 23, 43, 65;--tblr-google-lt: #2c2834;--tblr-google-lt-rgb: 44, 40, 52;--tblr-youtube-lt: #2f202e;--tblr-youtube-lt-rgb: 47, 32, 46;--tblr-vimeo-lt: #183345;--tblr-vimeo-lt-rgb: 24, 51, 69;--tblr-dribbble-lt: #2d283c;--tblr-dribbble-lt-rgb: 45, 40, 60;--tblr-github-lt: #182330;--tblr-github-lt-rgb: 24, 35, 48;--tblr-instagram-lt: #2c2737;--tblr-instagram-lt-rgb: 44, 39, 55;--tblr-pinterest-lt: #292131;--tblr-pinterest-lt-rgb: 41, 33, 49;--tblr-vk-lt: #202e3f;--tblr-vk-lt-rgb: 32, 46, 63;--tblr-rss-lt: #2f312e;--tblr-rss-lt-rgb: 47, 49, 46;--tblr-flickr-lt: #162a44;--tblr-flickr-lt-rgb: 22, 42, 68;--tblr-bitbucket-lt: #162942;--tblr-bitbucket-lt-rgb: 22, 41, 66;--tblr-tabler-lt: #16293f;--tblr-tabler-lt-rgb: 22, 41, 63}[data-bs-theme=dark] .navbar-brand-autodark .navbar-brand-image{filter:brightness(0) invert(1)}.accordion{--tblr-accordion-color: var(--tblr-body-color)}.accordion-button:focus:not(:focus-visible){outline:none;box-shadow:none}.accordion-button:after{opacity:.7}.accordion-button:not(.collapsed){font-weight:var(--tblr-font-weight-bold);border-bottom-color:transparent;box-shadow:none}.accordion-button:not(.collapsed):after{opacity:1}.alert{--tblr-alert-color: var(--tblr-secondary);--tblr-alert-bg: var(--tblr-surface);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);border-left:.25rem var(--tblr-border-style) var(--tblr-alert-color);box-shadow:#1824330a 0 2px 4px}.alert>:last-child{margin-bottom:0}.alert-important{border-color:transparent;background:var(--tblr-alert-color);color:#fff}.alert-important .alert-icon,.alert-important .alert-link,.alert-important .alert-title,.alert-important .alert-link:hover{color:inherit}.alert-important .btn-close{filter:var(--tblr-btn-close-white-filter)}.alert-link,.alert-link:hover{color:var(--tblr-alert-color)}.alert-primary{--tblr-alert-color: var(--tblr-primary)}.alert-secondary{--tblr-alert-color: var(--tblr-secondary)}.alert-success{--tblr-alert-color: var(--tblr-success)}.alert-info{--tblr-alert-color: var(--tblr-info)}.alert-warning{--tblr-alert-color: var(--tblr-warning)}.alert-danger{--tblr-alert-color: var(--tblr-danger)}.alert-light{--tblr-alert-color: var(--tblr-light)}.alert-dark{--tblr-alert-color: var(--tblr-dark)}.alert-muted{--tblr-alert-color: var(--tblr-muted)}.alert-blue{--tblr-alert-color: var(--tblr-blue)}.alert-azure{--tblr-alert-color: var(--tblr-azure)}.alert-indigo{--tblr-alert-color: var(--tblr-indigo)}.alert-purple{--tblr-alert-color: var(--tblr-purple)}.alert-pink{--tblr-alert-color: var(--tblr-pink)}.alert-red{--tblr-alert-color: var(--tblr-red)}.alert-orange{--tblr-alert-color: var(--tblr-orange)}.alert-yellow{--tblr-alert-color: var(--tblr-yellow)}.alert-lime{--tblr-alert-color: var(--tblr-lime)}.alert-green{--tblr-alert-color: var(--tblr-green)}.alert-teal{--tblr-alert-color: var(--tblr-teal)}.alert-cyan{--tblr-alert-color: var(--tblr-cyan)}.alert-facebook{--tblr-alert-color: var(--tblr-facebook)}.alert-twitter{--tblr-alert-color: var(--tblr-twitter)}.alert-linkedin{--tblr-alert-color: var(--tblr-linkedin)}.alert-google{--tblr-alert-color: var(--tblr-google)}.alert-youtube{--tblr-alert-color: var(--tblr-youtube)}.alert-vimeo{--tblr-alert-color: var(--tblr-vimeo)}.alert-dribbble{--tblr-alert-color: var(--tblr-dribbble)}.alert-github{--tblr-alert-color: var(--tblr-github)}.alert-instagram{--tblr-alert-color: var(--tblr-instagram)}.alert-pinterest{--tblr-alert-color: var(--tblr-pinterest)}.alert-vk{--tblr-alert-color: var(--tblr-vk)}.alert-rss{--tblr-alert-color: var(--tblr-rss)}.alert-flickr{--tblr-alert-color: var(--tblr-flickr)}.alert-bitbucket{--tblr-alert-color: var(--tblr-bitbucket)}.alert-tabler{--tblr-alert-color: var(--tblr-tabler)}.alert-icon{color:var(--tblr-alert-color);width:1.5rem!important;height:1.5rem!important;margin:-.125rem 1rem -.125rem 0}.alert-title{font-size:.875rem;line-height:1.25rem;font-weight:var(--tblr-font-weight-bold);margin-bottom:.25rem;color:var(--tblr-alert-color)}.avatar{--tblr-avatar-size: 2.5rem;--tblr-avatar-status-size: .75rem;--tblr-avatar-bg: var(--tblr-bg-surface-secondary);--tblr-avatar-box-shadow: var(--tblr-box-shadow-border);--tblr-avatar-font-size: 1rem;--tblr-avatar-icon-size: 1.5rem;position:relative;width:var(--tblr-avatar-size);height:var(--tblr-avatar-size);font-size:var(--tblr-avatar-font-size);font-weight:var(--tblr-font-weight-medium);line-height:1;display:inline-flex;align-items:center;justify-content:center;color:var(--tblr-secondary);text-align:center;text-transform:uppercase;vertical-align:bottom;user-select:none;background:var(--tblr-avatar-bg) no-repeat center/cover;border-radius:var(--tblr-border-radius);box-shadow:var(--tblr-avatar-box-shadow)}.avatar .icon{width:var(--tblr-avatar-icon-size);height:var(--tblr-avatar-icon-size)}.avatar .badge{position:absolute;right:0;bottom:0;border-radius:100rem;box-shadow:0 0 0 calc(var(--tblr-avatar-status-size) / 4) var(--tblr-bg-surface)}a.avatar{cursor:pointer}.avatar-rounded{border-radius:100rem}.avatar-xxs{--tblr-avatar-size: 1rem;--tblr-avatar-status-size: .25rem;--tblr-avatar-font-size: .5rem;--tblr-avatar-icon-size: .75rem}.avatar-xxs .badge:empty{width:.25rem;height:.25rem}.avatar-xs{--tblr-avatar-size: 1.25rem;--tblr-avatar-status-size: .375rem;--tblr-avatar-font-size: .625rem;--tblr-avatar-icon-size: 1rem}.avatar-xs .badge:empty{width:.375rem;height:.375rem}.avatar-sm{--tblr-avatar-size: 2rem;--tblr-avatar-status-size: .5rem;--tblr-avatar-font-size: .75rem;--tblr-avatar-icon-size: 1.25rem}.avatar-sm .badge:empty{width:.5rem;height:.5rem}.avatar-md{--tblr-avatar-size: 2.5rem;--tblr-avatar-status-size: .75rem;--tblr-avatar-font-size: .875rem;--tblr-avatar-icon-size: 1.5rem}.avatar-md .badge:empty{width:.75rem;height:.75rem}.avatar-lg{--tblr-avatar-size: 3rem;--tblr-avatar-status-size: .75rem;--tblr-avatar-font-size: 1.25rem;--tblr-avatar-icon-size: 2rem}.avatar-lg .badge:empty{width:.75rem;height:.75rem}.avatar-xl{--tblr-avatar-size: 5rem;--tblr-avatar-status-size: 1rem;--tblr-avatar-font-size: 2rem;--tblr-avatar-icon-size: 3rem}.avatar-xl .badge:empty{width:1rem;height:1rem}.avatar-2xl{--tblr-avatar-size: 7rem;--tblr-avatar-status-size: 1rem;--tblr-avatar-font-size: 3rem;--tblr-avatar-icon-size: 5rem}.avatar-2xl .badge:empty{width:1rem;height:1rem}.avatar-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.avatar-list a.avatar:hover{z-index:1}.avatar-list-stacked{display:block;--tblr-list-gap: 0}.avatar-list-stacked .avatar{margin-right:calc(-.5 * var(--tblr-avatar-size))!important;box-shadow:var(--tblr-avatar-box-shadow),0 0 0 2px var(--tblr-card-cap-bg, var(--tblr-card-bg, var(--tblr-bg-surface)))}.avatar-upload{width:4rem;height:4rem;border:var(--tblr-border-width) dashed var(--tblr-border-color);background:var(--tblr-bg-forms);flex-direction:column;transition:color .3s,background-color .3s}@media (prefers-reduced-motion: reduce){.avatar-upload{transition:none}}.avatar-upload svg{width:1.5rem;height:1.5rem;stroke-width:1}.avatar-upload:hover{border-color:var(--tblr-primary);color:var(--tblr-primary);text-decoration:none}.avatar-upload-text{font-size:.625rem;line-height:1;margin-top:.25rem}.avatar-cover{margin-top:calc(-.5 * var(--tblr-avatar-size));box-shadow:0 0 0 .25rem var(--tblr-card-bg, var(--tblr-body-bg))}.badge{justify-content:center;align-items:center;background:var(--tblr-bg-surface-secondary);overflow:hidden;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) transparent;min-width:1.35714285em;font-weight:var(--tblr-font-weight-bold);letter-spacing:.04em;vertical-align:bottom}a.badge{color:var(--tblr-bg-surface)}.badge .avatar{box-sizing:content-box;width:1.25rem;height:1.25rem;margin:0 .5rem 0 -.5rem}.badge .icon{width:1em;height:1em;font-size:1rem;stroke-width:2}.badge:empty,.badge-empty{display:inline-block;width:.5rem;height:.5rem;min-width:0;min-height:auto;padding:0;border-radius:100rem;vertical-align:baseline}.badge-outline{background-color:transparent;border:var(--tblr-border-width) var(--tblr-border-style) currentColor}.badge-pill{border-radius:100rem}.badges-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.badge-notification{position:absolute!important;top:0!important;right:0!important;transform:translate(50%,-50%);z-index:1}.badge-blink{animation:blink 2s infinite}.breadcrumb{--tblr-breadcrumb-item-active-font-weight: var(--tblr-font-weight-bold);--tblr-breadcrumb-item-disabled-color: var(--tblr-disabled-color);--tblr-breadcrumb-link-color: var(--tblr-link-color);padding:0;margin:0;background:transparent}.breadcrumb a{color:var(--tblr-breadcrumb-link-color)}.breadcrumb a:hover{text-decoration:underline}.breadcrumb-muted{--tblr-breadcrumb-link-color: var(--tblr-secondary)}.breadcrumb-item.active{font-weight:var(--tblr-breadcrumb-item-active-font-weight)}.breadcrumb-item.active a{color:inherit;pointer-events:none}.breadcrumb-item.disabled{color:var(--tblr-breadcrumb-item-disabled-color)}.breadcrumb-item.disabled:before{color:inherit}.breadcrumb-item.disabled a{color:inherit;pointer-events:none}.breadcrumb-dots{--tblr-breadcrumb-divider: "\b7"}.breadcrumb-arrows{--tblr-breadcrumb-divider: "\203a"}.breadcrumb-bullets{--tblr-breadcrumb-divider: "\2022"}.btn{--tblr-btn-icon-size: 1.25rem;--tblr-btn-bg: var(--tblr-bg-surface);--tblr-btn-color: var(--tblr-body-color);--tblr-btn-border-color: var(--tblr-border-color);--tblr-btn-hover-bg: var(--tblr-btn-bg);--tblr-btn-hover-border-color: var(--tblr-border-color-active);--tblr-btn-box-shadow: var(--tblr-box-shadow-input);--tblr-btn-active-color: var(--tblr-primary);--tblr-btn-active-bg: rgba(var(--tblr-primary-rgb), .04);--tblr-btn-active-border-color: var(--tblr-primary);display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;box-shadow:var(--tblr-btn-box-shadow)}.btn .icon{width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);min-width:var(--tblr-btn-icon-size);margin:0 calc(var(--tblr-btn-padding-x) / 2) 0 calc(var(--tblr-btn-padding-x) / -4);vertical-align:bottom;color:inherit}.btn .avatar{width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);margin:0 calc(var(--tblr-btn-padding-x) / 2) 0 calc(var(--tblr-btn-padding-x) / -4)}.btn .icon-right{margin:0 calc(var(--tblr-btn-padding-x) / -4) 0 calc(var(--tblr-btn-padding-x) / 2)}.btn .badge{top:auto}.btn-check+.btn:hover{color:var(--tblr-btn-hover-color);background-color:var(--tblr-btn-hover-bg);border-color:var(--tblr-btn-hover-border-color)}.btn-link{color:#00857d;background-color:transparent;border-color:transparent;box-shadow:none}.btn-link .icon{color:inherit}.btn-link:hover{color:#006a64;border-color:transparent}.btn-primary{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-primary-fg);--tblr-btn-bg: var(--tblr-primary);--tblr-btn-hover-color: var(--tblr-primary-fg);--tblr-btn-hover-bg: rgba(var(--tblr-primary-rgb), .8);--tblr-btn-active-color: var(--tblr-primary-fg);--tblr-btn-active-bg: rgba(var(--tblr-primary-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-primary);--tblr-btn-disabled-color: var(--tblr-primary-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-primary{--tblr-btn-color: var(--tblr-primary);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-primary);--tblr-btn-hover-color: var(--tblr-primary-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-primary);--tblr-btn-active-color: var(--tblr-primary-fg);--tblr-btn-active-bg: var(--tblr-primary);--tblr-btn-disabled-color: var(--tblr-primary);--tblr-btn-disabled-border-color: var(--tblr-primary)}.btn-secondary{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-secondary-fg);--tblr-btn-bg: var(--tblr-secondary);--tblr-btn-hover-color: var(--tblr-secondary-fg);--tblr-btn-hover-bg: rgba(var(--tblr-secondary-rgb), .8);--tblr-btn-active-color: var(--tblr-secondary-fg);--tblr-btn-active-bg: rgba(var(--tblr-secondary-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-secondary);--tblr-btn-disabled-color: var(--tblr-secondary-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-secondary{--tblr-btn-color: var(--tblr-secondary);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-secondary);--tblr-btn-hover-color: var(--tblr-secondary-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-secondary);--tblr-btn-active-color: var(--tblr-secondary-fg);--tblr-btn-active-bg: var(--tblr-secondary);--tblr-btn-disabled-color: var(--tblr-secondary);--tblr-btn-disabled-border-color: var(--tblr-secondary)}.btn-success{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-success-fg);--tblr-btn-bg: var(--tblr-success);--tblr-btn-hover-color: var(--tblr-success-fg);--tblr-btn-hover-bg: rgba(var(--tblr-success-rgb), .8);--tblr-btn-active-color: var(--tblr-success-fg);--tblr-btn-active-bg: rgba(var(--tblr-success-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-success);--tblr-btn-disabled-color: var(--tblr-success-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-success{--tblr-btn-color: var(--tblr-success);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-success);--tblr-btn-hover-color: var(--tblr-success-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-success);--tblr-btn-active-color: var(--tblr-success-fg);--tblr-btn-active-bg: var(--tblr-success);--tblr-btn-disabled-color: var(--tblr-success);--tblr-btn-disabled-border-color: var(--tblr-success)}.btn-info{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-info-fg);--tblr-btn-bg: var(--tblr-info);--tblr-btn-hover-color: var(--tblr-info-fg);--tblr-btn-hover-bg: rgba(var(--tblr-info-rgb), .8);--tblr-btn-active-color: var(--tblr-info-fg);--tblr-btn-active-bg: rgba(var(--tblr-info-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-info);--tblr-btn-disabled-color: var(--tblr-info-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-info{--tblr-btn-color: var(--tblr-info);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-info);--tblr-btn-hover-color: var(--tblr-info-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-info);--tblr-btn-active-color: var(--tblr-info-fg);--tblr-btn-active-bg: var(--tblr-info);--tblr-btn-disabled-color: var(--tblr-info);--tblr-btn-disabled-border-color: var(--tblr-info)}.btn-warning{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-warning-fg);--tblr-btn-bg: var(--tblr-warning);--tblr-btn-hover-color: var(--tblr-warning-fg);--tblr-btn-hover-bg: rgba(var(--tblr-warning-rgb), .8);--tblr-btn-active-color: var(--tblr-warning-fg);--tblr-btn-active-bg: rgba(var(--tblr-warning-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-warning);--tblr-btn-disabled-color: var(--tblr-warning-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-warning{--tblr-btn-color: var(--tblr-warning);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-warning);--tblr-btn-hover-color: var(--tblr-warning-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-warning);--tblr-btn-active-color: var(--tblr-warning-fg);--tblr-btn-active-bg: var(--tblr-warning);--tblr-btn-disabled-color: var(--tblr-warning);--tblr-btn-disabled-border-color: var(--tblr-warning)}.btn-danger{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-danger-fg);--tblr-btn-bg: var(--tblr-danger);--tblr-btn-hover-color: var(--tblr-danger-fg);--tblr-btn-hover-bg: rgba(var(--tblr-danger-rgb), .8);--tblr-btn-active-color: var(--tblr-danger-fg);--tblr-btn-active-bg: rgba(var(--tblr-danger-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-danger);--tblr-btn-disabled-color: var(--tblr-danger-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-danger{--tblr-btn-color: var(--tblr-danger);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-danger);--tblr-btn-hover-color: var(--tblr-danger-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-danger);--tblr-btn-active-color: var(--tblr-danger-fg);--tblr-btn-active-bg: var(--tblr-danger);--tblr-btn-disabled-color: var(--tblr-danger);--tblr-btn-disabled-border-color: var(--tblr-danger)}.btn-light{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-light-fg);--tblr-btn-bg: var(--tblr-light);--tblr-btn-hover-color: var(--tblr-light-fg);--tblr-btn-hover-bg: rgba(var(--tblr-light-rgb), .8);--tblr-btn-active-color: var(--tblr-light-fg);--tblr-btn-active-bg: rgba(var(--tblr-light-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-light);--tblr-btn-disabled-color: var(--tblr-light-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-light{--tblr-btn-color: var(--tblr-light);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-light);--tblr-btn-hover-color: var(--tblr-light-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-light);--tblr-btn-active-color: var(--tblr-light-fg);--tblr-btn-active-bg: var(--tblr-light);--tblr-btn-disabled-color: var(--tblr-light);--tblr-btn-disabled-border-color: var(--tblr-light)}.btn-dark{--tblr-btn-border-color: var(--tblr-dark-mode-border-color);--tblr-btn-hover-border-color: var(--tblr-dark-mode-border-color-active);--tblr-btn-active-border-color: var(--tblr-dark-mode-border-color-active);--tblr-btn-color: var(--tblr-dark-fg);--tblr-btn-bg: var(--tblr-dark);--tblr-btn-hover-color: var(--tblr-dark-fg);--tblr-btn-hover-bg: rgba(var(--tblr-dark-rgb), .8);--tblr-btn-active-color: var(--tblr-dark-fg);--tblr-btn-active-bg: rgba(var(--tblr-dark-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-dark);--tblr-btn-disabled-color: var(--tblr-dark-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-dark{--tblr-btn-color: var(--tblr-dark);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-dark);--tblr-btn-hover-color: var(--tblr-dark-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-dark);--tblr-btn-active-color: var(--tblr-dark-fg);--tblr-btn-active-bg: var(--tblr-dark);--tblr-btn-disabled-color: var(--tblr-dark);--tblr-btn-disabled-border-color: var(--tblr-dark)}.btn-muted{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-muted-fg);--tblr-btn-bg: var(--tblr-muted);--tblr-btn-hover-color: var(--tblr-muted-fg);--tblr-btn-hover-bg: rgba(var(--tblr-muted-rgb), .8);--tblr-btn-active-color: var(--tblr-muted-fg);--tblr-btn-active-bg: rgba(var(--tblr-muted-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-muted);--tblr-btn-disabled-color: var(--tblr-muted-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-muted{--tblr-btn-color: var(--tblr-muted);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-muted);--tblr-btn-hover-color: var(--tblr-muted-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-muted);--tblr-btn-active-color: var(--tblr-muted-fg);--tblr-btn-active-bg: var(--tblr-muted);--tblr-btn-disabled-color: var(--tblr-muted);--tblr-btn-disabled-border-color: var(--tblr-muted)}.btn-blue{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-blue-fg);--tblr-btn-bg: var(--tblr-blue);--tblr-btn-hover-color: var(--tblr-blue-fg);--tblr-btn-hover-bg: rgba(var(--tblr-blue-rgb), .8);--tblr-btn-active-color: var(--tblr-blue-fg);--tblr-btn-active-bg: rgba(var(--tblr-blue-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-blue);--tblr-btn-disabled-color: var(--tblr-blue-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-blue{--tblr-btn-color: var(--tblr-blue);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-blue);--tblr-btn-hover-color: var(--tblr-blue-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-blue);--tblr-btn-active-color: var(--tblr-blue-fg);--tblr-btn-active-bg: var(--tblr-blue);--tblr-btn-disabled-color: var(--tblr-blue);--tblr-btn-disabled-border-color: var(--tblr-blue)}.btn-azure{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-azure-fg);--tblr-btn-bg: var(--tblr-azure);--tblr-btn-hover-color: var(--tblr-azure-fg);--tblr-btn-hover-bg: rgba(var(--tblr-azure-rgb), .8);--tblr-btn-active-color: var(--tblr-azure-fg);--tblr-btn-active-bg: rgba(var(--tblr-azure-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-azure);--tblr-btn-disabled-color: var(--tblr-azure-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-azure{--tblr-btn-color: var(--tblr-azure);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-azure);--tblr-btn-hover-color: var(--tblr-azure-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-azure);--tblr-btn-active-color: var(--tblr-azure-fg);--tblr-btn-active-bg: var(--tblr-azure);--tblr-btn-disabled-color: var(--tblr-azure);--tblr-btn-disabled-border-color: var(--tblr-azure)}.btn-indigo{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-indigo-fg);--tblr-btn-bg: var(--tblr-indigo);--tblr-btn-hover-color: var(--tblr-indigo-fg);--tblr-btn-hover-bg: rgba(var(--tblr-indigo-rgb), .8);--tblr-btn-active-color: var(--tblr-indigo-fg);--tblr-btn-active-bg: rgba(var(--tblr-indigo-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-indigo);--tblr-btn-disabled-color: var(--tblr-indigo-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-indigo{--tblr-btn-color: var(--tblr-indigo);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-indigo);--tblr-btn-hover-color: var(--tblr-indigo-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-indigo);--tblr-btn-active-color: var(--tblr-indigo-fg);--tblr-btn-active-bg: var(--tblr-indigo);--tblr-btn-disabled-color: var(--tblr-indigo);--tblr-btn-disabled-border-color: var(--tblr-indigo)}.btn-purple{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-purple-fg);--tblr-btn-bg: var(--tblr-purple);--tblr-btn-hover-color: var(--tblr-purple-fg);--tblr-btn-hover-bg: rgba(var(--tblr-purple-rgb), .8);--tblr-btn-active-color: var(--tblr-purple-fg);--tblr-btn-active-bg: rgba(var(--tblr-purple-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-purple);--tblr-btn-disabled-color: var(--tblr-purple-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-purple{--tblr-btn-color: var(--tblr-purple);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-purple);--tblr-btn-hover-color: var(--tblr-purple-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-purple);--tblr-btn-active-color: var(--tblr-purple-fg);--tblr-btn-active-bg: var(--tblr-purple);--tblr-btn-disabled-color: var(--tblr-purple);--tblr-btn-disabled-border-color: var(--tblr-purple)}.btn-pink{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-pink-fg);--tblr-btn-bg: var(--tblr-pink);--tblr-btn-hover-color: var(--tblr-pink-fg);--tblr-btn-hover-bg: rgba(var(--tblr-pink-rgb), .8);--tblr-btn-active-color: var(--tblr-pink-fg);--tblr-btn-active-bg: rgba(var(--tblr-pink-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-pink);--tblr-btn-disabled-color: var(--tblr-pink-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-pink{--tblr-btn-color: var(--tblr-pink);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-pink);--tblr-btn-hover-color: var(--tblr-pink-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-pink);--tblr-btn-active-color: var(--tblr-pink-fg);--tblr-btn-active-bg: var(--tblr-pink);--tblr-btn-disabled-color: var(--tblr-pink);--tblr-btn-disabled-border-color: var(--tblr-pink)}.btn-red{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-red-fg);--tblr-btn-bg: var(--tblr-red);--tblr-btn-hover-color: var(--tblr-red-fg);--tblr-btn-hover-bg: rgba(var(--tblr-red-rgb), .8);--tblr-btn-active-color: var(--tblr-red-fg);--tblr-btn-active-bg: rgba(var(--tblr-red-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-red);--tblr-btn-disabled-color: var(--tblr-red-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-red{--tblr-btn-color: var(--tblr-red);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-red);--tblr-btn-hover-color: var(--tblr-red-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-red);--tblr-btn-active-color: var(--tblr-red-fg);--tblr-btn-active-bg: var(--tblr-red);--tblr-btn-disabled-color: var(--tblr-red);--tblr-btn-disabled-border-color: var(--tblr-red)}.btn-orange{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-orange-fg);--tblr-btn-bg: var(--tblr-orange);--tblr-btn-hover-color: var(--tblr-orange-fg);--tblr-btn-hover-bg: rgba(var(--tblr-orange-rgb), .8);--tblr-btn-active-color: var(--tblr-orange-fg);--tblr-btn-active-bg: rgba(var(--tblr-orange-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-orange);--tblr-btn-disabled-color: var(--tblr-orange-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-orange{--tblr-btn-color: var(--tblr-orange);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-orange);--tblr-btn-hover-color: var(--tblr-orange-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-orange);--tblr-btn-active-color: var(--tblr-orange-fg);--tblr-btn-active-bg: var(--tblr-orange);--tblr-btn-disabled-color: var(--tblr-orange);--tblr-btn-disabled-border-color: var(--tblr-orange)}.btn-yellow{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-yellow-fg);--tblr-btn-bg: var(--tblr-yellow);--tblr-btn-hover-color: var(--tblr-yellow-fg);--tblr-btn-hover-bg: rgba(var(--tblr-yellow-rgb), .8);--tblr-btn-active-color: var(--tblr-yellow-fg);--tblr-btn-active-bg: rgba(var(--tblr-yellow-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-yellow);--tblr-btn-disabled-color: var(--tblr-yellow-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-yellow{--tblr-btn-color: var(--tblr-yellow);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-yellow);--tblr-btn-hover-color: var(--tblr-yellow-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-yellow);--tblr-btn-active-color: var(--tblr-yellow-fg);--tblr-btn-active-bg: var(--tblr-yellow);--tblr-btn-disabled-color: var(--tblr-yellow);--tblr-btn-disabled-border-color: var(--tblr-yellow)}.btn-lime{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-lime-fg);--tblr-btn-bg: var(--tblr-lime);--tblr-btn-hover-color: var(--tblr-lime-fg);--tblr-btn-hover-bg: rgba(var(--tblr-lime-rgb), .8);--tblr-btn-active-color: var(--tblr-lime-fg);--tblr-btn-active-bg: rgba(var(--tblr-lime-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-lime);--tblr-btn-disabled-color: var(--tblr-lime-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-lime{--tblr-btn-color: var(--tblr-lime);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-lime);--tblr-btn-hover-color: var(--tblr-lime-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-lime);--tblr-btn-active-color: var(--tblr-lime-fg);--tblr-btn-active-bg: var(--tblr-lime);--tblr-btn-disabled-color: var(--tblr-lime);--tblr-btn-disabled-border-color: var(--tblr-lime)}.btn-green{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-green-fg);--tblr-btn-bg: var(--tblr-green);--tblr-btn-hover-color: var(--tblr-green-fg);--tblr-btn-hover-bg: rgba(var(--tblr-green-rgb), .8);--tblr-btn-active-color: var(--tblr-green-fg);--tblr-btn-active-bg: rgba(var(--tblr-green-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-green);--tblr-btn-disabled-color: var(--tblr-green-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-green{--tblr-btn-color: var(--tblr-green);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-green);--tblr-btn-hover-color: var(--tblr-green-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-green);--tblr-btn-active-color: var(--tblr-green-fg);--tblr-btn-active-bg: var(--tblr-green);--tblr-btn-disabled-color: var(--tblr-green);--tblr-btn-disabled-border-color: var(--tblr-green)}.btn-teal{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-teal-fg);--tblr-btn-bg: var(--tblr-teal);--tblr-btn-hover-color: var(--tblr-teal-fg);--tblr-btn-hover-bg: rgba(var(--tblr-teal-rgb), .8);--tblr-btn-active-color: var(--tblr-teal-fg);--tblr-btn-active-bg: rgba(var(--tblr-teal-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-teal);--tblr-btn-disabled-color: var(--tblr-teal-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-teal{--tblr-btn-color: var(--tblr-teal);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-teal);--tblr-btn-hover-color: var(--tblr-teal-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-teal);--tblr-btn-active-color: var(--tblr-teal-fg);--tblr-btn-active-bg: var(--tblr-teal);--tblr-btn-disabled-color: var(--tblr-teal);--tblr-btn-disabled-border-color: var(--tblr-teal)}.btn-cyan{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-cyan-fg);--tblr-btn-bg: var(--tblr-cyan);--tblr-btn-hover-color: var(--tblr-cyan-fg);--tblr-btn-hover-bg: rgba(var(--tblr-cyan-rgb), .8);--tblr-btn-active-color: var(--tblr-cyan-fg);--tblr-btn-active-bg: rgba(var(--tblr-cyan-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-cyan);--tblr-btn-disabled-color: var(--tblr-cyan-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-cyan{--tblr-btn-color: var(--tblr-cyan);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-cyan);--tblr-btn-hover-color: var(--tblr-cyan-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-cyan);--tblr-btn-active-color: var(--tblr-cyan-fg);--tblr-btn-active-bg: var(--tblr-cyan);--tblr-btn-disabled-color: var(--tblr-cyan);--tblr-btn-disabled-border-color: var(--tblr-cyan)}.btn-facebook{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-facebook-fg);--tblr-btn-bg: var(--tblr-facebook);--tblr-btn-hover-color: var(--tblr-facebook-fg);--tblr-btn-hover-bg: rgba(var(--tblr-facebook-rgb), .8);--tblr-btn-active-color: var(--tblr-facebook-fg);--tblr-btn-active-bg: rgba(var(--tblr-facebook-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-facebook);--tblr-btn-disabled-color: var(--tblr-facebook-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-facebook{--tblr-btn-color: var(--tblr-facebook);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-facebook);--tblr-btn-hover-color: var(--tblr-facebook-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-facebook);--tblr-btn-active-color: var(--tblr-facebook-fg);--tblr-btn-active-bg: var(--tblr-facebook);--tblr-btn-disabled-color: var(--tblr-facebook);--tblr-btn-disabled-border-color: var(--tblr-facebook)}.btn-twitter{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-twitter-fg);--tblr-btn-bg: var(--tblr-twitter);--tblr-btn-hover-color: var(--tblr-twitter-fg);--tblr-btn-hover-bg: rgba(var(--tblr-twitter-rgb), .8);--tblr-btn-active-color: var(--tblr-twitter-fg);--tblr-btn-active-bg: rgba(var(--tblr-twitter-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-twitter);--tblr-btn-disabled-color: var(--tblr-twitter-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-twitter{--tblr-btn-color: var(--tblr-twitter);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-twitter);--tblr-btn-hover-color: var(--tblr-twitter-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-twitter);--tblr-btn-active-color: var(--tblr-twitter-fg);--tblr-btn-active-bg: var(--tblr-twitter);--tblr-btn-disabled-color: var(--tblr-twitter);--tblr-btn-disabled-border-color: var(--tblr-twitter)}.btn-linkedin{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-linkedin-fg);--tblr-btn-bg: var(--tblr-linkedin);--tblr-btn-hover-color: var(--tblr-linkedin-fg);--tblr-btn-hover-bg: rgba(var(--tblr-linkedin-rgb), .8);--tblr-btn-active-color: var(--tblr-linkedin-fg);--tblr-btn-active-bg: rgba(var(--tblr-linkedin-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-linkedin);--tblr-btn-disabled-color: var(--tblr-linkedin-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-linkedin{--tblr-btn-color: var(--tblr-linkedin);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-linkedin);--tblr-btn-hover-color: var(--tblr-linkedin-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-linkedin);--tblr-btn-active-color: var(--tblr-linkedin-fg);--tblr-btn-active-bg: var(--tblr-linkedin);--tblr-btn-disabled-color: var(--tblr-linkedin);--tblr-btn-disabled-border-color: var(--tblr-linkedin)}.btn-google{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-google-fg);--tblr-btn-bg: var(--tblr-google);--tblr-btn-hover-color: var(--tblr-google-fg);--tblr-btn-hover-bg: rgba(var(--tblr-google-rgb), .8);--tblr-btn-active-color: var(--tblr-google-fg);--tblr-btn-active-bg: rgba(var(--tblr-google-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-google);--tblr-btn-disabled-color: var(--tblr-google-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-google{--tblr-btn-color: var(--tblr-google);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-google);--tblr-btn-hover-color: var(--tblr-google-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-google);--tblr-btn-active-color: var(--tblr-google-fg);--tblr-btn-active-bg: var(--tblr-google);--tblr-btn-disabled-color: var(--tblr-google);--tblr-btn-disabled-border-color: var(--tblr-google)}.btn-youtube{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-youtube-fg);--tblr-btn-bg: var(--tblr-youtube);--tblr-btn-hover-color: var(--tblr-youtube-fg);--tblr-btn-hover-bg: rgba(var(--tblr-youtube-rgb), .8);--tblr-btn-active-color: var(--tblr-youtube-fg);--tblr-btn-active-bg: rgba(var(--tblr-youtube-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-youtube);--tblr-btn-disabled-color: var(--tblr-youtube-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-youtube{--tblr-btn-color: var(--tblr-youtube);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-youtube);--tblr-btn-hover-color: var(--tblr-youtube-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-youtube);--tblr-btn-active-color: var(--tblr-youtube-fg);--tblr-btn-active-bg: var(--tblr-youtube);--tblr-btn-disabled-color: var(--tblr-youtube);--tblr-btn-disabled-border-color: var(--tblr-youtube)}.btn-vimeo{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-vimeo-fg);--tblr-btn-bg: var(--tblr-vimeo);--tblr-btn-hover-color: var(--tblr-vimeo-fg);--tblr-btn-hover-bg: rgba(var(--tblr-vimeo-rgb), .8);--tblr-btn-active-color: var(--tblr-vimeo-fg);--tblr-btn-active-bg: rgba(var(--tblr-vimeo-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-vimeo);--tblr-btn-disabled-color: var(--tblr-vimeo-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-vimeo{--tblr-btn-color: var(--tblr-vimeo);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-vimeo);--tblr-btn-hover-color: var(--tblr-vimeo-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-vimeo);--tblr-btn-active-color: var(--tblr-vimeo-fg);--tblr-btn-active-bg: var(--tblr-vimeo);--tblr-btn-disabled-color: var(--tblr-vimeo);--tblr-btn-disabled-border-color: var(--tblr-vimeo)}.btn-dribbble{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-dribbble-fg);--tblr-btn-bg: var(--tblr-dribbble);--tblr-btn-hover-color: var(--tblr-dribbble-fg);--tblr-btn-hover-bg: rgba(var(--tblr-dribbble-rgb), .8);--tblr-btn-active-color: var(--tblr-dribbble-fg);--tblr-btn-active-bg: rgba(var(--tblr-dribbble-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-dribbble);--tblr-btn-disabled-color: var(--tblr-dribbble-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-dribbble{--tblr-btn-color: var(--tblr-dribbble);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-dribbble);--tblr-btn-hover-color: var(--tblr-dribbble-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-dribbble);--tblr-btn-active-color: var(--tblr-dribbble-fg);--tblr-btn-active-bg: var(--tblr-dribbble);--tblr-btn-disabled-color: var(--tblr-dribbble);--tblr-btn-disabled-border-color: var(--tblr-dribbble)}.btn-github{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-github-fg);--tblr-btn-bg: var(--tblr-github);--tblr-btn-hover-color: var(--tblr-github-fg);--tblr-btn-hover-bg: rgba(var(--tblr-github-rgb), .8);--tblr-btn-active-color: var(--tblr-github-fg);--tblr-btn-active-bg: rgba(var(--tblr-github-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-github);--tblr-btn-disabled-color: var(--tblr-github-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-github{--tblr-btn-color: var(--tblr-github);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-github);--tblr-btn-hover-color: var(--tblr-github-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-github);--tblr-btn-active-color: var(--tblr-github-fg);--tblr-btn-active-bg: var(--tblr-github);--tblr-btn-disabled-color: var(--tblr-github);--tblr-btn-disabled-border-color: var(--tblr-github)}.btn-instagram{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-instagram-fg);--tblr-btn-bg: var(--tblr-instagram);--tblr-btn-hover-color: var(--tblr-instagram-fg);--tblr-btn-hover-bg: rgba(var(--tblr-instagram-rgb), .8);--tblr-btn-active-color: var(--tblr-instagram-fg);--tblr-btn-active-bg: rgba(var(--tblr-instagram-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-instagram);--tblr-btn-disabled-color: var(--tblr-instagram-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-instagram{--tblr-btn-color: var(--tblr-instagram);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-instagram);--tblr-btn-hover-color: var(--tblr-instagram-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-instagram);--tblr-btn-active-color: var(--tblr-instagram-fg);--tblr-btn-active-bg: var(--tblr-instagram);--tblr-btn-disabled-color: var(--tblr-instagram);--tblr-btn-disabled-border-color: var(--tblr-instagram)}.btn-pinterest{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-pinterest-fg);--tblr-btn-bg: var(--tblr-pinterest);--tblr-btn-hover-color: var(--tblr-pinterest-fg);--tblr-btn-hover-bg: rgba(var(--tblr-pinterest-rgb), .8);--tblr-btn-active-color: var(--tblr-pinterest-fg);--tblr-btn-active-bg: rgba(var(--tblr-pinterest-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-pinterest);--tblr-btn-disabled-color: var(--tblr-pinterest-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-pinterest{--tblr-btn-color: var(--tblr-pinterest);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-pinterest);--tblr-btn-hover-color: var(--tblr-pinterest-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-pinterest);--tblr-btn-active-color: var(--tblr-pinterest-fg);--tblr-btn-active-bg: var(--tblr-pinterest);--tblr-btn-disabled-color: var(--tblr-pinterest);--tblr-btn-disabled-border-color: var(--tblr-pinterest)}.btn-vk{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-vk-fg);--tblr-btn-bg: var(--tblr-vk);--tblr-btn-hover-color: var(--tblr-vk-fg);--tblr-btn-hover-bg: rgba(var(--tblr-vk-rgb), .8);--tblr-btn-active-color: var(--tblr-vk-fg);--tblr-btn-active-bg: rgba(var(--tblr-vk-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-vk);--tblr-btn-disabled-color: var(--tblr-vk-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-vk{--tblr-btn-color: var(--tblr-vk);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-vk);--tblr-btn-hover-color: var(--tblr-vk-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-vk);--tblr-btn-active-color: var(--tblr-vk-fg);--tblr-btn-active-bg: var(--tblr-vk);--tblr-btn-disabled-color: var(--tblr-vk);--tblr-btn-disabled-border-color: var(--tblr-vk)}.btn-rss{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-rss-fg);--tblr-btn-bg: var(--tblr-rss);--tblr-btn-hover-color: var(--tblr-rss-fg);--tblr-btn-hover-bg: rgba(var(--tblr-rss-rgb), .8);--tblr-btn-active-color: var(--tblr-rss-fg);--tblr-btn-active-bg: rgba(var(--tblr-rss-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-rss);--tblr-btn-disabled-color: var(--tblr-rss-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-rss{--tblr-btn-color: var(--tblr-rss);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-rss);--tblr-btn-hover-color: var(--tblr-rss-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-rss);--tblr-btn-active-color: var(--tblr-rss-fg);--tblr-btn-active-bg: var(--tblr-rss);--tblr-btn-disabled-color: var(--tblr-rss);--tblr-btn-disabled-border-color: var(--tblr-rss)}.btn-flickr{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-flickr-fg);--tblr-btn-bg: var(--tblr-flickr);--tblr-btn-hover-color: var(--tblr-flickr-fg);--tblr-btn-hover-bg: rgba(var(--tblr-flickr-rgb), .8);--tblr-btn-active-color: var(--tblr-flickr-fg);--tblr-btn-active-bg: rgba(var(--tblr-flickr-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-flickr);--tblr-btn-disabled-color: var(--tblr-flickr-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-flickr{--tblr-btn-color: var(--tblr-flickr);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-flickr);--tblr-btn-hover-color: var(--tblr-flickr-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-flickr);--tblr-btn-active-color: var(--tblr-flickr-fg);--tblr-btn-active-bg: var(--tblr-flickr);--tblr-btn-disabled-color: var(--tblr-flickr);--tblr-btn-disabled-border-color: var(--tblr-flickr)}.btn-bitbucket{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-bitbucket-fg);--tblr-btn-bg: var(--tblr-bitbucket);--tblr-btn-hover-color: var(--tblr-bitbucket-fg);--tblr-btn-hover-bg: rgba(var(--tblr-bitbucket-rgb), .8);--tblr-btn-active-color: var(--tblr-bitbucket-fg);--tblr-btn-active-bg: rgba(var(--tblr-bitbucket-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-bitbucket);--tblr-btn-disabled-color: var(--tblr-bitbucket-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-bitbucket{--tblr-btn-color: var(--tblr-bitbucket);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-bitbucket);--tblr-btn-hover-color: var(--tblr-bitbucket-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-bitbucket);--tblr-btn-active-color: var(--tblr-bitbucket-fg);--tblr-btn-active-bg: var(--tblr-bitbucket);--tblr-btn-disabled-color: var(--tblr-bitbucket);--tblr-btn-disabled-border-color: var(--tblr-bitbucket)}.btn-tabler{--tblr-btn-border-color: transparent;--tblr-btn-hover-border-color: transparent;--tblr-btn-active-border-color: transparent;--tblr-btn-color: var(--tblr-tabler-fg);--tblr-btn-bg: var(--tblr-tabler);--tblr-btn-hover-color: var(--tblr-tabler-fg);--tblr-btn-hover-bg: rgba(var(--tblr-tabler-rgb), .8);--tblr-btn-active-color: var(--tblr-tabler-fg);--tblr-btn-active-bg: rgba(var(--tblr-tabler-rgb), .8);--tblr-btn-disabled-bg: var(--tblr-tabler);--tblr-btn-disabled-color: var(--tblr-tabler-fg);--tblr-btn-box-shadow: var(--tblr-box-shadow-input)}.btn-outline-tabler{--tblr-btn-color: var(--tblr-tabler);--tblr-btn-bg: transparent;--tblr-btn-border-color: var(--tblr-tabler);--tblr-btn-hover-color: var(--tblr-tabler-fg);--tblr-btn-hover-border-color: transparent;--tblr-btn-hover-bg: var(--tblr-tabler);--tblr-btn-active-color: var(--tblr-tabler-fg);--tblr-btn-active-bg: var(--tblr-tabler);--tblr-btn-disabled-color: var(--tblr-tabler);--tblr-btn-disabled-border-color: var(--tblr-tabler)}.btn-ghost-primary{--tblr-btn-color: var(--tblr-primary);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-primary-fg);--tblr-btn-hover-bg: var(--tblr-primary);--tblr-btn-hover-border-color: var(--tblr-primary);--tblr-btn-active-color: var(--tblr-primary-fg);--tblr-btn-active-bg: var(--tblr-primary);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-primary);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-secondary{--tblr-btn-color: var(--tblr-secondary);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-secondary-fg);--tblr-btn-hover-bg: var(--tblr-secondary);--tblr-btn-hover-border-color: var(--tblr-secondary);--tblr-btn-active-color: var(--tblr-secondary-fg);--tblr-btn-active-bg: var(--tblr-secondary);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-secondary);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-success{--tblr-btn-color: var(--tblr-success);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-success-fg);--tblr-btn-hover-bg: var(--tblr-success);--tblr-btn-hover-border-color: var(--tblr-success);--tblr-btn-active-color: var(--tblr-success-fg);--tblr-btn-active-bg: var(--tblr-success);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-success);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-info{--tblr-btn-color: var(--tblr-info);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-info-fg);--tblr-btn-hover-bg: var(--tblr-info);--tblr-btn-hover-border-color: var(--tblr-info);--tblr-btn-active-color: var(--tblr-info-fg);--tblr-btn-active-bg: var(--tblr-info);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-info);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-warning{--tblr-btn-color: var(--tblr-warning);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-warning-fg);--tblr-btn-hover-bg: var(--tblr-warning);--tblr-btn-hover-border-color: var(--tblr-warning);--tblr-btn-active-color: var(--tblr-warning-fg);--tblr-btn-active-bg: var(--tblr-warning);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-warning);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-danger{--tblr-btn-color: var(--tblr-danger);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-danger-fg);--tblr-btn-hover-bg: var(--tblr-danger);--tblr-btn-hover-border-color: var(--tblr-danger);--tblr-btn-active-color: var(--tblr-danger-fg);--tblr-btn-active-bg: var(--tblr-danger);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-danger);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-light{--tblr-btn-color: var(--tblr-light);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-light-fg);--tblr-btn-hover-bg: var(--tblr-light);--tblr-btn-hover-border-color: var(--tblr-light);--tblr-btn-active-color: var(--tblr-light-fg);--tblr-btn-active-bg: var(--tblr-light);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-light);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-dark{--tblr-btn-color: var(--tblr-dark);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-dark-fg);--tblr-btn-hover-bg: var(--tblr-dark);--tblr-btn-hover-border-color: var(--tblr-dark);--tblr-btn-active-color: var(--tblr-dark-fg);--tblr-btn-active-bg: var(--tblr-dark);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-dark);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-muted{--tblr-btn-color: var(--tblr-muted);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-muted-fg);--tblr-btn-hover-bg: var(--tblr-muted);--tblr-btn-hover-border-color: var(--tblr-muted);--tblr-btn-active-color: var(--tblr-muted-fg);--tblr-btn-active-bg: var(--tblr-muted);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-muted);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-blue{--tblr-btn-color: var(--tblr-blue);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-blue-fg);--tblr-btn-hover-bg: var(--tblr-blue);--tblr-btn-hover-border-color: var(--tblr-blue);--tblr-btn-active-color: var(--tblr-blue-fg);--tblr-btn-active-bg: var(--tblr-blue);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-blue);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-azure{--tblr-btn-color: var(--tblr-azure);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-azure-fg);--tblr-btn-hover-bg: var(--tblr-azure);--tblr-btn-hover-border-color: var(--tblr-azure);--tblr-btn-active-color: var(--tblr-azure-fg);--tblr-btn-active-bg: var(--tblr-azure);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-azure);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-indigo{--tblr-btn-color: var(--tblr-indigo);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-indigo-fg);--tblr-btn-hover-bg: var(--tblr-indigo);--tblr-btn-hover-border-color: var(--tblr-indigo);--tblr-btn-active-color: var(--tblr-indigo-fg);--tblr-btn-active-bg: var(--tblr-indigo);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-indigo);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-purple{--tblr-btn-color: var(--tblr-purple);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-purple-fg);--tblr-btn-hover-bg: var(--tblr-purple);--tblr-btn-hover-border-color: var(--tblr-purple);--tblr-btn-active-color: var(--tblr-purple-fg);--tblr-btn-active-bg: var(--tblr-purple);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-purple);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-pink{--tblr-btn-color: var(--tblr-pink);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-pink-fg);--tblr-btn-hover-bg: var(--tblr-pink);--tblr-btn-hover-border-color: var(--tblr-pink);--tblr-btn-active-color: var(--tblr-pink-fg);--tblr-btn-active-bg: var(--tblr-pink);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-pink);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-red{--tblr-btn-color: var(--tblr-red);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-red-fg);--tblr-btn-hover-bg: var(--tblr-red);--tblr-btn-hover-border-color: var(--tblr-red);--tblr-btn-active-color: var(--tblr-red-fg);--tblr-btn-active-bg: var(--tblr-red);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-red);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-orange{--tblr-btn-color: var(--tblr-orange);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-orange-fg);--tblr-btn-hover-bg: var(--tblr-orange);--tblr-btn-hover-border-color: var(--tblr-orange);--tblr-btn-active-color: var(--tblr-orange-fg);--tblr-btn-active-bg: var(--tblr-orange);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-orange);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-yellow{--tblr-btn-color: var(--tblr-yellow);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-yellow-fg);--tblr-btn-hover-bg: var(--tblr-yellow);--tblr-btn-hover-border-color: var(--tblr-yellow);--tblr-btn-active-color: var(--tblr-yellow-fg);--tblr-btn-active-bg: var(--tblr-yellow);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-yellow);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-lime{--tblr-btn-color: var(--tblr-lime);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-lime-fg);--tblr-btn-hover-bg: var(--tblr-lime);--tblr-btn-hover-border-color: var(--tblr-lime);--tblr-btn-active-color: var(--tblr-lime-fg);--tblr-btn-active-bg: var(--tblr-lime);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-lime);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-green{--tblr-btn-color: var(--tblr-green);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-green-fg);--tblr-btn-hover-bg: var(--tblr-green);--tblr-btn-hover-border-color: var(--tblr-green);--tblr-btn-active-color: var(--tblr-green-fg);--tblr-btn-active-bg: var(--tblr-green);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-green);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-teal{--tblr-btn-color: var(--tblr-teal);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-teal-fg);--tblr-btn-hover-bg: var(--tblr-teal);--tblr-btn-hover-border-color: var(--tblr-teal);--tblr-btn-active-color: var(--tblr-teal-fg);--tblr-btn-active-bg: var(--tblr-teal);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-teal);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-cyan{--tblr-btn-color: var(--tblr-cyan);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-cyan-fg);--tblr-btn-hover-bg: var(--tblr-cyan);--tblr-btn-hover-border-color: var(--tblr-cyan);--tblr-btn-active-color: var(--tblr-cyan-fg);--tblr-btn-active-bg: var(--tblr-cyan);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-cyan);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-facebook{--tblr-btn-color: var(--tblr-facebook);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-facebook-fg);--tblr-btn-hover-bg: var(--tblr-facebook);--tblr-btn-hover-border-color: var(--tblr-facebook);--tblr-btn-active-color: var(--tblr-facebook-fg);--tblr-btn-active-bg: var(--tblr-facebook);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-facebook);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-twitter{--tblr-btn-color: var(--tblr-twitter);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-twitter-fg);--tblr-btn-hover-bg: var(--tblr-twitter);--tblr-btn-hover-border-color: var(--tblr-twitter);--tblr-btn-active-color: var(--tblr-twitter-fg);--tblr-btn-active-bg: var(--tblr-twitter);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-twitter);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-linkedin{--tblr-btn-color: var(--tblr-linkedin);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-linkedin-fg);--tblr-btn-hover-bg: var(--tblr-linkedin);--tblr-btn-hover-border-color: var(--tblr-linkedin);--tblr-btn-active-color: var(--tblr-linkedin-fg);--tblr-btn-active-bg: var(--tblr-linkedin);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-linkedin);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-google{--tblr-btn-color: var(--tblr-google);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-google-fg);--tblr-btn-hover-bg: var(--tblr-google);--tblr-btn-hover-border-color: var(--tblr-google);--tblr-btn-active-color: var(--tblr-google-fg);--tblr-btn-active-bg: var(--tblr-google);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-google);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-youtube{--tblr-btn-color: var(--tblr-youtube);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-youtube-fg);--tblr-btn-hover-bg: var(--tblr-youtube);--tblr-btn-hover-border-color: var(--tblr-youtube);--tblr-btn-active-color: var(--tblr-youtube-fg);--tblr-btn-active-bg: var(--tblr-youtube);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-youtube);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-vimeo{--tblr-btn-color: var(--tblr-vimeo);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-vimeo-fg);--tblr-btn-hover-bg: var(--tblr-vimeo);--tblr-btn-hover-border-color: var(--tblr-vimeo);--tblr-btn-active-color: var(--tblr-vimeo-fg);--tblr-btn-active-bg: var(--tblr-vimeo);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-vimeo);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-dribbble{--tblr-btn-color: var(--tblr-dribbble);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-dribbble-fg);--tblr-btn-hover-bg: var(--tblr-dribbble);--tblr-btn-hover-border-color: var(--tblr-dribbble);--tblr-btn-active-color: var(--tblr-dribbble-fg);--tblr-btn-active-bg: var(--tblr-dribbble);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-dribbble);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-github{--tblr-btn-color: var(--tblr-github);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-github-fg);--tblr-btn-hover-bg: var(--tblr-github);--tblr-btn-hover-border-color: var(--tblr-github);--tblr-btn-active-color: var(--tblr-github-fg);--tblr-btn-active-bg: var(--tblr-github);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-github);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-instagram{--tblr-btn-color: var(--tblr-instagram);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-instagram-fg);--tblr-btn-hover-bg: var(--tblr-instagram);--tblr-btn-hover-border-color: var(--tblr-instagram);--tblr-btn-active-color: var(--tblr-instagram-fg);--tblr-btn-active-bg: var(--tblr-instagram);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-instagram);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-pinterest{--tblr-btn-color: var(--tblr-pinterest);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-pinterest-fg);--tblr-btn-hover-bg: var(--tblr-pinterest);--tblr-btn-hover-border-color: var(--tblr-pinterest);--tblr-btn-active-color: var(--tblr-pinterest-fg);--tblr-btn-active-bg: var(--tblr-pinterest);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-pinterest);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-vk{--tblr-btn-color: var(--tblr-vk);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-vk-fg);--tblr-btn-hover-bg: var(--tblr-vk);--tblr-btn-hover-border-color: var(--tblr-vk);--tblr-btn-active-color: var(--tblr-vk-fg);--tblr-btn-active-bg: var(--tblr-vk);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-vk);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-rss{--tblr-btn-color: var(--tblr-rss);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-rss-fg);--tblr-btn-hover-bg: var(--tblr-rss);--tblr-btn-hover-border-color: var(--tblr-rss);--tblr-btn-active-color: var(--tblr-rss-fg);--tblr-btn-active-bg: var(--tblr-rss);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-rss);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-flickr{--tblr-btn-color: var(--tblr-flickr);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-flickr-fg);--tblr-btn-hover-bg: var(--tblr-flickr);--tblr-btn-hover-border-color: var(--tblr-flickr);--tblr-btn-active-color: var(--tblr-flickr-fg);--tblr-btn-active-bg: var(--tblr-flickr);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-flickr);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-bitbucket{--tblr-btn-color: var(--tblr-bitbucket);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-bitbucket-fg);--tblr-btn-hover-bg: var(--tblr-bitbucket);--tblr-btn-hover-border-color: var(--tblr-bitbucket);--tblr-btn-active-color: var(--tblr-bitbucket-fg);--tblr-btn-active-bg: var(--tblr-bitbucket);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-bitbucket);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-ghost-tabler{--tblr-btn-color: var(--tblr-tabler);--tblr-btn-bg: transparent;--tblr-btn-border-color: transparent;--tblr-btn-hover-color: var(--tblr-tabler-fg);--tblr-btn-hover-bg: var(--tblr-tabler);--tblr-btn-hover-border-color: var(--tblr-tabler);--tblr-btn-active-color: var(--tblr-tabler-fg);--tblr-btn-active-bg: var(--tblr-tabler);--tblr-btn-active-border-color: transparent;--tblr-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);--tblr-btn-disabled-color: var(--tblr-tabler);--tblr-btn-disabled-bg: transparent;--tblr-btn-disabled-border-color: transparent;--tblr-gradient: none;--tblr-btn-box-shadow: none}.btn-sm,.btn-group-sm>.btn{--tblr-btn-line-height: 1.5;--tblr-btn-icon-size: .75rem}.btn-lg,.btn-group-lg>.btn{--tblr-btn-line-height: 1.5;--tblr-btn-icon-size: 2rem}.btn-pill{padding-right:1.5em;padding-left:1.5em;border-radius:10rem}.btn-pill[class*=btn-icon]{padding:.375rem 15px}.btn-square{border-radius:0}.btn-icon{min-width:calc(var(--tblr-btn-line-height) * var(--tblr-btn-font-size) + var(--tblr-btn-padding-y) * 2 + var(--tblr-btn-border-width) * 2);min-height:calc(var(--tblr-btn-line-height) * var(--tblr-btn-font-size) + var(--tblr-btn-padding-y) * 2 + var(--tblr-btn-border-width) * 2);padding-left:0;padding-right:0}.btn-icon .icon{margin:calc(-1 * var(--tblr-btn-padding-x))}.btn-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.btn-floating{position:fixed;z-index:1030;bottom:1.5rem;right:1.5rem;border-radius:100rem}.btn-loading{position:relative;color:transparent!important;text-shadow:none!important;pointer-events:none}.btn-loading>*{opacity:0}.btn-loading:after{content:"";display:inline-block;vertical-align:text-bottom;border:2px var(--tblr-border-style) currentColor;border-right-color:transparent;border-radius:100rem;color:var(--tblr-btn-color);position:absolute;width:var(--tblr-btn-icon-size);height:var(--tblr-btn-icon-size);left:calc(50% - var(--tblr-btn-icon-size) / 2);top:calc(50% - var(--tblr-btn-icon-size) / 2);animation:spinner-border .75s linear infinite}.btn-action{padding:0;border:0;color:var(--tblr-secondary);display:inline-flex;width:2rem;height:2rem;align-items:center;justify-content:center;border-radius:var(--tblr-border-radius);background:transparent}.btn-action:after{content:none}.btn-action:focus{outline:none;box-shadow:none}.btn-action:hover,.btn-action.show{color:var(--tblr-body-color);background:var(--tblr-active-bg)}.btn-action.show{color:var(--tblr-primary)}.btn-action .icon{margin:0;width:1.25rem;height:1.25rem;font-size:1.25rem;stroke-width:1}.btn-actions{display:flex}.btn-group,.btn-group-vertical{box-shadow:var(--tblr-box-shadow-input)}.btn-group>.btn-check:checked+.btn,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:5}.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus{z-index:1}.calendar{display:block;font-size:.765625rem;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.calendar-nav{display:flex;align-items:center}.calendar-title{flex:1;text-align:center}.calendar-body,.calendar-header{display:flex;flex-wrap:wrap;justify-content:flex-start;padding:.5rem 0}.calendar-header{color:var(--tblr-secondary)}.calendar-date{flex:0 0 14.2857142857%;max-width:14.2857142857%;padding:.2rem;text-align:center;border:0}.calendar-date.prev-month,.calendar-date.next-month{opacity:.25}.calendar-date .date-item{position:relative;display:inline-block;width:1.4rem;height:1.4rem;line-height:1.4rem;color:#66758c;text-align:center;text-decoration:none;white-space:nowrap;vertical-align:middle;cursor:pointer;background:0 0;border:var(--tblr-border-width) var(--tblr-border-style) transparent;border-radius:100rem;outline:0;transition:background .3s,border .3s,box-shadow .32s,color .3s}@media (prefers-reduced-motion: reduce){.calendar-date .date-item{transition:none}}.calendar-date .date-item:hover{color:var(--tblr-primary);text-decoration:none;background:#fefeff;border-color:var(--tblr-border-color)}.calendar-date .date-today{color:var(--tblr-primary);border-color:var(--tblr-border-color)}.calendar-range{position:relative}.calendar-range:before{position:absolute;top:50%;right:0;left:0;height:1.4rem;content:"";background:rgba(var(--tblr-primary-rgb),.1);transform:translateY(-50%)}.calendar-range.range-start .date-item,.calendar-range.range-end .date-item{color:#fff;background:var(--tblr-primary);border-color:var(--tblr-primary)}.calendar-range.range-start:before{left:50%}.calendar-range.range-end:before{right:50%}.carousel-indicators-vertical{left:auto;top:0;margin:0 1rem 0 0;flex-direction:column}.carousel-indicators-vertical [data-bs-target]{margin:3px 0;width:3px;height:30px;border:0;border-left:10px var(--tblr-border-style) transparent;border-right:10px var(--tblr-border-style) transparent}.carousel-indicators-dot [data-bs-target]{width:.5rem;height:.5rem;border-radius:100rem;border:10px var(--tblr-border-style) transparent;margin:0}.carousel-indicators-thumb [data-bs-target]{width:2rem;height:auto;background:no-repeat center/cover;border:0;border-radius:var(--tblr-border-radius);box-shadow:rgba(var(--tblr-body-color-rgb),.04) 0 2px 4px;margin:0 3px;opacity:.75}@media (min-width: 992px){.carousel-indicators-thumb [data-bs-target]{width:4rem}}.carousel-indicators-thumb [data-bs-target]:before{content:"";padding-top:var(--tblr-aspect-ratio, 100%);display:block}.carousel-indicators-thumb.carousel-indicators-vertical [data-bs-target]{margin:3px 0}.carousel-caption-background{background:red;position:absolute;left:0;right:0;bottom:0;height:90%;background:linear-gradient(0deg,#182433e6,#18243300)}.card{transition:transform .3s ease-out,opacity .3s ease-out,box-shadow .3s ease-out}@media (prefers-reduced-motion: reduce){.card{transition:none}}@media print{.card{border:none;box-shadow:none}}a.card{color:inherit}a.card:hover{text-decoration:none;box-shadow:rgba(var(--tblr-body-color-rgb),.16) 0 2px 16px}.card .card{box-shadow:none}.card-borderless,.card-borderless .card-header,.card-borderless .card-footer{border-color:transparent}.card-stamp{--tblr-stamp-size: 7rem;position:absolute;top:0;right:0;width:calc(var(--tblr-stamp-size) * 1);height:calc(var(--tblr-stamp-size) * 1);max-height:100%;border-top-right-radius:4px;opacity:.2;overflow:hidden;pointer-events:none}.card-stamp-lg{--tblr-stamp-size: 13rem}.card-stamp-icon{background:var(--tblr-secondary);color:var(--tblr-card-bg, var(--tblr-bg-surface));display:flex;align-items:center;justify-content:center;border-radius:100rem;width:calc(var(--tblr-stamp-size) * 1);height:calc(var(--tblr-stamp-size) * 1);position:relative;top:calc(var(--tblr-stamp-size) * -.25);right:calc(var(--tblr-stamp-size) * -.25);font-size:calc(var(--tblr-stamp-size) * .75);transform:rotate(10deg)}.card-stamp-icon .icon{stroke-width:2;width:calc(var(--tblr-stamp-size) * .75);height:calc(var(--tblr-stamp-size) * .75)}.card-img,.card-img-start{border-top-left-radius:calc(var(--tblr-border-radius) - (var(--tblr-border-width)));border-bottom-left-radius:calc(var(--tblr-border-radius) - (var(--tblr-border-width)))}.card-img,.card-img-end{border-top-right-radius:calc(var(--tblr-border-radius) - (var(--tblr-border-width)));border-bottom-right-radius:calc(var(--tblr-border-radius) - (var(--tblr-border-width)))}.card-img-overlay{display:flex;flex-direction:column;justify-content:flex-end}.card-img-overlay-dark{background-image:linear-gradient(180deg,#0000,#0009)}.card-inactive{pointer-events:none;box-shadow:none}.card-inactive .card-body{opacity:.64}.card-active{--tblr-card-border-color: var(--tblr-primary);--tblr-card-bg: var(--tblr-active-bg)}.card-btn{display:flex;align-items:center;justify-content:center;padding:1.25rem;text-align:center;transition:background .3s;border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);flex:1;color:inherit;font-weight:var(--tblr-font-weight-medium)}@media (prefers-reduced-motion: reduce){.card-btn{transition:none}}.card-btn:hover{text-decoration:none;background:rgba(var(--tblr-primary-rgb),.04)}.card-btn+.card-btn{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-stacked{--tblr-card-stacked-offset: .25rem;position:relative}.card-stacked:after{position:absolute;top:calc(-1 * var(--tblr-card-stacked-offset));right:var(--tblr-card-stacked-offset);left:var(--tblr-card-stacked-offset);height:var(--tblr-card-stacked-offset);content:"";background:var(--tblr-card-bg, var(--tblr-bg-surface));border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-card-border-color);border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-cover{position:relative;padding:1.25rem;background:#666 no-repeat center/cover}.card-cover:before{position:absolute;inset:0;content:"";background:#1824337a}.card-cover:first-child,.card-cover:first-child:before{border-radius:4px 4px 0 0}.card-cover-blurred:before{backdrop-filter:blur(2px)}.card-actions{margin:-.5rem -.5rem -.5rem auto;padding-left:.5rem}.card-actions a{text-decoration:none}.card-header{color:inherit;display:flex;align-items:center;background:transparent}.card-header:first-child{border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-header-light{border-bottom-color:transparent;background:var(--tblr-bg-surface-tertiary)}.card-header-tabs{background:var(--tblr-bg-surface-tertiary);flex:1;margin:calc(var(--tblr-card-cap-padding-y) * -1) calc(var(--tblr-card-cap-padding-x) * -1) calc(var(--tblr-card-cap-padding-y) * -1);padding:calc(var(--tblr-card-cap-padding-y) * .5) calc(var(--tblr-card-cap-padding-x) * .5) 0}.card-header-pills{flex:1;margin-top:-.5rem;margin-bottom:-.5rem}.card-rotate-left{transform:rotate(-1.5deg)}.card-rotate-right{transform:rotate(1.5deg)}.card-link{color:inherit}.card-link:hover{color:inherit;text-decoration:none;box-shadow:0 1px 6px #00000014}.card-link-rotate:hover{transform:rotate(1.5deg);opacity:1}.card-link-pop:hover{transform:translateY(-2px);opacity:1}.card-footer{margin-top:auto}.card-footer:last-child{border-radius:0 0 var(--tblr-card-border-radius) var(--tblr-card-border-radius)}.card-footer-transparent{background:transparent;border-color:transparent;padding-top:0}.card-footer-borderless{border-top:none}.card-progress{height:.25rem}.card-progress:last-child{border-radius:0 0 2px 2px}.card-progress:first-child{border-radius:2px 2px 0 0}.card-meta{color:var(--tblr-secondary)}.card-title{display:block;margin:0 0 1rem;font-size:1rem;font-weight:var(--tblr-font-weight-medium);color:inherit;line-height:1.5rem}a.card-title:hover{color:inherit}.card-header .card-title{margin:0}.card-subtitle{margin-bottom:1.25rem;color:var(--tblr-secondary);font-weight:400}.card-header .card-subtitle{margin:0}.card-title .card-subtitle{margin:0 0 0 .25rem;font-size:.875rem}.card-body{position:relative}.card-body>:last-child{margin-bottom:0}.card-sm>.card-body{padding:1rem}@media (min-width: 768px){.card-md>.card-body{padding:2.5rem}}@media (min-width: 768px){.card-lg>.card-body{padding:2rem}}@media (min-width: 992px){.card-lg>.card-body{padding:4rem}}@media print{.card-body{padding:0}}.card-body+.card-body{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-body-scrollable{overflow:auto}.card-options{top:1.5rem;right:.75rem;display:flex;margin-left:auto}.card-options-link{display:inline-block;min-width:1rem;margin-left:.25rem;color:var(--tblr-secondary)}.card-status-top{position:absolute;top:0;right:0;left:0;height:2px;border-radius:var(--tblr-card-border-radius) var(--tblr-card-border-radius) 0 0}.card-status-start{position:absolute;right:auto;bottom:0;width:2px;height:100%;border-radius:var(--tblr-card-border-radius) 0 0 var(--tblr-card-border-radius)}.card-status-bottom{position:absolute;top:initial;bottom:0;width:100%;height:2px;border-radius:0 0 var(--tblr-card-border-radius) var(--tblr-card-border-radius)}.card-table{margin-bottom:0!important}.card-table tr td:first-child,.card-table tr th:first-child{padding-left:1.25rem;border-left:0}.card-table tr td:last-child,.card-table tr th:last-child{padding-right:1.25rem;border-right:0}.card-table thead tr:first-child,.card-table tbody tr:first-child,.card-table tfoot tr:first-child,.card-table thead tr:first-child td,.card-table thead tr:first-child th,.card-table tbody tr:first-child td,.card-table tbody tr:first-child th,.card-table tfoot tr:first-child td,.card-table tfoot tr:first-child th{border-top:0}.card-body+.card-table{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-table-border-color)}.card-code{padding:0}.card-code .highlight{margin:0;border:0}.card-code pre{margin:0!important;border:0!important}.card-chart{position:relative;z-index:1;height:3.5rem}.card-avatar{margin-left:auto;margin-right:auto;box-shadow:0 0 0 .25rem var(--tblr-card-bg, var(--tblr-bg-surface));margin-top:calc(-1 * var(--tblr-avatar-size) * .5)}.card-body+.card-list-group{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.card-list-group .list-group-item{padding-right:1.25rem;padding-left:1.25rem;border-right:0;border-left:0;border-radius:0}.card-list-group .list-group-item:last-child{border-bottom:0}.card-list-group .list-group-item:first-child{border-top:0}.card-tabs .nav-tabs{position:relative;z-index:1000;border-bottom:0}.card-tabs .nav-tabs .nav-link{background:var(--tblr-bg-surface-tertiary);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.card-tabs .nav-tabs .nav-link.active,.card-tabs .nav-tabs .nav-link:active,.card-tabs .nav-tabs .nav-link:hover{border-color:var(--tblr-border-color-translucent);color:var(--tblr-body-color)}.card-tabs .nav-tabs .nav-link.active{color:inherit;background:var(--tblr-card-bg, var(--tblr-bg-surface));border-bottom-color:transparent}.card-tabs .nav-tabs .nav-item:not(:first-child) .nav-link{border-top-left-radius:0}.card-tabs .nav-tabs .nav-item:not(:last-child) .nav-link{border-top-right-radius:0}.card-tabs .nav-tabs .nav-item+.nav-item{margin-left:calc(-1 * var(--tblr-border-width))}.card-tabs .nav-tabs-bottom,.card-tabs .nav-tabs-bottom .nav-link{margin-bottom:0}.card-tabs .nav-tabs-bottom .nav-link.active{border-top-color:transparent}.card-tabs .nav-tabs-bottom .nav-item{margin-top:calc(-1 * var(--tblr-border-width));margin-bottom:0}.card-tabs .nav-tabs-bottom .nav-item .nav-link{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);border-radius:0 0 var(--tblr-border-radius) var(--tblr-border-radius)}.card-tabs .nav-tabs-bottom .nav-item:not(:first-child) .nav-link{border-bottom-left-radius:0}.card-tabs .nav-tabs-bottom .nav-item:not(:last-child) .nav-link{border-bottom-right-radius:0}.card-tabs .card{border-bottom-left-radius:0}.card-tabs .nav-tabs+.tab-content .card{border-bottom-left-radius:var(--tblr-card-border-radius);border-top-left-radius:0}.card-note{--tblr-card-bg: #fff7dd;--tblr-card-border-color: #fff1c9}.btn-close{cursor:pointer}.btn-close:focus{outline:none}.dropdown-menu{user-select:none}.dropdown-menu.card{padding:0;min-width:25rem;display:none}.dropdown-menu.card.show{display:flex}.dropdown-item{min-width:11rem;display:flex;align-items:center;margin:0;line-height:1.4285714286}.dropdown-item-icon{width:1.25rem!important;height:1.25rem!important;margin-right:.5rem;color:var(--tblr-secondary);opacity:.7;text-align:center}.dropdown-item-indicator{margin-right:.5rem;margin-left:-.25rem;height:1.25rem;display:inline-flex;line-height:1;vertical-align:bottom;align-items:center}.dropdown-header{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);padding-bottom:.25rem;pointer-events:none}.dropdown-menu-scrollable{height:auto;max-height:13rem;overflow-x:hidden}.dropdown-menu-column{min-width:11rem}.dropdown-menu-column .dropdown-item{min-width:0}.dropdown-menu-columns{display:flex;flex:0 .25rem}.dropdown-menu-arrow:before{content:"";position:absolute;top:-.25rem;left:.75rem;display:block;background:inherit;width:14px;height:14px;transform:rotate(45deg);transform-origin:center;border:1px solid;border-color:inherit;z-index:-1;clip:rect(0px,9px,9px,0px)}.dropdown-menu-arrow.dropdown-menu-end:before{right:.75rem;left:auto}.dropend>.dropdown-menu{margin-top:calc(-.25rem - 1px);margin-left:-.25rem}.dropend .dropdown-toggle:after{margin-left:auto}.dropdown-menu-card{padding:0}.dropdown-menu-card>.card{margin:0;border:0;box-shadow:none}.datagrid{--tblr-datagrid-padding: 1.5rem;--tblr-datagrid-item-width: 15rem;display:grid;grid-gap:var(--tblr-datagrid-padding);grid-template-columns:repeat(auto-fit,minmax(var(--tblr-datagrid-item-width),1fr))}.datagrid-title{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);margin-bottom:.25rem}.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:1rem;text-align:center}@media (min-width: 768px){.empty{padding:3rem}}.empty-icon{margin:0 0 1rem;width:3rem;height:3rem;line-height:1;color:var(--tblr-secondary)}.empty-icon svg{width:100%;height:100%}.empty-img{margin:0 0 2rem;line-height:1}.empty-img img{height:8rem;width:auto}.empty-header{margin:0 0 1rem;font-size:4rem;font-weight:var(--tblr-font-weight-light);line-height:1;color:var(--tblr-secondary)}.empty-title{font-size:1.25rem;line-height:1.75rem;font-weight:var(--tblr-font-weight-bold)}.empty-title,.empty-subtitle{margin:0 0 .5rem}.empty-action{margin-top:1.5rem}.empty-bordered{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.row>*{min-width:0}.col-separator{border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.container-slim{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:16rem}.container-tight{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:30rem}.container-narrow{--tblr-gutter-x: calc(var(--tblr-page-padding) * 2);--tblr-gutter-y: 0;width:100%;padding-right:calc(var(--tblr-gutter-x) * .5);padding-left:calc(var(--tblr-gutter-x) * .5);margin-right:auto;margin-left:auto;max-width:45rem}.row-0{margin-right:0;margin-left:0}.row-0>.col,.row-0>[class*=col-]{padding-right:0;padding-left:0}.row-0 .card{margin-bottom:0}.row-sm{margin-right:-.375rem;margin-left:-.375rem}.row-sm>.col,.row-sm>[class*=col-]{padding-right:.375rem;padding-left:.375rem}.row-sm .card{margin-bottom:.75rem}.row-md{margin-right:-1.5rem;margin-left:-1.5rem}.row-md>.col,.row-md>[class*=col-]{padding-right:1.5rem;padding-left:1.5rem}.row-md .card{margin-bottom:3rem}.row-lg{margin-right:-3rem;margin-left:-3rem}.row-lg>.col,.row-lg>[class*=col-]{padding-right:3rem;padding-left:3rem}.row-lg .card{margin-bottom:6rem}.row-deck>.col,.row-deck>[class*=col-]{display:flex;align-items:stretch}.row-deck>.col .card,.row-deck>[class*=col-] .card{flex:1 1 auto}.row-cards{--tblr-gutter-x: var(--tblr-page-padding);--tblr-gutter-y: var(--tblr-page-padding);min-width:0}.row-cards .row-cards{flex:1}.space-y{display:flex;flex-direction:column;gap:1rem}.space-x{display:flex;gap:1rem}.space-y-0{display:flex;flex-direction:column;gap:0}.space-x-0{display:flex;gap:0}.space-y-1{display:flex;flex-direction:column;gap:.25rem}.space-x-1{display:flex;gap:.25rem}.space-y-2{display:flex;flex-direction:column;gap:.5rem}.space-x-2{display:flex;gap:.5rem}.space-y-3{display:flex;flex-direction:column;gap:1rem}.space-x-3{display:flex;gap:1rem}.space-y-4{display:flex;flex-direction:column;gap:1.5rem}.space-x-4{display:flex;gap:1.5rem}.space-y-5{display:flex;flex-direction:column;gap:2rem}.space-x-5{display:flex;gap:2rem}.space-y-6{display:flex;flex-direction:column;gap:3rem}.space-x-6{display:flex;gap:3rem}.space-y-7{display:flex;flex-direction:column;gap:5rem}.space-x-7{display:flex;gap:5rem}.space-y-8{display:flex;flex-direction:column;gap:8rem}.space-x-8{display:flex;gap:8rem}.divide-y>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y>:not(template):not(:first-child){padding-top:1rem!important}.divide-y>:not(template):not(:last-child){padding-bottom:1rem!important}.divide-x>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x>:not(template):not(:first-child){padding-left:1rem!important}.divide-x>:not(template):not(:last-child){padding-right:1rem!important}.divide-y-0>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-0>:not(template):not(:first-child){padding-top:0!important}.divide-y-0>:not(template):not(:last-child){padding-bottom:0!important}.divide-x-0>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-0>:not(template):not(:first-child){padding-left:0!important}.divide-x-0>:not(template):not(:last-child){padding-right:0!important}.divide-y-1>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-1>:not(template):not(:first-child){padding-top:.25rem!important}.divide-y-1>:not(template):not(:last-child){padding-bottom:.25rem!important}.divide-x-1>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-1>:not(template):not(:first-child){padding-left:.25rem!important}.divide-x-1>:not(template):not(:last-child){padding-right:.25rem!important}.divide-y-2>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-2>:not(template):not(:first-child){padding-top:.5rem!important}.divide-y-2>:not(template):not(:last-child){padding-bottom:.5rem!important}.divide-x-2>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-2>:not(template):not(:first-child){padding-left:.5rem!important}.divide-x-2>:not(template):not(:last-child){padding-right:.5rem!important}.divide-y-3>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-3>:not(template):not(:first-child){padding-top:1rem!important}.divide-y-3>:not(template):not(:last-child){padding-bottom:1rem!important}.divide-x-3>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-3>:not(template):not(:first-child){padding-left:1rem!important}.divide-x-3>:not(template):not(:last-child){padding-right:1rem!important}.divide-y-4>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-4>:not(template):not(:first-child){padding-top:1.5rem!important}.divide-y-4>:not(template):not(:last-child){padding-bottom:1.5rem!important}.divide-x-4>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-4>:not(template):not(:first-child){padding-left:1.5rem!important}.divide-x-4>:not(template):not(:last-child){padding-right:1.5rem!important}.divide-y-5>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-5>:not(template):not(:first-child){padding-top:2rem!important}.divide-y-5>:not(template):not(:last-child){padding-bottom:2rem!important}.divide-x-5>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-5>:not(template):not(:first-child){padding-left:2rem!important}.divide-x-5>:not(template):not(:last-child){padding-right:2rem!important}.divide-y-6>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-6>:not(template):not(:first-child){padding-top:3rem!important}.divide-y-6>:not(template):not(:last-child){padding-bottom:3rem!important}.divide-x-6>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-6>:not(template):not(:first-child){padding-left:3rem!important}.divide-x-6>:not(template):not(:last-child){padding-right:3rem!important}.divide-y-7>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-7>:not(template):not(:first-child){padding-top:5rem!important}.divide-y-7>:not(template):not(:last-child){padding-bottom:5rem!important}.divide-x-7>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-7>:not(template):not(:first-child){padding-left:5rem!important}.divide-x-7>:not(template):not(:last-child){padding-right:5rem!important}.divide-y-8>:not(template)~:not(template){border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-y-8>:not(template):not(:first-child){padding-top:8rem!important}.divide-y-8>:not(template):not(:last-child){padding-bottom:8rem!important}.divide-x-8>:not(template)~:not(template){border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)!important}.divide-x-8>:not(template):not(:first-child){padding-left:8rem!important}.divide-x-8>:not(template):not(:last-child){padding-right:8rem!important}.divide-y-fill{display:flex;flex-direction:column;height:100%}.divide-y-fill>:not(template){flex:1;display:flex;justify-content:center;flex-direction:column}.icon{--tblr-icon-size: 1.25rem;width:var(--tblr-icon-size);height:var(--tblr-icon-size);font-size:var(--tblr-icon-size);vertical-align:bottom;stroke-width:1.5}.icon:hover{text-decoration:none}.icon-inline{--tblr-icon-size: 1rem;vertical-align:-.2rem}.icon-filled{fill:currentColor}.icon-sm{--tblr-icon-size: 1rem;stroke-width:1}.icon-md{--tblr-icon-size: 2.5rem;stroke-width:1}.icon-lg{--tblr-icon-size: 3.5rem;stroke-width:1}.icon-pulse{transition:all .15s ease 0s;animation:pulse 2s ease infinite;animation-fill-mode:both}.icon-tada{transition:all .15s ease 0s;animation:tada 3s ease infinite;animation-fill-mode:both}.icon-rotate{transition:all .15s ease 0s;animation:rotate-360 3s linear infinite;animation-fill-mode:both}.img-responsive{--tblr-img-responsive-ratio: 75%;background:no-repeat center/cover;padding-top:var(--tblr-img-responsive-ratio)}.img-responsive-grid{padding-top:calc(var(--tblr-img-responsive-ratio) - var(--tblr-gutter-y) / 2)}.img-responsive-1x1{--tblr-img-responsive-ratio: 100%}.img-responsive-2x1{--tblr-img-responsive-ratio: 50%}.img-responsive-1x2{--tblr-img-responsive-ratio: 200%}.img-responsive-3x1{--tblr-img-responsive-ratio: 33.3333333333%}.img-responsive-1x3{--tblr-img-responsive-ratio: 300%}.img-responsive-4x3{--tblr-img-responsive-ratio: 75%}.img-responsive-3x4{--tblr-img-responsive-ratio: 133.3333333333%}.img-responsive-16x9{--tblr-img-responsive-ratio: 56.25%}.img-responsive-9x16{--tblr-img-responsive-ratio: 177.7777777778%}.img-responsive-21x9{--tblr-img-responsive-ratio: 42.8571428571%}.img-responsive-9x21{--tblr-img-responsive-ratio: 233.3333333333%}textarea[cols]{height:auto}.col-form-label,.form-label{display:block;font-weight:var(--tblr-font-weight-medium)}.col-form-label.required:after,.form-label.required:after{content:"*";margin-left:.25rem;color:#d63939}.form-label-description{float:right;font-weight:var(--tblr-font-weight-normal);color:var(--tblr-secondary)}.form-hint{display:block;color:var(--tblr-secondary)}.form-hint:last-child{margin-bottom:0}.form-hint+.form-control{margin-top:.25rem}.form-label+.form-hint{margin-top:-.25rem}.input-group+.form-hint,.form-control+.form-hint,.form-select+.form-hint{margin-top:.5rem}.form-select:-moz-focusring{color:var(--tblr-body-color)}.form-control:-webkit-autofill{box-shadow:0 0 0 1000px var(--tblr-body-bg) inset;color:var(--tblr-body-color);-webkit-text-fill-color:var(--tblr-body-color)}.form-control:disabled,.form-control.disabled{color:var(--tblr-secondary);user-select:none}.form-control[size]{width:auto}.form-control-light{background-color:var(--tblr-gray-100);border-color:transparent}.form-control-dark{background-color:#0000001a;color:#fff;border-color:transparent}.form-control-dark:focus{background-color:#0000001a;box-shadow:none;border-color:#ffffff3d}.form-control-dark::placeholder{color:#fff9}.form-control-rounded{border-radius:10rem}.form-control-flush{padding:0;background:none!important;border-color:transparent!important;resize:none;box-shadow:none!important;line-height:inherit}.form-footer{margin-top:2rem}.form-fieldset{padding:1rem;margin-bottom:1rem;background:var(--tblr-body-bg);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.form-help{display:inline-flex;font-weight:var(--tblr-font-weight-bold);align-items:center;justify-content:center;width:1.125rem;height:1.125rem;font-size:.75rem;color:var(--tblr-secondary);text-align:center;text-decoration:none;cursor:pointer;user-select:none;background:var(--tblr-gray-100);border-radius:100rem;transition:background-color .3s,color .3s}@media (prefers-reduced-motion: reduce){.form-help{transition:none}}.form-help:hover,.form-help[aria-describedby]{color:#fff;background:var(--tblr-primary)}.input-group{box-shadow:var(--tblr-box-shadow-input);border-radius:var(--tblr-border-radius)}.input-group .form-control,.input-group .btn{box-shadow:none}.input-group-link{font-size:.75rem}.input-group-flat:focus-within{box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25);border-radius:var(--tblr-border-radius)}.input-group-flat:focus-within .form-control,.input-group-flat:focus-within .input-group-text{border-color:#80c2be!important}.input-group-flat .form-control:focus{border-color:var(--tblr-border-color);box-shadow:none}.input-group-flat .form-control:not(:last-child){border-right:0}.input-group-flat .form-control:not(:first-child){border-left:0}.input-group-flat .input-group-text{background:var(--tblr-bg-forms);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion: reduce){.input-group-flat .input-group-text{transition:none}}.input-group-flat .input-group-text:first-child{padding-right:0}.input-group-flat .input-group-text:last-child{padding-left:0}.form-file-button{margin-left:0;border-left:0}.input-icon{position:relative}.input-icon .form-control:not(:last-child),.input-icon .form-select:not(:last-child){padding-right:2.5rem}.input-icon .form-control:not(:first-child),.input-icon .form-select:not(:last-child){padding-left:2.5rem}.input-icon-addon{position:absolute;top:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;min-width:2.5rem;color:var(--tblr-icon-color);pointer-events:none;font-size:1.2em}.input-icon-addon:last-child{right:0;left:auto}.form-colorinput{position:relative;display:inline-block;margin:0;line-height:1;cursor:pointer}.form-colorinput-input{position:absolute;z-index:-1;opacity:0}.form-colorinput-color{display:block;width:1.5rem;height:1.5rem;color:#fff;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);border-radius:3px;box-shadow:0 1px 2px #0000000d}.form-colorinput-color:before{position:absolute;top:0;left:0;width:100%;height:100%;content:"";background:no-repeat center center/1.25rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e");opacity:0;transition:opacity .3s}@media (prefers-reduced-motion: reduce){.form-colorinput-color:before{transition:none}}.form-colorinput-input:checked~.form-colorinput-color:before{opacity:1}.form-colorinput-input:focus~.form-colorinput-color{border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-colorinput-light .form-colorinput-color:before{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23182433' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-imagecheck{position:relative;margin:0;cursor:pointer}.form-imagecheck-input{position:absolute;z-index:-1;opacity:0}.form-imagecheck-figure{position:relative;display:block;margin:0;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:3px}.form-imagecheck-input:focus~.form-imagecheck-figure{border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-imagecheck-input:checked~.form-imagecheck-figure{border-color:var(--tblr-primary)}.form-imagecheck-figure:before{position:absolute;top:.25rem;left:.25rem;z-index:1;display:block;width:1.25rem;height:1.25rem;color:#fff;pointer-events:none;content:"";user-select:none;background:var(--tblr-bg-forms);border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:var(--tblr-border-radius);transition:opacity .3s}@media (prefers-reduced-motion: reduce){.form-imagecheck-figure:before{transition:none}}.form-imagecheck-input:checked~.form-imagecheck-figure:before{background-color:var(--tblr-primary);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e");background-repeat:repeat;background-position:center;background-size:1.25rem;border-color:var(--tblr-border-color-translucent)}.form-imagecheck-input[type=radio]~.form-imagecheck-figure:before{border-radius:50%}.form-imagecheck-input[type=radio]:checked~.form-imagecheck-figure:before{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-imagecheck-image{max-width:100%;display:block;opacity:.64;transition:opacity .3s}@media (prefers-reduced-motion: reduce){.form-imagecheck-image{transition:none}}.form-imagecheck-image:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.form-imagecheck-image:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.form-imagecheck:hover .form-imagecheck-image,.form-imagecheck-input:focus~.form-imagecheck-figure .form-imagecheck-image,.form-imagecheck-input:checked~.form-imagecheck-figure .form-imagecheck-image{opacity:1}.form-imagecheck-caption{padding:.25rem;font-size:.765625rem;color:var(--tblr-secondary);text-align:center;transition:color .3s}@media (prefers-reduced-motion: reduce){.form-imagecheck-caption{transition:none}}.form-imagecheck:hover .form-imagecheck-caption,.form-imagecheck-input:focus~.form-imagecheck-figure .form-imagecheck-caption,.form-imagecheck-input:checked~.form-imagecheck-figure .form-imagecheck-caption{color:var(--tblr-body-color)}.form-selectgroup{display:inline-flex;margin:0 -.5rem -.5rem 0;flex-wrap:wrap}.form-selectgroup .form-selectgroup-item{margin:0 .5rem .5rem 0}.form-selectgroup-vertical{flex-direction:column}.form-selectgroup-item{display:block;position:relative}.form-selectgroup-input{position:absolute;top:0;left:0;z-index:-1;opacity:0}.form-selectgroup-label{position:relative;display:block;min-width:calc(1.4285714286em + 1.125rem + calc(var(--tblr-border-width) * 2));margin:0;padding:.5625rem .75rem;font-size:.875rem;line-height:1.4285714286;color:var(--tblr-secondary);background:var(--tblr-bg-forms);text-align:center;cursor:pointer;user-select:none;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);border-radius:3px;box-shadow:var(--tblr-box-shadow-input);transition:border-color .3s,background .3s,color .3s}@media (prefers-reduced-motion: reduce){.form-selectgroup-label{transition:none}}.form-selectgroup-label .icon:only-child{margin:0 -.25rem}.form-selectgroup-label:hover{color:var(--tblr-body-color)}.form-selectgroup-check{display:inline-block;width:1.25rem;height:1.25rem;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);vertical-align:middle;box-shadow:var(--tblr-box-shadow-input)}.form-selectgroup-input[type=checkbox]+.form-selectgroup-label .form-selectgroup-check{border-radius:var(--tblr-border-radius)}.form-selectgroup-input[type=radio]+.form-selectgroup-label .form-selectgroup-check{border-radius:50%}.form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-check{background-color:var(--tblr-primary);background-repeat:repeat;background-position:center;background-size:1.25rem;border-color:var(--tblr-border-color-translucent)}.form-selectgroup-input[type=checkbox]:checked+.form-selectgroup-label .form-selectgroup-check{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e")}.form-selectgroup-input[type=radio]:checked+.form-selectgroup-label .form-selectgroup-check{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3ccircle r='3' fill='%23ffffff' cx='8' cy='8' /%3e%3c/svg%3e")}.form-selectgroup-check-floated{position:absolute;top:.5625rem;right:.5625rem}.form-selectgroup-input:checked+.form-selectgroup-label{z-index:1;color:var(--tblr-primary);background:rgba(var(--tblr-primary-rgb),.04);border-color:var(--tblr-primary)}.form-selectgroup-input:focus+.form-selectgroup-label{z-index:2;color:var(--tblr-primary);border-color:var(--tblr-primary);box-shadow:0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.form-selectgroup-boxes .form-selectgroup-label{text-align:left;padding:1.25rem;color:inherit}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label{color:inherit}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-title{color:var(--tblr-primary)}.form-selectgroup-boxes .form-selectgroup-input:checked+.form-selectgroup-label .form-selectgroup-label-content{opacity:1}.form-selectgroup-pills{flex-wrap:wrap;align-items:flex-start}.form-selectgroup-pills .form-selectgroup-item{flex-grow:0}.form-selectgroup-pills .form-selectgroup-label{border-radius:50px}.form-control-color::-webkit-color-swatch{border:none}[type=search]::-webkit-search-cancel-button{-webkit-appearance:none}.form-control::file-selector-button{background-color:var(--tblr-btn-color, var(--tblr-tertiary-bg))}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--tblr-btn-color, var(--tblr-secondary-bg))}.form-check{user-select:none}.form-check.form-check-highlight .form-check-input:not(:checked)~.form-check-label{color:var(--tblr-secondary)}.form-check .form-check-label-off{color:var(--tblr-secondary)}.form-check .form-check-input:checked~.form-check-label-off{display:none}.form-check .form-check-input:not(:checked)~.form-check-label-on{display:none}.form-check-input{background-size:1.25rem;margin-top:0rem;box-shadow:var(--tblr-box-shadow-input)}.form-switch .form-check-input{transition:background-color .3s,background-position .3s}@media (prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-check-label{display:block}.form-check-label.required:after{content:"*";margin-left:.25rem;color:#d63939}.form-check-description{display:block;color:var(--tblr-secondary);font-size:.75rem;margin-top:.25rem}.form-check-single,.form-check-single .form-check-input{margin:0}.form-switch .form-check-input{height:1.25rem;margin-top:0rem}.form-switch-lg{padding-left:3.5rem;min-height:1.5rem}.form-switch-lg .form-check-input{height:1.5rem;width:2.75rem;background-size:1.5rem;margin-left:-3.5rem}.form-switch-lg .form-check-label{padding-top:.125rem}.form-check-input:checked{border:none}.form-select.is-invalid-lite,.form-control.is-invalid-lite,.form-select.is-valid-lite,.form-control.is-valid-lite{border-color:var(--tblr-border-color)!important}.legend{--tblr-legend-size: .75em;display:inline-block;background:var(--tblr-border-color);width:var(--tblr-legend-size);height:var(--tblr-legend-size);border-radius:var(--tblr-border-radius-sm);border:1px solid var(--tblr-border-color-translucent)}.list-group{margin-left:0;margin-right:0}.list-group-header{background:var(--tblr-bg-surface-tertiary);padding:.5rem 1.25rem;font-size:.75rem;font-weight:var(--tblr-font-weight-medium);line-height:1;text-transform:uppercase;color:var(--tblr-secondary);border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.list-group-flush>.list-group-header:last-child{border-bottom-width:0}.list-group-item{background-color:inherit}.list-group-item.active{background-color:rgba(var(--tblr-secondary-rgb),.08);border-left-color:#00857d;border-left-width:2px}.list-group-item:active,.list-group-item:focus,.list-group-item:hover{background-color:rgba(var(--tblr-secondary-rgb),.08)}.list-group-item.disabled,.list-group-item:disabled{color:#929dab;background-color:rgba(var(--tblr-secondary-rgb),.08)}.list-bordered .list-item{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);margin-top:-1px}.list-bordered .list-item:first-child{border-top:none}.list-group-hoverable .list-group-item-actions{opacity:0;transition:opacity .3s}@media (prefers-reduced-motion: reduce){.list-group-hoverable .list-group-item-actions{transition:none}}.list-group-hoverable .list-group-item:hover .list-group-item-actions,.list-group-hoverable .list-group-item-actions.show{opacity:1}.list-group-transparent{--tblr-list-group-border-radius: 0;margin:0 -1.25rem}.list-group-transparent .list-group-item{background:none;border:0}.list-group-transparent .list-group-item .icon{color:var(--tblr-secondary)}.list-group-transparent .list-group-item.active{font-weight:var(--tblr-font-weight-bold);color:inherit;background:var(--tblr-active-bg)}.list-group-transparent .list-group-item.active .icon{color:inherit}.list-separated-item{padding:1rem 0}.list-separated-item:first-child{padding-top:0}.list-separated-item:last-child{padding-bottom:0}.list-separated-item+.list-separated-item{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.list-inline-item:not(:last-child){margin-right:auto;margin-inline-end:.5rem}.list-inline-dots .list-inline-item+.list-inline-item:before{content:" \b7 ";margin-inline-end:.5rem}.loader{position:relative;display:block;width:2.5rem;height:2.5rem;color:#0054a6;vertical-align:middle}.loader:after{position:absolute;top:0;left:0;width:100%;height:100%;content:"";border:1px var(--tblr-border-style);border-color:transparent;border-top-color:currentColor;border-left-color:currentColor;border-radius:100rem;animation:rotate-360 .6s linear;animation-iteration-count:infinite}.dimmer{position:relative}.dimmer .loader{position:absolute;top:50%;right:0;left:0;display:none;margin:0 auto;transform:translateY(-50%)}.dimmer.active .loader{display:block}.dimmer.active .dimmer-content{pointer-events:none;opacity:.1}@keyframes animated-dots{0%{transform:translate(-100%)}}.animated-dots{display:inline-block;overflow:hidden;vertical-align:bottom}.animated-dots:after{display:inline-block;content:"...";animation:animated-dots 1.2s steps(4,jump-none) infinite}.modal-content .btn-close{position:absolute;top:0;right:0;width:3.5rem;height:3.5rem;margin:0;padding:0;z-index:10}.modal-body{scrollbar-color:rgba(var(--tblr-scrollbar-color, var(--tblr-body-color-rgb)),.16) transparent}.modal-body::-webkit-scrollbar{width:1rem;height:1rem;transition:background .3s}@media (prefers-reduced-motion: reduce){.modal-body::-webkit-scrollbar{transition:none}}.modal-body::-webkit-scrollbar-thumb{border-radius:1rem;border:5px solid transparent;box-shadow:inset 0 0 0 1rem rgba(var(--tblr-scrollbar-color, var(--tblr-body-color-rgb)),.16)}.modal-body::-webkit-scrollbar-track{background:transparent}.modal-body:hover::-webkit-scrollbar-thumb{box-shadow:inset 0 0 0 1rem rgba(var(--tblr-scrollbar-color, var(--tblr-body-color-rgb)),.32)}.modal-body::-webkit-scrollbar-corner{background:transparent}.modal-body .modal-title{margin-bottom:1rem}.modal-body+.modal-body{border-top:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.modal-status{position:absolute;top:0;left:0;right:0;height:2px;background:var(--tblr-secondary);border-radius:var(--tblr-border-radius-lg) var(--tblr-border-radius-lg) 0 0}.modal-header{align-items:center;min-height:3.5rem;background:transparent;padding:0 3.5rem 0 1.5rem}.modal-title{font-size:1rem;font-weight:var(--tblr-font-weight-bold);color:inherit;line-height:1.4285714286}.modal-footer{padding-top:.75rem;padding-bottom:.75rem}.modal-blur{backdrop-filter:blur(4px)}.modal-full-width{max-width:none;margin:0 .5rem}.nav-vertical,.nav-vertical .nav{flex-direction:column;flex-wrap:nowrap}.nav-vertical .nav{margin-left:1.25rem;border-left:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);padding-left:.5rem}.nav-vertical .nav-link.active,.nav-vertical .nav-item.show .nav-link{font-weight:var(--tblr-font-weight-bold)}.nav-vertical.nav-pills{margin:0 -.75rem}.nav-bordered{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)}.nav-bordered .nav-item+.nav-item{margin-left:1.25rem}.nav-bordered .nav-link{padding-left:0;padding-right:0;margin:0 0 -var(--tblr-border-width);border:0;border-bottom:2px var(--tblr-border-style) transparent;color:var(--tblr-secondary)}.nav-bordered .nav-link.active,.nav-bordered .nav-item.show .nav-link{color:var(--tblr-primary);border-color:var(--tblr-primary)}.nav-link{display:flex;transition:color .3s;align-items:center}@media (prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link-toggle{margin-left:auto;padding:0 .25rem;transition:transform .3s}@media (prefers-reduced-motion: reduce){.nav-link-toggle{transition:none}}.nav-link-toggle:after{content:"";display:inline-block;vertical-align:.306em;width:.36em;height:.36em;border-bottom:1px var(--tblr-border-style);border-left:1px var(--tblr-border-style);margin-right:.1em;margin-left:.4em;transform:rotate(-45deg)}.nav-link-toggle:after{margin:0}.nav-link[aria-expanded=true] .nav-link-toggle{transform:rotate(180deg)}.nav-link-icon{width:1.25rem;height:1.25rem;margin-right:.5rem;color:var(--tblr-icon-color)}.nav-link-icon svg{display:block;height:100%}.nav-fill .nav-item .nav-link{justify-content:center}.stars{display:inline-flex;color:#bbc3cd;font-size:.75rem}.stars .star:not(:first-child){margin-left:.25rem}.pagination{user-select:none}.page-link{min-width:1.75rem;border-radius:var(--tblr-border-radius)}.page-item{text-align:center}.page-item:not(.active) .page-link:hover{background:transparent}.page-item.page-prev,.page-item.page-next{flex:0 0 50%;text-align:left}.page-item.page-next{margin-left:auto;text-align:right}.page-item-subtitle{margin-bottom:2px;font-size:12px;color:var(--tblr-secondary);text-transform:uppercase}.page-item.disabled .page-item-subtitle{color:var(--tblr-disabled-color)}.page-item-title{font-size:1rem;font-weight:var(--tblr-font-weight-normal);color:var(--tblr-body-color)}.page-link:hover .page-item-title{color:#00857d}.page-item.disabled .page-item-title{color:var(--tblr-disabled-color)}@keyframes progress-indeterminate{0%{right:100%;left:-35%}to,60%{right:-90%;left:100%}}.progress{position:relative;width:100%;line-height:.5rem;appearance:none}.progress::-webkit-progress-bar{background:var(--tblr-progress-bg)}.progress::-webkit-progress-value{background-color:var(--tblr-primary)}.progress::-moz-progress-bar{background-color:var(--tblr-primary)}.progress::-ms-fill{background-color:var(--tblr-primary);border:none}.progress-sm{height:.25rem}.progress-bar{height:100%}.progress-bar-indeterminate:after,.progress-bar-indeterminate:before{position:absolute;top:0;bottom:0;left:0;content:"";background-color:inherit;will-change:left,right}.progress-bar-indeterminate:before{animation:progress-indeterminate 1.5s cubic-bezier(.65,.815,.735,.395) infinite}.progress-separated .progress-bar{box-shadow:0 0 0 2px var(--tblr-card-bg, var(--tblr-bg-surface))}.progressbg{position:relative;padding:.25rem .5rem;display:flex}.progressbg-text{position:relative;z-index:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progressbg-progress{position:absolute;inset:0;z-index:0;height:100%;background:transparent;pointer-events:none}.progressbg-value{font-weight:var(--tblr-font-weight-medium);margin-left:auto;padding-left:2rem}.ribbon{--tblr-ribbon-margin: .25rem;--tblr-ribbon-border-radius: var(--tblr-border-radius);position:absolute;top:.75rem;right:calc(-1 * var(--tblr-ribbon-margin));z-index:1;padding:.25rem .75rem;font-size:.625rem;font-weight:var(--tblr-font-weight-bold);line-height:1;color:#fff;text-align:center;text-transform:uppercase;background:var(--tblr-primary);border-color:var(--tblr-primary);border-radius:var(--tblr-ribbon-border-radius) 0 var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius);display:inline-flex;align-items:center;justify-content:center;min-height:2rem;min-width:2rem}.ribbon:before{position:absolute;right:0;bottom:100%;width:0;height:0;content:"";filter:brightness(70%);border:calc(var(--tblr-ribbon-margin) * .5) var(--tblr-border-style);border-color:inherit;border-top-color:transparent;border-right-color:transparent}.ribbon.bg-blue{border-color:var(--tblr-blue)}.ribbon.bg-blue-lt{border-color:rgba(var(--tblr-blue-rgb),.1)!important}.ribbon.bg-azure{border-color:var(--tblr-azure)}.ribbon.bg-azure-lt{border-color:rgba(var(--tblr-azure-rgb),.1)!important}.ribbon.bg-indigo{border-color:var(--tblr-indigo)}.ribbon.bg-indigo-lt{border-color:rgba(var(--tblr-indigo-rgb),.1)!important}.ribbon.bg-purple{border-color:var(--tblr-purple)}.ribbon.bg-purple-lt{border-color:rgba(var(--tblr-purple-rgb),.1)!important}.ribbon.bg-pink{border-color:var(--tblr-pink)}.ribbon.bg-pink-lt{border-color:rgba(var(--tblr-pink-rgb),.1)!important}.ribbon.bg-red{border-color:var(--tblr-red)}.ribbon.bg-red-lt{border-color:rgba(var(--tblr-red-rgb),.1)!important}.ribbon.bg-orange{border-color:var(--tblr-orange)}.ribbon.bg-orange-lt{border-color:rgba(var(--tblr-orange-rgb),.1)!important}.ribbon.bg-yellow{border-color:var(--tblr-yellow)}.ribbon.bg-yellow-lt{border-color:rgba(var(--tblr-yellow-rgb),.1)!important}.ribbon.bg-lime{border-color:var(--tblr-lime)}.ribbon.bg-lime-lt{border-color:rgba(var(--tblr-lime-rgb),.1)!important}.ribbon.bg-green{border-color:var(--tblr-green)}.ribbon.bg-green-lt{border-color:rgba(var(--tblr-green-rgb),.1)!important}.ribbon.bg-teal{border-color:var(--tblr-teal)}.ribbon.bg-teal-lt{border-color:rgba(var(--tblr-teal-rgb),.1)!important}.ribbon.bg-cyan{border-color:var(--tblr-cyan)}.ribbon.bg-cyan-lt{border-color:rgba(var(--tblr-cyan-rgb),.1)!important}.ribbon .icon{width:1.25rem;height:1.25rem;font-size:1.25rem}.ribbon-top{top:calc(-1 * var(--tblr-ribbon-margin));right:.75rem;width:2rem;padding:.5rem 0;border-radius:0 var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius) var(--tblr-ribbon-border-radius)}.ribbon-top:before{top:0;right:100%;bottom:auto;border-color:inherit;border-top-color:transparent;border-left-color:transparent}.ribbon-top.ribbon-start{right:auto;left:.75rem}.ribbon-top.ribbon-start:before{top:0;right:100%;left:auto}.ribbon-start{right:auto;left:calc(-1 * var(--tblr-ribbon-margin))}.ribbon-start:before{top:auto;bottom:100%;left:0;border-color:inherit;border-top-color:transparent;border-left-color:transparent}.ribbon-bottom{top:auto;bottom:.75rem}.ribbon-bookmark{padding-left:.25rem;border-radius:0 0 var(--tblr-ribbon-border-radius) 0}.ribbon-bookmark:after{position:absolute;top:0;right:100%;display:block;width:0;height:0;content:"";border:1rem var(--tblr-border-style);border-color:inherit;border-right-width:0;border-left-color:transparent;border-left-width:.5rem}.ribbon-bookmark.ribbon-left{padding-right:.5rem}.ribbon-bookmark.ribbon-left:after{right:auto;left:100%;border-right-color:transparent;border-right-width:.5rem;border-left-width:0}.ribbon-bookmark.ribbon-top{padding-right:0;padding-bottom:.25rem;padding-left:0;border-radius:0 var(--tblr-ribbon-border-radius) 0 0}.ribbon-bookmark.ribbon-top:after{top:100%;right:0;left:0;border-color:inherit;border-width:1rem;border-top-width:0;border-bottom-color:transparent;border-bottom-width:.5rem}.markdown{line-height:1.7142857143}.markdown>:first-child{margin-top:0}.markdown>:last-child,.markdown>:last-child .highlight{margin-bottom:0}@media (min-width: 768px){.markdown>hr,.markdown>.hr{margin-top:3em;margin-bottom:3em}}.markdown>h1,.markdown>.h1,.markdown>h2,.markdown>.h2,.markdown>h3,.markdown>.h3,.markdown>h4,.markdown>.h4,.markdown>h5,.markdown>.h5,.markdown>h6,.markdown>.h6{font-weight:var(--tblr-font-weight-bold)}.markdown>blockquote{font-size:1rem;margin:1.5rem 0;padding:.5rem 1.5rem}.markdown>img{border-radius:var(--tblr-border-radius)}.placeholder:not(.btn):not([class*=bg-]){background-color:currentColor!important}.placeholder:not(.avatar):not([class*=card-img-]){border-radius:var(--tblr-border-radius)}.steps{--tblr-steps-color: var(--tblr-primary);--tblr-steps-inactive-color: var(--tblr-border-color);--tblr-steps-dot-size: .5rem;--tblr-steps-border-width: 2px;display:flex;flex-wrap:nowrap;width:100%;padding:0;margin:0;list-style:none}.steps-blue{--tblr-steps-color: var(--tblr-blue)}.steps-azure{--tblr-steps-color: var(--tblr-azure)}.steps-indigo{--tblr-steps-color: var(--tblr-indigo)}.steps-purple{--tblr-steps-color: var(--tblr-purple)}.steps-pink{--tblr-steps-color: var(--tblr-pink)}.steps-red{--tblr-steps-color: var(--tblr-red)}.steps-orange{--tblr-steps-color: var(--tblr-orange)}.steps-yellow{--tblr-steps-color: var(--tblr-yellow)}.steps-lime{--tblr-steps-color: var(--tblr-lime)}.steps-green{--tblr-steps-color: var(--tblr-green)}.steps-teal{--tblr-steps-color: var(--tblr-teal)}.steps-cyan{--tblr-steps-color: var(--tblr-cyan)}.step-item{position:relative;flex:1 1 0;min-height:1rem;margin-top:0;color:inherit;text-align:center;cursor:default;padding-top:calc(var(--tblr-steps-dot-size))}a.step-item{cursor:pointer}a.step-item:hover{color:inherit}.step-item:after,.step-item:before{background:var(--tblr-steps-color)}.step-item:not(:last-child):after{position:absolute;left:50%;width:100%;content:"";transform:translateY(-50%)}.step-item:after{top:calc(var(--tblr-steps-dot-size) * .5);height:var(--tblr-steps-border-width)}.step-item:before{content:"";position:absolute;top:0;left:50%;z-index:1;box-sizing:content-box;display:flex;align-items:center;justify-content:center;border-radius:100rem;transform:translate(-50%);color:var(--tblr-white);width:var(--tblr-steps-dot-size);height:var(--tblr-steps-dot-size)}.step-item.active{font-weight:var(--tblr-font-weight-bold)}.step-item.active:after{background:var(--tblr-steps-inactive-color)}.step-item.active~.step-item{color:var(--tblr-disabled-color)}.step-item.active~.step-item:after,.step-item.active~.step-item:before{background:var(--tblr-steps-inactive-color)}.steps-counter{--tblr-steps-dot-size: 1.5rem;counter-reset:steps}.steps-counter .step-item{counter-increment:steps}.steps-counter .step-item:before{content:counter(steps)}.steps-vertical{--tblr-steps-dot-offset: 6px;flex-direction:column}.steps-vertical.steps-counter{--tblr-steps-dot-offset: -2px}.steps-vertical .step-item{text-align:left;padding-top:0;padding-left:calc(var(--tblr-steps-dot-size) + 1rem);min-height:auto}.steps-vertical .step-item:not(:first-child){margin-top:1rem}.steps-vertical .step-item:before{top:var(--tblr-steps-dot-offset);left:0;transform:translate(0)}.steps-vertical .step-item:not(:last-child):after{position:absolute;content:"";transform:translate(-50%);top:var(--tblr-steps-dot-offset);left:calc(var(--tblr-steps-dot-size) * .5);width:var(--tblr-steps-border-width);height:calc(100% + 1rem)}@keyframes status-pulsate-main{40%{transform:scale(1.25)}60%{transform:scale(1.25)}}@keyframes status-pulsate-secondary{10%{transform:scale(1)}30%{transform:scale(3)}80%{transform:scale(3)}to{transform:scale(1)}}@keyframes status-pulsate-tertiary{25%{transform:scale(1)}80%{transform:scale(3);opacity:0}to{transform:scale(3);opacity:0}}.status{--tblr-status-height: 1.5rem;--tblr-status-color: #667382;--tblr-status-color-rgb: 102, 115, 130;display:inline-flex;align-items:center;height:var(--tblr-status-height);padding:.25rem .75rem;gap:.5rem;color:var(--tblr-status-color);background:rgba(var(--tblr-status-color-rgb),.1);font-size:.875rem;text-transform:none;letter-spacing:normal;border-radius:100rem;font-weight:var(--tblr-font-weight-medium);line-height:1;margin:0}.status .status-dot{background:var(--tblr-status-color)}.status .icon{font-size:1.25rem}.status-lite{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color)!important;background:transparent!important;color:var(--tblr-body-color)!important}.status-primary{--tblr-status-color: #00857D;--tblr-status-color-rgb: 0, 133, 125}.status-secondary{--tblr-status-color: #667382;--tblr-status-color-rgb: 102, 115, 130}.status-success{--tblr-status-color: #2fb344;--tblr-status-color-rgb: 47, 179, 68}.status-info{--tblr-status-color: #4299e1;--tblr-status-color-rgb: 66, 153, 225}.status-warning{--tblr-status-color: #f76707;--tblr-status-color-rgb: 247, 103, 7}.status-danger{--tblr-status-color: #d63939;--tblr-status-color-rgb: 214, 57, 57}.status-light{--tblr-status-color: #fcfdfe;--tblr-status-color-rgb: 252, 253, 254}.status-dark{--tblr-status-color: #182433;--tblr-status-color-rgb: 24, 36, 51}.status-muted{--tblr-status-color: #667382;--tblr-status-color-rgb: 102, 115, 130}.status-blue{--tblr-status-color: #0054a6;--tblr-status-color-rgb: 0, 84, 166}.status-azure{--tblr-status-color: #4299e1;--tblr-status-color-rgb: 66, 153, 225}.status-indigo{--tblr-status-color: #4263eb;--tblr-status-color-rgb: 66, 99, 235}.status-purple{--tblr-status-color: #ae3ec9;--tblr-status-color-rgb: 174, 62, 201}.status-pink{--tblr-status-color: #d6336c;--tblr-status-color-rgb: 214, 51, 108}.status-red{--tblr-status-color: #d63939;--tblr-status-color-rgb: 214, 57, 57}.status-orange{--tblr-status-color: #f76707;--tblr-status-color-rgb: 247, 103, 7}.status-yellow{--tblr-status-color: #f59f00;--tblr-status-color-rgb: 245, 159, 0}.status-lime{--tblr-status-color: #74b816;--tblr-status-color-rgb: 116, 184, 22}.status-green{--tblr-status-color: #2fb344;--tblr-status-color-rgb: 47, 179, 68}.status-teal{--tblr-status-color: #0ca678;--tblr-status-color-rgb: 12, 166, 120}.status-cyan{--tblr-status-color: #17a2b8;--tblr-status-color-rgb: 23, 162, 184}.status-facebook{--tblr-status-color: #1877f2;--tblr-status-color-rgb: 24, 119, 242}.status-twitter{--tblr-status-color: #1da1f2;--tblr-status-color-rgb: 29, 161, 242}.status-linkedin{--tblr-status-color: #0a66c2;--tblr-status-color-rgb: 10, 102, 194}.status-google{--tblr-status-color: #dc4e41;--tblr-status-color-rgb: 220, 78, 65}.status-youtube{--tblr-status-color: #ff0000;--tblr-status-color-rgb: 255, 0, 0}.status-vimeo{--tblr-status-color: #1ab7ea;--tblr-status-color-rgb: 26, 183, 234}.status-dribbble{--tblr-status-color: #ea4c89;--tblr-status-color-rgb: 234, 76, 137}.status-github{--tblr-status-color: #181717;--tblr-status-color-rgb: 24, 23, 23}.status-instagram{--tblr-status-color: #e4405f;--tblr-status-color-rgb: 228, 64, 95}.status-pinterest{--tblr-status-color: #bd081c;--tblr-status-color-rgb: 189, 8, 28}.status-vk{--tblr-status-color: #6383a8;--tblr-status-color-rgb: 99, 131, 168}.status-rss{--tblr-status-color: #ffa500;--tblr-status-color-rgb: 255, 165, 0}.status-flickr{--tblr-status-color: #0063dc;--tblr-status-color-rgb: 0, 99, 220}.status-bitbucket{--tblr-status-color: #0052cc;--tblr-status-color-rgb: 0, 82, 204}.status-tabler{--tblr-status-color: #0054a6;--tblr-status-color-rgb: 0, 84, 166}.status-dot{--tblr-status-dot-color: var(--tblr-status-color, #667382);--tblr-status-size: .5rem;position:relative;display:inline-block;width:var(--tblr-status-size);height:var(--tblr-status-size);background:var(--tblr-status-dot-color);border-radius:100rem}.status-dot-animated:before{content:"";position:absolute;inset:0;z-index:0;background:inherit;border-radius:inherit;opacity:.6;animation:1s linear 2s backwards infinite status-pulsate-tertiary}.status-indicator{--tblr-status-indicator-size: 2.5rem;--tblr-status-indicator-color: var(--tblr-status-color, #667382);display:block;position:relative;width:var(--tblr-status-indicator-size);height:var(--tblr-status-indicator-size)}.status-indicator-circle{--tblr-status-circle-size: .75rem;position:absolute;left:50%;top:50%;margin:calc(var(--tblr-status-circle-size) / -2) 0 0 calc(var(--tblr-status-circle-size) / -2);width:var(--tblr-status-circle-size);height:var(--tblr-status-circle-size);border-radius:100rem;background:var(--tblr-status-color)}.status-indicator-circle:nth-child(1){z-index:3}.status-indicator-circle:nth-child(2){z-index:2;opacity:.1}.status-indicator-circle:nth-child(3){z-index:1;opacity:.3}.status-indicator-animated .status-indicator-circle:nth-child(1){animation:2s linear 1s infinite backwards status-pulsate-main}.status-indicator-animated .status-indicator-circle:nth-child(2){animation:2s linear 1s infinite backwards status-pulsate-secondary}.status-indicator-animated .status-indicator-circle:nth-child(3){animation:2s linear 1s infinite backwards status-pulsate-tertiary}.switch-icon{display:inline-block;line-height:1;border:0;padding:0;background:transparent;width:1.25rem;height:1.25rem;vertical-align:bottom;position:relative;cursor:pointer}.switch-icon.disabled{pointer-events:none;opacity:.4}.switch-icon:focus{outline:none}.switch-icon svg{display:block;width:100%;height:100%}.switch-icon .switch-icon-a,.switch-icon .switch-icon-b{display:block;width:100%;height:100%}.switch-icon .switch-icon-a{opacity:1}.switch-icon .switch-icon-b{position:absolute;top:0;left:0;opacity:0}.switch-icon.active .switch-icon-a{opacity:0}.switch-icon.active .switch-icon-b{opacity:1}.switch-icon-fade .switch-icon-a,.switch-icon-fade .switch-icon-b{transition:opacity .5s}@media (prefers-reduced-motion: reduce){.switch-icon-fade .switch-icon-a,.switch-icon-fade .switch-icon-b{transition:none}}.switch-icon-scale .switch-icon-a,.switch-icon-scale .switch-icon-b{transition:opacity .5s,transform 0s .5s}@media (prefers-reduced-motion: reduce){.switch-icon-scale .switch-icon-a,.switch-icon-scale .switch-icon-b{transition:none}}.switch-icon-scale .switch-icon-b{transform:scale(1.5)}.switch-icon-scale.active .switch-icon-a,.switch-icon-scale.active .switch-icon-b{transition:opacity 0s,transform .5s}@media (prefers-reduced-motion: reduce){.switch-icon-scale.active .switch-icon-a,.switch-icon-scale.active .switch-icon-b{transition:none}}.switch-icon-scale.active .switch-icon-b{transform:scale(1)}.switch-icon-flip{perspective:10em}.switch-icon-flip .switch-icon-a,.switch-icon-flip .switch-icon-b{backface-visibility:hidden;transform-style:preserve-3d;transition:opacity 0s .2s,transform .4s ease-in-out}@media (prefers-reduced-motion: reduce){.switch-icon-flip .switch-icon-a,.switch-icon-flip .switch-icon-b{transition:none}}.switch-icon-flip .switch-icon-a{opacity:1;transform:rotateY(0)}.switch-icon-flip .switch-icon-b{opacity:1;transform:rotateY(-180deg)}.switch-icon-flip.active .switch-icon-a{opacity:1;transform:rotateY(180deg)}.switch-icon-flip.active .switch-icon-b{opacity:1;transform:rotateY(0)}.switch-icon-slide-up,.switch-icon-slide-left,.switch-icon-slide-right,.switch-icon-slide-down{overflow:hidden}.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-up .switch-icon-b,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-down .switch-icon-a,.switch-icon-slide-down .switch-icon-b{transition:opacity .3s,transform .3s}@media (prefers-reduced-motion: reduce){.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-up .switch-icon-b,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-down .switch-icon-a,.switch-icon-slide-down .switch-icon-b{transition:none}}.switch-icon-slide-up .switch-icon-a,.switch-icon-slide-left .switch-icon-a,.switch-icon-slide-right .switch-icon-a,.switch-icon-slide-down .switch-icon-a{transform:translateY(0)}.switch-icon-slide-up .switch-icon-b,.switch-icon-slide-left .switch-icon-b,.switch-icon-slide-right .switch-icon-b,.switch-icon-slide-down .switch-icon-b{transform:translateY(100%)}.switch-icon-slide-up.active .switch-icon-a,.switch-icon-slide-left.active .switch-icon-a,.switch-icon-slide-right.active .switch-icon-a,.switch-icon-slide-down.active .switch-icon-a{transform:translateY(-100%)}.switch-icon-slide-up.active .switch-icon-b,.switch-icon-slide-left.active .switch-icon-b,.switch-icon-slide-right.active .switch-icon-b,.switch-icon-slide-down.active .switch-icon-b{transform:translateY(0)}.switch-icon-slide-left .switch-icon-a{transform:translate(0)}.switch-icon-slide-left .switch-icon-b{transform:translate(100%)}.switch-icon-slide-left.active .switch-icon-a{transform:translate(-100%)}.switch-icon-slide-left.active .switch-icon-b,.switch-icon-slide-right .switch-icon-a{transform:translate(0)}.switch-icon-slide-right .switch-icon-b{transform:translate(-100%)}.switch-icon-slide-right.active .switch-icon-a{transform:translate(100%)}.switch-icon-slide-right.active .switch-icon-b{transform:translate(0)}.switch-icon-slide-down .switch-icon-a{transform:translateY(0)}.switch-icon-slide-down .switch-icon-b{transform:translateY(-100%)}.switch-icon-slide-down.active .switch-icon-a{transform:translateY(100%)}.switch-icon-slide-down.active .switch-icon-b{transform:translateY(0)}.table thead th,.markdown>table thead th{background:var(--tblr-bg-surface-tertiary);font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);padding-top:.5rem;padding-bottom:.5rem;white-space:nowrap}@media print{.table thead th,.markdown>table thead th{background:transparent}}.table-responsive .table,.table-responsive .markdown>table{margin-bottom:0}.table-responsive+.card-footer{border-top:0}.table-transparent thead th{background:transparent}.table-nowrap>:not(caption)>*>*{white-space:nowrap}.table-vcenter>:not(caption)>*>*{vertical-align:middle}.table-center>:not(caption)>*>*{text-align:center}.td-truncate{max-width:1px;width:100%}.table-mobile{display:block}.table-mobile thead{display:none}.table-mobile tbody,.table-mobile tr{display:flex;flex-direction:column}.table-mobile td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile .btn{display:block}@media (max-width: 575.98px){.table-mobile-sm{display:block}.table-mobile-sm thead{display:none}.table-mobile-sm tbody,.table-mobile-sm tr{display:flex;flex-direction:column}.table-mobile-sm td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-sm td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-sm tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-sm .btn{display:block}}@media (max-width: 767.98px){.table-mobile-md{display:block}.table-mobile-md thead{display:none}.table-mobile-md tbody,.table-mobile-md tr{display:flex;flex-direction:column}.table-mobile-md td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-md td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-md tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-md .btn{display:block}}@media (max-width: 991.98px){.table-mobile-lg{display:block}.table-mobile-lg thead{display:none}.table-mobile-lg tbody,.table-mobile-lg tr{display:flex;flex-direction:column}.table-mobile-lg td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-lg td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-lg tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-lg .btn{display:block}}@media (max-width: 1199.98px){.table-mobile-xl{display:block}.table-mobile-xl thead{display:none}.table-mobile-xl tbody,.table-mobile-xl tr{display:flex;flex-direction:column}.table-mobile-xl td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-xl td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-xl tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-xl .btn{display:block}}@media (max-width: 1399.98px){.table-mobile-xxl{display:block}.table-mobile-xxl thead{display:none}.table-mobile-xxl tbody,.table-mobile-xxl tr{display:flex;flex-direction:column}.table-mobile-xxl td{display:block;padding:.5rem!important;border:none;color:var(--tblr-body-color)!important}.table-mobile-xxl td[data-label]:before{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);content:attr(data-label);display:block}.table-mobile-xxl tr{border-bottom:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent)}.table-mobile-xxl .btn{display:block}}.table-sort{font:inherit;color:inherit;text-transform:inherit;letter-spacing:inherit;border:0;background:inherit;display:block;width:100%;text-align:inherit;transition:color .3s;margin:-.5rem;padding:.5rem}@media (prefers-reduced-motion: reduce){.table-sort{transition:none}}.table-sort:hover,.table-sort.asc,.table-sort.desc{color:var(--tblr-body-color)}.table-sort:after{content:"";display:inline-flex;width:1rem;height:1rem;vertical-align:bottom;mask-image:url("data:image/svg+xml,");background:currentColor;margin-left:.25rem}.table-sort.asc:after{mask-image:url("data:image/svg+xml,")}.table-sort.desc:after{mask-image:url("data:image/svg+xml,")}.table-borderless thead th{background:transparent}.tag{--tblr-tag-height: 1.5rem;border:1px solid var(--tblr-border-color);display:inline-flex;align-items:center;height:var(--tblr-tag-height);border-radius:var(--tblr-border-radius);padding:0 .5rem;background:var(--tblr-bg-surface);box-shadow:var(--tblr-box-shadow-input);gap:.5rem}.tag .btn-close{margin-right:-.25rem;margin-left:-.125rem;padding:0;width:1rem;height:1rem;font-size:.5rem}.tag-badge{--tblr-badge-font-size: .625rem;--tblr-badge-padding-x: .25rem;--tblr-badge-padding-y: .125rem;margin-right:-.25rem}.tag-avatar,.tag-flag,.tag-payment,.tag-icon,.tag-check{margin-left:-.25rem}.tag-icon{color:var(--tblr-secondary);margin-right:-.125rem;width:1rem;height:1rem}.tag-check{width:1rem;height:1rem;background-size:1rem}.tags-list{--tblr-list-gap: .5rem;display:flex;flex-wrap:wrap;gap:var(--tblr-list-gap)}.toast{background:#fff;border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color-translucent);box-shadow:#1824330a 0 2px 4px}.toast .toast-header{user-select:none}.toast button[data-bs-dismiss=toast]{outline:none}.toast-primary{--tblr-toast-color: #00857D}.toast-secondary{--tblr-toast-color: #667382}.toast-success{--tblr-toast-color: #2fb344}.toast-info{--tblr-toast-color: #4299e1}.toast-warning{--tblr-toast-color: #f76707}.toast-danger{--tblr-toast-color: #d63939}.toast-light{--tblr-toast-color: #fcfdfe}.toast-dark{--tblr-toast-color: #182433}.toast-muted{--tblr-toast-color: #667382}.toast-blue{--tblr-toast-color: #0054a6}.toast-azure{--tblr-toast-color: #4299e1}.toast-indigo{--tblr-toast-color: #4263eb}.toast-purple{--tblr-toast-color: #ae3ec9}.toast-pink{--tblr-toast-color: #d6336c}.toast-red{--tblr-toast-color: #d63939}.toast-orange{--tblr-toast-color: #f76707}.toast-yellow{--tblr-toast-color: #f59f00}.toast-lime{--tblr-toast-color: #74b816}.toast-green{--tblr-toast-color: #2fb344}.toast-teal{--tblr-toast-color: #0ca678}.toast-cyan{--tblr-toast-color: #17a2b8}.toast-facebook{--tblr-toast-color: #1877f2}.toast-twitter{--tblr-toast-color: #1da1f2}.toast-linkedin{--tblr-toast-color: #0a66c2}.toast-google{--tblr-toast-color: #dc4e41}.toast-youtube{--tblr-toast-color: #ff0000}.toast-vimeo{--tblr-toast-color: #1ab7ea}.toast-dribbble{--tblr-toast-color: #ea4c89}.toast-github{--tblr-toast-color: #181717}.toast-instagram{--tblr-toast-color: #e4405f}.toast-pinterest{--tblr-toast-color: #bd081c}.toast-vk{--tblr-toast-color: #6383a8}.toast-rss{--tblr-toast-color: #ffa500}.toast-flickr{--tblr-toast-color: #0063dc}.toast-bitbucket{--tblr-toast-color: #0052cc}.toast-tabler{--tblr-toast-color: #0054a6}.toolbar{display:flex;flex-wrap:nowrap;flex-shrink:0;margin:0 -.5rem}.toolbar>*{margin:0 .5rem}.tracking{--tblr-tracking-height: 1.5rem;--tblr-tracking-gap-width: .125rem;--tblr-tracking-block-border-radius: var(--tblr-border-radius);display:flex;gap:var(--tblr-tracking-gap-width)}.tracking-squares{--tblr-tracking-block-border-radius: var(--tblr-border-radius-sm)}.tracking-squares .tracking-block{height:auto}.tracking-squares .tracking-block:before{content:"";display:block;padding-top:100%}.tracking-block{flex:1;border-radius:var(--tblr-tracking-block-border-radius);height:var(--tblr-tracking-height);min-width:.25rem;background:var(--tblr-border-color)}.timeline{--tblr-timeline-icon-size: 2.5rem;position:relative;list-style:none;padding:0}.timeline-event{position:relative}.timeline-event:not(:last-child){margin-bottom:var(--tblr-page-padding)}.timeline-event:not(:last-child):before{content:"";position:absolute;top:var(--tblr-timeline-icon-size);left:calc(var(--tblr-timeline-icon-size) / 2);bottom:calc(-1 * var(--tblr-page-padding));width:var(--tblr-border-width);background-color:var(--tblr-border-color);border-radius:var(--tblr-border-radius)}.timeline-event-icon{position:absolute;display:flex;align-items:center;justify-content:center;width:var(--tblr-timeline-icon-size, 2.5rem);height:var(--tblr-timeline-icon-size, 2.5rem);background:var(--tblr-gray-200);color:var(--tblr-secondary);border-radius:var(--tblr-border-radius);z-index:5}.timeline-event-card{margin-left:calc(var(--tblr-timeline-icon-size, 2.5rem) + var(--tblr-page-padding))}.timeline-simple .timeline-event-icon{display:none}.timeline-simple .timeline-event-card{margin-left:0}.hr-text{display:flex;align-items:center;margin:2rem 0;font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary);height:1px}.hr-text:after,.hr-text:before{flex:1 1 auto;height:1px;background-color:var(--tblr-border-color)}.hr-text:before{content:"";margin-right:.5rem}.hr-text:after{content:"";margin-left:.5rem}.hr-text>*:first-child{padding-right:.5rem;padding-left:0;color:var(--tblr-secondary)}.hr-text.hr-text-left:before{content:none}.hr-text.hr-text-left>*:first-child{padding-right:.5rem;padding-left:.5rem}.hr-text.hr-text-right:before{content:""}.hr-text.hr-text-right:after{content:none}.hr-text.hr-text-right>*:first-child{padding-right:0;padding-left:.5rem}.card>.hr-text{margin:0}.hr-text-spaceless{margin:-.5rem 0}.lead{line-height:1.4}a{text-decoration-skip-ink:auto}h1 a,h2 a,h3 a,.field-group h2 a,h4 a,h5 a,h6 a,.h1 a,.h2 a,.h3 a,.h4 a,.h5 a,.h6 a,h1 a:hover,h2 a:hover,h3 a:hover,h4 a:hover,h5 a:hover,h6 a:hover,.h1 a:hover,.h2 a:hover,.h3 a:hover,.h4 a:hover,.h5 a:hover,.h6 a:hover{color:inherit}h1,.h1{font-size:var(--tblr-font-size-h1);line-height:var(--tblr-line-height-h1)}h2,.h2{font-size:var(--tblr-font-size-h2);line-height:var(--tblr-line-height-h2)}h3,.field-group h2,.field-group .h2,.h3{font-size:var(--tblr-font-size-h3);line-height:var(--tblr-line-height-h3)}h4,.h4{font-size:var(--tblr-font-size-h4);line-height:var(--tblr-line-height-h4)}h5,.h5{font-size:var(--tblr-font-size-h5);line-height:var(--tblr-line-height-h5)}h6,.h6{font-size:var(--tblr-font-size-h6);line-height:var(--tblr-line-height-h6)}strong,.strong,b{font-weight:var(--tblr-font-weight-bold)}blockquote{padding-left:1rem;border-left:2px var(--tblr-border-style) var(--tblr-border-color)}blockquote p{margin-bottom:1rem}blockquote cite{display:block;text-align:right}blockquote cite:before{content:"\2014 "}ul,ol{padding-left:1.5rem}hr,.hr{margin:2rem 0}dl dd:last-child{margin-bottom:0}pre{padding:1rem;background:var(--tblr-bg-surface-dark);color:var(--tblr-light);border-radius:var(--tblr-border-radius)}pre code{background:transparent}code{background:var(--tblr-code-bg);padding:2px 4px;border-radius:var(--tblr-border-radius)}kbd,.kbd{border:var(--tblr-border-width) var(--tblr-border-style) var(--tblr-border-color);display:inline-block;box-sizing:border-box;max-width:100%;font-size:var(--tblr-font-size-h5);font-weight:var(--tblr-font-weight-medium);line-height:1;vertical-align:baseline;border-radius:var(--tblr-border-radius)}img{max-width:100%}.list-unstyled{margin-left:0}::selection{background-color:rgba(var(--tblr-primary-rgb),.16)}[class^=link-].disabled,[class*=" link-"].disabled{color:var(--tblr-disabled-color);pointer-events:none}.subheader{font-size:.625rem;font-weight:var(--tblr-font-weight-bold);text-transform:uppercase;letter-spacing:.04em;line-height:1rem;color:var(--tblr-secondary)}.chart{display:block;min-height:10rem}.chart text{font-family:inherit}.chart-sm{height:2.5rem}.chart-lg{height:15rem}.chart-square{height:5.75rem}.chart-sparkline{position:relative;width:4rem;height:2.5rem;line-height:1;min-height:0!important}.chart-sparkline-sm{height:1.5rem}.chart-sparkline-square{width:2.5rem}.chart-sparkline-wide{width:6rem}.chart-sparkline-label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:.625rem}.chart-sparkline-label .icon{width:1rem;height:1rem;font-size:1rem}.offcanvas-header{border-bottom:var(--tblr-border-width) var(--tblr-border-style) rgba(4,32,69,.14)}.offcanvas-footer{padding:1.5rem}.offcanvas-title{font-size:1rem;font-weight:var(--tblr-font-weight-medium);line-height:1.5rem}.offcanvas-narrow{width:20rem}.chat-bubbles{display:flex;flex-direction:column;gap:1rem}.chat-bubble{background:var(--tblr-bg-surface-secondary);border-radius:var(--tblr-border-radius-lg);padding:1rem;position:relative}.chat-bubble-me{background-color:var(--tblr-primary-lt);box-shadow:none}.chat-bubble-title{margin-bottom:.25rem}.chat-bubble-author{font-weight:600}.chat-bubble-date{color:var(--tblr-secondary)}.chat-bubble-body>*:last-child{margin-bottom:0}.bg-white-overlay{color:#fff;background-color:#fcfdfe3d}.bg-dark-overlay{color:#fff;background-color:#1824333d}.bg-cover{background-repeat:no-repeat;background-size:cover;background-position:center}.bg-primary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-primary-rgb),var(--tblr-bg-opacity))!important}.bg-primary-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-primary-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-primary-lt-rgb),var(--tblr-bg-opacity))!important}.border-primary{border-color:#00857d!important}.bg-secondary{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-secondary-rgb),var(--tblr-bg-opacity))!important}.bg-secondary-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-secondary-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-secondary-lt-rgb),var(--tblr-bg-opacity))!important}.border-secondary{border-color:#667382!important}.bg-success{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-success-rgb),var(--tblr-bg-opacity))!important}.bg-success-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-success-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-success-lt-rgb),var(--tblr-bg-opacity))!important}.border-success{border-color:#2fb344!important}.bg-info{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-info-rgb),var(--tblr-bg-opacity))!important}.bg-info-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-info-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-info-lt-rgb),var(--tblr-bg-opacity))!important}.border-info{border-color:#4299e1!important}.bg-warning{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-warning-rgb),var(--tblr-bg-opacity))!important}.bg-warning-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-warning-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-warning-lt-rgb),var(--tblr-bg-opacity))!important}.border-warning{border-color:#f76707!important}.bg-danger{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-danger-rgb),var(--tblr-bg-opacity))!important}.bg-danger-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-danger-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-danger-lt-rgb),var(--tblr-bg-opacity))!important}.border-danger{border-color:#d63939!important}.bg-light{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-light-rgb),var(--tblr-bg-opacity))!important}.bg-light-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-light-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-light-lt-rgb),var(--tblr-bg-opacity))!important}.border-light{border-color:#fcfdfe!important}.bg-dark{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-dark-rgb),var(--tblr-bg-opacity))!important}.bg-dark-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-dark-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-dark-lt-rgb),var(--tblr-bg-opacity))!important}.border-dark{border-color:#182433!important}.bg-muted{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-muted-rgb),var(--tblr-bg-opacity))!important}.bg-muted-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-muted-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-muted-lt-rgb),var(--tblr-bg-opacity))!important}.border-muted{border-color:#667382!important}.bg-blue{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-blue-rgb),var(--tblr-bg-opacity))!important}.bg-blue-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-blue-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-blue-lt-rgb),var(--tblr-bg-opacity))!important}.border-blue{border-color:#0054a6!important}.bg-azure{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-azure-rgb),var(--tblr-bg-opacity))!important}.bg-azure-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-azure-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-azure-lt-rgb),var(--tblr-bg-opacity))!important}.border-azure{border-color:#4299e1!important}.bg-indigo{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-indigo-rgb),var(--tblr-bg-opacity))!important}.bg-indigo-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-indigo-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-indigo-lt-rgb),var(--tblr-bg-opacity))!important}.border-indigo{border-color:#4263eb!important}.bg-purple{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-purple-rgb),var(--tblr-bg-opacity))!important}.bg-purple-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-purple-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-purple-lt-rgb),var(--tblr-bg-opacity))!important}.border-purple{border-color:#ae3ec9!important}.bg-pink{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-pink-rgb),var(--tblr-bg-opacity))!important}.bg-pink-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-pink-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-pink-lt-rgb),var(--tblr-bg-opacity))!important}.border-pink{border-color:#d6336c!important}.bg-red{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-red-rgb),var(--tblr-bg-opacity))!important}.bg-red-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-red-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-red-lt-rgb),var(--tblr-bg-opacity))!important}.border-red{border-color:#d63939!important}.bg-orange{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-orange-rgb),var(--tblr-bg-opacity))!important}.bg-orange-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-orange-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-orange-lt-rgb),var(--tblr-bg-opacity))!important}.border-orange{border-color:#f76707!important}.bg-yellow{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-yellow-rgb),var(--tblr-bg-opacity))!important}.bg-yellow-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-yellow-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-yellow-lt-rgb),var(--tblr-bg-opacity))!important}.border-yellow{border-color:#f59f00!important}.bg-lime{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-lime-rgb),var(--tblr-bg-opacity))!important}.bg-lime-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-lime-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-lime-lt-rgb),var(--tblr-bg-opacity))!important}.border-lime{border-color:#74b816!important}.bg-green{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-green-rgb),var(--tblr-bg-opacity))!important}.bg-green-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-green-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-green-lt-rgb),var(--tblr-bg-opacity))!important}.border-green{border-color:#2fb344!important}.bg-teal{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-teal-rgb),var(--tblr-bg-opacity))!important}.bg-teal-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-teal-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-teal-lt-rgb),var(--tblr-bg-opacity))!important}.border-teal{border-color:#0ca678!important}.bg-cyan{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-cyan-rgb),var(--tblr-bg-opacity))!important}.bg-cyan-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-cyan-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-cyan-lt-rgb),var(--tblr-bg-opacity))!important}.border-cyan{border-color:#17a2b8!important}.bg-facebook{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-facebook-rgb),var(--tblr-bg-opacity))!important}.bg-facebook-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-facebook-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-facebook-lt-rgb),var(--tblr-bg-opacity))!important}.border-facebook{border-color:#1877f2!important}.bg-twitter{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-twitter-rgb),var(--tblr-bg-opacity))!important}.bg-twitter-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-twitter-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-twitter-lt-rgb),var(--tblr-bg-opacity))!important}.border-twitter{border-color:#1da1f2!important}.bg-linkedin{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-linkedin-rgb),var(--tblr-bg-opacity))!important}.bg-linkedin-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-linkedin-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-linkedin-lt-rgb),var(--tblr-bg-opacity))!important}.border-linkedin{border-color:#0a66c2!important}.bg-google{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-google-rgb),var(--tblr-bg-opacity))!important}.bg-google-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-google-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-google-lt-rgb),var(--tblr-bg-opacity))!important}.border-google{border-color:#dc4e41!important}.bg-youtube{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-youtube-rgb),var(--tblr-bg-opacity))!important}.bg-youtube-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-youtube-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-youtube-lt-rgb),var(--tblr-bg-opacity))!important}.border-youtube{border-color:red!important}.bg-vimeo{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-vimeo-rgb),var(--tblr-bg-opacity))!important}.bg-vimeo-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-vimeo-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-vimeo-lt-rgb),var(--tblr-bg-opacity))!important}.border-vimeo{border-color:#1ab7ea!important}.bg-dribbble{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-dribbble-rgb),var(--tblr-bg-opacity))!important}.bg-dribbble-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-dribbble-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-dribbble-lt-rgb),var(--tblr-bg-opacity))!important}.border-dribbble{border-color:#ea4c89!important}.bg-github{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-github-rgb),var(--tblr-bg-opacity))!important}.bg-github-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-github-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-github-lt-rgb),var(--tblr-bg-opacity))!important}.border-github{border-color:#181717!important}.bg-instagram{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-instagram-rgb),var(--tblr-bg-opacity))!important}.bg-instagram-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-instagram-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-instagram-lt-rgb),var(--tblr-bg-opacity))!important}.border-instagram{border-color:#e4405f!important}.bg-pinterest{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-pinterest-rgb),var(--tblr-bg-opacity))!important}.bg-pinterest-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-pinterest-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-pinterest-lt-rgb),var(--tblr-bg-opacity))!important}.border-pinterest{border-color:#bd081c!important}.bg-vk{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-vk-rgb),var(--tblr-bg-opacity))!important}.bg-vk-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-vk-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-vk-lt-rgb),var(--tblr-bg-opacity))!important}.border-vk{border-color:#6383a8!important}.bg-rss{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-rss-rgb),var(--tblr-bg-opacity))!important}.bg-rss-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-rss-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-rss-lt-rgb),var(--tblr-bg-opacity))!important}.border-rss{border-color:orange!important}.bg-flickr{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-flickr-rgb),var(--tblr-bg-opacity))!important}.bg-flickr-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-flickr-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-flickr-lt-rgb),var(--tblr-bg-opacity))!important}.border-flickr{border-color:#0063dc!important}.bg-bitbucket{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-bg-opacity))!important}.bg-bitbucket-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-bitbucket-lt-rgb),var(--tblr-bg-opacity))!important}.border-bitbucket{border-color:#0052cc!important}.bg-tabler{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-tabler-rgb),var(--tblr-bg-opacity))!important}.bg-tabler-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-tabler-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-tabler-lt-rgb),var(--tblr-bg-opacity))!important}.border-tabler{border-color:#0054a6!important}.bg-white{--tblr-bg-opacity: 1;background-color:rgba(var(--tblr-white-rgb),var(--tblr-bg-opacity))!important}.bg-white-lt{--tblr-bg-opacity: 1;--tblr-text-opacity: 1;color:rgba(var(--tblr-white-rgb),var(--tblr-text-opacity))!important;background-color:rgba(var(--tblr-white-lt-rgb),var(--tblr-bg-opacity))!important}.border-white{border-color:#fff!important}.text-primary{--tblr-text-opacity: 1;color:rgba(var(--tblr-primary-rgb),var(--tblr-text-opacity))!important}.text-primary-fg{color:var(--tblr-primary-fg)!important}.text-secondary{--tblr-text-opacity: 1;color:rgba(var(--tblr-secondary-rgb),var(--tblr-text-opacity))!important}.text-secondary-fg{color:var(--tblr-secondary-fg)!important}.text-success{--tblr-text-opacity: 1;color:rgba(var(--tblr-success-rgb),var(--tblr-text-opacity))!important}.text-success-fg{color:var(--tblr-success-fg)!important}.text-info{--tblr-text-opacity: 1;color:rgba(var(--tblr-info-rgb),var(--tblr-text-opacity))!important}.text-info-fg{color:var(--tblr-info-fg)!important}.text-warning{--tblr-text-opacity: 1;color:rgba(var(--tblr-warning-rgb),var(--tblr-text-opacity))!important}.text-warning-fg{color:var(--tblr-warning-fg)!important}.text-danger{--tblr-text-opacity: 1;color:rgba(var(--tblr-danger-rgb),var(--tblr-text-opacity))!important}.text-danger-fg{color:var(--tblr-danger-fg)!important}.text-light{--tblr-text-opacity: 1;color:rgba(var(--tblr-light-rgb),var(--tblr-text-opacity))!important}.text-light-fg{color:var(--tblr-light-fg)!important}.text-dark{--tblr-text-opacity: 1;color:rgba(var(--tblr-dark-rgb),var(--tblr-text-opacity))!important}.text-dark-fg{color:var(--tblr-dark-fg)!important}.text-muted{--tblr-text-opacity: 1;color:rgba(var(--tblr-muted-rgb),var(--tblr-text-opacity))!important}.text-muted-fg{color:var(--tblr-muted-fg)!important}.text-blue{--tblr-text-opacity: 1;color:rgba(var(--tblr-blue-rgb),var(--tblr-text-opacity))!important}.text-blue-fg{color:var(--tblr-blue-fg)!important}.text-azure{--tblr-text-opacity: 1;color:rgba(var(--tblr-azure-rgb),var(--tblr-text-opacity))!important}.text-azure-fg{color:var(--tblr-azure-fg)!important}.text-indigo{--tblr-text-opacity: 1;color:rgba(var(--tblr-indigo-rgb),var(--tblr-text-opacity))!important}.text-indigo-fg{color:var(--tblr-indigo-fg)!important}.text-purple{--tblr-text-opacity: 1;color:rgba(var(--tblr-purple-rgb),var(--tblr-text-opacity))!important}.text-purple-fg{color:var(--tblr-purple-fg)!important}.text-pink{--tblr-text-opacity: 1;color:rgba(var(--tblr-pink-rgb),var(--tblr-text-opacity))!important}.text-pink-fg{color:var(--tblr-pink-fg)!important}.text-red{--tblr-text-opacity: 1;color:rgba(var(--tblr-red-rgb),var(--tblr-text-opacity))!important}.text-red-fg{color:var(--tblr-red-fg)!important}.text-orange{--tblr-text-opacity: 1;color:rgba(var(--tblr-orange-rgb),var(--tblr-text-opacity))!important}.text-orange-fg{color:var(--tblr-orange-fg)!important}.text-yellow{--tblr-text-opacity: 1;color:rgba(var(--tblr-yellow-rgb),var(--tblr-text-opacity))!important}.text-yellow-fg{color:var(--tblr-yellow-fg)!important}.text-lime{--tblr-text-opacity: 1;color:rgba(var(--tblr-lime-rgb),var(--tblr-text-opacity))!important}.text-lime-fg{color:var(--tblr-lime-fg)!important}.text-green{--tblr-text-opacity: 1;color:rgba(var(--tblr-green-rgb),var(--tblr-text-opacity))!important}.text-green-fg{color:var(--tblr-green-fg)!important}.text-teal{--tblr-text-opacity: 1;color:rgba(var(--tblr-teal-rgb),var(--tblr-text-opacity))!important}.text-teal-fg{color:var(--tblr-teal-fg)!important}.text-cyan{--tblr-text-opacity: 1;color:rgba(var(--tblr-cyan-rgb),var(--tblr-text-opacity))!important}.text-cyan-fg{color:var(--tblr-cyan-fg)!important}.text-facebook{--tblr-text-opacity: 1;color:rgba(var(--tblr-facebook-rgb),var(--tblr-text-opacity))!important}.text-facebook-fg{color:var(--tblr-facebook-fg)!important}.text-twitter{--tblr-text-opacity: 1;color:rgba(var(--tblr-twitter-rgb),var(--tblr-text-opacity))!important}.text-twitter-fg{color:var(--tblr-twitter-fg)!important}.text-linkedin{--tblr-text-opacity: 1;color:rgba(var(--tblr-linkedin-rgb),var(--tblr-text-opacity))!important}.text-linkedin-fg{color:var(--tblr-linkedin-fg)!important}.text-google{--tblr-text-opacity: 1;color:rgba(var(--tblr-google-rgb),var(--tblr-text-opacity))!important}.text-google-fg{color:var(--tblr-google-fg)!important}.text-youtube{--tblr-text-opacity: 1;color:rgba(var(--tblr-youtube-rgb),var(--tblr-text-opacity))!important}.text-youtube-fg{color:var(--tblr-youtube-fg)!important}.text-vimeo{--tblr-text-opacity: 1;color:rgba(var(--tblr-vimeo-rgb),var(--tblr-text-opacity))!important}.text-vimeo-fg{color:var(--tblr-vimeo-fg)!important}.text-dribbble{--tblr-text-opacity: 1;color:rgba(var(--tblr-dribbble-rgb),var(--tblr-text-opacity))!important}.text-dribbble-fg{color:var(--tblr-dribbble-fg)!important}.text-github{--tblr-text-opacity: 1;color:rgba(var(--tblr-github-rgb),var(--tblr-text-opacity))!important}.text-github-fg{color:var(--tblr-github-fg)!important}.text-instagram{--tblr-text-opacity: 1;color:rgba(var(--tblr-instagram-rgb),var(--tblr-text-opacity))!important}.text-instagram-fg{color:var(--tblr-instagram-fg)!important}.text-pinterest{--tblr-text-opacity: 1;color:rgba(var(--tblr-pinterest-rgb),var(--tblr-text-opacity))!important}.text-pinterest-fg{color:var(--tblr-pinterest-fg)!important}.text-vk{--tblr-text-opacity: 1;color:rgba(var(--tblr-vk-rgb),var(--tblr-text-opacity))!important}.text-vk-fg{color:var(--tblr-vk-fg)!important}.text-rss{--tblr-text-opacity: 1;color:rgba(var(--tblr-rss-rgb),var(--tblr-text-opacity))!important}.text-rss-fg{color:var(--tblr-rss-fg)!important}.text-flickr{--tblr-text-opacity: 1;color:rgba(var(--tblr-flickr-rgb),var(--tblr-text-opacity))!important}.text-flickr-fg{color:var(--tblr-flickr-fg)!important}.text-bitbucket{--tblr-text-opacity: 1;color:rgba(var(--tblr-bitbucket-rgb),var(--tblr-text-opacity))!important}.text-bitbucket-fg{color:var(--tblr-bitbucket-fg)!important}.text-tabler{--tblr-text-opacity: 1;color:rgba(var(--tblr-tabler-rgb),var(--tblr-text-opacity))!important}.text-tabler-fg{color:var(--tblr-tabler-fg)!important}.bg-gray-50{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-50-rgb),var(--tblr-bg-opacity))!important}.text-gray-50-fg{color:#182433!important}.bg-gray-100{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-100-rgb),var(--tblr-bg-opacity))!important}.text-gray-100-fg{color:#182433!important}.bg-gray-200{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-200-rgb),var(--tblr-bg-opacity))!important}.text-gray-200-fg{color:#182433!important}.bg-gray-300{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-300-rgb),var(--tblr-bg-opacity))!important}.text-gray-300-fg{color:#182433!important}.bg-gray-400{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-400-rgb),var(--tblr-bg-opacity))!important}.text-gray-400-fg{color:#fcfdfe!important}.bg-gray-500{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-500-rgb),var(--tblr-bg-opacity))!important}.text-gray-500-fg{color:#fcfdfe!important}.bg-gray-600{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-600-rgb),var(--tblr-bg-opacity))!important}.text-gray-600-fg{color:#fcfdfe!important}.bg-gray-700{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-700-rgb),var(--tblr-bg-opacity))!important}.text-gray-700-fg{color:#fcfdfe!important}.bg-gray-800{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-800-rgb),var(--tblr-bg-opacity))!important}.text-gray-800-fg{color:#fcfdfe!important}.bg-gray-900{--tblr-bg-opacity: .1;background-color:rgba(var(--tblr-gray-900-rgb),var(--tblr-bg-opacity))!important}.text-gray-900-fg{color:#fcfdfe!important}.scrollable{overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.scrollable.hover{overflow-y:hidden}.scrollable.hover>*{margin-top:-1px}.scrollable.hover:hover,.scrollable.hover:focus,.scrollable.hover:active{overflow:visible;overflow-y:auto}.touch .scrollable{overflow-y:auto!important}.scroll-x,.scroll-y{overflow:hidden;-webkit-overflow-scrolling:touch}.scroll-y{overflow-y:auto}.scroll-x{overflow-x:auto}.no-scroll{overflow:hidden}.w-0{width:0!important}.h-0{height:0!important}.w-1{width:.25rem!important}.h-1{height:.25rem!important}.w-2{width:.5rem!important}.h-2{height:.5rem!important}.w-3{width:1rem!important}.h-3{height:1rem!important}.w-4{width:1.5rem!important}.h-4{height:1.5rem!important}.w-5{width:2rem!important}.h-5{height:2rem!important}.w-6{width:3rem!important}.h-6{height:3rem!important}.w-7{width:5rem!important}.h-7{height:5rem!important}.w-8{width:8rem!important}.h-8{height:8rem!important}.w-auto{width:auto!important}.h-auto{height:auto!important}.w-px{width:1px!important}.h-px{height:1px!important}.w-full{width:100%!important}.h-full{height:100%!important}.opacity-0{opacity:0!important}.opacity-5{opacity:.05!important}.opacity-10{opacity:.1!important}.opacity-15{opacity:.15!important}.opacity-20{opacity:.2!important}.opacity-25{opacity:.25!important}.opacity-30{opacity:.3!important}.opacity-35{opacity:.35!important}.opacity-40{opacity:.4!important}.opacity-45{opacity:.45!important}.opacity-50{opacity:.5!important}.opacity-55{opacity:.55!important}.opacity-60{opacity:.6!important}.opacity-65{opacity:.65!important}.opacity-70{opacity:.7!important}.opacity-75{opacity:.75!important}.opacity-80{opacity:.8!important}.opacity-85{opacity:.85!important}.opacity-90{opacity:.9!important}.opacity-95{opacity:.95!important}.opacity-100{opacity:1!important}.hover-shadow-sm:hover{box-shadow:0 .125rem .25rem #00000013!important}.hover-shadow:hover{box-shadow:rgba(var(--tblr-body-color-rgb),.04) 0 2px 4px!important}.hover-shadow-lg:hover{box-shadow:0 1rem 3rem #0000002d!important}.hover-shadow-none:hover{box-shadow:none!important}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.ts-control{border:1px solid var(--tblr-border-color);padding:.5625rem .75rem;width:100%;overflow:hidden;position:relative;z-index:1;box-sizing:border-box;box-shadow:none;border-radius:var(--tblr-border-radius);display:flex;flex-wrap:wrap}.ts-wrapper.multi.has-items .ts-control{padding:calc(.5625rem - 1px + -0) .75rem calc(.5625rem - 4px + -0)}.full .ts-control{background-color:var(--tblr-bg-forms)}.disabled .ts-control,.disabled .ts-control *{cursor:default!important}.focus .ts-control{box-shadow:none}.ts-control>*{vertical-align:baseline;display:inline-block}.ts-wrapper.multi .ts-control>div{cursor:pointer;margin:0 3px 3px 0;padding:1px 5px;background:#efefef;color:#182433;border:0 solid #dadfe5}.ts-wrapper.multi .ts-control>div.active{background:#00857d;color:#fff;border:0 solid rgba(0,0,0,0)}.ts-wrapper.multi.disabled .ts-control>div,.ts-wrapper.multi.disabled .ts-control>div.active{color:#727272;background:#fff;border:0 solid white}.ts-control>input{flex:1 1 auto;min-width:7rem;display:inline-block!important;padding:0!important;min-height:0!important;max-height:none!important;max-width:100%!important;margin:0!important;text-indent:0!important;border:0 none!important;background:none!important;line-height:inherit!important;user-select:auto!important;box-shadow:none!important}.ts-control>input::-ms-clear{display:none}.ts-control>input:focus{outline:none!important}.has-items .ts-control>input{margin:0 4px!important}.ts-control.rtl{text-align:right}.ts-control.rtl.single .ts-control:after{left:calc(.75rem + 5px);right:auto}.ts-control.rtl .ts-control>input{margin:0 4px 0 -2px!important}.disabled .ts-control{opacity:.5;background-color:var(--tblr-bg-surface-secondary)}.input-hidden .ts-control>input{opacity:0;position:absolute;left:-10000px}.ts-dropdown{position:absolute;top:100%;left:0;width:100%;z-index:10;border:1px solid #d0d0d0;background:#fff;margin:.25rem 0 0;border-top:0 none;box-sizing:border-box;box-shadow:0 1px 3px #0000001a;border-radius:0 0 var(--tblr-border-radius) var(--tblr-border-radius)}.ts-dropdown [data-selectable]{cursor:pointer;overflow:hidden}.ts-dropdown [data-selectable] .highlight{background:#ffed2866;border-radius:1px}.ts-dropdown .option,.ts-dropdown .optgroup-header,.ts-dropdown .no-results,.ts-dropdown .create{padding:3px .75rem}.ts-dropdown .option,.ts-dropdown [data-disabled],.ts-dropdown [data-disabled] [data-selectable].option{cursor:inherit;opacity:.5}.ts-dropdown [data-selectable].option{opacity:1;cursor:pointer}.ts-dropdown .optgroup:first-child .optgroup-header{border-top:0 none}.ts-dropdown .optgroup-header{color:#667382;background:var(--tblr-bg-surface);cursor:default}.ts-dropdown .active{background-color:rgba(var(--tblr-secondary-rgb),.08);color:inherit}.ts-dropdown .active.create{color:inherit}.ts-dropdown .create{color:#18243380}.ts-dropdown .spinner{display:inline-block;width:30px;height:30px;margin:3px .75rem}.ts-dropdown .spinner:after{content:" ";display:block;width:24px;height:24px;margin:3px;border-radius:50%;border:5px solid #d0d0d0;border-color:#d0d0d0 transparent #d0d0d0 transparent;animation:lds-dual-ring 1.2s linear infinite}@keyframes lds-dual-ring{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ts-dropdown-content{overflow:hidden auto;max-height:200px;scroll-behavior:smooth}.ts-wrapper.plugin-drag_drop .ts-dragging{color:transparent!important}.ts-wrapper.plugin-drag_drop .ts-dragging>*{visibility:hidden!important}.plugin-checkbox_options:not(.rtl) .option input{margin-right:.5rem}.plugin-checkbox_options.rtl .option input{margin-left:.5rem}.plugin-clear_button{--ts-pr-clear-button: 1em}.plugin-clear_button .clear-button{opacity:0;position:absolute;top:50%;transform:translateY(-50%);right:calc(.75rem - 5px);margin-right:0!important;background:transparent!important;transition:opacity .5s;cursor:pointer}.plugin-clear_button.form-select .clear-button,.plugin-clear_button.single .clear-button{right:max(var(--ts-pr-caret),.75rem)}.plugin-clear_button.focus.has-items .clear-button,.plugin-clear_button:not(.disabled):hover.has-items .clear-button{opacity:1}.ts-wrapper .dropdown-header{position:relative;padding:6px .75rem;border-bottom:1px solid #d0d0d0;background:color-mix(#fff,#d0d0d0,85%);border-radius:var(--tblr-border-radius) var(--tblr-border-radius) 0 0}.ts-wrapper .dropdown-header-close{position:absolute;right:.75rem;top:50%;color:#182433;opacity:.4;margin-top:-12px;line-height:20px;font-size:20px!important}.ts-wrapper .dropdown-header-close:hover{color:#000}.plugin-dropdown_input.focus.dropdown-active .ts-control{box-shadow:none;border:1px solid var(--tblr-border-color);box-shadow:var(--tblr-box-shadow-input)}.plugin-dropdown_input .dropdown-input{border:1px solid #d0d0d0;border-width:0 0 1px;display:block;padding:.5625rem .75rem;box-shadow:none;width:100%;background:transparent}.plugin-dropdown_input.focus .ts-dropdown .dropdown-input{border-color:#80c2be;outline:0;box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.plugin-dropdown_input .items-placeholder{border:0 none!important;box-shadow:none!important;width:100%}.plugin-dropdown_input.has-items .items-placeholder,.plugin-dropdown_input.dropdown-active .items-placeholder{display:none!important}.ts-wrapper.plugin-input_autogrow.has-items .ts-control>input{min-width:0}.ts-wrapper.plugin-input_autogrow.has-items.focus .ts-control>input{flex:none;min-width:4px}.ts-wrapper.plugin-input_autogrow.has-items.focus .ts-control>input::placeholder{color:transparent}.ts-dropdown.plugin-optgroup_columns .ts-dropdown-content{display:flex}.ts-dropdown.plugin-optgroup_columns .optgroup{border-right:1px solid #f2f2f2;border-top:0 none;flex-grow:1;flex-basis:0;min-width:0}.ts-dropdown.plugin-optgroup_columns .optgroup:last-child{border-right:0 none}.ts-dropdown.plugin-optgroup_columns .optgroup:before{display:none}.ts-dropdown.plugin-optgroup_columns .optgroup-header{border-top:0 none}.ts-wrapper.plugin-remove_button .item{display:inline-flex;align-items:center}.ts-wrapper.plugin-remove_button .item .remove{color:inherit;text-decoration:none;vertical-align:middle;display:inline-block;padding:0 5px;border-radius:0 2px 2px 0;box-sizing:border-box}.ts-wrapper.plugin-remove_button .item .remove:hover{background:#0000000d}.ts-wrapper.plugin-remove_button.disabled .item .remove:hover{background:none}.ts-wrapper.plugin-remove_button .remove-single{position:absolute;right:0;top:0;font-size:23px}.ts-wrapper.plugin-remove_button:not(.rtl) .item{padding-right:0!important}.ts-wrapper.plugin-remove_button:not(.rtl) .item .remove{border-left:1px solid #dadfe5;margin-left:5px}.ts-wrapper.plugin-remove_button:not(.rtl) .item.active .remove{border-left-color:#0000}.ts-wrapper.plugin-remove_button:not(.rtl).disabled .item .remove{border-left-color:#fff}.ts-wrapper.plugin-remove_button.rtl .item{padding-left:0!important}.ts-wrapper.plugin-remove_button.rtl .item .remove{border-right:1px solid #dadfe5;margin-right:5px}.ts-wrapper.plugin-remove_button.rtl .item.active .remove{border-right-color:#0000}.ts-wrapper.plugin-remove_button.rtl.disabled .item .remove{border-right-color:#fff}:root{--ts-pr-clear-button: 0;--ts-pr-caret: 0;--ts-pr-min: .75rem}.ts-wrapper.single .ts-control,.ts-wrapper.single .ts-control input{cursor:pointer}.ts-control:not(.rtl){padding-right:max(var(--ts-pr-min),var(--ts-pr-clear-button) + var(--ts-pr-caret))!important}.ts-control.rtl{padding-left:max(var(--ts-pr-min),var(--ts-pr-clear-button) + var(--ts-pr-caret))!important}.ts-wrapper{position:relative}.ts-dropdown,.ts-control,.ts-control input{color:#182433;font-family:inherit;font-size:inherit;line-height:1.4285714286}.ts-control,.ts-wrapper.single.input-active .ts-control{background:var(--tblr-bg-forms);cursor:text}.ts-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;clip-path:inset(50%)!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;white-space:nowrap!important}.ts-dropdown,.ts-dropdown.form-control,.ts-dropdown.form-select{height:auto;padding:0;z-index:1000;background:#fff;border:1px solid var(--tblr-border-color-translucent);border-radius:4px;box-shadow:0 6px 12px #0000002d}.ts-dropdown .optgroup-header{font-size:.765625rem;line-height:1.4285714286}.ts-dropdown .optgroup:first-child:before{display:none}.ts-dropdown .optgroup:before{content:" ";display:block;height:0;margin:var(--tblr-spacer) 0;overflow:hidden;border-top:1px solid var(--tblr-border-color-translucent);margin-left:-.75rem;margin-right:-.75rem}.ts-dropdown .create{padding-left:.75rem}.ts-dropdown-content{padding:5px 0}.ts-control{box-shadow:var(--tblr-box-shadow-input);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:flex;align-items:center}@media (prefers-reduced-motion: reduce){.ts-control{transition:none}}.focus .ts-control{border-color:#80c2be;outline:0;box-shadow:var(--tblr-box-shadow-input),0 0 0 .25rem rgba(var(--tblr-primary-rgb),.25)}.ts-control .item{display:flex;align-items:center}.ts-wrapper.is-invalid,.was-validated .invalid,.was-validated :invalid+.ts-wrapper{border-color:var(--tblr-form-invalid-color)}.ts-wrapper.is-invalid:not(.single),.was-validated .invalid:not(.single),.was-validated :invalid+.ts-wrapper:not(.single){background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-position:right calc(.3571428572em + .28125rem) center;background-size:calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem);background-repeat:no-repeat}.ts-wrapper.is-invalid.single,.was-validated .invalid.single,.was-validated :invalid+.ts-wrapper.single{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23929dab' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem);background-repeat:no-repeat}.ts-wrapper.is-invalid.focus .ts-control,.was-validated .invalid.focus .ts-control,.was-validated :invalid+.ts-wrapper.focus .ts-control{border-color:var(--tblr-form-invalid-color);box-shadow:0 0 0 .25rem rgba(var(--tblr-form-invalid-color),.25)}.ts-wrapper.is-valid,.was-validated .valid,.was-validated :valid+.ts-wrapper{border-color:var(--tblr-form-valid-color)}.ts-wrapper.is-valid:not(.single),.was-validated .valid:not(.single),.was-validated :valid+.ts-wrapper:not(.single){background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-position:right calc(.3571428572em + .28125rem) center;background-size:calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem);background-repeat:no-repeat}.ts-wrapper.is-valid.single,.was-validated .valid.single,.was-validated :valid+.ts-wrapper.single{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23929dab' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.7142857143em + .5625rem) calc(.7142857143em + .5625rem);background-repeat:no-repeat}.ts-wrapper.is-valid.focus .ts-control,.was-validated .valid.focus .ts-control,.was-validated :valid+.ts-wrapper.focus .ts-control{border-color:var(--tblr-form-valid-color);box-shadow:0 0 0 .25rem rgba(var(--tblr-form-valid-color),.25)}.ts-wrapper{min-height:calc(1.4285714286em + 1.125rem + calc(var(--tblr-border-width) * 2));display:flex}.input-group-sm>.ts-wrapper,.ts-wrapper.form-select-sm,.ts-wrapper.form-control-sm{min-height:calc(1.4285714286em + .25rem + calc(var(--tblr-border-width) * 2))}.input-group-sm>.ts-wrapper .ts-control,.ts-wrapper.form-select-sm .ts-control,.ts-wrapper.form-control-sm .ts-control{border-radius:var(--tblr-border-radius-sm);font-size:.75rem}.input-group-sm>.ts-wrapper.has-items .ts-control,.ts-wrapper.form-select-sm.has-items .ts-control,.ts-wrapper.form-control-sm.has-items .ts-control{font-size:.75rem;padding-bottom:0}.input-group-sm>.ts-wrapper.multi.has-items .ts-control,.ts-wrapper.form-select-sm.multi.has-items .ts-control,.ts-wrapper.form-control-sm.multi.has-items .ts-control{padding-top:calc((calc(1.4285714286em + .25rem + calc(var(--tblr-border-width) * 2)) - 1.4285714286 * .75rem - 4px) / 2)!important}.ts-wrapper.multi.has-items .ts-control{padding-left:calc(.75rem - 5px);--ts-pr-min: calc(.75rem - 5px) }.ts-wrapper.multi .ts-control>div{border-radius:calc(var(--tblr-border-radius) - 1px)}.input-group-lg>.ts-wrapper,.ts-wrapper.form-control-lg,.ts-wrapper.form-select-lg{min-height:calc(1.4285714286em + 1rem + calc(var(--tblr-border-width) * 2))}.input-group-lg>.ts-wrapper .ts-control,.ts-wrapper.form-control-lg .ts-control,.ts-wrapper.form-select-lg .ts-control{border-radius:var(--tblr-border-radius-lg);font-size:1.25rem}.ts-wrapper:not(.form-control,.form-select){padding:0;border:none;height:auto;box-shadow:none;background:none}.ts-wrapper:not(.form-control,.form-select).single .ts-control{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23929dab' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px}.ts-wrapper.form-select,.ts-wrapper.single{--ts-pr-caret: 2.25rem}.ts-wrapper.form-control,.ts-wrapper.form-select{padding:0!important;height:auto;box-shadow:none;display:flex}.ts-wrapper.form-control .ts-control,.ts-wrapper.form-control.single.input-active .ts-control,.ts-wrapper.form-select .ts-control,.ts-wrapper.form-select.single.input-active .ts-control{border:none!important}.ts-wrapper.form-control:not(.disabled) .ts-control,.ts-wrapper.form-control:not(.disabled).single.input-active .ts-control,.ts-wrapper.form-select:not(.disabled) .ts-control,.ts-wrapper.form-select:not(.disabled).single.input-active .ts-control{background:transparent!important}.input-group>.ts-wrapper{flex-grow:1;width:1%}.input-group>.ts-wrapper:not(:nth-child(2))>.ts-control{border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.ts-wrapper:not(:last-child)>.ts-control{border-top-right-radius:0;border-bottom-right-radius:0}:root{--ts-pr-clear-button: 0rem;--ts-pr-caret: 0rem}.ts-input,.ts-control{color:inherit}.ts-control .dropdown-menu{width:100%;height:auto}.ts-wrapper .form-control,.ts-wrapper .form-select,.ts-wrapper.form-control,.ts-wrapper.form-select{box-shadow:var(--tblr-box-shadow-input)}.ts-wrapper.is-invalid .ts-control,.ts-wrapper.is-valid .ts-control{--ts-pr-clear-button: 1.5rem}.ts-dropdown{background:var(--tblr-bg-surface);color:var(--tblr-body-color);box-shadow:var(--tblr-box-shadow-dropdown)}.ts-dropdown .option{padding:.5rem .75rem}.ts-control,.ts-control input{color:var(--tblr-body-color)}.ts-control input::placeholder{color:#929dab}.ts-wrapper.multi .ts-control>div{background:var(--tblr-bg-surface-secondary);border:1px solid var(--tblr-border-color);color:var(--tblr-body-color)}html{scroll-behavior:auto!important}.table-responsive .dropdown,.table-responsive .btn-group,.table-responsive .btn-group-vertical{position:static}.progress{min-width:80px}hr.dropdown-divider,.dropdown-divider.hr{margin-bottom:.25rem;margin-top:.25rem}.dropdown-item{font-weight:500}*{font-feature-settings:"liga" 0;font-variant-ligatures:none}pre{background-color:transparent;color:inherit}.alert{background:var(--tblr-bg-surface)}.btn{display:inline-block}.btn:focus{border:1px solid var(--tblr-primary-fg);outline:2px solid var(--tblr-primary)!important}.btn-sm,.btn-group-sm>.btn{border-radius:4px}.dropdown-item{display:inline-block}.footer .text-primary{color:#001423!important}.nav-tabs .nav-link{display:inline-block}.page,.page-tabs .nav-tabs .nav-link.active{background-color:var(--tblr-bg-surface-tertiary)!important}.page-body .card .card-header{background:var(--tblr-bg-surface-secondary)!important}[data-bs-theme=dark],body[data-bs-theme=dark] [data-bs-theme=light]{--tblr-alert-color: darken(var(--tblr-warning),10%);--tblr-link-color: #00F2D4;--tblr-link-color-rgb: 0,242,212;--tblr-link-hover-color-rgb: 0,242,212;--tblr-secondary: #bbc3cd;--tblr-primary: #00F2D4;--tblr-primary-fg: #001423;--tblr-primary-rgb: 0,242,212;--tblr-btn-active-color: #001423}body[data-bs-theme=dark],body[data-bs-theme=dark] body[data-bs-theme=light]{background-color:#001423}body[data-bs-theme=dark] ::selection,body[data-bs-theme=dark] body[data-bs-theme=light] ::selection{background-color:rgba(var(--tblr-primary-rgb),.48)}body[data-bs-theme=dark] .btn-primary,body[data-bs-theme=dark] .bg-primary .card-title,body[data-bs-theme=dark] .bg-primary a,body[data-bs-theme=dark] .bg-primary i,body[data-bs-theme=dark] .text-bg-primary{color:#001423!important}body[data-bs-theme=dark] .card{background:#001423!important}body[data-bs-theme=dark] .navbar,body[data-bs-theme=dark] .page-header{background-color:#001423}body[data-bs-theme=dark] .page,body[data-bs-theme=dark] .page-tabs .nav-tabs .nav-link.active{background-color:#081b2a!important}body[data-bs-theme=dark] .page-link.active,body[data-bs-theme=dark] .active>.page-link{color:#001423}body[data-bs-theme=dark] .text-bg-primary{color:#001423!important}body[data-bs-theme=dark] .text-muted{color:var(--tblr-secondary-color)!important}body[data-bs-theme=dark] .text-secondary{color:#bbc3cd!important}body[data-bs-theme=dark] .footer .text-primary{color:#fff!important}pre code{padding:unset}.dropdown-toggle:after{font-family:Material Design Icons;content:"\f0140";padding-right:9px;border-bottom:none;border-left:none;transform:none;vertical-align:.05em;height:auto}.ts-wrapper.multi .ts-control{padding:7px 7px 3px}.ts-wrapper.multi .ts-control div{margin:0 4px 4px 0}.badge a{color:inherit;text-decoration:none}.page-body .card{margin-bottom:1rem}.page-body .card .card-header,.page-body .card .card-body,.page-body .card .card-footer{padding:.75rem}.page-body .card .card-header{background:var(--tblr-bg-surface-tertiary)}.page-body .card h2.card-header,.page-body .card .card-header.h2{font-size:var(--tblr-font-size-h5);line-height:var(--tblr-line-height-h5);margin-bottom:0}.page-body .card .list-group-item{padding:.5rem .75rem}.page-body .card .table,.page-body .card .markdown>table{margin-bottom:0}form.object-edit{margin:auto;max-width:800px}.col-form-label.required{font-weight:700}.col-form-label.required:after{position:absolute;display:inline-block;margin-left:0;font-family:Material Design Icons;font-size:8px;content:"\f06c4"}.has-errors input,.has-errors select,.has-errors textarea{border:1px solid #d63939}.page{background-color:var(--tblr-bg-surface-secondary)}.page-header{background-color:var(--tblr-bg-surface);min-height:0}@media (min-width: 992px){.navbar-vertical.navbar-expand-lg{padding-bottom:2rem}}.navbar-vertical.navbar-expand-lg .navbar-collapse .nav-link-icon{color:var(--tblr-nav-link-color)!important}.navbar-vertical.navbar-expand-lg .navbar-collapse .text-secondary{color:#00857d!important}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item a{color:#001423}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item .btn-group{visibility:hidden}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:hover{background-color:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:hover a{text-decoration:none}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item:hover .btn-group{visibility:visible}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active{background-color:var(--tblr-navbar-active-bg)}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active a{color:#001423}.navbar-vertical.navbar-expand-lg .navbar-collapse .dropdown-menu .dropdown-item.active .btn-group{visibility:visible}.navbar-vertical.navbar-expand-lg .navbar-nav{z-index:1}@media (max-width: 991.98px){.navbar-vertical.navbar-expand-lg .navbar-brand{padding:.2rem 0}}.navbar-vertical.navbar-expand-lg .navbar-brand a:hover{text-decoration:none}.navbar-vertical.navbar-expand-lg img.motif{bottom:0;display:none;left:0;mask-image:linear-gradient(180deg,#0000,#0000004d);opacity:.5;position:fixed;user-drag:none;user-select:none;-moz-user-select:none;-webkit-user-drag:none;-webkit-user-select:none;-ms-user-select:none;width:18rem}@media (min-width: 992px){.navbar-vertical.navbar-expand-lg img.motif{display:block}}body[data-bs-theme=light] .navbar-vertical.navbar-expand-lg{background:linear-gradient(180deg,#00857d00,#00857d1a),#fff}body[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg{background:linear-gradient(180deg,#00f2d400,#00f2d41a),#001423}body[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .nav-item.dropdown.active:after{border-color:#00f2d4!important}body[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .dropdown-item a{color:#fff!important}body[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .dropdown-item.active{background-color:#ffffff0f!important}body[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .dropdown-item.active a{color:#fff!important}body[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .dropdown-item:hover{background-color:#ffffff0f!important}body[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .dropdown-item .nav-link-title{color:#fff!important}body[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg .text-secondary{color:#00f2d4!important}body[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg img.motif{opacity:.25}.progress{height:20px}.progress .progress-label{display:flex;flex-direction:column;justify-content:center;padding-left:.25rem}table.object-list tbody>tr:last-child>td{border-bottom-width:0}table.object-list th.asc>a:after{content:"\f0140";font-family:Material Design Icons}table.object-list th.desc>a:after{content:"\f0143";font-family:Material Design Icons}table.attr-table th{font-weight:500;width:min-content}table.attr-table th,table.attr-table td{border-bottom-style:dashed}table.attr-table tr:last-child{border-bottom-style:hidden}table.attr-table td{overflow-wrap:anywhere}td pre{margin-bottom:0}table th.orderable a{color:var(--tblr-body-color)}body[data-bs-theme=dark] .table thead th,body[data-bs-theme=dark] .markdown>table thead th{background:#001423!important}.page-tabs{border-bottom:1px solid var(--tblr-border-color-translucent)}.page-tabs .nav-tabs{position:relative;border:none}.page-tabs .nav-tabs .nav-link.active,.page-tabs .nav-tabs .nav-link:active,.page-tabs .nav-tabs .nav-link:hover{border-color:var(--tblr-border-color-translucent);border-bottom-color:transparent}.page-tabs .nav-tabs .nav-link.active{color:inherit;background:var(--tblr-bg-surface-secondary);border-bottom-color:transparent}pre.change-data{border-radius:0;padding:0}pre.change-data>span{display:block;padding-right:1rem;padding-left:1rem}pre.change-data>span.added{background-color:#2fb344}pre.change-data>span.removed{background-color:#d63939}pre.change-diff{border-color:transparent}pre.change-diff.change-added{background-color:#2fb344}pre.change-diff.change-removed{background-color:#d63939}pre.block{padding:1rem;border:1px solid #dadfe5;border-radius:4px}.grid-stack .card-header.bg-default{background:var(--tblr-bg-surface-secondary)!important}.grid-stack .card-header a{color:inherit!important}tr[data-cable-status=connected]{background-color:#2fb34426}tr[data-cable-status=planned]{background-color:#0054a626}tr[data-cable-status=decommissioning]{background-color:#f59f0026}tr[data-mark-connected=true]{background-color:#2fb34426}tr[data-virtual=true]{background-color:#00857d26}tr[data-enabled=disabled]{background-color:#d6393926}tr[data-cable-status=connected] button.mark-installed{display:none}tr:not([data-cable-status=connected]) button.mark-planned{display:none}.rendered-markdown table{width:100%}.rendered-markdown table th{border-bottom:2px solid #dddddd;padding:8px}.rendered-markdown table td{border-top:1px solid #dddddd;padding:8px}.rendered-markdown table th[align=left]{text-align:left}.rendered-markdown table th[align=center]{text-align:center}.rendered-markdown table th[align=right]{text-align:right}td>.rendered-markdown{max-height:200px;overflow-y:scroll}td>.rendered-markdown p:last-of-type{margin-bottom:0}.markdown-widget .preview{border:1px solid #dadfe5;border-radius:4px;min-height:200px}span.color-label{display:inline-block;width:5rem;height:1rem;padding:.25em .5em;border:1px solid #303030;border-radius:4px}.record-depth{display:inline;user-select:none;opacity:33%}.record-depth span:only-of-type,.record-depth span:last-of-type{margin-right:.25rem}.hide-last-child :last-child{visibility:hidden;opacity:0}.netbox-edition{letter-spacing:.15rem}tr[data-read=True] td{background-color:var(--tblr-bg-surface-secondary);color:var(--tblr-secondary-color)} diff --git a/netbox/project-static/dist/plus-jakarta-sans-cyrillic-ext-wght-normal-3FNWYSHQ.woff2 b/netbox/project-static/dist/plus-jakarta-sans-cyrillic-ext-wght-normal-3FNWYSHQ.woff2 new file mode 100644 index 0000000000..c456409f09 Binary files /dev/null and b/netbox/project-static/dist/plus-jakarta-sans-cyrillic-ext-wght-normal-3FNWYSHQ.woff2 differ diff --git a/netbox/project-static/dist/plus-jakarta-sans-latin-ext-wght-normal-WWG75Y4U.woff2 b/netbox/project-static/dist/plus-jakarta-sans-latin-ext-wght-normal-WWG75Y4U.woff2 new file mode 100644 index 0000000000..bdb7edfd40 Binary files /dev/null and b/netbox/project-static/dist/plus-jakarta-sans-latin-ext-wght-normal-WWG75Y4U.woff2 differ diff --git a/netbox/project-static/dist/plus-jakarta-sans-latin-wght-normal-S6EFCQOU.woff2 b/netbox/project-static/dist/plus-jakarta-sans-latin-wght-normal-S6EFCQOU.woff2 new file mode 100644 index 0000000000..8c4a84afe0 Binary files /dev/null and b/netbox/project-static/dist/plus-jakarta-sans-latin-wght-normal-S6EFCQOU.woff2 differ diff --git a/netbox/project-static/dist/plus-jakarta-sans-vietnamese-wght-normal-NNXUV3SN.woff2 b/netbox/project-static/dist/plus-jakarta-sans-vietnamese-wght-normal-NNXUV3SN.woff2 new file mode 100644 index 0000000000..57866b15f7 Binary files /dev/null and b/netbox/project-static/dist/plus-jakarta-sans-vietnamese-wght-normal-NNXUV3SN.woff2 differ diff --git a/netbox/project-static/img/logo_netbox_bright_teal.svg b/netbox/project-static/img/logo_netbox_bright_teal.svg new file mode 100644 index 0000000000..958a1d401b --- /dev/null +++ b/netbox/project-static/img/logo_netbox_bright_teal.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/netbox/project-static/img/logo_netbox_dark_teal.svg b/netbox/project-static/img/logo_netbox_dark_teal.svg new file mode 100644 index 0000000000..5e4d36173c --- /dev/null +++ b/netbox/project-static/img/logo_netbox_dark_teal.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/netbox/project-static/img/motif.svg b/netbox/project-static/img/motif.svg new file mode 100644 index 0000000000..11a49f454f --- /dev/null +++ b/netbox/project-static/img/motif.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/netbox/project-static/img/netbox.ico b/netbox/project-static/img/netbox.ico index bb1051549b..6bd35f9a8e 100644 Binary files a/netbox/project-static/img/netbox.ico and b/netbox/project-static/img/netbox.ico differ diff --git a/netbox/project-static/img/netbox_logo.svg b/netbox/project-static/img/netbox_logo.svg deleted file mode 100644 index 5321be100e..0000000000 --- a/netbox/project-static/img/netbox_logo.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/netbox/project-static/img/netbox_touch-icon-180.png b/netbox/project-static/img/netbox_touch-icon-180.png index ff9b710869..a3a1f266e7 100644 Binary files a/netbox/project-static/img/netbox_touch-icon-180.png and b/netbox/project-static/img/netbox_touch-icon-180.png differ diff --git a/netbox/project-static/netbox-graphiql/package.json b/netbox/project-static/netbox-graphiql/package.json index 85d06f7f83..27257e34c4 100644 --- a/netbox/project-static/netbox-graphiql/package.json +++ b/netbox/project-static/netbox-graphiql/package.json @@ -1,16 +1,16 @@ { "name": "netbox-graphiql", - "version": "4.0.0", + "version": "4.1.0", "description": "NetBox GraphiQL Custom Front End", "main": "dist/graphiql.js", "license": "Apache-2.0", "private": true, "dependencies": { - "graphiql": "3.2.0", - "graphql": "16.8.1", - "react": "18.3.1", - "react-dom": "18.3.1", + "@graphiql/plugin-explorer": "3.2.2", + "graphiql": "3.7.1", + "graphql": "16.9.0", "js-cookie": "3.0.5", - "@graphiql/plugin-explorer": "2.0.0" + "react": "18.3.1", + "react-dom": "18.3.1" } } diff --git a/netbox/project-static/package.json b/netbox/project-static/package.json index 4bd1f74451..9ea5d5d738 100644 --- a/netbox/project-static/package.json +++ b/netbox/project-static/package.json @@ -22,6 +22,7 @@ "validate:formatting:scripts": "prettier -c src/**/*.ts" }, "dependencies": { + "@fontsource-variable/plus-jakarta-sans": "^5.0.22", "@mdi/font": "7.4.47", "@tabler/core": "1.0.0-beta20", "bootstrap": "5.3.3", @@ -32,7 +33,6 @@ "query-string": "9.1.0", "sass": "1.77.8", "tom-select": "2.3.1", - "typeface-inter": "3.18.1", "typeface-roboto-mono": "1.1.13" }, "devDependencies": { @@ -41,12 +41,12 @@ "@types/node": "^22.3.0", "@typescript-eslint/eslint-plugin": "^8.1.0", "@typescript-eslint/parser": "^8.1.0", - "esbuild": "^0.23.0", + "esbuild": "^0.23.1", "esbuild-sass-plugin": "^3.3.1", "eslint": "<9.0", "eslint-config-prettier": "^9.1.0", - "eslint-import-resolver-typescript": "^3.5.1", - "eslint-plugin-import": "^2.26.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-prettier": "^5.2.1", "prettier": "^3.3.3", "typescript": "<5.5" diff --git a/netbox/project-static/styles/_variables.scss b/netbox/project-static/styles/_variables.scss index afd4bc6bdf..749f0ba57c 100644 --- a/netbox/project-static/styles/_variables.scss +++ b/netbox/project-static/styles/_variables.scss @@ -1,9 +1,10 @@ // Global variables // Set base fonts -$font-family-sans-serif: 'Inter'; +$font-family-sans-serif: 'Plus Jakarta Sans Variable', system-ui, sans-serif; // See https://github.com/tabler/tabler/issues/1812 $font-family-monospace: 'Roboto Mono'; +$font-weight-base: 500; // Set the navigation sidebar width $sidebar-width: 18rem; @@ -21,3 +22,16 @@ $hover-bg: rgba(var(--tblr-secondary-rgb), 0.08); // Ensure active nav-pill has a background color in dark mode $nav-pills-link-active-bg: rgba(var(--tblr-secondary-rgb), 0.15); + +// Brand colors +$rich-black: #001423; +$rich-black-light: #081B2A; +$rich-black-lighter: #0D202E; +$rich-black-lightest: #1A2C39; +$bright-teal: #00F2D4; +$dark-teal: #00857D; + +$primary: $dark-teal; + +// Navbar active dropdown border color +$navbar-active-border-color: $dark-teal; diff --git a/netbox/project-static/styles/custom/_dashboard.scss b/netbox/project-static/styles/custom/_dashboard.scss new file mode 100644 index 0000000000..a1c0e13ec7 --- /dev/null +++ b/netbox/project-static/styles/custom/_dashboard.scss @@ -0,0 +1,12 @@ +// Alter default color for dashboard widget headings +.grid-stack { + .card-header { + // Default color of card header changes depending on theme + &.bg-default { + background: var(--tblr-bg-surface-secondary) !important; + } + a { + color: inherit !important; + } + } +} diff --git a/netbox/project-static/styles/custom/_misc.scss b/netbox/project-static/styles/custom/_misc.scss index 9779bf583d..08125e8d3c 100644 --- a/netbox/project-static/styles/custom/_misc.scss +++ b/netbox/project-static/styles/custom/_misc.scss @@ -28,3 +28,8 @@ span.color-label { visibility: hidden; opacity: 0; } + +// NetBox edition text +.netbox-edition { + letter-spacing: .15rem; +} diff --git a/netbox/project-static/styles/custom/_notifications.scss b/netbox/project-static/styles/custom/_notifications.scss new file mode 100644 index 0000000000..4777362aa1 --- /dev/null +++ b/netbox/project-static/styles/custom/_notifications.scss @@ -0,0 +1,9 @@ +@use 'sass:map'; + +// Mute read notifications +tr[data-read=True] { + td { + background-color: var(--#{$prefix}bg-surface-secondary); + color: $text-muted; + } +} diff --git a/netbox/project-static/styles/external.scss b/netbox/project-static/styles/external.scss index b3c83aa874..1e09d1803f 100644 --- a/netbox/project-static/styles/external.scss +++ b/netbox/project-static/styles/external.scss @@ -4,5 +4,5 @@ @import 'gridstack/dist/gridstack.min.css'; // Fonts -@import url("../node_modules/typeface-inter/inter.css"); @import url("../node_modules/typeface-roboto-mono/index.css"); +@import url("../node_modules/@fontsource-variable/plus-jakarta-sans/index.css"); diff --git a/netbox/project-static/styles/netbox.scss b/netbox/project-static/styles/netbox.scss index af2905312f..effc90dec0 100644 --- a/netbox/project-static/styles/netbox.scss +++ b/netbox/project-static/styles/netbox.scss @@ -21,6 +21,8 @@ // Custom styling @import 'custom/code'; +@import 'custom/dashboard'; @import 'custom/interfaces'; @import 'custom/markdown'; @import 'custom/misc'; +@import 'custom/notifications'; diff --git a/netbox/project-static/styles/overrides/_bootstrap.scss b/netbox/project-static/styles/overrides/_bootstrap.scss index 3b58767fdb..f3c6a02af9 100644 --- a/netbox/project-static/styles/overrides/_bootstrap.scss +++ b/netbox/project-static/styles/overrides/_bootstrap.scss @@ -21,6 +21,11 @@ hr.dropdown-divider { margin-top: 0.25rem; } +// Bootstrap forces the font weight for dropdown items to $font-weight-normal +.dropdown-item { + font-weight: $font-weight-base; +} + // Restore support for old Bootstrap v3 colors .text-bg-black { @extend .text-bg-dark; diff --git a/netbox/project-static/styles/overrides/_tabler.scss b/netbox/project-static/styles/overrides/_tabler.scss index 38a6006016..814a6d82b3 100644 --- a/netbox/project-static/styles/overrides/_tabler.scss +++ b/netbox/project-static/styles/overrides/_tabler.scss @@ -11,16 +11,38 @@ pre { color: inherit; } -// Buttons +// Slightly increase alert contrast between bg and text +.alert { + background: var(--#{$prefix}bg-surface); +} + +// Button adjustments .btn { // Tabler sets display: flex display: inline-block; + + &:focus { + // Add button focus state + border: 1px solid var(--tblr-primary-fg); + outline: 2px solid var(--tblr-primary) !important; + } } .btn-sm { // $border-radius-sm (2px) is too small border-radius: $border-radius; } +// Dropdown items +.dropdown-item { + // Tabler sets display: flex + display: inline-block; +} + +// Set footer icon color +.footer .text-primary { + color: $rich-black !important; +} + // Tabs .nav-tabs { .nav-link { @@ -29,20 +51,83 @@ pre { } } -// Dropdown items -.dropdown-item { - // Tabler sets display: flex - display: inline-block;; +// Altering background colors +.page, .page-tabs .nav-tabs .nav-link.active { + background-color: var(--#{$prefix}bg-surface-tertiary) !important; +} +.page-body .card .card-header { + background: var(--tblr-bg-surface-secondary) !important; } -table a { - // Adjust table anchor link contrast as not enough contrast in dark mode - filter: brightness(110%); +// Dark mode colors +@if $enable-dark-mode { + @include color-mode(dark, true) { + --#{$prefix}alert-color: darken(var(--#{$prefix}warning),10%); + --#{$prefix}link-color: #{$bright-teal}; + --#{$prefix}link-color-rgb: 0,242,212; + --#{$prefix}link-hover-color-rgb: 0,242,212; + --#{$prefix}secondary: #{$gray-400}; + --#{$prefix}primary: #{$bright-teal}; + --#{$prefix}primary-fg: #{$rich-black}; + --#{$prefix}primary-rgb: 0,242,212; + --#{$prefix}btn-active-color: #{$rich-black}; + } } -// Override background color alpha value -[data-bs-theme=dark] ::selection { - background-color: rgba(var(--tblr-primary-rgb),.48) +// Dark mode overrides +body[data-bs-theme=dark] { + // Override background color alpha value + ::selection { + background-color: rgba(var(--tblr-primary-rgb),.48); + } + + .btn-primary { + color: $rich-black !important; + } + + // Change content color when primary teal changes with theme + .bg-primary { + .card-title,a,i { + color: $rich-black !important; + } + } + .text-bg-primary { + color: $rich-black !important; + } + + // Altering background colors + .card { + background: $rich-black !important; + } + + // Background colors to match brand colors + background-color: $rich-black; + .navbar, .page-header { + background-color: $rich-black; + } + .page, .page-tabs .nav-tabs .nav-link.active { + background-color: $rich-black-light !important; + } + + .page-link.active, .active>.page-link { + color: $rich-black; + } + + // Adjusting text colors + .text- { + &bg-primary { + color: $rich-black !important; + } + &muted { + color: var(--#{$prefix}secondary-color) !important; + } + &secondary { + color: $gray-400 !important; + } + } + .footer .text-primary { + color: white !important; + } } // Do not apply padding to elements inside a

diff --git a/netbox/project-static/styles/transitional/_cards.scss b/netbox/project-static/styles/transitional/_cards.scss
index 6a76665248..21b63b6907 100644
--- a/netbox/project-static/styles/transitional/_cards.scss
+++ b/netbox/project-static/styles/transitional/_cards.scss
@@ -16,6 +16,13 @@
       background: var(--#{$prefix}bg-surface-tertiary);
     }
 
+    // Use 
font size for card headers + h2.card-header { + font-size: var(--#{$prefix}font-size-h5); + line-height: var(--#{$prefix}line-height-h5); + margin-bottom: 0; + } + // Reduce padding .list-group-item { padding: 0.5rem 0.75rem; diff --git a/netbox/project-static/styles/transitional/_forms.scss b/netbox/project-static/styles/transitional/_forms.scss index a489d87dec..147b11b973 100644 --- a/netbox/project-static/styles/transitional/_forms.scss +++ b/netbox/project-static/styles/transitional/_forms.scss @@ -4,6 +4,13 @@ form.object-edit { max-width: 800px; } +// Use

style for field group headings +.field-group { + h2 { + @extend h3; + } +} + // Set bond font & append an asterisk to labels for required fields .col-form-label.required { font-weight: bold; diff --git a/netbox/project-static/styles/transitional/_navigation.scss b/netbox/project-static/styles/transitional/_navigation.scss index fe7b8e75a6..67aa199356 100644 --- a/netbox/project-static/styles/transitional/_navigation.scss +++ b/netbox/project-static/styles/transitional/_navigation.scss @@ -1,18 +1,34 @@ -// Navbar styling +// Navbar and light theme styling .navbar-vertical.navbar-expand-lg { + + // Adds spacing to the bottom of the side navigation to avoid hidden nav items + @include media-breakpoint-up(lg) { + padding-bottom: 2rem; + } + + // Adjust hover color & style for menu items .navbar-collapse { + .nav-link-icon { + color: var(--tblr-nav-link-color) !important; + } + .text-secondary { + color: $dark-teal !important; + } + .dropdown-menu { + + // Adjust hover color & style for menu items .dropdown-item { a { - color: inherit; + color: $rich-black; } .btn-group { visibility: hidden; } - // Adjust hover color & style for menu items + // Style menu item hover state &:hover { - background-color: $gray-700; + background-color: var(--tblr-navbar-active-bg); a { text-decoration: none; } @@ -23,9 +39,9 @@ // Style active menu item &.active { - background-color: $gray-700; + background-color: var(--tblr-navbar-active-bg); a { - color: white; + color: $rich-black; } .btn-group { visibility: visible; @@ -35,4 +51,87 @@ } } } + + // Ensures theme toggle appears above background image + .navbar-nav { + z-index: 1; + } + + // Logo text for non-community editions + .navbar-brand { + + // Reduce logo padding on mobile view + @include media-breakpoint-down(lg) { + padding: 0.2rem 0; + } + + a:hover { + text-decoration: none; + } + } + + // Navigation geometric graphic for non-community editions + img.motif { + bottom: 0; + display: none; + left:0; + mask-image: linear-gradient(180deg, rgba(0, 0, 0, 0.00) 0%, rgba(0, 0, 0, 0.30) 100%); + opacity: .5; + position: fixed; + user-drag: none; + user-select: none; + -moz-user-select: none; + -webkit-user-drag: none; + -webkit-user-select: none; + -ms-user-select: none; + width:18rem; + + @include media-breakpoint-up(lg) { + display: block; + } + } +} + +// Light theme styling +body[data-bs-theme=light] .navbar-vertical.navbar-expand-lg { + // Background Gradient + background: linear-gradient(180deg, rgba(0, 133, 125, 0.00) 0%, rgba(0, 133, 125, 0.10) 100%), #FFF; +} + +// Dark theme styling +body[data-bs-theme=dark] .navbar-vertical.navbar-expand-lg { + + // Background Gradient + background: linear-gradient(180deg, rgba(0, 242, 212, 0.00) 0%, rgba(0, 242, 212, 0.10) 100%), #001423; + + // Border color for active dropdown list + .nav-item.dropdown.active:after { + border-color: $bright-teal !important; + } + + // Adjust hover color & style for menu items + .dropdown-item { + a { + color: white !important; + } + &.active { + background-color: $navbar-dark-active-bg !important; + a { + color: white !important; + } + } + &:hover { + background-color: $navbar-dark-active-bg !important; + } + .nav-link-title { + color: white !important; + } + } + .text-secondary { + color: $bright-teal !important; + } + + img.motif { + opacity: .25; + } } diff --git a/netbox/project-static/styles/transitional/_tables.scss b/netbox/project-static/styles/transitional/_tables.scss index 6429fd1aa0..4094631ca0 100644 --- a/netbox/project-static/styles/transitional/_tables.scss +++ b/netbox/project-static/styles/transitional/_tables.scss @@ -23,7 +23,7 @@ table.attr-table { // Restyle row header th { - font-weight: normal; + font-weight: $font-weight-base; width: min-content; } @@ -48,3 +48,15 @@ table.attr-table { td pre { margin-bottom: 0; } + +// Use base text color for table header links +table th.orderable a { + color: var(--#{$prefix}body-color); +} + +body[data-bs-theme=dark] { + // Adjust table header background color + .table thead th, .markdown>table thead th { + background: $rich-black !important; + } +} diff --git a/netbox/project-static/yarn.lock b/netbox/project-static/yarn.lock index ce7aa20c0b..ed9885ca0c 100644 --- a/netbox/project-static/yarn.lock +++ b/netbox/project-static/yarn.lock @@ -21,125 +21,125 @@ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== -"@esbuild/aix-ppc64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz#145b74d5e4a5223489cabdc238d8dad902df5259" - integrity sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ== - -"@esbuild/android-arm64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz#453bbe079fc8d364d4c5545069e8260228559832" - integrity sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ== - -"@esbuild/android-arm@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.0.tgz#26c806853aa4a4f7e683e519cd9d68e201ebcf99" - integrity sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g== - -"@esbuild/android-x64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.0.tgz#1e51af9a6ac1f7143769f7ee58df5b274ed202e6" - integrity sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ== - -"@esbuild/darwin-arm64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz#d996187a606c9534173ebd78c58098a44dd7ef9e" - integrity sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow== - -"@esbuild/darwin-x64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz#30c8f28a7ef4e32fe46501434ebe6b0912e9e86c" - integrity sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ== - -"@esbuild/freebsd-arm64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz#30f4fcec8167c08a6e8af9fc14b66152232e7fb4" - integrity sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw== - -"@esbuild/freebsd-x64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz#1003a6668fe1f5d4439e6813e5b09a92981bc79d" - integrity sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ== - -"@esbuild/linux-arm64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz#3b9a56abfb1410bb6c9138790f062587df3e6e3a" - integrity sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw== - -"@esbuild/linux-arm@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz#237a8548e3da2c48cd79ae339a588f03d1889aad" - integrity sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw== - -"@esbuild/linux-ia32@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz#4269cd19cb2de5de03a7ccfc8855dde3d284a238" - integrity sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA== - -"@esbuild/linux-loong64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz#82b568f5658a52580827cc891cb69d2cb4f86280" - integrity sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A== - -"@esbuild/linux-mips64el@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz#9a57386c926262ae9861c929a6023ed9d43f73e5" - integrity sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w== - -"@esbuild/linux-ppc64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz#f3a79fd636ba0c82285d227eb20ed8e31b4444f6" - integrity sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw== - -"@esbuild/linux-riscv64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz#f9d2ef8356ce6ce140f76029680558126b74c780" - integrity sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw== - -"@esbuild/linux-s390x@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz#45390f12e802201f38a0229e216a6aed4351dfe8" - integrity sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg== - -"@esbuild/linux-x64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz#c8409761996e3f6db29abcf9b05bee8d7d80e910" - integrity sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ== - -"@esbuild/netbsd-x64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz#ba70db0114380d5f6cfb9003f1d378ce989cd65c" - integrity sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw== - -"@esbuild/openbsd-arm64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz#72fc55f0b189f7a882e3cf23f332370d69dfd5db" - integrity sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ== - -"@esbuild/openbsd-x64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz#b6ae7a0911c18fe30da3db1d6d17a497a550e5d8" - integrity sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg== - -"@esbuild/sunos-x64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz#58f0d5e55b9b21a086bfafaa29f62a3eb3470ad8" - integrity sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA== - -"@esbuild/win32-arm64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz#b858b2432edfad62e945d5c7c9e5ddd0f528ca6d" - integrity sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ== - -"@esbuild/win32-ia32@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz#167ef6ca22a476c6c0c014a58b4f43ae4b80dec7" - integrity sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA== - -"@esbuild/win32-x64@0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz#db44a6a08520b5f25bbe409f34a59f2d4bcc7ced" - integrity sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g== +"@esbuild/aix-ppc64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" + integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== + +"@esbuild/android-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" + integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== + +"@esbuild/android-arm@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" + integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== + +"@esbuild/android-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" + integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== + +"@esbuild/darwin-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz#05b17f91a87e557b468a9c75e9d85ab10c121b16" + integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== + +"@esbuild/darwin-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" + integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== + +"@esbuild/freebsd-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" + integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== + +"@esbuild/freebsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" + integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== + +"@esbuild/linux-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" + integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== + +"@esbuild/linux-arm@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" + integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== + +"@esbuild/linux-ia32@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" + integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== + +"@esbuild/linux-loong64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" + integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== + +"@esbuild/linux-mips64el@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" + integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== + +"@esbuild/linux-ppc64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" + integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== + +"@esbuild/linux-riscv64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" + integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== + +"@esbuild/linux-s390x@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" + integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== + +"@esbuild/linux-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" + integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== + +"@esbuild/netbsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" + integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== + +"@esbuild/openbsd-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" + integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== + +"@esbuild/openbsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" + integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== + +"@esbuild/sunos-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" + integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== + +"@esbuild/win32-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" + integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== + +"@esbuild/win32-ia32@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" + integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== + +"@esbuild/win32-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" + integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -200,19 +200,24 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.2.tgz#d8bae93ac8b815b2bd7a98078cf91e2724ef11e5" integrity sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw== -"@graphiql/plugin-explorer@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@graphiql/plugin-explorer/-/plugin-explorer-2.0.0.tgz#d6869cba019ae6fac006ce61ae3470d8c8a83938" - integrity sha512-p6KIpNtHrvFRJJFT3/U4CQxfd/cvj5Z63hvruMsi0GuKmU9js6yRIG1l1FOZGHcWqoS5nd9Bsg2C78S2nC3faQ== +"@fontsource-variable/plus-jakarta-sans@^5.0.22": + version "5.0.22" + resolved "https://registry.yarnpkg.com/@fontsource-variable/plus-jakarta-sans/-/plus-jakarta-sans-5.0.22.tgz#9f96b5f5381b93a422d35d89b0bc7871c4c06d60" + integrity sha512-YDV+FVn+icpvB004N3R973K/0W75FRPaEmeOoZ5nBuPAN8hizhUfTHpWpEv9FUr3C8FkPFwzrVl3gvdkzDdBxw== + +"@graphiql/plugin-explorer@3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@graphiql/plugin-explorer/-/plugin-explorer-3.2.2.tgz#973d6015b6db15041902e95c3e4b746473313eb6" + integrity sha512-zeBZJUAX9h+3nXw3GLHZoxi6wwYqDBU2L/xeSXSTagJhcLNW1Hwb/t/wb296hQ1x/9nyGySsTA0DQiiWV3rCBQ== dependencies: graphiql-explorer "^0.9.0" -"@graphiql/react@^0.21.0": - version "0.21.0" - resolved "https://registry.yarnpkg.com/@graphiql/react/-/react-0.21.0.tgz#8e8142bbb4bcea16bbe6c0ee9e404afd68057fa3" - integrity sha512-UlXzG78HC5+CgQYXw0jVZPoZX0Uh2jPIrqLBIxAdAWMZsmcHMZHAujZtION1pbIrv22cWxP95W+8RpDIHijYow== +"@graphiql/react@^0.26.2": + version "0.26.2" + resolved "https://registry.yarnpkg.com/@graphiql/react/-/react-0.26.2.tgz#3a1a01a569b624de8141c53eed24a7db9a523668" + integrity sha512-aO4GWf/kJmqrjO+PORT/NPxwGvPGlg+mwye1v8xAlf8Q9j7P0hVtVBawYaSLUCCfJ/QnH7JAP+0VRamyooZZCw== dependencies: - "@graphiql/toolkit" "^0.9.1" + "@graphiql/toolkit" "^0.11.0" "@headlessui/react" "^1.7.15" "@radix-ui/react-dialog" "^1.0.4" "@radix-ui/react-dropdown-menu" "^2.0.5" @@ -221,17 +226,18 @@ "@types/codemirror" "^5.60.8" clsx "^1.2.1" codemirror "^5.65.3" - codemirror-graphql "^2.0.11" + codemirror-graphql "^2.1.1" copy-to-clipboard "^3.2.0" framer-motion "^6.5.1" - graphql-language-service "^5.2.0" + get-value "^3.0.1" + graphql-language-service "^5.3.0" markdown-it "^14.1.0" set-value "^4.1.0" -"@graphiql/toolkit@^0.9.1": - version "0.9.1" - resolved "https://registry.yarnpkg.com/@graphiql/toolkit/-/toolkit-0.9.1.tgz#44bfa83aed79c8c18affac49efbb81f8e87bade3" - integrity sha512-LVt9pdk0830so50ZnU2Znb2rclcoWznG8r8asqAENzV0U1FM1kuY0sdPpc/rBc9MmmNgnB6A+WZzDhq6dbhTHA== +"@graphiql/toolkit@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@graphiql/toolkit/-/toolkit-0.11.0.tgz#01a3e9dce0009e9138096da39bbf2985daac17d5" + integrity sha512-VqqQrvkMwgbGhj7J5907yfuAy5B1OCgOTIPi7gtRneG1jYmnqvSxi8Yrmu0B8G8fZxkxKVsYi8dE8EtsOBrTGQ== dependencies: "@n1ru4l/push-pull-async-iterable-iterator" "^3.1.0" meros "^1.1.4" @@ -347,6 +353,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nolyfill/is-core-module@1.0.39": + version "1.0.39" + resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" + integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== + "@orchidjs/sifter@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@orchidjs/sifter/-/sifter-1.0.3.tgz#43f42519472282eb632d0a1589184f044d64129b" @@ -659,6 +670,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + "@tabler/core@1.0.0-beta20": version "1.0.0-beta20" resolved "https://registry.yarnpkg.com/@tabler/core/-/core-1.0.0-beta20.tgz#3fcc3b5634ca89a413ba9c077df7bdfc531ab93c" @@ -881,7 +897,7 @@ array-buffer-byte-length@^1.0.1: call-bind "^1.0.5" is-array-buffer "^3.0.4" -array-includes@^3.1.7: +array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -898,7 +914,7 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlastindex@^1.2.3: +array.prototype.findlastindex@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== @@ -1051,13 +1067,13 @@ clsx@^1.2.1: resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== -codemirror-graphql@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/codemirror-graphql/-/codemirror-graphql-2.0.11.tgz#2581266f72d91e4d6af90b478dbf6fe2bf1e170d" - integrity sha512-j1QDDXKVkpin2VsyS0ke2nAhKal6/N1UJtgnBGrPe3gj9ZSP6/K8Xytft94k0xW6giIU/JhZjvW0GwwERNzbFA== +codemirror-graphql@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/codemirror-graphql/-/codemirror-graphql-2.1.1.tgz#cbf5f0c8d2143b70cd832a08a6d827148d6e9a1d" + integrity sha512-qVNd+H4OqkeBLDztB5bYllAmToxmZASOoELgbf+csNcoovIHKqSB/eppkzWI5jdQGd8bvLK1lTePfqXsCBFryw== dependencies: "@types/codemirror" "^0.0.90" - graphql-language-service "5.2.0" + graphql-language-service "5.3.0" codemirror@^5.65.3: version "5.65.16" @@ -1124,6 +1140,11 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" +debounce-promise@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/debounce-promise/-/debounce-promise-3.1.2.tgz#320fb8c7d15a344455cd33cee5ab63530b6dc7c5" + integrity sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg== + debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -1131,7 +1152,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.3.1, debug@^4.3.2: +debug@^4.3.1, debug@^4.3.2, debug@^4.3.5: version "4.3.6" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== @@ -1204,10 +1225,10 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -enhanced-resolve@^5.12.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== +enhanced-resolve@^5.15.0: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -1322,35 +1343,35 @@ esbuild-sass-plugin@^3.3.1: safe-identifier "^0.4.2" sass "^1.71.1" -esbuild@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.0.tgz#de06002d48424d9fdb7eb52dbe8e95927f852599" - integrity sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA== +esbuild@^0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.1.tgz#40fdc3f9265ec0beae6f59824ade1bd3d3d2dab8" + integrity sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg== optionalDependencies: - "@esbuild/aix-ppc64" "0.23.0" - "@esbuild/android-arm" "0.23.0" - "@esbuild/android-arm64" "0.23.0" - "@esbuild/android-x64" "0.23.0" - "@esbuild/darwin-arm64" "0.23.0" - "@esbuild/darwin-x64" "0.23.0" - "@esbuild/freebsd-arm64" "0.23.0" - "@esbuild/freebsd-x64" "0.23.0" - "@esbuild/linux-arm" "0.23.0" - "@esbuild/linux-arm64" "0.23.0" - "@esbuild/linux-ia32" "0.23.0" - "@esbuild/linux-loong64" "0.23.0" - "@esbuild/linux-mips64el" "0.23.0" - "@esbuild/linux-ppc64" "0.23.0" - "@esbuild/linux-riscv64" "0.23.0" - "@esbuild/linux-s390x" "0.23.0" - "@esbuild/linux-x64" "0.23.0" - "@esbuild/netbsd-x64" "0.23.0" - "@esbuild/openbsd-arm64" "0.23.0" - "@esbuild/openbsd-x64" "0.23.0" - "@esbuild/sunos-x64" "0.23.0" - "@esbuild/win32-arm64" "0.23.0" - "@esbuild/win32-ia32" "0.23.0" - "@esbuild/win32-x64" "0.23.0" + "@esbuild/aix-ppc64" "0.23.1" + "@esbuild/android-arm" "0.23.1" + "@esbuild/android-arm64" "0.23.1" + "@esbuild/android-x64" "0.23.1" + "@esbuild/darwin-arm64" "0.23.1" + "@esbuild/darwin-x64" "0.23.1" + "@esbuild/freebsd-arm64" "0.23.1" + "@esbuild/freebsd-x64" "0.23.1" + "@esbuild/linux-arm" "0.23.1" + "@esbuild/linux-arm64" "0.23.1" + "@esbuild/linux-ia32" "0.23.1" + "@esbuild/linux-loong64" "0.23.1" + "@esbuild/linux-mips64el" "0.23.1" + "@esbuild/linux-ppc64" "0.23.1" + "@esbuild/linux-riscv64" "0.23.1" + "@esbuild/linux-s390x" "0.23.1" + "@esbuild/linux-x64" "0.23.1" + "@esbuild/netbsd-x64" "0.23.1" + "@esbuild/openbsd-arm64" "0.23.1" + "@esbuild/openbsd-x64" "0.23.1" + "@esbuild/sunos-x64" "0.23.1" + "@esbuild/win32-arm64" "0.23.1" + "@esbuild/win32-ia32" "0.23.1" + "@esbuild/win32-x64" "0.23.1" escape-string-regexp@^4.0.0: version "4.0.0" @@ -1371,46 +1392,48 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-import-resolver-typescript@^3.5.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" - integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - fast-glob "^3.3.1" - get-tsconfig "^4.5.0" - is-core-module "^2.11.0" +eslint-import-resolver-typescript@^3.6.3: + version "3.6.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz#bb8e388f6afc0f940ce5d2c5fd4a3d147f038d9e" + integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA== + dependencies: + "@nolyfill/is-core-module" "1.0.39" + debug "^4.3.5" + enhanced-resolve "^5.15.0" + eslint-module-utils "^2.8.1" + fast-glob "^3.3.2" + get-tsconfig "^4.7.5" + is-bun-module "^1.0.2" is-glob "^4.0.3" -eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== +eslint-module-utils@^2.8.1, eslint-module-utils@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.9.0.tgz#95d4ac038a68cd3f63482659dffe0883900eb342" + integrity sha512-McVbYmwA3NEKwRQY5g4aWMdcZE5xZxV8i8l7CqJSrameuGSQJtSWaL/LxTEzSKKaCcOhlpDR8XEfYXWPrdo/ZQ== dependencies: debug "^3.2.7" -eslint-plugin-import@^2.26.0: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== +eslint-plugin-import@^2.30.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449" + integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw== dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" array.prototype.flat "^1.3.2" array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" + eslint-module-utils "^2.9.0" + hasown "^2.0.2" + is-core-module "^2.15.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" semver "^6.3.1" tsconfig-paths "^3.15.0" @@ -1522,7 +1545,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.9, fast-glob@^3.3.1: +fast-glob@^3.2.9, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -1679,13 +1702,20 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" -get-tsconfig@^4.5.0: - version "4.7.3" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" - integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== +get-tsconfig@^4.7.5: + version "4.8.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.0.tgz#125dc13a316f61650a12b20c97c11b8fd996fedd" + integrity sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw== dependencies: resolve-pkg-maps "^1.0.0" +get-value@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-3.0.1.tgz#5efd2a157f1d6a516d7524e124ac52d0a39ef5a8" + integrity sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA== + dependencies: + isobject "^3.0.1" + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -1768,28 +1798,26 @@ graphiql-explorer@^0.9.0: resolved "https://registry.yarnpkg.com/graphiql-explorer/-/graphiql-explorer-0.9.0.tgz#25f6b990bfc3e04e88c0cf419e28d12abe2c4fbe" integrity sha512-fZC/wsuatqiQDO2otchxriFO0LaWIo/ovF/CQJ1yOudmY0P7pzDiP+l9CEHUiWbizk3e99x6DQG4XG1VxA+d6A== -graphiql@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/graphiql/-/graphiql-3.2.0.tgz#8a963da5a916351580a05fab633b8bff620e7905" - integrity sha512-HHZ9j47IVUdUhdEdOkwD/U3kMGxCGZocEf9rk1aou5lInK9vJRbjlDW4BbG9CvA5fNoe7DevRr72tv0ubvjjPA== +graphiql@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/graphiql/-/graphiql-3.7.1.tgz#9fb727e15db443b22823389d13dc5d98c3ce0ff9" + integrity sha512-kmummedOrFYs0BI5evrVY0AerOYlaMt/Sc/e+Sta1x8X6vEMYWNeUUz/kKF2NQT5BcsR3FnNdFt1Gk2QMgueGQ== dependencies: - "@graphiql/react" "^0.21.0" - "@graphiql/toolkit" "^0.9.1" - graphql-language-service "^5.2.0" - markdown-it "^14.1.0" + "@graphiql/react" "^0.26.2" -graphql-language-service@5.2.0, graphql-language-service@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/graphql-language-service/-/graphql-language-service-5.2.0.tgz#cfe22b2e911292d724451580632c67d908e5606a" - integrity sha512-o/ZgTS0pBxWm3hSF4+6GwiV1//DxzoLWEbS38+jqpzzy1d/QXBidwQuVYTOksclbtOJZ3KR/tZ8fi/tI6VpVMg== +graphql-language-service@5.3.0, graphql-language-service@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/graphql-language-service/-/graphql-language-service-5.3.0.tgz#e99da78b129e30bc6e2a3fd897f7df4ab23b2fee" + integrity sha512-gCQIIy7lM9CB1KPLEb+DNZLczA9zuTLEOJE2hEQZTFYInogdmMDRa6RAkvM4LL0LcgcS+3uPs6KtHlcjCqRbUg== dependencies: + debounce-promise "^3.1.2" nullthrows "^1.0.0" vscode-languageserver-types "^3.17.1" -graphql@16.8.1: - version "16.8.1" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" - integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== +graphql@16.9.0: + version "16.9.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.9.0.tgz#1c310e63f16a49ce1fbb230bd0a000e99f6f115f" + integrity sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw== gridstack@10.3.1: version "10.3.1" @@ -1929,18 +1957,32 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-bun-module@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.1.0.tgz#a66b9830869437f6cdad440ba49ab6e4dc837269" + integrity sha512-4mTAVPlrXpaN3jtF0lsnPCMGnq4+qZjVIKq0HCpfcqf8OC1SM5oATCIAPM5V5FN05qp2NNnFndphmdZS9CV3hA== + dependencies: + semver "^7.6.3" + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: +is-core-module@^2.13.0: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" +is-core-module@^2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== + dependencies: + hasown "^2.0.2" + is-data-view@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" @@ -2238,7 +2280,7 @@ object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -object.fromentries@^2.0.7: +object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -2248,7 +2290,7 @@ object.fromentries@^2.0.7: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.groupby@^1.0.1: +object.groupby@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== @@ -2257,7 +2299,7 @@ object.groupby@^1.0.1: define-properties "^1.2.1" es-abstract "^1.23.2" -object.values@^1.1.7: +object.values@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== @@ -2545,7 +2587,7 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.6.0: +semver@^7.6.0, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -2806,11 +2848,6 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typeface-inter@3.18.1: - version "3.18.1" - resolved "https://registry.yarnpkg.com/typeface-inter/-/typeface-inter-3.18.1.tgz#24cccdf29923f318589783997be20a662cd3ab9c" - integrity sha512-c+TBanYFCvmg3j5vPk+zxK4ocMZbPxMEmjnwG7rPQoV87xvQ6b07VbAOC0Va0XBbbZCGw6cWNeFuLeg1YQru3Q== - typeface-roboto-mono@1.1.13: version "1.1.13" resolved "https://registry.yarnpkg.com/typeface-roboto-mono/-/typeface-roboto-mono-1.1.13.tgz#2af8662db8f9119c00efd55d6ed8877d2a69ec94" diff --git a/netbox/release.yaml b/netbox/release.yaml new file mode 100644 index 0000000000..4d0f278f4b --- /dev/null +++ b/netbox/release.yaml @@ -0,0 +1,3 @@ +version: "4.1.0" +edition: "Community" +published: "2024-09-03" diff --git a/netbox/templates/500.html b/netbox/templates/500.html index b26b61973d..4805e9240a 100644 --- a/netbox/templates/500.html +++ b/netbox/templates/500.html @@ -14,9 +14,9 @@
-
+

{% trans "Server Error" %} -

+

{% block message %}

diff --git a/netbox/templates/account/base.html b/netbox/templates/account/base.html index 51076f7811..01d288ea66 100644 --- a/netbox/templates/account/base.html +++ b/netbox/templates/account/base.html @@ -2,24 +2,29 @@ {% load i18n %} {% block tabs %} -