nautobot 2.4.21__py3-none-any.whl → 3.0.0a3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of nautobot might be problematic. Click here for more details.
- nautobot/apps/choices.py +2 -2
- nautobot/apps/filters.py +9 -9
- nautobot/apps/forms.py +2 -0
- nautobot/apps/models.py +7 -2
- nautobot/apps/ui.py +20 -1
- nautobot/apps/utils.py +2 -3
- nautobot/apps/views.py +7 -1
- nautobot/circuits/filters.py +8 -23
- nautobot/circuits/navigation.py +3 -1
- nautobot/circuits/templates/circuits/circuit_create.html +9 -9
- nautobot/circuits/templates/circuits/circuit_terminations_swap.html +2 -2
- nautobot/circuits/templates/circuits/circuittermination_create.html +24 -33
- nautobot/circuits/templates/circuits/inc/circuit_termination.html +10 -10
- nautobot/circuits/templates/circuits/inc/circuit_termination_cable_fragment.html +13 -13
- nautobot/circuits/templates/circuits/inc/circuit_termination_header_extra_content.html +6 -6
- nautobot/circuits/templates/circuits/inc/circuit_termination_speed_fragment.html +3 -3
- nautobot/circuits/templates/circuits/inc/speed_widget.html +13 -13
- nautobot/circuits/templates/circuits/provider_create.html +9 -9
- nautobot/circuits/tests/integration/test_circuit.py +19 -19
- nautobot/circuits/tests/integration/test_circuits_bulk_operations.py +3 -0
- nautobot/circuits/tests/integration/test_relationships.py +4 -12
- nautobot/circuits/views.py +0 -2
- nautobot/cloud/filters.py +1 -13
- nautobot/cloud/navigation.py +3 -1
- nautobot/cloud/templates/cloud/cloudnetwork_update.html +9 -9
- nautobot/cloud/templates/cloud/cloudservice_update.html +6 -6
- nautobot/core/api/fields.py +30 -2
- nautobot/core/api/schema.py +1 -1
- nautobot/core/api/serializers.py +9 -2
- nautobot/core/api/urls.py +2 -0
- nautobot/core/api/views.py +58 -37
- nautobot/core/apps/__init__.py +6 -12
- nautobot/core/branching.py +83 -0
- nautobot/core/celery/__init__.py +11 -6
- nautobot/core/celery/backends.py +2 -0
- nautobot/core/celery/encoders.py +7 -0
- nautobot/core/celery/task.py +44 -0
- nautobot/core/checks.py +60 -0
- nautobot/core/cli/bootstrap_v3_to_v5.py +776 -0
- nautobot/core/constants.py +9 -0
- nautobot/core/context_processors.py +84 -0
- nautobot/core/filters.py +131 -2
- nautobot/core/forms/__init__.py +4 -2
- nautobot/core/forms/fields.py +10 -8
- nautobot/core/forms/forms.py +21 -9
- nautobot/core/forms/search.py +0 -15
- nautobot/core/forms/widgets.py +3 -2
- nautobot/core/graphql/__init__.py +8 -26
- nautobot/core/graphql/generators.py +16 -6
- nautobot/core/graphql/schema.py +1 -1
- nautobot/core/graphql/schema_init.py +1 -2
- nautobot/core/graphql/utils.py +7 -9
- nautobot/core/jobs/__init__.py +158 -0
- nautobot/core/management/commands/generate_test_data.py +28 -9
- nautobot/core/models/__init__.py +17 -2
- nautobot/core/models/fields.py +3 -2
- nautobot/core/models/generics.py +9 -1
- nautobot/core/models/name_color_content_types.py +1 -1
- nautobot/core/models/ordering.py +7 -5
- nautobot/core/models/querysets.py +77 -2
- nautobot/core/models/tree_queries.py +6 -4
- nautobot/core/settings.py +30 -16
- nautobot/core/settings.yaml +13 -7
- nautobot/core/tables.py +114 -44
- nautobot/core/templates/403.html +1 -1
- nautobot/core/templates/403_csrf_failure.html +1 -1
- nautobot/core/templates/404.html +1 -1
- nautobot/core/templates/40x.html +8 -8
- nautobot/core/templates/500.html +10 -10
- nautobot/core/templates/about.html +13 -12
- nautobot/core/templates/admin/actions.html +1 -1
- nautobot/core/templates/admin/app_index.html +3 -3
- nautobot/core/templates/admin/base.html +45 -52
- nautobot/core/templates/admin/base_site.html +0 -9
- nautobot/core/templates/admin/change_form.html +5 -5
- nautobot/core/templates/admin/change_list.html +8 -12
- nautobot/core/templates/admin/change_list_results.html +3 -3
- nautobot/core/templates/admin/config/config.html +24 -24
- nautobot/core/templates/admin/delete_confirmation.html +5 -5
- nautobot/core/templates/admin/edit_inline/stacked.html +5 -5
- nautobot/core/templates/admin/edit_inline/tabular.html +3 -3
- nautobot/core/templates/admin/includes/fieldset.html +15 -15
- nautobot/core/templates/admin/index.html +8 -8
- nautobot/core/templates/admin/submit_line.html +5 -5
- nautobot/core/templates/base_django.html +36 -32
- nautobot/core/templates/buttons/add.html +1 -1
- nautobot/core/templates/buttons/consolidated_detail_view_action_buttons.html +2 -2
- nautobot/core/templates/buttons/export.html +17 -18
- nautobot/core/templates/buttons/job_import.html +2 -2
- nautobot/core/templates/components/breadcrumbs.html +19 -17
- nautobot/core/templates/components/button/dropdown.html +7 -5
- nautobot/core/templates/components/echarts.html +2 -0
- nautobot/core/templates/components/layout/one_over_two.html +3 -3
- nautobot/core/templates/components/layout/two_over_one.html +3 -3
- nautobot/core/templates/components/panel/body_content_data_table.html +2 -2
- nautobot/core/templates/components/panel/body_content_tags.html +1 -1
- nautobot/core/templates/components/panel/body_wrapper_generic.html +4 -2
- nautobot/core/templates/components/panel/body_wrapper_generic_table.html +1 -1
- nautobot/core/templates/components/panel/body_wrapper_key_value_table.html +5 -3
- nautobot/core/templates/components/panel/body_wrapper_table.html +4 -2
- nautobot/core/templates/components/panel/footer_contacts_table.html +4 -4
- nautobot/core/templates/components/panel/footer_content_table.html +3 -3
- nautobot/core/templates/components/panel/grouping_toggle.html +12 -11
- nautobot/core/templates/components/panel/header_extra_content_table.html +2 -11
- nautobot/core/templates/components/panel/panel.html +6 -3
- nautobot/core/templates/components/panel/stats_panel_body.html +9 -7
- nautobot/core/templates/components/tab/content_wrapper.html +29 -1
- nautobot/core/templates/components/tab/label_wrapper.html +10 -2
- nautobot/core/templates/components/tab/label_wrapper_distinct_view.html +11 -4
- nautobot/core/templates/echarts/echarts.html +20 -0
- nautobot/core/templates/exceptions/import_error.html +2 -2
- nautobot/core/templates/exceptions/permission_error.html +1 -1
- nautobot/core/templates/exceptions/programming_error.html +2 -2
- nautobot/core/templates/generic/object_bulk_add_component.html +29 -20
- nautobot/core/templates/generic/object_bulk_create.html +87 -75
- nautobot/core/templates/generic/object_bulk_destroy.html +35 -37
- nautobot/core/templates/generic/object_bulk_remove.html +30 -26
- nautobot/core/templates/generic/object_bulk_rename.html +53 -40
- nautobot/core/templates/generic/object_bulk_update.html +36 -29
- nautobot/core/templates/generic/object_create.html +40 -27
- nautobot/core/templates/generic/object_import.html +36 -24
- nautobot/core/templates/generic/object_list.html +279 -215
- nautobot/core/templates/generic/object_notes.html +21 -11
- nautobot/core/templates/generic/object_retrieve.html +161 -213
- nautobot/core/templates/graphene/graphiql.html +113 -60
- nautobot/core/templates/home.html +164 -87
- nautobot/core/templates/import_success.html +3 -2
- nautobot/core/templates/inc/ajax_loader.html +1 -1
- nautobot/core/templates/inc/computed_fields/panel_data.html +25 -13
- nautobot/core/templates/inc/created_updated.html +12 -7
- nautobot/core/templates/inc/custom_fields/panel_data.html +28 -16
- nautobot/core/templates/inc/custom_fields_panel.html +3 -3
- nautobot/core/templates/inc/dynamic_groups_panel.html +3 -3
- nautobot/core/templates/inc/extras_features_edit_form_fields.html +15 -15
- nautobot/core/templates/inc/footer.html +90 -40
- nautobot/core/templates/inc/form_static_field.html +6 -0
- nautobot/core/templates/inc/header.html +75 -0
- nautobot/core/templates/inc/header_banners.html +17 -0
- nautobot/core/templates/inc/header_messages.html +6 -0
- nautobot/core/templates/inc/image_attachments.html +9 -9
- nautobot/core/templates/inc/javascript.html +7 -24
- nautobot/core/templates/inc/media.html +4 -29
- nautobot/core/templates/inc/modal.html +2 -2
- nautobot/core/templates/inc/nav_favorites.html +27 -0
- nautobot/core/templates/inc/nav_menu.html +150 -108
- nautobot/core/templates/inc/object_details_advanced_panel.html +84 -71
- nautobot/core/templates/inc/page_title.html +23 -0
- nautobot/core/templates/inc/paginator.html +39 -28
- nautobot/core/templates/inc/relationships/panel_override.html +3 -3
- nautobot/core/templates/inc/relationships_panel.html +3 -3
- nautobot/core/templates/inc/relationships_table_rows.html +1 -1
- nautobot/core/templates/inc/search_panel.html +22 -16
- nautobot/core/templates/inc/table.html +61 -36
- nautobot/core/templates/inc/tenancy_form_panel.html +3 -3
- nautobot/core/templates/login.html +17 -59
- nautobot/core/templates/modals/modal_theme.html +12 -23
- nautobot/core/templates/nautobot_config.py.j2 +6 -5
- nautobot/core/templates/panel_table.html +8 -12
- nautobot/core/templates/redoc_ui.html +80 -0
- nautobot/core/templates/rest_framework/api.html +43 -21
- nautobot/core/templates/search.html +12 -13
- nautobot/core/templates/swagger_ui.html +19 -4
- nautobot/core/templates/system_jobs/import_objects.html +70 -58
- nautobot/core/templates/template.css +0 -6
- nautobot/core/templates/utilities/comment_form.html +34 -0
- nautobot/core/templates/utilities/confirmation_form.html +17 -9
- nautobot/core/templates/utilities/obj_table.html +19 -11
- nautobot/core/templates/utilities/render_field.html +27 -21
- nautobot/core/templates/utilities/render_jinja2.html +22 -25
- nautobot/core/templates/utilities/templatetags/advanced_filter_indicator.html +8 -0
- nautobot/core/templates/utilities/templatetags/badge.html +1 -1
- nautobot/core/templates/utilities/templatetags/dynamic_group_assignment_modal.html +2 -3
- nautobot/core/templates/utilities/templatetags/filter_form_drawer.html +482 -0
- nautobot/core/templates/utilities/templatetags/modal_form_as_dialog.html +14 -18
- nautobot/core/templates/utilities/templatetags/saved_view_modal.html +11 -11
- nautobot/core/templates/utilities/templatetags/table_config_form.html +51 -24
- nautobot/core/templates/utilities/templatetags/tag.html +1 -1
- nautobot/core/templates/utilities/templatetags/utilization_graph.html +3 -3
- nautobot/core/templates/utilities/theme_preview.html +829 -566
- nautobot/core/templates/utilities/worker_status.html +42 -41
- nautobot/core/templates/widgets/selectwithdisabled_option.html +3 -1
- nautobot/core/templates/widgets/sluginput.html +2 -2
- nautobot/core/templatetags/buttons.py +38 -40
- nautobot/core/templatetags/helpers.py +105 -28
- nautobot/core/templatetags/ui_framework.py +17 -0
- nautobot/core/testing/api.py +76 -12
- nautobot/core/testing/filters.py +11 -27
- nautobot/core/testing/integration.py +128 -10
- nautobot/core/testing/mixins.py +7 -4
- nautobot/core/testing/utils.py +28 -5
- nautobot/core/testing/views.py +125 -27
- nautobot/core/tests/integration/test_app_home.py +39 -35
- nautobot/core/tests/integration/test_app_navbar.py +60 -67
- nautobot/core/tests/integration/test_filters.py +123 -55
- nautobot/core/tests/integration/test_general_functionality.py +1 -1
- nautobot/core/tests/integration/test_home.py +10 -18
- nautobot/core/tests/integration/test_import_objects_ui.py +2 -9
- nautobot/core/tests/integration/test_navbar.py +41 -16
- nautobot/core/tests/integration/test_swagger.py +1 -7
- nautobot/core/tests/integration/test_theme.py +3 -0
- nautobot/core/tests/nautobot_config_without_example_apps.py +4 -0
- nautobot/core/tests/runner.py +6 -1
- nautobot/core/tests/test_api.py +5 -3
- nautobot/core/tests/test_branching.py +154 -0
- nautobot/core/tests/test_breadcrumbs.py +7 -8
- nautobot/core/tests/test_checks.py +28 -0
- nautobot/core/tests/test_commands.py +0 -41
- nautobot/core/tests/test_config.py +2 -1
- nautobot/core/tests/test_csv.py +4 -7
- nautobot/core/tests/test_filters.py +326 -318
- nautobot/core/tests/test_forms.py +19 -30
- nautobot/core/tests/test_graphql.py +67 -57
- nautobot/core/tests/test_models.py +1 -1
- nautobot/core/tests/test_nautobot_server.py +2 -0
- nautobot/core/tests/test_navigations.py +78 -10
- nautobot/core/tests/test_tables.py +3 -1
- nautobot/core/tests/test_templatetags_helpers.py +61 -21
- nautobot/core/tests/test_templatetags_ui_framework.py +36 -18
- nautobot/core/tests/test_ui.py +207 -2
- nautobot/core/tests/test_utils.py +147 -2
- nautobot/core/tests/test_views.py +201 -64
- nautobot/core/tests/test_views_utils.py +1 -1
- nautobot/core/ui/breadcrumbs.py +2 -12
- nautobot/core/ui/choices.py +190 -0
- nautobot/core/ui/constants.py +86 -0
- nautobot/core/ui/echarts.py +474 -0
- nautobot/core/ui/nav.py +5 -1
- nautobot/core/ui/object_detail.py +180 -16
- nautobot/core/urls.py +13 -1
- nautobot/core/utils/cache.py +71 -0
- nautobot/core/utils/data.py +8 -5
- nautobot/core/utils/filtering.py +8 -2
- nautobot/core/utils/git.py +3 -3
- nautobot/core/utils/lookup.py +87 -13
- nautobot/core/utils/migrations.py +22 -0
- nautobot/core/utils/module_loading.py +26 -0
- nautobot/core/utils/permissions.py +9 -5
- nautobot/core/views/__init__.py +114 -63
- nautobot/core/views/generic.py +34 -27
- nautobot/core/views/mixins.py +49 -27
- nautobot/core/views/renderers.py +3 -5
- nautobot/core/views/utils.py +10 -5
- nautobot/core/views/viewsets.py +2 -1
- nautobot/data_validation/__init__.py +0 -0
- nautobot/data_validation/api/__init__.py +1 -0
- nautobot/data_validation/api/serializers.py +80 -0
- nautobot/data_validation/api/urls.py +20 -0
- nautobot/data_validation/api/views.py +44 -0
- nautobot/data_validation/apps.py +18 -0
- nautobot/data_validation/custom_validators.py +330 -0
- nautobot/data_validation/filters.py +133 -0
- nautobot/data_validation/form_mixin.py +25 -0
- nautobot/data_validation/forms.py +342 -0
- nautobot/data_validation/migrations/0001_initial.py +224 -0
- nautobot/data_validation/migrations/0002_data_migration_from_app.py +324 -0
- nautobot/data_validation/migrations/__init__.py +0 -0
- nautobot/data_validation/models.py +361 -0
- nautobot/data_validation/navigation.py +74 -0
- nautobot/data_validation/signals.py +30 -0
- nautobot/data_validation/tables.py +259 -0
- nautobot/data_validation/templates/data_validation/datacompliance_retrieve.html +1 -0
- nautobot/data_validation/templates/data_validation/datacompliance_tab.html +11 -0
- nautobot/data_validation/templates/data_validation/device_constraints.html +61 -0
- nautobot/data_validation/tests/__init__.py +20 -0
- nautobot/data_validation/tests/migrations/__init__.py +0 -0
- nautobot/data_validation/tests/migrations/test_migrations.py +489 -0
- nautobot/data_validation/tests/test_api.py +238 -0
- nautobot/data_validation/tests/test_custom_validators.py +423 -0
- nautobot/data_validation/tests/test_data_compliance_rules.py +85 -0
- nautobot/data_validation/tests/test_filters.py +240 -0
- nautobot/data_validation/tests/test_form_mixin.py +115 -0
- nautobot/data_validation/tests/test_models.py +393 -0
- nautobot/data_validation/tests/test_views.py +435 -0
- nautobot/data_validation/urls.py +21 -0
- nautobot/data_validation/views.py +227 -0
- nautobot/dcim/api/serializers.py +10 -13
- nautobot/dcim/api/urls.py +2 -0
- nautobot/dcim/api/views.py +7 -0
- nautobot/dcim/apps.py +4 -0
- nautobot/dcim/choices.py +16 -0
- nautobot/dcim/custom_validators.py +84 -0
- nautobot/dcim/filter_mixins.py +353 -4
- nautobot/dcim/{filters/__init__.py → filters.py} +70 -157
- nautobot/dcim/forms.py +12 -6
- nautobot/dcim/graphql/types.py +1 -0
- nautobot/dcim/migrations/0075_add_deviceclusterassignment.py +52 -0
- nautobot/dcim/migrations/0076_device_cluster_to_clusters_data_migration.py +40 -0
- nautobot/dcim/migrations/0077_remove_device_cluster.py +14 -0
- nautobot/dcim/migrations/0078_remove_device_location_tenant_name_uniqueness.py +16 -0
- nautobot/dcim/migrations/0079_device_name_data_migration.py +59 -0
- nautobot/dcim/models/__init__.py +2 -0
- nautobot/dcim/models/device_components.py +3 -1
- nautobot/dcim/models/devices.py +115 -51
- nautobot/dcim/navigation.py +7 -3
- nautobot/dcim/querysets.py +6 -0
- nautobot/dcim/signals.py +19 -0
- nautobot/dcim/tables/devices.py +9 -5
- nautobot/dcim/tables/template_code.py +191 -102
- nautobot/dcim/templates/dcim/cable.html +1 -1
- nautobot/dcim/templates/dcim/cable_connect.html +62 -146
- nautobot/dcim/templates/dcim/cable_retrieve.html +10 -10
- nautobot/dcim/templates/dcim/cable_trace.html +15 -17
- nautobot/dcim/templates/dcim/console_port_connection_list.html +2 -2
- nautobot/dcim/templates/dcim/consoleport.html +18 -17
- nautobot/dcim/templates/dcim/consoleserverport.html +18 -17
- nautobot/dcim/templates/dcim/controller_create.html +12 -8
- nautobot/dcim/templates/dcim/controller_wirelessnetworks.html +1 -1
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +6 -6
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +1 -1
- nautobot/dcim/templates/dcim/device/config.html +17 -19
- nautobot/dcim/templates/dcim/device/lldp_neighbors.html +4 -4
- nautobot/dcim/templates/dcim/device/status.html +20 -20
- nautobot/dcim/templates/dcim/device_component_add.html +24 -15
- nautobot/dcim/templates/dcim/device_create.html +120 -120
- nautobot/dcim/templates/dcim/device_list.html +75 -12
- nautobot/dcim/templates/dcim/devicebay.html +7 -7
- nautobot/dcim/templates/dcim/devicebay_populate.html +29 -23
- nautobot/dcim/templates/dcim/deviceredundancygroup_create.html +6 -6
- nautobot/dcim/templates/dcim/devicetype.html +1 -1
- nautobot/dcim/templates/dcim/devicetype_component_add.html +25 -19
- nautobot/dcim/templates/dcim/devicetype_list.html +4 -4
- nautobot/dcim/templates/dcim/devicetype_update.html +9 -9
- nautobot/dcim/templates/dcim/footer_convert_to_contact_or_team_record.html +3 -3
- nautobot/dcim/templates/dcim/frontport.html +21 -20
- nautobot/dcim/templates/dcim/inc/cable_form.html +7 -7
- nautobot/dcim/templates/dcim/inc/cable_termination.html +1 -1
- nautobot/dcim/templates/dcim/inc/cable_toggle_buttons.html +18 -9
- nautobot/dcim/templates/dcim/inc/detail_softwareversion_softwareimagefile_rows.html +1 -1
- nautobot/dcim/templates/dcim/inc/device_interface_filter.html +1 -1
- nautobot/dcim/templates/dcim/inc/devicetype_component_table.html +10 -10
- nautobot/dcim/templates/dcim/inc/edit_form_softwareversion_js.html +2 -2
- nautobot/dcim/templates/dcim/inc/homepage_connections.html +2 -2
- nautobot/dcim/templates/dcim/inc/moduletype_component_table.html +10 -10
- nautobot/dcim/templates/dcim/inc/rack_elevation.html +2 -2
- nautobot/dcim/templates/dcim/interface.html +42 -22
- nautobot/dcim/templates/dcim/interface_connection_list.html +2 -2
- nautobot/dcim/templates/dcim/interface_edit.html +26 -11
- nautobot/dcim/templates/dcim/interfaceredundancygroupassociation_create.html +3 -3
- nautobot/dcim/templates/dcim/inventoryitem.html +3 -3
- nautobot/dcim/templates/dcim/inventoryitem_add.html +21 -10
- nautobot/dcim/templates/dcim/inventoryitem_bulk_delete.html +1 -1
- nautobot/dcim/templates/dcim/inventoryitem_edit.html +6 -4
- nautobot/dcim/templates/dcim/location.html +1 -1
- nautobot/dcim/templates/dcim/location_migrate_data_to_contact.html +24 -18
- nautobot/dcim/templates/dcim/location_retrieve.html +1 -1
- nautobot/dcim/templates/dcim/location_update.html +9 -9
- nautobot/dcim/templates/dcim/locationtype.html +0 -1
- nautobot/dcim/templates/dcim/module/base.html +67 -27
- nautobot/dcim/templates/dcim/module_consoleports.html +13 -15
- nautobot/dcim/templates/dcim/module_consoleserverports.html +13 -15
- nautobot/dcim/templates/dcim/module_frontports.html +13 -15
- nautobot/dcim/templates/dcim/module_interfaces.html +14 -16
- nautobot/dcim/templates/dcim/module_list.html +59 -10
- nautobot/dcim/templates/dcim/module_modulebays.html +12 -14
- nautobot/dcim/templates/dcim/module_poweroutlets.html +13 -15
- nautobot/dcim/templates/dcim/module_powerports.html +13 -15
- nautobot/dcim/templates/dcim/module_rearports.html +13 -15
- nautobot/dcim/templates/dcim/module_retrieve.html +3 -3
- nautobot/dcim/templates/dcim/module_update.html +15 -9
- nautobot/dcim/templates/dcim/modulebay_retrieve.html +0 -93
- nautobot/dcim/templates/dcim/modulefamily_retrieve.html +7 -7
- nautobot/dcim/templates/dcim/moduletype_list.html +2 -2
- nautobot/dcim/templates/dcim/moduletype_retrieve.html +74 -35
- nautobot/dcim/templates/dcim/platform_create.html +9 -9
- nautobot/dcim/templates/dcim/power_port_connection_list.html +3 -3
- nautobot/dcim/templates/dcim/powerfeed.html +1 -1
- nautobot/dcim/templates/dcim/powerfeed_edit.html +15 -15
- nautobot/dcim/templates/dcim/poweroutlet.html +13 -13
- nautobot/dcim/templates/dcim/powerpanel.html +1 -1
- nautobot/dcim/templates/dcim/powerport.html +17 -16
- nautobot/dcim/templates/dcim/rack.html +1 -1
- nautobot/dcim/templates/dcim/rack_elevation.html +2 -2
- nautobot/dcim/templates/dcim/rack_elevation_list.html +21 -9
- nautobot/dcim/templates/dcim/rack_retrieve.html +75 -57
- nautobot/dcim/templates/dcim/rack_update.html +14 -14
- nautobot/dcim/templates/dcim/rackreservation.html +1 -1
- nautobot/dcim/templates/dcim/rackreservation_edit.html +6 -6
- nautobot/dcim/templates/dcim/rearport.html +19 -18
- nautobot/dcim/templates/dcim/trace/cable.html +1 -1
- nautobot/dcim/templates/dcim/trace/circuit.html +1 -1
- nautobot/dcim/templates/dcim/trace/device.html +1 -1
- nautobot/dcim/templates/dcim/trace/powerpanel.html +1 -1
- nautobot/dcim/templates/dcim/trace/termination.html +1 -1
- nautobot/dcim/templates/dcim/virtualchassis.html +1 -1
- nautobot/dcim/templates/dcim/virtualchassis_add_member.html +25 -16
- nautobot/dcim/templates/dcim/virtualchassis_create.html +6 -6
- nautobot/dcim/templates/dcim/virtualchassis_edit.html +1 -1
- nautobot/dcim/templates/dcim/virtualchassis_retrieve.html +1 -1
- nautobot/dcim/templates/dcim/virtualchassis_update.html +36 -22
- nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +9 -9
- nautobot/dcim/tests/integration/test_controller.py +6 -6
- nautobot/dcim/tests/integration/test_controller_managed_device_group.py +7 -7
- nautobot/dcim/tests/integration/test_create_device.py +9 -9
- nautobot/dcim/tests/integration/test_device_bulk_operations.py +7 -2
- nautobot/dcim/tests/integration/test_fileinputpicker.py +5 -7
- nautobot/dcim/tests/integration/test_location_bulk_operations.py +2 -0
- nautobot/dcim/tests/integration/test_module_bay_position.py +4 -1
- nautobot/dcim/tests/test_api.py +86 -6
- nautobot/dcim/tests/test_custom_validators.py +229 -0
- nautobot/dcim/tests/test_filters.py +159 -110
- nautobot/dcim/tests/test_graphql.py +32 -36
- nautobot/dcim/tests/test_jobs.py +1 -1
- nautobot/dcim/tests/test_models.py +229 -1
- nautobot/dcim/tests/test_views.py +31 -20
- nautobot/dcim/utils.py +3 -3
- nautobot/dcim/views.py +77 -41
- nautobot/extras/api/serializers.py +83 -19
- nautobot/extras/api/urls.py +7 -0
- nautobot/extras/api/views.py +243 -140
- nautobot/extras/choices.py +34 -13
- nautobot/extras/constants.py +1 -1
- nautobot/extras/context_managers.py +26 -26
- nautobot/extras/datasources/git.py +22 -0
- nautobot/extras/datasources/registry.py +3 -0
- nautobot/extras/exceptions.py +5 -0
- nautobot/extras/factory.py +11 -1
- nautobot/extras/{filters/mixins.py → filter_mixins.py} +4 -3
- nautobot/extras/{filters/__init__.py → filters.py} +203 -58
- nautobot/extras/forms/base.py +2 -1
- nautobot/extras/forms/forms.py +225 -20
- nautobot/extras/forms/mixins.py +0 -41
- nautobot/extras/homepage.py +21 -2
- nautobot/extras/jobs.py +2 -8
- nautobot/extras/jobs_ui.py +2 -2
- nautobot/extras/management/__init__.py +9 -0
- nautobot/extras/managers.py +31 -22
- nautobot/extras/migrations/0126_approval_workflow_pre_check.py +58 -0
- nautobot/extras/migrations/0127_approval_workflow_models.py +266 -0
- nautobot/extras/migrations/0128_remove_job_approval_required_and_more.py +29 -0
- nautobot/extras/migrations/0129_jobresult_debug_log_count_jobresult_error_log_count_and_more.py +37 -0
- nautobot/extras/migrations/0130_jobresult_generate_log_entry_counts.py +42 -0
- nautobot/extras/models/__init__.py +14 -3
- nautobot/extras/models/approvals.py +556 -0
- nautobot/extras/models/change_logging.py +1 -0
- nautobot/extras/models/contacts.py +2 -0
- nautobot/extras/models/customfields.py +57 -22
- nautobot/extras/models/datasources.py +21 -0
- nautobot/extras/models/groups.py +2 -0
- nautobot/extras/models/jobs.py +122 -39
- nautobot/extras/models/metadata.py +2 -3
- nautobot/extras/models/mixins.py +129 -1
- nautobot/extras/models/models.py +22 -14
- nautobot/extras/models/relationships.py +47 -10
- nautobot/extras/models/secrets.py +1 -0
- nautobot/extras/models/statuses.py +0 -15
- nautobot/extras/models/tags.py +1 -1
- nautobot/extras/navigation.py +42 -15
- nautobot/extras/plugins/__init__.py +33 -55
- nautobot/extras/plugins/marketplace_manifest.yml +1 -23
- nautobot/extras/plugins/tables.py +8 -6
- nautobot/extras/plugins/urls.py +2 -21
- nautobot/extras/plugins/utils.py +1 -33
- nautobot/extras/plugins/validators.py +10 -10
- nautobot/extras/plugins/views.py +1 -5
- nautobot/extras/querysets.py +17 -21
- nautobot/extras/signals.py +23 -8
- nautobot/extras/tables.py +420 -99
- nautobot/extras/templates/extras/approval_dashboard.html +15 -0
- nautobot/extras/templates/extras/approval_workflow/approve.html +11 -0
- nautobot/extras/templates/extras/approval_workflow/comment.html +9 -0
- nautobot/extras/templates/extras/approval_workflow/deny.html +10 -0
- nautobot/extras/templates/extras/approvalworkflowdefinition_update.html +77 -0
- nautobot/extras/templates/extras/approvalworkflowstage_retrieve.html +29 -0
- nautobot/extras/templates/extras/configcontext_update.html +12 -12
- nautobot/extras/templates/extras/configcontextschema.html +1 -1
- nautobot/extras/templates/extras/configcontextschema_retrieve.html +9 -9
- nautobot/extras/templates/extras/configcontextschema_update.html +6 -6
- nautobot/extras/templates/extras/configcontextschema_validation.html +2 -2
- nautobot/extras/templates/extras/customfield_update.html +12 -12
- nautobot/extras/templates/extras/dynamicgroup.html +1 -1
- nautobot/extras/templates/extras/dynamicgroup_edit.html +1 -1
- nautobot/extras/templates/extras/dynamicgroup_retrieve.html +17 -17
- nautobot/extras/templates/extras/dynamicgroup_update.html +24 -24
- nautobot/extras/templates/extras/externalintegration_update.html +6 -6
- nautobot/extras/templates/extras/gitrepository.html +1 -1
- nautobot/extras/templates/extras/gitrepository_object_edit.html +1 -1
- nautobot/extras/templates/extras/gitrepository_result.html +1 -1
- nautobot/extras/templates/extras/gitrepository_retrieve.html +12 -12
- nautobot/extras/templates/extras/gitrepository_update.html +25 -7
- nautobot/extras/templates/extras/graphqlquery_retrieve.html +1 -1
- nautobot/extras/templates/extras/inc/approval_buttons_column.html +38 -0
- nautobot/extras/templates/extras/inc/bulk_edit_overridable_field.html +14 -13
- nautobot/extras/templates/extras/inc/configcontext_format.html +11 -4
- nautobot/extras/templates/extras/inc/graphqlquery_execute.html +7 -7
- nautobot/extras/templates/extras/inc/job_label.html +5 -5
- nautobot/extras/templates/extras/inc/job_table.html +23 -10
- nautobot/extras/templates/extras/inc/job_tiles.html +33 -21
- nautobot/extras/templates/extras/inc/jobresult.html +6 -6
- nautobot/extras/templates/extras/inc/json_format.html +11 -4
- nautobot/extras/templates/extras/inc/object_contact_header.html +6 -6
- nautobot/extras/templates/extras/inc/overridable_field.html +16 -15
- nautobot/extras/templates/extras/inc/panel_approvalworkflowstage.html +34 -0
- nautobot/extras/templates/extras/inc/panel_changelog.html +9 -9
- nautobot/extras/templates/extras/inc/panel_jobhistory.html +8 -6
- nautobot/extras/templates/extras/inc/tags_panel.html +3 -3
- nautobot/extras/templates/extras/job.html +154 -155
- nautobot/extras/templates/extras/job_approval_confirmation.html +4 -27
- nautobot/extras/templates/extras/job_bulk_edit.html +18 -1
- nautobot/extras/templates/extras/job_detail.html +1 -1
- nautobot/extras/templates/extras/job_edit.html +69 -64
- nautobot/extras/templates/extras/job_list.html +37 -60
- nautobot/extras/templates/extras/jobresult.html +1 -1
- nautobot/extras/templates/extras/jobresult_retrieve.html +17 -17
- nautobot/extras/templates/extras/marketplace.html +62 -71
- nautobot/extras/templates/extras/metadatatype_create.html +9 -9
- nautobot/extras/templates/extras/note.html +1 -1
- nautobot/extras/templates/extras/object_approvalworkflow.html +36 -0
- nautobot/extras/templates/extras/object_assign_contact_or_team.html +16 -7
- nautobot/extras/templates/extras/object_configcontext.html +20 -20
- nautobot/extras/templates/extras/object_new_contact.html +6 -6
- nautobot/extras/templates/extras/object_new_team.html +6 -6
- nautobot/extras/templates/extras/objectchange.html +1 -1
- nautobot/extras/templates/extras/objectchange_retrieve.html +37 -56
- nautobot/extras/templates/extras/plugin_detail.html +40 -41
- nautobot/extras/templates/extras/plugins_list.html +23 -38
- nautobot/extras/templates/extras/plugins_tiles.html +28 -28
- nautobot/extras/templates/extras/role_retrieve.html +112 -48
- nautobot/extras/templates/extras/scheduledjob.html +25 -28
- nautobot/extras/templates/extras/secret_create.html +11 -11
- nautobot/extras/templates/extras/secretsgroup_update.html +6 -6
- nautobot/extras/templates/extras/staticgroupassociation_retrieve.html +3 -3
- nautobot/extras/templates/extras/status.html +1 -1
- nautobot/extras/templates/extras/tag.html +1 -1
- nautobot/extras/templates/extras/tag_update.html +3 -3
- nautobot/extras/templates/extras/templatetags/log_level.html +1 -1
- nautobot/extras/templates/extras/templatetags/plugin_object_detail_tabs.html +2 -2
- nautobot/extras/templates/extras/webhook.html +12 -12
- nautobot/extras/templatetags/approvals.py +19 -0
- nautobot/extras/templatetags/custom_links.py +12 -12
- nautobot/extras/templatetags/job_buttons.py +14 -12
- nautobot/extras/test_jobs/invalid_import.py +9 -0
- nautobot/extras/test_jobs/log_counts_by_level.py +23 -0
- nautobot/extras/test_jobs/missing_import.py +11 -0
- nautobot/extras/tests/integration/test_computedfields.py +5 -8
- nautobot/extras/tests/integration/test_configcontextschema.py +43 -48
- nautobot/extras/tests/integration/test_customfields.py +33 -33
- nautobot/extras/tests/integration/test_dynamicgroups.py +5 -10
- nautobot/extras/tests/integration/test_jobs.py +2 -4
- nautobot/extras/tests/integration/test_notes.py +3 -9
- nautobot/extras/tests/integration/test_plugin_banner.py +3 -0
- nautobot/extras/tests/integration/test_plugins.py +35 -27
- nautobot/extras/tests/integration/test_relationships.py +7 -11
- nautobot/extras/tests/integration/test_tagfilter.py +3 -11
- nautobot/extras/tests/test_api.py +786 -242
- nautobot/extras/tests/test_approvals.py +715 -0
- nautobot/extras/tests/test_changelog.py +18 -14
- nautobot/extras/tests/test_customfields.py +14 -13
- nautobot/extras/tests/test_datasources.py +1 -1
- nautobot/extras/tests/test_dynamicgroups.py +9 -4
- nautobot/extras/tests/test_filters.py +443 -13
- nautobot/extras/tests/test_forms.py +18 -57
- nautobot/extras/tests/test_jobs.py +25 -4
- nautobot/extras/tests/test_migrations.py +81 -1
- nautobot/extras/tests/test_models.py +378 -47
- nautobot/extras/tests/test_plugins.py +47 -13
- nautobot/extras/tests/test_relationships.py +7 -2
- nautobot/extras/tests/test_utils.py +2 -0
- nautobot/extras/tests/test_views.py +780 -493
- nautobot/extras/urls.py +36 -12
- nautobot/extras/utils.py +58 -12
- nautobot/extras/views.py +668 -209
- nautobot/ipam/factory.py +7 -0
- nautobot/ipam/filter_mixins.py +38 -0
- nautobot/ipam/filters.py +35 -71
- nautobot/ipam/formfields.py +1 -1
- nautobot/ipam/forms.py +6 -3
- nautobot/ipam/migrations/0030_ipam__namespaces.py +13 -0
- nautobot/ipam/migrations/0031_ipam___data_migrations.py +4 -1
- nautobot/ipam/migrations/0054_namespace_tenant.py +25 -0
- nautobot/ipam/models.py +29 -2
- nautobot/ipam/navigation.py +3 -1
- nautobot/ipam/querysets.py +1 -2
- nautobot/ipam/tables.py +26 -17
- nautobot/ipam/templates/ipam/inc/ipadress_edit_header.html +6 -6
- nautobot/ipam/templates/ipam/inc/service.html +8 -8
- nautobot/ipam/templates/ipam/inc/toggle_available.html +10 -10
- nautobot/ipam/templates/ipam/inc/vlangroup_header.html +3 -2
- nautobot/ipam/templates/ipam/ipaddress.html +27 -13
- nautobot/ipam/templates/ipam/ipaddress_assign.html +31 -24
- nautobot/ipam/templates/ipam/ipaddress_bulk_add.html +3 -3
- nautobot/ipam/templates/ipam/ipaddress_edit.html +9 -9
- nautobot/ipam/templates/ipam/ipaddress_interfaces.html +7 -9
- nautobot/ipam/templates/ipam/ipaddress_merge.html +195 -186
- nautobot/ipam/templates/ipam/ipaddress_vm_interfaces.html +7 -9
- nautobot/ipam/templates/ipam/ipaddresstointerface_retrieve.html +7 -5
- nautobot/ipam/templates/ipam/namespace_ip_addresses.html +1 -1
- nautobot/ipam/templates/ipam/namespace_prefixes.html +1 -1
- nautobot/ipam/templates/ipam/namespace_update.html +15 -0
- nautobot/ipam/templates/ipam/namespace_vrfs.html +1 -1
- nautobot/ipam/templates/ipam/prefix_create.html +9 -9
- nautobot/ipam/templates/ipam/prefix_list.html +15 -14
- nautobot/ipam/templates/ipam/prefix_retrieve.html +0 -1
- nautobot/ipam/templates/ipam/vlan.html +1 -1
- nautobot/ipam/templates/ipam/vlan_interfaces.html +1 -1
- nautobot/ipam/templates/ipam/vlan_update.html +6 -6
- nautobot/ipam/templates/ipam/vlan_vminterfaces.html +1 -1
- nautobot/ipam/templates/ipam/vrf_edit.html +15 -15
- nautobot/ipam/tests/integration/test_prefixes.py +5 -13
- nautobot/ipam/tests/migration/test_migrations.py +89 -0
- nautobot/ipam/tests/test_api.py +20 -7
- nautobot/ipam/tests/test_filters.py +10 -0
- nautobot/ipam/tests/test_forms.py +1 -1
- nautobot/ipam/tests/test_models.py +1 -1
- nautobot/ipam/tests/test_tables.py +1 -2
- nautobot/ipam/tests/test_utils.py +1 -1
- nautobot/ipam/tests/test_views.py +24 -21
- nautobot/ipam/ui.py +0 -17
- nautobot/ipam/utils/migrations.py +16 -2
- nautobot/ipam/utils/testing.py +9 -3
- nautobot/ipam/views.py +49 -7
- nautobot/project-static/dist/css/graphql-libraries.css +655 -0
- nautobot/project-static/dist/css/graphql-libraries.css.map +1 -0
- nautobot/project-static/dist/css/materialdesignicons.css +3 -0
- nautobot/project-static/dist/css/materialdesignicons.css.map +1 -0
- nautobot/project-static/dist/css/nautobot.css +13 -0
- nautobot/project-static/dist/css/nautobot.css.map +1 -0
- nautobot/project-static/dist/js/graphql-libraries.js +3 -0
- nautobot/project-static/dist/js/graphql-libraries.js.LICENSE.txt +62 -0
- nautobot/project-static/dist/js/graphql-libraries.js.map +1 -0
- nautobot/project-static/dist/js/libraries.js +3 -0
- nautobot/project-static/dist/js/libraries.js.LICENSE.txt +65 -0
- nautobot/project-static/dist/js/libraries.js.map +1 -0
- nautobot/project-static/dist/js/materialdesignicons.js +0 -0
- nautobot/project-static/dist/js/nautobot-graphiql.js +2 -0
- nautobot/project-static/dist/js/nautobot-graphiql.js.map +1 -0
- nautobot/project-static/dist/js/nautobot.js +2 -0
- nautobot/project-static/dist/js/nautobot.js.map +1 -0
- nautobot/project-static/fonts/Montserrat-v30-Bold.woff2 +0 -0
- nautobot/project-static/fonts/Montserrat-v30-Light.woff2 +0 -0
- nautobot/project-static/fonts/Montserrat-v30-Regular.woff2 +0 -0
- nautobot/project-static/fonts/Roboto-v48-Bold.woff2 +0 -0
- nautobot/project-static/fonts/Roboto-v48-Light.woff2 +0 -0
- nautobot/project-static/fonts/Roboto-v48-Regular.woff2 +0 -0
- nautobot/project-static/img/jinja_logo.svg +21 -92
- nautobot/project-static/js/cabletrace.js +1 -1
- nautobot/project-static/js/editor.js +4 -4
- nautobot/project-static/js/forms.js +67 -717
- nautobot/project-static/js/job_result.js +2 -2
- nautobot/project-static/nautobot-icons/360-degrees.svg +3 -0
- nautobot/project-static/nautobot-icons/arrow-decision.svg +3 -0
- nautobot/project-static/nautobot-icons/arrows-expand-rec.svg +3 -0
- nautobot/project-static/nautobot-icons/arrows-move-2-rec.svg +3 -0
- nautobot/project-static/nautobot-icons/arrows-move-rec.svg +3 -0
- nautobot/project-static/nautobot-icons/atom.svg +3 -0
- nautobot/project-static/nautobot-icons/battery-3.svg +3 -0
- nautobot/project-static/nautobot-icons/branch.svg +3 -0
- nautobot/project-static/nautobot-icons/briefcase-2.svg +3 -0
- nautobot/project-static/nautobot-icons/cable-data-2.svg +3 -0
- nautobot/project-static/nautobot-icons/cable-data.svg +3 -0
- nautobot/project-static/nautobot-icons/cast.svg +3 -0
- nautobot/project-static/nautobot-icons/check-circle.svg +3 -0
- nautobot/project-static/nautobot-icons/checkbox-circle.svg +3 -0
- nautobot/project-static/nautobot-icons/checkbox-rec.svg +3 -0
- nautobot/project-static/nautobot-icons/cloud-check.svg +3 -0
- nautobot/project-static/nautobot-icons/cloud-lightning.svg +3 -0
- nautobot/project-static/nautobot-icons/cloud-upload.svg +3 -0
- nautobot/project-static/nautobot-icons/cloud.svg +3 -0
- nautobot/project-static/nautobot-icons/compass.svg +3 -0
- nautobot/project-static/nautobot-icons/control-panel.svg +3 -0
- nautobot/project-static/nautobot-icons/credit-card.svg +3 -0
- nautobot/project-static/nautobot-icons/device-lifecycle.svg +3 -0
- nautobot/project-static/nautobot-icons/direction.svg +3 -0
- nautobot/project-static/nautobot-icons/elements.svg +3 -0
- nautobot/project-static/nautobot-icons/extensibility.svg +3 -0
- nautobot/project-static/nautobot-icons/globe-2.svg +3 -0
- nautobot/project-static/nautobot-icons/globe.svg +3 -0
- nautobot/project-static/nautobot-icons/hammer.svg +3 -0
- nautobot/project-static/nautobot-icons/history.svg +3 -0
- nautobot/project-static/nautobot-icons/ip.svg +3 -0
- nautobot/project-static/nautobot-icons/laptop.svg +3 -0
- nautobot/project-static/nautobot-icons/lightning.svg +3 -0
- nautobot/project-static/nautobot-icons/list-unordered.svg +3 -0
- nautobot/project-static/nautobot-icons/map-view.svg +3 -0
- nautobot/project-static/nautobot-icons/organization.svg +3 -0
- nautobot/project-static/nautobot-icons/pin-2.svg +3 -0
- nautobot/project-static/nautobot-icons/pin-3.svg +3 -0
- nautobot/project-static/nautobot-icons/plug.svg +3 -0
- nautobot/project-static/nautobot-icons/refresh-cw.svg +3 -0
- nautobot/project-static/nautobot-icons/rocket-2.svg +3 -0
- nautobot/project-static/nautobot-icons/rotate-cw.svg +3 -0
- nautobot/project-static/nautobot-icons/route.svg +3 -0
- nautobot/project-static/nautobot-icons/secrets.svg +3 -0
- nautobot/project-static/nautobot-icons/security.svg +3 -0
- nautobot/project-static/nautobot-icons/server-2.svg +3 -0
- nautobot/project-static/nautobot-icons/server.svg +3 -0
- nautobot/project-static/nautobot-icons/share.svg +3 -0
- nautobot/project-static/nautobot-icons/shield-check.svg +3 -0
- nautobot/project-static/nautobot-icons/sitemap-outline.svg +3 -0
- nautobot/project-static/nautobot-icons/sliders-vert-2.svg +3 -0
- nautobot/project-static/nautobot-icons/sliders-vert.svg +3 -0
- nautobot/project-static/nautobot-icons/star-filled.svg +3 -0
- nautobot/project-static/nautobot-icons/star.svg +3 -0
- nautobot/project-static/nautobot-icons/transform.svg +3 -0
- nautobot/project-static/nautobot-icons/wifi.svg +3 -0
- nautobot/tenancy/api/serializers.py +1 -0
- nautobot/tenancy/api/views.py +2 -1
- nautobot/tenancy/{filters/__init__.py → filters.py} +2 -10
- nautobot/tenancy/navigation.py +3 -1
- nautobot/tenancy/templates/tenancy/tenant_create.html +6 -6
- nautobot/tenancy/tests/test_filters.py +0 -2
- nautobot/tenancy/views.py +2 -1
- nautobot/ui/.gitignore +137 -0
- nautobot/ui/.node-version +1 -0
- nautobot/ui/.prettierignore +3 -0
- nautobot/ui/eslint.config.js +33 -0
- nautobot/ui/package-lock.json +6594 -0
- nautobot/ui/package.json +67 -0
- nautobot/ui/prettier.config.js +9 -0
- nautobot/ui/src/js/collapse.js +69 -0
- nautobot/ui/src/js/cookie.js +31 -0
- nautobot/ui/src/js/draggable.js +101 -0
- nautobot/ui/src/js/drawer.js +106 -0
- nautobot/ui/src/js/form.js +23 -0
- nautobot/ui/src/js/history.js +51 -0
- nautobot/ui/src/js/nautobot-graphiql.js +19 -0
- nautobot/ui/src/js/nautobot.js +128 -0
- nautobot/ui/src/js/search.js +274 -0
- nautobot/ui/src/js/select2.js +318 -0
- nautobot/ui/src/js/sidenav.js +87 -0
- nautobot/ui/src/js/tabs.js +139 -0
- nautobot/ui/src/js/theme.js +104 -0
- nautobot/ui/src/js/utils.js +54 -0
- nautobot/ui/src/scss/colors.scss +58 -0
- nautobot/ui/src/scss/nautobot.scss +2471 -0
- nautobot/ui/webpack.config.js +148 -0
- nautobot/users/apps.py +3 -0
- nautobot/users/filters.py +7 -11
- nautobot/users/forms.py +10 -0
- nautobot/users/models.py +8 -0
- nautobot/users/templates/users/advanced_settings_edit.html +31 -21
- nautobot/users/templates/users/api_tokens.html +61 -51
- nautobot/users/templates/users/base.html +23 -31
- nautobot/users/templates/users/change_password.html +29 -19
- nautobot/users/templates/users/preferences.html +55 -45
- nautobot/users/templates/users/profile.html +45 -14
- nautobot/users/tests/test_api.py +4 -0
- nautobot/users/urls.py +2 -0
- nautobot/users/views.py +70 -2
- nautobot/virtualization/api/views.py +1 -1
- nautobot/virtualization/filters.py +18 -32
- nautobot/virtualization/forms.py +22 -59
- nautobot/virtualization/models.py +1 -19
- nautobot/virtualization/navigation.py +3 -1
- nautobot/virtualization/tables.py +10 -6
- nautobot/virtualization/templates/virtualization/cluster.html +13 -13
- nautobot/virtualization/templates/virtualization/cluster_edit.html +6 -6
- nautobot/virtualization/templates/virtualization/inc/virtualmachine_vminterface_filter.html +1 -1
- nautobot/virtualization/templates/virtualization/virtualmachine.html +1 -1
- nautobot/virtualization/templates/virtualization/virtualmachine_component_add.html +24 -16
- nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +1 -1
- nautobot/virtualization/templates/virtualization/virtualmachine_list.html +4 -4
- nautobot/virtualization/templates/virtualization/virtualmachine_update.html +27 -25
- nautobot/virtualization/templates/virtualization/vminterface.html +5 -5
- nautobot/virtualization/templates/virtualization/vminterface_edit.html +27 -11
- nautobot/virtualization/tests/test_api.py +3 -0
- nautobot/virtualization/tests/test_models.py +20 -5
- nautobot/virtualization/tests/test_views.py +3 -5
- nautobot/virtualization/urls.py +0 -11
- nautobot/virtualization/views.py +5 -122
- nautobot/vpn/__init__.py +0 -0
- nautobot/vpn/api/serializers.py +113 -0
- nautobot/vpn/api/urls.py +19 -0
- nautobot/vpn/api/views.py +70 -0
- nautobot/vpn/apps.py +8 -0
- nautobot/vpn/choices.py +171 -0
- nautobot/vpn/factory.py +209 -0
- nautobot/vpn/filters.py +233 -0
- nautobot/vpn/forms.py +486 -0
- nautobot/vpn/homepage.py +19 -0
- nautobot/vpn/migrations/0001_initial.py +541 -0
- nautobot/vpn/migrations/0002_populate_defaults.py +199 -0
- nautobot/vpn/migrations/__init__.py +0 -0
- nautobot/vpn/models.py +527 -0
- nautobot/vpn/navigation.py +98 -0
- nautobot/vpn/tables.py +380 -0
- nautobot/vpn/templates/vpn/vpnprofile.html +2 -0
- nautobot/vpn/templates/vpn/vpnprofile_create.html +150 -0
- nautobot/vpn/tests/__init__.py +0 -0
- nautobot/vpn/tests/test_api.py +341 -0
- nautobot/vpn/tests/test_filters.py +139 -0
- nautobot/vpn/tests/test_forms.py +294 -0
- nautobot/vpn/tests/test_models.py +97 -0
- nautobot/vpn/tests/test_views.py +281 -0
- nautobot/vpn/urls.py +16 -0
- nautobot/vpn/views.py +437 -0
- nautobot/wireless/filters.py +0 -8
- nautobot/wireless/navigation.py +3 -1
- nautobot/wireless/templates/wireless/wirelessnetwork_create.html +6 -6
- nautobot/wireless/tests/integration/test_radio_profile.py +3 -7
- nautobot/wireless/tests/test_api.py +1 -1
- {nautobot-2.4.21.dist-info → nautobot-3.0.0a3.dist-info}/METADATA +5 -4
- {nautobot-2.4.21.dist-info → nautobot-3.0.0a3.dist-info}/RECORD +802 -707
- {nautobot-2.4.21.dist-info → nautobot-3.0.0a3.dist-info}/entry_points.txt +1 -0
- nautobot/core/management/commands/check_job_approval_status.py +0 -47
- nautobot/core/templates/search_form.html +0 -9
- nautobot/core/templates/utilities/templatetags/filter_form_modal.html +0 -87
- nautobot/dcim/filters/mixins.py +0 -354
- nautobot/extras/templates/extras/job_approval_request.html +0 -134
- nautobot/extras/templates/extras/scheduled_jobs_approval_queue_list.html +0 -28
- nautobot/ipam/mixins.py +0 -32
- nautobot/ipam/templates/ipam/inc/prefix_header_extra_content_table.html +0 -4
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css +0 -587
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +0 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css +0 -6
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +0 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +0 -6865
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +0 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +0 -6
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +0 -1
- nautobot/project-static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.eot +0 -0
- nautobot/project-static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.svg +0 -288
- nautobot/project-static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.ttf +0 -0
- nautobot/project-static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.woff +0 -0
- nautobot/project-static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
- nautobot/project-static/bootstrap-3.4.1-dist/js/bootstrap.js +0 -2580
- nautobot/project-static/bootstrap-3.4.1-dist/js/bootstrap.min.js +0 -6
- nautobot/project-static/bootstrap-3.4.1-dist/js/npm.js +0 -13
- nautobot/project-static/clipboard.js-2.0.9/clipboard.min.js +0 -7
- nautobot/project-static/css/base.css +0 -1040
- nautobot/project-static/css/dark.css +0 -282
- nautobot/project-static/flatpickr-4.6.9/flatpickr.min.js +0 -2
- nautobot/project-static/flatpickr-4.6.9/themes/light.min.css +0 -1
- nautobot/project-static/graphiql-1.5.16/graphiql.min.css +0 -12
- nautobot/project-static/graphiql-1.5.16/graphiql.min.js +0 -11
- nautobot/project-static/highlight.js-11.9.0/github-dark.min.css +0 -10
- nautobot/project-static/highlight.js-11.9.0/github.min.css +0 -10
- nautobot/project-static/highlight.js-11.9.0/highlight.min.js +0 -378
- nautobot/project-static/jquery/jquery-3.7.1.min.js +0 -2
- nautobot/project-static/jquery-ui-1.13.2/images/ui-icons_444444_256x240.png +0 -0
- nautobot/project-static/jquery-ui-1.13.2/images/ui-icons_555555_256x240.png +0 -0
- nautobot/project-static/jquery-ui-1.13.2/images/ui-icons_777620_256x240.png +0 -0
- nautobot/project-static/jquery-ui-1.13.2/images/ui-icons_777777_256x240.png +0 -0
- nautobot/project-static/jquery-ui-1.13.2/images/ui-icons_cc0000_256x240.png +0 -0
- nautobot/project-static/jquery-ui-1.13.2/images/ui-icons_ffffff_256x240.png +0 -0
- nautobot/project-static/jquery-ui-1.13.2/jquery-ui.min.css +0 -7
- nautobot/project-static/jquery-ui-1.13.2/jquery-ui.min.js +0 -6
- nautobot/project-static/jquery-ui-1.13.2/jquery-ui.structure.min.css +0 -5
- nautobot/project-static/jquery-ui-1.13.2/jquery-ui.theme.min.css +0 -5
- nautobot/project-static/js/homepage_layout.js +0 -182
- nautobot/project-static/js/nav_menu.js +0 -250
- nautobot/project-static/js/theme.js +0 -133
- nautobot/project-static/materialdesignicons-7.4.47/LICENSE +0 -20
- nautobot/project-static/materialdesignicons-7.4.47/css/materialdesignicons.min.css +0 -3
- nautobot/project-static/react-16.14.0/react.production.min.js +0 -32
- nautobot/project-static/react-dom-16.14.0/react-dom.production.min.js +0 -239
- nautobot/project-static/select2-4.0.13/i18n/af.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/ar.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/az.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/bg.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/bn.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/bs.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/ca.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/cs.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/da.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/de.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/dsb.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/el.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/en.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/es.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/et.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/eu.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/fa.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/fi.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/fr.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/gl.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/he.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/hi.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/hr.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/hsb.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/hu.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/hy.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/id.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/is.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/it.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/ja.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/ka.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/km.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/ko.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/lt.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/lv.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/mk.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/ms.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/nb.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/ne.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/nl.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/pl.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/ps.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/pt-BR.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/pt.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/ro.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/ru.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/sk.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/sl.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/sq.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/sr-Cyrl.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/sr.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/sv.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/th.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/tk.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/tr.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/uk.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/vi.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/zh-CN.js +0 -3
- nautobot/project-static/select2-4.0.13/i18n/zh-TW.js +0 -3
- nautobot/project-static/select2-4.0.13/select2.min.css +0 -1
- nautobot/project-static/select2-4.0.13/select2.min.js +0 -2
- nautobot/project-static/select2-bootstrap-0.1.0-beta.10/select2-bootstrap.min.css +0 -7
- nautobot/project-static/subscriptions-transport-ws-0.9.18/client.min.js +0 -8
- nautobot/project-static/whatwg-fetch-3.6.2/fetch.umd.min.js +0 -8
- nautobot/virtualization/templates/virtualization/cluster_add_devices.html +0 -37
- /nautobot/extras/{filters/customfields.py → filter_mixins_customfields.py} +0 -0
- /nautobot/project-static/{materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.ttf → dist/1fcc36272ea3e53d0031.ttf} +0 -0
- /nautobot/project-static/{materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.eot → dist/2146c3c82b553977abc7.eot} +0 -0
- /nautobot/project-static/{materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff → dist/e55a20c80650829ec5fd.woff} +0 -0
- /nautobot/project-static/{materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff2 → dist/ec024da790d2972da002.woff2} +0 -0
- /nautobot/tenancy/{filters/mixins.py → filter_mixins.py} +0 -0
- {nautobot-2.4.21.dist-info → nautobot-3.0.0a3.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.4.21.dist-info → nautobot-3.0.0a3.dist-info}/NOTICE +0 -0
- {nautobot-2.4.21.dist-info → nautobot-3.0.0a3.dist-info}/WHEEL +0 -0
|
File without changes
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(()=>{"use strict";var e,r,t,o={6086:(e,r,t)=>{var o=t(3724),n=t(162),i=t(4661),a=t(4789),f=t(6540),c=t(961),u=t(8624);i.Jd.createFetcher=n.createGraphiQLFetcher,window.fetch=u.hd,window.graphqlWs=a,window.GraphiQL=i.Jd,window.GraphiQLPluginExplorer=o,window.React=f,window.ReactDOM=c}},n={};function i(e){var r=n[e];if(void 0!==r)return r.exports;var t=n[e]={exports:{}};return o[e](t,t.exports,i),t.exports}i.m=o,e=[],i.O=(r,t,o,n)=>{if(!t){var a=1/0;for(l=0;l<e.length;l++){for(var[t,o,n]=e[l],f=!0,c=0;c<t.length;c++)(!1&n||a>=n)&&Object.keys(i.O).every((e=>i.O[e](t[c])))?t.splice(c--,1):(f=!1,n<a&&(a=n));if(f){e.splice(l--,1);var u=o();void 0!==u&&(r=u)}}return r}n=n||0;for(var l=e.length;l>0&&e[l-1][2]>n;l--)e[l]=e[l-1];e[l]=[t,o,n]},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,i.t=function(e,o){if(1&o&&(e=this(e)),8&o)return e;if("object"==typeof e&&e){if(4&o&&e.__esModule)return e;if(16&o&&"function"==typeof e.then)return e}var n=Object.create(null);i.r(n);var a={};r=r||[null,t({}),t([]),t(t)];for(var f=2&o&&e;"object"==typeof f&&!~r.indexOf(f);f=t(f))Object.getOwnPropertyNames(f).forEach((r=>a[r]=()=>e[r]));return a.default=()=>e,i.d(n,a),n},i.d=(e,r)=>{for(var t in r)i.o(r,t)&&!i.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},i.e=()=>Promise.resolve(),i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={116:0};i.O.j=r=>0===e[r];var r=(r,t)=>{var o,n,[a,f,c]=t,u=0;if(a.some((r=>0!==e[r]))){for(o in f)i.o(f,o)&&(i.m[o]=f[o]);if(c)var l=c(i)}for(r&&r(t);u<a.length;u++)n=a[u],i.o(e,n)&&e[n]&&e[n][0](),e[n]=0;return i.O(l)},t=self.webpackChunknautobot=self.webpackChunknautobot||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})(),i.nc=void 0;var a=i.O(void 0,[748],(()=>i(6086)));a=i.O(a)})();
|
|
2
|
+
//# sourceMappingURL=nautobot-graphiql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js/nautobot-graphiql.js","mappings":"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","sources":["webpack://nautobot/webpack/runtime/chunk loaded","webpack://nautobot/webpack/runtime/create fake namespace object","webpack://nautobot/./src/js/nautobot-graphiql.js","webpack://nautobot/webpack/bootstrap","webpack://nautobot/webpack/runtime/define property getters","webpack://nautobot/webpack/runtime/ensure chunk","webpack://nautobot/webpack/runtime/global","webpack://nautobot/webpack/runtime/hasOwnProperty shorthand","webpack://nautobot/webpack/runtime/make namespace object","webpack://nautobot/webpack/runtime/jsonp chunk loading","webpack://nautobot/webpack/runtime/nonce","webpack://nautobot/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","import * as GraphiQLPluginExplorer from '@graphiql/plugin-explorer';\nimport { createGraphiQLFetcher } from '@graphiql/toolkit';\nimport { GraphiQL } from 'graphiql';\nimport * as graphqlWs from 'graphql-ws';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { fetch } from 'whatwg-fetch';\n\nimport 'graphiql/graphiql.css';\nimport '@graphiql/plugin-explorer/dist/style.css';\n\nGraphiQL.createFetcher = createGraphiQLFetcher;\n\nwindow.fetch = fetch;\nwindow.graphqlWs = graphqlWs;\nwindow.GraphiQL = GraphiQL;\nwindow.GraphiQLPluginExplorer = GraphiQLPluginExplorer;\nwindow.React = React;\nwindow.ReactDOM = ReactDOM;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","// The chunk loading function for additional chunks\n// Since all referenced chunks are already included\n// in this file, this function is empty here.\n__webpack_require__.e = () => (Promise.resolve());","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t116: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknautobot\"] = self[\"webpackChunknautobot\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [748], () => (__webpack_require__(6086)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","createFetcher","createGraphiQLFetcher","window","fetch","graphqlWs","GraphiQL","GraphiQLPluginExplorer","React","ReactDOM","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","getPrototypeOf","obj","t","value","mode","this","__esModule","then","ns","create","def","current","indexOf","getOwnPropertyNames","forEach","d","definition","o","defineProperty","enumerable","get","e","Promise","resolve","g","globalThis","Function","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","id","chunkLoadingGlobal","self","bind","push","nc","__webpack_exports__"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(()=>{"use strict";var e,t={226:(e,t,n)=>{var a=n(336),o=n(576),r=n(209),s=n(430),i=n(11),l=(n(283),n(75)),d=n(402),c=n(359),u=n(347),m=n(37),p=n(692);n(139),n(458);const g="nb-draggable",b="nb-draggable-container",h="nb-dragging",v="nb-drawer-open",w=(e,t)=>{if(!e)return;e.classList.toggle(v,t);const n=e.classList.contains(v);e.setAttribute("aria-hidden",n?"false":"true");const a=[...document.querySelectorAll(`[data-nb-toggle="drawer"][data-nb-target="#${e.id}"]`)];if(a.forEach((e=>e.setAttribute("aria-expanded",n?"true":"false"))),n)[...document.getElementsByClassName(v)].filter((t=>t!==e)).forEach((e=>w(e,!1))),(()=>{let t=100;window.requestAnimationFrame((function n(){"visible"===window.getComputedStyle(e).visibility?e.focus():t>0&&(t-=1,window.requestAnimationFrame(n))}))})();else if(e.contains(document.activeElement)){const e=a[0]||document.querySelector("main");e?.focus({preventScroll:!0})}const o=n?"nb-drawer:opened":"nb-drawer:closed";e.dispatchEvent(new CustomEvent(o,{bubbles:!0,cancelable:!0}))},f="historyState",y=e=>{const t=void 0===e?window.history?.state:e;void 0!==t&&window.sessionStorage?.setItem(f,JSON.stringify(t))},E=(e,t={},...n)=>{const a=document.createElement(e);return Object.entries(t).forEach((([e,t])=>a.setAttribute("className"===e?"class":e,t))),n.forEach((e=>"string"==typeof e?a.insertAdjacentText("beforeend",e):a.appendChild(e))),a},S=(e,...t)=>[...e.classList.entries()].filter((([,e])=>!t.includes(e))).forEach((([,t])=>e.classList.remove(t))),A=e=>{const t=window.getComputedStyle(document.documentElement).fontSize;return e/parseInt(t,10)},L=A(12),x=A(6),k=A(20),q=`${L+k+x}rem`;var C=n(762);const O=e=>e instanceof Document||e instanceof Element?e:e[0],j=(e,t)=>{$(e).val(null),(t??[]).forEach((t=>{if(!e.querySelector(`option[value="${t.value}"]`)){const n=document.createElement("option");n.innerText=t.text,n.setAttribute("selected","true"),n.setAttribute("value",t.value),e.appendChild(n)}}));const n=t.length>0?null!==e?.getAttribute("multiple")?t.map((e=>e.value)):t?.[0]?.value:null;$(e).val(n).trigger("change")},B=(e,t,n)=>[...O(e).querySelectorAll(t)].forEach((e=>$(e).select2({allowClear:!0,placeholder:e.getAttribute("placeholder")||"---------",selectionCssClass:"select2--small",theme:"bootstrap-5",width:"off",...n}))),I=(e,t=null)=>{const n=(e,t)=>(e.element&&O(t).setAttribute("style",e.element.getAttribute("style")),e.text);B(e,".nautobot-select2-color-picker",{dropdownParent:t,templateResult:n,templateSelection:n})},N=(e,t=null)=>{B(e,".nautobot-select2-api",{ajax:{data:function(e){const[t]=this,n=50*(e.page-1)||0,a=e.term,o=t.getAttribute("search-field")||"q",r=t.getAttribute("data-api-version"),s=parseInt(t.getAttribute("data-depth"),10)||0,i=t.getAttribute("data-contenttype"),l=Object.fromEntries([...t.attributes].filter((e=>e.name.includes("data-query-param-"))).flatMap((e=>{const[,n]=e.name.split("data-query-param-");return(()=>{try{return JSON.parse(e.value)}catch(e){return[]}})().flatMap((e=>{const a=e.startsWith("$"),o=a?(()=>{const n=e.slice(1);if(t.id.includes("id_form-")){const[e]=t.id.match(/id_form-[0-9]+-/i,"");return document.querySelector(`#${e}${n}`)}return t.closest("tr")?.classList.contains("dynamic-formset")?t.closest("tr").querySelector(`select[id*="${n}"]`):document.querySelector(`#id_${n}`)})():null,r=o?(()=>{const e=(t=o,null===t?.getAttribute("multiple")?t?.value:[...t.selectedOptions].map((e=>e.value)));var t;const n=window.getComputedStyle(o);return e&&"0"!==n.opacity&&"hidden"!==n.visibility?e:o.getAttribute("required")&&o.getAttribute("data-null-option")?"null":void 0})():null;return null!=(a?r:e)?[[n,r||e]]:[]}))}))),d={depth:String(s),limit:String(50),offset:String(n),...r?{api_version:r}:void 0,...i?{content_type:i}:void 0,...a?{[o]:a}:void 0,...l};return new URLSearchParams(d).toString()},delay:500,processResults:function(e){const[t]=this.$element;[...t.querySelectorAll("option")].forEach((e=>e.removeAttribute("disabled")));const n=[...t.getAttribute("data-null-option")&&null===e.previous?[{id:"null",text:t.getAttribute("data-null-option")}]:[],...Object.values(e.results.reduce(((e,n,a)=>{const o=Boolean(n?.[t.getAttribute("disabled-indicator")]),r=C(n,t.getAttribute("value-field"))||n.id,s=C(n,t.getAttribute("display-field"))||n.name,i={...n,disabled:o,id:r,text:s},{group:l,site:d,url:c}=i,u=Boolean(c?.includes("dynamic-groups")),m=(()=>{switch(!0){case null!=l&&null!=d:return{property:`${d.name}:${l.name}`,text:`${d.name} / ${l.name}`};case null!=l:return{property:l.name,text:l.name};case null!=d:return{property:d.name,text:d.name};case null===l&&null===d:return{property:"global",text:"Global"};default:return}})();return{...e,...m?{[m.property]:{...e[m.property],...e[m.property]?void 0:{text:m.text},children:u?void 0:[...e[m.property]?.children??[],i]}}:{[a]:i}}}),{}))];return{pagination:{more:null!==e.next},results:n}},url:function(){const[e]=this,t=(e=>{const t=/\{\{([a-z_]+)}}/g;let n,a=e;for(;n=t.exec(e);){const e=document.querySelector(`#id_${n[1]}`),t=e?.selectedOptions?.[0]?.getAttribute("api-value"),o=t||e.value||(e.getAttribute("data-null-option")?"null":void 0);a=o?a.replace(n[0],o):a}return a})(e.getAttribute("data-url"));return!t.includes("{{")&&t}},dropdownParent:t})},T=(e,t=null)=>B(e,".nautobot-select2-multi-value-char",{dropdownParent:t,language:{noResults:()=>"Type something to add it as an option"},multiple:!0,tags:!0}),_=(e,t=null)=>B(e,".nautobot-select2-static",{dropdownParent:t}),R=e=>{I(e),N(e),T(e),_(e),[...O(e).querySelectorAll(".modal")].forEach((e=>{I(e,e),N(e,e),T(e,e),_(e,e)}))},D=e=>document.cookie.split("; ").find((t=>t.startsWith(`${e}=`)))?.split("=")[1],M=(e,t,n)=>{const a={[e]:t,path:"/",...n};document.cookie=Object.entries(a).map((e=>e.join("="))).join(";")},P=e=>M(e,"",{expires:"Thu, 01 Jan 1970 00:00:00 GMT"}),z="sidenav_collapsed",F=()=>{const e=document.querySelector(".nb-sidenav-toggler"),t=e.getAttribute("aria-controls"),n="true"===e.getAttribute("aria-expanded");e.setAttribute("aria-expanded",String(!n)),document.getElementById(t).classList.toggle("nb-sidenav-collapsed",n),n?(M(z,"true"),window.localStorage?.setItem(z,"true")):(P(z),window.localStorage?.removeItem(z))},J=["invisible","position-absolute"],G="theme_modal",U="dark",Q="light",W="system",X=e=>e===U||e===Q||e===W,Y=()=>{const e=D("theme");if(X(e))return e;const t=window.localStorage?.getItem("theme");return X(t)?t:W},K=(e,t)=>{const n=Boolean(t?.manual),a=document.getElementById(G);(a?.querySelectorAll("button[data-nb-theme]")??[]).forEach((t=>["border","border-primary"].forEach((n=>t.classList.toggle(n,t.dataset.nbTheme===e)))));const o=e===W?window.matchMedia?.(`(prefers-color-scheme: ${U})`).matches?U:Q:e;document.documentElement.dataset.theme=o,document.documentElement.dataset.bsTheme=o,e===W?(P("theme"),window.localStorage?.removeItem("theme")):n&&(M("theme",e),window.localStorage?.setItem("theme",e)),(e===U||e===W&&o===U)&&[...document.getElementsByTagName("object")].forEach((e=>{e.addEventListener("load",(e=>{e.target.contentDocument&&[...e.target.contentDocument.getElementsByTagName("image"),...e.target.contentDocument.getElementsByClassName("rack-device-shortname"),...e.target.contentDocument.getElementsByClassName("rack-device-fullname")].forEach((e=>e.setAttribute("filter","url(#darkmodeinvert)")))}))})),n&&document.location.reload()};window.bootstrap=a,window.ClipboardJS=o,window.echarts=r,window.flatpickr=s.A,window.htmx=m.A,i.A.registerLanguage("graphql",l.A),i.A.registerLanguage("json",d.A),i.A.registerLanguage("xml",c.A),i.A.registerLanguage("yaml",u.A),window.hljs=i.A,window.jQuery=p,window.$=window.jQuery,document.addEventListener("DOMContentLoaded",(()=>{window.nb??={},(()=>{const e=(()=>{try{const e=window.sessionStorage?.getItem(f);return e?JSON.parse(e):void 0}catch(e){return}})();if(void 0!==e){const t=`${window.location.pathname}${window.location.search}${window.location.hash}`;window.history?.replaceState(e,"",t),window.sessionStorage?.removeItem(f)}})(),window.nb.history={saveState:y},[...document.querySelectorAll('[data-bs-toggle="tooltip"]')].forEach((e=>new a.Tooltip(e))),(()=>{const e=document.querySelector(".nb-sidenav-toggler");if(e){const t=D(z)??window.localStorage?.getItem(z)??"false";("true"===t&&"true"===e.getAttribute("aria-expanded")||"false"===t&&"false"===e.getAttribute("aria-expanded"))&&F(),e.addEventListener("click",F)}[...document.querySelectorAll(".nb-sidenav-list-item:not(.nb-flat)")].forEach((e=>{e.addEventListener("click",(()=>{const t=e.getAttribute("aria-controls"),n="true"===e.getAttribute("aria-expanded");e.setAttribute("aria-expanded",String(!n));const a=n=>{const{target:o}=n,r=document.getElementById(t);!e.contains(o)&&!r.contains(o)&&(e.setAttribute("aria-expanded","false"),document.removeEventListener("click",a))};n?document.removeEventListener("click",a):document.addEventListener("click",a)}))}));const t=$("#sidenav-branch-picker-select");t.on("change",(e=>e.currentTarget.form.submit())),t.on("select2:open",(()=>{document.querySelector(".select2-dropdown").setAttribute("data-bs-theme","dark"),document.querySelector(".select2-dropdown .select2-search__field").setAttribute("placeholder","Find a branch...")}))})(),(()=>{const e=(e,t)=>e.every((e=>{const n=!e.classList.contains("show");return"collapsed"===t?n:!n})),t=e=>[...document.querySelectorAll(e.dataset.nbTarget||".collapse")];document.addEventListener("click",(e=>{const n=e.target.closest('[data-nb-toggle="collapse-all"]');n&&t(n).forEach((e=>{const t=window.bootstrap.Collapse.getOrCreateInstance(e);"true"===n.getAttribute("aria-expanded")?t.hide():t.show()}))})),document.addEventListener("hidden.bs.collapse",(()=>[...document.querySelectorAll('[data-nb-toggle="collapse-all"]')].filter((n=>e(t(n),"collapsed"))).forEach((e=>{e.setAttribute("aria-expanded","false"),e.textContent="Expand All Groups"})))),document.addEventListener("shown.bs.collapse",(()=>[...document.querySelectorAll('[data-nb-toggle="collapse-all"]')].filter((n=>e(t(n),"expanded"))).forEach((e=>{e.setAttribute("aria-expanded","true"),e.textContent="Collapse All Groups"}))))})(),(()=>{const e=(e,t)=>e?.closest?.(`.${t}`),t=t=>n=>{const a=e(n.target,"nb-draggable-handle");a&&e(a,g).setAttribute("draggable",String(t))},n=t(!0),a=t(!1);document.addEventListener("mousedown",n),document.addEventListener("mouseup",a),document.addEventListener("dragstart",(t=>{const n=e(t.target,g);n&&(t.dataTransfer.clearData("text/plain"),t.dataTransfer.setData("text/plain",t.target.id),n.classList.add(h))})),document.addEventListener("dragend",(t=>{const n=e(t.target,g);n&&(n.classList.remove(h),n.setAttribute("draggable","false"))})),document.addEventListener("dragover",(t=>{e(t.target,b)&&t.preventDefault()})),document.addEventListener("drop",(t=>{const n=document.getElementById(t.dataTransfer.getData("text/plain"));if(n){t.preventDefault();const a=e(n,b),o=(()=>{const n=e(t.target,g);if(n){const{height:e,top:a}=n.getBoundingClientRect();return t.clientY<a+e/2?n:n.nextSibling}return[...a.children].find((e=>{const{left:n,right:a,top:o}=e.getBoundingClientRect();return n>t.clientX||a>=t.clientX&&o>=t.clientY}))})();o?a.insertBefore(n,o):a.append(n),n.classList.add(h)}}))})(),document.addEventListener("nb-drawer:close",(e=>w(e.target,!1))),document.addEventListener("nb-drawer:open",(e=>w(e.target,!0))),document.addEventListener("nb-drawer:toggle",(e=>w(e.target))),document.addEventListener("nb-drawer:opened",(e=>{if(e.target.id){const t={...window.history?.state,drawer:e.target.id},n=`${window.location.pathname}${window.location.search}${window.location.hash}`;window.history?.replaceState(t,"",n)}})),document.addEventListener("nb-drawer:closed",(()=>{const{drawer:e,...t}="object"==typeof window.history?.state&&null!==window.history.state?window.history.state:{},n=Object.keys(t).length>0?t:null,a=`${window.location.pathname}${window.location.search}${window.location.hash}`;window.history?.replaceState(n,"",a)})),document.addEventListener("click",(e=>{const t=e.target.closest("[data-nb-dismiss]"),n=e.target.closest("[data-nb-toggle]");if("drawer"===t?.dataset.nbDismiss){const e=t.closest(".nb-drawer");e?.dispatchEvent(new CustomEvent("nb-drawer:close",{bubbles:!0,cancelable:!0}))}else if("drawer"===n?.dataset.nbToggle){const e=document.querySelector(n.dataset.nbTarget);e?.dispatchEvent(new CustomEvent("nb-drawer:toggle",{bubbles:!0,cancelable:!0}))}})),window.history?.state?.drawer&&document.getElementById(window.history.state.drawer)?.dispatchEvent(new CustomEvent("nb-drawer:open",{bubbles:!0,cancelable:!0})),(()=>{const e=new IntersectionObserver((([e])=>e.target.classList.toggle("nb-is-pinned",e.intersectionRatio<1)),{threshold:[1]});[...document.querySelectorAll(".nb-form-sticky-footer")].forEach((t=>e.observe(t)))})(),(()=>{const e=document.getElementById("header_search");if(!e)return()=>{};const t=(()=>{try{const e=document.getElementById("nav_menu");return e?JSON.parse(e.textContent):{}}catch(e){return{}}})(),n=Object.fromEntries(Object.entries(t.tabs).flatMap((([,e])=>Object.entries(e.groups).flatMap((([,e])=>Object.entries(e.items).map((([e,t])=>[e,t]))))))),a=new RegExp(`^\\s*in\\s*:\\s*(${Object.entries(n).flatMap((([,{name:e}])=>[e,...["","_","\\-"].map((t=>e.replace(/\s+/g,t)))])).join("|")})\\s+`,"i"),o=e.querySelector("input"),r=()=>{const e=document.getElementById("search_popup");e&&(e.remove(),document.body.classList.toggle("overflow-y-hidden",!1))};document.addEventListener("keydown",(e=>{const t=e.getModifierState?.("Meta"),n=e.ctrlKey;(t||n)&&"k"===e.key?(e.preventDefault(),o.focus()):"Escape"===e.key&&r()}));o.addEventListener("focus",(()=>{const t=document.getElementById("search_popup");if(t){const e=t.querySelector("input");return e?.focus(),void e?.setSelectionRange(-1,-1)}document.body.classList.toggle("overflow-y-hidden",!0);const{left:s=0,right:i=0}=document.querySelector("main")?.getBoundingClientRect()??{},{top:l}=o.getBoundingClientRect(),d=E("span",{"aria-hidden":"true",className:"mdi mdi-magnify d-inline-flex ms-12 mt-6 pe-none position-absolute start-0 text-secondary top-0 user-select-none",style:`height: ${k}rem; width: ${k}rem;`}),c=E("span",{className:"d-inline-flex gap-6 left-0 my-6 position-absolute top-0",style:`left: ${q};`}),u=E("input",{className:"form-control w-100",name:"q",required:"true",style:`padding-inline: ${q};`,type:"search",value:o.value}),m=E("button",{className:"btn mdi mdi-close bg-transparent border-0 end-0 hstack justify-content-center me-12 mt-6 p-0 position-absolute text-secondary top-0 nb-transition-base"+(""===u.value?" invisible opacity-0":""),style:`height: ${k}rem; width: ${k}rem;`,type:"button"},E("span",{className:"visually-hidden"},"Clear"));m.addEventListener("click",(()=>{u.value="",u.dispatchEvent(new InputEvent("input")),u.focus()})),u.addEventListener("input",(()=>{const e=""===u.value;m.classList.toggle("invisible",e),m.classList.toggle("opacity-0",e)}));const p=E("input",{className:"d-none",type:"submit"}),g=E("form",{action:e.getAttribute("action"),className:"position-relative w-100",role:"search"},d,c,u,m,p);g.addEventListener("submit",(()=>{const e=g.querySelector("[data-nb-link]:last-child");e&&g.setAttribute("action",e.dataset.nbLink)}));const b=E("div"),h=E("div",{className:"mx-auto w-100",style:`max-width: ${A(720)}rem;`},g,b),v=E("div",{className:"overflow-auto pb-20 position-fixed top-0 end-0 bottom-0 start-0 nb-z-modal-backdrop",id:"search_popup",role:"dialog",style:`background-color: rgba(0, 0, 0, .5); padding-block-start: ${l}px; padding-inline-start: calc(${s}px + ${A(20)}rem); padding-inline-end: calc(100% - ${i}px + ${A(20)}rem);`},h);v.addEventListener("click",(e=>{e.target===v&&r()})),document.body.appendChild(v);const w=e=>{const t=Object.entries(n).find((([t])=>t===e))?.[1]?.name??e,a=E("button",{type:"button"},E("span",{"aria-hidden":"true",class:"mdi mdi-close"}),E("span",{class:"visually-hidden"},"Remove")),o=E("span",{className:"badge border","data-nb-link":e},`in: ${t}`,a);a.addEventListener("click",(()=>{o.remove(),u.focus()})),[...c.querySelectorAll(`[data-nb-link="${e}"]`)].forEach((e=>e.remove())),c.appendChild(o),[...c.children].slice(0,-1).forEach((e=>e.remove()))};new ResizeObserver((()=>{const{width:e}=c.getBoundingClientRect();u.style.paddingInlineStart=e?`calc(${q} + ${e}px + ${x}rem)`:q})).observe(c),u.addEventListener("input",(()=>{const e=u.value.match(a);if(e){const[t,a]=e,o=e=>e.trim().toLowerCase().replace(/\s|_|-/g,""),r=Object.entries(n).find((([,{name:e}])=>o(e)===o(a)))?.[0];r&&(u.value=u.value.replace(t,""),u.dispatchEvent(new InputEvent("input")),w(r))}})),u.addEventListener("keydown",(e=>{const t="Backspace"===e.key,n=0===u.selectionEnd&&0===u.selectionStart;t&&n&&c.querySelector(":last-child")?.remove()})),e.querySelectorAll("[data-nb-link]").forEach((e=>w(e.dataset.nbLink))),u.focus(),u.setSelectionRange(-1,-1)}))})(),window.nb.select2={initializeSelect2Fields:R,setSelect2Value:j},(()=>{const e=[...document.querySelectorAll(".nav.nav-tabs")].map((e=>{const t=new ResizeObserver((()=>(e=>{const t=e.parentNode;[...t.querySelectorAll('.nav.nav-tabs[data-clone="true"]')].forEach((e=>e.remove()));const n=e.cloneNode(!0);n.removeAttribute("id"),n.dataset.clone="true";const o=["flex-nowrap","invisible","position-absolute","z-n1"];n.classList.add(...o),e.nextSibling?t.insertBefore(n,e.nextSibling):t.appendChild(n);const r=()=>n.getBoundingClientRect().width>e.getBoundingClientRect().width;if(!r())return e.classList.remove(...J),void t.removeChild(n);const s=E("ul",{className:"dropdown-menu dropdown-menu-end"}),i=E("span",{className:"mdi mdi-menu"}),l=E("span",{className:"visually-hidden"},"Toggle Dropdown"),d=E("button",{"aria-expanded":"false",className:"btn dropdown-toggle text-secondary","data-bs-toggle":"dropdown",type:"button"},i,l),c=E("li",{className:"dropdown flex-grow-1 mb-n1 text-end"},d,s);n.appendChild(c);const u=[];for(;r();){const e=c.previousElementSibling;u.unshift(e),n.removeChild(e)}u.forEach((e=>{S(e),[...e.children].forEach((e=>{S(e,"active","disabled"),e.classList.add("dropdown-item","justify-content-between")})),s.appendChild(e)})),[...n.querySelectorAll("a")].forEach((t=>{t.addEventListener("shown.bs.tab",(()=>{const n=e.querySelector(`a[href="${t.getAttribute("href")}"]`);(a.Tab.getInstance(n)||new a.Tab(n)).show()}))})),e.classList.add(...J),n.classList.remove(...o)})(e)));return t.observe(e),t}))})(),(()=>{const e=document.getElementById(G),t=e?.querySelectorAll("button[data-nb-theme]")??[];K(Y()),window.matchMedia(`(prefers-color-scheme: ${U})`).addEventListener("change",(()=>K(Y())));const n=e=>K(e.currentTarget.dataset.nbTheme,{manual:!0});t.forEach((e=>e.addEventListener("click",n)))})(),window.toggleFavorite=(e,t)=>{t.detail.successful&&e.classList.toggle("active")},window.setRequestUrl=(e,t)=>{const n=e.classList.contains("active");t.detail.path=n?e.dataset.deleteUrl:e.dataset.addUrl},document.querySelectorAll('a[data-bs-toggle="tooltip"], div[data-bs-toggle="tooltip"] > a').forEach((e=>{e.addEventListener("click",(()=>{e.blur()}))})),document.addEventListener("hidden.bs.modal",(()=>{document.querySelectorAll('[data-bs-toggle="tooltip"] > a').forEach((e=>{e.blur()}))}))}))}},n={};function a(e){var o=n[e];if(void 0!==o)return o.exports;var r=n[e]={exports:{}};return t[e].call(r.exports,r,r.exports,a),r.exports}a.m=t,e=[],a.O=(t,n,o,r)=>{if(!n){var s=1/0;for(c=0;c<e.length;c++){for(var[n,o,r]=e[c],i=!0,l=0;l<n.length;l++)(!1&r||s>=r)&&Object.keys(a.O).every((e=>a.O[e](n[l])))?n.splice(l--,1):(i=!1,r<s&&(s=r));if(i){e.splice(c--,1);var d=o();void 0!==d&&(t=d)}}return t}r=r||0;for(var c=e.length;c>0&&e[c-1][2]>r;c--)e[c]=e[c-1];e[c]=[n,o,r]},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={825:0};a.O.j=t=>0===e[t];var t=(t,n)=>{var o,r,[s,i,l]=n,d=0;if(s.some((t=>0!==e[t]))){for(o in i)a.o(i,o)&&(a.m[o]=i[o]);if(l)var c=l(a)}for(t&&t(n);d<s.length;d++)r=s[d],a.o(e,r)&&e[r]&&e[r][0](),e[r]=0;return a.O(c)},n=self.webpackChunknautobot=self.webpackChunknautobot||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})();var o=a.O(void 0,[68],(()=>a(226)));o=a.O(o)})();
|
|
2
|
+
//# sourceMappingURL=nautobot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js/nautobot.js","mappings":"uBAAIA,E,4ICcG,MCdDC,EAAkB,eAClBC,EAA4B,yBAE5BC,EAAiB,cCFjBC,EAAoB,iBAQpBC,EAAe,CAACC,EAAQC,KAC5B,IAAKD,EACH,OAGFA,EAAOE,UAAUC,OAAOL,EAAmBG,GAE3C,MAAMG,EAASJ,EAAOE,UAAUG,SAASP,GAEzCE,EAAOM,aAAa,cAAeF,EAAS,QAAU,QAEtD,MAAMG,EAAgB,IAAIC,SAASC,iBAAiB,8CAA8CT,EAAOU,SASzG,GARAH,EAAcI,SAASC,GAAiBA,EAAaN,aAAa,gBAAiBF,EAAS,OAAS,WAQjGA,EAGF,IADoBI,SAASK,uBAAuBf,IAEjDgB,QAAQC,GAAeA,IAAef,IACtCW,SAASI,GAAehB,EAAagB,GAAY,KAEpD,MACE,IAAIC,EAAsB,IAG1BC,OAAOC,uBAAsB,SAASC,IACmC,YAA/CF,OAAOG,iBAAiBpB,GAAQqB,WAGtDrB,EAAOsB,QACEN,EAAsB,IAC/BA,GAAuB,EACvBC,OAAOC,sBAAsBC,GAEjC,GACD,EAdD,QAeK,GAAInB,EAAOK,SAASG,SAASe,eAAgB,CAClD,MAAMC,EAAoBjB,EAAc,IAAMC,SAASiB,cAAc,QACrED,GAAmBF,MAAM,CAAEI,eAAe,GAC5C,CAEA,MAAMC,EAAQvB,EAAS,mBAAqB,mBAC5CJ,EAAO4B,cAAc,IAAIC,YAAYF,EAAO,CAAEG,SAAS,EAAMC,YAAY,IAAQ,ECzD7EC,EAAsB,eA4CfC,EAAaC,IACxB,MAAMC,OAAwBC,IAAVF,EAAsBjB,OAAOoB,SAASH,MAAQA,OAE9CE,IAAhBD,GACFlB,OAAOqB,gBAAgBC,QAAQP,EAAqBQ,KAAKC,UAAUN,GACrE,ECnCWO,EAAgB,CAACC,EAAKC,EAAa,CAAC,KAAMC,KACrD,MAAMC,EAAUtC,SAASkC,cAAcC,GAUvC,OARAI,OAAOC,QAAQJ,GAAYjC,SAAQ,EAAEsC,EAAWC,KAC9CJ,EAAQxC,aAA2B,cAAd2C,EAA4B,QAAUA,EAAWC,KAGxEL,EAASlC,SAASwC,GACC,iBAAVA,EAAqBL,EAAQM,mBAAmB,YAAaD,GAASL,EAAQO,YAAYF,KAG5FL,CAAO,EAYHQ,EAAuB,CAACR,KAAYS,IAC/C,IAAIT,EAAQ5C,UAAU8C,WACnBlC,QAAO,EAAE,CAAE0C,MAAgBD,EAAOE,SAASD,KAC3C7C,SAAQ,EAAE,CAAE6C,KAAeV,EAAQ5C,UAAUwD,OAAOF,KAU5CG,EAAOC,IAClB,MAAMC,EAAe5C,OAAOG,iBAAiBZ,SAASsD,iBAAiBC,SACvE,OAAOH,EAAKI,SAASH,EAAc,GAAG,EClDlCI,EAAyBN,EAAI,IAC7BO,EAAMP,EAAI,GACVQ,EAAYR,EAAI,IAEhBS,EAA8B,GAAGH,EAAyBE,EAAYD,O,aCE5E,MAAMG,EAAcvB,GAAaA,aAAmBwB,UAAYxB,aAAmByB,QAAUzB,EAAUA,EAAQ,GAgBlG0B,EAAkB,CAACC,EAASvB,KACvCwB,EAAED,GAASE,IAAI,OAEdzB,GAAS,IAAIvC,SAASiC,IACrB,IAAK6B,EAAQhD,cAAc,iBAAiBmB,EAAWM,WAAY,CACjE,MAAM0B,EAASpE,SAASkC,cAAc,UACtCkC,EAAOC,UAAYjC,EAAWkC,KAC9BF,EAAOtE,aAAa,WAAY,QAChCsE,EAAOtE,aAAa,QAASsC,EAAWM,OACxCuB,EAAQpB,YAAYuB,EACtB,KAGF,MAAMG,EACA7B,EAAM8B,OAAS,EACwC,OAAtCP,GAASQ,aAAa,YACrB/B,EAAMgC,KAAKtC,GAAeA,EAAWM,QAASA,IAAQ,IAAIA,MAGzE,KAGTwB,EAAED,GAASE,IAAII,GAAWI,QAAQ,SAAS,EAiCvCC,EAAoB,CAACC,EAASC,EAAUC,IAC5C,IAAIlB,EAAWgB,GAAS5E,iBAAiB6E,IAAW3E,SAASmC,GAC3D4B,EAAE5B,GAAS2B,QAAQ,CACjBe,YAAY,EACZC,YAAa3C,EAAQmC,aAAa,gBAAkB,YACpDS,kBAAmB,iBACnBC,MAAO,cACPC,MAAO,SACJL,MAIHM,EAAwB,CAACR,EAASS,EAAiB,QAEvD,MAAMC,EAAuB,CAACC,EAAMC,KAC9BD,EAAKlD,SAEkBuB,EAAW4B,GACnB3F,aAAa,QAAS0F,EAAKlD,QAAQmC,aAAa,UAG5De,EAAKlB,MAGdM,EAAkBC,EAAS,iCAAkC,CAC3DS,iBACAI,eAAgBH,EAChBI,kBAAmBJ,GACnB,EAGEK,EAAmC,CAACf,EAASS,EAAiB,QAClEV,EAAkBC,EAAS,wBAAyB,CAClDgB,KAAM,CACJL,KAAM,SAAcM,GAClB,MAAOxD,GAAWyD,KAGZC,EAA6B,IAAnBF,EAAOG,KAAO,IAAW,EAInCC,EAAIJ,EAAOK,KAGXC,EAAe9D,EAAQmC,aAAa,iBAAmB,IAGvD4B,EAAc/D,EAAQmC,aAAa,oBAGnC6B,EAAQ9C,SAASlB,EAAQmC,aAAa,cAAe,KAAO,EAG5D8B,EAAejE,EAAQmC,aAAa,oBAGpC+B,EAAyBjE,OAAOkE,YACpC,IAAInE,EAAQF,YACT9B,QAAQmC,GAAcA,EAAUiE,KAAKzD,SAAS,uBAC9C0D,SAASlE,IACR,MAAO,CAAEmE,GAAcnE,EAAUiE,KAAKG,MAAM,qBAW5C,MATe,MACb,IACE,OAAO7E,KAAK8E,MAAMrE,EAAUC,MAE9B,CAAE,MAAOqE,GACP,MAAO,EACT,CACD,EAPc,GASDJ,SAASjE,IACrB,MAAMsE,EAAgBtE,EAAMuE,WAAW,KAGjCC,EAAYF,EACd,MACE,MAAMN,EAAOhE,EAAMyE,MAAM,GAEzB,GAAI7E,EAAQpC,GAAG+C,SAAS,YAAa,CACnC,MAAOmE,GAAa9E,EAAQpC,GAAGmH,MAAM,mBAAoB,IACzD,OAAOrH,SAASiB,cAAc,IAAImG,IAAYV,IAChD,CAMA,OAAIpE,EAAQgF,QAAQ,OAAO5H,UAAUG,SAAS,mBACrCyC,EAAQgF,QAAQ,MAAMrG,cAAc,eAAeyF,OAGrD1G,SAASiB,cAAc,OAAOyF,IACtC,EAjBD,GAkBA,KAEEa,EAAkBL,EACpB,MACE,MAAMM,GAnKVC,EAmKiCP,EAlKZ,OAArCO,GAAQhD,aAAa,YAAuBgD,GAAQ/E,MAAQ,IAAI+E,EAAOC,iBAAiBhD,KAAKN,GAAWA,EAAO1B,SADhG,IAAC+E,EAoKI,MAAME,EAAQlH,OAAOG,iBAAiBsG,GAEtC,OAAIM,GAAiC,MAAlBG,EAAMC,SAAwC,WAArBD,EAAM9G,WACzC2G,EAGLN,EAAUzC,aAAa,aAAeyC,EAAUzC,aAAa,oBACxD,YADT,CAKD,EAbD,GAcA,KAGJ,OAAOoD,OADab,EAAgBO,EAAkB7E,GAElD,CAAC,CAACkE,EAAYW,GAAmB7E,IACjC,EAAE,GACN,KAIFoF,EAAa,CACjBxB,MAAOyB,OAAOzB,GACd0B,MAAOD,OAnFK,IAoFZ/B,OAAQ+B,OAAO/B,MACXK,EAAc,CAAEA,oBAAgBzE,KAChC2E,EAAe,CAAEA,qBAAiB3E,KAClCsE,EAAI,CAAE,CAACE,GAAeF,QAAMtE,KAC7B4E,GAIL,OAAO,IAAIyB,gBAAgBH,GAAYI,UACzC,EACAC,MAAO,IACPC,eAAgB,SAAwB5C,GACtC,MAAOlD,GAAWyD,KAAKsC,SACvB,IAAI/F,EAAQrC,iBAAiB,WAAWE,SAASwC,GAAUA,EAAM2F,gBAAgB,cAEjF,MAAMC,EAAU,IAEVjG,EAAQmC,aAAa,qBAAyC,OAAlBe,EAAKgD,SACjD,CAAC,CAAEtI,GAAI,OAAQoE,KAAMhC,EAAQmC,aAAa,sBAC1C,MACDlC,OAAOkG,OACRjD,EAAK+C,QAAQG,QAAO,CAACC,EAAaC,EAAQC,KAExC,MAAMC,EAAWC,QAAQH,IAAStG,EAAQmC,aAAa,wBACjDvE,EAAK,EAAI0I,EAAQtG,EAAQmC,aAAa,iBAAmBmE,EAAO1I,GAChEoE,EAAO,EAAIsE,EAAQtG,EAAQmC,aAAa,mBAAqBmE,EAAOlC,KAEpEsC,EAAO,IAAKJ,EAAQE,WAAU5I,KAAIoE,SAClC,MAAE2E,EAAK,KAAEC,EAAI,IAAEC,GAAQH,EAOvBI,EAA0BL,QAAQI,GAAKlG,SAAS,mBAEhDoG,EAAa,MACjB,QAAQ,GACN,KAAKJ,eAAyCC,EAC5C,MAAO,CAAEI,SAAU,GAAGJ,EAAKxC,QAAQuC,EAAMvC,OAAQpC,KAAM,GAAG4E,EAAKxC,UAAUuC,EAAMvC,QAEjF,KAAKuC,QACH,MAAO,CAAEK,SAAUL,EAAMvC,KAAMpC,KAAM2E,EAAMvC,MAE7C,KAAKwC,QACH,MAAO,CAAEI,SAAUJ,EAAKxC,KAAMpC,KAAM4E,EAAKxC,MAE3C,KAAe,OAAVuC,GAA2B,OAATC,EACrB,MAAO,CAAEI,SAAU,SAAUhF,KAAM,UAErC,QACE,OAEL,EAjBkB,GAmBnB,MAAO,IACFqE,KACCU,EACA,CACE,CAACA,EAAWC,UAAW,IAClBX,EAAYU,EAAWC,aACtBX,EAAYU,EAAWC,eAAY1H,EAAY,CAAE0C,KAAM+E,EAAW/E,MACtEjC,SAAU+G,OACNxH,EACA,IAAK+G,EAAYU,EAAWC,WAAWjH,UAAY,GAAK2G,KAGhE,CAAE,CAACH,GAAQG,GAChB,GACA,CAAC,KAMR,MAAO,CAAEO,WAAY,CAAEC,KADa,OAAdhE,EAAKiE,MACmBlB,UAChD,EACAY,IAAK,WACH,MAAO7G,GAAWyD,KACZ2D,EAtOG,CAACP,IAChB,MAAMQ,EAAe,mBAErB,IAAItC,EACAuC,EAAeT,EAEnB,KAAQ9B,EAAQsC,EAAaE,KAAKV,IAAO,CACvC,MAAMW,EAAe9J,SAASiB,cAAc,OAAOoG,EAAM,MACnD0C,EAAmBD,GAAcpC,kBAAkB,IAAIjD,aAAa,aACpEuF,EACJD,GAAoBD,EAAapH,QAAUoH,EAAarF,aAAa,oBAAsB,YAAS7C,GAEtGgI,EAAeI,EAAUJ,EAAaI,QAAQ3C,EAAM,GAAI2C,GAAWJ,CACrE,CAEA,OAAOA,CAAY,EAuNGK,CAAS3H,EAAQmC,aAAa,aAG9C,OAAQiF,EAAQzG,SAAS,OAASyG,CACpC,GAEFpE,kBACA,EAGE4E,EAA2B,CAACrF,EAASS,EAAiB,OAC1DV,EAAkBC,EAAS,qCAAsC,CAC/DS,iBACA6E,SAAU,CAAEC,UAAW,IAAM,yCAC7BC,UAAU,EACVC,MAAM,IAGJC,EAAkC,CAAC1F,EAASS,EAAiB,OACjEV,EAAkBC,EAAS,2BAA4B,CAAES,mBAE9CkF,EAA2B3F,IACtCQ,EAAsBR,GACtBe,EAAiCf,GACjCqF,EAAyBrF,GACzB0F,EAAgC1F,GAEhC,IAAIhB,EAAWgB,GAAS5E,iBAAiB,WAAWE,SAASsK,IAC3DpF,EAAsBoF,EAAOA,GAC7B7E,EAAiC6E,EAAOA,GACxCP,EAAyBO,EAAOA,GAChCF,EAAgCE,EAAOA,EAAM,GAC7C,ECvTSC,EAAahE,GACxB1G,SAAS2K,OACN9D,MAAM,MACN+D,MAAMD,GAAWA,EAAO1D,WAAW,GAAGP,SACrCG,MAAM,KAAK,GASJgE,EAAY,CAACnE,EAAMhE,EAAOqC,KACrC,MAAM+F,EAAa,CAAE,CAACpE,GAAOhE,EAAOqI,KAAM,OAAQhG,GAClD/E,SAAS2K,OAASpI,OAAOC,QAAQsI,GAC9BpG,KAAKsG,GAAUA,EAAMC,KAAK,OAC1BA,KAAK,IAAI,EAQDC,EAAgBxE,GAASmE,EAAUnE,EAAM,GAAI,CAAEyE,QAAS,kCC5B/DC,EAAwB,oBAMjBC,EAAgB,KAC3B,MAAMC,EAAUtL,SAASiB,cAAc,uBAEjCsK,EAAWD,EAAQ7G,aAAa,iBAChC+G,EAAqD,SAA1CF,EAAQ7G,aAAa,iBAEtC6G,EAAQxL,aAAa,gBAAiBiI,QAAQyD,IAE9BxL,SAASyL,eAAeF,GAChC7L,UAAUC,OAAO,uBAAwB6L,GAE7CA,GACFX,EAAUO,EAAuB,QACjC3K,OAAOiL,cAAc3J,QAAQqJ,EAAuB,UAEpDF,EAAaE,GACb3K,OAAOiL,cAAcC,WAAWP,GAClC,ECtBIQ,EAAsB,CAAC,YAAa,qBCDpCC,EAAiB,cAEjBC,EAAa,OACbC,EAAc,QACdC,EAAe,SAcfC,EAAgB9G,GAAUA,IAAU2G,GAAc3G,IAAU4G,GAAe5G,IAAU6G,EAOrFE,EAAc,KAClB,MAAMC,EAAczB,EAAU,SAC9B,GAAIuB,EAAaE,GACf,OAAOA,EAGT,MAAMC,EAAoB3L,OAAOiL,cAAcW,QAAQ,SACvD,OAAIJ,EAAaG,GACRA,EAGFJ,CAAY,EASfM,EAAW,CAACnH,EAAOJ,KACvB,MAAMwH,EAAWxD,QAAQhE,GAASyH,QAE5B/B,EAAQzK,SAASyL,eAAeI,IACtBpB,GAAOxK,iBAAiB,0BAA4B,IAE5DE,SAASsM,GACf,CAAC,SAAU,kBAAkBtM,SAAS6C,GACpCyJ,EAAO/M,UAAUC,OAAOqD,EAAWyJ,EAAOC,QAAQC,UAAYxH,OAIlE,MAAMyH,EAAUzH,IAAU6G,EA9C1BvL,OAAOoM,aAAa,0BAA0Bf,MAAegB,QAAUhB,EAAaC,EA8Cf5G,EACrEnF,SAASsD,gBAAgBoJ,QAAQvH,MAAQyH,EACzC5M,SAASsD,gBAAgBoJ,QAAQE,QAAUA,EAEvCzH,IAAU6G,GACZd,EAAa,SACbzK,OAAOiL,cAAcC,WAAW,UACvBY,IACT1B,EAAU,QAAS1F,GACnB1E,OAAOiL,cAAc3J,QAAQ,QAASoD,KAGpCA,IAAU2G,GAAe3G,IAAU6G,GAAgBY,IAAYd,IACjE,IAAI9L,SAAS+M,qBAAqB,WAAW5M,SAAS6M,IACpDA,EAAOC,iBAAiB,QAAS9L,IAC3BA,EAAM+L,OAAOC,iBAKf,IAJehM,EAAM+L,OAAOC,gBAAgBJ,qBAAqB,YAC7C5L,EAAM+L,OAAOC,gBAAgB9M,uBAAuB,4BACrDc,EAAM+L,OAAOC,gBAAgB9M,uBAAuB,yBAE5BF,SAASiN,GAClDA,EAAWtN,aAAa,SAAU,yBAEtC,GACA,IAIFyM,GACFvM,SAASqN,SAASC,QACpB,ECpFF7M,OAAO8M,UAAY,EAGnB9M,OAAO+M,YAAc,EAGrB/M,OAAOgN,QAAUA,EAGjBhN,OAAOiN,UAAY,IAUnBjN,OAAOkN,KAAO,IAEd,IAAKC,iBAAiB,UAAWC,EAAA,GACjC,IAAKD,iBAAiB,OAAQE,EAAA,GAC9B,IAAKF,iBAAiB,MAAOG,EAAA,GAC7B,IAAKH,iBAAiB,OAAQI,EAAA,GAC9BvN,OAAOwN,KAAO,IAGdxN,OAAOyN,OAAS,EAChBzN,OAAOyD,EAAIzD,OAAOyN,OAgBlBlO,SAASiN,iBAAiB,oBAAoB,KAC5CxM,OAAO0N,KAAO,CAAC,ERtCQ,MACvB,MAAMzM,EAAQ,MACZ,IACE,MAAMsH,EAAOvI,OAAOqB,gBAAgBuK,QAAQ7K,GAC5C,OAAOwH,EAAOhH,KAAK8E,MAAMkC,QAAQpH,CAEnC,CAAE,MAAOmF,GACP,MACF,CACD,EARa,GAUd,QAAcnF,IAAVF,EAAqB,CACvB,MAAMyH,EAAM,GAAG1I,OAAO4M,SAASe,WAAW3N,OAAO4M,SAASgB,SAAS5N,OAAO4M,SAASiB,OACnF7N,OAAOoB,SAAS0M,aAAa7M,EAAO,GAAIyH,GACxC1I,OAAOqB,gBAAgB6J,WAAWnK,EACpC,GQ0BAgN,GACA/N,OAAO0N,GAAGtM,QAAU,CAAEJ,UAAS,GAG/B,IAAIzB,SAASC,iBAAiB,+BAA+BE,SAASsO,GAAY,IAAI,UAAkBA,KH1BzE,MAC/B,MAAMnD,EAAUtL,SAASiB,cAAc,uBAEvC,GAAIqK,EAAS,CAKX,MAAMoD,EACJhE,EAAUU,IAA0B3K,OAAOiL,cAAcW,QAAQjB,IAA0B,SAEzD,SAAjCsD,GAAqF,SAA1CpD,EAAQ7G,aAAa,kBAC/B,UAAjCiK,GAAsF,UAA1CpD,EAAQ7G,aAAa,mBAElE4G,IAGFC,EAAQ2B,iBAAiB,QAAS5B,EACpC,CAEA,IAAIrL,SAASC,iBAAiB,wCAAwCE,SAASwO,IAC7EA,EAAgB1B,iBAAiB,SAAS,KACxC,MAAM1B,EAAWoD,EAAgBlK,aAAa,iBACxC+G,EAA6D,SAAlDmD,EAAgBlK,aAAa,iBAE9CkK,EAAgB7O,aAAa,gBAAiBiI,QAAQyD,IAEtD,MAAMoD,EAAmBC,IACvB,MAAQ3B,OAAQ4B,GAAwBD,EAClCE,EAAgB/O,SAASyL,eAAeF,IAG3CoD,EAAgB9O,SAASiP,KAAyBC,EAAclP,SAASiP,KAG1EH,EAAgB7O,aAAa,gBAAiB,SAC9CE,SAASgP,oBAAoB,QAASJ,GACxC,EAGEpD,EACFxL,SAASgP,oBAAoB,QAASJ,GAEtC5O,SAASiN,iBAAiB,QAAS2B,EACrC,GACA,IAGJ,MAAMK,EAA4B/K,EAAE,iCACpC+K,EAA0BC,GAAG,UAAW/N,GAAUA,EAAMgO,cAAcC,KAAKC,WAC3EJ,EAA0BC,GAAG,gBAAgB,KAC3ClP,SAASiB,cAAc,qBAAqBnB,aAAa,gBAAiB,QAC1EE,SAASiB,cAAc,4CAA4CnB,aAAa,cAAe,mBAAmB,GAClH,EGxBFwP,GX/CyC,MACzC,MAAMC,EAAS,CAACC,EAAkBC,IAChCD,EAAiBE,OAAOpN,IACtB,MAAMqN,GAAerN,EAAQ5C,UAAUG,SAAS,QAChD,MAA+B,cAAxB4P,EAAsCE,GAAeA,CAAW,IAGrEC,EAA+BC,GAAsB,IACtD7P,SAASC,iBAAiB4P,EAAkBnD,QAAQoD,UAAY,cAqCrE9P,SAASiN,iBAAiB,SAlCT9L,IACf,MAAM0O,EAAoB1O,EAAM+L,OAAO5F,QAAQ,mCAE3CuI,GACFD,EAA4BC,GAAmB1P,SAAS4P,IACtD,MAAMC,EAAmBvP,OAAO8M,UAAU0C,SAASC,oBAAoBH,GACI,SAApDF,EAAkBpL,aAAa,iBAGpDuL,EAAiBG,OAEjBH,EAAiBI,MACnB,GAEJ,IAqBFpQ,SAASiN,iBAAiB,sBAlBC,IACzB,IAAIjN,SAASC,iBAAiB,oCAC3BK,QAAQuP,GAAsBN,EAAOK,EAA4BC,GAAoB,eACrF1P,SAAS0P,IACRA,EAAkB/P,aAAa,gBAAiB,SAChD+P,EAAkBQ,YAAc,mBAAmB,MAczDrQ,SAASiN,iBAAiB,qBAXA,IACxB,IAAIjN,SAASC,iBAAiB,oCAC3BK,QAAQuP,GAAsBN,EAAOK,EAA4BC,GAAoB,cACrF1P,SAAS0P,IACRA,EAAkB/P,aAAa,gBAAiB,QAChD+P,EAAkBQ,YAAc,qBAAqB,KAY1D,EWHDC,GV3DiC,MACjC,MAAMhJ,EAAU,CAAChF,EAASU,IAAcV,GAASgF,UAAU,IAAItE,KAEzDuN,EAA+BC,GAAiBrP,IACpD,MAAMsP,EAASnJ,EAAQnG,EAAM+L,OAPF,uBAQvBuD,GACgBnJ,EAAQmJ,EAAQtR,GACxBW,aAAa,YAAaiI,OAAOyI,GAC7C,EAGIE,EAAcH,GAA4B,GAC1CI,EAAYJ,GAA4B,GA6E9CvQ,SAASiN,iBAAiB,YAAayD,GACvC1Q,SAASiN,iBAAiB,UAAW0D,GACrC3Q,SAASiN,iBAAiB,aA7EL9L,IACnB,MAAMyP,EAAYtJ,EAAQnG,EAAM+L,OAAQ/N,GACpCyR,IACFzP,EAAM0P,aAAaC,UAAU,cAC7B3P,EAAM0P,aAAaE,QAAQ,aAAc5P,EAAM+L,OAAOhN,IACtD0Q,EAAUlR,UAAUsR,IAAI3R,GAC1B,IAwEFW,SAASiN,iBAAiB,WArEP9L,IACjB,MAAMyP,EAAYtJ,EAAQnG,EAAM+L,OAAQ/N,GACpCyR,IACFA,EAAUlR,UAAUwD,OAAO7D,GAC3BuR,EAAU9Q,aAAa,YAAa,SACtC,IAiEFE,SAASiN,iBAAiB,YA9DN9L,IACSmG,EAAQnG,EAAM+L,OAAQ9N,IAE/C+B,EAAM8P,gBACR,IA2DFjR,SAASiN,iBAAiB,QAxDV9L,IACd,MAAMyP,EAAY5Q,SAASyL,eAAetK,EAAM0P,aAAaK,QAAQ,eACrE,GAAIN,EAAW,CACbzP,EAAM8P,iBAEN,MAAMxL,EAAY6B,EAAQsJ,EAAWxR,GAE/B+R,EAAe,MAEnB,MAAMC,EAAgB9J,EAAQnG,EAAM+L,OAAQ/N,GAC5C,GAAIiS,EAAe,CAMjB,MAAM,OAAEC,EAAM,IAAEC,GAAQF,EAAcG,wBAEtC,OADkBpQ,EAAMqQ,QAAUF,EAAMD,EAAS,EAC9BD,EAAgBA,EAAcK,WACnD,CAGA,MAAO,IAAIhM,EAAUpD,UAAUuI,MAAMjI,IACnC,MAAM,KAAE+O,EAAI,MAAEC,EAAK,IAAEL,GAAQ3O,EAAM4O,wBAEnC,OAAIG,EAAOvQ,EAAMyQ,SAGND,GAASxQ,EAAMyQ,SAEpBN,GAAOnQ,EAAMqQ,OAKP,GAEf,EA9BoB,GAgCjBL,EACF1L,EAAU0L,aAAaP,EAAWO,GAGlC1L,EAAUoM,OAAOjB,GAGnBA,EAAUlR,UAAUsR,IAAI3R,EAC1B,IASuC,EUhCzCyS,GTDA9R,SAASiN,iBAAiB,mBAAoB9L,GAAU5B,EAAa4B,EAAM+L,QAAQ,KACnFlN,SAASiN,iBAAiB,kBAAmB9L,GAAU5B,EAAa4B,EAAM+L,QAAQ,KAClFlN,SAASiN,iBAAiB,oBAAqB9L,GAAU5B,EAAa4B,EAAM+L,UAE5ElN,SAASiN,iBAAiB,oBAAqB9L,IAC7C,GAAIA,EAAM+L,OAAOhN,GAAI,CACnB,MAAM6R,EAAY,IAAKtR,OAAOoB,SAASH,MAAOlC,OAAQ2B,EAAM+L,OAAOhN,IAC7DiJ,EAAM,GAAG1I,OAAO4M,SAASe,WAAW3N,OAAO4M,SAASgB,SAAS5N,OAAO4M,SAASiB,OACnF7N,OAAOoB,SAAS0M,aAAawD,EAAW,GAAI5I,EAC9C,KAGFnJ,SAASiN,iBAAiB,oBAAoB,KAE5C,MAAM,OAAEzN,KAAWwS,GACgB,iBAA1BvR,OAAOoB,SAASH,OAA+C,OAAzBjB,OAAOoB,QAAQH,MAAiBjB,OAAOoB,QAAQH,MAAQ,CAAC,EACjGqQ,EAAYxP,OAAO0P,KAAKD,GAAWxN,OAAS,EAAIwN,EAAY,KAC5D7I,EAAM,GAAG1I,OAAO4M,SAASe,WAAW3N,OAAO4M,SAASgB,SAAS5N,OAAO4M,SAASiB,OACnF7N,OAAOoB,SAAS0M,aAAawD,EAAW,GAAI5I,EAAI,IAGlDnJ,SAASiN,iBAAiB,SAAU9L,IAClC,MAAM+Q,EAAU/Q,EAAM+L,OAAO5F,QAAQ,qBAC/B3H,EAASwB,EAAM+L,OAAO5F,QAAQ,oBAEpC,GAAmC,WAA/B4K,GAASxF,QAAQyF,UAAwB,CAC3C,MAAM3S,EAAS0S,EAAQ5K,QAAQ,cAC/B9H,GAAQ4B,cAAc,IAAIC,YAAY,kBAAmB,CAAEC,SAAS,EAAMC,YAAY,IACxF,MAAO,GAAiC,WAA7B5B,GAAQ+M,QAAQ0F,SAAuB,CAChD,MAAM5S,EAASQ,SAASiB,cAActB,EAAO+M,QAAQoD,UACrDtQ,GAAQ4B,cAAc,IAAIC,YAAY,mBAAoB,CAAEC,SAAS,EAAMC,YAAY,IACzF,KAGEd,OAAOoB,SAASH,OAAOlC,QACzBQ,SACGyL,eAAehL,OAAOoB,QAAQH,MAAMlC,SACnC4B,cAAc,IAAIC,YAAY,iBAAkB,CAAEC,SAAS,EAAMC,YAAY,KU9F7C,MAEtC,MAAM8Q,EAAuB,IAAIC,sBAC/B,EAAEtH,KAAWA,EAAMkC,OAAOxN,UAAUC,OAAO,eAAgBqL,EAAMuH,kBAAoB,IACrF,CAAEC,UAAW,CAAC,KAGU,IAAIxS,SAASC,iBAAiB,2BACtCE,SAASsS,GAAqBJ,EAAqBK,QAAQD,IAI5E,EDqDDE,GNhE8B,MAC9B,MAAMC,EAAe5S,SAASyL,eAAe,iBAG7C,IAAKmH,EACH,MAAO,OAGT,MAAMC,EAAW,MACf,IACE,MAAMC,EAAU9S,SAASyL,eAAe,YACxC,OAAOqH,EAAU9Q,KAAK8E,MAAMgM,EAAQzC,aAAe,CAAC,CAEtD,CAAE,MAAOtJ,GACP,MAAO,CAAC,CACV,CACD,EARgB,GAcXgM,EAAoBxQ,OAAOkE,YAC/BlE,OAAOC,QAAQqQ,EAASG,MAAMrM,SAAQ,EAAE,CAAEsM,KACxC1Q,OAAOC,QAAQyQ,EAAYC,QAAQvM,SAAQ,EAAE,CAAEwM,KAC7C5Q,OAAOC,QAAQ2Q,EAAcC,OAAO1O,KAAI,EAAE2O,EAAWC,KAAkB,CAACD,EAAWC,UAKnFC,EAAgB,IAAIC,OACxB,oBAAoBjR,OAAOC,QAAQuQ,GAEhCpM,SAAQ,EAAE,EAAID,WAAY,CAACA,KAAS,CAAC,GAAI,IAAK,OAAOhC,KAAK+O,GAAc/M,EAAKsD,QAAQ,OAAQyJ,QAC7FxI,KAAK,YACR,KAGIyI,EAAoBd,EAAa3R,cAAc,SAE/C0S,EAAmB,KACvB,MAAMC,EAAc5T,SAASyL,eAAe,gBAExCmI,IACFA,EAAY1Q,SACZlD,SAAS6T,KAAKnU,UAAUC,OAAO,qBAAqB,GACtD,EAgBFK,SAASiN,iBAAiB,WAZP9L,IACjB,MAAM2S,EAAe3S,EAAM4S,mBAAmB,QACxCC,EAAgB7S,EAAM8S,SAEvBH,GAAgBE,IAAgC,MAAd7S,EAAM+S,KAC3C/S,EAAM8P,iBACNyC,EAAkB5S,SACK,WAAdK,EAAM+S,KACfP,GACF,IAqMFD,EAAkBzG,iBAAiB,SAhMX,KACtB,MAAM2G,EAAc5T,SAASyL,eAAe,gBAG5C,GAAImI,EAAa,CACf,MAAMO,EAAQP,EAAY3S,cAAc,SAGxC,OAFAkT,GAAOrT,aACPqT,GAAOC,mBAAmB,GAAI,EAEhC,CAEApU,SAAS6T,KAAKnU,UAAUC,OAAO,qBAAqB,GAEpD,MAAQ+R,KAAM2C,EAAW,EAAG1C,MAAO2C,EAAY,GAAMtU,SAASiB,cAAc,SAASsQ,yBAA2B,CAAC,GACzGD,IAAKiD,GAAyBb,EAAkBnC,wBAElDiD,EAAOtS,EAAc,OAAQ,CACjC,cAAe,OACfc,UACE,mHACF2E,MAAO,WAAWhE,gBAAwBA,UAGtC8Q,EAASvS,EAAc,OAAQ,CACnCc,UAAW,0DACX2E,MAAO,SAAS/D,OAGZuQ,EAAQjS,EAAc,QAAS,CACnCc,UAAW,qBACX0D,KAAM,IACNgO,SAAU,OACV/M,MAAO,mBAAmB/D,KAC1B+Q,KAAM,SACNjS,MAAOgR,EAAkBhR,QAGrBkS,EAAQ1S,EACZ,SACA,CACEc,UAAW,0JAAyK,KAAhBmR,EAAMzR,MAAe,uBAAyB,IAClNiF,MAAO,WAAWhE,gBAAwBA,QAC1CgR,KAAM,UAERzS,EAAc,OAAQ,CAAEc,UAAW,mBAAqB,UAG1D4R,EAAM3H,iBAAiB,SAAS,KAC9BkH,EAAMzR,MAAQ,GACdyR,EAAM/S,cAAc,IAAIyT,WAAW,UACnCV,EAAMrT,OAAO,IAGfqT,EAAMlH,iBAAiB,SAAS,KAC9B,MAAM6H,EAAkC,KAAhBX,EAAMzR,MAC9BkS,EAAMlV,UAAUC,OAAO,YAAamV,GACpCF,EAAMlV,UAAUC,OAAO,YAAamV,EAAgB,IAGtD,MAAMzF,EAASnN,EAAc,QAAS,CAAEc,UAAW,SAAU2R,KAAM,WAE7DvF,EAAOlN,EACX,OACA,CAAE6S,OAAQnC,EAAanO,aAAa,UAAWzB,UAAW,0BAA2BgS,KAAM,UAC3FR,EACAC,EACAN,EACAS,EACAvF,GAIFD,EAAKnC,iBAAiB,UAAU,KAC9B,MAAMgI,EAAQ7F,EAAKnO,cAAc,6BAE7BgU,GACF7F,EAAKtP,aAAa,SAAUmV,EAAMvI,QAAQwI,OAC5C,IAGF,MAAM3M,EAAUrG,EAAc,OAExBiT,EAAQjT,EACZ,MACA,CAAEc,UAAW,gBAAiB2E,MAAO,cAAcxE,EAAI,YACvDiM,EACA7G,GAGI6M,EAAUlT,EACd,MACA,CACEc,UAAW,sFACX9C,GAAI,eACJ8U,KAAM,SACNrN,MAAO,6DAA6D4M,mCAAsDF,SAAgBlR,EAAI,4CAA4CmR,SAAiBnR,EAAI,YAEjNgS,GAIFC,EAAQnI,iBAAiB,SAAU9L,IAC7BA,EAAM+L,SAAWkI,GACnBzB,GACF,IAGF3T,SAAS6T,KAAKhR,YAAYuS,GAE1B,MAAMC,EAAYC,IAChB,MAAM5O,EAAOnE,OAAOC,QAAQuQ,GAAmBnI,MAAK,EAAEyI,KAAeA,IAAciC,MAAQ,IAAI5O,MAAQ4O,EAEjGC,EAAerT,EACnB,SACA,CAAEyS,KAAM,UACRzS,EAAc,OAAQ,CAAE,cAAe,OAAQsT,MAAO,kBACtDtT,EAAc,OAAQ,CAAEsT,MAAO,mBAAqB,WAGhDP,EAAQ/S,EACZ,OACA,CAAEc,UAAW,eAAgB,eAAgBsS,GAC7C,OAAO5O,IACP6O,GAGFA,EAAatI,iBAAiB,SAAS,KACrCgI,EAAM/R,SACNiR,EAAMrT,OAAO,IAIf,IAAI2T,EAAOxU,iBAAiB,kBAAkBqV,QAAWnV,SAASsV,GAAaA,EAASvS,WAExFuR,EAAO5R,YAAYoS,GAGnB,IAAIR,EAAOpS,UAAU8E,MAAM,GAAG,GAAsBhH,SAASwC,GAAUA,EAAMO,UAAS,EAIjE,IAAIwS,gBAAe,KACxC,MAAM,MAAEtQ,GAAUqP,EAAOlD,wBACzB4C,EAAMxM,MAAMgO,mBAAqBvQ,EAC7B,QAAQxB,OAAiCwB,SAAa1B,QACtDE,CAA2B,IAGlB8O,QAAQ+B,GAEvBN,EAAMlH,iBAAiB,SAAS,KAC9B,MAAM5F,EAAQ8M,EAAMzR,MAAM2E,MAAMkM,GAEhC,GAAIlM,EAAO,CACT,MAAOuO,EAAQC,GAASxO,EAElByO,EAAaxR,GACjBA,EACGyR,OACAC,cACAhM,QAAQ,UAAW,IAClBsL,EAAO/S,OAAOC,QAAQuQ,GAAmBnI,MAC7C,EAAE,EAAIlE,WAAYoP,EAAUpP,KAAUoP,EAAUD,OAC9C,GAEAP,IAEFnB,EAAMzR,MAAQyR,EAAMzR,MAAMsH,QAAQ4L,EAAQ,IAC1CzB,EAAM/S,cAAc,IAAIyT,WAAW,UACnCQ,EAASC,GAEb,KAIFnB,EAAMlH,iBAAiB,WAAY9L,IACjC,MAAM8U,EAA4B,cAAd9U,EAAM+S,IACpBgC,EAAsC,IAAvB/B,EAAMgC,cAA+C,IAAzBhC,EAAMiC,eAEnDH,GAAeC,GACjBzB,EAAOxT,cAAc,gBAAgBiC,QACvC,IAIF0P,EAAa3S,iBAAiB,kBAAkBE,SAAS8U,GAAUI,EAASJ,EAAMvI,QAAQwI,UAG1Ff,EAAMrT,QACNqT,EAAMC,mBAAmB,GAAI,EAAE,GAShC,EMnMDiC,GAGA5V,OAAO0N,GAAGlK,QAAU,CAAEuG,wBAAuB,kBAAiB,GFkD7B,MACjC,MAAM8L,EAAkB,IAAItW,SAASC,iBAAiB,kBAAkByE,KAAKsO,IAC3E,MAAMuD,EAAiB,IAAIb,gBAAe,IA1HlB,CAAC1C,IAC3B,MAAMwD,EAAaxD,EAAKyD,WAGxB,IAAID,EAAWvW,iBAAiB,qCAAqCE,SAASuW,GAAcA,EAAUxT,WAGtG,MAAMwT,EAAY1D,EAAK2D,WAAU,GAGjCD,EAAUpO,gBAAgB,MAG1BoO,EAAUhK,QAAQkK,MAAQ,OAO1B,MAAMC,EAA4B,CAAC,cAAe,YAAa,oBAAqB,QACpFH,EAAUhX,UAAUsR,OAAO6F,GAGvB7D,EAAKvB,YACP+E,EAAWrF,aAAauF,EAAW1D,EAAKvB,aAExC+E,EAAW3T,YAAY6T,GAGzB,MAAMI,EAAqB,IAAMJ,EAAUnF,wBAAwBnM,MAAQ4N,EAAKzB,wBAAwBnM,MAGxG,IAAK0R,IAGH,OAFA9D,EAAKtT,UAAUwD,UAAU0I,QACzB4K,EAAWO,YAAYL,GASzB,MAAMM,EAAe9U,EAAc,KAAM,CAAEc,UAAW,oCAChDiU,EAAqB/U,EAAc,OAAQ,CAAEc,UAAW,iBACxDkU,EAAsBhV,EAAc,OAAQ,CAAEc,UAAW,mBAAqB,mBAC9EmU,EAAiBjV,EACrB,SACA,CACE,gBAAiB,QACjBc,UAAW,qCACX,iBAAkB,WAClB2R,KAAM,UAERsC,EACAC,GAEIE,EAAWlV,EACf,KACA,CAAEc,UAAW,uCACbmU,EACAH,GAEFN,EAAU7T,YAAYuU,GAMtB,MAAMC,EAAgB,GACtB,KAAOP,KAAsB,CAC3B,MAAMQ,EAAUF,EAASG,uBACzBF,EAAcG,QAAQF,GACtBZ,EAAUK,YAAYO,EACxB,CASAD,EAAclX,SAASsX,IACrB3U,EAAqB2U,GAErB,IAAIA,EAAapV,UAAUlC,SAASuX,IAClC5U,EAAqB4U,EAAS,SAAU,YACxCA,EAAQhY,UAAUsR,IAAI,gBAAiB,0BAA0B,IAGnEgG,EAAanU,YAAY4U,EAAa,IAOxC,IAAIf,EAAUzW,iBAAiB,MAAME,SAASwX,IAC5CA,EAAU1K,iBAAiB,gBAAgB,KACzC,MAAM2K,EAAc5E,EAAK/R,cAAc,WAAW0W,EAAUlT,aAAa,cAC7C,MAAcoT,YAAYD,IAAgB,IAAI,MAAcA,IACpExH,MAAM,GAC1B,IAIJ4C,EAAKtT,UAAUsR,OAAOpF,GACtB8K,EAAUhX,UAAUwD,UAAU2T,EAA0B,EAaNiB,CAAa9E,KAE7D,OADAuD,EAAe7D,QAAQM,GAChBuD,CAAc,GAG8D,EE3CrFwB,GDF6B,MAC7B,MAAMtN,EAAQzK,SAASyL,eAAeI,GAChCmM,EAAUvN,GAAOxK,iBAAiB,0BAA4B,GAEpEqM,EAASJ,KACTzL,OAAOoM,WAAW,0BAA0Bf,MAAemB,iBAAiB,UAAU,IAAMX,EAASJ,OAErG,MAAM+L,EAAW9W,GAAUmL,EAASnL,EAAMgO,cAAczC,QAAQC,QAAS,CAAEH,QAAQ,IACnFwL,EAAQ7X,SAASsM,GAAWA,EAAOQ,iBAAiB,QAASgL,IAEyB,ECLtFC,GAOAzX,OAAO0X,eALgB,CAAC7V,EAASnB,KAC3BA,EAAMiX,OAAOC,YACf/V,EAAQ5C,UAAUC,OAAO,SAC3B,EAQFc,OAAO6X,cAJe,CAAChW,EAASnB,KAC9B,MAAMoX,EAAajW,EAAQ5C,UAAUG,SAAS,UAC9CsB,EAAMiX,OAAOrN,KAAOwN,EAAajW,EAAQoK,QAAQ8L,UAAYlW,EAAQoK,QAAQ+L,MAAM,EAMrFzY,SAASC,iBAAiB,kEAAkEE,SAASuY,IACnGA,EAAGzL,iBAAiB,SAAS,KAC3ByL,EAAGC,MAAM,GACT,IAKJ3Y,SAASiN,iBAAiB,mBAAmB,KAC3CjN,SAASC,iBAAiB,kCAAkCE,SAASuY,IACnEA,EAAGC,MAAM,GACT,GACF,G,GE7HAC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBlX,IAAjBmX,EACH,OAAOA,EAAaC,QAGrB,IAAIC,EAASL,EAAyBE,GAAY,CAGjDE,QAAS,CAAC,GAOX,OAHAE,EAAoBJ,GAAUK,KAAKF,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAGpEI,EAAOD,OACf,CAGAH,EAAoBO,EAAIF,EdzBpBha,EAAW,GACf2Z,EAAoBQ,EAAI,CAACC,EAAQC,EAAUC,EAAIC,KAC9C,IAAGF,EAAH,CAMA,IAAIG,EAAeC,IACnB,IAASC,EAAI,EAAGA,EAAI1a,EAASsF,OAAQoV,IAAK,CAGzC,IAFA,IAAKL,EAAUC,EAAIC,GAAYva,EAAS0a,GACpCC,GAAY,EACPC,EAAI,EAAGA,EAAIP,EAAS/U,OAAQsV,MACpB,EAAXL,GAAsBC,GAAgBD,IAAalX,OAAO0P,KAAK4G,EAAoBQ,GAAG3J,OAAOwE,GAAS2E,EAAoBQ,EAAEnF,GAAKqF,EAASO,MAC9IP,EAASQ,OAAOD,IAAK,IAErBD,GAAY,EACTJ,EAAWC,IAAcA,EAAeD,IAG7C,GAAGI,EAAW,CACb3a,EAAS6a,OAAOH,IAAK,GACrB,IAAII,EAAIR,SACE5X,IAANoY,IAAiBV,EAASU,EAC/B,CACD,CACA,OAAOV,CAnBP,CAJCG,EAAWA,GAAY,EACvB,IAAI,IAAIG,EAAI1a,EAASsF,OAAQoV,EAAI,GAAK1a,EAAS0a,EAAI,GAAG,GAAKH,EAAUG,IAAK1a,EAAS0a,GAAK1a,EAAS0a,EAAI,GACrG1a,EAAS0a,GAAK,CAACL,EAAUC,EAAIC,EAqBjB,EezBdZ,EAAoBoB,EAAI,CAACjB,EAASkB,KACjC,IAAI,IAAIhG,KAAOgG,EACXrB,EAAoBsB,EAAED,EAAYhG,KAAS2E,EAAoBsB,EAAEnB,EAAS9E,IAC5E3R,OAAO6X,eAAepB,EAAS9E,EAAK,CAAEmG,YAAY,EAAMC,IAAKJ,EAAWhG,IAE1E,ECND2E,EAAoB0B,EAAI,WACvB,GAA0B,iBAAfC,WAAyB,OAAOA,WAC3C,IACC,OAAOzU,MAAQ,IAAI0U,SAAS,cAAb,EAChB,CAAE,MAAOC,GACR,GAAsB,iBAAXja,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBoY,EAAoBsB,EAAI,CAACQ,EAAKC,IAAUrY,OAAOsY,UAAUC,eAAe3B,KAAKwB,EAAKC,GCClF/B,EAAoBmB,EAAKhB,IACH,oBAAX+B,QAA0BA,OAAOC,aAC1CzY,OAAO6X,eAAepB,EAAS+B,OAAOC,YAAa,CAAEtY,MAAO,WAE7DH,OAAO6X,eAAepB,EAAS,aAAc,CAAEtW,OAAO,GAAO,E,MCA9D,IAAIuY,EAAkB,CACrB,IAAK,GAaNpC,EAAoBQ,EAAES,EAAKoB,GAA0C,IAA7BD,EAAgBC,GAGxD,IAAIC,EAAuB,CAACC,EAA4B5V,KACvD,IAGIsT,EAAUoC,GAHT3B,EAAU8B,EAAaC,GAAW9V,EAGhBoU,EAAI,EAC3B,GAAGL,EAASgC,MAAMrb,GAAgC,IAAxB+a,EAAgB/a,KAAa,CACtD,IAAI4Y,KAAYuC,EACZxC,EAAoBsB,EAAEkB,EAAavC,KACrCD,EAAoBO,EAAEN,GAAYuC,EAAYvC,IAGhD,GAAGwC,EAAS,IAAIhC,EAASgC,EAAQzC,EAClC,CAEA,IADGuC,GAA4BA,EAA2B5V,GACrDoU,EAAIL,EAAS/U,OAAQoV,IACzBsB,EAAU3B,EAASK,GAChBf,EAAoBsB,EAAEc,EAAiBC,IAAYD,EAAgBC,IACrED,EAAgBC,GAAS,KAE1BD,EAAgBC,GAAW,EAE5B,OAAOrC,EAAoBQ,EAAEC,EAAO,EAGjCkC,EAAqBC,KAA2B,qBAAIA,KAA2B,sBAAK,GACxFD,EAAmBrb,QAAQgb,EAAqBO,KAAK,KAAM,IAC3DF,EAAmBG,KAAOR,EAAqBO,KAAK,KAAMF,EAAmBG,KAAKD,KAAKF,G,KC7CvF,IAAII,EAAsB/C,EAAoBQ,OAAEzX,EAAW,CAAC,KAAK,IAAOiX,EAAoB,OAC5F+C,EAAsB/C,EAAoBQ,EAAEuC,E","sources":["webpack://nautobot/webpack/runtime/chunk loaded","webpack://nautobot/./src/js/collapse.js","webpack://nautobot/./src/js/draggable.js","webpack://nautobot/./src/js/drawer.js","webpack://nautobot/./src/js/history.js","webpack://nautobot/./src/js/utils.js","webpack://nautobot/./src/js/search.js","webpack://nautobot/./src/js/select2.js","webpack://nautobot/./src/js/cookie.js","webpack://nautobot/./src/js/sidenav.js","webpack://nautobot/./src/js/tabs.js","webpack://nautobot/./src/js/theme.js","webpack://nautobot/./src/js/nautobot.js","webpack://nautobot/./src/js/form.js","webpack://nautobot/webpack/bootstrap","webpack://nautobot/webpack/runtime/define property getters","webpack://nautobot/webpack/runtime/global","webpack://nautobot/webpack/runtime/hasOwnProperty shorthand","webpack://nautobot/webpack/runtime/make namespace object","webpack://nautobot/webpack/runtime/jsonp chunk loading","webpack://nautobot/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * Initialize collapse toggle all buttons identified by `data-nb-toggle=\"collapse-all\"` data attribute. Collapse toggle\n * all buttons can be further configured with `data-nb-target=\"{collapse CSS selector}\"` data attribute specifying which\n * collapse elements they control. When not explicitly set, target collapse CSS selector falls back to `\".collapse\"`.\n * ---\n * Critical difference between this and default Bootstrap 5 collapse implementation is that Bootstrap only supports\n * toggling individual panel states without an option to toggle them collectively. See an explanation below:\n * Bootstrap 5 on \"Collapse All Groups\" button click: | Nautobot on \"Collapse All Groups\" button click:\n * * X [expanded] -> [collapsed] | * X [expanded] -> [collapsed]\n * * Y [collapsed] -> [expanded] | * Y [collapsed] -> [collapsed]\n * * Z [expanded] -> [collapsed] | * Z [expanded] -> [collapsed]\n * ---\n * @returns {function(): void} Destructor function - remove all event listeners added during initialization.\n */\nexport const initializeCollapseToggleAll = () => {\n const areAll = (collapseElements, collapsedOrExpanded) =>\n collapseElements.every((element) => {\n const isCollapsed = !element.classList.contains('show');\n return collapsedOrExpanded === 'collapsed' ? isCollapsed : !isCollapsed;\n });\n\n const getCollapseToggleAllTargets = (collapseToggleAll) => [\n ...document.querySelectorAll(collapseToggleAll.dataset.nbTarget || '.collapse'),\n ];\n\n const onClick = (event) => {\n const collapseToggleAll = event.target.closest('[data-nb-toggle=\"collapse-all\"]');\n\n if (collapseToggleAll) {\n getCollapseToggleAllTargets(collapseToggleAll).forEach((collapse) => {\n const collapseInstance = window.bootstrap.Collapse.getOrCreateInstance(collapse);\n const shouldCollapse = collapseToggleAll.getAttribute('aria-expanded') === 'true';\n\n if (shouldCollapse) {\n collapseInstance.hide();\n } else {\n collapseInstance.show();\n }\n });\n }\n };\n\n const onHiddenBsCollapse = () =>\n [...document.querySelectorAll('[data-nb-toggle=\"collapse-all\"]')]\n .filter((collapseToggleAll) => areAll(getCollapseToggleAllTargets(collapseToggleAll), 'collapsed'))\n .forEach((collapseToggleAll) => {\n collapseToggleAll.setAttribute('aria-expanded', 'false');\n collapseToggleAll.textContent = 'Expand All Groups';\n });\n\n const onShownBsCollapse = () =>\n [...document.querySelectorAll('[data-nb-toggle=\"collapse-all\"]')]\n .filter((collapseToggleAll) => areAll(getCollapseToggleAllTargets(collapseToggleAll), 'expanded'))\n .forEach((collapseToggleAll) => {\n collapseToggleAll.setAttribute('aria-expanded', 'true');\n collapseToggleAll.textContent = 'Collapse All Groups';\n });\n\n // Using event delegation pattern here to avoid re-creating listeners each time DOM is modified.\n document.addEventListener('click', onClick);\n document.addEventListener('hidden.bs.collapse', onHiddenBsCollapse);\n document.addEventListener('shown.bs.collapse', onShownBsCollapse);\n\n return () => {\n document.removeEventListener('click', onClick);\n document.removeEventListener('hidden.bs.collapse', onHiddenBsCollapse);\n document.removeEventListener('shown.bs.collapse', onShownBsCollapse);\n };\n};\n","const DRAGGABLE_CLASS = 'nb-draggable';\nconst DRAGGABLE_CONTAINER_CLASS = 'nb-draggable-container';\nconst DRAGGABLE_HANDLE_CLASS = 'nb-draggable-handle';\nconst DRAGGING_CLASS = 'nb-dragging';\n\nexport const initializeDraggable = () => {\n const closest = (element, className) => element?.closest?.(`.${className}`);\n\n const createHandleOnMouseListener = (isDraggable) => (event) => {\n const handle = closest(event.target, DRAGGABLE_HANDLE_CLASS);\n if (handle) {\n const draggable = closest(handle, DRAGGABLE_CLASS);\n draggable.setAttribute('draggable', String(isDraggable));\n }\n };\n\n const onMouseDown = createHandleOnMouseListener(true);\n const onMouseUp = createHandleOnMouseListener(false);\n\n const onDragStart = (event) => {\n const draggable = closest(event.target, DRAGGABLE_CLASS);\n if (draggable) {\n event.dataTransfer.clearData('text/plain');\n event.dataTransfer.setData('text/plain', event.target.id);\n draggable.classList.add(DRAGGING_CLASS);\n }\n };\n\n const onDragEnd = (event) => {\n const draggable = closest(event.target, DRAGGABLE_CLASS);\n if (draggable) {\n draggable.classList.remove(DRAGGING_CLASS);\n draggable.setAttribute('draggable', 'false');\n }\n };\n\n const onDragOver = (event) => {\n const draggableContainer = closest(event.target, DRAGGABLE_CONTAINER_CLASS);\n if (draggableContainer) {\n event.preventDefault();\n }\n };\n\n const onDrop = (event) => {\n const draggable = document.getElementById(event.dataTransfer.getData('text/plain'));\n if (draggable) {\n event.preventDefault();\n\n const container = closest(draggable, DRAGGABLE_CONTAINER_CLASS);\n\n const insertBefore = (() => {\n // Were we dropped onto another draggable?\n const dropDraggable = closest(event.target, DRAGGABLE_CLASS);\n if (dropDraggable) {\n /*\n * Were we dropped in the top half or the bottom half of the target draggable?\n * - Top half - insert before that draggable.\n * - Bottom half - insert after that draggable.\n */\n const { height, top } = dropDraggable.getBoundingClientRect();\n const isTopHalf = event.clientY < top + height / 2;\n return isTopHalf ? dropDraggable : dropDraggable.nextSibling;\n }\n\n // We were dropped into empty space - find the closest draggable by geometry.\n return [...container.children].find((child) => {\n const { left, right, top } = child.getBoundingClientRect();\n // Are we in the correct column?\n if (left > event.clientX) {\n // Found the first child that is too far to the right, so we insert before that child.\n return true;\n } else if (right >= event.clientX) {\n // Child is in the correct column.\n if (top >= event.clientY) {\n // Found the first child in this column we were dropped above, so we insert before that child.\n return true;\n }\n }\n return false;\n });\n })();\n\n if (insertBefore) {\n container.insertBefore(draggable, insertBefore);\n } else {\n // Add to end of the list.\n container.append(draggable);\n }\n\n draggable.classList.add(DRAGGING_CLASS);\n }\n };\n\n // Using event delegation pattern here to avoid re-creating listeners each time DOM is modified.\n document.addEventListener('mousedown', onMouseDown);\n document.addEventListener('mouseup', onMouseUp);\n document.addEventListener('dragstart', onDragStart);\n document.addEventListener('dragend', onDragEnd);\n document.addEventListener('dragover', onDragOver);\n document.addEventListener('drop', onDrop);\n};\n","const DRAWER_CLASS = 'nb-drawer';\nconst DRAWER_OPEN_CLASS = 'nb-drawer-open';\n\n/**\n * Toggle drawer element with an option to force open/close.\n * @param {HTMLElement} drawer - Drawer HTML element to be toggled.\n * @param {boolean} [force] - Optionally force opening (`true`) or closing (`false`) regardless of current state.\n * @returns {void} Do not return any value, modify existing HTML element in-place.\n */\nconst toggleDrawer = (drawer, force) => {\n if (!drawer) {\n return;\n }\n\n drawer.classList.toggle(DRAWER_OPEN_CLASS, force);\n\n const isOpen = drawer.classList.contains(DRAWER_OPEN_CLASS);\n\n drawer.setAttribute('aria-hidden', isOpen ? 'false' : 'true');\n\n const drawerToggles = [...document.querySelectorAll(`[data-nb-toggle=\"drawer\"][data-nb-target=\"#${drawer.id}\"]`)];\n drawerToggles.forEach((drawerToggle) => drawerToggle.setAttribute('aria-expanded', isOpen ? 'true' : 'false'));\n\n /*\n * Maintain proper element focus when the drawer is:\n * 1. Open - focus the drawer as soon as it becomes visible and focusable.\n * 2. Closed - in case focus is within the drawer move it back to the first found drawer toggle and, if not\n * available, the `main` element instead.\n */\n if (isOpen) {\n // Close other open drawers if there are any. Effectively, this allows only one drawer to be open at a time.\n const openDrawers = document.getElementsByClassName(DRAWER_OPEN_CLASS);\n [...openDrawers]\n .filter((openDrawer) => openDrawer !== drawer)\n .forEach((openDrawer) => toggleDrawer(openDrawer, false));\n\n (() => {\n let rafRetriesRemaining = 100; // In case something goes wrong prevent falling into an infinite loop.\n\n // Use `requestAnimationFrame` to wait until drawer becomes visible and focusable.\n window.requestAnimationFrame(function focusDrawer() {\n const isDrawerVisible = window.getComputedStyle(drawer).visibility === 'visible';\n\n if (isDrawerVisible) {\n drawer.focus();\n } else if (rafRetriesRemaining > 0) {\n rafRetriesRemaining -= 1;\n window.requestAnimationFrame(focusDrawer);\n }\n });\n })();\n } else if (drawer.contains(document.activeElement)) {\n const nextActiveElement = drawerToggles[0] || document.querySelector('main');\n nextActiveElement?.focus({ preventScroll: true });\n }\n\n const event = isOpen ? 'nb-drawer:opened' : 'nb-drawer:closed';\n drawer.dispatchEvent(new CustomEvent(event, { bubbles: true, cancelable: true }));\n};\n\n/**\n * Initialize custom Nautobot drawers mechanism.\n * @returns {void} Do not return any value, attach an event listener.\n */\nexport const initializeDrawers = () => {\n // Using event delegation pattern here to avoid re-creating listeners each time DOM is modified.\n document.addEventListener('nb-drawer:close', (event) => toggleDrawer(event.target, false));\n document.addEventListener('nb-drawer:open', (event) => toggleDrawer(event.target, true));\n document.addEventListener('nb-drawer:toggle', (event) => toggleDrawer(event.target));\n\n document.addEventListener('nb-drawer:opened', (event) => {\n if (event.target.id) {\n const nextState = { ...window.history?.state, drawer: event.target.id };\n const url = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n window.history?.replaceState(nextState, '', url);\n }\n });\n\n document.addEventListener('nb-drawer:closed', () => {\n // eslint-disable-next-line no-unused-vars\n const { drawer, ...restState } =\n typeof window.history?.state === 'object' && window.history.state !== null ? window.history.state : {};\n const nextState = Object.keys(restState).length > 0 ? restState : null;\n const url = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n window.history?.replaceState(nextState, '', url);\n });\n\n document.addEventListener('click', (event) => {\n const dismiss = event.target.closest('[data-nb-dismiss]');\n const toggle = event.target.closest('[data-nb-toggle]');\n\n if (dismiss?.dataset.nbDismiss === 'drawer') {\n const drawer = dismiss.closest(`.${DRAWER_CLASS}`);\n drawer?.dispatchEvent(new CustomEvent(`nb-drawer:close`, { bubbles: true, cancelable: true }));\n } else if (toggle?.dataset.nbToggle === 'drawer') {\n const drawer = document.querySelector(toggle.dataset.nbTarget);\n drawer?.dispatchEvent(new CustomEvent(`nb-drawer:toggle`, { bubbles: true, cancelable: true }));\n }\n });\n\n if (window.history?.state?.drawer) {\n document\n .getElementById(window.history.state.drawer)\n ?.dispatchEvent(new CustomEvent('nb-drawer:open', { bubbles: true, cancelable: true }));\n }\n};\n","const SESSION_STORAGE_KEY = 'historyState';\n\n/**\n * Load last saved history state from `sessionStorage`.\n *\n * *The idea behind this and `saveState` function below is to be able to maintain history state between history entries\n * separated by a full document reload caused by navigation or form submission. Browsers do not export any native API\n * to manage history state in said scenario, so the workaround is to call `saveState` before full document reload and\n * then `loadState` after the document is loaded back again. `saveState` must be called on demand by arbitrary logic,\n * whereas `loadState` is executed automatically by the main `nautobot.js` script and should not be called manually.*\n *\n * @returns {void} Do not return any value, update current history entry with last saved state instead.\n */\nexport const loadState = () => {\n const state = (() => {\n try {\n const item = window.sessionStorage?.getItem(SESSION_STORAGE_KEY);\n return item ? JSON.parse(item) : undefined;\n // eslint-disable-next-line no-unused-vars\n } catch (exception) {\n return undefined;\n }\n })();\n\n if (state !== undefined) {\n const url = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n window.history?.replaceState(state, '', url);\n window.sessionStorage?.removeItem(SESSION_STORAGE_KEY);\n }\n};\n\n/**\n * Save given state, or current history entry state if not explicitly passed, into `sessionStorage`.\n *\n * *The idea behind this and `loadState` function above is to be able to maintain history state between history entries\n * separated by a full document reload caused by navigation or form submission. Browsers do not export any native API\n * to manage history state in said scenario, so the workaround is to call `saveState` before full document reload and\n * then `loadState` after the document is loaded back again. `saveState` must be called on demand by arbitrary logic,\n * whereas `loadState` is executed automatically by the main `nautobot.js` script and should not be called manually.*\n *\n * @param {object|null} [state] - Optional `state` object to be saved; current history entry state will be used if\n * `state` is not explicitly passed. Use `null` to remove history state from `sessionStorage`.\n * @returns {void} Do not return any value, save current history entry state into `sessionStorage` instead.\n */\nexport const saveState = (state) => {\n const stateToSave = state === undefined ? window.history?.state : state;\n\n if (stateToSave !== undefined) {\n window.sessionStorage?.setItem(SESSION_STORAGE_KEY, JSON.stringify(stateToSave));\n }\n};\n","/**\n * This function is heavily inspired by React `createElement`. Its purpose is to remove some boilerplate code otherwise\n * required for creating new HTML elements.\n * @example\n * // Create `row` and `col` elements with a valid parent-child relationship.\n * const child = createElement('div', { className: 'col' });\n * const parent = createElement('div', { className: 'row' }, child);\n * @param {string} tag - HTML element tag name to be passed to `document.createElement` function.\n * @param {object} [attributes={}] - Object containing HTML element attributes to be set on newly created HTML element.\n * `class` attribute is a special case in which `className` property name can be optionally used in order to avoid\n * ambiguation with JavaScript reserved `class` keyword.\n * @param {(HTMLElement|string)} [children] - HTML elements or string values to become newly created element children.\n * @returns {HTMLElement} New HTML element. Append it to an existing DOM node if you want it to appear in browser.\n */\nexport const createElement = (tag, attributes = {}, ...children) => {\n const element = document.createElement(tag);\n\n Object.entries(attributes).forEach(([attribute, value]) =>\n element.setAttribute(attribute === 'className' ? 'class' : attribute, value),\n );\n\n children.forEach((child) =>\n typeof child === 'string' ? element.insertAdjacentText('beforeend', child) : element.appendChild(child),\n );\n\n return element;\n};\n\n/**\n * Remove all classes from given element, optionally excluding some explicitly.\n * @example\n * // Remove all classes except `container-fluid` from given element.\n * removeElementClasses(element, 'container-fluid');\n * @param {HTMLElement} element - HTML element which classes are to be removed.\n * @param {string} [ignore] - Classes to ignore during class removal, i.e. should be left as-is.\n * @returns {void} Do not return any value, modify existing HTML element in-place.\n */\nexport const removeElementClasses = (element, ...ignore) =>\n [...element.classList.entries()]\n .filter(([, className]) => !ignore.includes(className))\n .forEach(([, className]) => element.classList.remove(className));\n\n/**\n * Convert `px` pixel value to `rem` units.\n * @example\n * // Convert `20` (`px`) to `rem`, return `1.25` (`rem`).\n * rem(20);\n * @param {number} px - Pixel value.\n * @returns {number} Given pixel value converted to `rem` units.\n */\nexport const rem = (px) => {\n const rootFontSize = window.getComputedStyle(document.documentElement).fontSize;\n return px / parseInt(rootFontSize, 10);\n};\n","import { createElement, rem } from './utils.js';\n\nconst FORM_CONTROL_PADDING_X = rem(12);\nconst GAP = rem(6);\nconst ICON_SIZE = rem(20);\n\nconst BASE_SEARCH_INPUT_PADDING_X = `${FORM_CONTROL_PADDING_X + ICON_SIZE + GAP}rem`;\n\nconst MAX_BADGE_COUNT = 1;\n\nexport const initializeSearch = () => {\n const headerSearch = document.getElementById('header_search');\n\n // Do nothing and `return` early when there is no `#header_search` element in the page.\n if (!headerSearch) {\n return () => {};\n }\n\n const NAV_MENU = (() => {\n try {\n const navMenu = document.getElementById('nav_menu');\n return navMenu ? JSON.parse(navMenu.textContent) : {};\n // eslint-disable-next-line no-unused-vars\n } catch (exception) {\n return {};\n }\n })();\n\n /*\n * Pick only the lowest level of nested `nav_menu` object. In TypeScript, it would be manifested as the following type:\n * `{ [item_link: string]: { name: string; weight: number } };`.\n */\n const SEARCHABLE_MODELS = Object.fromEntries(\n Object.entries(NAV_MENU.tabs).flatMap(([, tab_details]) =>\n Object.entries(tab_details.groups).flatMap(([, group_details]) =>\n Object.entries(group_details.items).map(([item_link, item_details]) => [item_link, item_details]),\n ),\n ),\n );\n\n const BADGE_REG_EXP = new RegExp(\n `^\\\\s*in\\\\s*:\\\\s*(${Object.entries(SEARCHABLE_MODELS)\n // Extend simple vanilla model name match with more word delimiter variants (or no word delimiters at all).\n .flatMap(([, { name }]) => [name, ...['', '_', '\\\\-'].map((delimiter) => name.replace(/\\s+/g, delimiter))])\n .join('|')})\\\\s+`,\n 'i',\n );\n\n const headerSearchInput = headerSearch.querySelector('input');\n\n const closeSearchPopup = () => {\n const searchPopup = document.getElementById('search_popup');\n\n if (searchPopup) {\n searchPopup.remove();\n document.body.classList.toggle('overflow-y-hidden', false);\n }\n };\n\n // Focus search input on Cmd+K or Ctrl+K shortcut and close search popup on Escape.\n const onKeyDown = (event) => {\n const isPressedCmd = event.getModifierState?.('Meta');\n const isPressedCtrl = event.ctrlKey;\n\n if ((isPressedCmd || isPressedCtrl) && event.key === 'k') {\n event.preventDefault();\n headerSearchInput.focus();\n } else if (event.key === 'Escape') {\n closeSearchPopup();\n }\n };\n\n document.addEventListener('keydown', onKeyDown);\n\n const openSearchPopup = () => {\n const searchPopup = document.getElementById('search_popup');\n\n // Just focus an existing search popup `input` and `return` early if `#searchPopup` is already open.\n if (searchPopup) {\n const input = searchPopup.querySelector('input');\n input?.focus();\n input?.setSelectionRange(-1, -1);\n return;\n }\n\n document.body.classList.toggle('overflow-y-hidden', true);\n\n const { left: mainLeft = 0, right: mainRight = 0 } = document.querySelector('main')?.getBoundingClientRect() ?? {};\n const { top: headerSearchInputTop } = headerSearchInput.getBoundingClientRect();\n\n const icon = createElement('span', {\n 'aria-hidden': 'true',\n className:\n 'mdi mdi-magnify d-inline-flex ms-12 mt-6 pe-none position-absolute start-0 text-secondary top-0 user-select-none',\n style: `height: ${ICON_SIZE}rem; width: ${ICON_SIZE}rem;`,\n });\n\n const badges = createElement('span', {\n className: 'd-inline-flex gap-6 left-0 my-6 position-absolute top-0',\n style: `left: ${BASE_SEARCH_INPUT_PADDING_X};`,\n });\n\n const input = createElement('input', {\n className: 'form-control w-100',\n name: 'q',\n required: 'true',\n style: `padding-inline: ${BASE_SEARCH_INPUT_PADDING_X};`,\n type: 'search',\n value: headerSearchInput.value,\n });\n\n const clear = createElement(\n 'button',\n {\n className: `btn mdi mdi-close bg-transparent border-0 end-0 hstack justify-content-center me-12 mt-6 p-0 position-absolute text-secondary top-0 nb-transition-base${input.value === '' ? ' invisible opacity-0' : ''}`,\n style: `height: ${ICON_SIZE}rem; width: ${ICON_SIZE}rem;`,\n type: 'button',\n },\n createElement('span', { className: 'visually-hidden' }, 'Clear'),\n );\n\n clear.addEventListener('click', () => {\n input.value = '';\n input.dispatchEvent(new InputEvent('input'));\n input.focus();\n });\n\n input.addEventListener('input', () => {\n const shouldHideClear = input.value === '';\n clear.classList.toggle('invisible', shouldHideClear);\n clear.classList.toggle('opacity-0', shouldHideClear);\n });\n\n const submit = createElement('input', { className: 'd-none', type: 'submit' });\n\n const form = createElement(\n 'form',\n { action: headerSearch.getAttribute('action'), className: 'position-relative w-100', role: 'search' },\n icon,\n badges,\n input,\n clear,\n submit,\n );\n\n /* In case there is no badge, use global search. Otherwise, navigate to badge specific model list view. */\n form.addEventListener('submit', () => {\n const badge = form.querySelector('[data-nb-link]:last-child');\n\n if (badge) {\n form.setAttribute('action', badge.dataset.nbLink);\n }\n });\n\n const results = createElement('div');\n\n const popup = createElement(\n 'div',\n { className: 'mx-auto w-100', style: `max-width: ${rem(720)}rem;` },\n form,\n results,\n );\n\n const overlay = createElement(\n 'div',\n {\n className: 'overflow-auto pb-20 position-fixed top-0 end-0 bottom-0 start-0 nb-z-modal-backdrop',\n id: 'search_popup',\n role: 'dialog',\n style: `background-color: rgba(0, 0, 0, .5); padding-block-start: ${headerSearchInputTop}px; padding-inline-start: calc(${mainLeft}px + ${rem(20)}rem); padding-inline-end: calc(100% - ${mainRight}px + ${rem(20)}rem);`,\n },\n popup,\n );\n\n // Close search popup on direct overlay click.\n overlay.addEventListener('click', (event) => {\n if (event.target === overlay) {\n closeSearchPopup();\n }\n });\n\n document.body.appendChild(overlay);\n\n const addBadge = (link) => {\n const name = Object.entries(SEARCHABLE_MODELS).find(([item_link]) => item_link === link)?.[1]?.name ?? link;\n\n const removeButton = createElement(\n 'button',\n { type: 'button' },\n createElement('span', { 'aria-hidden': 'true', class: 'mdi mdi-close' }),\n createElement('span', { class: 'visually-hidden' }, 'Remove'),\n );\n\n const badge = createElement(\n 'span',\n { className: 'badge border', 'data-nb-link': link },\n `in: ${name}`,\n removeButton,\n );\n\n removeButton.addEventListener('click', () => {\n badge.remove();\n input.focus();\n });\n\n // Before adding a new badge, remove existing badges with the same `link` to prevent duplicates.\n [...badges.querySelectorAll(`[data-nb-link=\"${link}\"]`)].forEach((existing) => existing.remove());\n\n badges.appendChild(badge);\n\n // Obey the `MAX_BADGE_COUNT` constraint.\n [...badges.children].slice(0, -1 * MAX_BADGE_COUNT).forEach((child) => child.remove());\n };\n\n // Recalculate search input left padding when badges container size changes, i.e. a badge is added or removed.\n const resizeObserver = new ResizeObserver(() => {\n const { width } = badges.getBoundingClientRect();\n input.style.paddingInlineStart = width\n ? `calc(${BASE_SEARCH_INPUT_PADDING_X} + ${width}px + ${GAP}rem)`\n : BASE_SEARCH_INPUT_PADDING_X;\n });\n\n resizeObserver.observe(badges);\n\n input.addEventListener('input', () => {\n const match = input.value.match(BADGE_REG_EXP);\n\n if (match) {\n const [phrase, model] = match;\n\n const normalize = (text) =>\n text\n .trim()\n .toLowerCase()\n .replace(/\\s|_|-/g, '');\n const link = Object.entries(SEARCHABLE_MODELS).find(\n ([, { name }]) => normalize(name) === normalize(model),\n )?.[0];\n\n if (link) {\n // Remove phrase that matched the badge-specific regular expression and replace it with a corresponding badge.\n input.value = input.value.replace(phrase, '');\n input.dispatchEvent(new InputEvent('input'));\n addBadge(link);\n }\n }\n });\n\n // Remove the first badge on the right-hand side when `'Backspace'` key is pressed on the input start position.\n input.addEventListener('keydown', (event) => {\n const isBackspace = event.key === 'Backspace';\n const isInputStart = input.selectionEnd === 0 && input.selectionStart === 0;\n\n if (isBackspace && isInputStart) {\n badges.querySelector(':last-child')?.remove();\n }\n });\n\n // When search popup is open, copy existing badges from `#header_search` to search popup input.\n headerSearch.querySelectorAll('[data-nb-link]').forEach((badge) => addBadge(badge.dataset.nbLink));\n\n // Automatically focus search popup input when opened and move cursor to the end of input field.\n input.focus();\n input.setSelectionRange(-1, -1);\n };\n\n headerSearchInput.addEventListener('focus', openSearchPopup);\n\n return () => {\n closeSearchPopup();\n document.removeEventListener('keydown', onKeyDown);\n headerSearchInput.removeEventListener('focus', openSearchPopup);\n };\n};\n","import get from 'lodash.get';\n\n/**\n * Get HTML `element`. This function accepts input as native `Document` and `Element` object and `jQuery` collection.\n * It should no longer be required after migrating away from jQuery.\n * @param {Document|Element|jQuery} `element` - `element` in question.\n * @returns {Document|Element} Native `element` object.\n */\nconst getElement = (element) => (element instanceof Document || element instanceof Element ? element : element[0]);\n\n/**\n * Get `select` element value.\n * @param {HTMLSelectElement} select - `select` element in question.\n * @returns {string|string[]} `string` value for single combobox, an array of `string` values for multiple combobox.\n */\nconst getValue = (select) =>\n select?.getAttribute('multiple') === null ? select?.value : [...select.selectedOptions].map((option) => option.value);\n\n/**\n * Set Select2 combobox value(s).\n * @param {HTMLSelectElement} select2 - Select2 combobox HTML element.\n * @param {{ text: string, value: string }[]|null} value - Array of objects containing `text` and `value` key-value\n * pairs; `null` to reset the field value.\n */\nexport const setSelect2Value = (select2, value) => {\n $(select2).val(null);\n\n (value ?? []).forEach((attributes) => {\n if (!select2.querySelector(`option[value=\"${attributes.value}\"]`)) {\n const option = document.createElement('option');\n option.innerText = attributes.text;\n option.setAttribute('selected', 'true');\n option.setAttribute('value', attributes.value);\n select2.appendChild(option);\n }\n });\n\n const nextValue = (() => {\n if (value.length > 0) {\n const isMultiple = select2?.getAttribute('multiple') !== null;\n return isMultiple ? value.map((attributes) => attributes.value) : value?.[0]?.value;\n }\n\n return null;\n })();\n\n $(select2).val(nextValue).trigger('change');\n};\n\n/**\n * Parse URLs which may contain variable references to other field values.\n * @param {string} url - URL template string.\n * @returns {string} URL with interpolated dynamic values.\n */\nconst parseURL = (url) => {\n const filter_regex = /\\{\\{([a-z_]+)}}/g;\n\n let match; // eslint-disable-line init-declarations\n let rendered_url = url;\n\n while ((match = filter_regex.exec(url))) {\n const filter_field = document.querySelector(`#id_${match[1]}`);\n const custom_attribute = filter_field?.selectedOptions?.[0]?.getAttribute('api-value');\n const replace =\n custom_attribute || filter_field.value || (filter_field.getAttribute('data-null-option') ? 'null' : undefined);\n\n rendered_url = replace ? rendered_url.replace(match[0], replace) : rendered_url;\n }\n\n return rendered_url;\n};\n\n/**\n * Initialize given Select2 components in passed `context` by `selector`, optionally with `options`.\n * @param {Document|Element|jQuery} context - Context root element.\n * @param {string} selector - CSS query selector of `select` elements to be initialized as Select2 components.\n * @param {object} [options] - Optional Select2 components initialization options.\n * @returns {void} Do not return any value, just initialize given Select2 components.\n */\nconst initializeSelect2 = (context, selector, options) =>\n [...getElement(context).querySelectorAll(selector)].forEach((element) =>\n $(element).select2({\n allowClear: true,\n placeholder: element.getAttribute('placeholder') || '---------',\n selectionCssClass: 'select2--small',\n theme: 'bootstrap-5',\n width: 'off',\n ...options,\n }),\n );\n\nconst initializeColorPicker = (context, dropdownParent = null) => {\n // Assign color picker selection classes.\n const colorPickerClassCopy = (data, container) => {\n if (data.element) {\n // Swap the style.\n const containerElement = getElement(container);\n containerElement.setAttribute('style', data.element.getAttribute('style'));\n }\n\n return data.text;\n };\n\n initializeSelect2(context, '.nautobot-select2-color-picker', {\n dropdownParent,\n templateResult: colorPickerClassCopy,\n templateSelection: colorPickerClassCopy,\n });\n};\n\nconst initializeDynamicChoiceSelection = (context, dropdownParent = null) => {\n initializeSelect2(context, '.nautobot-select2-api', {\n ajax: {\n data: function data(params) {\n const [element] = this;\n\n // Paging. Note that `params.page` indexes at 1.\n const offset = (params.page - 1) * 50 || 0;\n\n // Base query params.\n const limit = 50;\n const q = params.term;\n\n // Get search query param name, defaults to `'q'`.\n const search_field = element.getAttribute('search-field') || 'q';\n\n // Set api_version.\n const api_version = element.getAttribute('data-api-version');\n\n // Allow for controlling the depth setting from within APISelect.\n const depth = parseInt(element.getAttribute('data-depth'), 10) || 0;\n\n // Attach content_type to parameters.\n const content_type = element.getAttribute('data-contenttype');\n\n // Attach any extra query parameters\n const extra_query_parameters = Object.fromEntries(\n [...element.attributes]\n .filter((attribute) => attribute.name.includes('data-query-param-'))\n .flatMap((attribute) => {\n const [, param_name] = attribute.name.split('data-query-param-');\n\n const values = (() => {\n try {\n return JSON.parse(attribute.value);\n // eslint-disable-next-line no-unused-vars\n } catch (exception) {\n return [];\n }\n })();\n\n return values.flatMap((value) => {\n const has_ref_field = value.startsWith('$');\n\n // Referencing the value of another form field.\n const ref_field = has_ref_field\n ? (() => {\n const name = value.slice(1);\n\n if (element.id.includes('id_form-')) {\n const [id_prefix] = element.id.match(/id_form-[0-9]+-/i, '');\n return document.querySelector(`#${id_prefix}${name}`);\n }\n\n /*\n * If the element is in a table row with a class containing \"dynamic-formset\" we need to find the\n * reference field in the same row.\n */\n if (element.closest('tr')?.classList.contains('dynamic-formset')) {\n return element.closest('tr').querySelector(`select[id*=\"${name}\"]`);\n }\n\n return document.querySelector(`#id_${name}`);\n })()\n : null;\n\n const ref_field_value = ref_field\n ? (() => {\n const field_value = getValue(ref_field);\n const style = window.getComputedStyle(ref_field);\n\n if (field_value && style.opacity !== '0' && style.visibility !== 'hidden') {\n return field_value;\n }\n\n if (ref_field.getAttribute('required') && ref_field.getAttribute('data-null-option')) {\n return 'null';\n }\n\n return undefined;\n })()\n : null;\n\n const param_value = has_ref_field ? ref_field_value : value;\n return param_value !== null && param_value !== undefined\n ? [[param_name, ref_field_value || value]]\n : [];\n });\n }),\n );\n\n const parameters = {\n depth: String(depth),\n limit: String(limit),\n offset: String(offset),\n ...(api_version ? { api_version } : undefined),\n ...(content_type ? { content_type } : undefined),\n ...(q ? { [search_field]: q } : undefined),\n ...extra_query_parameters,\n };\n\n // This will handle params with multiple values (i.e. for list filter forms).\n return new URLSearchParams(parameters).toString();\n },\n delay: 500,\n processResults: function processResults(data) {\n const [element] = this.$element;\n [...element.querySelectorAll('option')].forEach((child) => child.removeAttribute('disabled'));\n\n const results = [\n // Handle the null option, but only add it once.\n ...(element.getAttribute('data-null-option') && data.previous === null\n ? [{ id: 'null', text: element.getAttribute('data-null-option') }]\n : []),\n ...Object.values(\n data.results.reduce((accumulator, record, index) => {\n // The disabled-indicator equated to true, so we disable this option.\n const disabled = Boolean(record?.[element.getAttribute('disabled-indicator')]);\n const id = get(record, element.getAttribute('value-field')) || record.id;\n const text = get(record, element.getAttribute('display-field')) || record.name;\n\n const item = { ...record, disabled, id, text };\n const { group, site, url } = item;\n\n /*\n * `DynamicGroupSerializer` has a `children` field which fits an inappropriate if condition in\n * `select2.min.js`, which will result in the incorrect rendering of `DynamicGroup` `DynamicChoiceField`.\n * So we nullify the field here since we do not need this field.\n */\n const should_nullify_children = Boolean(url?.includes('dynamic-groups'));\n\n const collection = (() => {\n switch (true) {\n case group !== undefined && group !== null && site !== undefined && site !== null:\n return { property: `${site.name}:${group.name}`, text: `${site.name} / ${group.name}` };\n\n case group !== undefined && group !== null:\n return { property: group.name, text: group.name };\n\n case site !== undefined && site !== null:\n return { property: site.name, text: site.name };\n\n case group === null && site === null:\n return { property: 'global', text: 'Global' };\n\n default:\n return undefined;\n }\n })();\n\n return {\n ...accumulator,\n ...(collection\n ? {\n [collection.property]: {\n ...accumulator[collection.property],\n ...(accumulator[collection.property] ? undefined : { text: collection.text }),\n children: should_nullify_children\n ? undefined\n : [...(accumulator[collection.property]?.children ?? []), item],\n },\n }\n : { [index]: item }),\n };\n }, {}),\n ),\n ];\n\n // Check if there are more results to page.\n const has_next_page = data.next !== null;\n return { pagination: { more: has_next_page }, results };\n },\n url: function url() {\n const [element] = this;\n const dataUrl = parseURL(element.getAttribute('data-url'));\n\n // If URL is not fully rendered yet, abort the request.\n return !dataUrl.includes('{{') && dataUrl;\n },\n },\n dropdownParent,\n });\n};\n\nconst initializeMultiValueChar = (context, dropdownParent = null) =>\n initializeSelect2(context, '.nautobot-select2-multi-value-char', {\n dropdownParent,\n language: { noResults: () => 'Type something to add it as an option' },\n multiple: true,\n tags: true,\n });\n\nconst initializeStaticChoiceSelection = (context, dropdownParent = null) =>\n initializeSelect2(context, '.nautobot-select2-static', { dropdownParent });\n\nexport const initializeSelect2Fields = (context) => {\n initializeColorPicker(context);\n initializeDynamicChoiceSelection(context);\n initializeMultiValueChar(context);\n initializeStaticChoiceSelection(context);\n\n [...getElement(context).querySelectorAll('.modal')].forEach((modal) => {\n initializeColorPicker(modal, modal);\n initializeDynamicChoiceSelection(modal, modal);\n initializeMultiValueChar(modal, modal);\n initializeStaticChoiceSelection(modal, modal);\n });\n};\n","/**\n * Get given cookie, based on MDN example: https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#example_2_get_a_sample_cookie_named_test2\n * @param {string} name - Cookie name.\n * @returns {string|undefined} Cookie value.\n */\nexport const getCookie = (name) =>\n document.cookie\n .split('; ')\n .find((cookie) => cookie.startsWith(`${name}=`))\n ?.split('=')[1];\n\n/**\n * Set given cookie `value` with optional `options`.\n * @param {string} name - Cookie name.\n * @param {string} value - Cookie value.\n * @param {object} [options] - Cookie properties as key-value pairs, e.g. `path`, `expires`, etc.\n * @returns {void} Do not return any value, modify existing document cookies in-place.\n */\nexport const setCookie = (name, value, options) => {\n const properties = { [name]: value, path: '/', ...options };\n document.cookie = Object.entries(properties)\n .map((entry) => entry.join('='))\n .join(';');\n};\n\n/**\n * Remove given cookie.\n * @param {string} name - Cookie name.\n * @returns {void} Do not return any value, modify existing document cookies in-place.\n */\nexport const removeCookie = (name) => setCookie(name, '', { expires: 'Thu, 01 Jan 1970 00:00:00 GMT' });\n","import { getCookie, removeCookie, setCookie } from './cookie.js';\n\nconst SIDENAV_COLLAPSED_KEY = 'sidenav_collapsed';\n\n/**\n * Expand/collapse sidenav.\n * @returns {void} Do not return any value, modify existing HTML elements, cookies and localStorage in-place.\n */\nexport const toggleSidenav = () => {\n const toggler = document.querySelector('.nb-sidenav-toggler');\n\n const controls = toggler.getAttribute('aria-controls');\n const expanded = toggler.getAttribute('aria-expanded') === 'true';\n\n toggler.setAttribute('aria-expanded', String(!expanded));\n\n const sidenav = document.getElementById(controls);\n sidenav.classList.toggle('nb-sidenav-collapsed', expanded);\n\n if (expanded) {\n setCookie(SIDENAV_COLLAPSED_KEY, 'true');\n window.localStorage?.setItem(SIDENAV_COLLAPSED_KEY, 'true');\n } else {\n removeCookie(SIDENAV_COLLAPSED_KEY);\n window.localStorage?.removeItem(SIDENAV_COLLAPSED_KEY);\n }\n};\n\n/**\n * Initialize sidenav mechanisms, i.e. expand/collapse, fly-outs, and optionally version control branch picker.\n * @returns {void} Do not return any value, attach event listeners.\n */\nexport const initializeSidenav = () => {\n const toggler = document.querySelector('.nb-sidenav-toggler');\n\n if (toggler) {\n /*\n * Check if sidenav expanded/collapsed initial state is valid. If not, amend it by calling `toggleSidenav()`. This\n * should not happen due to template code properly handling the initial render, but we're being extra careful here.\n */\n const sidenavCollapsedInitialState =\n getCookie(SIDENAV_COLLAPSED_KEY) ?? window.localStorage?.getItem(SIDENAV_COLLAPSED_KEY) ?? 'false';\n const shouldToggleSidenav =\n (sidenavCollapsedInitialState === 'true' && toggler.getAttribute('aria-expanded') === 'true') ||\n (sidenavCollapsedInitialState === 'false' && toggler.getAttribute('aria-expanded') === 'false');\n if (shouldToggleSidenav) {\n toggleSidenav();\n }\n\n toggler.addEventListener('click', toggleSidenav);\n }\n\n [...document.querySelectorAll('.nb-sidenav-list-item:not(.nb-flat)')].forEach((sidenavListItem) => {\n sidenavListItem.addEventListener('click', () => {\n const controls = sidenavListItem.getAttribute('aria-controls');\n const expanded = sidenavListItem.getAttribute('aria-expanded') === 'true';\n\n sidenavListItem.setAttribute('aria-expanded', String(!expanded));\n\n const onClickDocument = (documentClickEvent) => {\n const { target: documentClickTarget } = documentClickEvent;\n const sidenavFlyout = document.getElementById(controls);\n\n const isClickOutside =\n !sidenavListItem.contains(documentClickTarget) && !sidenavFlyout.contains(documentClickTarget);\n\n if (isClickOutside) {\n sidenavListItem.setAttribute('aria-expanded', 'false');\n document.removeEventListener('click', onClickDocument);\n }\n };\n\n if (expanded) {\n document.removeEventListener('click', onClickDocument);\n } else {\n document.addEventListener('click', onClickDocument);\n }\n });\n });\n\n const sidenavBranchPickerSelect = $('#sidenav-branch-picker-select');\n sidenavBranchPickerSelect.on('change', (event) => event.currentTarget.form.submit());\n sidenavBranchPickerSelect.on('select2:open', () => {\n document.querySelector('.select2-dropdown').setAttribute('data-bs-theme', 'dark');\n document.querySelector('.select2-dropdown .select2-search__field').setAttribute('placeholder', 'Find a branch...');\n });\n};\n","import * as bootstrap from 'bootstrap';\nimport { createElement, removeElementClasses } from './utils.js';\n\nconst TABS_HIDDEN_CLASSES = ['invisible', 'position-absolute'];\n\n/**\n * Collapse wrapped tabs to dropdown menu in given tab container.\n * @param {HTMLElement} tabs - Tab container HTML element.\n * @returns {void} Do not return any value, modify DOM instead.\n */\nexport const collapseTabs = (tabs) => {\n const tabsParent = tabs.parentNode;\n\n // Remove existing tab clones to prevent duplicates because they will be created from scratch below if needed.\n [...tabsParent.querySelectorAll('.nav.nav-tabs[data-clone=\"true\"]')].forEach((tabsClone) => tabsClone.remove());\n\n // For safety, do not operate on original tabs element, deep clone tabs to operate on its clone instead.\n const tabsClone = tabs.cloneNode(true);\n\n // Remove `id` element attribute from cloned tabs element to avoid potential `id` conflicts.\n tabsClone.removeAttribute('id');\n\n // Set `data-clone` attribute to `\"true\"` on tabs clone element to be able to easily distinguish it from the original.\n tabsClone.dataset.clone = 'true';\n\n /*\n * Add following classes to cloned element to:\n * 1. Make tabs span across the whole required width without wrapping.\n * 2. Force them to be (temporarily) invisible.\n */\n const tabsCloneTemporaryClasses = ['flex-nowrap', 'invisible', 'position-absolute', 'z-n1'];\n tabsClone.classList.add(...tabsCloneTemporaryClasses);\n\n // Append currently invisible cloned tabs to DOM right after the original tabs element.\n if (tabs.nextSibling) {\n tabsParent.insertBefore(tabsClone, tabs.nextSibling);\n } else {\n tabsParent.appendChild(tabsClone);\n }\n // Excessive tabs should be collapsed if tabs clone is wider than the original. Remember - clone does not wrap.\n const shouldCollapseTabs = () => tabsClone.getBoundingClientRect().width > tabs.getBoundingClientRect().width;\n\n // If there is no need to collapse tabs, show original tabs (if previously hidden) clean up tabs clone and `return` early.\n if (!shouldCollapseTabs()) {\n tabs.classList.remove(...TABS_HIDDEN_CLASSES);\n tabsParent.removeChild(tabsClone);\n return;\n }\n\n /*\n * Compose dropdown element. Ignore dropdown items for now, they will be added to the dropdown menu soon anyway. The\n * most important thing about this step is to append dropdown with visible toggle button at the end of cloned tabs\n * list to reach maximum width (dropdown toggle has considerable size too) before starting to actually collapse tabs.\n */\n const dropdownMenu = createElement('ul', { className: 'dropdown-menu dropdown-menu-end' });\n const dropdownToggleIcon = createElement('span', { className: 'mdi mdi-menu' });\n const dropdownToggleLabel = createElement('span', { className: 'visually-hidden' }, 'Toggle Dropdown');\n const dropdownToggle = createElement(\n 'button',\n {\n 'aria-expanded': 'false',\n className: 'btn dropdown-toggle text-secondary',\n 'data-bs-toggle': 'dropdown',\n type: 'button',\n },\n dropdownToggleIcon,\n dropdownToggleLabel,\n );\n const dropdown = createElement(\n 'li',\n { className: 'dropdown flex-grow-1 mb-n1 text-end' },\n dropdownToggle,\n dropdownMenu,\n );\n tabsClone.appendChild(dropdown);\n\n /*\n * Identify tabs that require collapsing by taking out one by one from the right-hand side until tabs width can fit\n * inside its parent container. Essentially, overflowing tabs are moved from tab list to future dropdown menu.\n */\n const collapsedTabs = [];\n while (shouldCollapseTabs()) {\n const lastTab = dropdown.previousElementSibling; // With dropdown appended to DOM, its previous siblings are tabs.\n collapsedTabs.unshift(lastTab); // Use `unshift` instead of `push` because this loop is iterating backward in a sense.\n tabsClone.removeChild(lastTab);\n }\n\n /*\n * Properly convert collapsed tabs to dropdown items:\n * 1. Remove all `<li>` `nav-item` element classes.\n * 2. Remove all `<a>` `nav-link` element classes other than `active` and `disabled` to maintain valid tab state.\n * 3. Add `dropdown-item` class to `<a>` element (formerly `nav-link`).\n * 4. Append collapsed tab to dropdown menu.\n */\n collapsedTabs.forEach((collapsedTab) => {\n removeElementClasses(collapsedTab);\n\n [...collapsedTab.children].forEach((navLink) => {\n removeElementClasses(navLink, 'active', 'disabled');\n navLink.classList.add('dropdown-item', 'justify-content-between');\n });\n\n dropdownMenu.appendChild(collapsedTab);\n });\n\n /*\n * Tabs clone with collapsed tabs is now ready to be swapped with original. The only thing left to do is to\n * make it synchronize its state back to the original.\n */\n [...tabsClone.querySelectorAll('a')].forEach((clonedTab) => {\n clonedTab.addEventListener('shown.bs.tab', () => {\n const originalTab = tabs.querySelector(`a[href=\"${clonedTab.getAttribute('href')}\"]`);\n const originalTabInstance = bootstrap.Tab.getInstance(originalTab) || new bootstrap.Tab(originalTab);\n originalTabInstance.show();\n });\n });\n\n // Swap tabs clone with the original, in other words swap wrapped tabs with collapsed tabs.\n tabs.classList.add(...TABS_HIDDEN_CLASSES);\n tabsClone.classList.remove(...tabsCloneTemporaryClasses);\n};\n\n/**\n * Observe size changes of all tab containers on the page and collapse tabs inside of them if they wrap.\n * @example\n * // Run `collapseTabs` algorithm for all tabs on the page exactly once, i.e. observe and immediately unobserve.\n * const unobserveCollapseTabs = observeCollapseTabs();\n * unobserveCollapseTabs();\n * @returns {function(): void} Unobserve function - disconnect all resize observers created during function call.\n */\nexport const observeCollapseTabs = () => {\n const resizeObservers = [...document.querySelectorAll('.nav.nav-tabs')].map((tabs) => {\n const resizeObserver = new ResizeObserver(() => collapseTabs(tabs));\n resizeObserver.observe(tabs);\n return resizeObserver;\n });\n\n return () => resizeObservers.forEach((resizeObserver) => resizeObserver.disconnect());\n};\n","import { getCookie, removeCookie, setCookie } from './cookie.js';\n\nconst THEME_MODAL_ID = 'theme_modal';\n\nconst THEME_DARK = 'dark';\nconst THEME_LIGHT = 'light';\nconst THEME_SYSTEM = 'system';\n\n/**\n * Get preferred system color scheme.\n * @returns {('dark'|'light')} Preferred system color scheme.\n */\nconst getPreferredColorScheme = () =>\n window.matchMedia?.(`(prefers-color-scheme: ${THEME_DARK})`).matches ? THEME_DARK : THEME_LIGHT;\n\n/**\n * Check if given `theme` is a valid Nautobot theme, i.e. `'dark'`, `'light'`, or `'system'`.\n * @param {string} theme - Theme in question.\n * @returns {boolean} `true` is given `theme` is a valid Nautobot theme, `false` otherwise.\n */\nconst isValidTheme = (theme) => theme === THEME_DARK || theme === THEME_LIGHT || theme === THEME_SYSTEM;\n\n/**\n * Automatically detect Nautobot theme. It is derived from `cookie` or `localStorage` if set manually, and falls back to\n * preferred system color scheme by default.\n * @returns {('dark'|'light'|'system')} Detected Nautobot theme.\n */\nconst detectTheme = () => {\n const cookieTheme = getCookie('theme');\n if (isValidTheme(cookieTheme)) {\n return cookieTheme;\n }\n\n const localStorageTheme = window.localStorage?.getItem('theme');\n if (isValidTheme(localStorageTheme)) {\n return localStorageTheme;\n }\n\n return THEME_SYSTEM;\n};\n\n/**\n * Set Nautobot theme.\n * @param {('dark'|'light'|'system')} theme - Nautobot theme to be set.\n * @param {{ manual?: boolean }} [options] - Setter function options object. Currently supported option is `manual`.\n * @returns {void} Do not return any value, set given `theme` and save it into a persistent store if `manual` is `true`.\n */\nconst setTheme = (theme, options) => {\n const isManual = Boolean(options?.manual);\n\n const modal = document.getElementById(THEME_MODAL_ID);\n const buttons = modal?.querySelectorAll('button[data-nb-theme]') ?? [];\n\n buttons.forEach((button) =>\n ['border', 'border-primary'].forEach((className) =>\n button.classList.toggle(className, button.dataset.nbTheme === theme),\n ),\n );\n\n const bsTheme = theme === THEME_SYSTEM ? getPreferredColorScheme() : theme;\n document.documentElement.dataset.theme = bsTheme;\n document.documentElement.dataset.bsTheme = bsTheme;\n\n if (theme === THEME_SYSTEM) {\n removeCookie('theme');\n window.localStorage?.removeItem('theme');\n } else if (isManual) {\n setCookie('theme', theme);\n window.localStorage?.setItem('theme', theme);\n }\n\n if (theme === THEME_DARK || (theme === THEME_SYSTEM && bsTheme === THEME_DARK)) {\n [...document.getElementsByTagName('object')].forEach((object) => {\n object.addEventListener('load', (event) => {\n if (event.target.contentDocument) {\n const images = event.target.contentDocument.getElementsByTagName('image');\n const short_names = event.target.contentDocument.getElementsByClassName('rack-device-shortname');\n const full_names = event.target.contentDocument.getElementsByClassName('rack-device-fullname');\n\n [...images, ...short_names, ...full_names].forEach((rack_image) =>\n rack_image.setAttribute('filter', 'url(#darkmodeinvert)'),\n );\n }\n });\n });\n }\n\n if (isManual) {\n document.location.reload();\n }\n};\n\nexport const initializeTheme = () => {\n const modal = document.getElementById(THEME_MODAL_ID);\n const buttons = modal?.querySelectorAll('button[data-nb-theme]') ?? [];\n\n setTheme(detectTheme());\n window.matchMedia(`(prefers-color-scheme: ${THEME_DARK})`).addEventListener('change', () => setTheme(detectTheme()));\n\n const onClick = (event) => setTheme(event.currentTarget.dataset.nbTheme, { manual: true });\n buttons.forEach((button) => button.addEventListener('click', onClick));\n\n return () => buttons.forEach((button) => button.removeEventListener('click', onClick));\n};\n","/* eslint import/order: ['error', { alphabetize: { order: 'asc' }, 'newlines-between': 'ignore' }] */\n\nimport '../scss/nautobot.scss';\n\nimport * as bootstrap from 'bootstrap';\nwindow.bootstrap = bootstrap;\n\nimport ClipboardJS from 'clipboard';\nwindow.ClipboardJS = ClipboardJS;\n\nimport * as echarts from 'echarts';\nwindow.echarts = echarts;\n\nimport flatpickr from 'flatpickr';\nwindow.flatpickr = flatpickr;\n\nimport hljs from 'highlight.js/lib/core';\nimport 'highlight.js/styles/github.css';\nimport graphql from 'highlight.js/lib/languages/graphql';\nimport json from 'highlight.js/lib/languages/json';\nimport xml from 'highlight.js/lib/languages/xml';\nimport yaml from 'highlight.js/lib/languages/yaml';\n\nimport htmx from 'htmx.org';\nwindow.htmx = htmx;\n\nhljs.registerLanguage('graphql', graphql);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('xml', xml);\nhljs.registerLanguage('yaml', yaml);\nwindow.hljs = hljs;\n\nimport jQuery from 'jquery';\nwindow.jQuery = jQuery;\nwindow.$ = window.jQuery;\n\nimport 'jquery-ui';\nimport 'select2';\n\nimport { initializeCollapseToggleAll } from './collapse.js';\nimport { initializeDraggable } from './draggable.js';\nimport { initializeDrawers } from './drawer.js';\nimport { observeFormStickyFooters } from './form.js';\nimport { loadState, saveState } from './history.js';\nimport { initializeSearch } from './search.js';\nimport { initializeSelect2Fields, setSelect2Value } from './select2.js';\nimport { initializeSidenav } from './sidenav.js';\nimport { observeCollapseTabs } from './tabs.js';\nimport { initializeTheme } from './theme.js';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n window.nb ??= {};\n\n // History\n loadState();\n window.nb.history = { saveState };\n // Tooltips\n // https://getbootstrap.com/docs/5.3/components/tooltips/#enable-tooltips\n [...document.querySelectorAll('[data-bs-toggle=\"tooltip\"]')].forEach((tooltip) => new bootstrap.Tooltip(tooltip));\n\n // Sidenav\n initializeSidenav();\n\n // Collapse\n initializeCollapseToggleAll();\n\n // Draggable\n initializeDraggable();\n\n // Drawer\n initializeDrawers();\n\n // Form\n // TODO(norbert-mieczkowski-codilime): for htmx SPA-like behavior, re-initialize sticky footers like tabs below.\n observeFormStickyFooters();\n\n // Search\n initializeSearch();\n\n // Select2\n window.nb.select2 = { initializeSelect2Fields, setSelect2Value };\n\n // Tabs\n /*\n * TODO(norbert-mieczkowski-codilime): listen for proper event type(s) to re-initialize collapse tabs observers when\n * htmx dynamic content reloading is implemented. Said re-initialization should be as simple as something like:\n * ```js\n * let unobserveCollapseTabs = observeCollapseTabs();\n * document.body.addEventListener('htmx:xhr:loadend', () => unobserveCollapseTabs());\n * document.body.addEventListener('htmx:load', () => {\n * unobserveCollapseTabs = observeCollapseTabs();\n * });\n * ```\n */\n observeCollapseTabs();\n\n // Theme\n initializeTheme();\n\n const toggleFavorite = (element, event) => {\n if (event.detail.successful) {\n element.classList.toggle('active');\n }\n };\n window.toggleFavorite = toggleFavorite;\n\n const setRequestUrl = (element, event) => {\n const isFavorite = element.classList.contains('active');\n event.detail.path = isFavorite ? element.dataset.deleteUrl : element.dataset.addUrl;\n };\n window.setRequestUrl = setRequestUrl;\n\n // Remove the blur after clicking the footer links that are opening mostly in the new tab\n // Keeping focus on those items is what keeps the tooltip as well\n document.querySelectorAll('a[data-bs-toggle=\"tooltip\"], div[data-bs-toggle=\"tooltip\"] > a').forEach((el) => {\n el.addEventListener('click', () => {\n el.blur();\n });\n });\n\n // When modal is being closed, bootstrap automatically restore the focus on the element that was triggering the modal\n // As a result, after modal close tooltip was triggered as well\n document.addEventListener('hidden.bs.modal', () => {\n document.querySelectorAll('[data-bs-toggle=\"tooltip\"] > a').forEach((el) => {\n el.blur();\n });\n });\n});\n","/**\n * Observe pinned state of elements of class `nb-form-sticky-footer` on the page and add drop shadow with `nb-is-pinned`\n * class if they are pinned. This is purely cosmetic and does not affect functionality.\n * @example\n * // Run form sticky footers observer algorithm exactly once, i.e. observe and immediately unobserve.\n * const unobserveFormStickyFooters = observeFormStickyFooters();\n * unobserveFormStickyFooters();\n * @returns {function(): void} Unobserve function - disconnect all resize observers created during function call.\n */\nexport const observeFormStickyFooters = () => {\n // Form sticky footers pinned state detection with `IntersectionObserver` based on: https://stackoverflow.com/a/57991537.\n const intersectionObserver = new IntersectionObserver(\n ([entry]) => entry.target.classList.toggle('nb-is-pinned', entry.intersectionRatio < 1),\n { threshold: [1] },\n );\n\n const formStickyFooters = [...document.querySelectorAll('.nb-form-sticky-footer')];\n formStickyFooters.forEach((formStickyFooter) => intersectionObserver.observe(formStickyFooter));\n\n return () => {\n intersectionObserver.disconnect();\n };\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t825: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunknautobot\"] = self[\"webpackChunknautobot\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [68], () => (__webpack_require__(226)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","DRAGGABLE_CLASS","DRAGGABLE_CONTAINER_CLASS","DRAGGING_CLASS","DRAWER_OPEN_CLASS","toggleDrawer","drawer","force","classList","toggle","isOpen","contains","setAttribute","drawerToggles","document","querySelectorAll","id","forEach","drawerToggle","getElementsByClassName","filter","openDrawer","rafRetriesRemaining","window","requestAnimationFrame","focusDrawer","getComputedStyle","visibility","focus","activeElement","nextActiveElement","querySelector","preventScroll","event","dispatchEvent","CustomEvent","bubbles","cancelable","SESSION_STORAGE_KEY","saveState","state","stateToSave","undefined","history","sessionStorage","setItem","JSON","stringify","createElement","tag","attributes","children","element","Object","entries","attribute","value","child","insertAdjacentText","appendChild","removeElementClasses","ignore","className","includes","remove","rem","px","rootFontSize","documentElement","fontSize","parseInt","FORM_CONTROL_PADDING_X","GAP","ICON_SIZE","BASE_SEARCH_INPUT_PADDING_X","getElement","Document","Element","setSelect2Value","select2","$","val","option","innerText","text","nextValue","length","getAttribute","map","trigger","initializeSelect2","context","selector","options","allowClear","placeholder","selectionCssClass","theme","width","initializeColorPicker","dropdownParent","colorPickerClassCopy","data","container","templateResult","templateSelection","initializeDynamicChoiceSelection","ajax","params","this","offset","page","q","term","search_field","api_version","depth","content_type","extra_query_parameters","fromEntries","name","flatMap","param_name","split","parse","exception","has_ref_field","startsWith","ref_field","slice","id_prefix","match","closest","ref_field_value","field_value","select","selectedOptions","style","opacity","param_value","parameters","String","limit","URLSearchParams","toString","delay","processResults","$element","removeAttribute","results","previous","values","reduce","accumulator","record","index","disabled","Boolean","item","group","site","url","should_nullify_children","collection","property","pagination","more","next","dataUrl","filter_regex","rendered_url","exec","filter_field","custom_attribute","replace","parseURL","initializeMultiValueChar","language","noResults","multiple","tags","initializeStaticChoiceSelection","initializeSelect2Fields","modal","getCookie","cookie","find","setCookie","properties","path","entry","join","removeCookie","expires","SIDENAV_COLLAPSED_KEY","toggleSidenav","toggler","controls","expanded","getElementById","localStorage","removeItem","TABS_HIDDEN_CLASSES","THEME_MODAL_ID","THEME_DARK","THEME_LIGHT","THEME_SYSTEM","isValidTheme","detectTheme","cookieTheme","localStorageTheme","getItem","setTheme","isManual","manual","button","dataset","nbTheme","bsTheme","matchMedia","matches","getElementsByTagName","object","addEventListener","target","contentDocument","rack_image","location","reload","bootstrap","ClipboardJS","echarts","flatpickr","htmx","registerLanguage","graphql","json","xml","yaml","hljs","jQuery","nb","pathname","search","hash","replaceState","loadState","tooltip","sidenavCollapsedInitialState","sidenavListItem","onClickDocument","documentClickEvent","documentClickTarget","sidenavFlyout","removeEventListener","sidenavBranchPickerSelect","on","currentTarget","form","submit","initializeSidenav","areAll","collapseElements","collapsedOrExpanded","every","isCollapsed","getCollapseToggleAllTargets","collapseToggleAll","nbTarget","collapse","collapseInstance","Collapse","getOrCreateInstance","hide","show","textContent","initializeCollapseToggleAll","createHandleOnMouseListener","isDraggable","handle","onMouseDown","onMouseUp","draggable","dataTransfer","clearData","setData","add","preventDefault","getData","insertBefore","dropDraggable","height","top","getBoundingClientRect","clientY","nextSibling","left","right","clientX","append","initializeDraggable","nextState","restState","keys","dismiss","nbDismiss","nbToggle","intersectionObserver","IntersectionObserver","intersectionRatio","threshold","formStickyFooter","observe","observeFormStickyFooters","headerSearch","NAV_MENU","navMenu","SEARCHABLE_MODELS","tabs","tab_details","groups","group_details","items","item_link","item_details","BADGE_REG_EXP","RegExp","delimiter","headerSearchInput","closeSearchPopup","searchPopup","body","isPressedCmd","getModifierState","isPressedCtrl","ctrlKey","key","input","setSelectionRange","mainLeft","mainRight","headerSearchInputTop","icon","badges","required","type","clear","InputEvent","shouldHideClear","action","role","badge","nbLink","popup","overlay","addBadge","link","removeButton","class","existing","ResizeObserver","paddingInlineStart","phrase","model","normalize","trim","toLowerCase","isBackspace","isInputStart","selectionEnd","selectionStart","initializeSearch","resizeObservers","resizeObserver","tabsParent","parentNode","tabsClone","cloneNode","clone","tabsCloneTemporaryClasses","shouldCollapseTabs","removeChild","dropdownMenu","dropdownToggleIcon","dropdownToggleLabel","dropdownToggle","dropdown","collapsedTabs","lastTab","previousElementSibling","unshift","collapsedTab","navLink","clonedTab","originalTab","getInstance","collapseTabs","observeCollapseTabs","buttons","onClick","initializeTheme","toggleFavorite","detail","successful","setRequestUrl","isFavorite","deleteUrl","addUrl","el","blur","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","splice","r","d","definition","o","defineProperty","enumerable","get","g","globalThis","Function","e","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","bind","push","__webpack_exports__"],"sourceRoot":""}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,97 +1,26 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
-
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
3
|
-
|
|
4
1
|
<svg
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
sodipodi:docname="Jinja_software_logo.svg"
|
|
12
|
-
inkscape:export-filename="/Users/mitsuhiko/Development/jinja2/docs/_static/jinjabanner.png"
|
|
13
|
-
inkscape:export-xdpi="60"
|
|
14
|
-
inkscape:export-ydpi="60"
|
|
15
|
-
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
|
16
|
-
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
17
|
-
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
18
|
-
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
19
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
20
|
-
xmlns:svg="http://www.w3.org/2000/svg"
|
|
21
|
-
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
22
|
-
xmlns:cc="http://creativecommons.org/ns#"
|
|
23
|
-
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
|
24
|
-
<defs
|
|
25
|
-
id="defs4">
|
|
26
|
-
<linearGradient
|
|
27
|
-
id="linearGradient6558">
|
|
28
|
-
<stop
|
|
29
|
-
style="stop-color:#007dff;stop-opacity:1;"
|
|
30
|
-
offset="0"
|
|
31
|
-
id="stop6560" />
|
|
32
|
-
<stop
|
|
33
|
-
style="stop-color:#007dff;stop-opacity:1;"
|
|
34
|
-
offset="1"
|
|
35
|
-
id="stop6562" />
|
|
36
|
-
</linearGradient>
|
|
37
|
-
<radialGradient
|
|
38
|
-
inkscape:collect="always"
|
|
39
|
-
xlink:href="#linearGradient6558"
|
|
40
|
-
id="radialGradient6564"
|
|
41
|
-
cx="61.297768"
|
|
42
|
-
cy="60.910988"
|
|
43
|
-
fx="61.297768"
|
|
44
|
-
fy="60.910988"
|
|
45
|
-
r="44.688255"
|
|
46
|
-
gradientTransform="matrix(1,0,0,0.945104,0,3.343747)"
|
|
47
|
-
gradientUnits="userSpaceOnUse" />
|
|
48
|
-
</defs>
|
|
49
|
-
<sodipodi:namedview
|
|
50
|
-
id="base"
|
|
51
|
-
pagecolor="#ffffff"
|
|
52
|
-
bordercolor="#666666"
|
|
53
|
-
borderopacity="1.0"
|
|
54
|
-
gridtolerance="10000"
|
|
55
|
-
guidetolerance="10"
|
|
56
|
-
objecttolerance="10"
|
|
57
|
-
inkscape:pageopacity="0.0"
|
|
58
|
-
inkscape:pageshadow="2"
|
|
59
|
-
inkscape:zoom="2.8"
|
|
60
|
-
inkscape:cx="137.67857"
|
|
61
|
-
inkscape:cy="57.5"
|
|
62
|
-
inkscape:document-units="px"
|
|
63
|
-
inkscape:current-layer="layer1"
|
|
64
|
-
width="120px"
|
|
65
|
-
height="120px"
|
|
66
|
-
showguides="true"
|
|
67
|
-
inkscape:guide-bbox="true"
|
|
68
|
-
inkscape:window-width="1396"
|
|
69
|
-
inkscape:window-height="900"
|
|
70
|
-
inkscape:window-x="295"
|
|
71
|
-
inkscape:window-y="40"
|
|
72
|
-
inkscape:showpageshadow="2"
|
|
73
|
-
inkscape:pagecheckerboard="0"
|
|
74
|
-
inkscape:deskcolor="#d1d1d1"
|
|
75
|
-
inkscape:window-maximized="0" />
|
|
76
|
-
<metadata
|
|
77
|
-
id="metadata7">
|
|
78
|
-
<rdf:RDF>
|
|
79
|
-
<cc:Work
|
|
80
|
-
rdf:about="">
|
|
81
|
-
<dc:format>image/svg+xml</dc:format>
|
|
82
|
-
<dc:type
|
|
83
|
-
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
84
|
-
</cc:Work>
|
|
85
|
-
</rdf:RDF>
|
|
86
|
-
</metadata>
|
|
2
|
+
width="96"
|
|
3
|
+
height="96"
|
|
4
|
+
version="1.0"
|
|
5
|
+
viewBox="0 0 96 96"
|
|
6
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
7
|
+
>
|
|
87
8
|
<g
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
transform="translate(-13.571429,-13.928572)">
|
|
9
|
+
id="jinja_logo"
|
|
10
|
+
transform="translate(-13.571429,-13.928572)"
|
|
11
|
+
>
|
|
92
12
|
<path
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
13
|
+
d="m 105.45673,18.675923 c 0,0 -17.244781,8.242538 -31.283896,10.061975 -14.039107,1.819435 -40.8124,3.639673 -46.127212,2.355358 -5.314804,-1.284315 -9.129977,-2.78406 -9.129977,-2.78406 l 1.105796,3.747387 -3.411928,2.995888 0.604887,1.069255 1.40352,0.105914 4.30981,0.534612 0.604891,1.926657 2.405354,0.216875 1.205046,4.065143 c 0,0 5.111743,0.428701 6.615932,0.428701 1.504189,0 4.513013,-0.211826 4.513013,-0.211826 l 0.09924,1.603855 1.1058,0.211838 v 1.820732 l -2.410085,2.143532 0.60489,0.105912 v 0.746456 c 0,0 -5.41635,0.43203 -7.622506,0.110963 -2.206144,-0.321084 -2.608554,-0.322804 -2.608554,-0.322804 l -0.198489,0.211841 -0.09924,0.963328 h 0.500925 l 0.198474,4.176089 11.133671,-0.4287 -0.803363,14.449903 -0.09925,1.815695 -9.4277,-0.534626 -0.09924,-3.853303 h 2.102918 l 0.203211,-1.497956 1.904434,-0.4287 0.302448,-0.423665 -7.12158,-1.714818 -5.415611,1.603855 0.902596,0.751503 h 0.902612 l 0.09924,1.286116 1.904445,0.105912 v 3.747387 l -2.102919,0.53463 0.401674,0.852369 0.500925,0.322785 v 2.889986 h 1.304284 v 13.375612 l -2.107646,0.322791 0.302437,3.853297 1.29956,0.216875 -0.198476,8.775868 5.718048,0.1059 -1.205036,-8.669926 8.624341,-0.211842 -0.600161,4.705689 -0.80336,3.318679 8.723576,0.10591 0.09924,-8.558977 6.015767,-0.534612 -0.29772,5.45717 -0.203201,3.207719 h 5.117899 l -0.20321,-8.775853 0.704123,0.110964 0.198485,-4.176105 h -0.803361 l -0.297723,-1.714818 -0.500924,-4.922556 0.198485,-5.668996 h 1.101071 v -3.424601 l -1.403517,0.10591 0.203199,-4.039919 1.630357,-0.161388 0.07561,-1.311334 0.926236,-0.136182 0.949857,-0.721236 -5.713334,-1.175154 -5.666072,1.255848 0.552898,0.907857 0.600162,-0.05044 0.699398,-0.02522 0.1276,1.654296 1.578368,-0.07565 0.02835,3.58095 -6.795506,-0.15635 0.226837,-3.828095 0.222099,-3.480075 v -4.574549 l 0.20321,-4.81663 13.609913,-0.696015 16.194854,-0.933059 0.151215,3.076591 -0.576523,7.383817 -0.250464,6.874418 -5.963796,-0.105915 -0.02835,-4.816629 2.206879,-0.08069 0.09925,-1.361781 0.902596,-0.136178 -0.04726,-0.267302 0.90261,-0.05044 0.500912,-0.670795 -6.743521,-1.578651 -6.719895,1.44247 0.477288,0.832193 0.751385,-0.05549 v 0.378277 h 0.926233 v 1.523161 l 1.980057,0.02522 -0.02364,4.226529 h -2.003678 l -0.02835,0.963331 0.704124,0.08069 -0.07561,3.666695 1.479132,0.08071 -0.174851,14.530598 -1.956419,0.398445 0.02363,0.696015 h 0.680499 v 3.72217 h 1.124707 l -0.297722,5.083953 -0.378048,4.438358 7.121569,0.1866 -0.226828,-3.853298 -0.524546,-3.207722 -0.103963,-2.784073 6.044121,-0.105914 -0.174851,4.307231 -0.02835,4.549316 3.411932,0.26731 4.635874,-0.1866 1.455507,-0.42872 -0.80337,-2.436048 -0.198478,-3.828092 -0.378047,-2.728585 5.765306,-0.211826 -0.250459,3.343904 -0.02363,5.245327 2.30612,0.21183 2.282498,-0.0504 1.101077,-0.348 -0.652135,-4.978015 -0.222116,-3.747394 0.978216,-0.105915 0.02363,-3.343902 0.274093,-0.05548 -0.04728,-0.721233 h -1.129421 l -0.226827,-2.461285 -0.09924,-10.677284 0.850626,-0.02522 v -3.505308 l 0.354416,0.05549 v -0.696017 l -1.25702,-0.110961 0.02835,-4.06514 2.102917,-0.186605 -0.122861,-1.366825 0.926237,-0.08069 -0.052,-0.267314 1.228675,-0.61532 -6.24261,-1.255849 -6.341832,1.286115 0.401673,0.746456 0.978213,-0.0807 0.05199,0.32279 h 0.826987 l 0.04726,1.603855 2.05567,-0.02522 0.174848,3.934007 -7.268076,-0.05547 -0.850624,-5.911092 -0.680487,-3.132083 -0.548183,-5.618557 0.326073,-3.288431 14.488882,-1.099496 0.04726,-4.897336 0.727755,-0.186608 -0.04724,-0.746454 -0.552908,-0.322787 c -1.14e-4,0 -7.922562,1.174894 -10.429546,1.442468 -0.706297,0.07537 -0.652807,0.07042 -1.228673,0.13113 l -0.07561,-0.907852 -2.996075,-1.568554 0.03781,-1.825778 1.030198,-0.03027 0.0756,-2.51171 c 0,0 6.139781,-0.402974 8.421138,-0.938108 2.281355,-0.535141 5.51485,-1.069244 5.51485,-1.069244 l 1.531113,-4.145836 3.033892,-0.882633 0.250451,-0.696015 6.86639,-1.901424 0.77974,-0.640542 -2.60858,-5.699265 0.25048,-1.286117 1.32792,-0.696013 0.95457,-2.915207 z m -32.989856,21.727805 -0.03781,2.072926 1.554746,0.06556 -0.09924,1.96701 -3.048061,1.997266 -0.189019,0.57497 1.228671,0.01009 -0.0095,0.484186 -9.31428,0.453923 0.06143,-1.37691 0.425312,-0.685933 0.02835,-0.438784 0.0095,-0.948193 0.264629,-0.630458 0.09924,-0.509392 v -0.363141 l 0.401684,-1.603871 z m -19.479186,1.765256 -0.226835,1.392043 0.727746,0.857404 -0.04725,1.497955 0.675763,1.044022 -0.17485,1.230631 0.500923,0.721234 -9.503313,0.373227 -0.02363,-0.317741 1.101086,-0.13618 0.05197,-0.403482 -2.405367,-1.3063 -0.127589,-2.088047 1.15306,-0.05547 0.09925,-2.249446 z m 14.063574,32.107534 5.765308,0.373224 -0.198471,7.762091 0.751371,6.365024 -6.115005,-0.211839 z m -38.608682,0.322786 9.229227,0.479138 -0.803361,5.35126 v 4.498891 l 0.652137,2.511709 -9.026014,0.428704 z m 59.066078,0.05044 V 87.92449 l -5.864545,0.428706 -0.203201,-7.010602 -0.652148,-6.531449 z m -44.421242,0.29757 6.819132,0.02522 0.07089,12.306371 -6.365468,0.110961 -0.326075,-3.989484 -0.02363,-3.959223 z"
|
|
14
|
+
fill="currentcolor"
|
|
15
|
+
fill-opacity="1"
|
|
16
|
+
fill-rule="evenodd"
|
|
17
|
+
stroke="currentcolor"
|
|
18
|
+
stroke-width="1"
|
|
19
|
+
stroke-linecap="butt"
|
|
20
|
+
stroke-linejoin="miter"
|
|
21
|
+
stroke-miterlimit="4"
|
|
22
|
+
stroke-dasharray="none"
|
|
23
|
+
stroke-opacity="1"
|
|
24
|
+
/>
|
|
96
25
|
</g>
|
|
97
26
|
</svg>
|
|
@@ -16,7 +16,7 @@ $('#cabletrace_modal').on('show.bs.modal', function (event) {
|
|
|
16
16
|
'<div class="col-md-4 text-center">' + segment[0].device.name + '<br />' + segment[0].name + '</div>' +
|
|
17
17
|
'<div class="col-md-4 text-center">Cable #' + segment[1].id + '</div>' +
|
|
18
18
|
'<div class="col-md-4 text-center">' + segment[2].device.name + '<br />' + segment[2].name + '</div>' +
|
|
19
|
-
'</div><hr />'
|
|
19
|
+
'</div><hr class="border-top" />'
|
|
20
20
|
);
|
|
21
21
|
})
|
|
22
22
|
}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* Example Usage:
|
|
13
13
|
*
|
|
14
14
|
* Diff Viewer:
|
|
15
|
-
* <div class="editor-container"
|
|
15
|
+
* <div class="nb-editor-container"
|
|
16
16
|
* data-mode="diff"
|
|
17
17
|
* data-original="{{ diff_removed }}"
|
|
18
18
|
* data-modified="{{ diff_added }}"
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* </div>
|
|
21
21
|
*
|
|
22
22
|
* Standard Editor:
|
|
23
|
-
* <div class="editor-container"
|
|
23
|
+
* <div class="nb-editor-container"
|
|
24
24
|
* data-lang="yaml"
|
|
25
25
|
* data-value="key: value"
|
|
26
26
|
* data-options='{"readOnly": false}'>
|
|
@@ -280,7 +280,7 @@
|
|
|
280
280
|
|
|
281
281
|
// Initialize editors with error handling
|
|
282
282
|
document.addEventListener('DOMContentLoaded', () => {
|
|
283
|
-
const containers = Array.from(document.querySelectorAll('.editor-container'));
|
|
283
|
+
const containers = Array.from(document.querySelectorAll('.nb-editor-container'));
|
|
284
284
|
Promise.allSettled(containers.map(host => Editor.create(host)))
|
|
285
285
|
.then(results => results.forEach((result, i) => {
|
|
286
286
|
if (result.status === 'rejected') {
|
|
@@ -289,4 +289,4 @@
|
|
|
289
289
|
}
|
|
290
290
|
}));
|
|
291
291
|
});
|
|
292
|
-
})(window, document);
|
|
292
|
+
})(window, document);
|