From 3d6ae2f1fe1579f9b81cc53afdcee5dfbb6c8c94 Mon Sep 17 00:00:00 2001 From: Andy Beverley Date: Sun, 4 Jan 2026 22:39:16 +0000 Subject: [PATCH 1/9] Performance - link latest record version (D1098) This commit improves performance by linking the current version of a record to its main stub, thereby making retrieval faster for records with lots of versions. The version retrieval functionality is retained for the purpose of historical view, which operates as it previously did. This commit also includes the addition of curval subfields to the y-axis of graphs (back-end only) which was needed to test some of the changes. It also includes sorting for grouping, which was needed for keeping the grouping tests working as before. --- lib/GADS.pm | 1 - lib/GADS/API.pm | 9 +- lib/GADS/Column.pm | 44 +- lib/GADS/Column/Autocur.pm | 7 +- lib/GADS/Column/Createddate.pm | 2 +- lib/GADS/Column/Curcommon.pm | 19 +- lib/GADS/Column/Curval.pm | 7 +- lib/GADS/Column/Filval.pm | 7 +- lib/GADS/Column/Id.pm | 2 +- lib/GADS/Column/Serial.pm | 2 +- lib/GADS/DateTime.pm | 5 + lib/GADS/Graph.pm | 45 +- lib/GADS/Graph/Data.pm | 19 +- lib/GADS/Layout.pm | 8 +- lib/GADS/Record.pm | 80 +- lib/GADS/Records.pm | 799 +- lib/GADS/RecordsJoin.pm | 441 +- lib/GADS/Role/Presentation/Column.pm | 1 + lib/GADS/Role/Presentation/Records.pm | 2 +- lib/GADS/Schema.pm | 2 +- lib/GADS/Schema/Result/Current.pm | 27 + lib/GADS/Schema/Result/Graph.pm | 14 + share/fixtures/110/conf/all_tables.json | 285 + share/fixtures/110/conf/current.json | 73 + share/fixtures/110/conf/graphs.json | 17 + share/fixtures/110/conf/layout.json | 53 + share/fixtures/110/conf/permissions.json | 17 + share/fixtures/110/conf/views_global.json | 28 + share/fixtures/110/permissions/_config_set | 17 + .../fixtures/110/permissions/_dumper_version | 1 + .../110/permissions/permission/10.fix | 7 + .../110/permissions/permission/12.fix | 7 + .../fixtures/110/permissions/permission/3.fix | 7 + .../MySQL/deploy/110/001-auto-__VERSION.sql | 18 + .../migrations/MySQL/deploy/110/001-auto.sql | 1279 +++ .../MySQL/downgrade/110-109/001-auto.sql | 19 + .../MySQL/upgrade/109-110/001-auto.sql | 19 + .../deploy/110/001-auto-__VERSION.sql | 18 + .../PostgreSQL/deploy/110/001-auto.sql | 1902 ++++ .../PostgreSQL/downgrade/110-109/001-auto.sql | 27 + .../PostgreSQL/upgrade/109-110/001-auto.sql | 29 + .../109-110/002-populate-current-versions.pl | 73 + .../_source/deploy/110/001-auto-__VERSION.yml | 92 + .../_source/deploy/110/001-auto.yml | 9765 +++++++++++++++++ t/003_search.t | 2 +- t/004_aggregate.t | 2 +- t/004_group.t | 55 +- t/012_graph_historical.t | 656 +- t/025_approval.t | 16 + t/026_purge.t | 15 +- t/lib/Test/GADS/DataSheet.pm | 2 + views/data_table.tt | 2 +- 52 files changed, 15187 insertions(+), 859 deletions(-) create mode 100644 share/fixtures/110/conf/all_tables.json create mode 100644 share/fixtures/110/conf/current.json create mode 100644 share/fixtures/110/conf/graphs.json create mode 100644 share/fixtures/110/conf/layout.json create mode 100644 share/fixtures/110/conf/permissions.json create mode 100644 share/fixtures/110/conf/views_global.json create mode 100644 share/fixtures/110/permissions/_config_set create mode 100644 share/fixtures/110/permissions/_dumper_version create mode 100644 share/fixtures/110/permissions/permission/10.fix create mode 100644 share/fixtures/110/permissions/permission/12.fix create mode 100644 share/fixtures/110/permissions/permission/3.fix create mode 100644 share/migrations/MySQL/deploy/110/001-auto-__VERSION.sql create mode 100644 share/migrations/MySQL/deploy/110/001-auto.sql create mode 100644 share/migrations/MySQL/downgrade/110-109/001-auto.sql create mode 100644 share/migrations/MySQL/upgrade/109-110/001-auto.sql create mode 100644 share/migrations/PostgreSQL/deploy/110/001-auto-__VERSION.sql create mode 100644 share/migrations/PostgreSQL/deploy/110/001-auto.sql create mode 100644 share/migrations/PostgreSQL/downgrade/110-109/001-auto.sql create mode 100644 share/migrations/PostgreSQL/upgrade/109-110/001-auto.sql create mode 100644 share/migrations/_common/upgrade/109-110/002-populate-current-versions.pl create mode 100644 share/migrations/_source/deploy/110/001-auto-__VERSION.yml create mode 100644 share/migrations/_source/deploy/110/001-auto.yml diff --git a/lib/GADS.pm b/lib/GADS.pm index 62ba1fa71..100959b0e 100644 --- a/lib/GADS.pm +++ b/lib/GADS.pm @@ -2762,7 +2762,6 @@ prefix '/:layout_name' => sub { $params->{aggregate} = $records->aggregate_presentation; $params->{columns} = [ map $_->presentation( group => $records->is_group, - group_col_ids => $records->group_col_ids, sort => $records->sort_first, filters => \@additional_filters, query_parameters => query_parameters, diff --git a/lib/GADS/API.pm b/lib/GADS/API.pm index c0a92b940..a8566e1b2 100644 --- a/lib/GADS/API.pm +++ b/lib/GADS/API.pm @@ -1183,7 +1183,7 @@ sub _get_records { # Check user has access error __"Invalid column ID for sort" unless $col_order && $col_order->user_can('read'); - my $sort = { type => $params->get('order[0][dir]'), id => $col_order->id }; + my $sort = { type => $params->get('order[0][dir]'), id => $col_order->id, parent_id => $col_order->parent_id }; $records->clear_sorts; $records->sort($sort); @@ -1203,11 +1203,10 @@ sub _get_records { { # Construct filter URL which will show all of this group of records my @filters; - foreach my $group_col_id (@{$records->group_col_ids}) + foreach my $group_col (@{$records->group_cols}) { - my $group_col = $layout->column($group_col_id); my $filter_value = $rec->get_field_value($group_col)->filter_value || ''; - push @filters, "$group_col_id=".uri_escape_utf8($filter_value); + push @filters, $group_col->id."=".uri_escape_utf8($filter_value); } my $desc = $rec->id_count == 1 ? 'record' : 'records'; $data->{_count} = { @@ -1220,7 +1219,7 @@ sub _get_records { else { $data->{_id} = $rec->current_id; }; - $data->{$_->id} = $rec->get_field_value($_)->for_table + $data->{$_->full_id} = $rec->get_field_value($_)->for_table foreach @{$records->columns_render}; push @{$return->{data}}, $data; diff --git a/lib/GADS/Column.pm b/lib/GADS/Column.pm index 6691922f8..651ed0c9f 100644 --- a/lib/GADS/Column.pm +++ b/lib/GADS/Column.pm @@ -70,6 +70,21 @@ has instance_id => ( isa => Int, ); +# If this is a field belonging to a curval and if so what that parent curval is +has parent_id => ( + is => 'ro', +); + +has parent => ( + is => 'lazy', +); + +sub _build_parent +{ my $self = shift; + return if !$self->parent_id; + $self->layout->column($self->parent_id); +} + has from_id => ( is => 'rw', trigger => sub { @@ -103,6 +118,12 @@ has id => ( isa => Int, ); +sub full_id +{ my $self = shift; + return $self->id if !$self->parent_id; + $self->parent_id."_".$self->id; +} + has internal => ( is => 'ro', isa => Bool, @@ -864,6 +885,16 @@ sub _build_instance_id $self->layout->instance_id; } +sub clone +{ my ($self, %params) = @_; + ref($self)->new( + schema => $self->schema, + layout => $self->layout, + set_values => $self->set_values, + %params, + ); +} + sub build_values { my ($self, $original) = @_; @@ -926,19 +957,6 @@ sub filter_value_to_text return $value; } -# Overridden where required -sub sort_columns -{ my $self = shift; - ($self); -} - -# Whether the sort columns when added should be added with a parent, and -# if so what is the paremt -sub sort_parent -{ my $self = shift; - return undef; # default no, undef in case used in arrays -} - # Overridden in child classes. This function is used # to cleanup specialist column data when a column # is deleted diff --git a/lib/GADS/Column/Autocur.pm b/lib/GADS/Column/Autocur.pm index ece4906c7..d6ce0771f 100644 --- a/lib/GADS/Column/Autocur.pm +++ b/lib/GADS/Column/Autocur.pm @@ -87,12 +87,15 @@ sub _build_refers_from_value_field } sub make_join -{ my ($self, @joins) = @_; +{ my ($self, $options, @joins) = @_; + my $join_current_version = $options->{join_current_version}; +{ $self->field => { record => { current => { - record_single => ['record_later', @joins], + $join_current_version + ? (current_version => [@joins]) + : (record_single => ['record_later', @joins]) } } } diff --git a/lib/GADS/Column/Createddate.pm b/lib/GADS/Column/Createddate.pm index 7a0457887..da91cc81a 100644 --- a/lib/GADS/Column/Createddate.pm +++ b/lib/GADS/Column/Createddate.pm @@ -45,7 +45,7 @@ has '+userinput' => ( default => 0, ); -sub tjoin {}; +sub tjoin { undef }; sub has_time { 1 }; diff --git a/lib/GADS/Column/Curcommon.pm b/lib/GADS/Column/Curcommon.pm index b604b2928..6a9387dea 100644 --- a/lib/GADS/Column/Curcommon.pm +++ b/lib/GADS/Column/Curcommon.pm @@ -119,7 +119,14 @@ has '+use_id_in_filter' => ( sub tjoin { my ($self, %options) = @_; - $self->make_join(map { $_->tjoin(already_seen => $options{already_seen}) } grep { !$_->internal } @{$self->curval_fields_retrieve(%options)}); + $self->make_join( + { join_current_version => $options{join_current_version} }, + map { + $_->tjoin(already_seen => $options{already_seen}) + } grep { + !$_->internal + } @{$self->curval_fields_retrieve(%options)} + ); } sub _build_fetch_with_record @@ -227,16 +234,6 @@ sub curval_fields_all [ map { $self->layout_parent->column($_, permission => 'read') } @{$self->curval_field_ids_all} ]; } -sub sort_columns -{ my $self = shift; - map { $_->sort_columns } @{$self->curval_fields}; -} - -sub sort_parent -{ my $self = shift; - $self; # This field is the parent for sort columns -} - # Does this column reference the field? sub has_curval_field { my ($self, $field) = @_; diff --git a/lib/GADS/Column/Curval.pm b/lib/GADS/Column/Curval.pm index ef9e56869..7933621cd 100644 --- a/lib/GADS/Column/Curval.pm +++ b/lib/GADS/Column/Curval.pm @@ -253,13 +253,16 @@ sub _build_refers_to_instance_id } sub make_join -{ my ($self, @joins) = @_; +{ my ($self, $options, @joins) = @_; + my $join_current_version = $options->{join_current_version}; return $self->field if !@joins; +{ $self->field => { value => { - record_single => ['record_later', @joins], + $join_current_version + ? ('current_version' => [@joins]) + : (record_single => ['record_later', @joins]) } } }; diff --git a/lib/GADS/Column/Filval.pm b/lib/GADS/Column/Filval.pm index 7eca57932..ef36db5d7 100644 --- a/lib/GADS/Column/Filval.pm +++ b/lib/GADS/Column/Filval.pm @@ -42,13 +42,16 @@ has '+table' => ( # Same as Column::Curval sub make_join -{ my ($self, @joins) = @_; +{ my ($self, $options, @joins) = @_; + my $join_current_version = $options->{join_current_version}; return $self->field if !@joins; +{ $self->field => { value => { - record_single => ['record_later', @joins], + $join_current_version + ? (current_version => [@joins]) + : (record_single => ['record_later', @joins]) } } }; diff --git a/lib/GADS/Column/Id.pm b/lib/GADS/Column/Id.pm index fd3cc9590..623a92757 100644 --- a/lib/GADS/Column/Id.pm +++ b/lib/GADS/Column/Id.pm @@ -47,7 +47,7 @@ has '+value_field' => ( sub cleanup {} -sub tjoin {} +sub tjoin { undef } 1; diff --git a/lib/GADS/Column/Serial.pm b/lib/GADS/Column/Serial.pm index cee4daeca..1a44975dd 100644 --- a/lib/GADS/Column/Serial.pm +++ b/lib/GADS/Column/Serial.pm @@ -57,7 +57,7 @@ has '+value_field' => ( default => 'serial', ); -sub tjoin {} +sub tjoin { undef } sub validate_search { my ($self, $value) = @_; diff --git a/lib/GADS/DateTime.pm b/lib/GADS/DateTime.pm index f0f9644ee..9a1a50f28 100644 --- a/lib/GADS/DateTime.pm +++ b/lib/GADS/DateTime.pm @@ -227,5 +227,10 @@ sub _parse_db $db_parser->parse_datetime($value); } +sub dt_parser +{ my $self = shift; + $self->schema->storage->datetime_parser; +} + 1; diff --git a/lib/GADS/Graph.pm b/lib/GADS/Graph.pm index 9bcf9dfdb..6c4cf9dd5 100644 --- a/lib/GADS/Graph.pm +++ b/lib/GADS/Graph.pm @@ -50,7 +50,7 @@ has _graph => ( my $graph = $self->schema->resultset('Graph')->find({ 'me.id' => $self->id },{ - prefetch => [qw/x_axis x_axis_link y_axis group_by/], + prefetch => [qw/x_axis x_axis_link y_axis y_axis_link group_by/], }); $graph or error __x"Requested graph ID {id} not found", id => $self->id; @@ -66,6 +66,7 @@ has set_values => ( $self->x_axis_link($original->{x_axis_link}); $self->x_axis_grouping($original->{x_axis_grouping}); $self->y_axis($original->{y_axis}); + $self->y_axis_link($original->{y_axis_link}); $self->y_axis_stack($original->{y_axis_stack}); $self->description($original->{description}); $self->stackseries($original->{stackseries}); @@ -238,12 +239,37 @@ has as_percent => ( builder => sub { $_[0]->_graph && $_[0]->_graph->as_percent }, ); +sub set_y_axis +{ my ($self, $value) = @_; + if ($value =~ /^([0-9]+)_([0-9]+)$/) + { + $self->y_axis($2); + $self->y_axis_link($1); + return; + } + $self->y_axis_link(undef); + $self->y_axis($value); +} + has y_axis => ( is => 'rw', lazy => 1, builder => sub { $_[0]->_graph && $_[0]->_graph->y_axis && $_[0]->_graph->y_axis->id }, ); +has y_axis_link => ( + is => 'rw', + lazy => 1, + builder => sub { $_[0]->_graph && $_[0]->_graph->y_axis_link && $_[0]->_graph->y_axis_link->id }, +); + +sub y_axis_full +{ my $self = shift; + return $self->y_axis_link."_".$self->y_axis + if $self->y_axis_link; + return $self->y_axis; +} + has y_axis_label => ( is => 'rw', lazy => 1, @@ -338,8 +364,15 @@ sub write if ($newgraph->{y_axis} = $self->y_axis) { - $self->layout->column_this_instance($self->y_axis) - or error __x"Invalid Y-axis {y_axis}", y_axis => $self->y_axis; + if ($self->y_axis_link) + { + $self->layout->column_this_instance($self->y_axis_link) + or error __x"Invalid Y-axis parent {y_axis_link}", y_axis_link => $self->y_axis_link; + } + else { + $self->layout->column_this_instance($self->y_axis) + or error __x"Invalid Y-axis {y_axis}", y_axis => $self->y_axis; + } } $newgraph->{y_axis_stack} = $self->y_axis_stack or error __"A valid value is required for Y-axis stacking"; @@ -348,6 +381,7 @@ sub write $newgraph->{y_axis_stack} eq 'sum' && !$newgraph->{y_axis} and error __"Please select a Y-axis"; + $newgraph->{y_axis_link} = $self->y_axis_link; $newgraph->{y_axis_label} = $self->y_axis_label; @@ -447,6 +481,10 @@ sub import_hash old => $self->y_axis_stack, new => $values->{y_axis_stack}, name => $self->title if $options{report_only} && $self->y_axis_stack ne $values->{y_axis_stack}; $self->y_axis_stack($values->{y_axis_stack}); + notice __x"Updating y_axis_link from {old} to {new} for graph {name}", + old => $self->y_axis_link, new => $values->{y_axis_link}, name => $self->title + if $options{report_only} && $self->y_axis_link != $values->{y_axis_link}; + $self->y_axis_link($values->{y_axis_link}); notice __x"Updating y_axis_label from {old} to {new} for graph {name}", old => $self->y_axis_label, new => $values->{y_axis_label}, name => $self->title if $options{report_only} && $self->y_axis_label ne $values->{y_axis_label}; @@ -521,6 +559,7 @@ sub export_hash title => $self->title, description => $self->description, y_axis => $self->y_axis, + y_axis_link => $self->y_axis_link, y_axis_stack => $self->y_axis_stack, y_axis_label => $self->y_axis_label, x_axis => $self->x_axis, diff --git a/lib/GADS/Graph/Data.pm b/lib/GADS/Graph/Data.pm index 1ddc6ba35..170ba1074 100644 --- a/lib/GADS/Graph/Data.pm +++ b/lib/GADS/Graph/Data.pm @@ -339,6 +339,11 @@ sub y_axis_col $self->records->layout->column($self->y_axis); } +sub y_axis_link_col +{ my $self = shift; + $self->records->layout->column($self->y_axis_link); +} + sub trend_range_amount { my $self = shift; return undef if !$self->x_axis_range; @@ -403,8 +408,9 @@ sub _build_data $records->view($self->view); push @columns, +{ - id => $self->y_axis, - operator => $self->y_axis_stack, + id => $self->y_axis, + operator => $self->y_axis_stack, + parent_id => $self->y_axis_link, # What the parent curval is, if we're picking a field from within a curval } if $self->y_axis; $records->columns(\@columns); @@ -473,23 +479,18 @@ sub _build_data my ($results, $series_keys, $datemin, $datemax); if ($self->trend) { - # Force current IDs as of today (without rewind set) to be calculated - # first, otherwise the current IDs as at the start of the period will - # be used - $records->generate_cid_query; - my $search = $records->search; # Retain quick search across historical queries foreach my $x (@x) { - $records->clear(retain_current_ids => 1); # Retain record IDs across results + $records->clear; $records->search($search); # The period to retrieve ($x) will be at the beginning of the # period. Move to the end of the period, by adding on one unit # (e.g. month) and then moving into the previous day by a second my $rewind = $x->clone->add($self->x_axis_grouping_calculated.'s' => 1)->subtract(seconds => 1); - $records->rewind($rewind); + $records->rewind_values($rewind); my $this_results; my $this_series_keys; ($this_results, $this_series_keys, $datemin, $datemax) = $self->_records_to_results($records, x_daterange => $x_daterange, diff --git a/lib/GADS/Layout.pm b/lib/GADS/Layout.pm index 2c6dcc650..bff65f70c 100644 --- a/lib/GADS/Layout.pm +++ b/lib/GADS/Layout.pm @@ -1575,14 +1575,16 @@ sub purge $_->delete foreach reverse $self->all(order_dependencies => 1, include_hidden => 1); $self->schema->resultset('UserLastrecord')->delete; + my $current_rs = $self->schema->resultset('Current')->search({ + instance_id => $self->instance_id, + }); + $current_rs->update({ current_version_id => undef }); $self->schema->resultset('Record')->search({ instance_id => $self->instance_id, },{ join => 'current', })->delete; - $self->schema->resultset('Current')->search({ - instance_id => $self->instance_id, - })->delete; + $current_rs->delete; $self->schema->resultset('InstanceGroup')->search({ instance_id => $self->instance_id, })->delete; diff --git a/lib/GADS/Record.pm b/lib/GADS/Record.pm index 1dfbc64c1..892fc244c 100644 --- a/lib/GADS/Record.pm +++ b/lib/GADS/Record.pm @@ -55,6 +55,7 @@ use MooX::Types::MooseLike::Base qw(Maybe Bool Int ArrayRef HashRef); use MooX::Types::MooseLike::DateTime qw/DateAndTime/; use namespace::clean; +with 'GADS::DateTime'; with 'GADS::Role::Presentation::Record'; my $hooks = GADS::Hooks->instance; @@ -635,7 +636,7 @@ sub _build_deleted return $self->schema->resultset('Record')->find($self->record_id)->deleted; } $self->set_deleted or return undef; - $self->schema->storage->datetime_parser->parse_datetime( + $self->dt_parser->parse_datetime( $self->set_deleted ); } @@ -836,7 +837,6 @@ sub _find layout => $self->layout, schema => $self->schema, columns => $self->columns, - rewind => $self->rewind, is_deleted => $find{deleted}, is_draft => $find{draftuser_id} || $find{include_draft}, no_view_limits => !!$find{draftuser_id}, @@ -844,6 +844,13 @@ sub _find include_children => 1, ignore_view_limit_extra => 1, ); + # Build automatically unless override required for chronology + $params{cvo_values} = 0 + if $find{chronology}; + # Only pass in if defined, otherwise it causes current_version_only to be + # cleared + $params{rewind} = $self->rewind + if $self->rewind; my $records = GADS::Records->new(%params); $self->columns_retrieved_do($records->columns_retrieved_do); @@ -854,13 +861,20 @@ sub _find my $record = {}; my $limit = 10; my $page = 1; my $first_run = 1; my $current_id; my @record_ids; while (1) { + my %common = ( + prefetch => 1, + limit => $limit, + page => $page, + current_version_only => $records->cvo_values, + rewind => $records->rewind_values + ); # No linked here so that we get the ones needed in accordance with this loop (could be either) - my @prefetches = $records->jpfetch(prefetch => 1, search => 1, limit => $limit, page => $page); # Still need search in case of view limit + my @prefetches = $records->jpfetch(search => 1, %common); # Still need search in case of view limit last if !@prefetches && !$first_run; my %options = $find{current_id} || $find{draftuser_id} ? () : (root_table => 'record', no_current => 1); - my $search = $records->search_query(prefetch => 1, linked => 1, limit => $limit, page => $page, chronology => $find{chronology}, %options); + my $search = $records->search_query(linked => 1, chronology => $find{chronology}, rewind => $records->rewind_values, %common, %options); # Still need search in case of view limit - @prefetches = $records->jpfetch(prefetch => 1, search => 1, linked => 0, limit => $limit, page => $page, %options); + @prefetches = $records->jpfetch(search => 1, linked => 0, %common, %options); my $root_table; if (my $record_id = $find{record_id}) @@ -869,7 +883,7 @@ sub _find { 'current' => [ 'deletedby', - $records->linked_hash(prefetch => 1, limit => $limit, page => $page), + $records->linked_hash(%common), ], }, ); # Add info about related current record @@ -897,14 +911,15 @@ sub _find panic "Unexpected find parameters"; } @prefetches = ( - $records->linked_hash(prefetch => 1, limit => $limit, page => $page), + $records->linked_hash(%common), 'deletedby', 'currents', { - 'record_single' => [ + $records->cvo_values ? ('current_version' => [@prefetches]) + : ('record_single' => [ 'record_later', @prefetches, - ], + ]), }, ); $root_table = 'Current'; @@ -913,17 +928,17 @@ sub _find panic "record_id or current_id needs to be passed to _find"; } - local $GADS::Schema::Result::Record::REWIND = $records->rewind_formatted + local $GADS::Schema::Result::Record::REWIND = $self->dt_parser->format_datetime($records->rewind) if $records->rewind; # Don't specify linked for fetching columns, we will get whataver is needed linked or not linked - my @columns_fetch = $records->columns_fetch(search => 1, limit => $limit, page => $page, %options); # Still need search in case of view limit - my $has_linked = $records->has_linked(prefetch => 1, limit => $limit, page => $page, %options); - my $base = $find{record_id} ? 'me' : $records->record_name(prefetch => 1, search => 1, limit => $limit, page => $page); + my @columns_fetch = $records->columns_fetch(search => 1, %common, %options); # Still need search in case of view limit + my $has_linked = $records->has_linked(%common, %options); + my $base = $find{record_id} ? 'me' : $records->record_name(search => 1, %common, current_version_only => $records->cvo_values); push @columns_fetch, {id => "$base.id"}; push @columns_fetch, $find{record_id} ? {deleted => "current.deleted"} : {deleted => "me.deleted"}; push @columns_fetch, $find{record_id} ? {linked_id => "current.linked_id"} : {linked_id => "me.linked_id"}; - push @columns_fetch, {linked_record_id => "record_single.id"} + push @columns_fetch, {linked_record_id => $records->cvo_values ? "current_version.id" : "record_single.id"} if $has_linked; push @columns_fetch, $find{record_id} ? {draftuser_id => "current.draftuser_id"} : {draftuser_id => "me.draftuser_id"}; push @columns_fetch, {current_id => "$base.current_id"}; @@ -1238,7 +1253,7 @@ sub versions 'current_id' => $self->current_id, approval => 0, }; - $search->{'me.created'} = { '<' => $self->schema->storage->datetime_parser->format_datetime($self->rewind) } + $search->{'me.created'} = { '<' => $self->dt_parser->format_datetime($self->rewind) } if $self->rewind; my @records = $self->schema->resultset('Record')->search($search,{ prefetch => 'createdby', @@ -1397,7 +1412,7 @@ sub initialise_field column => $column, schema => $record->schema, layout => $record->layout, - datetime_parser => $record->schema->storage->datetime_parser, + datetime_parser => $record->dt_parser, ); } } @@ -1884,12 +1899,14 @@ sub write return; } + my $current; + # New record? if ($self->new_entry) { $self->delete_user_drafts unless $options{no_draft_delete}; # Delete any drafts first, for both draft save and full save my $instance_id = $self->layout->instance_id; - my $current = $self->schema->resultset('Current')->create({ + $current = $self->schema->resultset('Current')->create({ parent_id => $self->parent_id, linked_id => $self->linked_id, instance_id => $instance_id, @@ -1923,6 +1940,9 @@ sub write $self->current_id($current->id); } + else { + $current = $self->schema->resultset('Current')->find($self->current_id); + } if ($need_rec && !$options{update_only}) { @@ -1933,6 +1953,9 @@ sub write })->id; $self->record_id_old($self->record_id) if $self->record_id; $self->record_id($id); + $current->update({ + current_version_id => $id, + }); } elsif ($self->layout->forget_history) { @@ -2618,8 +2641,25 @@ sub purge { my $self = shift; error __"You do not have permission to purge records" unless !$self->user || $self->user_can_purge; + my $guard = $self->schema->txn_scope_guard; $self->_purge_record_values($self->record_id); - $self->schema->resultset('Record')->find($self->record_id)->delete; + my $record_rs = $self->schema->resultset('Record')->find($self->record_id); + my $current_rs = $record_rs->current; + if ($record_rs->id == $current_rs->current_version_id) + { + error __"Unable to delete this version as there are none others" + if $current_rs->records < 2; + # Find previous version to save to current record + my $previous_version = $current_rs->records->search({ + 'me.id' => { '!=' => $record_rs->id }, + },{ + rows => 1, + order_by => { -desc => ['me.created', 'me.id'] }, + })->next; + $current_rs->update({ current_version_id => $previous_version->id }); + } + $record_rs->delete; + $guard->commit; } sub restore @@ -2888,9 +2928,11 @@ sub purge_current } $self->schema->resultset('Record') ->search({ current_id => $id })->update({ record_id => undef }); $self->schema->resultset('AlertCache')->search({ current_id => $id })->delete; + my $current = $self->schema->resultset('Current')->find($id); + $current->update({ current_version_id => undef }); $self->schema->resultset('Record')->search({ current_id => $id })->delete; $self->schema->resultset('AlertSend')->search({ current_id => $id })->delete; - $self->schema->resultset('Current')->find($id)->delete; + $current->delete; $guard->commit; my $user_id = $self->user && $self->user->id; diff --git a/lib/GADS/Records.pm b/lib/GADS/Records.pm index 637cf5327..380829b01 100644 --- a/lib/GADS/Records.pm +++ b/lib/GADS/Records.pm @@ -42,6 +42,7 @@ use MooX::Types::MooseLike::Base qw(Maybe Str ArrayRef HashRef Bool Int); use MooX::Types::MooseLike::DateTime qw/DateAndTime/; with 'GADS::RecordsJoin', 'GADS::Role::Presentation::Records', 'GADS::Helper::ConditionBuilder'; +with 'GADS::DateTime'; # Preferably this is passed in to prevent extra # DB reads, but loads it if it isn't @@ -361,31 +362,69 @@ has page => ( is => 'rw', ); -# Whether to take results from some previous point in time +# Whether to take values and search from some previous point in time has rewind => ( - is => 'rw', - isa => Maybe[DateAndTime], + is => 'rw', + isa => Maybe[DateAndTime], + trigger => sub { + my $self = shift; + $self->clear_current_version_only; + $self->clear_rewind_values; + $self->clear_rewind_recordset; + }, ); -sub rewind_formatted -{ my $self = shift; - $self->rewind or return; - $self->schema->storage->datetime_parser->format_datetime($self->rewind); -} +# Whether to take values from some previous point in time +has rewind_values => ( + is => 'rw', + isa => Maybe[DateAndTime], + lazy => 1, + trigger => sub { shift->clear_current_version_only }, + clearer => 1, + builder => sub { shift->rewind }, +); + +# Whether to take resultset of records from some previous point in time +has rewind_recordset => ( + is => 'rw', + isa => Maybe[DateAndTime], + lazy => 1, + trigger => sub { shift->clear_current_version_only }, + clearer => 1, + builder => sub { shift->rewind }, +); has include_approval => ( is => 'rw', default => 0, ); -# Internal parameter to set the exact current IDs that will be retrieved, -# without running any search queries. Used when downloading chunked data, when -# all the current IDs have already been retrieved -has _set_current_ids => ( - is => 'rw', - isa => Maybe[ArrayRef], +has cvo_values => ( + is => 'lazy', + clearer => 1, ); +sub clear_current_version_only +{ my $self = shift; + $self->clear_cvo_values; + $self->clear_cvo_recordset; +} + +sub _build_cvo_values +{ my $self = shift; + $self->rewind_values || $self->record_earlier || $self->previous_values ? 0 : 1; +} + +has cvo_recordset => ( + is => 'lazy', + clearer => 1, +); + +sub _build_cvo_recordset +{ my $self = shift; + $self->rewind_recordset || $self->record_earlier || $self->previous_values ? 0 : 1; +} + # A parameter that can be used externally to restrict to a set of current IDs. # This will also have the search parameters applied, which could include # limited views for the user (unlike the above internal parameter) @@ -396,17 +435,24 @@ has limit_current_ids => ( # Current ID results, or limit to specific current IDs has current_ids => ( - is => 'lazy', + is => 'rwp', isa => Maybe[ArrayRef], # If undef will be ignored + lazy => 1, + builder => 1, clearer => 1, predicate => 1, ); sub _build_current_ids { my $self = shift; - local $GADS::Schema::Result::Record::REWIND = $self->rewind_formatted - if $self->rewind; - $self->_set_current_ids || [$self->_current_ids_rs->all]; + local $GADS::Schema::Result::Record::REWIND = $self->dt_parser->format_datetime($self->rewind_recordset) + if $self->rewind_recordset; + my $params; + $params->{rows} = $self->rows if $self->rows; + $params->{page} = $self->page if $self->page; + $params->{rows} ||= $self->max_results + if $self->max_results; + [$self->_current_rs->search({},$params)->get_column('me.id')->all]; } # Common search parameters used across different queries @@ -464,7 +510,6 @@ sub search_query my @search = $self->_query_params(%options); my $root_table = $options{root_table} || 'current'; my $current = $options{alias} ? $options{alias} : $root_table eq 'current' ? 'me' : 'current'; - my $record_single = $self->record_name(%options); push @search, $self->_approval_query(%options); # Current IDs from quick search if used push @search, { "$current.id" => $self->_search_all_fields->{cids} } if $self->search; @@ -473,9 +518,8 @@ sub search_query push @search, $self->common_search($current); push @search, $self->record_later_search(%options, linked => $linked, search => 1) unless $options{chronology} || $options{no_record_later}; - push @search, { - "$record_single.created" => { '<=' => $self->rewind_formatted }, - } if $self->rewind; + push @search, {$self->record_single_rewind(%options)} + if $options{rewind}; [@search]; } @@ -558,15 +602,16 @@ sub linked_hash { my $alt = $options{alt} ? "_alternative" : ""; my @tables = $self->jpfetch(%options, linked => 1); + my $version_join = $self->rewind_recordset ? { + "record_single$alt" => [ + "record_later$alt", + @tables, + ] + } : { + current_version => \@tables, + }; return { - linked => [ - { - "record_single$alt" => [ - "record_later$alt", - @tables, - ] - }, - ], + linked => $version_join, }; } else { @@ -609,10 +654,9 @@ sub search_view my @searches = ({ 'me.instance_id' => $self->layout->instance_id, }); - push @searches, $self->record_later_search(linked => 1, search => 1); # Perform search construct twice, to ensure all value joins are consistent numbers - $self->_search_construct($decoded, ignore_perms => 1, user => $user); - push @searches, $self->_search_construct($decoded, ignore_perms => 1, user => $user); + $self->_search_construct($decoded, ignore_perms => 1, user => $user, current_version_only => 1); + push @searches, $self->_search_construct($decoded, ignore_perms => 1, user => $user, current_version_only => 1); my $i = 0; my @ids; while ($i < @$current_ids) { @@ -628,12 +672,9 @@ sub search_view $search->{'me.id'} = [@{$current_ids}[$i..$max]]; push @ids, $self->schema->resultset('Current')->search($search, { join => [ - [$self->linked_hash(search => 1)], + [$self->linked_hash(search => 1, current_version_only => 1)], { - 'record_single' => [ - $self->jpfetch(search => 1), - 'record_later', - ], + 'current_version' => [$self->jpfetch(search => 1)], }, ], })->get_column('id')->all; @@ -803,32 +844,73 @@ sub _build__search_all_fields # Need to get correct "value" number for search, in case it's been incremented through view_limits my $s = $field->{sub} ? $self->value_next_join(search => 1).".$value_field" : "$plural.$value_field"; - my $joins = $field->{type} eq 'current_id' # Include joins for limited views - ? { - 'record_single' => [ - 'record_later', - $self->jpfetch(search => 1), - ] - } - : $field->{sub} - ? { - 'record_single' => [ - 'record_later', - $self->jpfetch(search => 1), - { - $plural => ['value', 'layout'] - }, - ] - } - : { - 'record_single' => [ - 'record_later', - $self->jpfetch(search => 1), - { - $plural => 'layout' - }, - ] - }; + my $joins; + if ($field->{type} eq 'current_id') # Include joins for limited views + { + if ($self->cvo_recordset) + { + $joins = { + 'current_version' => [$self->jpfetch(search => 1)], + }; + } + else { + $joins = { + 'record_single' => [ + 'record_later', + $self->jpfetch(search => 1), + ] + }; + } + } + elsif ($field->{sub}) + { + if ($self->cvo_recordset) + { + $joins = { + 'current_version' => [ + $self->jpfetch(search => 1), + { + $plural => ['value', 'layout'] + }, + ] + }; + } + else { + $joins = { + 'record_single' => [ + 'record_later', + $self->jpfetch(search => 1), + { + $plural => ['value', 'layout'] + }, + ] + }; + } + } + else { + if ($self->cvo_recordset) + { + $joins = { + 'current_version' => [ + $self->jpfetch(search => 1), + { + $plural => 'layout' + }, + ] + }; + } + else { + $joins = { + 'record_single' => [ + 'record_later', + $self->jpfetch(search => 1), + { + $plural => 'layout' + }, + ] + }; + } + } my @search = @basic_search; push @search, @@ -843,7 +925,7 @@ sub _build__search_all_fields } else { push @search, { 'layout.id' => \@columns_can_view }; - push @search, $self->record_later_search(search => 1); + push @search, $self->record_later_search(search => 1, current_version_only => $self->cvo_recordset); } my @currents = $self->schema->resultset('Current')->search({ -and => \@search},{ join => $joins, @@ -962,55 +1044,69 @@ sub _me_created_value })->get_column('createdby.value')->as_query; } -# Produce a standard set of results without grouping sub _current_ids_rs +{ my $self = shift; + $self->_current_rs->get_column('me.id'); +} + +sub _current_rs { my ($self, %options) = @_; - my %limit = ( - limit => $options{limit}, - page => $options{limit}, + my %common = ( + search => 1, + sort => 1, + limit => $options{limit}, + page => $options{limit}, + current_version_only => $self->cvo_recordset, ); + # Build the search query first, to ensure that all join numbers are correct - my $search_query = $self->search_query(search => 1, sort => 1, linked => 1, %limit); # Need to call first to build joins - my @prefetches = $self->jpfetch(prefetch => 1, linked => 0, %limit); - my @linked_prefetch = $self->linked_hash(prefetch => 1, %limit); + my $search_query = $self->search_query(linked => 1, rewind => $self->rewind_recordset, %common); # Need to call first to build joins + my @prefetches = $self->jpfetch(prefetch => 1, linked => 0, %common); + my @linked_prefetch = $self->linked_hash(prefetch => 1, %common); # Run 2 queries. First to get the current IDs of the matching records, then # the second to get the actual data for the records. Although this means # 2 separate DB queries, it prevents queries with large SELECT and WHERE # clauses, which can be very slow (with Pg at least). + my $version_join = $self->cvo_recordset + ? { + current_version => [ + $self->jpfetch(linked => 0, %common), + ] + } : { + 'record_single' => [ # The (assumed) single record for the required version of current + $self->record_earlier ? 'record_earlier' : 'record_later', # The record after the single record (undef when single is latest) + $self->jpfetch(linked => 0, %common), + ], + }; my $select = { join => [ - [$self->linked_hash(search => 1, sort => 1, %limit)], - { - 'record_single' => [ # The (assumed) single record for the required version of current - $self->record_earlier ? 'record_earlier' : 'record_later', # The record after the single record (undef when single is latest) - $self->jpfetch(search => 1, sort => 1, linked => 0, %limit), - ], - }, + [$self->linked_hash(%common)], + $version_join, ], - order_by => $self->order_by(search => 1, with_min => 1, %limit), + order_by => $self->order_by(with_min => 1, %common), distinct => 1, # Otherwise multiple records returned for multivalue fields select => [ 'me.id', ], '+select' => [ - $self->has_created_time(search => 1, sort => 1, %limit) ? { + $self->has_created_time(%common) ? { "" => $self->_me_created_date, -as => 'record_created_date', } : (), - $self->has_created_user(search => 1, sort => 1, %limit) ? { + $self->has_created_user(%common) ? { "" => $self->_me_created_user, -as => 'record_created_user', } : (), - $self->has_created_user(search => 1, sort => 1, %limit) ? { + $self->has_created_user(%common) ? { "" => $self->_me_created_value, -as => 'record_created_value', } : (), ], '+as' => [ - $self->has_created_time(search => 1, sort => 1, %limit) ? 'record_created_date' : (), - $self->has_created_user(search => 1, sort => 1, %limit) ? ( + $self->has_created_time(%common) ? 'record_created_date' : (), + $self->has_created_user(%common) ? ( 'record_created_user', 'record_created_value', ) : (), @@ -1023,65 +1119,40 @@ sub _current_ids_rs $page = $self->pages if $page && $page > 1 && $page > $self->pages; # Building page count is expensive, avoid if not needed - if (!$self->is_group && !$options{aggregate}) - { - $select->{rows} = $self->rows if $self->rows; - $select->{page} = $page if $page; - $select->{rows} ||= $self->max_results - if $self->max_results; - } - # Get the current IDs # Only take the latest record_single (no later ones) $self->schema->resultset('Current')->search( [-and => $search_query], $select - )->get_column('me.id'); -} - -sub generate_cid_query -{ my $self = shift; - $self->_cid_search_query; + ); } -has _cid_search_query_cache => ( - is => 'rw', - clearer => 1, -); - # Produce a search query that filters by all the required current IDs. This # needs to include the list of current IDs itself, plus a filter to ensure only # the required version of a record is retrieved. Assumes that REWIND has # already been set by the calling function. -sub _cid_search_query +sub _resultset_search { my ($self, %options) = @_; - my $search = $self->_cid_search_query_cache; - if (!$search) - { - $search = { map { %$_ } $self->record_later_search(prefetch => 1, sort => 1, linked => 1, group => 1, retain_join_order => 1, %options) }; - - # If this is a group query then we will not be limiting by number of - # records (but will be reducing number of results by group), and therefore - # it's best to pass the current IDs required as a SQL query (otherwise we - # could be passing in 1000s of ID values). If we're doing the opposite, - # then we would be creating some very big queries with the sub-query, and - # therefore performance (Pg at least) has been shown to be better if we run - # the ID subquery first and only pass the IDs in to the main query - if ($self->is_group || $options{aggregate}) - { - $search->{'me.id'} = { -in => $self->_current_ids_rs(%options)->as_query }; - } - else { - $search->{'me.id'} = $self->current_ids; - } - } - my $record_single = $self->record_name(linked => 0); - $search->{"$record_single.created"} = { '<=' => $self->rewind_formatted } - if $self->rewind; - my $approval_query = $self->_approval_query(%options); - $search = { %$search, %$approval_query } if $approval_query; - $self->_cid_search_query_cache($search); - $search; + my %search = map { %$_ } $self->record_later_search(%options); + + # If this is a group query then we will not be limiting by number of + # records (but will be reducing number of results by group), and therefore + # it's best to pass the current IDs required as a SQL query (otherwise we + # could be passing in 1000s of ID values). If we're doing the opposite, + # then we would be creating some very big queries with the sub-query, and + # therefore performance (Pg at least) has been shown to be better if we run + # the ID subquery first and only pass the IDs in to the main query + $search{'me.id'} = $options{is_group} + ? { -in => $self->_current_ids_rs->as_query } + : $self->current_ids; + + # Rewind clause added only if needed + %search = (%search, $self->record_single_rewind(%options, rewind => $self->rewind_values)); + + # Need to add an approval clause? + %search = (%search, %{$self->_approval_query(%options) || {}}); + + \%search; } has already_seen => ( @@ -1102,48 +1173,57 @@ sub _build_results sub _build_standard_results { my $self = shift; - local $GADS::Schema::Result::Record::REWIND = $self->rewind_formatted - if $self->rewind; + local $GADS::Schema::Result::Record::REWIND = $self->dt_parser->format_datetime($self->rewind_values) + if $self->rewind_values; # XXX A lot of this code is duplicated in GADS::Record # Need to call first to build all joins - my $search_query = $self->search_query(search => 1, sort => 1, linked => 1); + my $search_query = $self->search_query(search => 1, sort => 1, linked => 1, rewind => $self->rewind_values); my $records = {}; my $limit = 10; my $page = 1; my $first_run = 1; my @retrieved_order; while (1) { + my %common = ( + prefetch => 1, + sort => 1, + limit => $limit, + page => $page, + current_version_only => $self->cvo_values, + ); # No linked here so that we get the ones needed in accordance with this loop (could be either) - my @prefetches = $self->jpfetch(prefetch => 1, sort => 1, limit => $limit, page => $page); + my @prefetches = $self->jpfetch(%common); last if !@prefetches && !$first_run; # We need to use the retain_join_order as we are only using joins, not # joins as well as prefetches. With the commit that this comment is # going in with, it looks like this may always be the case now. # Therefore, retain_join_order may now be redundent and could possibly # be made the default and removed in a future commit. - @prefetches = $self->jpfetch(prefetch => 1, sort => 1, linked => 0, limit => $limit, page => $page, retain_join_order => 1); + @prefetches = $self->jpfetch(%common, linked => 0, retain_join_order => 1); @prefetches = ( - $self->linked_hash(prefetch => 1, sort => 1, limit => $limit, page => $page, retain_join_order => 1), + $self->linked_hash(%common, retain_join_order => 1), 'deletedby', 'currents', { - 'record_single' => [ + $self->cvo_values + ? ('current_version' => [@prefetches]) + : ('record_single' => [ 'record_later', @prefetches, - ], + ]) }, ); # Don't specify linked for fetching columns, we will get whataver is needed linked or not linked - my @columns_fetch = $self->columns_fetch(sort => 1, limit => $limit, page => $page, retain_join_order => 1); - my $has_linked = $self->has_linked(prefetch => 1, sort => 1, limit => $limit, page => $page); - my $base = $self->record_name(prefetch => 1, sort => 1, limit => $limit, page => $page); + my @columns_fetch = $self->columns_fetch(%common, retain_join_order => 1); + my $has_linked = $self->has_linked(%common); + my $base = $self->record_name(%common); push @columns_fetch, {id => "$base.id"}; push @columns_fetch, {deleted => "me.deleted"}; push @columns_fetch, {linked_id => "me.linked_id"}; - push @columns_fetch, {linked_record_id => "record_single.id"} + push @columns_fetch, {linked_record_id => $self->cvo_values ? "current_version.id" : "record_single.id"} if $has_linked; push @columns_fetch, {draftuser_id => "me.draftuser_id"}; push @columns_fetch, {current_id => "$base.current_id"}; @@ -1153,33 +1233,32 @@ sub _build_standard_results push @columns_fetch, {parent_id => "me.parent_id"}; push @columns_fetch, "deletedby.$_" foreach @GADS::Column::Person::person_properties; - $self->_clear_cid_search_query_cache; - my $result = $self->schema->resultset('Current')->search($self->_cid_search_query(prefetch => 1, sort => 1, limit => $limit, page => $page), + my $result = $self->schema->resultset('Current')->search($self->_resultset_search(%common), { join => [@prefetches], columns => \@columns_fetch, '+select' => [ - $self->has_created_time(prefetch => 1, sort => 1, limit => $limit, page => $page) ? { + $self->has_created_time(%common) ? { "" => $self->_me_created_date, -as => 'record_created_date', } : (), - $self->has_created_user(prefetch => 1, sort => 1, limit => $limit, page => $page) ? { + $self->has_created_user(%common) ? { "" => $self->_me_created_user, -as => 'record_created_user', } : (), - $self->has_created_user(prefetch => 1, sort => 1, limit => $limit, page => $page) ? { + $self->has_created_user(%common) ? { "" => $self->_me_created_value, -as => 'record_created_value', } : (), ], '+as' => [ - $self->has_created_time(prefetch => 1, sort => 1, limit => $limit, page => $page) ? 'record_created_date' : (), - $self->has_created_user(prefetch => 1, sort => 1, limit => $limit, page => $page) ? ( + $self->has_created_time(%common) ? 'record_created_date' : (), + $self->has_created_user(%common) ? ( 'record_created_user', 'record_created_value', ) : (), ], - order_by => $self->order_by(prefetch => 1, limit => $limit, page => $page, retain_join_order => 1), + order_by => $self->order_by(%common, retain_join_order => 1), }, ); @@ -1256,7 +1335,6 @@ sub _build_standard_results my $record = GADS::Record->new( schema => $self->schema, record => $rec, - rewind => $self->rewind, serial => $rec->{serial}, child_records => \@children, parent_id => $rec->{parent_id}, @@ -1369,18 +1447,19 @@ sub fetch_multivalues # IDs. We retrieve them now. This should really # be abstracted to a function elsewhere - it is # too low level. - local $GADS::Schema::Result::Record::REWIND = $self->rewind_formatted - if $self->rewind; + local $GADS::Schema::Result::Record::REWIND = $self->dt_parser->format_datetime($self->rewind_values) + if $self->rewind_values; my $search = { 'me.id' => \@value_ids, - 'record_later.id' => undef, }; - $search->{'record_single.created'} = { '<=' => $self->rewind_formatted } - if $self->rewind; + $search->{'record_later.id'} = undef + if !$self->cvo_values; + $search->{'record_single.created'} = { '<=' => $self->dt_parser->format_datetime($self->rewind_values) } + if $self->rewind_values; my @curs = $self->schema->resultset('Current')->search($search,{ - select => ['me.id', 'record_single.id'], + select => ['me.id', $self->cvo_values ? 'me.current_version_id' : 'record_single.id'], as => ['current_id', 'record_id'], - join => { + join => $self->cvo_values ? 'current_version' : { record_single => 'record_later', }, })->all; @@ -1412,7 +1491,7 @@ sub fetch_multivalues foreach my $val ($col->fetch_multivalues( \@retrieve_ids, is_draft => $params{is_draft}, - rewind => $self->rewind, # Would be better in a context object + rewind => $self->rewind_values, already_seen => $already_seen, limit_rows => $limit_rows, )) @@ -1532,10 +1611,8 @@ sub single # Set those IDs for the next chunk retrieved from the DB $self->_set_current_ids($cid_fetch); - $self->clear_current_ids; $self->clear_results; $self->delete_already_seen; - $self->_clear_cid_search_query_cache; $next_id = 0; } @@ -1563,19 +1640,19 @@ sub _build_count # and if there is no other need to look at the records join (approval, # rewind etc) my ($search_query, $select); - if ($self->rewind || $self->_query_params(search => 1) || $self->_approval_query) + if ($self->rewind_recordset || $self->_query_params(search => 1) || $self->_approval_query) { - $search_query = $self->search_query(search => 1, linked => 1); - my @joins = $self->jpfetch(search => 1, linked => 0); - my @linked = $self->linked_hash(search => 1, linked => 1); + $search_query = $self->search_query(search => 1, linked => 1, current_version_only => $self->cvo_values, rewind => $self->rewind_values); + my @joins = $self->jpfetch(search => 1, linked => 0, current_version_only => $self->cvo_values); + my @linked = $self->linked_hash(search => 1, linked => 1, current_version_only => $self->cvo_values); $select = { join => [ [@linked], { - 'record_single' => [ + $self->cvo_values ? ('current_version' => \@joins) : ('record_single' => [ 'record_later', @joins - ], + ]), }, ], distinct => 1, # Otherwise multiple records returned for multivalue fields @@ -1583,11 +1660,11 @@ sub _build_count } else { # record joins not needed, remove with fresh call - $search_query = $self->search_query(search => 1, linked => 1, no_record_later => 1); + $search_query = $self->search_query(search => 1, linked => 1, no_record_later => 1, current_version_only => $self->cvo_values, rewind => $self->rewind_values); } - local $GADS::Schema::Result::Record::REWIND = $self->rewind_formatted - if $self->rewind; + local $GADS::Schema::Result::Record::REWIND = $self->dt_parser->format_datetime($self->rewind_recordset) + if $self->rewind_recordset; $self->schema->resultset('Current')->search( [-and => $search_query], $select @@ -1614,9 +1691,9 @@ sub exists $search_query = $cache->{search_query}; } else { - $search_query = $self->search_query(search => 1, linked => 1); - @joins = $self->jpfetch(search => 1, linked => 0); - @linked = $self->linked_hash(search => 1, linked => 1); + $search_query = $self->search_query(search => 1, linked => 1, current_version_only => $self->cvo_values, rewind => $self->rewind_values); + @joins = $self->jpfetch(search => 1, linked => 0, current_version_only => $self->cvo_values); + @linked = $self->linked_hash(search => 1, linked => 1, current_version_only => $self->cvo_values); $self->_exists_cache({ joins => \@joins, linked => \@linked, @@ -1648,10 +1725,10 @@ sub exists join => [ [@linked], { - 'record_single' => [ + $self->cvo_values ? ('current_version' => \@joins): ('record_single' => [ 'record_later', @joins - ], + ]) }, ], rows => 1, @@ -1662,27 +1739,32 @@ sub exists )->get_column('me.id')->next; } +# Whether this set of records has any child records within it sub _build_has_children { my $self = shift; - my @search_query = @{$self->search_query(search => 1, linked => 1)}; + # Use is_group to ensure that WHERE clause consists of query instead of + # full list of current IDs + my $search_query = $self->_resultset_search(search => 1, linked => 1, is_group => 1, current_version_only => $self->cvo_values); my $linked = $self->linked_hash(search => 1); my $select = { join => [ $linked, { - 'record_single' => [ - 'record_later', - $self->jpfetch(search => 1), - ], + $self->cvo_values + ? ('current_version' => [$self->jpfetch(search => 1, current_version_only => $self->cvo_values)]) + : ('record_single' => [ + 'record_later', + $self->jpfetch(search => 1, current_version_only => $self->cvo_values), + ]) }, ], rows => 1, }; - push @search_query, { 'me.parent_id' => { '!=' => undef }}; + $search_query->{'me.parent_id'} = { '!=' => undef }; my @child = $self->schema->resultset('Current')->search( - [-and => [@search_query]], $select + $search_query, $select )->all; @child ? 1 : 0; } @@ -1704,10 +1786,13 @@ sub _build_columns_retrieved_do } } + my %view_group_cols = map { $_->layout_id => $_->parent_id } $self->view ? @{$self->view->groups} : (); foreach my $c (@columns) { # We're viewing this, so prefetch all the values - $self->add_prefetch($c, include_multivalue => $self->separate_records_for_multicol); + my $parent_id = $view_group_cols{$c->id}; + my $parent = $parent_id && $self->layout->column($parent_id); + $self->add_prefetch($c, parent => $parent, include_multivalue => $self->separate_records_for_multicol); $self->add_linked_prefetch($c->link_parent) if $c->link_parent; } @@ -1730,16 +1815,19 @@ has separate_records_for_multicol => ( is => 'rw', ); -has group_col_ids => ( +has group_cols => ( is => 'lazy', isa => ArrayRef, clearer => 1, ); -sub _build_group_col_ids +sub _build_group_cols { my $self = shift; return [] if !$self->view; - [map $_->layout_id, @{$self->view->groups}]; + [map { + my $col = $self->layout->column($_->layout_id); + $col->clone(parent_id => $_->parent_id) + } @{$self->view->groups}]; } has has_group_col_id => ( @@ -1751,7 +1839,7 @@ has has_group_col_id => ( sub _build_has_group_col_id { my $self = shift; +{ - map { $_ => 1 } @{$self->group_col_ids} + map { $_->id => 1 } @{$self->group_cols} }; } @@ -1806,7 +1894,7 @@ sub _build_columns_render # the order selected @cols = grep !$self->has_group_col_id->{$_->id}, @cols if $self->is_group; - unshift @cols, grep $_->user_can('read'), map $self->layout->column($_), @{$self->group_col_ids} + unshift @cols, grep $_->user_can('read'), @{$self->group_cols} if $self->is_group; } @@ -1836,10 +1924,7 @@ sub clear_records $self->clear_aggregate_results; $self->_set__next_single_id(0); $self->_single_page(0); - $self->_set_current_ids(undef); $self->_clear_all_cids_store; - $self->_clear_cid_search_query_cache - unless $options{retain_current_ids}; } sub clear @@ -1858,7 +1943,8 @@ sub clear $self->clear_is_group; $self->clear_additional_filters; $self->clear_has_group_col_id; - $self->clear_group_col_ids; + $self->clear_group_cols; + $self->clear_current_version_only; $self->clear_records(%options); } @@ -2047,10 +2133,18 @@ sub _sort_builder { foreach my $s (@{$self->sort}) { + my $col = $self->layout->column($s->{id}) + or next; + my $col_parent = $self->layout->column($s->{parent_id}); + !$s->{parent_id} || $col_parent + or next; + error __x"Column {id} requested for sort from different table without parent", id => $col->id + if $col->instance_id != $self->layout->instance_id && !$col_parent; push @sorts, { - id => $s->{id} || $column_id->id, # Default ID - type => $s->{type} || 'asc', - } if $self->layout->column($s->{id}); + id => $col->id, + parent_id => $col_parent && $col_parent->id, + type => $s->{type} || 'asc', + }; } } if (!@sorts && $self->view && @{$self->view->sorts}) { @@ -2086,6 +2180,8 @@ sub order_by ? @{$self->_sorts_limit} : @{$self->_sorts}; + my $group_cols = delete $options{group_cols}; + my @order_by; my %has_time; foreach my $s (@sorts) { @@ -2099,8 +2195,26 @@ sub order_by my $column = $self->layout->column($s->{id}, permission => 'read') or next; my $column_parent = $self->layout->column($s->{parent_id}); - my @cols_main = $column->sort_columns; - my @cols_link = $column->link_parent ? $column->link_parent->sort_columns : (); + my @cols_main; + if ($column->is_curcommon) + { + @cols_main = @{$column->curval_fields}; + $column_parent = $column; + } + else { + @cols_main = ($column); + } + my @cols_link; + if (my $link_parent = $column->link_parent) + { + if ($link_parent->is_curcommon) + { + @cols_link = @{$link_parent->curval_fields}; + } + else { + @cols_link = ($link_parent); + } + } foreach my $col_sort (@cols_main) { if ($column_parent) @@ -2109,11 +2223,9 @@ sub order_by $self->add_join($col_sort, sort => 1, parent => $column_parent); } else { - $self->add_join($column->sort_parent, sort => 1) - if $column->sort_parent; - $self->add_join($col_sort, sort => 1, parent => $column->sort_parent); + $self->add_join($col_sort, sort => 1); } - my $s_table = $self->table_name($col_sort, sort => 1, %options, parent => $column_parent || $column->sort_parent); + my $s_table = $self->table_name($col_sort, sort => 1, %options, parent => $column_parent); my $sort_name; if ($column->name_short && $column->name_short eq '_created_user') { @@ -2137,9 +2249,21 @@ sub order_by else { $sort_name = "$s_table.".$col_sort->sort_field; } - push @order_by, { - $type => $sort_name, - }; + my $query; + if ($options{group}) + { + # Assume that if the column is appearing in the group_by + # that it will already have been added as a grouped column + # and therefore there is no need to add the is_grouped flag + # here. This relies on calling this order_by function after + # the grouped columns have been added. + my $agg = $self->add_aggregate($col_sort, 'max', parent => $column_parent, group_cols => $group_cols, sort => 1, %options); + $query = { $type => $agg->{as} }; + } + else { + $query = { $type => $sort_name }; + } + push @order_by, $query; $has_time{$sort_name} = 1 if $col_sort->has_time; } } @@ -2157,8 +2281,8 @@ sub order_by # is made even though it doesn't match (in SQLite anyway). E.g. "< # 2019-04-05 00:00" will match a date field of "2019-04-05" my $date = $has_time{$field} - ? $self->schema->storage->datetime_parser->format_datetime($self->from || $self->to) - : $self->schema->storage->datetime_parser->format_date($self->from || $self->to); + ? $self->dt_parser->format_datetime($self->from || $self->to) + : $self->dt_parser->format_date($self->from || $self->to); my $quoted = $self->quote($field); if ($field eq 'record_created_date') { @@ -2289,7 +2413,7 @@ sub rule_to_condition if ($filter->{value} =~ /CURDATE/) # XXX repeated below, quick fix { my $vdt = GADS::View->parse_date_filter($filter->{value}); - my $dtf = $self->schema->storage->datetime_parser; + my $dtf = $self->dt_parser; $value = $dtf->format_date($vdt); } else { @@ -2427,8 +2551,7 @@ sub rule_to_condition if ($_ && $_ =~ /CURDATE/) { my $vdt = GADS::View->parse_date_filter($_); - my $dtf = $self->schema->storage->datetime_parser; - $_ = $dtf->format_date($vdt); + $_ = $self->dt_parser->format_date($vdt); } elsif ($transform_date || ($column->return_type eq 'date' && $_)) { @@ -2538,6 +2661,7 @@ sub _resolve my $multivalue = $options{parent} ? $options{parent}->multivalue : $column->multivalue; my $reverse = $options{reverse}; my $previous_values = $options{previous_values}; + my $me_table = $options{alias} || 'me'; if ($condition->{type} eq 'changed_after') { local $GADS::Helper::Changed::CHANGED_PARAMS = { @@ -2566,10 +2690,16 @@ sub _resolve })->get_column('id')->as_query; return ( - 'me.id' => [{ -in => $sub1 } , { -in => $sub2}] + "$me_table.id" => [{ -in => $sub1 } , { -in => $sub2}] ); } - elsif ($multivalue && $condition->{type} eq 'not_equal' && !$previous_values) + elsif ($multivalue && $condition->{type} eq 'not_equal' && !$previous_values + # If this set of records is a search across all versions + # ($records->previous_values is true) then perform a normal join of all + # these conditions, so that only a match is made when they are all true + # for a particular version + && !$self->previous_values + ) { # Create a non-negative match of all the IDs that we don't want to # match. Use a Records object so that all the normal requirements are @@ -2588,7 +2718,7 @@ sub _resolve ), ); return ( - 'me.id' => { + "$me_table.id" => { # We want everything that is *not* those records -not_in => $records->_current_ids_rs->as_query, } @@ -2618,14 +2748,14 @@ sub _resolve if ($reverse) { return ( - 'me.id' => { + "$me_table.id" => { -not_in => $records->_current_ids_rs->as_query, } ); } else { return ( - 'me.id' => { + "$me_table.id" => { -in => $records->_current_ids_rs->as_query, } ); @@ -2654,7 +2784,7 @@ sub _resolve ), ); return ( - 'me.id' => { + "$me_table.id" => { -in => $records->_current_ids_rs->as_query, } ); @@ -2677,8 +2807,8 @@ sub _date_for_db { my ($self, $column, $value) = @_; my $dt = $column->parse_date($value); $column->has_time - ? $self->schema->storage->datetime_parser->format_datetime($dt) - : $self->schema->storage->datetime_parser->format_date($dt); + ? $self->dt_parser->format_datetime($dt) + : $self->dt_parser->format_date($dt); } has _csv => ( @@ -2959,7 +3089,7 @@ sub _max_date { shift->_min_max_date('max', @_) }; sub _min_max_date { my ($self, $action, $date1, $date2) = @_; - my $dt_parser = $self->schema->storage->datetime_parser; + my $dt_parser = $self->dt_parser; my $d1 = $date1 && $dt_parser->parse_date($date1); my $d2 = $date2 && $dt_parser->parse_date($date2); return $d1 if !$d2; @@ -3055,7 +3185,7 @@ sub _build_aggregate_results return undef if ! @columns; - $self->_clear_cid_search_query_cache; # Clear any list of record IDs from previous results() call + $self->clear_current_ids; # Clear any list of record IDs from previous results() call my $results = $self->_build_group_results(columns => \@columns, is_group => 1, aggregate => 1); panic "Unexpected number of aggregate results" @@ -3076,6 +3206,11 @@ sub _build_group_results my @cols; my $view = $self->view; + # During building grouped results an aggregate field can be added via + # sorting or as a selected column. This needs to be cleared each time, as + # group results can require different aggregate functions + $self->clear_aggregate_fields; + my $is_table_group = !$self->isa('GADS::RecordsGraph') && !$self->isa('GADS::RecordsGlobe'); if ($options{columns}) @@ -3100,8 +3235,13 @@ sub _build_group_results } my @parents; - my %group_cols; - %group_cols = map { $_->layout_id => 1 } @{$view->groups} + my @group_cols; + @group_cols = map { + +{ + column => $self->layout->column($_->layout_id), + parent => $_->parent_id && $self->layout->column($_->parent_id), + } + } @{$view->groups} if $is_table_group && $view && !$options{aggregate}; foreach my $col (@cols) @@ -3115,8 +3255,8 @@ sub _build_group_results # sub-fields will be added, which for a multivalue curval will mean # many unnecessary sub-queries below. We may want to add these later if # making it possible to manually group by a curval sub-field - $group_cols{$col->{id}} = 1 - if $col->{group} && !$col->{parent}; + push @group_cols, { column => $column } + if $col->{group} && !$col->{parent} && ! grep $_->{column}->id == $column->id, @group_cols; # If it's got a parent curval, then add that too if ($col->{parent_id}) @@ -3148,7 +3288,6 @@ sub _build_group_results } # Combine and flatten columns - unshift @cols, @parents; my @newcols; foreach my $col (@cols) { @@ -3164,7 +3303,7 @@ sub _build_group_results @cols = @newcols; # Add all columns first so that join numbers are correct - foreach my $col (@cols) + foreach my $col (@parents, @cols) { my $column = $col->{column}; next if $column->internal; @@ -3192,9 +3331,14 @@ sub _build_group_results } } - my $as_index = $self->group_values_as_index; my $drcol = !!$self->dr_column; + # Need to set before any subqueries are built + local $GADS::Schema::Result::Record::REWIND = $self->dt_parser->format_datetime($self->rewind_values) + if $self->rewind_values; + + my %sort_mapping; + foreach my $col (@cols) { my $op = $col->{operator}; @@ -3203,147 +3347,7 @@ sub _build_group_results next if $options{aggregate} && $column->aggregate && $column->aggregate eq 'recalc'; - my $select; - my $as = $column->field; - $as = $as.'_count' if $op eq 'count'; - $as = $as.'_sum' if $op eq 'sum'; - $as = $as.'_distinct' if $op eq 'distinct' && !$col->{group}; - - # The select statement to get this column's value varies depending on - # what we want to retrieve. If we're selecting a field with multiple - # values, then we have to run this as a separate subquery, otherwise if - # there are more than one multiple-value retrieval then that aggregates - # will be counting multiple times for each set of multiple values (due - # to the multiple joins) - - # Field is either multivalue or its parent is - if (($column->multivalue || ($parent && $parent->multivalue)) && !$col->{group} && !$col->{drcol}) - { - # Assume curval if it's a parent - we need to search the curval - # table for all the curvals that are part of the records retrieved. - # XXX add search query? - if ($parent) - { - my $f_rs = $self->schema->resultset('Curval')->search({ - 'mecurval.record_id' => { - -ident => 'record_single.id' # Match against main query's records - }, - 'mecurval.layout_id' => $parent->id, - 'record_later.id' => undef, - }, - { - alias => 'mecurval', # Can't use default "me" as already used in main query - join => { - 'value' => { - 'record_single_alternative' => [ - 'record_later', - $column->tjoin, - ], - }, - }, - }); - if ($column->numeric && $op eq 'sum') - { - $select = $f_rs->get_column((ref $column->tjoin eq 'HASH' ? 'value_2' : $column->field).".".$column->value_field)->sum_rs->as_query; - } - elsif (!$is_table_group) - { - $select = $f_rs->get_column((ref $column->tjoin eq 'HASH' ? 'value_2' : $column->field).".".$column->value_field)->max_rs->as_query; - } - else { - # At the moment we do not expect a distinct count to be - # necessary for a field from within a curval. We might want - # to add this functionality in the future, in which case it - # will look something like the next else block - panic __x"Unexpected count distinct for curval sub-field {name} ({id})", - name => $column->name, id => $column->id; - } - } - # Otherwise a standard subquery select for that type of field - else { - # Also need to add the main search query, otherwise if we take - # all the field's values for each record, then we won't be - # filtering the non-matched ones in the case of multivalue - # fields. - # Need to include "group" as an option to the subquery, to - # ensure that the grouping column is added to match to the main - # query's group column. This does not apply if doing an overall - # aggregate though, as there is only a need to retrieve the - # overall results, not for each matching grouped row. If the - # "group" option is included unnecessarily, then this can cause - # joins of multiple-value fields which can include too many - # results in the aggregate. - my $include_group = %group_cols ? 1 : 0; - my $searchq = $self->search_query(search => 1, extra_column => $column, linked => 0, group => $include_group, alt => 1, alias => 'mefield'); - foreach my $group_id (keys %group_cols) - { - my $group_col = $self->layout->column($group_id); - push @$searchq, { - $self->fqvalue($group_col, as_index => $as_index, search => 1, linked => 0, group => 1, alt => 1, extra_column => $group_col, drcol => $drcol) => { - -ident => $self->fqvalue($group_col, as_index => $as_index, search => 1, linked => 0, group => 1, extra_column => $group_col, drcol => $drcol) - }, - }; - } - $select = $self->schema->resultset('Current')->search( - [-and => $searchq ], - { - alias => 'mefield', - join => [ - [$self->linked_hash(search => 1, group => $include_group, alt => 1, extra_column => $column)], - { - 'record_single_alternative' => [ # The (assumed) single record for the required version of current - 'record_later_alternative', # The record after the single record (undef when single is latest) - $self->jpfetch(search => 1, linked => 0, group => $include_group, extra_column => $column, alt => 1), - ], - }, - ], - select => { - count => { distinct => $self->fqvalue($column, as_index => $as_index, search => 1, linked => 0, group => 1, alt => 1, extra_column => $column, drcol => $drcol) }, - -as => 'sub_query_as', - }, - }, - ); - my $col_fq = $self->fqvalue($column, as_index => $as_index, search => 1, linked => 0, group => 1, alt => 1, extra_column => $column, drcol => $drcol); - if ($column->numeric && $op eq 'sum') - { - $select = $select->get_column($col_fq)->sum_rs->as_query; - $op = 'max'; - } - elsif ($self->isa('GADS::RecordsGraph') || $self->isa('GADS::RecordsGlobe')) - { - $select = $select->get_column($col_fq)->max_rs->as_query; - } - else { - $select = $select->get_column('sub_query_as')->as_query; - $op = 'max'; - } - } - } - # Standard single-value field - select directly, no need for a subquery - else { - $select = $self->fqvalue($column, as_index => $as_index, prefetch => 1, group => 1, search => 0, linked => 0, parent => $parent, retain_join_order => 1, drcol => $drcol); - } - - if ($op eq 'distinct') - { - $select = { - count => { distinct => $select }, - -as => $as, - }; - push @select_fields, $select; - } - else { - push @select_fields, { - $op => $select, - -as => $as, - }; - } - - # Also add linked column if required - push @select_fields, { - $op => $self->fqvalue($column->link_parent, as_index => $as_index, prefetch => 1, search => 0, linked => 1, parent => $parent, retain_join_order => 1, drcol => $drcol), - -as => $as."_link", - } if $column->link_parent; + $self->add_aggregate($column, $op, search => 0, parent => $parent, group_cols => \@group_cols, is_grouped => $col->{group} || $col->{drcol}); } push @select_fields, { @@ -3368,7 +3372,7 @@ sub _build_group_results { min => "$field.$from_field", -as => 'start_date'}, { max => "$field.$to_field", -as => 'end_date'}, ]; - my $search = $self->search_query(search => 1, prefetch => 1, linked => 0); + my $search = $self->search_query(search => 1, prefetch => 1, linked => 0, current_version_only => $self->cvo_values, rewind => $self->rewind_values); # Include linked field if applicable if ($field_link) { @@ -3378,24 +3382,27 @@ sub _build_group_results ); } - local $GADS::Schema::Result::Record::REWIND = $self->rewind_formatted - if $self->rewind; + # Get min and max dates of range my ($result) = $self->schema->resultset('Current')->search( [-and => $search], { select => $select, join => [ - $self->linked_hash(search => 1, prefetch => 1), + $self->linked_hash(search => 1, prefetch => 1, current_version_only => $self->cvo_values), { - 'record_single' => [ + $self->cvo_values + ? ('current_version' => [ + $self->jpfetch(search => 1, prefetch => 1, linked => 0, current_version_only => $self->cvo_values) + ]) + : ('record_single' => [ 'record_later', - $self->jpfetch(search => 1, prefetch => 1, linked => 0), - ], + $self->jpfetch(search => 1, prefetch => 1, linked => 0, current_version_only => $self->cvo_values), + ]) }, ], }, )->all; - my $dt_parser = $self->schema->storage->datetime_parser; + my $dt_parser = $self->dt_parser; # Find min/max dates from above, including linked field if required my $daterange_from = $self->from ? $self->from->clone : $self->_min_date( $result->get_column('start_date'), @@ -3517,32 +3524,46 @@ sub _build_group_results } }; - my $q = $self->search_query(prefetch => 1, search => 1, retain_join_order => 1, group => 1, sort => 0, drcol => $drcol); # Called first to generate joins + my $q = $self->search_query(prefetch => 1, search => 1, retain_join_order => 1, group => 1, sort => 1, drcol => $drcol); # Called first to generate joins # Ensure that no joins are added here that are multi-value fields, # otherwise they will generate multiple rows for a single records, which # will cause multiple aggregates and double-counting of other fields. The # prefetch joins should only have been added above, and if they are - # multi-value fields should be added as independent sub-queries + # multi-value fields should be added as independent sub-queries. + # The "multivalue" parameter below removes any multi-value columns. + my %common = ( + group => 1, + prefetch => 1, + # Search not needed as performed with subquery + search => 0, + sort => 1, + drcol => $drcol, + current_version_only => $self->cvo_values, + ); + + my @jp_fetch = $self->jpfetch(%common, multivalue => 0, linked => 0, retain_join_order => 1, aggregate => $options{aggregate}); + my $order_by = $self->order_by(%common, group_cols => \@group_cols, retain_join_order => 1); + push @select_fields, map $_->{select}, @{$self->aggregate_fields}; my $select = { select => [@select_fields], join => [ - $self->linked_hash(group => 1, prefetch => 1, search => 0, retain_join_order => 1, sort => 0, aggregate => $options{aggregate}, drcol => $drcol), + $self->linked_hash(%common, retain_join_order => 1, aggregate => $options{aggregate}), { - 'record_single' => [ - 'record_later', - $self->jpfetch(group => 1, prefetch => 1, search => 0, linked => 0, retain_join_order => 1, sort => 0, aggregate => $options{aggregate}, drcol => $drcol), - ], + $self->cvo_values + ? ('current_version' => \@jp_fetch) + : ('record_single' => [ + 'record_later', @jp_fetch, + ]) }, ], group_by => [@g], + order_by => $order_by, }; - local $GADS::Schema::Result::Record::REWIND = $self->rewind_formatted - if $self->rewind; - my $result = $self->schema->resultset('Current')->search( - $self->_cid_search_query(sort => 0, aggregate => $options{aggregate}), $select + # Outer search query so needs to match values being retrieved + $self->_resultset_search(sort => 0, is_group => 1, prefetch => 1, current_version_only => $self->cvo_values), $select ); return [$result->all] @@ -3563,7 +3584,7 @@ sub _build_group_results # will then force the sum. At the moment the only aggregate is sum, # but that may change in the future is_group => $options{is_group} || $self->is_group, - group_cols => \%group_cols, + group_cols => {map { $_->{column}->id => 1 } @group_cols}, user => $self->user, layout => $self->layout, columns_retrieved_no => $self->columns_retrieved_no, diff --git a/lib/GADS/RecordsJoin.pm b/lib/GADS/RecordsJoin.pm index 2e39fd395..0c06583c8 100644 --- a/lib/GADS/RecordsJoin.pm +++ b/lib/GADS/RecordsJoin.pm @@ -72,18 +72,17 @@ sub _add_children { my ($self, $join, $column, %options) = @_; $join->{children} ||= []; my %existing = map { $_->{column}->id => 1 } @{$join->{children}}; - foreach my $c (@{$column->curval_fields_retrieve(all_fields => $options{all_fields}, already_seen => $options{already_seen})}) + foreach my $c (@{$column->curval_fields_retrieve}) { next if $c->internal; # prefetch and linked match the parent. # search and sort are left blank, but may be updated with an # additional direct call with just the child and that option. my $child = { - join => $c->tjoin(all_fields => $options{all_fields}, already_seen => $options{already_seen}), - prefetch => 1, - curval => $c->is_curcommon, - column => $c, - parent => $column, + prefetch => 1, + curval => $c->is_curcommon, + column => $c, + parent => $column, }; push @{$join->{children}}, $child if !$existing{$c->id}; @@ -98,10 +97,6 @@ sub _add_jp panic __x"Link parent of field ID {id} is from same table as field itself", id => $column->id if $column->link_parent && $column->link_parent->instance_id == $column->instance_id; - my $key; - my $toadd = $column->tjoin(all_fields => $options{all_fields}); - ($key) = keys %$toadd if ref $toadd eq 'HASH'; - trace __x"Checking or adding {field} to the store", field => $column->field if $debug; @@ -114,11 +109,7 @@ sub _add_jp { trace __x"Checking join {field}", field => $j->{column}->field if $debug; - if ( - ($key && ref $j->{join} eq 'HASH' && Compare($toadd, $j->{join})) - || ($toadd && $j->{join} && $toadd eq $j->{join}) - || (!$toadd && $column->id == $j->{column}->id) - ) + if ($column->id == $j->{column}->id) { trace __x"Possibly found, checking to see if parents match" if $debug; @@ -132,17 +123,7 @@ sub _add_jp $j->{drcol} ||= $options{drcol}; if ($column->is_curcommon && $prefetch) { - my $tree = $self->already_seen; - my ($daughter) = grep { $_->name == $column->id} $tree->daughters; - # If add_join / add_prefetch is called early, such as - # during initial building of columns, then the column won't - # exist in the tree. Therefore add it now. - if (!$daughter) - { - $daughter = Tree::DAG_Node->new({name => $column->id}); - $tree->add_daughter($daughter); - } - $self->_add_children($j, $column, %options, already_seen => $daughter); + $self->_add_children($j, $column, %options); } trace __x"Found existing, returning" if $debug; @@ -157,7 +138,6 @@ sub _add_jp if $debug; my $join_add = { - join => $toadd, # Never prefetch multivalue columns, which can result in huge numbers of rows being retrieved. prefetch => $prefetch, # Whether values should be retrieved search => $options{search}, # Whether it's used in a WHERE clause @@ -173,10 +153,7 @@ sub _add_jp # part of the curval if ($column->is_curcommon) { - my $tree = $self->already_seen; - my $daughter = Tree::DAG_Node->new({name => $column->id}); - $tree->add_daughter($daughter); - $self->_add_children($join_add, $column, %options, already_seen => $daughter) + $self->_add_children($join_add, $column, %options) if $prefetch; } @@ -256,15 +233,15 @@ sub has_created_user !! grep $_->{column}->name_short && $_->{column}->name_short eq '_created_user', $self->_jpfetch(%options); } -sub record_later_search -{ my ($self, %options) = @_; +sub _root_is_record +{ my (%options) = @_; + $options{root_table} && $options{root_table} eq 'record'; +} - return () if $self->previous_values; - return ({ - "record_earlier.id" => undef, - }) if $self->record_earlier; +sub _count_version_joins +{ my ($self, %options) = @_; - my $count = $options{no_current} ? 0 : 1; # Always at least one if joining onto current + my $count = _root_is_record(%options) ? 0 : 1; # Always at least one if joining onto current my $include_linked = $options{linked} && $self->has_linked(%options); @@ -304,6 +281,21 @@ sub record_later_search } } } + $count; +} + +sub record_later_search +{ my ($self, %options) = @_; + + # Do not add record_later search if using previous_values (in which case + # all versions selected) or current_version_only (direct version join). + return () if $self->previous_values || $options{current_version_only}; + + return ({ + "record_earlier.id" => undef, + }) if $self->record_earlier; + + my $count = $self->_count_version_joins(%options); my @search; for (1..$count) @@ -317,9 +309,41 @@ sub record_later_search @search; } +sub record_single_rewind +{ my ($self, %options) = @_; + my $rewind = $options{rewind} + or return (); + + my $count = $self->_count_version_joins(%options); + + # Special case for "record" being the root table that is being selected + # from, and this being the first call to record_single_rewind(). In this + # case and at this point the count will be zero thus returning no join, + # even though one is needed for a rewind search (to ensure that a request + # for a specific version returns nothing if the rewind time is earlier than + # that version). For later calls in the same query, the count stands as + # normal and the record_name will be its normal "record" value rather than + # "me". + $count = 1 if _root_is_record(%options) && $count == 0; + + my $record_single = $self->record_name(%options, linked => 0); + my @search; + for (1..$count) + { + my $id = $_ == 1 ? '' : "_$_"; + my $alt = $options{alt} ? "_alternative" : ""; + push @search, ( + "$record_single$alt$id.created" => { + '<=' => $self->dt_parser->format_datetime($rewind), + } + ); + } + @search; +} + sub _jpfetch { my ($self, %options) = @_; - my $joins = []; + my @joins; my @jpstore; # Normally we want joins to be added and then prefetches, as they are @@ -340,17 +364,12 @@ sub _jpfetch foreach (@jpstore2) { - # Include only aggregate columns if requested. This is used when a - # records object has been built, but then only the aggregate columns - # within that are required for an aggregate query - next if $options{aggregate} && !$_->{column}->aggregate; next if exists $options{prefetch} && !$options{prefetch} && $_->{prefetch} && !$options{group} && !$options{drcol}; - $self->_jpfetch_add(options => \%options, join => $_, return => $joins); + push @joins, $self->_jpfetch_add(options => \%options, join => $_,); } my @return; - if ($options{limit} && @$joins) + if ($options{limit} && @joins) { - my @joins = @$joins; my $offset = ($options{page} - 1) * $options{limit}; return if @joins < $offset; my $end = $options{limit}-1+$offset ; @@ -362,7 +381,7 @@ sub _jpfetch push @return, grep { $_->{sort} } @joins[$end+1..@joins-1] if $options{sort}; } else { - @return = @$joins; + @return = @joins; } my @return2; foreach (@return) @@ -384,48 +403,56 @@ sub _jpfetch_add my $return = $params{return}; my $parent = $params{parent}; + my $current_version_only = $options->{current_version_only}; + if ( ($options->{search} && $join->{search}) || ($options->{sort} && $join->{sort}) || ($options->{group} && $join->{group}) || ($options->{drcol} && $join->{drcol}) - || ($options->{prefetch} && $join->{prefetch}) + || ( + # Include only aggregate columns if requested. This is used when a + # records object has been built, but then only the aggregate columns + # within that are required for an aggregate query + $options->{prefetch} && $join->{prefetch} + && (!$options->{aggregate} || $join->{column}->aggregate) + ) || ($options->{extra_column} && $join->{column}->id == $options->{extra_column}->id) ) { - if ($join->{column}->is_curcommon) + my $column = $join->{column}; + if ($column->is_curcommon) { - my $children = []; + my @children; foreach my $child (@{$join->{children}}) { - $self->_jpfetch_add(options => $options, join => $child, return => $children, parent => $join->{column}); + push @children, $self->_jpfetch_add(options => $options, join => $child, parent => $column); } my $simple = {%$join}; - $simple->{join} = $join->{column}->sprefix; + $simple->{join} = $column->sprefix; # Remove multivalues to prevent huge amount of rows being fetched. # These will be fetched later as individual columns. # Keep any for a sort - these still need to be used when fetching rows. - my @children = @$children; - @children = grep { $_->{search} || $_->{sort} || $_->{column}->fetch_with_record || $options->{include_multivalue} || $_->{group} || $_->{drcol} } @$children + @children = grep { $_->{search} || $_->{sort} || $_->{column}->fetch_with_record || $options->{include_multivalue} || $_->{group} || $_->{drcol} } @children if $options->{prefetch}; - push @$return, { + my $options = { + join_current_version => $current_version_only, + }; + return { + %$join, parent => $parent, - column => $join->{column}, - join => $join->{column}->make_join(map {$_->{join}} @children), - search => $join->{search}, - sort => $join->{sort}, - group => $join->{group}, - drcol => $join->{drcol}, - prefetch => $join->{prefetch}, - linked => $join->{linked}, - all_joins => [$simple, @children], + column => $column, + join => $column->make_join($options, map $_->{join}, @children), children => \@children, }; } else { - push @$return, $join; + return { %$join, join => $join->{column}->tjoin(join_current_version => $current_version_only) }; } } + else { + return (); + } } # See comments on alternative join in GADS::DB @@ -445,7 +472,10 @@ sub _to_alt sub jpfetch { my ($self, %options) = @_; - my @joins = grep $_, map { $_->{join} } $self->_jpfetch(%options); + my @cols = $self->_jpfetch(%options); + @cols = grep $_->{column}->multivalue == $options{multivalue} || $_->{group}, @cols + if defined $options{multivalue}; + my @joins = grep $_, map { $_->{join} } @cols; @joins = map { _to_alt($_) } @joins if $options{alt}; return @joins; @@ -485,8 +515,10 @@ sub columns_fetch } sub _record_name_by_count -{ my $count = shift; +{ my ($self, $count, %options) = @_; my $c_offset = $count == 1 ? '' : "_$count"; + return "current_version$c_offset" + if $options{current_version_only}; return "record_single$c_offset"; } @@ -499,7 +531,7 @@ sub record_name # record will be joined to the Current table. if ($options{root_table} && $options{root_table} eq 'record') { - return 'me' if !$options{linked} && !$options{column}; + return 'me' if !$options{column}; $count = 0; } elsif ($self->has_linked(%options)) { @@ -510,7 +542,7 @@ sub record_name } # Linked is always first. Drop straight back if that's what's wanted - return _record_name_by_count($count) + return $self->_record_name_by_count($count, %options) if $options{linked}; # Now add on for any curval columns in the linked section @@ -519,12 +551,13 @@ sub record_name next unless $c->{column}->is_curcommon && $c->{linked}; next if !@{$c->{children}}; # No record_singles unless fields selected from curval $count++; - return _record_name_by_count($count) if $options{column} && $options{column}->id == $c->{column}->id; + return $self->_record_name_by_count($count, %options) + if $options{column} && $options{column}->id == $c->{column}->id; } # Now the query of the main record $count++ - unless $options{no_current}; + unless _root_is_record(%options); # And now add on any curval columns in the normal section @@ -543,7 +576,7 @@ sub record_name } my $c_offset = $count == 1 ? '' : "_$count"; - return _record_name_by_count($count); + return $self->_record_name_by_count($count, %options); } =pod @@ -560,12 +593,14 @@ sub table_name { my ($self, $column, %options) = @_; if ($column->internal) { - return $options{no_current} ? 'current' : 'me' if $column->table eq 'Current'; + return _root_is_record(%options) ? 'current' : ($options{alias} || 'me') if $column->table eq 'Current'; if ($column->sprefix eq 'record') { return $self->record_name(%options); } - return $column->sprefix; + my $tn = $column->sprefix; + $tn .= "_alternative" if $options{alt}; + return $tn; } my $jn = $self->_join_number($column, %options); my $index = $jn > 1 ? "_$jn" : ''; @@ -601,18 +636,21 @@ sub _join_number { trace "Checking join ".$j->{column}->id if $debug; - my $n; - if ($j->{all_joins}) + my $n = _find($column, $j, $stash, %options); + trace __x"return from find request is: {n}", n => $n + if $debug; + return $n if $n; + if ($j->{children}) { trace "This join has other joins, checking..." if $debug; - foreach my $j2 (@{$j->{all_joins}}) + foreach my $j2 (@{$j->{children}}) { - if ($j2->{all_joins}) + if ($j2->{children}) { trace "This join has other joins, checking..." if $debug; - foreach my $j3 (@{$j2->{all_joins}}) # Replace with recursive function? + foreach my $j3 (@{$j2->{children}}) # Replace with recursive function? { trace "Looking at join ".$j3->{column}->id if $debug; @@ -622,22 +660,14 @@ sub _join_number return $n if $n; } } - else { - trace "Looking at join ".$j2->{column}->id - if $debug; - $n = _find($column, $j2, $stash, %options); - trace __x"return from find request is: {n}", n => $n - if $debug; - return $n if $n; - } + trace "Looking at join ".$j2->{column}->id + if $debug; + $n = _find($column, $j2, $stash, %options); + trace __x"return from find request is: {n}", n => $n + if $debug; + return $n if $n; } } - else { - $n = _find($column, $j, $stash, %options); - trace __x"return from find request is: {n}", n => $n - if $debug; - } - return $n if $n; } return $stash->{value} if $options{find_value}; @@ -659,9 +689,15 @@ sub _find trace "Checking against join ".$jp->{column}->id if $debug; - if (ref $jp->{join} eq 'HASH') + my $is_cc = $jp->{column}->type eq 'curval' || $jp->{column}->type eq 'filval'; + my $join = $jp->{column}->is_curcommon + ? $jp->{column}->sprefix + #: $is_cc + #? { $jp->{column}->sprefix => 'value' } + : $jp->{column}->tjoin(join_current_version => $options{current_version_only}); + if (ref $join eq 'HASH') { - my ($key, $value) = %{$jp->{join}}; + my ($key, $value) = %$join; trace __x"This join is a hash with key:{key} and value: {value}", key => $key, value => Dumper($value) if $debug; trace __x"We are looking for value being equal to {needle}", needle => $needle->sprefix @@ -695,11 +731,11 @@ sub _find } } } - elsif (ref $jp->{join} eq 'ARRAY') + elsif (ref $join eq 'ARRAY') { trace "This join is an array" if $debug; - foreach (@{$jp->{join}}) + foreach (@$join) { my $n = _find($needle, $_, $stash); trace "Return from find is $n" @@ -710,14 +746,14 @@ sub _find else { trace "This join is a standard join" if $debug; - $stash->{$jp->{join}}++ - if $jp->{join}; + $stash->{$join}++ + if $join; if ($jp->{parent} && !$stash->{parents_included}->{$jp->{parent}->id}) { $stash->{value}++ if $jp->{parent}->value_field eq 'value'; $stash->{parents_included}->{$jp->{parent}->id} = 1; } - if (!$options{find_value} && $jp->{join} && $needle->sprefix eq $jp->{join}) + if (!$options{find_value} && $join && $needle->sprefix eq $join) { # Single table join if (_compare_parents($options{parent}, $jp->{parent}) @@ -754,6 +790,211 @@ sub fqvalue "$tn." . $value_field; } +has aggregate_fields => ( + is => 'ro', + lazy => 1, + clearer => 1, + builder => sub { [] }, +); + +sub add_aggregate +{ my ($self, $column, $operator, %options) = @_; + + # Whether this column appears in the group_by statement, therefore meaning + # it does not require a separate sql select statement. This can possibly be + # removed in the future by checking the fields that have been added as + # grouped. + my $is_grouped = delete $options{is_grouped}; + my $is_linked = delete $options{is_linked}; + # Whether there are any group_by statements at all in the planned sql query + my @group_cols = $options{group_cols} ? @{delete $options{group_cols}} : (); + my $parent = delete $options{parent}; + my $as_index = $self->group_values_as_index; + my $drcol = !!$self->dr_column; + + my ($existing) = grep { + $_->{column}->id == $column->id + && ((!$_->{parent} && !$parent) || ($_->{parent} && $parent && $_->{parent}->id == $parent->id)) + && $_->{operator} ne $operator + } @{$self->aggregate_fields}; + + return $existing if $existing; + + my $select; + my $as = $is_linked ? $is_linked->field : $column->field; + $as = $as.'_count' if $operator eq 'count'; + $as = $as.'_sum' if $operator eq 'sum'; + $as = $as.'_distinct' if $operator eq 'distinct' && !$is_grouped; + $as = $as.'_link' if $is_linked; + + # The select statement to get this column's value varies depending on + # what we want to retrieve. If we're selecting a field with multiple + # values, then we have to run this as a separate subquery, otherwise if + # there are more than one multiple-value retrieval then that aggregates + # will be counting multiple times for each set of multiple values (due + # to the multiple joins) + + # Field is either multivalue or its parent is + if (($column->multivalue || ($parent && $parent->multivalue)) && !$is_grouped) + { + # Assume curval if it's a parent - we need to search the curval + # table for all the curvals that are part of the records retrieved. + if ($parent) + { + my $f_rs = $self->schema->resultset('Curval')->search({ + 'mecurval.record_id' => { + # Match against main query's records (use cvo_values as + # we are matching against the record ID of the outer + # select statement, not the record IDs in the record + # selection) + -ident => $self->cvo_values ? 'current_version.id' : 'record_single.id' + }, + 'mecurval.layout_id' => $parent->id, + # If retrieving from a previous point in time then add + # required search criteria to only retrieve single correct + # record + $self->cvo_values ? () : ('record_later.id' => undef), + $self->rewind_values ? ('record_single_alternative.created' => { + '<=' => $self->dt_parser->format_datetime($self->rewind_values) + }) : () + }, + { + alias => 'mecurval', # Can't use default "me" as already used in main query + join => { + 'value' => { + $self->cvo_values + ? ('current_version_alternative' => [ + $column->tjoin(join_current_version => 1) + ]) + : ('record_single_alternative' => [ + 'record_later', + $column->tjoin, + ]) + }, + }, + }); + if ($column->numeric && $operator eq 'sum') + { + $select = $f_rs->get_column((ref $column->tjoin(join_current_version => $self->cvo_values) eq 'HASH' ? 'value_2' : $column->field).".".$column->value_field)->sum_rs->as_query; + } + elsif ($operator eq 'sum' || $operator eq 'max') # Default to max for sum of non-numeric columns + { + my $fn = (ref $column->tjoin(join_current_version => $self->cvo_values) eq 'HASH' ? 'value_2' : $column->field).".".$column->value_field; + $select = $f_rs->get_column($fn)->max_rs->as_query; + } + elsif ($operator eq 'distinct') { + # At the moment we do not expect a distinct count to be + # necessary for a field from within a curval. We might want + # to add this functionality in the future, in which case it + # will look something like the next else block + panic __x"Unexpected count distinct for curval sub-field {name} ({id})", + name => $column->name, id => $column->id; + } + else { + panic "Unknown operator $operator"; + } + } + # Otherwise a standard subquery select for that type of field + else { + # Also need to add the main search query, otherwise if we take + # all the field's values for each record, then we won't be + # filtering the non-matched ones in the case of multivalue + # fields. + # Need to include "group" as an option to the subquery, to + # ensure that the grouping column is added to match to the main + # query's group column. This does not apply if doing an overall + # aggregate though, as there is only a need to retrieve the + # overall results, not for each matching grouped row. If the + # "group" option is included unnecessarily, then this can cause + # joins of multiple-value fields which can include too many + # results in the aggregate. + my $has_grouped = @group_cols; + my $searchq = $self->search_query(%options, search => 1, extra_column => $column, linked => 0, group => $has_grouped, alt => 1, alias => 'mefield', current_version_only => $self->cvo_values, rewind => $self->rewind_values); + foreach my $group (@group_cols) + { + push @$searchq, { + $self->fqvalue($group->{column}, %options, search => 1, as_index => $as_index, linked => 0, group => 1, alt => 1, extra_column => $group->{column}, parent => $group->{parent}, drcol => $drcol, current_version_only => $self->cvo_values) => { + -ident => $self->fqvalue($group->{column}, %options, search => 1, parent => $group->{parent}, as_index => $as_index, linked => 0, group => 1, extra_column => $group->{column}, drcol => $drcol, current_version_only => $self->cvo_values) + }, + }; + } + $select = $self->schema->resultset('Current')->search( + [-and => $searchq ], + { + alias => 'mefield', + join => [ + [$self->linked_hash(%options, search => 1, group => $has_grouped, alt => 1, extra_column => $column, current_version_only => $self->cvo_values)], + { + $self->cvo_values + ? ('current_version_alternative' => [ + $self->jpfetch(%options, search => 1, linked => 0, group => $has_grouped, extra_column => $column, alt => 1, current_version_only => 1) + ]) + : ('record_single_alternative' => [ # The (assumed) single record for the required version of current + 'record_later_alternative', # The record after the single record (undef when single is latest) + $self->jpfetch(%options, search => 1, linked => 0, group => $has_grouped, extra_column => $column, alt => 1, current_version_only => 0), + ]) + }, + ], + select => { + count => { distinct => $self->fqvalue($column, %options, search => 1, as_index => $as_index, linked => 0, group => 1, alt => 1, extra_column => $column, drcol => $drcol, current_version_only => $self->cvo_values) }, + -as => 'sub_query_as', + }, + }, + ); + my $col_fq = $self->fqvalue($column, %options, search => 1, as_index => $as_index, linked => 0, group => 1, alt => 1, extra_column => $column, drcol => $drcol, current_version_only => $self->cvo_values); + if ($column->numeric && $operator eq 'sum') + { + $select = $select->get_column($col_fq)->sum_rs->as_query; + $operator = 'max'; + } + # Default to max for sum of non-numeric columns. + # count selects max here and then count as the operator below + elsif ($operator eq 'sum' || $operator eq 'max' || $operator eq 'count') + { + $select = $select->get_column($col_fq)->max_rs->as_query; + } + elsif ($operator eq 'distinct' || $operator eq 'count') + { + $select = $select->get_column('sub_query_as')->as_query; + $operator = 'max'; + } + else { + panic "Unknown operator $operator"; + } + } + } + # Standard single-value field - select directly, no need for a subquery + else { + $select = $self->fqvalue($column, %options, as_index => $as_index, prefetch => 1, group => 1, linked => 0, parent => $parent, retain_join_order => 1, drcol => $drcol, current_version_only => $self->cvo_values); + } + + my $overall_select = $operator eq 'distinct' + ? { + count => { distinct => $select }, + -as => $as, + } + : { + $operator => $select, + -as => $as, + }; + + my $aggfield = { + column => $column, + parent => $parent, + select => $overall_select, + operator => $operator, + as => $as, + }; + + push @{$self->aggregate_fields}, $aggfield; + + # Also add linked column if required + $self->add_aggregate($column->link_parent, $operator, is_linked => $column, parent => $parent, group_cols => \@group_cols, is_grouped => $is_grouped) + if $column->link_parent; + + $aggfield; +} + sub _dump_child { my ($self, $dd, $child, $indent) = @_; no warnings 'uninitialized'; diff --git a/lib/GADS/Role/Presentation/Column.pm b/lib/GADS/Role/Presentation/Column.pm index d84d8cf40..c48b445a2 100644 --- a/lib/GADS/Role/Presentation/Column.pm +++ b/lib/GADS/Role/Presentation/Column.pm @@ -29,6 +29,7 @@ sub presentation { my $return = { id => $self->id, + full_id => $self->full_id, type => $self->type, name => $self->name, name_short => $self->name_short, diff --git a/lib/GADS/Role/Presentation/Records.pm b/lib/GADS/Role/Presentation/Records.pm index 1bbf572cd..f10683ee2 100644 --- a/lib/GADS/Role/Presentation/Records.pm +++ b/lib/GADS/Role/Presentation/Records.pm @@ -6,7 +6,7 @@ sub presentation { my $self = shift; return [ - map $_->presentation(group => $self->is_group, group_col_ids => $self->group_col_ids, @_), @{$self->results} + map $_->presentation(group => $self->is_group, group_cols => $self->group_cols, @_), @{$self->results} ]; } diff --git a/lib/GADS/Schema.pm b/lib/GADS/Schema.pm index 431917eaa..3efa4b382 100644 --- a/lib/GADS/Schema.pm +++ b/lib/GADS/Schema.pm @@ -8,7 +8,7 @@ use base 'DBIx::Class::Schema'; __PACKAGE__->load_namespaces; -our $VERSION = 109; +our $VERSION = 110; our $IGNORE_PERMISSIONS; our $IGNORE_PERMISSIONS_SEARCH; diff --git a/lib/GADS/Schema/Result/Current.pm b/lib/GADS/Schema/Result/Current.pm index 17b6d1ddf..dd1033fdd 100644 --- a/lib/GADS/Schema/Result/Current.pm +++ b/lib/GADS/Schema/Result/Current.pm @@ -18,6 +18,8 @@ __PACKAGE__->add_columns( { data_type => "bigint", is_auto_increment => 1, is_nullable => 0 }, "serial", { data_type => "bigint", is_nullable => 1 }, + "current_version_id", + { data_type => "bigint", is_foreign_key => 1, is_nullable => 1 }, "parent_id", { data_type => "bigint", is_foreign_key => 1, is_nullable => 1 }, "instance_id", @@ -54,6 +56,31 @@ __PACKAGE__->has_many( { cascade_copy => 0, cascade_delete => 0 }, ); +__PACKAGE__->belongs_to( + "current_version", + "GADS::Schema::Result::Record", + { id => "current_version_id" }, + { + is_deferrable => 1, + join_type => "LEFT", + on_delete => "NO ACTION", + on_update => "NO ACTION", + }, +); + +# See comments below regarding record_single_alternative +__PACKAGE__->belongs_to( + "current_version_alternative", + "GADS::Schema::Result::Record", + { id => "current_version_id" }, + { + is_deferrable => 1, + join_type => "LEFT", + on_delete => "NO ACTION", + on_update => "NO ACTION", + }, +); + __PACKAGE__->has_many( "currents", "GADS::Schema::Result::Current", diff --git a/lib/GADS/Schema/Result/Graph.pm b/lib/GADS/Schema/Result/Graph.pm index 70d3987cb..9cef998a8 100644 --- a/lib/GADS/Schema/Result/Graph.pm +++ b/lib/GADS/Schema/Result/Graph.pm @@ -19,6 +19,8 @@ __PACKAGE__->add_columns( { data_type => "text", is_nullable => 1 }, "y_axis", { data_type => "integer", is_foreign_key => 1, is_nullable => 1 }, + "y_axis_link", + { data_type => "integer", is_foreign_key => 1, is_nullable => 1 }, "y_axis_stack", { data_type => "varchar", is_nullable => 1, size => 45 }, "y_axis_label", @@ -138,6 +140,18 @@ __PACKAGE__->belongs_to( }, ); +__PACKAGE__->belongs_to( + "y_axis_link", + "GADS::Schema::Result::Layout", + { id => "y_axis_link" }, + { + is_deferrable => 1, + join_type => "LEFT", + on_delete => "NO ACTION", + on_update => "NO ACTION", + }, +); + __PACKAGE__->belongs_to( "user", "GADS::Schema::Result::User", diff --git a/share/fixtures/110/conf/all_tables.json b/share/fixtures/110/conf/all_tables.json new file mode 100644 index 000000000..d72a63724 --- /dev/null +++ b/share/fixtures/110/conf/all_tables.json @@ -0,0 +1,285 @@ +{ + "might_have" : { + "fetch" : 0 + }, + "sets" : [ + { + "quantity" : "all", + "class" : "Team" + }, + { + "class" : "Current", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "Enumval" + }, + { + "quantity" : "all", + "class" : "Changed" + }, + { + "class" : "CurvalField", + "quantity" : "all" + }, + { + "class" : "Dashboard", + "quantity" : "all" + }, + { + "class" : "Daterange", + "quantity" : "all" + }, + { + "class" : "AlertCache", + "quantity" : "all" + }, + { + "class" : "Calc", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "Record" + }, + { + "quantity" : "all", + "class" : "Curval" + }, + { + "class" : "Filter", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "Date" + }, + { + "class" : "UserGroup", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "Ragval" + }, + { + "class" : "Calcval", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "CalcUnique" + }, + { + "class" : "ImportRow", + "quantity" : "all" + }, + { + "class" : "Oauthtoken", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "Oauthclient" + }, + { + "class" : "Submission", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "LayoutGroup" + }, + { + "quantity" : "all", + "class" : "AlertColumn" + }, + { + "class" : "MetricGroup", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "Intgr" + }, + { + "class" : "ViewGroup", + "quantity" : "all" + }, + { + "class" : "Sort", + "quantity" : "all" + }, + { + "class" : "Title", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "Enum" + }, + { + "class" : "Person", + "quantity" : "all" + }, + { + "class" : "Site", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "FileOption" + }, + { + "class" : "ViewLimit", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "UserGraph" + }, + { + "quantity" : "all", + "class" : "ReportGroup" + }, + { + "class" : "ViewLayout", + "quantity" : "all" + }, + { + "class" : "Instance", + "quantity" : "all" + }, + { + "class" : "Widget", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "Export" + }, + { + "class" : "AlertSend", + "quantity" : "all" + }, + { + "class" : "ReportLayout", + "quantity" : "all" + }, + { + "class" : "Report", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "DisplayField" + }, + { + "class" : "Organisation", + "quantity" : "all" + }, + { + "class" : "Alert", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "View" + }, + { + "class" : "UserLastrecord", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "Department" + }, + { + "class" : "File", + "quantity" : "all" + }, + { + "class" : "String", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "Authentication" + }, + { + "quantity" : "all", + "class" : "LayoutDepend" + }, + { + "quantity" : "all", + "class" : "Metric" + }, + { + "class" : "Layout", + "quantity" : "all" + }, + { + "class" : "UserPermission", + "quantity" : "all" + }, + { + "class" : "FilteredValue", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "Graph" + }, + { + "quantity" : "all", + "class" : "Topic" + }, + { + "class" : "GraphColor", + "quantity" : "all" + }, + { + "class" : "InstanceGroup", + "quantity" : "all" + }, + { + "class" : "InstanceRag", + "quantity" : "all" + }, + { + "class" : "Permission", + "quantity" : "all" + }, + { + "class" : "Group", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "User" + }, + { + "class" : "Audit", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "Import" + }, + { + "class" : "Rag", + "quantity" : "all" + }, + { + "class" : "Fileval", + "quantity" : "all" + } + ], + "belongs_to" : { + "fetch" : 0 + }, + "has_many" : { + "fetch" : 0 + } +} diff --git a/share/fixtures/110/conf/current.json b/share/fixtures/110/conf/current.json new file mode 100644 index 000000000..9fb298aae --- /dev/null +++ b/share/fixtures/110/conf/current.json @@ -0,0 +1,73 @@ +{ + "has_many" : { + "fetch" : 0 + }, + "might_have" : { + "fetch" : 0 + }, + "belongs_to" : { + "fetch" : 0 + }, + "sets" : [ + { + "class" : "Current", + "fetch" : [ + { + "rel": "records", + "quantity": "all", + "fetch": [ + { + "rel": "calcvals", + "quantity": "all" + }, + { + "rel": "curvals", + "quantity": "all" + }, + { + "rel": "dateranges", + "quantity": "all" + }, + { + "rel": "dates", + "quantity": "all" + }, + { + "rel": "enums", + "quantity": "all" + }, + { + "rel": "files", + "quantity": "all", + "fetch": [ + { + "rel": "value", + "quantity": "all" + } + ] + }, + { + "rel": "intgrs", + "quantity": "all" + }, + { + "rel": "people", + "quantity": "all" + }, + { + "rel": "ragvals", + "quantity": "all" + }, + { + "rel": "strings", + "quantity": "all" + } + ] + } + ], + "ids" : [ + "1766" + ] + } + ] +} diff --git a/share/fixtures/110/conf/graphs.json b/share/fixtures/110/conf/graphs.json new file mode 100644 index 000000000..6e742f676 --- /dev/null +++ b/share/fixtures/110/conf/graphs.json @@ -0,0 +1,17 @@ +{ + "has_many" : { + "fetch" : 0 + }, + "might_have" : { + "fetch" : 0 + }, + "belongs_to" : { + "fetch" : 0 + }, + "sets" : [ + { + "class" : "Graph", + "quantity" : "all" + } + ] +} diff --git a/share/fixtures/110/conf/layout.json b/share/fixtures/110/conf/layout.json new file mode 100644 index 000000000..557c20279 --- /dev/null +++ b/share/fixtures/110/conf/layout.json @@ -0,0 +1,53 @@ +{ + "has_many" : { + "fetch" : 0 + }, + "might_have" : { + "fetch" : 0 + }, + "belongs_to" : { + "fetch" : 0 + }, + "sets" : [ + { + "class" : "Calc", + "quantity" : "all" + }, + { + "class" : "Enumval", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "CurvalField" + }, + { + "class" : "Instance", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "LayoutGroup" + }, + { + "class" : "Layout", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "FileOption" + }, + { + "quantity" : "all", + "class" : "LayoutDepend" + }, + { + "class" : "Rag", + "quantity" : "all" + }, + { + "quantity" : "all", + "class" : "Group" + } + ] +} diff --git a/share/fixtures/110/conf/permissions.json b/share/fixtures/110/conf/permissions.json new file mode 100644 index 000000000..c55636c86 --- /dev/null +++ b/share/fixtures/110/conf/permissions.json @@ -0,0 +1,17 @@ +{ + "might_have" : { + "fetch" : 0 + }, + "belongs_to" : { + "fetch" : 0 + }, + "has_many" : { + "fetch" : 0 + }, + "sets" : [ + { + "class" : "Permission", + "quantity" : "all" + } + ] +} diff --git a/share/fixtures/110/conf/views_global.json b/share/fixtures/110/conf/views_global.json new file mode 100644 index 000000000..7a675dce7 --- /dev/null +++ b/share/fixtures/110/conf/views_global.json @@ -0,0 +1,28 @@ +{ + "has_many" : { + "fetch" : 0 + }, + "might_have" : { + "fetch" : 0 + }, + "belongs_to" : { + "fetch" : 0 + }, + "sets" : [ + { + "class" : "View", + "quantity" : "all", + "cond": { "global": 1 }, + "fetch": [ + { + "rel": "view_layouts", + "quantity": "all" + }, + { + "rel": "sorts", + "quantity": "all" + } + ] + } + ] +} diff --git a/share/fixtures/110/permissions/_config_set b/share/fixtures/110/permissions/_config_set new file mode 100644 index 000000000..b737787ab --- /dev/null +++ b/share/fixtures/110/permissions/_config_set @@ -0,0 +1,17 @@ +$VAR1 = { + 'has_many' => { + 'fetch' => 0 + }, + 'might_have' => { + 'fetch' => 0 + }, + 'sets' => [ + { + 'class' => 'Permission', + 'quantity' => 'all' + } + ], + 'belongs_to' => { + 'fetch' => 0 + } + }; diff --git a/share/fixtures/110/permissions/_dumper_version b/share/fixtures/110/permissions/_dumper_version new file mode 100644 index 000000000..55eb15ebd --- /dev/null +++ b/share/fixtures/110/permissions/_dumper_version @@ -0,0 +1 @@ +1.001039 \ No newline at end of file diff --git a/share/fixtures/110/permissions/permission/10.fix b/share/fixtures/110/permissions/permission/10.fix new file mode 100644 index 000000000..dbcc7ff19 --- /dev/null +++ b/share/fixtures/110/permissions/permission/10.fix @@ -0,0 +1,7 @@ +$HASH1 = { + description + => 'User can access audit data', + id => 10, + name => 'audit', + order => 11 + }; diff --git a/share/fixtures/110/permissions/permission/12.fix b/share/fixtures/110/permissions/permission/12.fix new file mode 100644 index 000000000..902d83660 --- /dev/null +++ b/share/fixtures/110/permissions/permission/12.fix @@ -0,0 +1,7 @@ +$HASH1 = { + description + => 'Super-administrator', + id => 12, + name => 'superadmin', + order => undef + }; diff --git a/share/fixtures/110/permissions/permission/3.fix b/share/fixtures/110/permissions/permission/3.fix new file mode 100644 index 000000000..50be3fde3 --- /dev/null +++ b/share/fixtures/110/permissions/permission/3.fix @@ -0,0 +1,7 @@ +$HASH1 = { + description + => 'User can manage other user accounts', + id => 3, + name => 'useradmin', + order => 3 + }; diff --git a/share/migrations/MySQL/deploy/110/001-auto-__VERSION.sql b/share/migrations/MySQL/deploy/110/001-auto-__VERSION.sql new file mode 100644 index 000000000..5616aec0f --- /dev/null +++ b/share/migrations/MySQL/deploy/110/001-auto-__VERSION.sql @@ -0,0 +1,18 @@ +-- +-- Created by SQL::Translator::Producer::MySQL +-- Created on Sun Jan 4 22:32:07 2026 +-- +; +SET foreign_key_checks=0; +-- +-- Table: `dbix_class_deploymenthandler_versions` +-- +CREATE TABLE `dbix_class_deploymenthandler_versions` ( + `id` integer NOT NULL auto_increment, + `version` varchar(50) NOT NULL, + `ddl` text NULL, + `upgrade_sql` text NULL, + PRIMARY KEY (`id`), + UNIQUE `dbix_class_deploymenthandler_versions_version` (`version`) +); +SET foreign_key_checks=1; diff --git a/share/migrations/MySQL/deploy/110/001-auto.sql b/share/migrations/MySQL/deploy/110/001-auto.sql new file mode 100644 index 000000000..9efa9f787 --- /dev/null +++ b/share/migrations/MySQL/deploy/110/001-auto.sql @@ -0,0 +1,1279 @@ +-- +-- Created by SQL::Translator::Producer::MySQL +-- Created on Sun Jan 4 22:32:05 2026 +-- +; +SET foreign_key_checks=0; +-- +-- Table: `alert` +-- +CREATE TABLE `alert` ( + `id` integer NOT NULL auto_increment, + `view_id` bigint NOT NULL, + `user_id` bigint NOT NULL, + `frequency` integer NOT NULL DEFAULT 0, + INDEX `alert_idx_user_id` (`user_id`), + INDEX `alert_idx_view_id` (`view_id`), + PRIMARY KEY (`id`), + CONSTRAINT `alert_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `alert_fk_view_id` FOREIGN KEY (`view_id`) REFERENCES `view` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `alert_cache` +-- +CREATE TABLE `alert_cache` ( + `id` bigint NOT NULL auto_increment, + `layout_id` integer NOT NULL, + `view_id` bigint NOT NULL, + `current_id` bigint NOT NULL, + `user_id` bigint NULL, + INDEX `alert_cache_idx_current_id` (`current_id`), + INDEX `alert_cache_idx_layout_id` (`layout_id`), + INDEX `alert_cache_idx_user_id` (`user_id`), + INDEX `alert_cache_idx_view_id` (`view_id`), + PRIMARY KEY (`id`), + CONSTRAINT `alert_cache_fk_current_id` FOREIGN KEY (`current_id`) REFERENCES `current` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `alert_cache_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `alert_cache_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `alert_cache_fk_view_id` FOREIGN KEY (`view_id`) REFERENCES `view` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `alert_column` +-- +CREATE TABLE `alert_column` ( + `id` integer NOT NULL auto_increment, + `layout_id` integer NOT NULL, + `instance_id` integer NOT NULL, + INDEX `alert_column_idx_instance_id` (`instance_id`), + INDEX `alert_column_idx_layout_id` (`layout_id`), + PRIMARY KEY (`id`), + CONSTRAINT `alert_column_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `alert_column_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `alert_send` +-- +CREATE TABLE `alert_send` ( + `id` bigint NOT NULL auto_increment, + `layout_id` integer NULL, + `alert_id` integer NOT NULL, + `current_id` bigint NOT NULL, + `status` char(7) NULL, + INDEX `alert_send_idx_alert_id` (`alert_id`), + INDEX `alert_send_idx_current_id` (`current_id`), + INDEX `alert_send_idx_layout_id` (`layout_id`), + PRIMARY KEY (`id`), + UNIQUE `alert_send_all` (`layout_id`, `alert_id`, `current_id`, `status`), + CONSTRAINT `alert_send_fk_alert_id` FOREIGN KEY (`alert_id`) REFERENCES `alert` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `alert_send_fk_current_id` FOREIGN KEY (`current_id`) REFERENCES `current` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `alert_send_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `audit` +-- +CREATE TABLE `audit` ( + `id` bigint NOT NULL auto_increment, + `site_id` integer NULL, + `user_id` bigint NULL, + `type` varchar(45) NULL, + `datetime` datetime NULL, + `method` varchar(45) NULL, + `url` text NULL, + `description` text NULL, + `instance_id` integer NULL, + INDEX `audit_idx_instance_id` (`instance_id`), + INDEX `audit_idx_site_id` (`site_id`), + INDEX `audit_idx_user_id` (`user_id`), + INDEX `audit_idx_datetime` (`datetime`), + INDEX `audit_idx_user_instance_datetime` (`user_id`, `instance_id`, `datetime`), + PRIMARY KEY (`id`), + CONSTRAINT `audit_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `audit_fk_site_id` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `audit_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `authentication` +-- +CREATE TABLE `authentication` ( + `id` bigint NOT NULL auto_increment, + `site_id` integer NULL, + `type` varchar(32) NULL, + `name` text NULL, + `xml` text NULL, + `saml2_firstname` text NULL, + `saml2_surname` text NULL, + `enabled` smallint NOT NULL DEFAULT 0, + `error_messages` text NULL, + INDEX `authentication_idx_site_id` (`site_id`), + PRIMARY KEY (`id`), + CONSTRAINT `authentication_fk_site_id` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `calc` +-- +CREATE TABLE `calc` ( + `id` integer NOT NULL auto_increment, + `layout_id` integer NULL, + `calc` mediumtext NULL, + `code` mediumtext NULL, + `return_format` varchar(45) NULL, + `decimal_places` smallint NULL, + INDEX `calc_idx_layout_id` (`layout_id`), + PRIMARY KEY (`id`), + CONSTRAINT `calc_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `calc_unique` +-- +CREATE TABLE `calc_unique` ( + `id` bigint NOT NULL auto_increment, + `layout_id` integer NOT NULL, + `value_text` text NULL, + `value_int` bigint NULL, + `value_date` date NULL, + `value_numeric` decimal(20, 5) NULL, + `value_date_from` datetime NULL, + `value_date_to` datetime NULL, + INDEX `calc_unique_idx_layout_id` (`layout_id`), + PRIMARY KEY (`id`), + UNIQUE `calc_unique_ux_layout_date` (`layout_id`, `value_date`), + UNIQUE `calc_unique_ux_layout_daterange` (`layout_id`, `value_date_from`, `value_date_to`), + UNIQUE `calc_unique_ux_layout_int` (`layout_id`, `value_int`), + UNIQUE `calc_unique_ux_layout_numeric` (`layout_id`, `value_numeric`), + UNIQUE `calc_unique_ux_layout_text` (`layout_id`, `value_text`), + CONSTRAINT `calc_unique_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `calcval` +-- +CREATE TABLE `calcval` ( + `id` bigint NOT NULL auto_increment, + `record_id` bigint NOT NULL, + `layout_id` integer NOT NULL, + `value_text` text NULL, + `value_int` bigint NULL, + `value_date` date NULL, + `value_numeric` decimal(20, 5) NULL, + `value_date_from` datetime NULL, + `value_date_to` datetime NULL, + `purged_by` bigint NULL, + `purged_on` datetime NULL, + INDEX `calcval_idx_layout_id` (`layout_id`), + INDEX `calcval_idx_purged_by` (`purged_by`), + INDEX `calcval_idx_record_id` (`record_id`), + INDEX `calcval_idx_value_text` (`value_text`(64)), + INDEX `calcval_idx_value_numeric` (`value_numeric`), + INDEX `calcval_idx_value_int` (`value_int`), + INDEX `calcval_idx_value_date` (`value_date`), + PRIMARY KEY (`id`), + CONSTRAINT `calcval_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `calcval_fk_purged_by` FOREIGN KEY (`purged_by`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `calcval_fk_record_id` FOREIGN KEY (`record_id`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `current` +-- +CREATE TABLE `current` ( + `id` bigint NOT NULL auto_increment, + `serial` bigint NULL, + `current_version_id` bigint NULL, + `parent_id` bigint NULL, + `instance_id` integer NULL, + `linked_id` bigint NULL, + `deleted` datetime NULL, + `deletedby` bigint NULL, + `draftuser_id` bigint NULL, + INDEX `current_idx_current_version_id` (`current_version_id`), + INDEX `current_idx_deletedby` (`deletedby`), + INDEX `current_idx_draftuser_id` (`draftuser_id`), + INDEX `current_idx_instance_id` (`instance_id`), + INDEX `current_idx_linked_id` (`linked_id`), + INDEX `current_idx_parent_id` (`parent_id`), + PRIMARY KEY (`id`), + UNIQUE `current_ux_instance_serial` (`instance_id`, `serial`), + CONSTRAINT `current_fk_current_version_id` FOREIGN KEY (`current_version_id`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `current_fk_deletedby` FOREIGN KEY (`deletedby`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `current_fk_draftuser_id` FOREIGN KEY (`draftuser_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `current_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `current_fk_linked_id` FOREIGN KEY (`linked_id`) REFERENCES `current` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `current_fk_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `current` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `curval` +-- +CREATE TABLE `curval` ( + `id` bigint NOT NULL auto_increment, + `record_id` bigint NULL, + `layout_id` integer NULL, + `child_unique` smallint NOT NULL DEFAULT 0, + `value` bigint NULL, + `purged_by` bigint NULL, + `purged_on` datetime NULL, + INDEX `curval_idx_layout_id` (`layout_id`), + INDEX `curval_idx_purged_by` (`purged_by`), + INDEX `curval_idx_record_id` (`record_id`), + INDEX `curval_idx_value` (`value`), + PRIMARY KEY (`id`), + CONSTRAINT `curval_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `curval_fk_purged_by` FOREIGN KEY (`purged_by`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `curval_fk_record_id` FOREIGN KEY (`record_id`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `curval_fk_value` FOREIGN KEY (`value`) REFERENCES `current` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `curval_fields` +-- +CREATE TABLE `curval_fields` ( + `id` integer NOT NULL auto_increment, + `parent_id` integer NOT NULL, + `child_id` integer NOT NULL, + INDEX `curval_fields_idx_child_id` (`child_id`), + INDEX `curval_fields_idx_parent_id` (`parent_id`), + PRIMARY KEY (`id`), + CONSTRAINT `curval_fields_fk_child_id` FOREIGN KEY (`child_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `curval_fields_fk_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `dashboard` +-- +CREATE TABLE `dashboard` ( + `id` integer NOT NULL auto_increment, + `site_id` integer NULL, + `instance_id` integer NULL, + `user_id` integer NULL, + INDEX `dashboard_idx_instance_id` (`instance_id`), + INDEX `dashboard_idx_site_id` (`site_id`), + INDEX `dashboard_idx_user_id` (`user_id`), + PRIMARY KEY (`id`), + CONSTRAINT `dashboard_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `dashboard_fk_site_id` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `dashboard_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `date` +-- +CREATE TABLE `date` ( + `id` bigint NOT NULL auto_increment, + `record_id` bigint NOT NULL, + `layout_id` integer NOT NULL, + `child_unique` smallint NOT NULL DEFAULT 0, + `value` date NULL, + `purged_by` bigint NULL, + `purged_on` timestamp NULL, + INDEX `date_idx_layout_id` (`layout_id`), + INDEX `date_idx_purged_by` (`purged_by`), + INDEX `date_idx_record_id` (`record_id`), + INDEX `date_idx_value` (`value`), + PRIMARY KEY (`id`), + CONSTRAINT `date_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `date_fk_purged_by` FOREIGN KEY (`purged_by`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `date_fk_record_id` FOREIGN KEY (`record_id`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `daterange` +-- +CREATE TABLE `daterange` ( + `id` bigint NOT NULL auto_increment, + `record_id` bigint NOT NULL, + `layout_id` integer NOT NULL, + `from` date NULL, + `to` date NULL, + `child_unique` smallint NOT NULL DEFAULT 0, + `value` varchar(45) NULL, + `purged_by` bigint NULL, + `purged_on` datetime NULL, + INDEX `daterange_idx_layout_id` (`layout_id`), + INDEX `daterange_idx_purged_by` (`purged_by`), + INDEX `daterange_idx_record_id` (`record_id`), + INDEX `daterange_idx_from` (`from`), + INDEX `daterange_idx_to` (`to`), + INDEX `daterange_idx_value` (`value`), + PRIMARY KEY (`id`), + CONSTRAINT `daterange_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `daterange_fk_purged_by` FOREIGN KEY (`purged_by`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `daterange_fk_record_id` FOREIGN KEY (`record_id`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `department` +-- +CREATE TABLE `department` ( + `id` integer NOT NULL auto_increment, + `name` varchar(128) NULL, + `site_id` integer NULL, + `deleted` smallint NOT NULL DEFAULT 0, + INDEX `department_idx_site_id` (`site_id`), + PRIMARY KEY (`id`), + CONSTRAINT `department_fk_site_id` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `display_field` +-- +CREATE TABLE `display_field` ( + `id` integer NOT NULL auto_increment, + `layout_id` integer NOT NULL, + `display_field_id` integer NOT NULL, + `regex` text NULL, + `operator` varchar(16) NULL, + INDEX `display_field_idx_display_field_id` (`display_field_id`), + INDEX `display_field_idx_layout_id` (`layout_id`), + PRIMARY KEY (`id`), + CONSTRAINT `display_field_fk_display_field_id` FOREIGN KEY (`display_field_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `display_field_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `enum` +-- +CREATE TABLE `enum` ( + `id` bigint NOT NULL auto_increment, + `record_id` bigint NULL, + `layout_id` integer NULL, + `child_unique` smallint NOT NULL DEFAULT 0, + `value` integer NULL, + `purged_by` bigint NULL, + `purged_on` datetime NULL, + INDEX `enum_idx_layout_id` (`layout_id`), + INDEX `enum_idx_purged_by` (`purged_by`), + INDEX `enum_idx_record_id` (`record_id`), + INDEX `enum_idx_value` (`value`), + PRIMARY KEY (`id`), + CONSTRAINT `enum_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `enum_fk_purged_by` FOREIGN KEY (`purged_by`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `enum_fk_record_id` FOREIGN KEY (`record_id`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `enum_fk_value` FOREIGN KEY (`value`) REFERENCES `enumval` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `enumval` +-- +CREATE TABLE `enumval` ( + `id` integer NOT NULL auto_increment, + `value` text NULL, + `layout_id` integer NULL, + `deleted` smallint NOT NULL DEFAULT 0, + `parent` integer NULL, + `position` integer NULL, + INDEX `enumval_idx_layout_id` (`layout_id`), + INDEX `enumval_idx_parent` (`parent`), + INDEX `enumval_idx_value` (`value`(64)), + PRIMARY KEY (`id`), + CONSTRAINT `enumval_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `enumval_fk_parent` FOREIGN KEY (`parent`) REFERENCES `enumval` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `export` +-- +CREATE TABLE `export` ( + `id` integer NOT NULL auto_increment, + `site_id` integer NULL, + `user_id` bigint NOT NULL, + `type` varchar(45) NULL, + `started` datetime NULL, + `completed` datetime NULL, + `result` text NULL, + `result_internal` text NULL, + `mimetype` text NULL, + `content` longblob NULL, + INDEX `export_idx_site_id` (`site_id`), + INDEX `export_idx_user_id` (`user_id`), + PRIMARY KEY (`id`), + CONSTRAINT `export_fk_site_id` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `export_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `file` +-- +CREATE TABLE `file` ( + `id` bigint NOT NULL auto_increment, + `record_id` bigint NULL, + `layout_id` integer NULL, + `child_unique` smallint NOT NULL DEFAULT 0, + `value` bigint NULL, + `purged_by` bigint NULL, + `purged_on` datetime NULL, + INDEX `file_idx_layout_id` (`layout_id`), + INDEX `file_idx_purged_by` (`purged_by`), + INDEX `file_idx_record_id` (`record_id`), + INDEX `file_idx_value` (`value`), + PRIMARY KEY (`id`), + CONSTRAINT `file_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `file_fk_purged_by` FOREIGN KEY (`purged_by`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `file_fk_record_id` FOREIGN KEY (`record_id`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `file_fk_value` FOREIGN KEY (`value`) REFERENCES `fileval` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `file_option` +-- +CREATE TABLE `file_option` ( + `id` integer NOT NULL auto_increment, + `layout_id` integer NOT NULL, + `filesize` integer NULL, + INDEX `file_option_idx_layout_id` (`layout_id`), + PRIMARY KEY (`id`), + CONSTRAINT `file_option_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `fileval` +-- +CREATE TABLE `fileval` ( + `id` bigint NOT NULL auto_increment, + `name` text NULL, + `mimetype` text NULL, + `is_independent` smallint NOT NULL DEFAULT 0, + `edit_user_id` bigint NULL, + INDEX `fileval_idx_edit_user_id` (`edit_user_id`), + INDEX `fileval_idx_name` (`name`(64)), + PRIMARY KEY (`id`), + CONSTRAINT `fileval_fk_edit_user_id` FOREIGN KEY (`edit_user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `filter` +-- +CREATE TABLE `filter` ( + `id` bigint NOT NULL auto_increment, + `view_id` bigint NOT NULL, + `layout_id` integer NOT NULL, + INDEX `filter_idx_layout_id` (`layout_id`), + INDEX `filter_idx_view_id` (`view_id`), + PRIMARY KEY (`id`), + CONSTRAINT `filter_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `filter_fk_view_id` FOREIGN KEY (`view_id`) REFERENCES `view` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `filtered_value` +-- +CREATE TABLE `filtered_value` ( + `id` integer NOT NULL auto_increment, + `submission_id` integer NULL, + `layout_id` integer NULL, + `current_id` integer NULL, + INDEX `filtered_value_idx_current_id` (`current_id`), + INDEX `filtered_value_idx_layout_id` (`layout_id`), + INDEX `filtered_value_idx_submission_id` (`submission_id`), + PRIMARY KEY (`id`), + UNIQUE `ux_submission_layout_current` (`submission_id`, `layout_id`, `current_id`), + CONSTRAINT `filtered_value_fk_current_id` FOREIGN KEY (`current_id`) REFERENCES `current` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `filtered_value_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `filtered_value_fk_submission_id` FOREIGN KEY (`submission_id`) REFERENCES `submission` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `graph` +-- +CREATE TABLE `graph` ( + `id` integer NOT NULL auto_increment, + `title` text NULL, + `description` text NULL, + `y_axis` integer NULL, + `y_axis_link` integer NULL, + `y_axis_stack` varchar(45) NULL, + `y_axis_label` text NULL, + `x_axis` integer NULL, + `x_axis_link` integer NULL, + `x_axis_grouping` varchar(45) NULL, + `group_by` integer NULL, + `stackseries` smallint NOT NULL DEFAULT 0, + `as_percent` smallint NOT NULL DEFAULT 0, + `type` varchar(45) NULL, + `metric_group` integer NULL, + `instance_id` integer NULL, + `is_shared` smallint NOT NULL DEFAULT 0, + `user_id` bigint NULL, + `group_id` integer NULL, + `trend` varchar(45) NULL, + `from` date NULL, + `to` date NULL, + `x_axis_range` varchar(45) NULL, + INDEX `graph_idx_group_id` (`group_id`), + INDEX `graph_idx_group_by` (`group_by`), + INDEX `graph_idx_instance_id` (`instance_id`), + INDEX `graph_idx_metric_group` (`metric_group`), + INDEX `graph_idx_user_id` (`user_id`), + INDEX `graph_idx_x_axis` (`x_axis`), + INDEX `graph_idx_x_axis_link` (`x_axis_link`), + INDEX `graph_idx_y_axis` (`y_axis`), + INDEX `graph_idx_y_axis_link` (`y_axis_link`), + PRIMARY KEY (`id`), + CONSTRAINT `graph_fk_group_id` FOREIGN KEY (`group_id`) REFERENCES `group` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `graph_fk_group_by` FOREIGN KEY (`group_by`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `graph_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `graph_fk_metric_group` FOREIGN KEY (`metric_group`) REFERENCES `metric_group` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `graph_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `graph_fk_x_axis` FOREIGN KEY (`x_axis`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `graph_fk_x_axis_link` FOREIGN KEY (`x_axis_link`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `graph_fk_y_axis` FOREIGN KEY (`y_axis`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `graph_fk_y_axis_link` FOREIGN KEY (`y_axis_link`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `graph_color` +-- +CREATE TABLE `graph_color` ( + `id` bigint NOT NULL auto_increment, + `name` varchar(128) NULL, + `color` char(6) NULL, + PRIMARY KEY (`id`), + UNIQUE `ux_graph_color_name` (`name`) +); +-- +-- Table: `group` +-- +CREATE TABLE `group` ( + `id` integer NOT NULL auto_increment, + `name` varchar(128) NULL, + `default_read` smallint NOT NULL DEFAULT 0, + `default_write_new` smallint NOT NULL DEFAULT 0, + `default_write_existing` smallint NOT NULL DEFAULT 0, + `default_approve_new` smallint NOT NULL DEFAULT 0, + `default_approve_existing` smallint NOT NULL DEFAULT 0, + `default_write_new_no_approval` smallint NOT NULL DEFAULT 0, + `default_write_existing_no_approval` smallint NOT NULL DEFAULT 0, + `site_id` integer NULL, + INDEX `group_idx_site_id` (`site_id`), + PRIMARY KEY (`id`), + CONSTRAINT `group_fk_site_id` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `import` +-- +CREATE TABLE `import` ( + `id` integer NOT NULL auto_increment, + `site_id` integer NULL, + `instance_id` integer NULL, + `user_id` bigint NOT NULL, + `type` varchar(45) NULL, + `row_count` integer NOT NULL DEFAULT 0, + `started` datetime NULL, + `completed` datetime NULL, + `written_count` integer NOT NULL DEFAULT 0, + `error_count` integer NOT NULL DEFAULT 0, + `skipped_count` integer NOT NULL DEFAULT 0, + `result` text NULL, + INDEX `import_idx_instance_id` (`instance_id`), + INDEX `import_idx_site_id` (`site_id`), + INDEX `import_idx_user_id` (`user_id`), + PRIMARY KEY (`id`), + CONSTRAINT `import_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `import_fk_site_id` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `import_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `import_row` +-- +CREATE TABLE `import_row` ( + `id` bigint NOT NULL auto_increment, + `import_id` integer NOT NULL, + `status` varchar(45) NULL, + `content` text NULL, + `errors` text NULL, + `changes` text NULL, + INDEX `import_row_idx_import_id` (`import_id`), + PRIMARY KEY (`id`), + CONSTRAINT `import_row_fk_import_id` FOREIGN KEY (`import_id`) REFERENCES `import` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `instance` +-- +CREATE TABLE `instance` ( + `id` integer NOT NULL auto_increment, + `name` text NULL, + `name_short` varchar(64) NULL, + `site_id` integer NULL, + `sort_layout_id` integer NULL, + `sort_type` varchar(45) NULL, + `view_limit_id` integer NULL, + `default_view_limit_extra_id` integer NULL, + `homepage_text` text NULL, + `homepage_text2` text NULL, + `record_name` text NULL, + `forget_history` smallint NULL DEFAULT 0, + `no_overnight_update` smallint NULL DEFAULT 0, + `api_index_layout_id` integer NULL, + `forward_record_after_create` smallint NULL DEFAULT 0, + `no_hide_blank` smallint NOT NULL DEFAULT 0, + `no_download_pdf` smallint NOT NULL DEFAULT 0, + `no_copy_record` smallint NOT NULL DEFAULT 0, + `hide_in_selector` smallint NOT NULL DEFAULT 0, + `security_marking` text NULL, + INDEX `instance_idx_api_index_layout_id` (`api_index_layout_id`), + INDEX `instance_idx_default_view_limit_extra_id` (`default_view_limit_extra_id`), + INDEX `instance_idx_site_id` (`site_id`), + INDEX `instance_idx_sort_layout_id` (`sort_layout_id`), + INDEX `instance_idx_view_limit_id` (`view_limit_id`), + PRIMARY KEY (`id`), + CONSTRAINT `instance_fk_api_index_layout_id` FOREIGN KEY (`api_index_layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `instance_fk_default_view_limit_extra_id` FOREIGN KEY (`default_view_limit_extra_id`) REFERENCES `view` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `instance_fk_site_id` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `instance_fk_sort_layout_id` FOREIGN KEY (`sort_layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `instance_fk_view_limit_id` FOREIGN KEY (`view_limit_id`) REFERENCES `view` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `instance_group` +-- +CREATE TABLE `instance_group` ( + `id` integer NOT NULL auto_increment, + `instance_id` integer NOT NULL, + `group_id` integer NOT NULL, + `permission` varchar(45) NOT NULL, + INDEX `instance_group_idx_group_id` (`group_id`), + INDEX `instance_group_idx_instance_id` (`instance_id`), + PRIMARY KEY (`id`), + UNIQUE `instance_group_ux_instance_group_permission` (`instance_id`, `group_id`, `permission`), + CONSTRAINT `instance_group_fk_group_id` FOREIGN KEY (`group_id`) REFERENCES `group` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `instance_group_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `instance_rag` +-- +CREATE TABLE `instance_rag` ( + `id` integer NOT NULL auto_increment, + `instance_id` integer NOT NULL, + `rag` varchar(16) NOT NULL, + `enabled` smallint NOT NULL DEFAULT 0, + `description` text NULL, + INDEX `instance_rag_idx_instance_id` (`instance_id`), + PRIMARY KEY (`id`), + UNIQUE `instance_rag_ux_instance_rag` (`instance_id`, `rag`), + CONSTRAINT `instance_rag_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `intgr` +-- +CREATE TABLE `intgr` ( + `id` bigint NOT NULL auto_increment, + `record_id` bigint NOT NULL, + `layout_id` integer NOT NULL, + `child_unique` smallint NOT NULL DEFAULT 0, + `value` bigint NULL, + `purged_by` bigint NULL, + `purged_on` datetime NULL, + INDEX `intgr_idx_layout_id` (`layout_id`), + INDEX `intgr_idx_purged_by` (`purged_by`), + INDEX `intgr_idx_record_id` (`record_id`), + INDEX `intgr_idx_value` (`value`), + PRIMARY KEY (`id`), + CONSTRAINT `intgr_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `intgr_fk_purged_by` FOREIGN KEY (`purged_by`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `intgr_fk_record_id` FOREIGN KEY (`record_id`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `layout` +-- +CREATE TABLE `layout` ( + `id` integer NOT NULL auto_increment, + `name` text NULL, + `name_short` varchar(64) NULL, + `type` varchar(45) NULL, + `permission` integer NOT NULL DEFAULT 0, + `optional` smallint NOT NULL DEFAULT 0, + `remember` smallint NOT NULL DEFAULT 0, + `isunique` smallint NOT NULL DEFAULT 0, + `textbox` smallint NOT NULL DEFAULT 0, + `typeahead` smallint NOT NULL DEFAULT 0, + `force_regex` text NULL, + `position` integer NULL, + `ordering` varchar(45) NULL, + `end_node_only` smallint NOT NULL DEFAULT 0, + `multivalue` smallint NOT NULL DEFAULT 0, + `can_child` smallint NOT NULL DEFAULT 0, + `internal` smallint NOT NULL DEFAULT 0, + `description` text NULL, + `helptext` text NULL, + `options` text NULL, + `display_field` integer NULL, + `display_regex` text NULL, + `display_condition` char(3) NULL, + `display_matchtype` text NULL, + `instance_id` integer NULL, + `link_parent` integer NULL, + `related_field` integer NULL, + `width` integer NOT NULL DEFAULT 50, + `filter` text NULL, + `topic_id` integer NULL, + `aggregate` varchar(45) NULL, + `group_display` varchar(45) NULL, + `lookup_endpoint` text NULL, + `lookup_group` smallint NULL, + `notes` text NULL, + INDEX `layout_idx_display_field` (`display_field`), + INDEX `layout_idx_instance_id` (`instance_id`), + INDEX `layout_idx_link_parent` (`link_parent`), + INDEX `layout_idx_related_field` (`related_field`), + INDEX `layout_idx_topic_id` (`topic_id`), + PRIMARY KEY (`id`), + UNIQUE `layout_ux_instance_name_short` (`instance_id`, `name_short`), + CONSTRAINT `layout_fk_display_field` FOREIGN KEY (`display_field`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `layout_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `layout_fk_link_parent` FOREIGN KEY (`link_parent`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `layout_fk_related_field` FOREIGN KEY (`related_field`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `layout_fk_topic_id` FOREIGN KEY (`topic_id`) REFERENCES `topic` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `layout_depend` +-- +CREATE TABLE `layout_depend` ( + `id` integer NOT NULL auto_increment, + `layout_id` integer NOT NULL, + `depends_on` integer NOT NULL, + INDEX `layout_depend_idx_depends_on` (`depends_on`), + INDEX `layout_depend_idx_layout_id` (`layout_id`), + PRIMARY KEY (`id`), + CONSTRAINT `layout_depend_fk_depends_on` FOREIGN KEY (`depends_on`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `layout_depend_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `layout_group` +-- +CREATE TABLE `layout_group` ( + `id` integer NOT NULL auto_increment, + `layout_id` integer NOT NULL, + `group_id` integer NOT NULL, + `permission` varchar(45) NOT NULL, + INDEX `layout_group_idx_group_id` (`group_id`), + INDEX `layout_group_idx_layout_id` (`layout_id`), + INDEX `layout_group_idx_permission` (`permission`), + PRIMARY KEY (`id`), + UNIQUE `layout_group_ux_layout_group_permission` (`layout_id`, `group_id`, `permission`), + CONSTRAINT `layout_group_fk_group_id` FOREIGN KEY (`group_id`) REFERENCES `group` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `layout_group_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `metric` +-- +CREATE TABLE `metric` ( + `id` integer NOT NULL auto_increment, + `metric_group` integer NOT NULL, + `x_axis_value` text NULL, + `target` bigint NULL, + `y_axis_grouping_value` text NULL, + INDEX `metric_idx_metric_group` (`metric_group`), + PRIMARY KEY (`id`), + CONSTRAINT `metric_fk_metric_group` FOREIGN KEY (`metric_group`) REFERENCES `metric_group` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `metric_group` +-- +CREATE TABLE `metric_group` ( + `id` integer NOT NULL auto_increment, + `name` text NULL, + `instance_id` integer NULL, + INDEX `metric_group_idx_instance_id` (`instance_id`), + PRIMARY KEY (`id`), + CONSTRAINT `metric_group_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `oauthclient` +-- +CREATE TABLE `oauthclient` ( + `id` bigint NOT NULL auto_increment, + `client_id` varchar(64) NOT NULL, + `client_secret` varchar(64) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; +-- +-- Table: `oauthtoken` +-- +CREATE TABLE `oauthtoken` ( + `token` varchar(128) NOT NULL, + `related_token` varchar(128) NOT NULL, + `oauthclient_id` integer NOT NULL, + `user_id` bigint NOT NULL, + `type` varchar(12) NOT NULL, + `expires` integer NULL, + INDEX `oauthtoken_idx_oauthclient_id` (`oauthclient_id`), + INDEX `oauthtoken_idx_user_id` (`user_id`), + PRIMARY KEY (`token`), + CONSTRAINT `oauthtoken_fk_oauthclient_id` FOREIGN KEY (`oauthclient_id`) REFERENCES `oauthclient` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `oauthtoken_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `organisation` +-- +CREATE TABLE `organisation` ( + `id` integer NOT NULL auto_increment, + `name` varchar(128) NULL, + `site_id` integer NULL, + `deleted` smallint NOT NULL DEFAULT 0, + INDEX `organisation_idx_site_id` (`site_id`), + PRIMARY KEY (`id`), + CONSTRAINT `organisation_fk_site_id` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `permission` +-- +CREATE TABLE `permission` ( + `id` integer NOT NULL auto_increment, + `name` varchar(128) NOT NULL, + `description` text NULL, + `order` integer NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; +-- +-- Table: `person` +-- +CREATE TABLE `person` ( + `id` bigint NOT NULL auto_increment, + `record_id` bigint NULL, + `layout_id` integer NULL, + `child_unique` smallint NOT NULL DEFAULT 0, + `value` bigint NULL, + `purged_by` bigint NULL, + `purged_on` datetime NULL, + INDEX `person_idx_layout_id` (`layout_id`), + INDEX `person_idx_purged_by` (`purged_by`), + INDEX `person_idx_record_id` (`record_id`), + INDEX `person_idx_value` (`value`), + PRIMARY KEY (`id`), + CONSTRAINT `person_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `person_fk_purged_by` FOREIGN KEY (`purged_by`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `person_fk_record_id` FOREIGN KEY (`record_id`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `person_fk_value` FOREIGN KEY (`value`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `rag` +-- +CREATE TABLE `rag` ( + `id` integer NOT NULL auto_increment, + `layout_id` integer NOT NULL, + `red` text NULL, + `amber` text NULL, + `green` text NULL, + `code` mediumtext NULL, + INDEX `rag_idx_layout_id` (`layout_id`), + PRIMARY KEY (`id`), + CONSTRAINT `rag_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `ragval` +-- +CREATE TABLE `ragval` ( + `id` bigint NOT NULL auto_increment, + `record_id` bigint NOT NULL, + `layout_id` integer NOT NULL, + `value` varchar(16) NULL, + `purged_by` bigint NULL, + `purged_on` datetime NULL, + INDEX `ragval_idx_layout_id` (`layout_id`), + INDEX `ragval_idx_purged_by` (`purged_by`), + INDEX `ragval_idx_record_id` (`record_id`), + INDEX `ragval_idx_value` (`value`), + PRIMARY KEY (`id`), + UNIQUE `ragval_ux_record_layout` (`record_id`, `layout_id`), + CONSTRAINT `ragval_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `ragval_fk_purged_by` FOREIGN KEY (`purged_by`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `ragval_fk_record_id` FOREIGN KEY (`record_id`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `record` +-- +CREATE TABLE `record` ( + `id` bigint NOT NULL auto_increment, + `created` datetime NOT NULL, + `current_id` bigint NOT NULL DEFAULT 0, + `createdby` bigint NULL, + `approvedby` bigint NULL, + `record_id` bigint NULL, + `approval` smallint NOT NULL DEFAULT 0, + INDEX `record_idx_approvedby` (`approvedby`), + INDEX `record_idx_createdby` (`createdby`), + INDEX `record_idx_current_id` (`current_id`), + INDEX `record_idx_record_id` (`record_id`), + INDEX `record_idx_approval` (`approval`), + PRIMARY KEY (`id`), + CONSTRAINT `record_fk_approvedby` FOREIGN KEY (`approvedby`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `record_fk_createdby` FOREIGN KEY (`createdby`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `record_fk_current_id` FOREIGN KEY (`current_id`) REFERENCES `current` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `record_fk_record_id` FOREIGN KEY (`record_id`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `report` +-- +CREATE TABLE `report` ( + `id` bigint NOT NULL auto_increment, + `name` text NOT NULL, + `title` text NULL, + `description` text NULL, + `user_id` bigint NULL, + `createdby` bigint NULL, + `created` datetime NULL, + `instance_id` bigint NULL, + `deleted` datetime NULL, + `security_marking` text NULL, + INDEX `report_idx_createdby` (`createdby`), + INDEX `report_idx_instance_id` (`instance_id`), + INDEX `report_idx_user_id` (`user_id`), + PRIMARY KEY (`id`), + CONSTRAINT `report_fk_createdby` FOREIGN KEY (`createdby`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `report_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `report_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `report_group` +-- +CREATE TABLE `report_group` ( + `id` integer NOT NULL auto_increment, + `report_id` integer NOT NULL, + `group_id` integer NOT NULL, + INDEX `report_group_idx_group_id` (`group_id`), + INDEX `report_group_idx_report_id` (`report_id`), + PRIMARY KEY (`id`), + CONSTRAINT `report_group_fk_group_id` FOREIGN KEY (`group_id`) REFERENCES `group` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `report_group_fk_report_id` FOREIGN KEY (`report_id`) REFERENCES `report` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `report_layout` +-- +CREATE TABLE `report_layout` ( + `id` integer NOT NULL auto_increment, + `report_id` integer NOT NULL, + `layout_id` bigint NOT NULL, + `order` integer NULL, + INDEX `report_layout_idx_layout_id` (`layout_id`), + INDEX `report_layout_idx_report_id` (`report_id`), + PRIMARY KEY (`id`), + CONSTRAINT `report_layout_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `report_layout_fk_report_id` FOREIGN KEY (`report_id`) REFERENCES `report` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `site` +-- +CREATE TABLE `site` ( + `id` integer NOT NULL auto_increment, + `host` varchar(128) NULL, + `name` text NULL, + `created` datetime NULL, + `email_welcome_text` text NULL, + `email_welcome_subject` text NULL, + `email_delete_text` text NULL, + `email_delete_subject` text NULL, + `email_reject_text` text NULL, + `email_reject_subject` text NULL, + `register_text` text NULL, + `homepage_text` text NULL, + `homepage_text2` text NULL, + `register_title_help` text NULL, + `register_freetext1_help` text NULL, + `register_freetext2_help` text NULL, + `register_email_help` text NULL, + `register_organisation_help` text NULL, + `register_organisation_name` text NULL, + `register_organisation_mandatory` smallint NOT NULL DEFAULT 0, + `register_department_help` text NULL, + `register_department_name` text NULL, + `register_department_mandatory` smallint NOT NULL DEFAULT 0, + `register_team_help` text NULL, + `register_team_name` text NULL, + `register_team_mandatory` smallint NOT NULL DEFAULT 0, + `register_notes_help` text NULL, + `register_freetext1_name` text NULL, + `register_freetext2_name` text NULL, + `register_show_organisation` smallint NOT NULL DEFAULT 1, + `register_show_department` smallint NOT NULL DEFAULT 0, + `register_show_team` smallint NOT NULL DEFAULT 0, + `register_show_title` smallint NOT NULL DEFAULT 1, + `hide_account_request` smallint NOT NULL DEFAULT 0, + `remember_user_location` smallint NOT NULL DEFAULT 1, + `user_editable_fields` text NULL, + `register_freetext1_placeholder` text NULL, + `register_freetext2_placeholder` text NULL, + `account_request_notes_name` text NULL, + `account_request_notes_placeholder` text NULL, + `security_marking` text NULL, + `site_logo` longblob NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; +-- +-- Table: `sort` +-- +CREATE TABLE `sort` ( + `id` integer NOT NULL auto_increment, + `view_id` bigint NOT NULL, + `layout_id` integer NULL, + `parent_id` integer NULL, + `type` varchar(45) NULL, + `order` integer NULL, + INDEX `sort_idx_layout_id` (`layout_id`), + INDEX `sort_idx_parent_id` (`parent_id`), + INDEX `sort_idx_view_id` (`view_id`), + PRIMARY KEY (`id`), + CONSTRAINT `sort_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `sort_fk_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `sort_fk_view_id` FOREIGN KEY (`view_id`) REFERENCES `view` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `string` +-- +CREATE TABLE `string` ( + `id` bigint NOT NULL auto_increment, + `record_id` bigint NOT NULL, + `layout_id` integer NOT NULL, + `child_unique` smallint NOT NULL DEFAULT 0, + `value` text NULL, + `value_index` varchar(128) NULL, + `purged_by` bigint NULL, + `purged_on` datetime NULL, + INDEX `string_idx_layout_id` (`layout_id`), + INDEX `string_idx_purged_by` (`purged_by`), + INDEX `string_idx_record_id` (`record_id`), + INDEX `string_idx_value_index` (`value_index`), + PRIMARY KEY (`id`), + CONSTRAINT `string_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `string_fk_purged_by` FOREIGN KEY (`purged_by`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `string_fk_record_id` FOREIGN KEY (`record_id`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `submission` +-- +CREATE TABLE `submission` ( + `id` integer NOT NULL auto_increment, + `token` varchar(64) NOT NULL, + `created` datetime NULL, + `submitted` smallint NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE `ux_submission_token` (`token`, `submitted`) +) ENGINE=InnoDB; +-- +-- Table: `team` +-- +CREATE TABLE `team` ( + `id` integer NOT NULL auto_increment, + `name` varchar(128) NULL, + `site_id` integer NULL, + `deleted` smallint NOT NULL DEFAULT 0, + INDEX `team_idx_site_id` (`site_id`), + PRIMARY KEY (`id`), + CONSTRAINT `team_fk_site_id` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `title` +-- +CREATE TABLE `title` ( + `id` integer NOT NULL auto_increment, + `name` varchar(128) NULL, + `site_id` integer NULL, + `deleted` smallint NOT NULL DEFAULT 0, + INDEX `title_idx_site_id` (`site_id`), + PRIMARY KEY (`id`), + CONSTRAINT `title_fk_site_id` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `topic` +-- +CREATE TABLE `topic` ( + `id` integer NOT NULL auto_increment, + `instance_id` integer NULL, + `name` text NULL, + `description` text NULL, + `initial_state` varchar(32) NULL, + `click_to_edit` smallint NOT NULL DEFAULT 0, + `prevent_edit_topic_id` integer NULL, + INDEX `topic_idx_instance_id` (`instance_id`), + INDEX `topic_idx_prevent_edit_topic_id` (`prevent_edit_topic_id`), + PRIMARY KEY (`id`), + CONSTRAINT `topic_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `topic_fk_prevent_edit_topic_id` FOREIGN KEY (`prevent_edit_topic_id`) REFERENCES `topic` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `user` +-- +CREATE TABLE `user` ( + `id` bigint NOT NULL auto_increment, + `site_id` integer NULL, + `firstname` varchar(128) NULL, + `surname` varchar(128) NULL, + `email` text NULL, + `username` text NULL, + `title` integer NULL, + `organisation` integer NULL, + `department_id` integer NULL, + `team_id` integer NULL, + `freetext1` text NULL, + `freetext2` text NULL, + `password` varchar(128) NULL, + `pwchanged` datetime NULL, + `resetpw` varchar(32) NULL, + `deleted` datetime NULL, + `lastlogin` datetime NULL, + `lastfail` datetime NULL, + `failcount` integer NOT NULL DEFAULT 0, + `lastrecord` bigint NULL, + `lastview` bigint NULL, + `session_settings` text NULL, + `value` text NULL, + `account_request` smallint NULL DEFAULT 0, + `account_request_notes` text NULL, + `aup_accepted` datetime NULL, + `limit_to_view` bigint NULL, + `stylesheet` text NULL, + `created` datetime NULL, + `debug_login` smallint NULL DEFAULT 0, + INDEX `user_idx_department_id` (`department_id`), + INDEX `user_idx_lastrecord` (`lastrecord`), + INDEX `user_idx_lastview` (`lastview`), + INDEX `user_idx_limit_to_view` (`limit_to_view`), + INDEX `user_idx_organisation` (`organisation`), + INDEX `user_idx_site_id` (`site_id`), + INDEX `user_idx_team_id` (`team_id`), + INDEX `user_idx_title` (`title`), + INDEX `user_idx_value` (`value`(64)), + INDEX `user_idx_email` (`email`(64)), + INDEX `user_idx_username` (`username`(64)), + PRIMARY KEY (`id`), + CONSTRAINT `user_fk_department_id` FOREIGN KEY (`department_id`) REFERENCES `department` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `user_fk_lastrecord` FOREIGN KEY (`lastrecord`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `user_fk_lastview` FOREIGN KEY (`lastview`) REFERENCES `view` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `user_fk_limit_to_view` FOREIGN KEY (`limit_to_view`) REFERENCES `view` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `user_fk_organisation` FOREIGN KEY (`organisation`) REFERENCES `organisation` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `user_fk_site_id` FOREIGN KEY (`site_id`) REFERENCES `site` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `user_fk_team_id` FOREIGN KEY (`team_id`) REFERENCES `team` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `user_fk_title` FOREIGN KEY (`title`) REFERENCES `title` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `user_graph` +-- +CREATE TABLE `user_graph` ( + `id` bigint NOT NULL auto_increment, + `user_id` bigint NOT NULL, + `graph_id` integer NOT NULL, + INDEX `user_graph_idx_graph_id` (`graph_id`), + INDEX `user_graph_idx_user_id` (`user_id`), + PRIMARY KEY (`id`), + CONSTRAINT `user_graph_fk_graph_id` FOREIGN KEY (`graph_id`) REFERENCES `graph` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `user_graph_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `user_group` +-- +CREATE TABLE `user_group` ( + `id` bigint NOT NULL auto_increment, + `user_id` bigint NOT NULL, + `group_id` integer NOT NULL, + INDEX `user_group_idx_group_id` (`group_id`), + INDEX `user_group_idx_user_id` (`user_id`), + PRIMARY KEY (`id`), + CONSTRAINT `user_group_fk_group_id` FOREIGN KEY (`group_id`) REFERENCES `group` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `user_group_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `user_lastrecord` +-- +CREATE TABLE `user_lastrecord` ( + `id` bigint NOT NULL auto_increment, + `record_id` bigint NOT NULL, + `instance_id` integer NOT NULL, + `user_id` bigint NOT NULL, + INDEX `user_lastrecord_idx_instance_id` (`instance_id`), + INDEX `user_lastrecord_idx_record_id` (`record_id`), + INDEX `user_lastrecord_idx_user_id` (`user_id`), + PRIMARY KEY (`id`), + CONSTRAINT `user_lastrecord_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `user_lastrecord_fk_record_id` FOREIGN KEY (`record_id`) REFERENCES `record` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `user_lastrecord_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `user_permission` +-- +CREATE TABLE `user_permission` ( + `id` bigint NOT NULL auto_increment, + `user_id` bigint NOT NULL, + `permission_id` integer NOT NULL, + INDEX `user_permission_idx_permission_id` (`permission_id`), + INDEX `user_permission_idx_user_id` (`user_id`), + PRIMARY KEY (`id`), + CONSTRAINT `user_permission_fk_permission_id` FOREIGN KEY (`permission_id`) REFERENCES `permission` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `user_permission_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `view` +-- +CREATE TABLE `view` ( + `id` bigint NOT NULL auto_increment, + `user_id` bigint NULL, + `group_id` integer NULL, + `name` varchar(128) NULL, + `global` smallint NOT NULL DEFAULT 0, + `is_admin` smallint NOT NULL DEFAULT 0, + `is_limit_extra` smallint NOT NULL DEFAULT 0, + `filter` text NULL, + `instance_id` integer NULL, + `created` datetime NULL, + `createdby` bigint NULL, + INDEX `view_idx_createdby` (`createdby`), + INDEX `view_idx_group_id` (`group_id`), + INDEX `view_idx_instance_id` (`instance_id`), + INDEX `view_idx_user_id` (`user_id`), + PRIMARY KEY (`id`), + CONSTRAINT `view_fk_createdby` FOREIGN KEY (`createdby`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `view_fk_group_id` FOREIGN KEY (`group_id`) REFERENCES `group` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `view_fk_instance_id` FOREIGN KEY (`instance_id`) REFERENCES `instance` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `view_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `view_group` +-- +CREATE TABLE `view_group` ( + `id` integer NOT NULL auto_increment, + `view_id` bigint NOT NULL, + `layout_id` integer NULL, + `parent_id` integer NULL, + `order` integer NULL, + INDEX `view_group_idx_layout_id` (`layout_id`), + INDEX `view_group_idx_parent_id` (`parent_id`), + INDEX `view_group_idx_view_id` (`view_id`), + PRIMARY KEY (`id`), + CONSTRAINT `view_group_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `view_group_fk_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `view_group_fk_view_id` FOREIGN KEY (`view_id`) REFERENCES `view` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `view_layout` +-- +CREATE TABLE `view_layout` ( + `id` integer NOT NULL auto_increment, + `view_id` bigint NOT NULL, + `layout_id` integer NOT NULL, + `order` integer NULL, + INDEX `view_layout_idx_layout_id` (`layout_id`), + INDEX `view_layout_idx_view_id` (`view_id`), + PRIMARY KEY (`id`), + CONSTRAINT `view_layout_fk_layout_id` FOREIGN KEY (`layout_id`) REFERENCES `layout` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `view_layout_fk_view_id` FOREIGN KEY (`view_id`) REFERENCES `view` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `view_limit` +-- +CREATE TABLE `view_limit` ( + `id` bigint NOT NULL auto_increment, + `view_id` bigint NOT NULL, + `user_id` bigint NOT NULL, + INDEX `view_limit_idx_user_id` (`user_id`), + INDEX `view_limit_idx_view_id` (`view_id`), + PRIMARY KEY (`id`), + CONSTRAINT `view_limit_fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `view_limit_fk_view_id` FOREIGN KEY (`view_id`) REFERENCES `view` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +-- +-- Table: `widget` +-- +CREATE TABLE `widget` ( + `id` integer NOT NULL auto_increment, + `grid_id` varchar(64) NULL, + `dashboard_id` integer NULL, + `type` varchar(16) NULL, + `title` text NULL, + `static` smallint NOT NULL DEFAULT 0, + `h` smallint NULL DEFAULT 0, + `w` smallint NULL DEFAULT 0, + `x` smallint NULL DEFAULT 0, + `y` smallint NULL DEFAULT 0, + `content` text NULL, + `view_id` integer NULL, + `graph_id` integer NULL, + `rows` integer NULL, + `tl_options` text NULL, + `globe_options` text NULL, + INDEX `widget_idx_dashboard_id` (`dashboard_id`), + INDEX `widget_idx_graph_id` (`graph_id`), + INDEX `widget_idx_view_id` (`view_id`), + PRIMARY KEY (`id`), + UNIQUE `widget_ux_dashboard_grid` (`dashboard_id`, `grid_id`), + CONSTRAINT `widget_fk_dashboard_id` FOREIGN KEY (`dashboard_id`) REFERENCES `dashboard` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `widget_fk_graph_id` FOREIGN KEY (`graph_id`) REFERENCES `graph` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `widget_fk_view_id` FOREIGN KEY (`view_id`) REFERENCES `view` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB; +SET foreign_key_checks=1; diff --git a/share/migrations/MySQL/downgrade/110-109/001-auto.sql b/share/migrations/MySQL/downgrade/110-109/001-auto.sql new file mode 100644 index 000000000..670c4000c --- /dev/null +++ b/share/migrations/MySQL/downgrade/110-109/001-auto.sql @@ -0,0 +1,19 @@ +-- Convert schema '/home/abeverley/git/GADS/bin/../share/migrations/_source/deploy/110/001-auto.yml' to '/home/abeverley/git/GADS/bin/../share/migrations/_source/deploy/109/001-auto.yml':; + +; +BEGIN; + +; +ALTER TABLE current DROP FOREIGN KEY current_fk_current_version_id, + DROP INDEX current_idx_current_version_id, + DROP COLUMN current_version_id; + +; +ALTER TABLE graph DROP FOREIGN KEY graph_fk_y_axis_link, + DROP INDEX graph_idx_y_axis_link, + DROP COLUMN y_axis_link; + +; + +COMMIT; + diff --git a/share/migrations/MySQL/upgrade/109-110/001-auto.sql b/share/migrations/MySQL/upgrade/109-110/001-auto.sql new file mode 100644 index 000000000..519735a68 --- /dev/null +++ b/share/migrations/MySQL/upgrade/109-110/001-auto.sql @@ -0,0 +1,19 @@ +-- Convert schema '/home/abeverley/git/GADS/bin/../share/migrations/_source/deploy/109/001-auto.yml' to '/home/abeverley/git/GADS/bin/../share/migrations/_source/deploy/110/001-auto.yml':; + +; +BEGIN; + +; +ALTER TABLE current ADD COLUMN current_version_id bigint NULL, + ADD INDEX current_idx_current_version_id (current_version_id), + ADD CONSTRAINT current_fk_current_version_id FOREIGN KEY (current_version_id) REFERENCES record (id) ON DELETE NO ACTION ON UPDATE NO ACTION; + +; +ALTER TABLE graph ADD COLUMN y_axis_link integer NULL, + ADD INDEX graph_idx_y_axis_link (y_axis_link), + ADD CONSTRAINT graph_fk_y_axis_link FOREIGN KEY (y_axis_link) REFERENCES layout (id) ON DELETE NO ACTION ON UPDATE NO ACTION; + +; + +COMMIT; + diff --git a/share/migrations/PostgreSQL/deploy/110/001-auto-__VERSION.sql b/share/migrations/PostgreSQL/deploy/110/001-auto-__VERSION.sql new file mode 100644 index 000000000..97f33b7d0 --- /dev/null +++ b/share/migrations/PostgreSQL/deploy/110/001-auto-__VERSION.sql @@ -0,0 +1,18 @@ +-- +-- Created by SQL::Translator::Producer::PostgreSQL +-- Created on Sun Jan 4 22:32:07 2026 +-- +; +-- +-- Table: dbix_class_deploymenthandler_versions +-- +CREATE TABLE "dbix_class_deploymenthandler_versions" ( + "id" serial NOT NULL, + "version" character varying(50) NOT NULL, + "ddl" text, + "upgrade_sql" text, + PRIMARY KEY ("id"), + CONSTRAINT "dbix_class_deploymenthandler_versions_version" UNIQUE ("version") +); + +; diff --git a/share/migrations/PostgreSQL/deploy/110/001-auto.sql b/share/migrations/PostgreSQL/deploy/110/001-auto.sql new file mode 100644 index 000000000..6a3abadbf --- /dev/null +++ b/share/migrations/PostgreSQL/deploy/110/001-auto.sql @@ -0,0 +1,1902 @@ +-- +-- Created by SQL::Translator::Producer::PostgreSQL +-- Created on Sun Jan 4 22:32:06 2026 +-- +; +-- +-- Table: alert +-- +CREATE TABLE "alert" ( + "id" serial NOT NULL, + "view_id" bigint NOT NULL, + "user_id" bigint NOT NULL, + "frequency" integer DEFAULT 0 NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "alert_idx_user_id" on "alert" ("user_id"); +CREATE INDEX "alert_idx_view_id" on "alert" ("view_id"); + +; +-- +-- Table: alert_cache +-- +CREATE TABLE "alert_cache" ( + "id" bigserial NOT NULL, + "layout_id" integer NOT NULL, + "view_id" bigint NOT NULL, + "current_id" bigint NOT NULL, + "user_id" bigint, + PRIMARY KEY ("id") +); +CREATE INDEX "alert_cache_idx_current_id" on "alert_cache" ("current_id"); +CREATE INDEX "alert_cache_idx_layout_id" on "alert_cache" ("layout_id"); +CREATE INDEX "alert_cache_idx_user_id" on "alert_cache" ("user_id"); +CREATE INDEX "alert_cache_idx_view_id" on "alert_cache" ("view_id"); + +; +-- +-- Table: alert_column +-- +CREATE TABLE "alert_column" ( + "id" serial NOT NULL, + "layout_id" integer NOT NULL, + "instance_id" integer NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "alert_column_idx_instance_id" on "alert_column" ("instance_id"); +CREATE INDEX "alert_column_idx_layout_id" on "alert_column" ("layout_id"); + +; +-- +-- Table: alert_send +-- +CREATE TABLE "alert_send" ( + "id" bigserial NOT NULL, + "layout_id" integer, + "alert_id" integer NOT NULL, + "current_id" bigint NOT NULL, + "status" character(7), + PRIMARY KEY ("id"), + CONSTRAINT "alert_send_all" UNIQUE ("layout_id", "alert_id", "current_id", "status") +); +CREATE INDEX "alert_send_idx_alert_id" on "alert_send" ("alert_id"); +CREATE INDEX "alert_send_idx_current_id" on "alert_send" ("current_id"); +CREATE INDEX "alert_send_idx_layout_id" on "alert_send" ("layout_id"); + +; +-- +-- Table: audit +-- +CREATE TABLE "audit" ( + "id" bigserial NOT NULL, + "site_id" integer, + "user_id" bigint, + "type" character varying(45), + "datetime" timestamp, + "method" character varying(45), + "url" text, + "description" text, + "instance_id" integer, + PRIMARY KEY ("id") +); +CREATE INDEX "audit_idx_instance_id" on "audit" ("instance_id"); +CREATE INDEX "audit_idx_site_id" on "audit" ("site_id"); +CREATE INDEX "audit_idx_user_id" on "audit" ("user_id"); +CREATE INDEX "audit_idx_datetime" on "audit" ("datetime"); +CREATE INDEX "audit_idx_user_instance_datetime" on "audit" ("user_id", "instance_id", "datetime"); + +; +-- +-- Table: authentication +-- +CREATE TABLE "authentication" ( + "id" bigserial NOT NULL, + "site_id" integer, + "type" character varying(32), + "name" text, + "xml" text, + "saml2_firstname" text, + "saml2_surname" text, + "enabled" smallint DEFAULT 0 NOT NULL, + "error_messages" text, + PRIMARY KEY ("id") +); +CREATE INDEX "authentication_idx_site_id" on "authentication" ("site_id"); + +; +-- +-- Table: calc +-- +CREATE TABLE "calc" ( + "id" serial NOT NULL, + "layout_id" integer, + "calc" text, + "code" text, + "return_format" character varying(45), + "decimal_places" smallint, + PRIMARY KEY ("id") +); +CREATE INDEX "calc_idx_layout_id" on "calc" ("layout_id"); + +; +-- +-- Table: calc_unique +-- +CREATE TABLE "calc_unique" ( + "id" bigserial NOT NULL, + "layout_id" integer NOT NULL, + "value_text" citext, + "value_int" bigint, + "value_date" date, + "value_numeric" numeric(20,5), + "value_date_from" timestamp, + "value_date_to" timestamp, + PRIMARY KEY ("id"), + CONSTRAINT "calc_unique_ux_layout_date" UNIQUE ("layout_id", "value_date"), + CONSTRAINT "calc_unique_ux_layout_daterange" UNIQUE ("layout_id", "value_date_from", "value_date_to"), + CONSTRAINT "calc_unique_ux_layout_int" UNIQUE ("layout_id", "value_int"), + CONSTRAINT "calc_unique_ux_layout_numeric" UNIQUE ("layout_id", "value_numeric"), + CONSTRAINT "calc_unique_ux_layout_text" UNIQUE ("layout_id", "value_text") +); +CREATE INDEX "calc_unique_idx_layout_id" on "calc_unique" ("layout_id"); + +; +-- +-- Table: calcval +-- +CREATE TABLE "calcval" ( + "id" bigserial NOT NULL, + "record_id" bigint NOT NULL, + "layout_id" integer NOT NULL, + "value_text" citext, + "value_int" bigint, + "value_date" date, + "value_numeric" numeric(20,5), + "value_date_from" timestamp, + "value_date_to" timestamp, + "purged_by" bigint, + "purged_on" timestamp, + PRIMARY KEY ("id") +); +CREATE INDEX "calcval_idx_layout_id" on "calcval" ("layout_id"); +CREATE INDEX "calcval_idx_purged_by" on "calcval" ("purged_by"); +CREATE INDEX "calcval_idx_record_id" on "calcval" ("record_id"); +CREATE INDEX "calcval_idx_value_text" on "calcval" ("value_text"); +CREATE INDEX "calcval_idx_value_numeric" on "calcval" ("value_numeric"); +CREATE INDEX "calcval_idx_value_int" on "calcval" ("value_int"); +CREATE INDEX "calcval_idx_value_date" on "calcval" ("value_date"); + +; +-- +-- Table: current +-- +CREATE TABLE "current" ( + "id" bigserial NOT NULL, + "serial" bigint, + "current_version_id" bigint, + "parent_id" bigint, + "instance_id" integer, + "linked_id" bigint, + "deleted" timestamp, + "deletedby" bigint, + "draftuser_id" bigint, + PRIMARY KEY ("id"), + CONSTRAINT "current_ux_instance_serial" UNIQUE ("instance_id", "serial") +); +CREATE INDEX "current_idx_current_version_id" on "current" ("current_version_id"); +CREATE INDEX "current_idx_deletedby" on "current" ("deletedby"); +CREATE INDEX "current_idx_draftuser_id" on "current" ("draftuser_id"); +CREATE INDEX "current_idx_instance_id" on "current" ("instance_id"); +CREATE INDEX "current_idx_linked_id" on "current" ("linked_id"); +CREATE INDEX "current_idx_parent_id" on "current" ("parent_id"); + +; +-- +-- Table: curval +-- +CREATE TABLE "curval" ( + "id" bigserial NOT NULL, + "record_id" bigint, + "layout_id" integer, + "child_unique" smallint DEFAULT 0 NOT NULL, + "value" bigint, + "purged_by" bigint, + "purged_on" timestamp, + PRIMARY KEY ("id") +); +CREATE INDEX "curval_idx_layout_id" on "curval" ("layout_id"); +CREATE INDEX "curval_idx_purged_by" on "curval" ("purged_by"); +CREATE INDEX "curval_idx_record_id" on "curval" ("record_id"); +CREATE INDEX "curval_idx_value" on "curval" ("value"); + +; +-- +-- Table: curval_fields +-- +CREATE TABLE "curval_fields" ( + "id" serial NOT NULL, + "parent_id" integer NOT NULL, + "child_id" integer NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "curval_fields_idx_child_id" on "curval_fields" ("child_id"); +CREATE INDEX "curval_fields_idx_parent_id" on "curval_fields" ("parent_id"); + +; +-- +-- Table: dashboard +-- +CREATE TABLE "dashboard" ( + "id" serial NOT NULL, + "site_id" integer, + "instance_id" integer, + "user_id" integer, + PRIMARY KEY ("id") +); +CREATE INDEX "dashboard_idx_instance_id" on "dashboard" ("instance_id"); +CREATE INDEX "dashboard_idx_site_id" on "dashboard" ("site_id"); +CREATE INDEX "dashboard_idx_user_id" on "dashboard" ("user_id"); + +; +-- +-- Table: date +-- +CREATE TABLE "date" ( + "id" bigserial NOT NULL, + "record_id" bigint NOT NULL, + "layout_id" integer NOT NULL, + "child_unique" smallint DEFAULT 0 NOT NULL, + "value" date, + "purged_by" bigint, + "purged_on" timestamp, + PRIMARY KEY ("id") +); +CREATE INDEX "date_idx_layout_id" on "date" ("layout_id"); +CREATE INDEX "date_idx_purged_by" on "date" ("purged_by"); +CREATE INDEX "date_idx_record_id" on "date" ("record_id"); +CREATE INDEX "date_idx_value" on "date" ("value"); + +; +-- +-- Table: daterange +-- +CREATE TABLE "daterange" ( + "id" bigserial NOT NULL, + "record_id" bigint NOT NULL, + "layout_id" integer NOT NULL, + "from" date, + "to" date, + "child_unique" smallint DEFAULT 0 NOT NULL, + "value" citext, + "purged_by" bigint, + "purged_on" timestamp, + PRIMARY KEY ("id") +); +CREATE INDEX "daterange_idx_layout_id" on "daterange" ("layout_id"); +CREATE INDEX "daterange_idx_purged_by" on "daterange" ("purged_by"); +CREATE INDEX "daterange_idx_record_id" on "daterange" ("record_id"); +CREATE INDEX "daterange_idx_from" on "daterange" ("from"); +CREATE INDEX "daterange_idx_to" on "daterange" ("to"); +CREATE INDEX "daterange_idx_value" on "daterange" ("value"); + +; +-- +-- Table: department +-- +CREATE TABLE "department" ( + "id" serial NOT NULL, + "name" citext, + "site_id" integer, + "deleted" smallint DEFAULT 0 NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "department_idx_site_id" on "department" ("site_id"); + +; +-- +-- Table: display_field +-- +CREATE TABLE "display_field" ( + "id" serial NOT NULL, + "layout_id" integer NOT NULL, + "display_field_id" integer NOT NULL, + "regex" text, + "operator" character varying(16), + PRIMARY KEY ("id") +); +CREATE INDEX "display_field_idx_display_field_id" on "display_field" ("display_field_id"); +CREATE INDEX "display_field_idx_layout_id" on "display_field" ("layout_id"); + +; +-- +-- Table: enum +-- +CREATE TABLE "enum" ( + "id" bigserial NOT NULL, + "record_id" bigint, + "layout_id" integer, + "child_unique" smallint DEFAULT 0 NOT NULL, + "value" integer, + "purged_by" bigint, + "purged_on" timestamp, + PRIMARY KEY ("id") +); +CREATE INDEX "enum_idx_layout_id" on "enum" ("layout_id"); +CREATE INDEX "enum_idx_purged_by" on "enum" ("purged_by"); +CREATE INDEX "enum_idx_record_id" on "enum" ("record_id"); +CREATE INDEX "enum_idx_value" on "enum" ("value"); + +; +-- +-- Table: enumval +-- +CREATE TABLE "enumval" ( + "id" serial NOT NULL, + "value" citext, + "layout_id" integer, + "deleted" smallint DEFAULT 0 NOT NULL, + "parent" integer, + "position" integer, + PRIMARY KEY ("id") +); +CREATE INDEX "enumval_idx_layout_id" on "enumval" ("layout_id"); +CREATE INDEX "enumval_idx_parent" on "enumval" ("parent"); +CREATE INDEX "enumval_idx_value" on "enumval" ("value"); + +; +-- +-- Table: export +-- +CREATE TABLE "export" ( + "id" serial NOT NULL, + "site_id" integer, + "user_id" bigint NOT NULL, + "type" character varying(45), + "started" timestamp, + "completed" timestamp, + "result" text, + "result_internal" text, + "mimetype" text, + "content" bytea, + PRIMARY KEY ("id") +); +CREATE INDEX "export_idx_site_id" on "export" ("site_id"); +CREATE INDEX "export_idx_user_id" on "export" ("user_id"); + +; +-- +-- Table: file +-- +CREATE TABLE "file" ( + "id" bigserial NOT NULL, + "record_id" bigint, + "layout_id" integer, + "child_unique" smallint DEFAULT 0 NOT NULL, + "value" bigint, + "purged_by" bigint, + "purged_on" timestamp, + PRIMARY KEY ("id") +); +CREATE INDEX "file_idx_layout_id" on "file" ("layout_id"); +CREATE INDEX "file_idx_purged_by" on "file" ("purged_by"); +CREATE INDEX "file_idx_record_id" on "file" ("record_id"); +CREATE INDEX "file_idx_value" on "file" ("value"); + +; +-- +-- Table: file_option +-- +CREATE TABLE "file_option" ( + "id" serial NOT NULL, + "layout_id" integer NOT NULL, + "filesize" integer, + PRIMARY KEY ("id") +); +CREATE INDEX "file_option_idx_layout_id" on "file_option" ("layout_id"); + +; +-- +-- Table: fileval +-- +CREATE TABLE "fileval" ( + "id" bigserial NOT NULL, + "name" text, + "mimetype" text, + "is_independent" smallint DEFAULT 0 NOT NULL, + "edit_user_id" bigint, + PRIMARY KEY ("id") +); +CREATE INDEX "fileval_idx_edit_user_id" on "fileval" ("edit_user_id"); +CREATE INDEX "fileval_idx_name" on "fileval" ("name"); + +; +-- +-- Table: filter +-- +CREATE TABLE "filter" ( + "id" bigserial NOT NULL, + "view_id" bigint NOT NULL, + "layout_id" integer NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "filter_idx_layout_id" on "filter" ("layout_id"); +CREATE INDEX "filter_idx_view_id" on "filter" ("view_id"); + +; +-- +-- Table: filtered_value +-- +CREATE TABLE "filtered_value" ( + "id" serial NOT NULL, + "submission_id" integer, + "layout_id" integer, + "current_id" integer, + PRIMARY KEY ("id"), + CONSTRAINT "ux_submission_layout_current" UNIQUE ("submission_id", "layout_id", "current_id") +); +CREATE INDEX "filtered_value_idx_current_id" on "filtered_value" ("current_id"); +CREATE INDEX "filtered_value_idx_layout_id" on "filtered_value" ("layout_id"); +CREATE INDEX "filtered_value_idx_submission_id" on "filtered_value" ("submission_id"); + +; +-- +-- Table: graph +-- +CREATE TABLE "graph" ( + "id" serial NOT NULL, + "title" text, + "description" text, + "y_axis" integer, + "y_axis_link" integer, + "y_axis_stack" character varying(45), + "y_axis_label" text, + "x_axis" integer, + "x_axis_link" integer, + "x_axis_grouping" character varying(45), + "group_by" integer, + "stackseries" smallint DEFAULT 0 NOT NULL, + "as_percent" smallint DEFAULT 0 NOT NULL, + "type" character varying(45), + "metric_group" integer, + "instance_id" integer, + "is_shared" smallint DEFAULT 0 NOT NULL, + "user_id" bigint, + "group_id" integer, + "trend" character varying(45), + "from" date, + "to" date, + "x_axis_range" character varying(45), + PRIMARY KEY ("id") +); +CREATE INDEX "graph_idx_group_id" on "graph" ("group_id"); +CREATE INDEX "graph_idx_group_by" on "graph" ("group_by"); +CREATE INDEX "graph_idx_instance_id" on "graph" ("instance_id"); +CREATE INDEX "graph_idx_metric_group" on "graph" ("metric_group"); +CREATE INDEX "graph_idx_user_id" on "graph" ("user_id"); +CREATE INDEX "graph_idx_x_axis" on "graph" ("x_axis"); +CREATE INDEX "graph_idx_x_axis_link" on "graph" ("x_axis_link"); +CREATE INDEX "graph_idx_y_axis" on "graph" ("y_axis"); +CREATE INDEX "graph_idx_y_axis_link" on "graph" ("y_axis_link"); + +; +-- +-- Table: graph_color +-- +CREATE TABLE "graph_color" ( + "id" bigserial NOT NULL, + "name" character varying(128), + "color" character(6), + PRIMARY KEY ("id"), + CONSTRAINT "ux_graph_color_name" UNIQUE ("name") +); + +; +-- +-- Table: group +-- +CREATE TABLE "group" ( + "id" serial NOT NULL, + "name" character varying(128), + "default_read" smallint DEFAULT 0 NOT NULL, + "default_write_new" smallint DEFAULT 0 NOT NULL, + "default_write_existing" smallint DEFAULT 0 NOT NULL, + "default_approve_new" smallint DEFAULT 0 NOT NULL, + "default_approve_existing" smallint DEFAULT 0 NOT NULL, + "default_write_new_no_approval" smallint DEFAULT 0 NOT NULL, + "default_write_existing_no_approval" smallint DEFAULT 0 NOT NULL, + "site_id" integer, + PRIMARY KEY ("id") +); +CREATE INDEX "group_idx_site_id" on "group" ("site_id"); + +; +-- +-- Table: import +-- +CREATE TABLE "import" ( + "id" serial NOT NULL, + "site_id" integer, + "instance_id" integer, + "user_id" bigint NOT NULL, + "type" character varying(45), + "row_count" integer DEFAULT 0 NOT NULL, + "started" timestamp, + "completed" timestamp, + "written_count" integer DEFAULT 0 NOT NULL, + "error_count" integer DEFAULT 0 NOT NULL, + "skipped_count" integer DEFAULT 0 NOT NULL, + "result" text, + PRIMARY KEY ("id") +); +CREATE INDEX "import_idx_instance_id" on "import" ("instance_id"); +CREATE INDEX "import_idx_site_id" on "import" ("site_id"); +CREATE INDEX "import_idx_user_id" on "import" ("user_id"); + +; +-- +-- Table: import_row +-- +CREATE TABLE "import_row" ( + "id" bigserial NOT NULL, + "import_id" integer NOT NULL, + "status" character varying(45), + "content" text, + "errors" text, + "changes" text, + PRIMARY KEY ("id") +); +CREATE INDEX "import_row_idx_import_id" on "import_row" ("import_id"); + +; +-- +-- Table: instance +-- +CREATE TABLE "instance" ( + "id" serial NOT NULL, + "name" text, + "name_short" character varying(64), + "site_id" integer, + "sort_layout_id" integer, + "sort_type" character varying(45), + "view_limit_id" integer, + "default_view_limit_extra_id" integer, + "homepage_text" text, + "homepage_text2" text, + "record_name" text, + "forget_history" smallint DEFAULT 0, + "no_overnight_update" smallint DEFAULT 0, + "api_index_layout_id" integer, + "forward_record_after_create" smallint DEFAULT 0, + "no_hide_blank" smallint DEFAULT 0 NOT NULL, + "no_download_pdf" smallint DEFAULT 0 NOT NULL, + "no_copy_record" smallint DEFAULT 0 NOT NULL, + "hide_in_selector" smallint DEFAULT 0 NOT NULL, + "security_marking" text, + PRIMARY KEY ("id") +); +CREATE INDEX "instance_idx_api_index_layout_id" on "instance" ("api_index_layout_id"); +CREATE INDEX "instance_idx_default_view_limit_extra_id" on "instance" ("default_view_limit_extra_id"); +CREATE INDEX "instance_idx_site_id" on "instance" ("site_id"); +CREATE INDEX "instance_idx_sort_layout_id" on "instance" ("sort_layout_id"); +CREATE INDEX "instance_idx_view_limit_id" on "instance" ("view_limit_id"); + +; +-- +-- Table: instance_group +-- +CREATE TABLE "instance_group" ( + "id" serial NOT NULL, + "instance_id" integer NOT NULL, + "group_id" integer NOT NULL, + "permission" character varying(45) NOT NULL, + PRIMARY KEY ("id"), + CONSTRAINT "instance_group_ux_instance_group_permission" UNIQUE ("instance_id", "group_id", "permission") +); +CREATE INDEX "instance_group_idx_group_id" on "instance_group" ("group_id"); +CREATE INDEX "instance_group_idx_instance_id" on "instance_group" ("instance_id"); + +; +-- +-- Table: instance_rag +-- +CREATE TABLE "instance_rag" ( + "id" serial NOT NULL, + "instance_id" integer NOT NULL, + "rag" character varying(16) NOT NULL, + "enabled" smallint DEFAULT 0 NOT NULL, + "description" text, + PRIMARY KEY ("id"), + CONSTRAINT "instance_rag_ux_instance_rag" UNIQUE ("instance_id", "rag") +); +CREATE INDEX "instance_rag_idx_instance_id" on "instance_rag" ("instance_id"); + +; +-- +-- Table: intgr +-- +CREATE TABLE "intgr" ( + "id" bigserial NOT NULL, + "record_id" bigint NOT NULL, + "layout_id" integer NOT NULL, + "child_unique" smallint DEFAULT 0 NOT NULL, + "value" bigint, + "purged_by" bigint, + "purged_on" timestamp, + PRIMARY KEY ("id") +); +CREATE INDEX "intgr_idx_layout_id" on "intgr" ("layout_id"); +CREATE INDEX "intgr_idx_purged_by" on "intgr" ("purged_by"); +CREATE INDEX "intgr_idx_record_id" on "intgr" ("record_id"); +CREATE INDEX "intgr_idx_value" on "intgr" ("value"); + +; +-- +-- Table: layout +-- +CREATE TABLE "layout" ( + "id" serial NOT NULL, + "name" text, + "name_short" character varying(64), + "type" character varying(45), + "permission" integer DEFAULT 0 NOT NULL, + "optional" smallint DEFAULT 0 NOT NULL, + "remember" smallint DEFAULT 0 NOT NULL, + "isunique" smallint DEFAULT 0 NOT NULL, + "textbox" smallint DEFAULT 0 NOT NULL, + "typeahead" smallint DEFAULT 0 NOT NULL, + "force_regex" text, + "position" integer, + "ordering" character varying(45), + "end_node_only" smallint DEFAULT 0 NOT NULL, + "multivalue" smallint DEFAULT 0 NOT NULL, + "can_child" smallint DEFAULT 0 NOT NULL, + "internal" smallint DEFAULT 0 NOT NULL, + "description" text, + "helptext" text, + "options" text, + "display_field" integer, + "display_regex" text, + "display_condition" character(3), + "display_matchtype" text, + "instance_id" integer, + "link_parent" integer, + "related_field" integer, + "width" integer DEFAULT 50 NOT NULL, + "filter" text, + "topic_id" integer, + "aggregate" character varying(45), + "group_display" character varying(45), + "lookup_endpoint" text, + "lookup_group" smallint, + "notes" text, + PRIMARY KEY ("id"), + CONSTRAINT "layout_ux_instance_name_short" UNIQUE ("instance_id", "name_short") +); +CREATE INDEX "layout_idx_display_field" on "layout" ("display_field"); +CREATE INDEX "layout_idx_instance_id" on "layout" ("instance_id"); +CREATE INDEX "layout_idx_link_parent" on "layout" ("link_parent"); +CREATE INDEX "layout_idx_related_field" on "layout" ("related_field"); +CREATE INDEX "layout_idx_topic_id" on "layout" ("topic_id"); + +; +-- +-- Table: layout_depend +-- +CREATE TABLE "layout_depend" ( + "id" serial NOT NULL, + "layout_id" integer NOT NULL, + "depends_on" integer NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "layout_depend_idx_depends_on" on "layout_depend" ("depends_on"); +CREATE INDEX "layout_depend_idx_layout_id" on "layout_depend" ("layout_id"); + +; +-- +-- Table: layout_group +-- +CREATE TABLE "layout_group" ( + "id" serial NOT NULL, + "layout_id" integer NOT NULL, + "group_id" integer NOT NULL, + "permission" character varying(45) NOT NULL, + PRIMARY KEY ("id"), + CONSTRAINT "layout_group_ux_layout_group_permission" UNIQUE ("layout_id", "group_id", "permission") +); +CREATE INDEX "layout_group_idx_group_id" on "layout_group" ("group_id"); +CREATE INDEX "layout_group_idx_layout_id" on "layout_group" ("layout_id"); +CREATE INDEX "layout_group_idx_permission" on "layout_group" ("permission"); + +; +-- +-- Table: metric +-- +CREATE TABLE "metric" ( + "id" serial NOT NULL, + "metric_group" integer NOT NULL, + "x_axis_value" text, + "target" bigint, + "y_axis_grouping_value" text, + PRIMARY KEY ("id") +); +CREATE INDEX "metric_idx_metric_group" on "metric" ("metric_group"); + +; +-- +-- Table: metric_group +-- +CREATE TABLE "metric_group" ( + "id" serial NOT NULL, + "name" text, + "instance_id" integer, + PRIMARY KEY ("id") +); +CREATE INDEX "metric_group_idx_instance_id" on "metric_group" ("instance_id"); + +; +-- +-- Table: oauthclient +-- +CREATE TABLE "oauthclient" ( + "id" bigserial NOT NULL, + "client_id" character varying(64) NOT NULL, + "client_secret" character varying(64) NOT NULL, + PRIMARY KEY ("id") +); + +; +-- +-- Table: oauthtoken +-- +CREATE TABLE "oauthtoken" ( + "token" character varying(128) NOT NULL, + "related_token" character varying(128) NOT NULL, + "oauthclient_id" integer NOT NULL, + "user_id" bigint NOT NULL, + "type" character varying(12) NOT NULL, + "expires" integer, + PRIMARY KEY ("token") +); +CREATE INDEX "oauthtoken_idx_oauthclient_id" on "oauthtoken" ("oauthclient_id"); +CREATE INDEX "oauthtoken_idx_user_id" on "oauthtoken" ("user_id"); + +; +-- +-- Table: organisation +-- +CREATE TABLE "organisation" ( + "id" serial NOT NULL, + "name" citext, + "site_id" integer, + "deleted" smallint DEFAULT 0 NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "organisation_idx_site_id" on "organisation" ("site_id"); + +; +-- +-- Table: permission +-- +CREATE TABLE "permission" ( + "id" serial NOT NULL, + "name" character varying(128) NOT NULL, + "description" text, + "order" integer, + PRIMARY KEY ("id") +); + +; +-- +-- Table: person +-- +CREATE TABLE "person" ( + "id" bigserial NOT NULL, + "record_id" bigint, + "layout_id" integer, + "child_unique" smallint DEFAULT 0 NOT NULL, + "value" bigint, + "purged_by" bigint, + "purged_on" timestamp, + PRIMARY KEY ("id") +); +CREATE INDEX "person_idx_layout_id" on "person" ("layout_id"); +CREATE INDEX "person_idx_purged_by" on "person" ("purged_by"); +CREATE INDEX "person_idx_record_id" on "person" ("record_id"); +CREATE INDEX "person_idx_value" on "person" ("value"); + +; +-- +-- Table: rag +-- +CREATE TABLE "rag" ( + "id" serial NOT NULL, + "layout_id" integer NOT NULL, + "red" text, + "amber" text, + "green" text, + "code" text, + PRIMARY KEY ("id") +); +CREATE INDEX "rag_idx_layout_id" on "rag" ("layout_id"); + +; +-- +-- Table: ragval +-- +CREATE TABLE "ragval" ( + "id" bigserial NOT NULL, + "record_id" bigint NOT NULL, + "layout_id" integer NOT NULL, + "value" character varying(16), + "purged_by" bigint, + "purged_on" timestamp, + PRIMARY KEY ("id"), + CONSTRAINT "ragval_ux_record_layout" UNIQUE ("record_id", "layout_id") +); +CREATE INDEX "ragval_idx_layout_id" on "ragval" ("layout_id"); +CREATE INDEX "ragval_idx_purged_by" on "ragval" ("purged_by"); +CREATE INDEX "ragval_idx_record_id" on "ragval" ("record_id"); +CREATE INDEX "ragval_idx_value" on "ragval" ("value"); + +; +-- +-- Table: record +-- +CREATE TABLE "record" ( + "id" bigserial NOT NULL, + "created" timestamp NOT NULL, + "current_id" bigint DEFAULT 0 NOT NULL, + "createdby" bigint, + "approvedby" bigint, + "record_id" bigint, + "approval" smallint DEFAULT 0 NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "record_idx_approvedby" on "record" ("approvedby"); +CREATE INDEX "record_idx_createdby" on "record" ("createdby"); +CREATE INDEX "record_idx_current_id" on "record" ("current_id"); +CREATE INDEX "record_idx_record_id" on "record" ("record_id"); +CREATE INDEX "record_idx_approval" on "record" ("approval"); + +; +-- +-- Table: report +-- +CREATE TABLE "report" ( + "id" bigserial NOT NULL, + "name" text NOT NULL, + "title" text, + "description" text, + "user_id" bigint, + "createdby" bigint, + "created" timestamp, + "instance_id" bigint, + "deleted" timestamp, + "security_marking" text, + PRIMARY KEY ("id") +); +CREATE INDEX "report_idx_createdby" on "report" ("createdby"); +CREATE INDEX "report_idx_instance_id" on "report" ("instance_id"); +CREATE INDEX "report_idx_user_id" on "report" ("user_id"); + +; +-- +-- Table: report_group +-- +CREATE TABLE "report_group" ( + "id" serial NOT NULL, + "report_id" integer NOT NULL, + "group_id" integer NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "report_group_idx_group_id" on "report_group" ("group_id"); +CREATE INDEX "report_group_idx_report_id" on "report_group" ("report_id"); + +; +-- +-- Table: report_layout +-- +CREATE TABLE "report_layout" ( + "id" serial NOT NULL, + "report_id" integer NOT NULL, + "layout_id" bigint NOT NULL, + "order" integer, + PRIMARY KEY ("id") +); +CREATE INDEX "report_layout_idx_layout_id" on "report_layout" ("layout_id"); +CREATE INDEX "report_layout_idx_report_id" on "report_layout" ("report_id"); + +; +-- +-- Table: site +-- +CREATE TABLE "site" ( + "id" serial NOT NULL, + "host" character varying(128), + "name" text, + "created" timestamp, + "email_welcome_text" text, + "email_welcome_subject" text, + "email_delete_text" text, + "email_delete_subject" text, + "email_reject_text" text, + "email_reject_subject" text, + "register_text" text, + "homepage_text" text, + "homepage_text2" text, + "register_title_help" text, + "register_freetext1_help" text, + "register_freetext2_help" text, + "register_email_help" text, + "register_organisation_help" text, + "register_organisation_name" text, + "register_organisation_mandatory" smallint DEFAULT 0 NOT NULL, + "register_department_help" text, + "register_department_name" text, + "register_department_mandatory" smallint DEFAULT 0 NOT NULL, + "register_team_help" text, + "register_team_name" text, + "register_team_mandatory" smallint DEFAULT 0 NOT NULL, + "register_notes_help" text, + "register_freetext1_name" text, + "register_freetext2_name" text, + "register_show_organisation" smallint DEFAULT 1 NOT NULL, + "register_show_department" smallint DEFAULT 0 NOT NULL, + "register_show_team" smallint DEFAULT 0 NOT NULL, + "register_show_title" smallint DEFAULT 1 NOT NULL, + "hide_account_request" smallint DEFAULT 0 NOT NULL, + "remember_user_location" smallint DEFAULT 1 NOT NULL, + "user_editable_fields" text, + "register_freetext1_placeholder" text, + "register_freetext2_placeholder" text, + "account_request_notes_name" text, + "account_request_notes_placeholder" text, + "security_marking" text, + "site_logo" bytea, + PRIMARY KEY ("id") +); + +; +-- +-- Table: sort +-- +CREATE TABLE "sort" ( + "id" serial NOT NULL, + "view_id" bigint NOT NULL, + "layout_id" integer, + "parent_id" integer, + "type" character varying(45), + "order" integer, + PRIMARY KEY ("id") +); +CREATE INDEX "sort_idx_layout_id" on "sort" ("layout_id"); +CREATE INDEX "sort_idx_parent_id" on "sort" ("parent_id"); +CREATE INDEX "sort_idx_view_id" on "sort" ("view_id"); + +; +-- +-- Table: string +-- +CREATE TABLE "string" ( + "id" bigserial NOT NULL, + "record_id" bigint NOT NULL, + "layout_id" integer NOT NULL, + "child_unique" smallint DEFAULT 0 NOT NULL, + "value" citext, + "value_index" character varying(128), + "purged_by" bigint, + "purged_on" timestamp, + PRIMARY KEY ("id") +); +CREATE INDEX "string_idx_layout_id" on "string" ("layout_id"); +CREATE INDEX "string_idx_purged_by" on "string" ("purged_by"); +CREATE INDEX "string_idx_record_id" on "string" ("record_id"); +CREATE INDEX "string_idx_value_index" on "string" ("value_index"); + +; +-- +-- Table: submission +-- +CREATE TABLE "submission" ( + "id" serial NOT NULL, + "token" character varying(64) NOT NULL, + "created" timestamp, + "submitted" smallint DEFAULT 0 NOT NULL, + PRIMARY KEY ("id"), + CONSTRAINT "ux_submission_token" UNIQUE ("token", "submitted") +); + +; +-- +-- Table: team +-- +CREATE TABLE "team" ( + "id" serial NOT NULL, + "name" citext, + "site_id" integer, + "deleted" smallint DEFAULT 0 NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "team_idx_site_id" on "team" ("site_id"); + +; +-- +-- Table: title +-- +CREATE TABLE "title" ( + "id" serial NOT NULL, + "name" character varying(128), + "site_id" integer, + "deleted" smallint DEFAULT 0 NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "title_idx_site_id" on "title" ("site_id"); + +; +-- +-- Table: topic +-- +CREATE TABLE "topic" ( + "id" serial NOT NULL, + "instance_id" integer, + "name" text, + "description" text, + "initial_state" character varying(32), + "click_to_edit" smallint DEFAULT 0 NOT NULL, + "prevent_edit_topic_id" integer, + PRIMARY KEY ("id") +); +CREATE INDEX "topic_idx_instance_id" on "topic" ("instance_id"); +CREATE INDEX "topic_idx_prevent_edit_topic_id" on "topic" ("prevent_edit_topic_id"); + +; +-- +-- Table: user +-- +CREATE TABLE "user" ( + "id" bigserial NOT NULL, + "site_id" integer, + "firstname" character varying(128), + "surname" character varying(128), + "email" citext, + "username" citext, + "title" integer, + "organisation" integer, + "department_id" integer, + "team_id" integer, + "freetext1" text, + "freetext2" text, + "password" character varying(128), + "pwchanged" timestamp, + "resetpw" character varying(32), + "deleted" timestamp, + "lastlogin" timestamp, + "lastfail" timestamp, + "failcount" integer DEFAULT 0 NOT NULL, + "lastrecord" bigint, + "lastview" bigint, + "session_settings" text, + "value" citext, + "account_request" smallint DEFAULT 0, + "account_request_notes" text, + "aup_accepted" timestamp, + "limit_to_view" bigint, + "stylesheet" text, + "created" timestamp, + "debug_login" smallint DEFAULT 0, + PRIMARY KEY ("id") +); +CREATE INDEX "user_idx_department_id" on "user" ("department_id"); +CREATE INDEX "user_idx_lastrecord" on "user" ("lastrecord"); +CREATE INDEX "user_idx_lastview" on "user" ("lastview"); +CREATE INDEX "user_idx_limit_to_view" on "user" ("limit_to_view"); +CREATE INDEX "user_idx_organisation" on "user" ("organisation"); +CREATE INDEX "user_idx_site_id" on "user" ("site_id"); +CREATE INDEX "user_idx_team_id" on "user" ("team_id"); +CREATE INDEX "user_idx_title" on "user" ("title"); +CREATE INDEX "user_idx_value" on "user" ("value"); +CREATE INDEX "user_idx_email" on "user" ("email"); +CREATE INDEX "user_idx_username" on "user" ("username"); + +; +-- +-- Table: user_graph +-- +CREATE TABLE "user_graph" ( + "id" bigserial NOT NULL, + "user_id" bigint NOT NULL, + "graph_id" integer NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "user_graph_idx_graph_id" on "user_graph" ("graph_id"); +CREATE INDEX "user_graph_idx_user_id" on "user_graph" ("user_id"); + +; +-- +-- Table: user_group +-- +CREATE TABLE "user_group" ( + "id" bigserial NOT NULL, + "user_id" bigint NOT NULL, + "group_id" integer NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "user_group_idx_group_id" on "user_group" ("group_id"); +CREATE INDEX "user_group_idx_user_id" on "user_group" ("user_id"); + +; +-- +-- Table: user_lastrecord +-- +CREATE TABLE "user_lastrecord" ( + "id" bigserial NOT NULL, + "record_id" bigint NOT NULL, + "instance_id" integer NOT NULL, + "user_id" bigint NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "user_lastrecord_idx_instance_id" on "user_lastrecord" ("instance_id"); +CREATE INDEX "user_lastrecord_idx_record_id" on "user_lastrecord" ("record_id"); +CREATE INDEX "user_lastrecord_idx_user_id" on "user_lastrecord" ("user_id"); + +; +-- +-- Table: user_permission +-- +CREATE TABLE "user_permission" ( + "id" bigserial NOT NULL, + "user_id" bigint NOT NULL, + "permission_id" integer NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "user_permission_idx_permission_id" on "user_permission" ("permission_id"); +CREATE INDEX "user_permission_idx_user_id" on "user_permission" ("user_id"); + +; +-- +-- Table: view +-- +CREATE TABLE "view" ( + "id" bigserial NOT NULL, + "user_id" bigint, + "group_id" integer, + "name" character varying(128), + "global" smallint DEFAULT 0 NOT NULL, + "is_admin" smallint DEFAULT 0 NOT NULL, + "is_limit_extra" smallint DEFAULT 0 NOT NULL, + "filter" text, + "instance_id" integer, + "created" timestamp, + "createdby" bigint, + PRIMARY KEY ("id") +); +CREATE INDEX "view_idx_createdby" on "view" ("createdby"); +CREATE INDEX "view_idx_group_id" on "view" ("group_id"); +CREATE INDEX "view_idx_instance_id" on "view" ("instance_id"); +CREATE INDEX "view_idx_user_id" on "view" ("user_id"); + +; +-- +-- Table: view_group +-- +CREATE TABLE "view_group" ( + "id" serial NOT NULL, + "view_id" bigint NOT NULL, + "layout_id" integer, + "parent_id" integer, + "order" integer, + PRIMARY KEY ("id") +); +CREATE INDEX "view_group_idx_layout_id" on "view_group" ("layout_id"); +CREATE INDEX "view_group_idx_parent_id" on "view_group" ("parent_id"); +CREATE INDEX "view_group_idx_view_id" on "view_group" ("view_id"); + +; +-- +-- Table: view_layout +-- +CREATE TABLE "view_layout" ( + "id" serial NOT NULL, + "view_id" bigint NOT NULL, + "layout_id" integer NOT NULL, + "order" integer, + PRIMARY KEY ("id") +); +CREATE INDEX "view_layout_idx_layout_id" on "view_layout" ("layout_id"); +CREATE INDEX "view_layout_idx_view_id" on "view_layout" ("view_id"); + +; +-- +-- Table: view_limit +-- +CREATE TABLE "view_limit" ( + "id" bigserial NOT NULL, + "view_id" bigint NOT NULL, + "user_id" bigint NOT NULL, + PRIMARY KEY ("id") +); +CREATE INDEX "view_limit_idx_user_id" on "view_limit" ("user_id"); +CREATE INDEX "view_limit_idx_view_id" on "view_limit" ("view_id"); + +; +-- +-- Table: widget +-- +CREATE TABLE "widget" ( + "id" serial NOT NULL, + "grid_id" character varying(64), + "dashboard_id" integer, + "type" character varying(16), + "title" text, + "static" smallint DEFAULT 0 NOT NULL, + "h" smallint DEFAULT 0, + "w" smallint DEFAULT 0, + "x" smallint DEFAULT 0, + "y" smallint DEFAULT 0, + "content" text, + "view_id" integer, + "graph_id" integer, + "rows" integer, + "tl_options" text, + "globe_options" text, + PRIMARY KEY ("id"), + CONSTRAINT "widget_ux_dashboard_grid" UNIQUE ("dashboard_id", "grid_id") +); +CREATE INDEX "widget_idx_dashboard_id" on "widget" ("dashboard_id"); +CREATE INDEX "widget_idx_graph_id" on "widget" ("graph_id"); +CREATE INDEX "widget_idx_view_id" on "widget" ("view_id"); + +; +-- +-- Foreign Key Definitions +-- + +; +ALTER TABLE "alert" ADD CONSTRAINT "alert_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "alert" ADD CONSTRAINT "alert_fk_view_id" FOREIGN KEY ("view_id") + REFERENCES "view" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "alert_cache" ADD CONSTRAINT "alert_cache_fk_current_id" FOREIGN KEY ("current_id") + REFERENCES "current" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "alert_cache" ADD CONSTRAINT "alert_cache_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "alert_cache" ADD CONSTRAINT "alert_cache_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "alert_cache" ADD CONSTRAINT "alert_cache_fk_view_id" FOREIGN KEY ("view_id") + REFERENCES "view" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "alert_column" ADD CONSTRAINT "alert_column_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "alert_column" ADD CONSTRAINT "alert_column_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "alert_send" ADD CONSTRAINT "alert_send_fk_alert_id" FOREIGN KEY ("alert_id") + REFERENCES "alert" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "alert_send" ADD CONSTRAINT "alert_send_fk_current_id" FOREIGN KEY ("current_id") + REFERENCES "current" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "alert_send" ADD CONSTRAINT "alert_send_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "audit" ADD CONSTRAINT "audit_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "audit" ADD CONSTRAINT "audit_fk_site_id" FOREIGN KEY ("site_id") + REFERENCES "site" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "audit" ADD CONSTRAINT "audit_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "authentication" ADD CONSTRAINT "authentication_fk_site_id" FOREIGN KEY ("site_id") + REFERENCES "site" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "calc" ADD CONSTRAINT "calc_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "calc_unique" ADD CONSTRAINT "calc_unique_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "calcval" ADD CONSTRAINT "calcval_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "calcval" ADD CONSTRAINT "calcval_fk_purged_by" FOREIGN KEY ("purged_by") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "calcval" ADD CONSTRAINT "calcval_fk_record_id" FOREIGN KEY ("record_id") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "current" ADD CONSTRAINT "current_fk_current_version_id" FOREIGN KEY ("current_version_id") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "current" ADD CONSTRAINT "current_fk_deletedby" FOREIGN KEY ("deletedby") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "current" ADD CONSTRAINT "current_fk_draftuser_id" FOREIGN KEY ("draftuser_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "current" ADD CONSTRAINT "current_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "current" ADD CONSTRAINT "current_fk_linked_id" FOREIGN KEY ("linked_id") + REFERENCES "current" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "current" ADD CONSTRAINT "current_fk_parent_id" FOREIGN KEY ("parent_id") + REFERENCES "current" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "curval" ADD CONSTRAINT "curval_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "curval" ADD CONSTRAINT "curval_fk_purged_by" FOREIGN KEY ("purged_by") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "curval" ADD CONSTRAINT "curval_fk_record_id" FOREIGN KEY ("record_id") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "curval" ADD CONSTRAINT "curval_fk_value" FOREIGN KEY ("value") + REFERENCES "current" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "curval_fields" ADD CONSTRAINT "curval_fields_fk_child_id" FOREIGN KEY ("child_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "curval_fields" ADD CONSTRAINT "curval_fields_fk_parent_id" FOREIGN KEY ("parent_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "dashboard" ADD CONSTRAINT "dashboard_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "dashboard" ADD CONSTRAINT "dashboard_fk_site_id" FOREIGN KEY ("site_id") + REFERENCES "site" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "dashboard" ADD CONSTRAINT "dashboard_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "date" ADD CONSTRAINT "date_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "date" ADD CONSTRAINT "date_fk_purged_by" FOREIGN KEY ("purged_by") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "date" ADD CONSTRAINT "date_fk_record_id" FOREIGN KEY ("record_id") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "daterange" ADD CONSTRAINT "daterange_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "daterange" ADD CONSTRAINT "daterange_fk_purged_by" FOREIGN KEY ("purged_by") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "daterange" ADD CONSTRAINT "daterange_fk_record_id" FOREIGN KEY ("record_id") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "department" ADD CONSTRAINT "department_fk_site_id" FOREIGN KEY ("site_id") + REFERENCES "site" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "display_field" ADD CONSTRAINT "display_field_fk_display_field_id" FOREIGN KEY ("display_field_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "display_field" ADD CONSTRAINT "display_field_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "enum" ADD CONSTRAINT "enum_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "enum" ADD CONSTRAINT "enum_fk_purged_by" FOREIGN KEY ("purged_by") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "enum" ADD CONSTRAINT "enum_fk_record_id" FOREIGN KEY ("record_id") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "enum" ADD CONSTRAINT "enum_fk_value" FOREIGN KEY ("value") + REFERENCES "enumval" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "enumval" ADD CONSTRAINT "enumval_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "enumval" ADD CONSTRAINT "enumval_fk_parent" FOREIGN KEY ("parent") + REFERENCES "enumval" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "export" ADD CONSTRAINT "export_fk_site_id" FOREIGN KEY ("site_id") + REFERENCES "site" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "export" ADD CONSTRAINT "export_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "file" ADD CONSTRAINT "file_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "file" ADD CONSTRAINT "file_fk_purged_by" FOREIGN KEY ("purged_by") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "file" ADD CONSTRAINT "file_fk_record_id" FOREIGN KEY ("record_id") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "file" ADD CONSTRAINT "file_fk_value" FOREIGN KEY ("value") + REFERENCES "fileval" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "file_option" ADD CONSTRAINT "file_option_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "fileval" ADD CONSTRAINT "fileval_fk_edit_user_id" FOREIGN KEY ("edit_user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "filter" ADD CONSTRAINT "filter_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "filter" ADD CONSTRAINT "filter_fk_view_id" FOREIGN KEY ("view_id") + REFERENCES "view" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "filtered_value" ADD CONSTRAINT "filtered_value_fk_current_id" FOREIGN KEY ("current_id") + REFERENCES "current" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "filtered_value" ADD CONSTRAINT "filtered_value_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "filtered_value" ADD CONSTRAINT "filtered_value_fk_submission_id" FOREIGN KEY ("submission_id") + REFERENCES "submission" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "graph" ADD CONSTRAINT "graph_fk_group_id" FOREIGN KEY ("group_id") + REFERENCES "group" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "graph" ADD CONSTRAINT "graph_fk_group_by" FOREIGN KEY ("group_by") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "graph" ADD CONSTRAINT "graph_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "graph" ADD CONSTRAINT "graph_fk_metric_group" FOREIGN KEY ("metric_group") + REFERENCES "metric_group" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "graph" ADD CONSTRAINT "graph_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "graph" ADD CONSTRAINT "graph_fk_x_axis" FOREIGN KEY ("x_axis") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "graph" ADD CONSTRAINT "graph_fk_x_axis_link" FOREIGN KEY ("x_axis_link") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "graph" ADD CONSTRAINT "graph_fk_y_axis" FOREIGN KEY ("y_axis") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "graph" ADD CONSTRAINT "graph_fk_y_axis_link" FOREIGN KEY ("y_axis_link") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "group" ADD CONSTRAINT "group_fk_site_id" FOREIGN KEY ("site_id") + REFERENCES "site" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "import" ADD CONSTRAINT "import_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "import" ADD CONSTRAINT "import_fk_site_id" FOREIGN KEY ("site_id") + REFERENCES "site" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "import" ADD CONSTRAINT "import_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "import_row" ADD CONSTRAINT "import_row_fk_import_id" FOREIGN KEY ("import_id") + REFERENCES "import" ("id") ON DELETE CASCADE ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "instance" ADD CONSTRAINT "instance_fk_api_index_layout_id" FOREIGN KEY ("api_index_layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "instance" ADD CONSTRAINT "instance_fk_default_view_limit_extra_id" FOREIGN KEY ("default_view_limit_extra_id") + REFERENCES "view" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "instance" ADD CONSTRAINT "instance_fk_site_id" FOREIGN KEY ("site_id") + REFERENCES "site" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "instance" ADD CONSTRAINT "instance_fk_sort_layout_id" FOREIGN KEY ("sort_layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "instance" ADD CONSTRAINT "instance_fk_view_limit_id" FOREIGN KEY ("view_limit_id") + REFERENCES "view" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "instance_group" ADD CONSTRAINT "instance_group_fk_group_id" FOREIGN KEY ("group_id") + REFERENCES "group" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "instance_group" ADD CONSTRAINT "instance_group_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "instance_rag" ADD CONSTRAINT "instance_rag_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "intgr" ADD CONSTRAINT "intgr_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "intgr" ADD CONSTRAINT "intgr_fk_purged_by" FOREIGN KEY ("purged_by") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "intgr" ADD CONSTRAINT "intgr_fk_record_id" FOREIGN KEY ("record_id") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "layout" ADD CONSTRAINT "layout_fk_display_field" FOREIGN KEY ("display_field") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "layout" ADD CONSTRAINT "layout_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "layout" ADD CONSTRAINT "layout_fk_link_parent" FOREIGN KEY ("link_parent") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "layout" ADD CONSTRAINT "layout_fk_related_field" FOREIGN KEY ("related_field") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "layout" ADD CONSTRAINT "layout_fk_topic_id" FOREIGN KEY ("topic_id") + REFERENCES "topic" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "layout_depend" ADD CONSTRAINT "layout_depend_fk_depends_on" FOREIGN KEY ("depends_on") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "layout_depend" ADD CONSTRAINT "layout_depend_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "layout_group" ADD CONSTRAINT "layout_group_fk_group_id" FOREIGN KEY ("group_id") + REFERENCES "group" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "layout_group" ADD CONSTRAINT "layout_group_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "metric" ADD CONSTRAINT "metric_fk_metric_group" FOREIGN KEY ("metric_group") + REFERENCES "metric_group" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "metric_group" ADD CONSTRAINT "metric_group_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "oauthtoken" ADD CONSTRAINT "oauthtoken_fk_oauthclient_id" FOREIGN KEY ("oauthclient_id") + REFERENCES "oauthclient" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "oauthtoken" ADD CONSTRAINT "oauthtoken_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "organisation" ADD CONSTRAINT "organisation_fk_site_id" FOREIGN KEY ("site_id") + REFERENCES "site" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "person" ADD CONSTRAINT "person_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "person" ADD CONSTRAINT "person_fk_purged_by" FOREIGN KEY ("purged_by") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "person" ADD CONSTRAINT "person_fk_record_id" FOREIGN KEY ("record_id") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "person" ADD CONSTRAINT "person_fk_value" FOREIGN KEY ("value") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "rag" ADD CONSTRAINT "rag_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "ragval" ADD CONSTRAINT "ragval_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "ragval" ADD CONSTRAINT "ragval_fk_purged_by" FOREIGN KEY ("purged_by") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "ragval" ADD CONSTRAINT "ragval_fk_record_id" FOREIGN KEY ("record_id") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "record" ADD CONSTRAINT "record_fk_approvedby" FOREIGN KEY ("approvedby") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "record" ADD CONSTRAINT "record_fk_createdby" FOREIGN KEY ("createdby") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "record" ADD CONSTRAINT "record_fk_current_id" FOREIGN KEY ("current_id") + REFERENCES "current" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "record" ADD CONSTRAINT "record_fk_record_id" FOREIGN KEY ("record_id") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "report" ADD CONSTRAINT "report_fk_createdby" FOREIGN KEY ("createdby") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "report" ADD CONSTRAINT "report_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "report" ADD CONSTRAINT "report_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "report_group" ADD CONSTRAINT "report_group_fk_group_id" FOREIGN KEY ("group_id") + REFERENCES "group" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "report_group" ADD CONSTRAINT "report_group_fk_report_id" FOREIGN KEY ("report_id") + REFERENCES "report" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "report_layout" ADD CONSTRAINT "report_layout_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "report_layout" ADD CONSTRAINT "report_layout_fk_report_id" FOREIGN KEY ("report_id") + REFERENCES "report" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "sort" ADD CONSTRAINT "sort_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "sort" ADD CONSTRAINT "sort_fk_parent_id" FOREIGN KEY ("parent_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "sort" ADD CONSTRAINT "sort_fk_view_id" FOREIGN KEY ("view_id") + REFERENCES "view" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "string" ADD CONSTRAINT "string_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "string" ADD CONSTRAINT "string_fk_purged_by" FOREIGN KEY ("purged_by") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "string" ADD CONSTRAINT "string_fk_record_id" FOREIGN KEY ("record_id") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "team" ADD CONSTRAINT "team_fk_site_id" FOREIGN KEY ("site_id") + REFERENCES "site" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "title" ADD CONSTRAINT "title_fk_site_id" FOREIGN KEY ("site_id") + REFERENCES "site" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "topic" ADD CONSTRAINT "topic_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "topic" ADD CONSTRAINT "topic_fk_prevent_edit_topic_id" FOREIGN KEY ("prevent_edit_topic_id") + REFERENCES "topic" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user" ADD CONSTRAINT "user_fk_department_id" FOREIGN KEY ("department_id") + REFERENCES "department" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user" ADD CONSTRAINT "user_fk_lastrecord" FOREIGN KEY ("lastrecord") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user" ADD CONSTRAINT "user_fk_lastview" FOREIGN KEY ("lastview") + REFERENCES "view" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user" ADD CONSTRAINT "user_fk_limit_to_view" FOREIGN KEY ("limit_to_view") + REFERENCES "view" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user" ADD CONSTRAINT "user_fk_organisation" FOREIGN KEY ("organisation") + REFERENCES "organisation" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user" ADD CONSTRAINT "user_fk_site_id" FOREIGN KEY ("site_id") + REFERENCES "site" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user" ADD CONSTRAINT "user_fk_team_id" FOREIGN KEY ("team_id") + REFERENCES "team" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user" ADD CONSTRAINT "user_fk_title" FOREIGN KEY ("title") + REFERENCES "title" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user_graph" ADD CONSTRAINT "user_graph_fk_graph_id" FOREIGN KEY ("graph_id") + REFERENCES "graph" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user_graph" ADD CONSTRAINT "user_graph_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user_group" ADD CONSTRAINT "user_group_fk_group_id" FOREIGN KEY ("group_id") + REFERENCES "group" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user_group" ADD CONSTRAINT "user_group_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user_lastrecord" ADD CONSTRAINT "user_lastrecord_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user_lastrecord" ADD CONSTRAINT "user_lastrecord_fk_record_id" FOREIGN KEY ("record_id") + REFERENCES "record" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user_lastrecord" ADD CONSTRAINT "user_lastrecord_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user_permission" ADD CONSTRAINT "user_permission_fk_permission_id" FOREIGN KEY ("permission_id") + REFERENCES "permission" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "user_permission" ADD CONSTRAINT "user_permission_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "view" ADD CONSTRAINT "view_fk_createdby" FOREIGN KEY ("createdby") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "view" ADD CONSTRAINT "view_fk_group_id" FOREIGN KEY ("group_id") + REFERENCES "group" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "view" ADD CONSTRAINT "view_fk_instance_id" FOREIGN KEY ("instance_id") + REFERENCES "instance" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "view" ADD CONSTRAINT "view_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "view_group" ADD CONSTRAINT "view_group_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "view_group" ADD CONSTRAINT "view_group_fk_parent_id" FOREIGN KEY ("parent_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "view_group" ADD CONSTRAINT "view_group_fk_view_id" FOREIGN KEY ("view_id") + REFERENCES "view" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "view_layout" ADD CONSTRAINT "view_layout_fk_layout_id" FOREIGN KEY ("layout_id") + REFERENCES "layout" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "view_layout" ADD CONSTRAINT "view_layout_fk_view_id" FOREIGN KEY ("view_id") + REFERENCES "view" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "view_limit" ADD CONSTRAINT "view_limit_fk_user_id" FOREIGN KEY ("user_id") + REFERENCES "user" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "view_limit" ADD CONSTRAINT "view_limit_fk_view_id" FOREIGN KEY ("view_id") + REFERENCES "view" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "widget" ADD CONSTRAINT "widget_fk_dashboard_id" FOREIGN KEY ("dashboard_id") + REFERENCES "dashboard" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "widget" ADD CONSTRAINT "widget_fk_graph_id" FOREIGN KEY ("graph_id") + REFERENCES "graph" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE "widget" ADD CONSTRAINT "widget_fk_view_id" FOREIGN KEY ("view_id") + REFERENCES "view" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; diff --git a/share/migrations/PostgreSQL/downgrade/110-109/001-auto.sql b/share/migrations/PostgreSQL/downgrade/110-109/001-auto.sql new file mode 100644 index 000000000..8b8f7272a --- /dev/null +++ b/share/migrations/PostgreSQL/downgrade/110-109/001-auto.sql @@ -0,0 +1,27 @@ +-- Convert schema '/home/abeverley/git/GADS/bin/../share/migrations/_source/deploy/110/001-auto.yml' to '/home/abeverley/git/GADS/bin/../share/migrations/_source/deploy/109/001-auto.yml':; + +; +BEGIN; + +; +ALTER TABLE current DROP CONSTRAINT current_fk_current_version_id; + +; +DROP INDEX current_idx_current_version_id; + +; +ALTER TABLE current DROP COLUMN current_version_id; + +; +ALTER TABLE graph DROP CONSTRAINT graph_fk_y_axis_link; + +; +DROP INDEX graph_idx_y_axis_link; + +; +ALTER TABLE graph DROP COLUMN y_axis_link; + +; + +COMMIT; + diff --git a/share/migrations/PostgreSQL/upgrade/109-110/001-auto.sql b/share/migrations/PostgreSQL/upgrade/109-110/001-auto.sql new file mode 100644 index 000000000..420c4e89a --- /dev/null +++ b/share/migrations/PostgreSQL/upgrade/109-110/001-auto.sql @@ -0,0 +1,29 @@ +-- Convert schema '/home/abeverley/git/GADS/bin/../share/migrations/_source/deploy/109/001-auto.yml' to '/home/abeverley/git/GADS/bin/../share/migrations/_source/deploy/110/001-auto.yml':; + +; +BEGIN; + +; +ALTER TABLE current ADD COLUMN current_version_id bigint; + +; +CREATE INDEX current_idx_current_version_id on current (current_version_id); + +; +ALTER TABLE current ADD CONSTRAINT current_fk_current_version_id FOREIGN KEY (current_version_id) + REFERENCES record (id) ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; +ALTER TABLE graph ADD COLUMN y_axis_link integer; + +; +CREATE INDEX graph_idx_y_axis_link on graph (y_axis_link); + +; +ALTER TABLE graph ADD CONSTRAINT graph_fk_y_axis_link FOREIGN KEY (y_axis_link) + REFERENCES layout (id) ON DELETE NO ACTION ON UPDATE NO ACTION DEFERRABLE; + +; + +COMMIT; + diff --git a/share/migrations/_common/upgrade/109-110/002-populate-current-versions.pl b/share/migrations/_common/upgrade/109-110/002-populate-current-versions.pl new file mode 100644 index 000000000..13c64dc5c --- /dev/null +++ b/share/migrations/_common/upgrade/109-110/002-populate-current-versions.pl @@ -0,0 +1,73 @@ +use strict; +use warnings; + +use feature 'say'; + +use DBIx::Class::Migration::RunScript; +use Log::Report; + +migrate { + my $schema = shift->schema; + # dbic_connect_attrs is ignored, so quote_names needs to be forced + $schema->storage->connect_info( + [sub {$schema->storage->dbh}, { quote_names => 1 }] + ); + + my $rec_class = $schema->class('Record'); + $rec_class->might_have( + record_later => 'Record', + sub { + my $args = shift; + return { + "$args->{foreign_alias}.current_id" => { -ident => "$args->{self_alias}.current_id" }, + -or => [ + { + "$args->{foreign_alias}.created" => { '>' => \"$args->{self_alias}.created" }, + }, + { + "$args->{foreign_alias}.created" => { '=' => \"$args->{self_alias}.created" }, + "$args->{foreign_alias}.id" => { '>' => \"$args->{self_alias}.id" }, + }, + ], + "$args->{foreign_alias}.approval" => 0, + }; + } + ); + + $schema->unregister_source('Record'); + $schema->register_class(Record => $rec_class); + + my $rs = $schema->resultset('Current')->search({ + 'records.approval' => 0, + 'record_later.current_id' => undef, + },{ + page => 1, + rows => 100, + order_by => 'me.id', + prefetch => { + records => 'record_later', + }, + }); + + my $pager = $rs->pager; + my $page = $pager->current_page; + my $last_page = $pager->last_page; + while ($page) + { + $rs = $rs->search( {}, { page => $page } ); + say "Writing record versions $page of $last_page"; + $pager->current_page($page); + foreach my $current ($rs->all) + { + my @records = $current->records; # Should only be one for latest version + @records == 1 + or error __x"Unexpected number of records for {count} for {current_id}", + count => scalar @records, current_id => $current->id; + my $latest = $records[0]->id; + $current->update({ + current_version_id => $latest, + }); + } + $page = $pager->next_page; + } +}; diff --git a/share/migrations/_source/deploy/110/001-auto-__VERSION.yml b/share/migrations/_source/deploy/110/001-auto-__VERSION.yml new file mode 100644 index 000000000..abd02b2a2 --- /dev/null +++ b/share/migrations/_source/deploy/110/001-auto-__VERSION.yml @@ -0,0 +1,92 @@ +--- +schema: + procedures: {} + tables: + dbix_class_deploymenthandler_versions: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - version + match_type: '' + name: dbix_class_deploymenthandler_versions_version + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + fields: + ddl: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: ddl + order: 3 + size: + - 0 + id: + data_type: int + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + upgrade_sql: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: upgrade_sql + order: 4 + size: + - 0 + version: + data_type: varchar + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: version + order: 2 + size: + - 50 + indices: [] + name: dbix_class_deploymenthandler_versions + options: [] + order: 1 + triggers: {} + views: {} +translator: + add_drop_table: 0 + filename: ~ + no_comments: 0 + parser_args: + sources: + - __VERSION + parser_type: SQL::Translator::Parser::DBIx::Class + producer_args: + mysql_version: 5.7 + producer_type: SQL::Translator::Producer::YAML + show_warnings: 0 + trace: 0 + version: 1.63 diff --git a/share/migrations/_source/deploy/110/001-auto.yml b/share/migrations/_source/deploy/110/001-auto.yml new file mode 100644 index 000000000..5bb3aa596 --- /dev/null +++ b/share/migrations/_source/deploy/110/001-auto.yml @@ -0,0 +1,9765 @@ +--- +schema: + procedures: {} + tables: + alert: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: alert_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - view_id + match_type: '' + name: alert_fk_view_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: view + type: FOREIGN KEY + fields: + frequency: + data_type: integer + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: frequency + order: 4 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 3 + size: + - 0 + view_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: view_id + order: 2 + size: + - 0 + indices: + - fields: + - user_id + name: alert_idx_user_id + options: [] + type: NORMAL + - fields: + - view_id + name: alert_idx_view_id + options: [] + type: NORMAL + name: alert + options: [] + order: 1 + alert_cache: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - current_id + match_type: '' + name: alert_cache_fk_current_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: current + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: alert_cache_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: alert_cache_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - view_id + match_type: '' + name: alert_cache_fk_view_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: view + type: FOREIGN KEY + fields: + current_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: current_id + order: 4 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 2 + size: + - 0 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 5 + size: + - 0 + view_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: view_id + order: 3 + size: + - 0 + indices: + - fields: + - current_id + name: alert_cache_idx_current_id + options: [] + type: NORMAL + - fields: + - layout_id + name: alert_cache_idx_layout_id + options: [] + type: NORMAL + - fields: + - user_id + name: alert_cache_idx_user_id + options: [] + type: NORMAL + - fields: + - view_id + name: alert_cache_idx_view_id + options: [] + type: NORMAL + name: alert_cache + options: [] + order: 2 + alert_column: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: alert_column_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: alert_column_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + fields: + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + instance_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: instance_id + order: 3 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 2 + size: + - 0 + indices: + - fields: + - instance_id + name: alert_column_idx_instance_id + options: [] + type: NORMAL + - fields: + - layout_id + name: alert_column_idx_layout_id + options: [] + type: NORMAL + name: alert_column + options: [] + order: 3 + alert_send: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + - alert_id + - current_id + - status + match_type: '' + name: alert_send_all + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - alert_id + match_type: '' + name: alert_send_fk_alert_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: alert + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - current_id + match_type: '' + name: alert_send_fk_current_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: current + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: alert_send_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + fields: + alert_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: alert_id + order: 3 + size: + - 0 + current_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: current_id + order: 4 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: layout_id + order: 2 + size: + - 0 + status: + data_type: char + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: status + order: 5 + size: + - 7 + indices: + - fields: + - alert_id + name: alert_send_idx_alert_id + options: [] + type: NORMAL + - fields: + - current_id + name: alert_send_idx_current_id + options: [] + type: NORMAL + - fields: + - layout_id + name: alert_send_idx_layout_id + options: [] + type: NORMAL + name: alert_send + options: [] + order: 4 + audit: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: audit_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - site_id + match_type: '' + name: audit_fk_site_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: site + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: audit_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + fields: + datetime: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: datetime + order: 5 + size: + - 0 + description: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: description + order: 8 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + instance_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: instance_id + order: 9 + size: + - 0 + method: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: method + order: 6 + size: + - 45 + site_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: site_id + order: 2 + size: + - 0 + type: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: type + order: 4 + size: + - 45 + url: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: url + order: 7 + size: + - 0 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 3 + size: + - 0 + indices: + - fields: + - instance_id + name: audit_idx_instance_id + options: [] + type: NORMAL + - fields: + - site_id + name: audit_idx_site_id + options: [] + type: NORMAL + - fields: + - user_id + name: audit_idx_user_id + options: [] + type: NORMAL + - fields: + - datetime + name: audit_idx_datetime + options: [] + type: NORMAL + - fields: + - user_id + - instance_id + - datetime + name: audit_idx_user_instance_datetime + options: [] + type: NORMAL + name: audit + options: [] + order: 5 + authentication: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - site_id + match_type: '' + name: authentication_fk_site_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: site + type: FOREIGN KEY + fields: + enabled: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: enabled + order: 8 + size: + - 0 + error_messages: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: error_messages + order: 9 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name + order: 4 + size: + - 0 + saml2_firstname: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: saml2_firstname + order: 6 + size: + - 0 + saml2_surname: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: saml2_surname + order: 7 + size: + - 0 + site_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: site_id + order: 2 + size: + - 0 + type: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: type + order: 3 + size: + - 32 + xml: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: xml + order: 5 + size: + - 0 + indices: + - fields: + - site_id + name: authentication_idx_site_id + options: [] + type: NORMAL + name: authentication + options: [] + order: 6 + calc: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: calc_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + fields: + calc: + data_type: mediumtext + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: calc + order: 3 + size: + - 0 + code: + data_type: mediumtext + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: code + order: 4 + size: + - 0 + decimal_places: + data_type: smallint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: decimal_places + order: 6 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 2 + size: + - 0 + return_format: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: return_format + order: 5 + size: + - 45 + indices: + - fields: + - layout_id + name: calc_idx_layout_id + options: [] + type: NORMAL + name: calc + options: [] + order: 7 + calc_unique: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + - value_date + match_type: '' + name: calc_unique_ux_layout_date + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - layout_id + - value_date_from + - value_date_to + match_type: '' + name: calc_unique_ux_layout_daterange + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - layout_id + - value_int + match_type: '' + name: calc_unique_ux_layout_int + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - layout_id + - value_numeric + match_type: '' + name: calc_unique_ux_layout_numeric + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - layout_id + - value_text + match_type: '' + name: calc_unique_ux_layout_text + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: calc_unique_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + fields: + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: layout_id + order: 2 + size: + - 0 + value_date: + data_type: date + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: value_date + order: 5 + size: + - 0 + value_date_from: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: value_date_from + order: 7 + size: + - 0 + value_date_to: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: value_date_to + order: 8 + size: + - 0 + value_int: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: value_int + order: 4 + size: + - 0 + value_numeric: + data_type: decimal + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: value_numeric + order: 6 + size: + - 20 + - 5 + value_text: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: value_text + order: 3 + size: + - 0 + indices: + - fields: + - layout_id + name: calc_unique_idx_layout_id + options: [] + type: NORMAL + name: calc_unique + options: [] + order: 8 + calcval: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: calcval_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - purged_by + match_type: '' + name: calcval_fk_purged_by + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - record_id + match_type: '' + name: calcval_fk_record_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + fields: + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + purged_by: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_by + order: 10 + size: + - 0 + purged_on: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_on + order: 11 + size: + - 0 + record_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: record_id + order: 2 + size: + - 0 + value_date: + data_type: date + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value_date + order: 6 + size: + - 0 + value_date_from: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value_date_from + order: 8 + size: + - 0 + value_date_to: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value_date_to + order: 9 + size: + - 0 + value_int: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value_int + order: 5 + size: + - 0 + value_numeric: + data_type: decimal + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value_numeric + order: 7 + size: + - 20 + - 5 + value_text: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value_text + order: 4 + size: + - 0 + indices: + - fields: + - layout_id + name: calcval_idx_layout_id + options: [] + type: NORMAL + - fields: + - purged_by + name: calcval_idx_purged_by + options: [] + type: NORMAL + - fields: + - record_id + name: calcval_idx_record_id + options: [] + type: NORMAL + - fields: + - name: value_text + prefix_length: 64 + name: calcval_idx_value_text + options: [] + type: NORMAL + - fields: + - value_numeric + name: calcval_idx_value_numeric + options: [] + type: NORMAL + - fields: + - value_int + name: calcval_idx_value_int + options: [] + type: NORMAL + - fields: + - value_date + name: calcval_idx_value_date + options: [] + type: NORMAL + name: calcval + options: [] + order: 9 + current: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + - serial + match_type: '' + name: current_ux_instance_serial + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - current_version_id + match_type: '' + name: current_fk_current_version_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - deletedby + match_type: '' + name: current_fk_deletedby + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - draftuser_id + match_type: '' + name: current_fk_draftuser_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: current_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - linked_id + match_type: '' + name: current_fk_linked_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: current + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - parent_id + match_type: '' + name: current_fk_parent_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: current + type: FOREIGN KEY + fields: + current_version_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: current_version_id + order: 3 + size: + - 0 + deleted: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: deleted + order: 7 + size: + - 0 + deletedby: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: deletedby + order: 8 + size: + - 0 + draftuser_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: draftuser_id + order: 9 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + instance_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: instance_id + order: 5 + size: + - 0 + linked_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: linked_id + order: 6 + size: + - 0 + parent_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: parent_id + order: 4 + size: + - 0 + serial: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: serial + order: 2 + size: + - 0 + indices: + - fields: + - current_version_id + name: current_idx_current_version_id + options: [] + type: NORMAL + - fields: + - deletedby + name: current_idx_deletedby + options: [] + type: NORMAL + - fields: + - draftuser_id + name: current_idx_draftuser_id + options: [] + type: NORMAL + - fields: + - instance_id + name: current_idx_instance_id + options: [] + type: NORMAL + - fields: + - linked_id + name: current_idx_linked_id + options: [] + type: NORMAL + - fields: + - parent_id + name: current_idx_parent_id + options: [] + type: NORMAL + name: current + options: [] + order: 10 + curval: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: curval_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - purged_by + match_type: '' + name: curval_fk_purged_by + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - record_id + match_type: '' + name: curval_fk_record_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - value + match_type: '' + name: curval_fk_value + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: current + type: FOREIGN KEY + fields: + child_unique: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: child_unique + order: 4 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + purged_by: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_by + order: 6 + size: + - 0 + purged_on: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_on + order: 7 + size: + - 0 + record_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: record_id + order: 2 + size: + - 0 + value: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value + order: 5 + size: + - 0 + indices: + - fields: + - layout_id + name: curval_idx_layout_id + options: [] + type: NORMAL + - fields: + - purged_by + name: curval_idx_purged_by + options: [] + type: NORMAL + - fields: + - record_id + name: curval_idx_record_id + options: [] + type: NORMAL + - fields: + - value + name: curval_idx_value + options: [] + type: NORMAL + name: curval + options: [] + order: 11 + curval_fields: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - child_id + match_type: '' + name: curval_fields_fk_child_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - parent_id + match_type: '' + name: curval_fields_fk_parent_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + fields: + child_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: child_id + order: 3 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + parent_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: parent_id + order: 2 + size: + - 0 + indices: + - fields: + - child_id + name: curval_fields_idx_child_id + options: [] + type: NORMAL + - fields: + - parent_id + name: curval_fields_idx_parent_id + options: [] + type: NORMAL + name: curval_fields + options: [] + order: 12 + dashboard: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: dashboard_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - site_id + match_type: '' + name: dashboard_fk_site_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: site + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: dashboard_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + fields: + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + instance_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: instance_id + order: 3 + size: + - 0 + site_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: site_id + order: 2 + size: + - 0 + user_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 4 + size: + - 0 + indices: + - fields: + - instance_id + name: dashboard_idx_instance_id + options: [] + type: NORMAL + - fields: + - site_id + name: dashboard_idx_site_id + options: [] + type: NORMAL + - fields: + - user_id + name: dashboard_idx_user_id + options: [] + type: NORMAL + name: dashboard + options: [] + order: 13 + date: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: date_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - purged_by + match_type: '' + name: date_fk_purged_by + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - record_id + match_type: '' + name: date_fk_record_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + fields: + child_unique: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: child_unique + order: 4 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + purged_by: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_by + order: 6 + size: + - 0 + purged_on: + data_type: timestamp + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_on + order: 7 + size: + - 0 + record_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: record_id + order: 2 + size: + - 0 + value: + data_type: date + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value + order: 5 + size: + - 0 + indices: + - fields: + - layout_id + name: date_idx_layout_id + options: [] + type: NORMAL + - fields: + - purged_by + name: date_idx_purged_by + options: [] + type: NORMAL + - fields: + - record_id + name: date_idx_record_id + options: [] + type: NORMAL + - fields: + - value + name: date_idx_value + options: [] + type: NORMAL + name: date + options: [] + order: 14 + daterange: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: daterange_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - purged_by + match_type: '' + name: daterange_fk_purged_by + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - record_id + match_type: '' + name: daterange_fk_record_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + fields: + child_unique: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: child_unique + order: 6 + size: + - 0 + from: + data_type: date + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: from + order: 4 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + purged_by: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_by + order: 8 + size: + - 0 + purged_on: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_on + order: 9 + size: + - 0 + record_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: record_id + order: 2 + size: + - 0 + to: + data_type: date + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: to + order: 5 + size: + - 0 + value: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value + order: 7 + size: + - 45 + indices: + - fields: + - layout_id + name: daterange_idx_layout_id + options: [] + type: NORMAL + - fields: + - purged_by + name: daterange_idx_purged_by + options: [] + type: NORMAL + - fields: + - record_id + name: daterange_idx_record_id + options: [] + type: NORMAL + - fields: + - from + name: daterange_idx_from + options: [] + type: NORMAL + - fields: + - to + name: daterange_idx_to + options: [] + type: NORMAL + - fields: + - value + name: daterange_idx_value + options: [] + type: NORMAL + name: daterange + options: [] + order: 15 + department: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - site_id + match_type: '' + name: department_fk_site_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: site + type: FOREIGN KEY + fields: + deleted: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: deleted + order: 4 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + name: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name + order: 2 + size: + - 128 + site_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: site_id + order: 3 + size: + - 0 + indices: + - fields: + - site_id + name: department_idx_site_id + options: [] + type: NORMAL + name: department + options: [] + order: 16 + display_field: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - display_field_id + match_type: '' + name: display_field_fk_display_field_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: display_field_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + fields: + display_field_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: display_field_id + order: 3 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 2 + size: + - 0 + operator: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: operator + order: 5 + size: + - 16 + regex: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: regex + order: 4 + size: + - 0 + indices: + - fields: + - display_field_id + name: display_field_idx_display_field_id + options: [] + type: NORMAL + - fields: + - layout_id + name: display_field_idx_layout_id + options: [] + type: NORMAL + name: display_field + options: [] + order: 17 + enum: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: enum_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - purged_by + match_type: '' + name: enum_fk_purged_by + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - record_id + match_type: '' + name: enum_fk_record_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - value + match_type: '' + name: enum_fk_value + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: enumval + type: FOREIGN KEY + fields: + child_unique: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: child_unique + order: 4 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + purged_by: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_by + order: 6 + size: + - 0 + purged_on: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_on + order: 7 + size: + - 0 + record_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: record_id + order: 2 + size: + - 0 + value: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value + order: 5 + size: + - 0 + indices: + - fields: + - layout_id + name: enum_idx_layout_id + options: [] + type: NORMAL + - fields: + - purged_by + name: enum_idx_purged_by + options: [] + type: NORMAL + - fields: + - record_id + name: enum_idx_record_id + options: [] + type: NORMAL + - fields: + - value + name: enum_idx_value + options: [] + type: NORMAL + name: enum + options: [] + order: 18 + enumval: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: enumval_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - parent + match_type: '' + name: enumval_fk_parent + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: enumval + type: FOREIGN KEY + fields: + deleted: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: deleted + order: 4 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + parent: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: parent + order: 5 + size: + - 0 + position: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: position + order: 6 + size: + - 0 + value: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value + order: 2 + size: + - 0 + indices: + - fields: + - layout_id + name: enumval_idx_layout_id + options: [] + type: NORMAL + - fields: + - parent + name: enumval_idx_parent + options: [] + type: NORMAL + - fields: + - name: value + prefix_length: 64 + name: enumval_idx_value + options: [] + type: NORMAL + name: enumval + options: [] + order: 19 + export: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - site_id + match_type: '' + name: export_fk_site_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: site + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: export_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + fields: + completed: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: completed + order: 6 + size: + - 0 + content: + data_type: longblob + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: content + order: 10 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + mimetype: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: mimetype + order: 9 + size: + - 0 + result: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: result + order: 7 + size: + - 0 + result_internal: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: result_internal + order: 8 + size: + - 0 + site_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: site_id + order: 2 + size: + - 0 + started: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: started + order: 5 + size: + - 0 + type: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: type + order: 4 + size: + - 45 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 3 + size: + - 0 + indices: + - fields: + - site_id + name: export_idx_site_id + options: [] + type: NORMAL + - fields: + - user_id + name: export_idx_user_id + options: [] + type: NORMAL + name: export + options: [] + order: 20 + file: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: file_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - purged_by + match_type: '' + name: file_fk_purged_by + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - record_id + match_type: '' + name: file_fk_record_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - value + match_type: '' + name: file_fk_value + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: fileval + type: FOREIGN KEY + fields: + child_unique: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: child_unique + order: 4 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + purged_by: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_by + order: 6 + size: + - 0 + purged_on: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_on + order: 7 + size: + - 0 + record_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: record_id + order: 2 + size: + - 0 + value: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value + order: 5 + size: + - 0 + indices: + - fields: + - layout_id + name: file_idx_layout_id + options: [] + type: NORMAL + - fields: + - purged_by + name: file_idx_purged_by + options: [] + type: NORMAL + - fields: + - record_id + name: file_idx_record_id + options: [] + type: NORMAL + - fields: + - value + name: file_idx_value + options: [] + type: NORMAL + name: file + options: [] + order: 21 + file_option: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: file_option_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + fields: + filesize: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: filesize + order: 3 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 2 + size: + - 0 + indices: + - fields: + - layout_id + name: file_option_idx_layout_id + options: [] + type: NORMAL + name: file_option + options: [] + order: 22 + fileval: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - edit_user_id + match_type: '' + name: fileval_fk_edit_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + fields: + edit_user_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: edit_user_id + order: 5 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + is_independent: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: is_independent + order: 4 + size: + - 0 + mimetype: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: mimetype + order: 3 + size: + - 0 + name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name + order: 2 + size: + - 0 + indices: + - fields: + - edit_user_id + name: fileval_idx_edit_user_id + options: [] + type: NORMAL + - fields: + - name: name + prefix_length: 64 + name: fileval_idx_name + options: [] + type: NORMAL + name: fileval + options: [] + order: 23 + filter: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: filter_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - view_id + match_type: '' + name: filter_fk_view_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: view + type: FOREIGN KEY + fields: + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + view_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: view_id + order: 2 + size: + - 0 + indices: + - fields: + - layout_id + name: filter_idx_layout_id + options: [] + type: NORMAL + - fields: + - view_id + name: filter_idx_view_id + options: [] + type: NORMAL + name: filter + options: [] + order: 24 + filtered_value: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - submission_id + - layout_id + - current_id + match_type: '' + name: ux_submission_layout_current + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - current_id + match_type: '' + name: filtered_value_fk_current_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: current + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: filtered_value_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - submission_id + match_type: '' + name: filtered_value_fk_submission_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: submission + type: FOREIGN KEY + fields: + current_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: current_id + order: 4 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: layout_id + order: 3 + size: + - 0 + submission_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: submission_id + order: 2 + size: + - 0 + indices: + - fields: + - current_id + name: filtered_value_idx_current_id + options: [] + type: NORMAL + - fields: + - layout_id + name: filtered_value_idx_layout_id + options: [] + type: NORMAL + - fields: + - submission_id + name: filtered_value_idx_submission_id + options: [] + type: NORMAL + name: filtered_value + options: [] + order: 25 + graph: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - group_id + match_type: '' + name: graph_fk_group_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: group + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - group_by + match_type: '' + name: graph_fk_group_by + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: graph_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - metric_group + match_type: '' + name: graph_fk_metric_group + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: metric_group + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: graph_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - x_axis + match_type: '' + name: graph_fk_x_axis + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - x_axis_link + match_type: '' + name: graph_fk_x_axis_link + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - y_axis + match_type: '' + name: graph_fk_y_axis + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - y_axis_link + match_type: '' + name: graph_fk_y_axis_link + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + fields: + as_percent: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: as_percent + order: 13 + size: + - 0 + description: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: description + order: 3 + size: + - 0 + from: + data_type: date + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: from + order: 21 + size: + - 0 + group_by: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: group_by + order: 11 + size: + - 0 + group_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: group_id + order: 19 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + instance_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: instance_id + order: 16 + size: + - 0 + is_shared: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: is_shared + order: 17 + size: + - 0 + metric_group: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: metric_group + order: 15 + size: + - 0 + stackseries: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: stackseries + order: 12 + size: + - 0 + title: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: title + order: 2 + size: + - 0 + to: + data_type: date + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: to + order: 22 + size: + - 0 + trend: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: trend + order: 20 + size: + - 45 + type: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: type + order: 14 + size: + - 45 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 18 + size: + - 0 + x_axis: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: x_axis + order: 8 + size: + - 0 + x_axis_grouping: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: x_axis_grouping + order: 10 + size: + - 45 + x_axis_link: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: x_axis_link + order: 9 + size: + - 0 + x_axis_range: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: x_axis_range + order: 23 + size: + - 45 + y_axis: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: y_axis + order: 4 + size: + - 0 + y_axis_label: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: y_axis_label + order: 7 + size: + - 0 + y_axis_link: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: y_axis_link + order: 5 + size: + - 0 + y_axis_stack: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: y_axis_stack + order: 6 + size: + - 45 + indices: + - fields: + - group_id + name: graph_idx_group_id + options: [] + type: NORMAL + - fields: + - group_by + name: graph_idx_group_by + options: [] + type: NORMAL + - fields: + - instance_id + name: graph_idx_instance_id + options: [] + type: NORMAL + - fields: + - metric_group + name: graph_idx_metric_group + options: [] + type: NORMAL + - fields: + - user_id + name: graph_idx_user_id + options: [] + type: NORMAL + - fields: + - x_axis + name: graph_idx_x_axis + options: [] + type: NORMAL + - fields: + - x_axis_link + name: graph_idx_x_axis_link + options: [] + type: NORMAL + - fields: + - y_axis + name: graph_idx_y_axis + options: [] + type: NORMAL + - fields: + - y_axis_link + name: graph_idx_y_axis_link + options: [] + type: NORMAL + name: graph + options: [] + order: 26 + graph_color: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - name + match_type: '' + name: ux_graph_color_name + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + fields: + color: + data_type: char + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: color + order: 3 + size: + - 6 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + name: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: name + order: 2 + size: + - 128 + indices: [] + name: graph_color + options: [] + order: 27 + group: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - site_id + match_type: '' + name: group_fk_site_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: site + type: FOREIGN KEY + fields: + default_approve_existing: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: default_approve_existing + order: 7 + size: + - 0 + default_approve_new: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: default_approve_new + order: 6 + size: + - 0 + default_read: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: default_read + order: 3 + size: + - 0 + default_write_existing: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: default_write_existing + order: 5 + size: + - 0 + default_write_existing_no_approval: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: default_write_existing_no_approval + order: 9 + size: + - 0 + default_write_new: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: default_write_new + order: 4 + size: + - 0 + default_write_new_no_approval: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: default_write_new_no_approval + order: 8 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + name: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name + order: 2 + size: + - 128 + site_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: site_id + order: 10 + size: + - 0 + indices: + - fields: + - site_id + name: group_idx_site_id + options: [] + type: NORMAL + name: group + options: [] + order: 28 + import: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: import_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - site_id + match_type: '' + name: import_fk_site_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: site + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: import_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + fields: + completed: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: completed + order: 8 + size: + - 0 + error_count: + data_type: integer + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: error_count + order: 10 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + instance_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: instance_id + order: 3 + size: + - 0 + result: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: result + order: 12 + size: + - 0 + row_count: + data_type: integer + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: row_count + order: 6 + size: + - 0 + site_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: site_id + order: 2 + size: + - 0 + skipped_count: + data_type: integer + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: skipped_count + order: 11 + size: + - 0 + started: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: started + order: 7 + size: + - 0 + type: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: type + order: 5 + size: + - 45 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 4 + size: + - 0 + written_count: + data_type: integer + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: written_count + order: 9 + size: + - 0 + indices: + - fields: + - instance_id + name: import_idx_instance_id + options: [] + type: NORMAL + - fields: + - site_id + name: import_idx_site_id + options: [] + type: NORMAL + - fields: + - user_id + name: import_idx_user_id + options: [] + type: NORMAL + name: import + options: [] + order: 29 + import_row: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - import_id + match_type: '' + name: import_row_fk_import_id + on_delete: CASCADE + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: import + type: FOREIGN KEY + fields: + changes: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: changes + order: 6 + size: + - 0 + content: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: content + order: 4 + size: + - 0 + errors: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: errors + order: 5 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + import_id: + data_type: int + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: import_id + order: 2 + size: + - 0 + status: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: status + order: 3 + size: + - 45 + indices: + - fields: + - import_id + name: import_row_idx_import_id + options: [] + type: NORMAL + name: import_row + options: [] + order: 30 + instance: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - api_index_layout_id + match_type: '' + name: instance_fk_api_index_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - default_view_limit_extra_id + match_type: '' + name: instance_fk_default_view_limit_extra_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: view + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - site_id + match_type: '' + name: instance_fk_site_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: site + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - sort_layout_id + match_type: '' + name: instance_fk_sort_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - view_limit_id + match_type: '' + name: instance_fk_view_limit_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: view + type: FOREIGN KEY + fields: + api_index_layout_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: api_index_layout_id + order: 14 + size: + - 0 + default_view_limit_extra_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: default_view_limit_extra_id + order: 8 + size: + - 0 + forget_history: + data_type: smallint + default_value: 0 + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: forget_history + order: 12 + size: + - 0 + forward_record_after_create: + data_type: smallint + default_value: 0 + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: forward_record_after_create + order: 15 + size: + - 0 + hide_in_selector: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: hide_in_selector + order: 19 + size: + - 0 + homepage_text: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: homepage_text + order: 9 + size: + - 0 + homepage_text2: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: homepage_text2 + order: 10 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name + order: 2 + size: + - 0 + name_short: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name_short + order: 3 + size: + - 64 + no_copy_record: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: no_copy_record + order: 18 + size: + - 0 + no_download_pdf: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: no_download_pdf + order: 17 + size: + - 0 + no_hide_blank: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: no_hide_blank + order: 16 + size: + - 0 + no_overnight_update: + data_type: smallint + default_value: 0 + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: no_overnight_update + order: 13 + size: + - 0 + record_name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: record_name + order: 11 + size: + - 0 + security_marking: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: security_marking + order: 20 + size: + - 0 + site_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: site_id + order: 4 + size: + - 0 + sort_layout_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: sort_layout_id + order: 5 + size: + - 0 + sort_type: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: sort_type + order: 6 + size: + - 45 + view_limit_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: view_limit_id + order: 7 + size: + - 0 + indices: + - fields: + - api_index_layout_id + name: instance_idx_api_index_layout_id + options: [] + type: NORMAL + - fields: + - default_view_limit_extra_id + name: instance_idx_default_view_limit_extra_id + options: [] + type: NORMAL + - fields: + - site_id + name: instance_idx_site_id + options: [] + type: NORMAL + - fields: + - sort_layout_id + name: instance_idx_sort_layout_id + options: [] + type: NORMAL + - fields: + - view_limit_id + name: instance_idx_view_limit_id + options: [] + type: NORMAL + name: instance + options: [] + order: 31 + instance_group: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + - group_id + - permission + match_type: '' + name: instance_group_ux_instance_group_permission + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - group_id + match_type: '' + name: instance_group_fk_group_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: group + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: instance_group_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + fields: + group_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: group_id + order: 3 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + instance_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: instance_id + order: 2 + size: + - 0 + permission: + data_type: varchar + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: permission + order: 4 + size: + - 45 + indices: + - fields: + - group_id + name: instance_group_idx_group_id + options: [] + type: NORMAL + - fields: + - instance_id + name: instance_group_idx_instance_id + options: [] + type: NORMAL + name: instance_group + options: [] + order: 32 + instance_rag: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + - rag + match_type: '' + name: instance_rag_ux_instance_rag + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: instance_rag_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + fields: + description: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: description + order: 5 + size: + - 0 + enabled: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: enabled + order: 4 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + instance_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: instance_id + order: 2 + size: + - 0 + rag: + data_type: varchar + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: rag + order: 3 + size: + - 16 + indices: + - fields: + - instance_id + name: instance_rag_idx_instance_id + options: [] + type: NORMAL + name: instance_rag + options: [] + order: 33 + intgr: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: intgr_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - purged_by + match_type: '' + name: intgr_fk_purged_by + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - record_id + match_type: '' + name: intgr_fk_record_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + fields: + child_unique: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: child_unique + order: 4 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + purged_by: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_by + order: 6 + size: + - 0 + purged_on: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_on + order: 7 + size: + - 0 + record_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: record_id + order: 2 + size: + - 0 + value: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value + order: 5 + size: + - 0 + indices: + - fields: + - layout_id + name: intgr_idx_layout_id + options: [] + type: NORMAL + - fields: + - purged_by + name: intgr_idx_purged_by + options: [] + type: NORMAL + - fields: + - record_id + name: intgr_idx_record_id + options: [] + type: NORMAL + - fields: + - value + name: intgr_idx_value + options: [] + type: NORMAL + name: intgr + options: [] + order: 34 + layout: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + - name_short + match_type: '' + name: layout_ux_instance_name_short + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - display_field + match_type: '' + name: layout_fk_display_field + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: layout_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - link_parent + match_type: '' + name: layout_fk_link_parent + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - related_field + match_type: '' + name: layout_fk_related_field + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - topic_id + match_type: '' + name: layout_fk_topic_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: topic + type: FOREIGN KEY + fields: + aggregate: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: aggregate + order: 31 + size: + - 45 + can_child: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: can_child + order: 16 + size: + - 0 + description: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: description + order: 18 + size: + - 0 + display_condition: + data_type: char + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: display_condition + order: 23 + size: + - 3 + display_field: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: display_field + order: 21 + size: + - 0 + display_matchtype: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: display_matchtype + order: 24 + size: + - 0 + display_regex: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: display_regex + order: 22 + size: + - 0 + end_node_only: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: end_node_only + order: 14 + size: + - 0 + filter: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: filter + order: 29 + size: + - 0 + force_regex: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: force_regex + order: 11 + size: + - 0 + group_display: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: group_display + order: 32 + size: + - 45 + helptext: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: helptext + order: 19 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + instance_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: instance_id + order: 25 + size: + - 0 + internal: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: internal + order: 17 + size: + - 0 + isunique: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: isunique + order: 8 + size: + - 0 + link_parent: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: link_parent + order: 26 + size: + - 0 + lookup_endpoint: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: lookup_endpoint + order: 33 + size: + - 0 + lookup_group: + data_type: smallint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: lookup_group + order: 34 + size: + - 0 + multivalue: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: multivalue + order: 15 + size: + - 0 + name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name + order: 2 + size: + - 0 + name_short: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: name_short + order: 3 + size: + - 64 + notes: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: notes + order: 35 + size: + - 0 + optional: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: optional + order: 6 + size: + - 0 + options: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: options + order: 20 + size: + - 0 + ordering: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: ordering + order: 13 + size: + - 45 + permission: + data_type: integer + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: permission + order: 5 + size: + - 0 + position: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: position + order: 12 + size: + - 0 + related_field: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: related_field + order: 27 + size: + - 0 + remember: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: remember + order: 7 + size: + - 0 + textbox: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: textbox + order: 9 + size: + - 0 + topic_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: topic_id + order: 30 + size: + - 0 + type: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: type + order: 4 + size: + - 45 + typeahead: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: typeahead + order: 10 + size: + - 0 + width: + data_type: integer + default_value: 50 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: width + order: 28 + size: + - 0 + indices: + - fields: + - display_field + name: layout_idx_display_field + options: [] + type: NORMAL + - fields: + - instance_id + name: layout_idx_instance_id + options: [] + type: NORMAL + - fields: + - link_parent + name: layout_idx_link_parent + options: [] + type: NORMAL + - fields: + - related_field + name: layout_idx_related_field + options: [] + type: NORMAL + - fields: + - topic_id + name: layout_idx_topic_id + options: [] + type: NORMAL + name: layout + options: [] + order: 35 + layout_depend: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - depends_on + match_type: '' + name: layout_depend_fk_depends_on + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: layout_depend_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + fields: + depends_on: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: depends_on + order: 3 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 2 + size: + - 0 + indices: + - fields: + - depends_on + name: layout_depend_idx_depends_on + options: [] + type: NORMAL + - fields: + - layout_id + name: layout_depend_idx_layout_id + options: [] + type: NORMAL + name: layout_depend + options: [] + order: 36 + layout_group: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + - group_id + - permission + match_type: '' + name: layout_group_ux_layout_group_permission + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - group_id + match_type: '' + name: layout_group_fk_group_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: group + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: layout_group_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + fields: + group_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: group_id + order: 3 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: layout_id + order: 2 + size: + - 0 + permission: + data_type: varchar + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: permission + order: 4 + size: + - 45 + indices: + - fields: + - group_id + name: layout_group_idx_group_id + options: [] + type: NORMAL + - fields: + - layout_id + name: layout_group_idx_layout_id + options: [] + type: NORMAL + - fields: + - permission + name: layout_group_idx_permission + options: [] + type: NORMAL + name: layout_group + options: [] + order: 37 + metric: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - metric_group + match_type: '' + name: metric_fk_metric_group + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: metric_group + type: FOREIGN KEY + fields: + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + metric_group: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: metric_group + order: 2 + size: + - 0 + target: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: target + order: 4 + size: + - 0 + x_axis_value: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: x_axis_value + order: 3 + size: + - 0 + y_axis_grouping_value: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: y_axis_grouping_value + order: 5 + size: + - 0 + indices: + - fields: + - metric_group + name: metric_idx_metric_group + options: [] + type: NORMAL + name: metric + options: [] + order: 38 + metric_group: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: metric_group_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + fields: + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + instance_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: instance_id + order: 3 + size: + - 0 + name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name + order: 2 + size: + - 0 + indices: + - fields: + - instance_id + name: metric_group_idx_instance_id + options: [] + type: NORMAL + name: metric_group + options: [] + order: 39 + oauthclient: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + fields: + client_id: + data_type: varchar + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: client_id + order: 2 + size: + - 64 + client_secret: + data_type: varchar + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: client_secret + order: 3 + size: + - 64 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + indices: [] + name: oauthclient + options: [] + order: 40 + oauthtoken: + constraints: + - deferrable: 1 + expression: '' + fields: + - token + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - oauthclient_id + match_type: '' + name: oauthtoken_fk_oauthclient_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: oauthclient + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: oauthtoken_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + fields: + expires: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: expires + order: 6 + size: + - 0 + oauthclient_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: oauthclient_id + order: 3 + size: + - 0 + related_token: + data_type: varchar + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: related_token + order: 2 + size: + - 128 + token: + data_type: varchar + default_value: ~ + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: token + order: 1 + size: + - 128 + type: + data_type: varchar + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: type + order: 5 + size: + - 12 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 4 + size: + - 0 + indices: + - fields: + - oauthclient_id + name: oauthtoken_idx_oauthclient_id + options: [] + type: NORMAL + - fields: + - user_id + name: oauthtoken_idx_user_id + options: [] + type: NORMAL + name: oauthtoken + options: [] + order: 41 + organisation: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - site_id + match_type: '' + name: organisation_fk_site_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: site + type: FOREIGN KEY + fields: + deleted: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: deleted + order: 4 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + name: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name + order: 2 + size: + - 128 + site_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: site_id + order: 3 + size: + - 0 + indices: + - fields: + - site_id + name: organisation_idx_site_id + options: [] + type: NORMAL + name: organisation + options: [] + order: 42 + permission: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + fields: + description: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: description + order: 3 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + name: + data_type: varchar + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: name + order: 2 + size: + - 128 + order: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: order + order: 4 + size: + - 0 + indices: [] + name: permission + options: [] + order: 43 + person: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: person_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - purged_by + match_type: '' + name: person_fk_purged_by + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - record_id + match_type: '' + name: person_fk_record_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - value + match_type: '' + name: person_fk_value + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + fields: + child_unique: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: child_unique + order: 4 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + purged_by: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_by + order: 6 + size: + - 0 + purged_on: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_on + order: 7 + size: + - 0 + record_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: record_id + order: 2 + size: + - 0 + value: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value + order: 5 + size: + - 0 + indices: + - fields: + - layout_id + name: person_idx_layout_id + options: [] + type: NORMAL + - fields: + - purged_by + name: person_idx_purged_by + options: [] + type: NORMAL + - fields: + - record_id + name: person_idx_record_id + options: [] + type: NORMAL + - fields: + - value + name: person_idx_value + options: [] + type: NORMAL + name: person + options: [] + order: 44 + rag: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: rag_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + fields: + amber: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: amber + order: 4 + size: + - 0 + code: + data_type: mediumtext + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: code + order: 6 + size: + - 0 + green: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: green + order: 5 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 2 + size: + - 0 + red: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: red + order: 3 + size: + - 0 + indices: + - fields: + - layout_id + name: rag_idx_layout_id + options: [] + type: NORMAL + name: rag + options: [] + order: 45 + ragval: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - record_id + - layout_id + match_type: '' + name: ragval_ux_record_layout + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: ragval_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - purged_by + match_type: '' + name: ragval_fk_purged_by + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - record_id + match_type: '' + name: ragval_fk_record_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + fields: + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: layout_id + order: 3 + size: + - 0 + purged_by: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_by + order: 5 + size: + - 0 + purged_on: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_on + order: 6 + size: + - 0 + record_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: record_id + order: 2 + size: + - 0 + value: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value + order: 4 + size: + - 16 + indices: + - fields: + - layout_id + name: ragval_idx_layout_id + options: [] + type: NORMAL + - fields: + - purged_by + name: ragval_idx_purged_by + options: [] + type: NORMAL + - fields: + - record_id + name: ragval_idx_record_id + options: [] + type: NORMAL + - fields: + - value + name: ragval_idx_value + options: [] + type: NORMAL + name: ragval + options: [] + order: 46 + record: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - approvedby + match_type: '' + name: record_fk_approvedby + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - createdby + match_type: '' + name: record_fk_createdby + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - current_id + match_type: '' + name: record_fk_current_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: current + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - record_id + match_type: '' + name: record_fk_record_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + fields: + approval: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: approval + order: 7 + size: + - 0 + approvedby: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: approvedby + order: 5 + size: + - 0 + created: + data_type: datetime + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: created + order: 2 + size: + - 0 + createdby: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: createdby + order: 4 + size: + - 0 + current_id: + data_type: bigint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: current_id + order: 3 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + record_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: record_id + order: 6 + size: + - 0 + indices: + - fields: + - approvedby + name: record_idx_approvedby + options: [] + type: NORMAL + - fields: + - createdby + name: record_idx_createdby + options: [] + type: NORMAL + - fields: + - current_id + name: record_idx_current_id + options: [] + type: NORMAL + - fields: + - record_id + name: record_idx_record_id + options: [] + type: NORMAL + - fields: + - approval + name: record_idx_approval + options: [] + type: NORMAL + name: record + options: [] + order: 47 + report: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - createdby + match_type: '' + name: report_fk_createdby + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: report_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: report_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + fields: + created: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: created + order: 7 + size: + - 0 + createdby: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: createdby + order: 6 + size: + - 0 + deleted: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: deleted + order: 9 + size: + - 0 + description: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: description + order: 4 + size: + - 128 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + instance_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: instance_id + order: 8 + size: + - 0 + name: + data_type: text + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: name + order: 2 + size: + - 128 + security_marking: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: security_marking + order: 10 + size: + - 0 + title: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: title + order: 3 + size: + - 0 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 5 + size: + - 0 + indices: + - fields: + - createdby + name: report_idx_createdby + options: [] + type: NORMAL + - fields: + - instance_id + name: report_idx_instance_id + options: [] + type: NORMAL + - fields: + - user_id + name: report_idx_user_id + options: [] + type: NORMAL + name: report + options: [] + order: 48 + report_group: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - group_id + match_type: '' + name: report_group_fk_group_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: group + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - report_id + match_type: '' + name: report_group_fk_report_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: report + type: FOREIGN KEY + fields: + group_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: group_id + order: 3 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + report_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: report_id + order: 2 + size: + - 0 + indices: + - fields: + - group_id + name: report_group_idx_group_id + options: [] + type: NORMAL + - fields: + - report_id + name: report_group_idx_report_id + options: [] + type: NORMAL + name: report_group + options: [] + order: 49 + report_layout: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: report_layout_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - report_id + match_type: '' + name: report_layout_fk_report_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: report + type: FOREIGN KEY + fields: + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + order: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: order + order: 4 + size: + - 0 + report_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: report_id + order: 2 + size: + - 0 + indices: + - fields: + - layout_id + name: report_layout_idx_layout_id + options: [] + type: NORMAL + - fields: + - report_id + name: report_layout_idx_report_id + options: [] + type: NORMAL + name: report_layout + options: [] + order: 50 + site: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + fields: + account_request_notes_name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: account_request_notes_name + order: 39 + size: + - 0 + account_request_notes_placeholder: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: account_request_notes_placeholder + order: 40 + size: + - 0 + created: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: created + order: 4 + size: + - 0 + email_delete_subject: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: email_delete_subject + order: 8 + size: + - 0 + email_delete_text: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: email_delete_text + order: 7 + size: + - 0 + email_reject_subject: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: email_reject_subject + order: 10 + size: + - 0 + email_reject_text: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: email_reject_text + order: 9 + size: + - 0 + email_welcome_subject: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: email_welcome_subject + order: 6 + size: + - 0 + email_welcome_text: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: email_welcome_text + order: 5 + size: + - 0 + hide_account_request: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: hide_account_request + order: 34 + size: + - 0 + homepage_text: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: homepage_text + order: 12 + size: + - 0 + homepage_text2: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: homepage_text2 + order: 13 + size: + - 0 + host: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: host + order: 2 + size: + - 128 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name + order: 3 + size: + - 0 + register_department_help: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_department_help + order: 21 + size: + - 0 + register_department_mandatory: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: register_department_mandatory + order: 23 + size: + - 0 + register_department_name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_department_name + order: 22 + size: + - 0 + register_email_help: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_email_help + order: 17 + size: + - 0 + register_freetext1_help: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_freetext1_help + order: 15 + size: + - 0 + register_freetext1_name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_freetext1_name + order: 28 + size: + - 0 + register_freetext1_placeholder: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_freetext1_placeholder + order: 37 + size: + - 0 + register_freetext2_help: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_freetext2_help + order: 16 + size: + - 0 + register_freetext2_name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_freetext2_name + order: 29 + size: + - 0 + register_freetext2_placeholder: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_freetext2_placeholder + order: 38 + size: + - 0 + register_notes_help: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_notes_help + order: 27 + size: + - 0 + register_organisation_help: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_organisation_help + order: 18 + size: + - 0 + register_organisation_mandatory: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: register_organisation_mandatory + order: 20 + size: + - 0 + register_organisation_name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_organisation_name + order: 19 + size: + - 0 + register_show_department: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: register_show_department + order: 31 + size: + - 0 + register_show_organisation: + data_type: smallint + default_value: 1 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: register_show_organisation + order: 30 + size: + - 0 + register_show_team: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: register_show_team + order: 32 + size: + - 0 + register_show_title: + data_type: smallint + default_value: 1 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: register_show_title + order: 33 + size: + - 0 + register_team_help: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_team_help + order: 24 + size: + - 0 + register_team_mandatory: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: register_team_mandatory + order: 26 + size: + - 0 + register_team_name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_team_name + order: 25 + size: + - 0 + register_text: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_text + order: 11 + size: + - 0 + register_title_help: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: register_title_help + order: 14 + size: + - 0 + remember_user_location: + data_type: smallint + default_value: 1 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: remember_user_location + order: 35 + size: + - 0 + security_marking: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: security_marking + order: 41 + size: + - 0 + site_logo: + data_type: longblob + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: site_logo + order: 42 + size: + - 0 + user_editable_fields: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: user_editable_fields + order: 36 + size: + - 0 + indices: [] + name: site + options: [] + order: 51 + sort: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: sort_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - parent_id + match_type: '' + name: sort_fk_parent_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - view_id + match_type: '' + name: sort_fk_view_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: view + type: FOREIGN KEY + fields: + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + order: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: order + order: 6 + size: + - 0 + parent_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: parent_id + order: 4 + size: + - 0 + type: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: type + order: 5 + size: + - 45 + view_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: view_id + order: 2 + size: + - 0 + indices: + - fields: + - layout_id + name: sort_idx_layout_id + options: [] + type: NORMAL + - fields: + - parent_id + name: sort_idx_parent_id + options: [] + type: NORMAL + - fields: + - view_id + name: sort_idx_view_id + options: [] + type: NORMAL + name: sort + options: [] + order: 52 + string: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: string_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - purged_by + match_type: '' + name: string_fk_purged_by + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - record_id + match_type: '' + name: string_fk_record_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + fields: + child_unique: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: child_unique + order: 4 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + purged_by: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_by + order: 7 + size: + - 0 + purged_on: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: purged_on + order: 8 + size: + - 0 + record_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: record_id + order: 2 + size: + - 0 + value: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value + order: 5 + size: + - 0 + value_index: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value_index + order: 6 + size: + - 128 + indices: + - fields: + - layout_id + name: string_idx_layout_id + options: [] + type: NORMAL + - fields: + - purged_by + name: string_idx_purged_by + options: [] + type: NORMAL + - fields: + - record_id + name: string_idx_record_id + options: [] + type: NORMAL + - fields: + - value_index + name: string_idx_value_index + options: [] + type: NORMAL + name: string + options: [] + order: 53 + submission: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - token + - submitted + match_type: '' + name: ux_submission_token + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + fields: + created: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: created + order: 3 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + submitted: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: submitted + order: 4 + size: + - 0 + token: + data_type: varchar + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 1 + name: token + order: 2 + size: + - 64 + indices: [] + name: submission + options: [] + order: 54 + team: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - site_id + match_type: '' + name: team_fk_site_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: site + type: FOREIGN KEY + fields: + deleted: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: deleted + order: 4 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + name: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name + order: 2 + size: + - 128 + site_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: site_id + order: 3 + size: + - 0 + indices: + - fields: + - site_id + name: team_idx_site_id + options: [] + type: NORMAL + name: team + options: [] + order: 55 + title: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - site_id + match_type: '' + name: title_fk_site_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: site + type: FOREIGN KEY + fields: + deleted: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: deleted + order: 4 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + name: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name + order: 2 + size: + - 128 + site_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: site_id + order: 3 + size: + - 0 + indices: + - fields: + - site_id + name: title_idx_site_id + options: [] + type: NORMAL + name: title + options: [] + order: 56 + topic: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: topic_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - prevent_edit_topic_id + match_type: '' + name: topic_fk_prevent_edit_topic_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: topic + type: FOREIGN KEY + fields: + click_to_edit: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: click_to_edit + order: 6 + size: + - 0 + description: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: description + order: 4 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + initial_state: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: initial_state + order: 5 + size: + - 32 + instance_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: instance_id + order: 2 + size: + - 0 + name: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name + order: 3 + size: + - 0 + prevent_edit_topic_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: prevent_edit_topic_id + order: 7 + size: + - 0 + indices: + - fields: + - instance_id + name: topic_idx_instance_id + options: [] + type: NORMAL + - fields: + - prevent_edit_topic_id + name: topic_idx_prevent_edit_topic_id + options: [] + type: NORMAL + name: topic + options: [] + order: 57 + user: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - department_id + match_type: '' + name: user_fk_department_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: department + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - lastrecord + match_type: '' + name: user_fk_lastrecord + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - lastview + match_type: '' + name: user_fk_lastview + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: view + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - limit_to_view + match_type: '' + name: user_fk_limit_to_view + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: view + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - organisation + match_type: '' + name: user_fk_organisation + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: organisation + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - site_id + match_type: '' + name: user_fk_site_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: site + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - team_id + match_type: '' + name: user_fk_team_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: team + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - title + match_type: '' + name: user_fk_title + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: title + type: FOREIGN KEY + fields: + account_request: + data_type: smallint + default_value: 0 + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: account_request + order: 24 + size: + - 0 + account_request_notes: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: account_request_notes + order: 25 + size: + - 0 + aup_accepted: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: aup_accepted + order: 26 + size: + - 0 + created: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: created + order: 29 + size: + - 0 + debug_login: + data_type: smallint + default_value: 0 + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: debug_login + order: 30 + size: + - 0 + deleted: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: deleted + order: 16 + size: + - 0 + department_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: department_id + order: 9 + size: + - 0 + email: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: email + order: 5 + size: + - 0 + failcount: + data_type: integer + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: failcount + order: 19 + size: + - 0 + firstname: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: firstname + order: 3 + size: + - 128 + freetext1: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: freetext1 + order: 11 + size: + - 0 + freetext2: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: freetext2 + order: 12 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + lastfail: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: lastfail + order: 18 + size: + - 0 + lastlogin: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: lastlogin + order: 17 + size: + - 0 + lastrecord: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: lastrecord + order: 20 + size: + - 0 + lastview: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: lastview + order: 21 + size: + - 0 + limit_to_view: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: limit_to_view + order: 27 + size: + - 0 + organisation: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: organisation + order: 8 + size: + - 0 + password: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: password + order: 13 + size: + - 128 + pwchanged: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: pwchanged + order: 14 + size: + - 0 + resetpw: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: resetpw + order: 15 + size: + - 32 + session_settings: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: session_settings + order: 22 + size: + - 0 + site_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: site_id + order: 2 + size: + - 0 + stylesheet: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: stylesheet + order: 28 + size: + - 0 + surname: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: surname + order: 4 + size: + - 128 + team_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: team_id + order: 10 + size: + - 0 + title: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: title + order: 7 + size: + - 0 + username: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: username + order: 6 + size: + - 0 + value: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: value + order: 23 + size: + - 0 + indices: + - fields: + - department_id + name: user_idx_department_id + options: [] + type: NORMAL + - fields: + - lastrecord + name: user_idx_lastrecord + options: [] + type: NORMAL + - fields: + - lastview + name: user_idx_lastview + options: [] + type: NORMAL + - fields: + - limit_to_view + name: user_idx_limit_to_view + options: [] + type: NORMAL + - fields: + - organisation + name: user_idx_organisation + options: [] + type: NORMAL + - fields: + - site_id + name: user_idx_site_id + options: [] + type: NORMAL + - fields: + - team_id + name: user_idx_team_id + options: [] + type: NORMAL + - fields: + - title + name: user_idx_title + options: [] + type: NORMAL + - fields: + - name: value + prefix_length: 64 + name: user_idx_value + options: [] + type: NORMAL + - fields: + - name: email + prefix_length: 64 + name: user_idx_email + options: [] + type: NORMAL + - fields: + - name: username + prefix_length: 64 + name: user_idx_username + options: [] + type: NORMAL + name: user + options: [] + order: 58 + user_graph: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - graph_id + match_type: '' + name: user_graph_fk_graph_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: graph + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: user_graph_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + fields: + graph_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: graph_id + order: 3 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 2 + size: + - 0 + indices: + - fields: + - graph_id + name: user_graph_idx_graph_id + options: [] + type: NORMAL + - fields: + - user_id + name: user_graph_idx_user_id + options: [] + type: NORMAL + name: user_graph + options: [] + order: 59 + user_group: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - group_id + match_type: '' + name: user_group_fk_group_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: group + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: user_group_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + fields: + group_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: group_id + order: 3 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 2 + size: + - 0 + indices: + - fields: + - group_id + name: user_group_idx_group_id + options: [] + type: NORMAL + - fields: + - user_id + name: user_group_idx_user_id + options: [] + type: NORMAL + name: user_group + options: [] + order: 60 + user_lastrecord: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: user_lastrecord_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - record_id + match_type: '' + name: user_lastrecord_fk_record_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: record + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: user_lastrecord_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + fields: + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + instance_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: instance_id + order: 3 + size: + - 0 + record_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: record_id + order: 2 + size: + - 0 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 4 + size: + - 0 + indices: + - fields: + - instance_id + name: user_lastrecord_idx_instance_id + options: [] + type: NORMAL + - fields: + - record_id + name: user_lastrecord_idx_record_id + options: [] + type: NORMAL + - fields: + - user_id + name: user_lastrecord_idx_user_id + options: [] + type: NORMAL + name: user_lastrecord + options: [] + order: 61 + user_permission: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - permission_id + match_type: '' + name: user_permission_fk_permission_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: permission + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: user_permission_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + fields: + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + permission_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: permission_id + order: 3 + size: + - 0 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 2 + size: + - 0 + indices: + - fields: + - permission_id + name: user_permission_idx_permission_id + options: [] + type: NORMAL + - fields: + - user_id + name: user_permission_idx_user_id + options: [] + type: NORMAL + name: user_permission + options: [] + order: 62 + view: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - createdby + match_type: '' + name: view_fk_createdby + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - group_id + match_type: '' + name: view_fk_group_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: group + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - instance_id + match_type: '' + name: view_fk_instance_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: instance + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: view_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + fields: + created: + data_type: datetime + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: created + order: 10 + size: + - 0 + createdby: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: createdby + order: 11 + size: + - 0 + filter: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: filter + order: 8 + size: + - 0 + global: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: global + order: 5 + size: + - 0 + group_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: group_id + order: 3 + size: + - 0 + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + instance_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: instance_id + order: 9 + size: + - 0 + is_admin: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: is_admin + order: 6 + size: + - 0 + is_limit_extra: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: is_limit_extra + order: 7 + size: + - 0 + name: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: name + order: 4 + size: + - 128 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 2 + size: + - 0 + indices: + - fields: + - createdby + name: view_idx_createdby + options: [] + type: NORMAL + - fields: + - group_id + name: view_idx_group_id + options: [] + type: NORMAL + - fields: + - instance_id + name: view_idx_instance_id + options: [] + type: NORMAL + - fields: + - user_id + name: view_idx_user_id + options: [] + type: NORMAL + name: view + options: [] + order: 63 + view_group: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: view_group_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - parent_id + match_type: '' + name: view_group_fk_parent_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - view_id + match_type: '' + name: view_group_fk_view_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: view + type: FOREIGN KEY + fields: + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + order: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: order + order: 5 + size: + - 0 + parent_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: parent_id + order: 4 + size: + - 0 + view_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: view_id + order: 2 + size: + - 0 + indices: + - fields: + - layout_id + name: view_group_idx_layout_id + options: [] + type: NORMAL + - fields: + - parent_id + name: view_group_idx_parent_id + options: [] + type: NORMAL + - fields: + - view_id + name: view_group_idx_view_id + options: [] + type: NORMAL + name: view_group + options: [] + order: 64 + view_layout: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - layout_id + match_type: '' + name: view_layout_fk_layout_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: layout + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - view_id + match_type: '' + name: view_layout_fk_view_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: view + type: FOREIGN KEY + fields: + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + layout_id: + data_type: integer + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: layout_id + order: 3 + size: + - 0 + order: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: order + order: 4 + size: + - 0 + view_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: view_id + order: 2 + size: + - 0 + indices: + - fields: + - layout_id + name: view_layout_idx_layout_id + options: [] + type: NORMAL + - fields: + - view_id + name: view_layout_idx_view_id + options: [] + type: NORMAL + name: view_layout + options: [] + order: 65 + view_limit: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - user_id + match_type: '' + name: view_limit_fk_user_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: user + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - view_id + match_type: '' + name: view_limit_fk_view_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: view + type: FOREIGN KEY + fields: + id: + data_type: bigint + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + user_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: user_id + order: 3 + size: + - 0 + view_id: + data_type: bigint + default_value: ~ + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: view_id + order: 2 + size: + - 0 + indices: + - fields: + - user_id + name: view_limit_idx_user_id + options: [] + type: NORMAL + - fields: + - view_id + name: view_limit_idx_view_id + options: [] + type: NORMAL + name: view_limit + options: [] + order: 66 + widget: + constraints: + - deferrable: 1 + expression: '' + fields: + - id + match_type: '' + name: '' + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: PRIMARY KEY + - deferrable: 1 + expression: '' + fields: + - dashboard_id + - grid_id + match_type: '' + name: widget_ux_dashboard_grid + on_delete: '' + on_update: '' + options: [] + reference_fields: [] + reference_table: '' + type: UNIQUE + - deferrable: 1 + expression: '' + fields: + - dashboard_id + match_type: '' + name: widget_fk_dashboard_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: dashboard + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - graph_id + match_type: '' + name: widget_fk_graph_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: graph + type: FOREIGN KEY + - deferrable: 1 + expression: '' + fields: + - view_id + match_type: '' + name: widget_fk_view_id + on_delete: NO ACTION + on_update: NO ACTION + options: [] + reference_fields: + - id + reference_table: view + type: FOREIGN KEY + fields: + content: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: content + order: 11 + size: + - 0 + dashboard_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: dashboard_id + order: 3 + size: + - 0 + globe_options: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: globe_options + order: 16 + size: + - 0 + graph_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: graph_id + order: 13 + size: + - 0 + grid_id: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 1 + name: grid_id + order: 2 + size: + - 64 + h: + data_type: smallint + default_value: 0 + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: h + order: 7 + size: + - 0 + id: + data_type: integer + default_value: ~ + is_auto_increment: 1 + is_nullable: 0 + is_primary_key: 1 + is_unique: 0 + name: id + order: 1 + size: + - 0 + rows: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: rows + order: 14 + size: + - 0 + static: + data_type: smallint + default_value: 0 + is_nullable: 0 + is_primary_key: 0 + is_unique: 0 + name: static + order: 6 + size: + - 0 + title: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: title + order: 5 + size: + - 0 + tl_options: + data_type: text + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: tl_options + order: 15 + size: + - 0 + type: + data_type: varchar + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: type + order: 4 + size: + - 16 + view_id: + data_type: integer + default_value: ~ + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: view_id + order: 12 + size: + - 0 + w: + data_type: smallint + default_value: 0 + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: w + order: 8 + size: + - 0 + x: + data_type: smallint + default_value: 0 + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: x + order: 9 + size: + - 0 + y: + data_type: smallint + default_value: 0 + is_nullable: 1 + is_primary_key: 0 + is_unique: 0 + name: y + order: 10 + size: + - 0 + indices: + - fields: + - dashboard_id + name: widget_idx_dashboard_id + options: [] + type: NORMAL + - fields: + - graph_id + name: widget_idx_graph_id + options: [] + type: NORMAL + - fields: + - view_id + name: widget_idx_view_id + options: [] + type: NORMAL + name: widget + options: [] + order: 67 + triggers: {} + views: {} +translator: + add_drop_table: 0 + filename: ~ + no_comments: 0 + parser_args: + sources: + - Alert + - AlertCache + - AlertColumn + - AlertSend + - Audit + - Authentication + - Calc + - CalcUnique + - Calcval + - Changed + - Current + - Curval + - CurvalField + - Dashboard + - Date + - Daterange + - Department + - DisplayField + - Enum + - Enumval + - Export + - File + - FileOption + - Fileval + - Filter + - FilteredValue + - Graph + - GraphColor + - Group + - Import + - ImportRow + - Instance + - InstanceGroup + - InstanceRag + - Intgr + - Layout + - LayoutDepend + - LayoutGroup + - Metric + - MetricGroup + - Oauthclient + - Oauthtoken + - Organisation + - Permission + - Person + - Rag + - Ragval + - Record + - Report + - ReportGroup + - ReportLayout + - Site + - Sort + - String + - Submission + - Team + - Title + - Topic + - User + - UserGraph + - UserGroup + - UserLastrecord + - UserPermission + - View + - ViewGroup + - ViewLayout + - ViewLimit + - Widget + parser_type: SQL::Translator::Parser::DBIx::Class + producer_args: + mysql_version: 5.7 + producer_type: SQL::Translator::Producer::YAML + show_warnings: 0 + trace: 0 + version: 1.63 diff --git a/t/003_search.t b/t/003_search.t index 29ceeb3c0..1b1684d69 100644 --- a/t/003_search.t +++ b/t/003_search.t @@ -116,7 +116,7 @@ my $calc_int = GADS::Column::Calc->new( layout => $layout, name => 'calc_int', return_type => 'integer', - code => "function evaluate (L1integer1) return L1integer1 end", + code => "function evaluate (L1integer1) return L1integer1[1] end", set_permissions => { $sheet->group->id => $sheet->default_permissions, }, diff --git a/t/004_aggregate.t b/t/004_aggregate.t index fe4caf9e8..dfcefa1c2 100644 --- a/t/004_aggregate.t +++ b/t/004_aggregate.t @@ -38,7 +38,7 @@ my $data = [ my $sheet = Test::GADS::DataSheet->new( data => $data, multivalue => 1, - calc_code => "function evaluate (L1integer1, L1integer2) \n return (L1integer1 / L1integer2) * 100 \n end", + calc_code => "function evaluate (L1integer1, L1integer2) \n return (L1integer1[1] / L1integer2[1]) * 100 \n end", column_count => { integer => 2 }, ); my $schema = $sheet->schema; diff --git a/t/004_group.t b/t/004_group.t index 9b200e450..4813046c0 100644 --- a/t/004_group.t +++ b/t/004_group.t @@ -80,13 +80,16 @@ foreach my $multivalue (0..1) }, ]; - my $curval_sheet = Test::GADS::DataSheet->new(instance_id => 2, user_permission_override => 0); + my $curval_sheet = Test::GADS::DataSheet->new(instance_id => 2, user_permission_override => 0, multivalue => $multivalue); $curval_sheet->create_records; my $schema = $curval_sheet->schema; + my $calc_code = $multivalue + ? "function evaluate (L1integer1) \n return L1integer1[1] * 2 \n end" + : "function evaluate (L1integer1) \n return L1integer1 * 2 \n end"; my $sheet = Test::GADS::DataSheet->new( data => $data, - calc_code => "function evaluate (L1integer1) \n return L1integer1 * 2 \n end", + calc_code => $calc_code, schema => $schema, curval => 2, curval_field_ids => [$curval_sheet->columns->{string1}->id], @@ -131,8 +134,9 @@ foreach my $multivalue (0..1) ); $view->set_groups([$string1->id]); # Also add a sort, to check that doesn't result in unwanted multi-value - # field joins - $view->set_sorts({fields => [$enum1->id], types => ['asc']}); + # field joins (needs to be a sort that has an actual value, not a unique + # count) + $view->set_sorts({fields => [$integer1->id], types => ['asc']}); $view->write; my $records = GADS::Records->new( @@ -162,9 +166,10 @@ foreach my $multivalue (0..1) # Remove grouped column from view and check still gets added as required $view->columns([$integer1->id]); + $view->set_sorts({fields => [$string1->id], types => ['asc']}); $view->write; - @expected = (@$expected); + @expected = sort { $a->{string1} cmp $b->{string1} } @$expected; $records->clear; $records = GADS::Records->new( view => $view, @@ -195,6 +200,7 @@ foreach my $multivalue (0..1) user => $sheet->user, ); $view->set_groups([$col->id]); + $view->set_sorts({fields => [$col->id], types => ['asc']}); $view->write; $records = GADS::Records->new( @@ -204,6 +210,7 @@ foreach my $multivalue (0..1) schema => $schema, ); + # We expect the first value in ascending order of that column my $expected = { string1 => 'foo1', integer1 => 25, @@ -212,7 +219,7 @@ foreach my $multivalue (0..1) date1 => '2008-10-10', rag1 => 'b_red', calc1 => 50, - curval1 => 'Foo', + curval1 => 'Bar', daterange1 => '2000-01-02 to 2001-03-03', person1 => 'User1, User1', }; @@ -296,6 +303,7 @@ foreach my $multivalue (0..1) schema => $schema, user => $sheet->user, ); + $view->set_sorts({fields => [$columns->{curval1}->id."_".$curval_sheet->columns->{string1}->id], types => ['desc']}); $view->set_groups([$columns->{curval1}->id."_".$curval_sheet->columns->{string1}->id]); $view->write; @@ -305,7 +313,38 @@ foreach my $multivalue (0..1) user => $sheet->user, schema => $schema, ); + @results = @{$records->results}; + is(@results, 2, "Correct number of rows for group by curval subfield"); + is($results[0]->fields->{$integer1->id}, '75', "Group by curval subfield first result correct"); + is($results[1]->fields->{$integer1->id}, '130', "Group by curval subfield second result correct"); + # Try also sorting directly on the Records object + # First with invalid subfield without parent - should error + $records = GADS::Records->new( + sort => { + type => 'desc', + id => $curval_sheet->columns->{string1}->id, + }, + view => $view, + layout => $layout, + user => $sheet->user, + schema => $schema, + ); + try { $records->results }; + like($@, qr/from different table without parent/, "Error when using subfield without parent"); + + # Then with correct parent + $records = GADS::Records->new( + sort => { + type => 'desc', + id => $curval_sheet->columns->{string1}->id, + parent_id => $columns->{curval1}->id, + }, + view => $view, + layout => $layout, + user => $sheet->user, + schema => $schema, + ); @results = @{$records->results}; is(@results, 2, "Correct number of rows for group by curval subfield"); is($results[0]->fields->{$integer1->id}, '75', "Group by curval subfield first result correct"); @@ -400,6 +439,7 @@ foreach my $multivalue (0..1) user => $sheet->user, ); $view->set_groups([$string1->id]); + $view->set_sorts({fields => [$string1->id], types => ['asc']}); $view->write; my $records = GADS::Records->new( @@ -499,7 +539,7 @@ foreach my $multivalue (0..1) my $sheet = Test::GADS::DataSheet->new( data => $data, multivalue => 1, - calc_code => "function evaluate (L1integer1, L1integer2) \n return (L1integer1 / L1integer2) * 100 \n end", + calc_code => "function evaluate (L1integer1, L1integer2) \n return (L1integer1[1] / L1integer2[1]) * 100 \n end", column_count => { integer => 2 }, ); my $schema = $sheet->schema; @@ -528,6 +568,7 @@ foreach my $multivalue (0..1) user => $sheet->user, ); $view->set_groups([$string1->id]); + $view->set_sorts({fields => [$string1->id], types => ['asc']}); $view->write; my $records = GADS::Records->new( diff --git a/t/012_graph_historical.t b/t/012_graph_historical.t index 61e796cd2..fc99f0fd4 100644 --- a/t/012_graph_historical.t +++ b/t/012_graph_historical.t @@ -16,312 +16,404 @@ use Test::GADS::DataSheet; set_fixed_time('06/14/2019 01:00:00', '%m/%d/%Y %H:%M:%S'); -my @records = ( - [ - { - created => '2018-02-01T11:00', - data => { - enum1 => 1, - integer1 => 12, - } - }, - { - created => '2018-10-01T12:00', - data => { - enum1 => 2, - integer1 => 1, - } - }, - { - created => '2019-03-15T18:00', - data => { - enum1 => 3, - integer1 => 4, - } - }, +foreach my $multivalue (0, 1) +{ + my @records = ( + [ + { + created => '2018-02-01T11:00', + data => { + enum1 => 7, + integer1 => 12, + curval_int => 110, + } + }, + { + created => '2018-10-01T12:00', + data => { + enum1 => 8, + integer1 => 1, + curval_int => 125, + } + }, + { + created => '2019-03-15T18:00', + data => { + enum1 => 9, + integer1 => 4, + curval_int => 155, + } + }, + { + created => '2019-06-14T01:00', + data => { + enum1 => 8, + integer1 => 10, + curval_int => 140, + } + }, + ], + [ + { + created => '2018-06-20T20:00', + data => { + enum1 => 8, + integer1 => 23, + curval_int => 280, + } + }, + { + created => '2018-07-31T00:00', + data => { + enum1 => 9, + integer1 => 5, + curval_int => 220, + } + }, + { + created => '2018-11-12T23:59', + data => { + enum1 => 7, + integer1 => 7, + curval_int => 245, + } + }, + { + created => '2019-04-01T14:50', + data => { + enum1 => 7, + integer1 => 19, + curval_int => 265, + } + }, + ], + [ + { + created => '2017-05-13T16:00', + data => { + enum1 => 9, + integer1 => 1, + curval_int => 310, + } + }, + { + created => '2018-10-01T19:00', + data => { + enum1 => 7, + integer1 => 0, + curval_int => 330, + } + }, + { + created => '2019-06-02T22:00', + data => { + enum1 => 9, + integer1 => 54, + curval_int => 365, + } + }, + { + created => '2019-06-02T23:00', + data => { + enum1 => 7, + integer1 => 37, + curval_int => 380, + } + }, + ], + ); + + my $curval_sheet = Test::GADS::DataSheet->new(instance_id => 2, multivalue => $multivalue, data => []); + $curval_sheet->create_records; + my $schema = $curval_sheet->schema; + + my $sheet = Test::GADS::DataSheet->new( + data => [], + schema => $schema, + multivalue => $multivalue, + curval => 2, + curval_field_ids => [ $curval_sheet->columns->{string1}->id ], + ); + my $layout = $sheet->layout; + my $columns = $sheet->columns; + $sheet->create_records; + + my $curval = $columns->{curval1}; + $curval->show_add(1); + $curval->value_selector('noshow'); + $curval->write(no_alerts => 1);#, force => 1); + my $curval_int = $curval_sheet->columns->{integer1}; + + foreach my $rec (@records) + { + my $record = GADS::Record->new( + user => $sheet->user, + layout => $layout, + schema => $schema, + ); + $record->initialise; + foreach my $version (@$rec) { - created => '2019-06-14T01:00', - data => { - enum1 => 2, - integer1 => 10, - } - }, - ], - [ + my $created = DateTime::Format::ISO8601->parse_datetime($version->{created}); + my $data = $version->{data}; + + my $curval_datum = $record->fields->{$curval->id}; + my ($cid) = @{$curval_datum->ids}; + + my $curval_record = GADS::Record->new( + user => $sheet->user, + layout => $curval_sheet->layout, + schema => $schema, + ); + $cid ? $curval_record->find_current_id($cid) : $curval_record->initialise; + $curval_record->fields->{$curval_int->id}->set_value($data->{curval_int}); + $curval_record->write(version_datetime => $created, no_alerts => 1); + + $record->fields->{$columns->{enum1}->id}->set_value($data->{enum1}); + $record->fields->{$columns->{integer1}->id}->set_value($data->{integer1}); + $record->fields->{$curval->id}->set_value([$curval_record->current_id]); + $record->write(version_datetime => $created, no_alerts => 1); + } + } + + my $crs = $schema->resultset('Current')->search({ instance_id => 1 }); + is($crs->count, 3, "Correct number of records created"); + is($crs->search({},{ join => 'records' })->count, 12, "Correct number of versions created"); + + my $graphs = [ { - created => '2018-06-20T20:00', - data => { - enum1 => 2, - integer1 => 23, - } + name => 'String x-axis with count - standard 12 month range', + type => 'bar', + x_axis => $columns->{enum1}->id, + x_axis_range => '-12', + y_axis_stack => 'count', + labels => [qw/foo3 foo2 foo1/], + data => [ + [1,2,2,2,1,0,0,0,0,1,1,1,0], + [1,0,0,0,1,1,1,1,1,0,0,0,1], + [1,1,1,1,1,2,2,2,2,2,2,2,2], + ], + xlabels => [ + 'June 2018', 'July 2018', 'August 2018', 'September 2018', + 'October 2018', 'November 2018', 'December 2018', 'January 2019', + 'February 2019', 'March 2019', 'April 2019', 'May 2019', 'June 2019' + ], }, { - created => '2018-07-31T00:00', - data => { - enum1 => 3, - integer1 => 5, - } + name => 'Including quick search', + type => 'bar', + x_axis => $columns->{enum1}->id, + x_axis_range => '-12', + y_axis_stack => 'count', + labels => [qw/foo3 foo2 foo1/], + search => 'foo2', + data => [ + [0,0,0,0,0,0,0,0,0,1,1,1,0], + [0,0,0,0,1,1,1,1,1,0,0,0,1], + [1,1,1,1,0,0,0,0,0,0,0,0,0], + ], + xlabels => [ + 'June 2018', 'July 2018', 'August 2018', 'September 2018', + 'October 2018', 'November 2018', 'December 2018', 'January 2019', + 'February 2019', 'March 2019', 'April 2019', 'May 2019', 'June 2019' + ], }, { - created => '2018-11-12T23:59', - data => { - enum1 => 1, - integer1 => 7, - } + name => 'Quick search with curval value', + type => 'bar', + x_axis => $columns->{enum1}->id, + x_axis_range => '-12', + y_axis => $curval_int->id, + y_axis_link => $curval->id, + y_axis_stack => 'sum', + labels => [qw/foo3 foo2 foo1/], + search => 'foo1', + data => [ + [310,530,530,530,220,0,0,0,0,0,0,0,0], + [280,0,0,0,0,0,0,0,0,0,0,0,0], + [0,0,0,0,330,575,575,575,575,575,595,595,645], + ], + xlabels => [ + 'June 2018', 'July 2018', 'August 2018', 'September 2018', + 'October 2018', 'November 2018', 'December 2018', 'January 2019', + 'February 2019', 'March 2019', 'April 2019', 'May 2019', 'June 2019' + ], }, { - created => '2019-04-01T14:50', - data => { - enum1 => 1, - integer1 => 19, - } + name => 'Including filter', # Should use same record IDs for each period + type => 'bar', + x_axis => $columns->{enum1}->id, + x_axis_range => '-12', + y_axis_stack => 'count', + labels => [qw/foo3 foo2 foo1/], + view => { + column => $columns->{integer1}->id, + value => '10', + }, + data => [ + [0,0,0,0,0,0,0,0,0,1,1,1,0], + [0,0,0,0,1,1,1,1,1,0,0,0,1], + [1,1,1,1,0,0,0,0,0,0,0,0,0], + ], + xlabels => [ + 'June 2018', 'July 2018', 'August 2018', 'September 2018', + 'October 2018', 'November 2018', 'December 2018', 'January 2019', + 'February 2019', 'March 2019', 'April 2019', 'May 2019', 'June 2019' + ], }, - ], - [ { - created => '2017-05-13T16:00', - data => { - enum1 => 3, - integer1 => 1, - } + name => 'Curval values with filter', # Should use same record IDs for each period + type => 'bar', + x_axis => $columns->{enum1}->id, + x_axis_range => '-12', + y_axis => $curval_int->id, + y_axis_link => $curval->id, + y_axis_stack => 'sum', + labels => [qw/foo3 foo2 foo1/], + view => { + column => $columns->{integer1}->id, + value => '10', + operator => 'greater', + }, + data => [ + [310,530,530,530,220,0,0,0,0,0,0,0,0], + [280,0,0,0,0,0,0,0,0,0,0,0,0], + [0,0,0,0,330,575,575,575,575,575,595,595,645], + ], + xlabels => [ + 'June 2018', 'July 2018', 'August 2018', 'September 2018', + 'October 2018', 'November 2018', 'December 2018', 'January 2019', + 'February 2019', 'March 2019', 'April 2019', 'May 2019', 'June 2019' + ], }, { - created => '2018-10-01T19:00', - data => { - enum1 => 1, - integer1 => 0, - } + name => 'String x-axis with y-axis sum - standard 12 month range', + type => 'bar', + x_axis => $columns->{enum1}->id, + x_axis_range => '-12', + y_axis => $columns->{integer1}->id, + y_axis_stack => 'sum', + labels => [qw/foo3 foo2 foo1/], + data => [ + [1,6,6,6,5,0,0,0,0,4,4,4,0], + [23,0,0,0,1,1,1,1,1,0,0,0,10], + [12,12,12,12,0,7,7,7,7,7,19,19,56], + ], + xlabels => [ + 'June 2018', 'July 2018', 'August 2018', 'September 2018', + 'October 2018', 'November 2018', 'December 2018', 'January 2019', + 'February 2019', 'March 2019', 'April 2019', 'May 2019', 'June 2019' + ], }, { - created => '2019-06-02T22:00', - data => { - enum1 => 3, - integer1 => 54, - } + name => 'String x-axis with y-axis sum - 1 month range', + type => 'bar', + x_axis => $columns->{enum1}->id, + x_axis_range => '-1', + y_axis => $columns->{integer1}->id, + y_axis_stack => 'sum', + labels => [qw/foo3 foo2 foo1/], + data => [ + [(4) x 31, 0], + [(0) x 31, 10], + [(19) x 19, (56) x 13], + ], + xlabels => [ + '14 May 2019', '15 May 2019', '16 May 2019', '17 May 2019', '18 May 2019', '19 May 2019', + '20 May 2019', '21 May 2019', '22 May 2019', '23 May 2019', '24 May 2019', '25 May 2019', + '26 May 2019', '27 May 2019', '28 May 2019', '29 May 2019', '30 May 2019', '31 May 2019', + '01 June 2019', '02 June 2019', '03 June 2019', '04 June 2019', '05 June 2019', '06 June 2019', + '07 June 2019', '08 June 2019', '09 June 2019', '10 June 2019', '11 June 2019', '12 June 2019', + '13 June 2019', '14 June 2019' + ] }, { - created => '2019-06-02T23:00', - data => { - enum1 => 1, - integer1 => 37, - } + name => 'String x-axis with y-axis count - custom range', + type => 'bar', + x_axis => $columns->{enum1}->id, + x_axis_range => 'custom', + x_axis_grouping => 'month', + from => DateTime->new(year => 2018, month => 1, day => 5), + to => DateTime->new(year => 2018, month => 3, day => 10), + y_axis => $columns->{integer1}->id, + y_axis_stack => 'count', + labels => [qw/foo3 foo1/], + data => [ + [1,1,1], + [0,1,1], + ], + xlabels => [ + 'January 2018', 'February 2018', 'March 2018', + ], }, - ], -); - -my $sheet = Test::GADS::DataSheet->new(data => []); -my $schema = $sheet->schema; -my $layout = $sheet->layout; -my $columns = $sheet->columns; -$sheet->create_records; - -foreach my $rec (@records) -{ - my $record = GADS::Record->new( - user => $sheet->user, - layout => $layout, - schema => $schema, - ); - $record->initialise; - foreach my $version (@$rec) - { - my $created = DateTime::Format::ISO8601->parse_datetime($version->{created}); - my $data = $version->{data}; - $record->fields->{$columns->{enum1}->id}->set_value($data->{enum1}); - $record->fields->{$columns->{integer1}->id}->set_value($data->{integer1}); - $record->write(version_datetime => $created, no_alerts => 1); - } -} + ]; -is($schema->resultset('Current')->count, 3, "Correct number of records created"); -is($schema->resultset('Record')->count, 12, "Correct number of versions created"); - -my $graphs = [ - { - name => 'String x-axis with count - standard 12 month range', - type => 'bar', - x_axis => $columns->{enum1}->id, - x_axis_range => '-12', - y_axis_stack => 'count', - labels => [qw/foo3 foo2 foo1/], - data => [ - [1,2,2,2,1,0,0,0,0,1,1,1,0], - [1,0,0,0,1,1,1,1,1,0,0,0,1], - [1,1,1,1,1,2,2,2,2,2,2,2,2], - ], - xlabels => [ - 'June 2018', 'July 2018', 'August 2018', 'September 2018', - 'October 2018', 'November 2018', 'December 2018', 'January 2019', - 'February 2019', 'March 2019', 'April 2019', 'May 2019', 'June 2019' - ], - }, - { - name => 'Including quick search', - type => 'bar', - x_axis => $columns->{enum1}->id, - x_axis_range => '-12', - y_axis_stack => 'count', - labels => [qw/foo3 foo2 foo1/], - search => 'foo2', - data => [ - [0,0,0,0,0,0,0,0,0,1,1,1,0], - [0,0,0,0,1,1,1,1,1,0,0,0,1], - [1,1,1,1,0,0,0,0,0,0,0,0,0], - ], - xlabels => [ - 'June 2018', 'July 2018', 'August 2018', 'September 2018', - 'October 2018', 'November 2018', 'December 2018', 'January 2019', - 'February 2019', 'March 2019', 'April 2019', 'May 2019', 'June 2019' - ], - }, - { - name => 'Including filter', # Should use same record IDs for each period - type => 'bar', - x_axis => $columns->{enum1}->id, - x_axis_range => '-12', - y_axis_stack => 'count', - labels => [qw/foo3 foo2 foo1/], - view => { - column => $columns->{integer1}->id, - value => '10', - }, - data => [ - [0,0,0,0,0,0,0,0,0,1,1,1,0], - [0,0,0,0,1,1,1,1,1,0,0,0,1], - [1,1,1,1,0,0,0,0,0,0,0,0,0], - ], - xlabels => [ - 'June 2018', 'July 2018', 'August 2018', 'September 2018', - 'October 2018', 'November 2018', 'December 2018', 'January 2019', - 'February 2019', 'March 2019', 'April 2019', 'May 2019', 'June 2019' - ], - }, + foreach my $g (@$graphs) { - name => 'String x-axis with y-axis sum - standard 12 month range', - type => 'bar', - x_axis => $columns->{enum1}->id, - x_axis_range => '-12', - y_axis => $columns->{integer1}->id, - y_axis_stack => 'sum', - labels => [qw/foo3 foo2 foo1/], - data => [ - [1,6,6,6,5,0,0,0,0,4,4,4,0], - [23,0,0,0,1,1,1,1,1,0,0,0,10], - [12,12,12,12,0,7,7,7,7,7,19,19,56], - ], - xlabels => [ - 'June 2018', 'July 2018', 'August 2018', 'September 2018', - 'October 2018', 'November 2018', 'December 2018', 'January 2019', - 'February 2019', 'March 2019', 'April 2019', 'May 2019', 'June 2019' - ], - }, - { - name => 'String x-axis with y-axis sum - 1 month range', - type => 'bar', - x_axis => $columns->{enum1}->id, - x_axis_range => '-1', - y_axis => $columns->{integer1}->id, - y_axis_stack => 'sum', - labels => [qw/foo3 foo2 foo1/], - data => [ - [(4) x 31, 0], - [(0) x 31, 10], - [(19) x 19, (56) x 13], - ], - xlabels => [ - '14 May 2019', '15 May 2019', '16 May 2019', '17 May 2019', '18 May 2019', '19 May 2019', - '20 May 2019', '21 May 2019', '22 May 2019', '23 May 2019', '24 May 2019', '25 May 2019', - '26 May 2019', '27 May 2019', '28 May 2019', '29 May 2019', '30 May 2019', '31 May 2019', - '01 June 2019', '02 June 2019', '03 June 2019', '04 June 2019', '05 June 2019', '06 June 2019', - '07 June 2019', '08 June 2019', '09 June 2019', '10 June 2019', '11 June 2019', '12 June 2019', - '13 June 2019', '14 June 2019' - ] - }, - { - name => 'String x-axis with y-axis count - custom range', - type => 'bar', - x_axis => $columns->{enum1}->id, - x_axis_range => 'custom', - x_axis_grouping => 'month', - from => DateTime->new(year => 2018, month => 1, day => 5), - to => DateTime->new(year => 2018, month => 3, day => 10), - y_axis => $columns->{integer1}->id, - y_axis_stack => 'count', - labels => [qw/foo3 foo1/], - data => [ - [1,1,1], - [0,1,1], - ], - xlabels => [ - 'January 2018', 'February 2018', 'March 2018', - ], - }, -]; + my $graph = GADS::Graph->new( + layout => $layout, + schema => $schema, + current_user => $sheet->user, + ); + $graph->title($g->{name}); + $graph->type($g->{type}); + $graph->trend('aggregate'); + $graph->x_axis_range($g->{x_axis_range}); + $graph->from($g->{from}); + $graph->to($g->{to}); + $graph->x_axis($g->{x_axis}); + $graph->x_axis_grouping($g->{x_axis_grouping}) + if $g->{x_axis_grouping}; + $graph->y_axis($g->{y_axis}); + $graph->y_axis_link($g->{y_axis_link}); + $graph->y_axis_stack($g->{y_axis_stack}); + $graph->group_by($g->{group_by}) + if $g->{group_by}; + $graph->write; -foreach my $g (@$graphs) -{ - my $graph = GADS::Graph->new( - layout => $layout, - schema => $schema, - current_user => $sheet->user, - ); - $graph->title($g->{name}); - $graph->type($g->{type}); - $graph->trend('aggregate'); - $graph->x_axis_range($g->{x_axis_range}); - $graph->from($g->{from}); - $graph->to($g->{to}); - $graph->x_axis($g->{x_axis}); - $graph->x_axis_grouping($g->{x_axis_grouping}) - if $g->{x_axis_grouping}; - $graph->y_axis($g->{y_axis}); - $graph->y_axis_stack($g->{y_axis_stack}); - $graph->group_by($g->{group_by}) - if $g->{group_by}; - $graph->write; + my $view; + if (my $v = $g->{view}) + { + my $rules = GADS::Filter->new( + as_hash => { + rules => [{ + id => $v->{column}, + type => 'string', + value => $v->{value}, + operator => $v->{operator} || 'equal', + }], + }, + ); + $view = GADS::View->new( + name => 'Test view', + filter => $rules, + columns => [$columns->{integer1}->id], + instance_id => $layout->instance_id, + layout => $layout, + schema => $schema, + user => $sheet->user, + ); + $view->write; + } - my $view; - if (my $v = $g->{view}) - { - my $rules = GADS::Filter->new( - as_hash => { - rules => [{ - id => $v->{column}, - type => 'string', - value => $v->{value}, - operator => 'equal', - }], - }, + my $records = GADS::RecordsGraph->new( + user => $sheet->user, + layout => $layout, + schema => $schema, + search => $g->{search}, ); - $view = GADS::View->new( - name => 'Test view', - filter => $rules, - columns => [$columns->{integer1}->id], - instance_id => $layout->instance_id, - layout => $layout, - schema => $schema, - user => $sheet->user, + my $graph_data = GADS::Graph::Data->new( + id => $graph->id, + records => $records, + schema => $schema, + view => $view, ); - $view->write; - } - my $records = GADS::RecordsGraph->new( - user => $sheet->user, - layout => $layout, - schema => $schema, - search => $g->{search}, - ); - my $graph_data = GADS::Graph::Data->new( - id => $graph->id, - records => $records, - schema => $schema, - view => $view, - ); - - is_deeply($graph_data->points, $g->{data}, "Graph data for $g->{name} is correct"); - is_deeply($graph_data->xlabels, $g->{xlabels}, "Graph xlabels for $g->{name} is correct"); - my @labels = map { $_->{label} } @{$graph_data->labels}; - is_deeply([@labels], $g->{labels}, "Graph labels for $g->{name} is correct"); + is_deeply($graph_data->points, $g->{data}, "Graph data for $g->{name} is correct"); + is_deeply($graph_data->xlabels, $g->{xlabels}, "Graph xlabels for $g->{name} is correct"); + my @labels = map { $_->{label} } @{$graph_data->labels}; + is_deeply([@labels], $g->{labels}, "Graph labels for $g->{name} is correct"); + } } done_testing(); diff --git a/t/025_approval.t b/t/025_approval.t index 28945031d..85f569167 100644 --- a/t/025_approval.t +++ b/t/025_approval.t @@ -89,4 +89,20 @@ is($records->count, 4, "Correct number of records to begin"); is(@{$records->results}, 4, "Correct number of records to begin"); is($records->results->[0]->current_id, 2, "Correct first record"); +# Check record retrieved from GADS::Records +my $live_version = $records->results->[3]; +is($live_version->current_id, 1, "Live version in correct location of sort"); +is($live_version->fields->{$string1->id}->as_string, 'Foo5', "Correct written data"); +is($live_version->fields->{$date1->id}->as_string, '2004-01-01', "Unapproved data still previous version"); + +# Check record retrieved from GADS::Record +$live_version = GADS::Record->new( + user => $sheet->user, + layout => $layout, + schema => $schema, +); +$live_version->find_current_id(1); +is($live_version->fields->{$string1->id}->as_string, 'Foo5', "Correct written data"); +is($live_version->fields->{$date1->id}->as_string, '2004-01-01', "Unapproved data still previous version"); + done_testing(); diff --git a/t/026_purge.t b/t/026_purge.t index df11125b0..5be78409e 100644 --- a/t/026_purge.t +++ b/t/026_purge.t @@ -9,8 +9,6 @@ use GADS::Record; use lib 't/lib'; use Test::GADS::DataSheet; -use Test::Simple tests => 384; - my $sheet = Test::GADS::DataSheet->new( column_count => { string => 2, @@ -101,7 +99,6 @@ foreach my $col (@cols) $record->find_current_id(1); - if($col->{new}) { $record->fields->{ $test_col->id }->set_value($col->{new}); $record->write(no_alerts => 1); @@ -159,4 +156,16 @@ foreach my $col (@cols) } } +# Test purge of whole record version +$record->find_current_id(1); +is($record->versions, 8, "Correct number of versions of record"); +my $crs = $schema->resultset('Current')->find($record->current_id); +is($crs->records->get_column('id')->max, 8, "Correct current version number"); +is($crs->current_version_id, 8, "Correct version number in parent"); +$record->purge; +$crs->discard_changes; +is($record->versions, 7, "Correct number of versions of record"); +is($crs->records->get_column('id')->max, 7, "Correct version number after rollback"); +is($crs->current_version_id, 7, "Correct version number in parent"); + done_testing(); diff --git a/t/lib/Test/GADS/DataSheet.pm b/t/lib/Test/GADS/DataSheet.pm index 0fb1159eb..3e2819f3a 100644 --- a/t/lib/Test/GADS/DataSheet.pm +++ b/t/lib/Test/GADS/DataSheet.pm @@ -479,6 +479,7 @@ has multivalue_columns => ( daterange => 1, string => 1, calc => 1, + integer => 1, }; }, ); @@ -615,6 +616,7 @@ sub __build_columns $integer->type('intgr'); $integer->name("integer$count"); $integer->name_short("L${instance_id}integer$count"); + $integer->multivalue(1) if $self->multivalue && $self->multivalue_columns->{integer}; $integer->set_permissions({$self->group->id => $permissions}) if $self->group; try { $integer->write }; diff --git a/views/data_table.tt b/views/data_table.tt index b04dac77c..1e141fb24 100755 --- a/views/data_table.tt +++ b/views/data_table.tt @@ -68,7 +68,7 @@ END; table_columns.push({ - name = col.id, + name = col.full_id, title = col.name, type = col.type, orderable = 1, From aa6a2503d3c5095851bcbd8dcc7f436b6b146022 Mon Sep 17 00:00:00 2001 From: Dave Roberts Date: Mon, 12 Jan 2026 14:12:50 +0000 Subject: [PATCH 2/9] Add border and spacing to clarify where different text values end --- src/frontend/css/stylesheets/base/_global.scss | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/frontend/css/stylesheets/base/_global.scss b/src/frontend/css/stylesheets/base/_global.scss index 097917358..349325f36 100644 --- a/src/frontend/css/stylesheets/base/_global.scss +++ b/src/frontend/css/stylesheets/base/_global.scss @@ -102,3 +102,12 @@ table.table-bordered { margin: 0 auto; } } + +.hft-lines { + @extend .mb-2; + + &:not(:last-of-type) { + @extend .pb-2; + @extend .border-bottom + } +} From 427f0ec71d8947608238f67635e2bf8801494f27 Mon Sep 17 00:00:00 2001 From: Andy Beverley Date: Fri, 23 Jan 2026 12:33:51 +0000 Subject: [PATCH 3/9] Incorporate feedback from code review --- lib/GADS/API.pm | 6 +- lib/GADS/Records.pm | 131 ++++++++++++++++++++++----- lib/GADS/RecordsJoin.pm | 192 ++++++++++++++++++++++++++++++---------- 3 files changed, 259 insertions(+), 70 deletions(-) diff --git a/lib/GADS/API.pm b/lib/GADS/API.pm index a8566e1b2..515b727f5 100644 --- a/lib/GADS/API.pm +++ b/lib/GADS/API.pm @@ -1183,7 +1183,11 @@ sub _get_records { # Check user has access error __"Invalid column ID for sort" unless $col_order && $col_order->user_can('read'); - my $sort = { type => $params->get('order[0][dir]'), id => $col_order->id, parent_id => $col_order->parent_id }; + my $sort = { + type => $params->get('order[0][dir]'), + id => $col_order->id, + parent_id => $col_order->parent_id, + }; $records->clear_sorts; $records->sort($sort); diff --git a/lib/GADS/Records.pm b/lib/GADS/Records.pm index 380829b01..6448b1c9b 100644 --- a/lib/GADS/Records.pm +++ b/lib/GADS/Records.pm @@ -655,8 +655,16 @@ sub search_view 'me.instance_id' => $self->layout->instance_id, }); # Perform search construct twice, to ensure all value joins are consistent numbers - $self->_search_construct($decoded, ignore_perms => 1, user => $user, current_version_only => 1); - push @searches, $self->_search_construct($decoded, ignore_perms => 1, user => $user, current_version_only => 1); + $self->_search_construct($decoded, + ignore_perms => 1, + user => $user, + current_version_only => 1, + ); + push @searches, $self->_search_construct($decoded, + ignore_perms => 1, + user => $user, + current_version_only => 1, + ); my $i = 0; my @ids; while ($i < @$current_ids) { @@ -925,7 +933,10 @@ sub _build__search_all_fields } else { push @search, { 'layout.id' => \@columns_can_view }; - push @search, $self->record_later_search(search => 1, current_version_only => $self->cvo_recordset); + push @search, $self->record_later_search( + search => 1, + current_version_only => $self->cvo_recordset, + ); } my @currents = $self->schema->resultset('Current')->search({ -and => \@search},{ join => $joins, @@ -1061,7 +1072,12 @@ sub _current_rs ); # Build the search query first, to ensure that all join numbers are correct - my $search_query = $self->search_query(linked => 1, rewind => $self->rewind_recordset, %common); # Need to call first to build joins + # Need to call search_query() first to build all joins + my $search_query = $self->search_query( + linked => 1, + rewind => $self->rewind_recordset, + %common, + ); my @prefetches = $self->jpfetch(prefetch => 1, linked => 0, %common); my @linked_prefetch = $self->linked_hash(prefetch => 1, %common); @@ -1642,7 +1658,12 @@ sub _build_count my ($search_query, $select); if ($self->rewind_recordset || $self->_query_params(search => 1) || $self->_approval_query) { - $search_query = $self->search_query(search => 1, linked => 1, current_version_only => $self->cvo_values, rewind => $self->rewind_values); + $search_query = $self->search_query( + search => 1, + linked => 1, + current_version_only => $self->cvo_values, + rewind => $self->rewind_values, + ); my @joins = $self->jpfetch(search => 1, linked => 0, current_version_only => $self->cvo_values); my @linked = $self->linked_hash(search => 1, linked => 1, current_version_only => $self->cvo_values); $select = { @@ -1660,7 +1681,13 @@ sub _build_count } else { # record joins not needed, remove with fresh call - $search_query = $self->search_query(search => 1, linked => 1, no_record_later => 1, current_version_only => $self->cvo_values, rewind => $self->rewind_values); + $search_query = $self->search_query( + search => 1, + linked => 1, + no_record_later => 1, + current_version_only => $self->cvo_values, + rewind => $self->rewind_values, + ); } local $GADS::Schema::Result::Record::REWIND = $self->dt_parser->format_datetime($self->rewind_recordset) @@ -1691,9 +1718,22 @@ sub exists $search_query = $cache->{search_query}; } else { - $search_query = $self->search_query(search => 1, linked => 1, current_version_only => $self->cvo_values, rewind => $self->rewind_values); - @joins = $self->jpfetch(search => 1, linked => 0, current_version_only => $self->cvo_values); - @linked = $self->linked_hash(search => 1, linked => 1, current_version_only => $self->cvo_values); + $search_query = $self->search_query( + search => 1, + linked => 1, + current_version_only => $self->cvo_values, + rewind => $self->rewind_values, + ); + @joins = $self->jpfetch( + search => 1, + linked => 0, + current_version_only => $self->cvo_values, + ); + @linked = $self->linked_hash( + search => 1, + linked => 1, + current_version_only => $self->cvo_values, + ); $self->_exists_cache({ joins => \@joins, linked => \@linked, @@ -1745,7 +1785,12 @@ sub _build_has_children # Use is_group to ensure that WHERE clause consists of query instead of # full list of current IDs - my $search_query = $self->_resultset_search(search => 1, linked => 1, is_group => 1, current_version_only => $self->cvo_values); + my $search_query = $self->_resultset_search( + search => 1, + linked => 1, + is_group => 1, + current_version_only => $self->cvo_values, + ); my $linked = $self->linked_hash(search => 1); my $select = { join => [ @@ -2257,7 +2302,12 @@ sub order_by # and therefore there is no need to add the is_grouped flag # here. This relies on calling this order_by function after # the grouped columns have been added. - my $agg = $self->add_aggregate($col_sort, 'max', parent => $column_parent, group_cols => $group_cols, sort => 1, %options); + my $agg = $self->add_aggregate($col_sort, 'max', + parent => $column_parent, + group_cols => $group_cols, + sort => 1, + %options, + ); $query = { $type => $agg->{as} }; } else { @@ -3347,7 +3397,12 @@ sub _build_group_results next if $options{aggregate} && $column->aggregate && $column->aggregate eq 'recalc'; - $self->add_aggregate($column, $op, search => 0, parent => $parent, group_cols => \@group_cols, is_grouped => $col->{group} || $col->{drcol}); + $self->add_aggregate($column, $op, + search => 0, + parent => $parent, + group_cols => \@group_cols, + is_grouped => $col->{group} || $col->{drcol}, + ); } push @select_fields, { @@ -3372,7 +3427,13 @@ sub _build_group_results { min => "$field.$from_field", -as => 'start_date'}, { max => "$field.$to_field", -as => 'end_date'}, ]; - my $search = $self->search_query(search => 1, prefetch => 1, linked => 0, current_version_only => $self->cvo_values, rewind => $self->rewind_values); + my $search = $self->search_query( + search => 1, + prefetch => 1, + linked => 0, + current_version_only => $self->cvo_values, + rewind => $self->rewind_values, + ); # Include linked field if applicable if ($field_link) { @@ -3383,20 +3444,25 @@ sub _build_group_results } # Get min and max dates of range + my @jpfetch = $self->jpfetch( + search => 1, + prefetch => 1, + linked => 0, + current_version_only => $self->cvo_values, + ); my ($result) = $self->schema->resultset('Current')->search( [-and => $search], { select => $select, join => [ - $self->linked_hash(search => 1, prefetch => 1, current_version_only => $self->cvo_values), + $self->linked_hash( + search => 1, + prefetch => 1, + current_version_only => $self->cvo_values, + ), { $self->cvo_values - ? ('current_version' => [ - $self->jpfetch(search => 1, prefetch => 1, linked => 0, current_version_only => $self->cvo_values) - ]) - : ('record_single' => [ - 'record_later', - $self->jpfetch(search => 1, prefetch => 1, linked => 0, current_version_only => $self->cvo_values), - ]) + ? ('current_version' => [@jpfetch]) + : ('record_single' => ['record_later', @jpfetch]) }, ], }, @@ -3524,7 +3590,14 @@ sub _build_group_results } }; - my $q = $self->search_query(prefetch => 1, search => 1, retain_join_order => 1, group => 1, sort => 1, drcol => $drcol); # Called first to generate joins + my $q = $self->search_query( + prefetch => 1, + search => 1, + retain_join_order => 1, + group => 1, + sort => 1, + drcol => $drcol, + ); # Called first to generate joins # Ensure that no joins are added here that are multi-value fields, # otherwise they will generate multiple rows for a single records, which @@ -3542,7 +3615,12 @@ sub _build_group_results current_version_only => $self->cvo_values, ); - my @jp_fetch = $self->jpfetch(%common, multivalue => 0, linked => 0, retain_join_order => 1, aggregate => $options{aggregate}); + my @jp_fetch = $self->jpfetch(%common, + multivalue => 0, + linked => 0, + retain_join_order => 1, + aggregate => $options{aggregate}, + ); my $order_by = $self->order_by(%common, group_cols => \@group_cols, retain_join_order => 1); push @select_fields, map $_->{select}, @{$self->aggregate_fields}; my $select = { @@ -3563,7 +3641,12 @@ sub _build_group_results my $result = $self->schema->resultset('Current')->search( # Outer search query so needs to match values being retrieved - $self->_resultset_search(sort => 0, is_group => 1, prefetch => 1, current_version_only => $self->cvo_values), $select + $self->_resultset_search( + sort => 0, + is_group => 1, + prefetch => 1, + current_version_only => $self->cvo_values, + ), $select ); return [$result->all] diff --git a/lib/GADS/RecordsJoin.pm b/lib/GADS/RecordsJoin.pm index 0c06583c8..cdfa7be87 100644 --- a/lib/GADS/RecordsJoin.pm +++ b/lib/GADS/RecordsJoin.pm @@ -433,7 +433,14 @@ sub _jpfetch_add # Remove multivalues to prevent huge amount of rows being fetched. # These will be fetched later as individual columns. # Keep any for a sort - these still need to be used when fetching rows. - @children = grep { $_->{search} || $_->{sort} || $_->{column}->fetch_with_record || $options->{include_multivalue} || $_->{group} || $_->{drcol} } @children + @children = grep { + $_->{search} + || $_->{sort} + || $_->{column}->fetch_with_record + || $options->{include_multivalue} + || $_->{group} + || $_->{drcol} + } @children if $options->{prefetch}; my $options = { join_current_version => $current_version_only, @@ -447,7 +454,10 @@ sub _jpfetch_add }; } else { - return { %$join, join => $join->{column}->tjoin(join_current_version => $current_version_only) }; + return { + %$join, + join => $join->{column}->tjoin(join_current_version => $current_version_only) + }; } } else { @@ -598,15 +608,15 @@ sub table_name { return $self->record_name(%options); } - my $tn = $column->sprefix; - $tn .= "_alternative" if $options{alt}; - return $tn; + my $internal_table_name = $column->sprefix; + $internal_table_name .= "_alternative" if $options{alt}; + return $internal_table_name; } - my $jn = $self->_join_number($column, %options); - my $index = $jn > 1 ? "_$jn" : ''; - my $tn = $column->sprefix; - $tn .= "_alternative" if $options{alt}; - $tn . $index; + my $join_number = $self->_join_number($column, %options); + my $index = $join_number > 1 ? "_$join_number" : ''; + my $table_name = $column->sprefix; + $table_name .= "_alternative" if $options{alt}; + $table_name . $index; } sub _join_number @@ -632,40 +642,40 @@ sub _join_number if $debug; } - foreach my $j (@store) + foreach my $join (@store) { - trace "Checking join ".$j->{column}->id + trace "Checking join ".$join->{column}->id if $debug; - my $n = _find($column, $j, $stash, %options); - trace __x"return from find request is: {n}", n => $n + my $join_number = _find($column, $join, $stash, %options); + trace __x"return from find request is: {n}", n => $join_number if $debug; - return $n if $n; - if ($j->{children}) + return $join_number if $join_number; + if ($join->{children}) { trace "This join has other joins, checking..." if $debug; - foreach my $j2 (@{$j->{children}}) + foreach my $join2 (@{$join->{children}}) { - if ($j2->{children}) + if ($join2->{children}) { trace "This join has other joins, checking..." if $debug; - foreach my $j3 (@{$j2->{children}}) # Replace with recursive function? + foreach my $join3 (@{$join2->{children}}) # Replace with recursive function? { - trace "Looking at join ".$j3->{column}->id + trace "Looking at join ".$join3->{column}->id if $debug; - $n = _find($column, $j3, $stash, %options); - trace __x"return from find request is: {n}", n => $n + $join_number = _find($column, $join3, $stash, %options); + trace __x"return from find request is: {n}", n => $join_number if $debug; - return $n if $n; + return $join_number if $join_number; } } - trace "Looking at join ".$j2->{column}->id + trace "Looking at join ".$join2->{column}->id if $debug; - $n = _find($column, $j2, $stash, %options); - trace __x"return from find request is: {n}", n => $n + $join_number = _find($column, $join2, $stash, %options); + trace __x"return from find request is: {n}", n => $join_number if $debug; - return $n if $n; + return $join_number if $join_number; } } } @@ -689,11 +699,8 @@ sub _find trace "Checking against join ".$jp->{column}->id if $debug; - my $is_cc = $jp->{column}->type eq 'curval' || $jp->{column}->type eq 'filval'; my $join = $jp->{column}->is_curcommon ? $jp->{column}->sprefix - #: $is_cc - #? { $jp->{column}->sprefix => 'value' } : $jp->{column}->tjoin(join_current_version => $options{current_version_only}); if (ref $join eq 'HASH') { @@ -814,7 +821,10 @@ sub add_aggregate my ($existing) = grep { $_->{column}->id == $column->id - && ((!$_->{parent} && !$parent) || ($_->{parent} && $parent && $_->{parent}->id == $parent->id)) + && ( + (!$_->{parent} && !$parent) + || ($_->{parent} && $parent && $_->{parent}->id == $parent->id) + ) && $_->{operator} ne $operator } @{$self->aggregate_fields}; @@ -875,11 +885,19 @@ sub add_aggregate }); if ($column->numeric && $operator eq 'sum') { - $select = $f_rs->get_column((ref $column->tjoin(join_current_version => $self->cvo_values) eq 'HASH' ? 'value_2' : $column->field).".".$column->value_field)->sum_rs->as_query; + $select = $f_rs->get_column( + (ref $column->tjoin(join_current_version => $self->cvo_values) eq 'HASH' + ? 'value_2' + : $column->field) + .".".$column->value_field)->sum_rs->as_query; } elsif ($operator eq 'sum' || $operator eq 'max') # Default to max for sum of non-numeric columns { - my $fn = (ref $column->tjoin(join_current_version => $self->cvo_values) eq 'HASH' ? 'value_2' : $column->field).".".$column->value_field; + my $fn = ( + ref $column->tjoin(join_current_version => $self->cvo_values) eq 'HASH' + ? 'value_2' + : $column->field + ).".".$column->value_field; $select = $f_rs->get_column($fn)->max_rs->as_query; } elsif ($operator eq 'distinct') { @@ -909,12 +927,42 @@ sub add_aggregate # joins of multiple-value fields which can include too many # results in the aggregate. my $has_grouped = @group_cols; - my $searchq = $self->search_query(%options, search => 1, extra_column => $column, linked => 0, group => $has_grouped, alt => 1, alias => 'mefield', current_version_only => $self->cvo_values, rewind => $self->rewind_values); + my $searchq = $self->search_query(%options, + search => 1, + extra_column => $column, + linked => 0, + group => $has_grouped, + alt => 1, + alias => 'mefield', + current_version_only => $self->cvo_values, + rewind => $self->rewind_values, + ); foreach my $group (@group_cols) { push @$searchq, { - $self->fqvalue($group->{column}, %options, search => 1, as_index => $as_index, linked => 0, group => 1, alt => 1, extra_column => $group->{column}, parent => $group->{parent}, drcol => $drcol, current_version_only => $self->cvo_values) => { - -ident => $self->fqvalue($group->{column}, %options, search => 1, parent => $group->{parent}, as_index => $as_index, linked => 0, group => 1, extra_column => $group->{column}, drcol => $drcol, current_version_only => $self->cvo_values) + $self->fqvalue($group->{column}, + %options, + search => 1, + as_index => $as_index, + linked => 0, + group => 1, + alt => 1, + extra_column => $group->{column}, + parent => $group->{parent}, + drcol => $drcol, + current_version_only => $self->cvo_values + ) => { + -ident => $self->fqvalue($group->{column}, + %options, + search => 1, + parent => $group->{parent}, + as_index => $as_index, + linked => 0, + group => 1, + extra_column => $group->{column}, + drcol => $drcol, + current_version_only => $self->cvo_values, + ) }, }; } @@ -923,25 +971,65 @@ sub add_aggregate { alias => 'mefield', join => [ - [$self->linked_hash(%options, search => 1, group => $has_grouped, alt => 1, extra_column => $column, current_version_only => $self->cvo_values)], + [$self->linked_hash(%options, + search => 1, + group => $has_grouped, + alt => 1, + extra_column => $column, + current_version_only => $self->cvo_values, + )], { $self->cvo_values ? ('current_version_alternative' => [ - $self->jpfetch(%options, search => 1, linked => 0, group => $has_grouped, extra_column => $column, alt => 1, current_version_only => 1) + $self->jpfetch(%options, + search => 1, + linked => 0, + group => $has_grouped, + extra_column => $column, + alt => 1, + current_version_only => 1, + ) ]) : ('record_single_alternative' => [ # The (assumed) single record for the required version of current 'record_later_alternative', # The record after the single record (undef when single is latest) - $self->jpfetch(%options, search => 1, linked => 0, group => $has_grouped, extra_column => $column, alt => 1, current_version_only => 0), + $self->jpfetch(%options, + search => 1, + linked => 0, + group => $has_grouped, + extra_column => $column, + alt => 1, + current_version_only => 0, + ), ]) }, ], select => { - count => { distinct => $self->fqvalue($column, %options, search => 1, as_index => $as_index, linked => 0, group => 1, alt => 1, extra_column => $column, drcol => $drcol, current_version_only => $self->cvo_values) }, + count => { distinct => $self->fqvalue($column, + %options, + search => 1, + as_index => $as_index, + linked => 0, + group => 1, + alt => 1, + extra_column => $column, + drcol => $drcol, + current_version_only => $self->cvo_values, + )}, -as => 'sub_query_as', }, }, ); - my $col_fq = $self->fqvalue($column, %options, search => 1, as_index => $as_index, linked => 0, group => 1, alt => 1, extra_column => $column, drcol => $drcol, current_version_only => $self->cvo_values); + my $col_fq = $self->fqvalue($column, + %options, + search => 1, + as_index => $as_index, + linked => 0, + group => 1, + alt => 1, + extra_column => $column, + drcol => $drcol, + current_version_only => $self->cvo_values, + ); if ($column->numeric && $operator eq 'sum') { $select = $select->get_column($col_fq)->sum_rs->as_query; @@ -953,7 +1041,7 @@ sub add_aggregate { $select = $select->get_column($col_fq)->max_rs->as_query; } - elsif ($operator eq 'distinct' || $operator eq 'count') + elsif ($operator eq 'distinct') { $select = $select->get_column('sub_query_as')->as_query; $operator = 'max'; @@ -965,7 +1053,17 @@ sub add_aggregate } # Standard single-value field - select directly, no need for a subquery else { - $select = $self->fqvalue($column, %options, as_index => $as_index, prefetch => 1, group => 1, linked => 0, parent => $parent, retain_join_order => 1, drcol => $drcol, current_version_only => $self->cvo_values); + $select = $self->fqvalue($column, + %options, + as_index => $as_index, + prefetch => 1, + group => 1, + linked => 0, + parent => $parent, + retain_join_order => 1, + drcol => $drcol, + current_version_only => $self->cvo_values, + ); } my $overall_select = $operator eq 'distinct' @@ -989,8 +1087,12 @@ sub add_aggregate push @{$self->aggregate_fields}, $aggfield; # Also add linked column if required - $self->add_aggregate($column->link_parent, $operator, is_linked => $column, parent => $parent, group_cols => \@group_cols, is_grouped => $is_grouped) - if $column->link_parent; + $self->add_aggregate($column->link_parent, $operator, + is_linked => $column, + parent => $parent, + group_cols => \@group_cols, + is_grouped => $is_grouped + ) if $column->link_parent; $aggfield; } From 61dda06a78b78f5cf49c5f2e4c01de3917cd1639 Mon Sep 17 00:00:00 2001 From: Dave Roberts <145559566+droberts-ctrlo@users.noreply.github.com> Date: Mon, 26 Jan 2026 12:42:05 +0000 Subject: [PATCH 4/9] Complete default report setup (D 800) (#580) * Complete default report setup Move PDF functionality to `GADS::PDFGenerator` class * Updated fat comma formatting as requested * Updated title for report --- lib/GADS.pm | 6 +- lib/GADS/PDFGenerator.pm | 178 +++++++++++++++++++++++++++++++ lib/GADS/Record.pm | 84 ++------------- lib/GADS/Schema/Result/Report.pm | 126 +++------------------- 4 files changed, 205 insertions(+), 189 deletions(-) create mode 100644 lib/GADS/PDFGenerator.pm diff --git a/lib/GADS.pm b/lib/GADS.pm index 62ba1fa71..1a94f837e 100644 --- a/lib/GADS.pm +++ b/lib/GADS.pm @@ -1948,8 +1948,10 @@ any qr{/(record|history|purge|purgehistory)/([0-9]+)} => require_login sub { if (defined param('pdf') && !$record->layout->no_download_pdf) { - my $pdf = $record->pdf->content; - return send_file(\$pdf, content_type => 'application/pdf', filename => "Record-".$record->current_id.".pdf" ); + my $site = var 'site' + or error __"No site configured"; + my $pdf = $record->pdf($site)->content; + return send_file( \$pdf, content_type => 'application/pdf', filename => "Record-".$record->current_id.".pdf"); } if (query_parameters->get('report')) diff --git a/lib/GADS/PDFGenerator.pm b/lib/GADS/PDFGenerator.pm new file mode 100644 index 000000000..bb8acac19 --- /dev/null +++ b/lib/GADS/PDFGenerator.pm @@ -0,0 +1,178 @@ +package GADS::PDFGenerator; + +use strict; +use warnings; + +use Moo; + +use GADS::Config; + +use CtrlO::PDF; + +has site => ( + is => 'ro', + required => 1, +); + +has layouts => ( + is => 'ro', + required => 1, +); + +has record => ( + is => 'ro', + required => 1 +); + +has user => ( + is => 'ro', + required => 1, +); + +has security_marking => ( + is => 'ro', +); + +has _default_marking => ( + is => 'lazy', +); + +sub _build__default_marking { + return shift->site->read_security_marking; +} + +has _logo => ( + is => 'lazy', +); + +sub _build__logo { + return shift->site->create_temp_logo; +} + +sub build { + my ($self, %options) = @_; + + my $marking = $self->security_marking || $self->_default_marking; + my $logo = $self->_logo; + + my $pdf; + my $topmargin = 0; + + if ($logo) + { + $pdf = CtrlO::PDF->new( + header => $marking, + footer => $marking, + logo => $logo, + ); + + # Adjust the top margin to allow for the logo - 30px allows the table (below the logo) to not encroach on the logo when rendered + # This is used rather than overcomplicating and using image size to centre the header, and then having to "drop" the table down to avoid the logo + $topmargin = -30; + } + else + { + $pdf = CtrlO::PDF->new( + header => $marking, + footer => $marking, + ); + } + + $pdf->add_page; + + $pdf->heading($options{title}, topmargin => $topmargin); + $pdf->text($options{subtitle}, size => 14) if $options{subtitle}; + + my $hdr_props = { + repeat => 0, + justify => 'center', + font_size => 12, + bg_color => '#007c88', + fg_color => '#ffffff', + }; + + my $result = $self->layouts; + + my @cols = $self->record->presentation_map_columns(columns => $result); + my @topics = $self->record->get_topics(\@cols); + + my $i = 0; + foreach my $topic (@topics) + { + my $topic_name = $topic->{topic} ? $topic->{topic}->name : 'Other'; + my $fields = [ [$topic_name] ]; + + my $width = 0; + foreach my $col (@{ $topic->{columns} }) + { + if ($col->{data}->{selected_values}) + { + my $first = 1; + foreach my $c (@{ $col->{data}->{selected_values} }) + { + my $values = $c->{values}; + $width = + $width < (scalar(@$values) + 1) + ? scalar(@$values) + 1 + : $width; + push @$fields, [ $first ? $col->{name} : '', @$values ]; + $first = 0; + } + } + else + { + if ($col->{data}->{value}) + { + push @$fields, + [ $col->{name}, $col->{data}->{value} || "" ]; + } + else + { + push @$fields, [ $col->{name}, $col->{data}->{grade} ]; + } + $width = 2 if $width < 2; + } + } + + my $cell_props = []; + foreach my $d (@$fields) + { + my $has = @$d; + + # $max_fields does not include field name + my $gap = $width - $has + 1; + push @$d, undef for (1 .. $gap); + push @$cell_props, + [ (undef) x ($has - 1), { colspan => $gap + 1 }, ]; + } + + $pdf->table( + data => $fields, + header_props => $hdr_props, + border_c => '#007C88', + h_border_w => 1, + cell_props => $cell_props, + size => '4cm *', + ); + } + + my $now = DateTime->now; + my $format = GADS::Config->instance->dateformat; + $pdf->text( + 'Last edited by ' + . $self->record->edited_user->as_string . ' on ' + . $self->record->edited_time->as_string, + size => 10 + ); + $pdf->text( + 'Report generated by ' + . $self->user->value . ' on ' + . $now->format_cldr($format) . ' at ' + . $now->hms, + size => 10 + ); + + return $pdf; +} + +1; diff --git a/lib/GADS/Record.pm b/lib/GADS/Record.pm index 1dfbc64c1..f4abbca6b 100644 --- a/lib/GADS/Record.pm +++ b/lib/GADS/Record.pm @@ -2721,83 +2721,21 @@ sub for_code } sub pdf -{ my $self = shift; - - my $dateformat = GADS::Config->instance->dateformat; - my $now = DateTime->now; - $now->set_time_zone('Europe/London'); - my $now_formatted = $now->format_cldr($dateformat)." at ".$now->hms; - my $updated = $self->edited_time->as_string; - - my $config = GADS::Config->instance; - my $header = $config && $config->gads && $config->gads->{header}; - my $pdf = CtrlO::PDF->new( - header => $header, - footer => "Downloaded by ".$self->user->value." on $now_formatted", - ); +{ my ($self, $site) = @_; - $pdf->add_page; - $pdf->heading('Record '.$self->current_id); - $pdf->heading('Last updated by '.$self->edited_user->as_string." on $updated", size => 12); + my $result = [$self->layout->all_user_read]; - my $data =[ - ['Field', 'Value'], - ]; - my $max_fields; - foreach my $col ($self->layout->all_user_read) - { - my $datum = $self->get_field_value($col); - next if $datum->dependent_not_shown; - if ($col->is_curcommon) - { - my $first = 1; - foreach my $line (@{$datum->values}) - { - my $field_count; - my @l = ($first ? $col->name : ''); - foreach my $v (@{$line->{values}}) - { - push @l, $v; - $field_count++; - } - push @$data, \@l; - $first = 0; - $max_fields = $field_count if !$max_fields || $max_fields < $field_count; - } - } - else { - push @$data, [ - $col->name, - $datum->as_string, - ], - } - } - - my $hdr_props = { - repeat => 1, - justify => 'center', - font_size => 8, - }; - - my $cell_props = []; - foreach my $d (@$data) - { - my $has = @$d; - # $max_fields does not include field name - my $gap = $max_fields - $has + 1; - push @$d, undef for (1..$gap); - push @$cell_props, [ - (undef) x ($has - 1), - {colspan => $gap + 1} - ]; - } - - $pdf->table( - data => $data, - cell_props => $cell_props, + my $generator = GADS::PDFGenerator->new( + site => $site, + layouts => $result, + record => $self, + user => $self->user, + security_marking => $self->layout->security_marking ); - $pdf; + my $pdf = $generator->build(title => "Record " . $self->current_id); + + return $pdf; } sub get_report diff --git a/lib/GADS/Schema/Result/Report.pm b/lib/GADS/Schema/Result/Report.pm index 69195513c..ce195b5c5 100644 --- a/lib/GADS/Schema/Result/Report.pm +++ b/lib/GADS/Schema/Result/Report.pm @@ -9,6 +9,7 @@ use Log::Report 'linkspace'; use CtrlO::PDF 0.06; use PDF::Table 1.006; # Needed for colspan feature use GADS::Config; +use GADS::PDFGenerator; use Moo; extends 'DBIx::Class::Core'; @@ -210,125 +211,22 @@ Function to create a PDF of the report - it will return a PDF object sub create_pdf { my ($self, $record, $user) = @_; - my $marking = $self->_read_security_marking; - my $logo = $self->instance->site->create_temp_logo; - - my $pdf; - my $topmargin = 0; - - if ($logo) - { - $pdf = CtrlO::PDF->new( - header => $marking, - footer => $marking, - logo => $logo, - ); - -# Adjust the top margin to allow for the logo - 30px allows the table (below the logo) to not encroach on the logo when rendered -# This is used rather than overcomplicating and using image size to centre the header, and then having to "drop" the table down to avoid the logo - $topmargin = -30; - } - else - { - $pdf = CtrlO::PDF->new( - header => $marking, - footer => $marking, - ); - } - - $pdf->add_page; - $pdf->heading($self->title || $self->name, topmargin => $topmargin); - $pdf->text($self->description, size => 14) if $self->description; - - my $hdr_props = { - repeat => 0, - justify => 'center', - font_size => 12, - bg_color => '#007c88', - fg_color => '#ffffff', - }; - my %include = map { $_->layout_id => 1 } $self->report_layouts; my $result = [ grep $include{ $_->id }, @{ $record->columns_render } ]; - my @cols = $record->presentation_map_columns(columns => $result); - my @topics = $record->get_topics(\@cols); - - my $i = 0; - foreach my $topic (@topics) - { - my $topic_name = $topic->{topic} ? $topic->{topic}->name : 'Other'; - my $fields = [ [$topic_name] ]; - - my $width = 0; - foreach my $col (@{ $topic->{columns} }) - { - if ($col->{data}->{selected_values}) - { - my $first = 1; - foreach my $c (@{ $col->{data}->{selected_values} }) - { - my $values = $c->{values}; - $width = - $width < (scalar(@$values) + 1) - ? scalar(@$values) + 1 - : $width; - push @$fields, [ $first ? $col->{name} : '', @$values ]; - $first = 0; - } - } - else - { - if ($col->{data}->{value}) - { - push @$fields, - [ $col->{name}, $col->{data}->{value} || "" ]; - } - else - { - push @$fields, [ $col->{name}, $col->{data}->{grade} ]; - } - $width = 2 if $width < 2; - } - } - - my $cell_props = []; - foreach my $d (@$fields) - { - my $has = @$d; - - # $max_fields does not include field name - my $gap = $width - $has + 1; - push @$d, undef for (1 .. $gap); - push @$cell_props, - [ (undef) x ($has - 1), { colspan => $gap + 1 }, ]; - } + my $generator = GADS::PDFGenerator->new( + site => $self->instance->site, + instance => $self->instance, + layouts => $result, + record => $record, + user => $user, + security_marking => $self->_read_security_marking + ); - $pdf->table( - data => $fields, - header_props => $hdr_props, - border_c => '#007C88', - h_border_w => 1, - cell_props => $cell_props, - size => '4cm *', - ); - } + my %options = ( title => $self->title || $self->name || "Report" ); + $options{subtitle} = $self->description if $self->description; - my $now = DateTime->now; - my $format = GADS::Config->instance->dateformat; - $pdf->text( - 'Last edited by ' - . $record->edited_user->as_string . ' on ' - . $record->edited_time->as_string, - size => 10 - ); - $pdf->text( - 'Report generated by ' - . $user->value . ' on ' - . $now->format_cldr($format) . ' at ' - . $now->hms, - size => 10 - ); + my $pdf = $generator->build(%options); $pdf; } From 39ccefddd4b6a5bb79e997e47301bdb75d1a8ca6 Mon Sep 17 00:00:00 2001 From: Dave Roberts <145559566+droberts-ctrlo@users.noreply.github.com> Date: Mon, 26 Jan 2026 15:46:06 +0000 Subject: [PATCH 5/9] Updated to create alert rather than modal for auto-recover [D: 831] (#579) * Fix for Auto-Recover being invasive - Add `Buildable` interface - Add the `Hidable` abstract class for hiding elements - Add the `ButtonBuilder` for building custom buttons - Add the `AlertBuilder` abstract class for creating alerts, as well as a number of specific Alert types that can be built using this class - Prevent alert showing when not on record pages - Prevent modal showing when other alerts have values - Reword values in alert and modal - Update modal to show fields being changed * Reword modal * Updated cypress tests --- .../support/builders/layout/LayoutBuilder.ts | 3 - .../components/alert/lib/alertBase.ts | 43 ++++++++++++++ .../components/alert/lib/dangerAlert.test.ts | 18 ++++++ .../components/alert/lib/dangerAlert.ts | 17 ++++++ .../components/alert/lib/infoAlert.test.ts | 18 ++++++ .../components/alert/lib/infoAlert.ts | 17 ++++++ .../components/alert/lib/successAlert.test.ts | 18 ++++++ .../components/alert/lib/successAlert.ts | 17 ++++++ .../components/alert/lib/types/index.ts | 1 + .../components/alert/lib/warningAlert.test.ts | 18 ++++++ .../components/alert/lib/warningAlert.ts | 17 ++++++ .../button/lib/RenderableButton.test.ts | 45 +++++++++++++++ .../components/button/lib/RenderableButton.ts | 21 +++++++ .../form-group/autosave/_autosave.scss | 31 ++++++++++ .../components/form-group/autosave/index.js | 26 +++++---- .../form-group/autosave/lib/modal.js | 57 ++++++++++++++++--- src/frontend/js/lib/util/renderable/index.ts | 2 + .../js/lib/util/renderable/lib/Hidable.ts | 20 +++++++ .../js/lib/util/renderable/lib/Renderable.ts | 26 +++++++++ views/edit.tt | 5 +- 20 files changed, 395 insertions(+), 25 deletions(-) create mode 100644 src/frontend/components/alert/lib/alertBase.ts create mode 100644 src/frontend/components/alert/lib/dangerAlert.test.ts create mode 100644 src/frontend/components/alert/lib/dangerAlert.ts create mode 100644 src/frontend/components/alert/lib/infoAlert.test.ts create mode 100644 src/frontend/components/alert/lib/infoAlert.ts create mode 100644 src/frontend/components/alert/lib/successAlert.test.ts create mode 100644 src/frontend/components/alert/lib/successAlert.ts create mode 100644 src/frontend/components/alert/lib/types/index.ts create mode 100644 src/frontend/components/alert/lib/warningAlert.test.ts create mode 100644 src/frontend/components/alert/lib/warningAlert.ts create mode 100644 src/frontend/components/button/lib/RenderableButton.test.ts create mode 100644 src/frontend/components/button/lib/RenderableButton.ts create mode 100644 src/frontend/js/lib/util/renderable/index.ts create mode 100644 src/frontend/js/lib/util/renderable/lib/Hidable.ts create mode 100644 src/frontend/js/lib/util/renderable/lib/Renderable.ts diff --git a/cypress/support/builders/layout/LayoutBuilder.ts b/cypress/support/builders/layout/LayoutBuilder.ts index 4d10a75fd..a9a04c0fe 100644 --- a/cypress/support/builders/layout/LayoutBuilder.ts +++ b/cypress/support/builders/layout/LayoutBuilder.ts @@ -222,9 +222,6 @@ class CurvalLayoutBuilder extends LayoutBuilderBase implements ICurvalLayoutBuil cy.get("label") .contains(this.field) .click(); - cy.get("button.btn-xs[data-delete='rule']") - .eq(1) - .click(); //Someone owes me a drink! } } diff --git a/src/frontend/components/alert/lib/alertBase.ts b/src/frontend/components/alert/lib/alertBase.ts new file mode 100644 index 000000000..9f5b0c617 --- /dev/null +++ b/src/frontend/components/alert/lib/alertBase.ts @@ -0,0 +1,43 @@ +import { Hidable, Renderable } from 'util/renderable'; +import { AlertType } from './types'; + +export abstract class AlertBase extends Hidable implements Renderable { + /** + * Create an instance of AlertBase. + * This class serves as a base for alert components. + * It implements the Renderable interface, which requires a render method. + * The render method should be implemented by subclasses to provide specific rendering logic. + * @implements {Renderable} + * @param {string} message - The message to be displayed in the alert. + * @param {AlertType} type - The type of alert, which determines its styling and behavior. + * @see Renderable + * @see Hidable + * @see AlertType + * @example + * const alert = new AlertBase('This is an alert message', AlertType.INFO); + * document.body.appendChild(alert.render()); + */ + constructor(private readonly message: string, private readonly type: AlertType, private readonly transparent: boolean = false) { + super(); + } + + /** + * Render the alert as an HTMLDivElement. + * @returns {HTMLDivElement} The rendered HTML element representing the alert. + */ + render(): HTMLDivElement { + if(this.element) throw new Error('AlertBase.render() should not be called multiple times without resetting the element.'); + const alertDiv = document.createElement('div'); + alertDiv.classList.add('alert', `alert-${this.type}`); + if(this.transparent) { + alertDiv.classList.add('alert-no-bg'); + } + for(const item of this.message.split('\n')) { + const pDiv = document.createElement('p'); + pDiv.textContent = item; + alertDiv.appendChild(pDiv); + } + this.element = alertDiv; + return alertDiv; + } +} diff --git a/src/frontend/components/alert/lib/dangerAlert.test.ts b/src/frontend/components/alert/lib/dangerAlert.test.ts new file mode 100644 index 000000000..d3ccc78a7 --- /dev/null +++ b/src/frontend/components/alert/lib/dangerAlert.test.ts @@ -0,0 +1,18 @@ +import { describe, it, expect } from '@jest/globals'; +import { DangerAlert } from './dangerAlert'; + +describe('Error Alert Tests', () => { + it('should display an error alert with the correct message', () => { + const errorMessage = 'This is a test error message'; + const errorAlert = new DangerAlert(errorMessage); + + const alert = errorAlert.render(); + + document.body.appendChild(alert); + + expect(alert.classList.contains('alert-danger')).toBeTruthy(); + expect(alert.textContent).toContain(errorMessage); + + document.body.removeChild(alert); + }); +}); diff --git a/src/frontend/components/alert/lib/dangerAlert.ts b/src/frontend/components/alert/lib/dangerAlert.ts new file mode 100644 index 000000000..af77e65f3 --- /dev/null +++ b/src/frontend/components/alert/lib/dangerAlert.ts @@ -0,0 +1,17 @@ +import { AlertBase } from "./alertBase"; + +export class DangerAlert extends AlertBase { + /** + * Create an instance of InfoAlert. + * This class extends AlertBase to provide a specific implementation for info alerts. + * It uses the 'info' alert type for styling and behavior. + * @class + * @public + * @memberof alert.lib + * @constructor + * @param {string} message - The message to be displayed in the alert. + */ + constructor(message: string) { + super(message, 'danger'); + } +} diff --git a/src/frontend/components/alert/lib/infoAlert.test.ts b/src/frontend/components/alert/lib/infoAlert.test.ts new file mode 100644 index 000000000..8f9bb52be --- /dev/null +++ b/src/frontend/components/alert/lib/infoAlert.test.ts @@ -0,0 +1,18 @@ +import { describe, it, expect } from '@jest/globals'; +import { InfoAlert } from './infoAlert'; + +describe('Info Alert Tests', () => { + it('should display an info alert with the correct message', () => { + const infoMessage = 'This is a test info message'; + const infoAlert = new InfoAlert(infoMessage); + + const alert = infoAlert.render(); + + document.body.appendChild(alert); + + expect(alert.classList.contains('alert-info')).toBeTruthy(); + expect(alert.textContent).toContain(infoMessage); + + document.body.removeChild(alert); + }); +}); diff --git a/src/frontend/components/alert/lib/infoAlert.ts b/src/frontend/components/alert/lib/infoAlert.ts new file mode 100644 index 000000000..6a9214dbb --- /dev/null +++ b/src/frontend/components/alert/lib/infoAlert.ts @@ -0,0 +1,17 @@ +import { AlertBase } from './alertBase'; + +export class InfoAlert extends AlertBase { + /** + * Create an instance of InfoAlert. + * This class extends AlertBase to provide a specific implementation for info alerts. + * It uses the AlertType.INFO to set the alert type. + * @class + * @public + * @memberof alert.lib + * @constructor + * @param {string} message - The message to be displayed in the info alert. + */ + constructor(message: string) { + super(message, "info"); + } +} \ No newline at end of file diff --git a/src/frontend/components/alert/lib/successAlert.test.ts b/src/frontend/components/alert/lib/successAlert.test.ts new file mode 100644 index 000000000..fde8cca1d --- /dev/null +++ b/src/frontend/components/alert/lib/successAlert.test.ts @@ -0,0 +1,18 @@ +import { describe, it, expect } from '@jest/globals'; +import { SuccessAlert } from './successAlert'; + +describe('Success Alert Tests', () => { + it('should create a success alert', () => { + const message = 'Operation completed successfully'; + const alert = new SuccessAlert(message); + + const result = alert.render(); + + document.body.appendChild(result); + + expect(result.classList.contains('alert-success')).toBeTruthy(); + expect(result.textContent).toBe(message); + + document.body.removeChild(result); + }); +}); diff --git a/src/frontend/components/alert/lib/successAlert.ts b/src/frontend/components/alert/lib/successAlert.ts new file mode 100644 index 000000000..ee49396b6 --- /dev/null +++ b/src/frontend/components/alert/lib/successAlert.ts @@ -0,0 +1,17 @@ +import { AlertBase } from "./alertBase"; + +export class SuccessAlert extends AlertBase { + /** + * Create an instance of InfoAlert. + * This class extends AlertBase to provide a specific implementation for info alerts. + * It uses the 'info' alert type for styling and behavior. + * @class + * @public + * @memberof alert.lib + * @constructor + * @param {string} message - The message to be displayed in the alert. + */ + constructor(message: string) { + super(message, 'success', true); + } +} diff --git a/src/frontend/components/alert/lib/types/index.ts b/src/frontend/components/alert/lib/types/index.ts new file mode 100644 index 000000000..eecc79f02 --- /dev/null +++ b/src/frontend/components/alert/lib/types/index.ts @@ -0,0 +1 @@ +export type AlertType = 'info' | 'success' | 'warning' | 'danger'; diff --git a/src/frontend/components/alert/lib/warningAlert.test.ts b/src/frontend/components/alert/lib/warningAlert.test.ts new file mode 100644 index 000000000..abb4a6a0d --- /dev/null +++ b/src/frontend/components/alert/lib/warningAlert.test.ts @@ -0,0 +1,18 @@ +import { describe, it, expect } from '@jest/globals'; +import { WarningAlert } from './warningAlert'; + +describe('Warning Alert Tests', () => { + it('should create a warning alert', () => { + const message = 'This is a warning message'; + const alert = new WarningAlert(message); + + const result = alert.render(); + + document.body.appendChild(result); + + expect(result.classList.contains('alert-warning')).toBe(true); + expect(result.textContent).toBe(message); + + document.body.removeChild(result); + }); +}); diff --git a/src/frontend/components/alert/lib/warningAlert.ts b/src/frontend/components/alert/lib/warningAlert.ts new file mode 100644 index 000000000..2dce92e08 --- /dev/null +++ b/src/frontend/components/alert/lib/warningAlert.ts @@ -0,0 +1,17 @@ +import { AlertBase } from "./alertBase"; + +export class WarningAlert extends AlertBase { + /** + * Create an instance of InfoAlert. + * This class extends AlertBase to provide a specific implementation for info alerts. + * It uses the AlertType.INFO to set the alert type. + * @class + * @public + * @memberof alert.lib + * @constructor + * @param {string} message - The message to be displayed in the info alert. + */ + constructor(message: string) { + super(message, "warning"); + } +} diff --git a/src/frontend/components/button/lib/RenderableButton.test.ts b/src/frontend/components/button/lib/RenderableButton.test.ts new file mode 100644 index 000000000..a1421adf3 --- /dev/null +++ b/src/frontend/components/button/lib/RenderableButton.test.ts @@ -0,0 +1,45 @@ +import { describe, it, expect, jest } from '@jest/globals'; +import { RenderableButton } from './RenderableButton'; + +describe('Renderable Button Tests', () => { + it('should create a Renderable Button', () => { + const caption = 'Test Button'; + const button = new RenderableButton(caption, ()=>{}); + + const rendered = button.render(); + + document.body.appendChild(rendered); + + expect(rendered.textContent).toBe('Test Button'); + expect(rendered.classList.contains('btn')).toBeTruthy(); + expect(rendered.classList.contains('btn-default')).toBeTruthy(); + + document.body.removeChild(rendered); + }); + + it('should handle click events', () => { + const mockCallback = jest.fn(); + const button = new RenderableButton('Click Me', mockCallback); + + const rendered = button.render(); + document.body.appendChild(rendered); + + rendered.click(); + + expect(mockCallback).toHaveBeenCalled(); + + document.body.removeChild(rendered); + }); + + it('should apply custom classes', () => { + const button = new RenderableButton('Custom Class', ()=>{}, 'btn-custom'); + + const rendered = button.render(); + document.body.appendChild(rendered); + + expect(rendered.classList.contains('btn-custom')).toBeTruthy(); + expect(rendered.classList.contains('btn-default')).toBeFalsy(); + + document.body.removeChild(rendered); + }); +}); \ No newline at end of file diff --git a/src/frontend/components/button/lib/RenderableButton.ts b/src/frontend/components/button/lib/RenderableButton.ts new file mode 100644 index 000000000..b8004011a --- /dev/null +++ b/src/frontend/components/button/lib/RenderableButton.ts @@ -0,0 +1,21 @@ +import { Renderable } from "util/renderable"; + +export class RenderableButton implements Renderable { + classList: string[] = []; + + constructor(private readonly text: string, private readonly onClick: (ev: MouseEvent)=>void, ...classList: string[]) { + this.classList = classList; + } + + render(): HTMLButtonElement { + const button = document.createElement('button'); + button.textContent = this.text; + button.addEventListener('click', this.onClick); + button.classList.add(...this.classList, 'btn'); + const btnType = this.classList.find(b=>b.startsWith('btn-')) ? '' : 'btn-default' + if(btnType) { + button.classList.add(btnType); + } + return button; + } +} diff --git a/src/frontend/components/form-group/autosave/_autosave.scss b/src/frontend/components/form-group/autosave/_autosave.scss index 8011cead7..6989a0278 100644 --- a/src/frontend/components/form-group/autosave/_autosave.scss +++ b/src/frontend/components/form-group/autosave/_autosave.scss @@ -29,4 +29,35 @@ li.li-error { font-size: 1.5em; margin-right: 0.5em; } +} + +// I don't know why this button wasn't hidden before, but it is now +#restoreValuesModal .btn-js-delete-values { + visibility: hidden; + display: none; +} + +.alert-restore { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + + p { + flex-grow: 1; + } + + // TODO: This will be moved over to BS5 on merge - remember, syntax is _completely_ different + .btn-alert-restore { + @include button-variant($white, $brand-secundary, $white, $brand-primary, $brand-secundary, $brand-secundary); + color: $brand-secundary; + + &:hover { + color: $brand-primary; + } + } + + .btn-alert-restore-cancel { + @extend .btn-danger; + } } \ No newline at end of file diff --git a/src/frontend/components/form-group/autosave/index.js b/src/frontend/components/form-group/autosave/index.js index efd08884b..769c7822e 100644 --- a/src/frontend/components/form-group/autosave/index.js +++ b/src/frontend/components/form-group/autosave/index.js @@ -4,19 +4,23 @@ import AutosaveModal from './lib/modal'; import gadsStorage from 'util/gadsStorage'; export default (scope) => { - if (gadsStorage.enabled) { - try { - initializeComponent(scope, '.linkspace-field', AutosaveComponent); - initializeComponent(scope, '#restoreValuesModal', AutosaveModal); - } catch(e) { - console.error(e); + // Ensure the autosave functionality is only initialized on record pages. + // This is to deactivate autosave on other pages that may use the form-edit class + if(location.pathname.match(/record/)) { + if (gadsStorage.enabled) { + try { + initializeComponent(scope, '.linkspace-field', AutosaveComponent); + initializeComponent(scope, '#restoreValuesModal', AutosaveModal); + } catch(e) { + console.error(e); + if($('body').data('encryption-disabled')) return; + $('.content-block__main-content').prepend('
Auto-recover failed to initialize. ' + e.message ? e.message : e + '
'); + $('body').data('encryption-disabled', 'true'); + } + } else { if($('body').data('encryption-disabled')) return; - $('.content-block__main-content').prepend('
Auto-recover failed to initialize. ' + e.message ? e.message : e + '
'); + $('.content-block__main-content').prepend('
Auto-recover is disabled as your browser does not support encryption
'); $('body').data('encryption-disabled', 'true'); } - } else { - if($('body').data('encryption-disabled')) return; - $('.content-block__main-content').prepend('
Auto-recover is disabled as your browser does not support encryption
'); - $('body').data('encryption-disabled', 'true'); } }; diff --git a/src/frontend/components/form-group/autosave/lib/modal.js b/src/frontend/components/form-group/autosave/lib/modal.js index 95638700c..32e12324b 100644 --- a/src/frontend/components/form-group/autosave/lib/modal.js +++ b/src/frontend/components/form-group/autosave/lib/modal.js @@ -1,6 +1,8 @@ import { setFieldValues } from "set-field-values"; import AutosaveBase from './autosaveBase'; import { fromJson } from "util/common"; +import { InfoAlert } from "components/alert/lib/infoAlert"; +import { RenderableButton } from "components/button/lib/RenderableButton"; /** * A modal that allows the user to restore autosaved values. @@ -33,10 +35,12 @@ class AutosaveModal extends AutosaveBase { let $list = $("
    "); const $body = $modal.find(".modal-body"); - $body.html("

    Restoring values...

    Please be aware that linked records may take a moment to finish restoring.

    ").append($list); + $body + .html("

    Restoring values...

    Please be aware that linked records may take a moment to finish restoring.

    ") + .append($list); // Convert the fields to promise functions (using the fields) that are run in parallel // This is only done because various parts of the codebase use the fields in different ways dependent on types (i.e. curval) - Promise.all($form.find('.linkspace-field').map(async (_, field) => { + await Promise.all($form.find('.linkspace-field').map(async (_, field) => { const $field = $(field); // This was originally a bunch of promises, but as the code is async, we can await things here try { @@ -103,7 +107,7 @@ class AutosaveModal extends AutosaveBase { $body.append(`

    Critical error restoring values

    ${e}

    `); }).finally(() => { // Only allow to close once recovery is finished - if(!curvalCount || errored) { + if (!curvalCount || errored) { // Show the close button $modal.find(".modal-footer").find(".btn-cancel").text("Close").show(); this.storage.removeItem('recovering'); @@ -114,10 +118,49 @@ class AutosaveModal extends AutosaveBase { // Do we need to run an autorecover? const item = await this.storage.getItem(this.table_key); - if (item) { - $modal.modal('show'); - $modal.find('.btn-js-delete-values').attr('disabled', 'disabled').hide(); - } + // If there is no item, or there are already alerts, do not show the alert + if ($('.alert-danger').text() || $('.alert-warning').text() || !item) return; + const alert = new InfoAlert("There are unsaved values from the last time you edited this record. Would you like to preview the changes?"); + const alertElement = alert.render(); + + alertElement.classList.add('alert-restore'); + + const restoreButton = new RenderableButton("Preview", () => { + const $display = $modal.find(".modal-autosave") + const list = $("
  • "); + // Get a list of the field values to restore + Promise.all($form.find('.linkspace-field').map(async (_, field)=>{ + const $field = $(field); + const key = this.columnKey($field); + const value = await this.storage.getItem(key) + if(!value) return; + const fieldName = $field.data('name'); + const li = $(`
  • ${fieldName}
  • `) + list.append(li); + })).then(()=> { + // Append the list to the modal display + $display.append(list) + }).then(()=>{ + // Show the modal + $modal.modal('show'); + alert.hide(); + }); + }, 'btn-primary', 'btn-inverted', 'btn-alert-restore'); + const restoreButtonElement = restoreButton.render(); + + const cancelButton = new RenderableButton("Cancel", () => { + alert.hide(); + }, 'btn-secondary', 'btn-inverted', 'btn-alert-restore-cancel'); + const cancelButtonElement = cancelButton.render(); + + const buttonDiv = document.createElement('div'); + buttonDiv.className = 'button-group d-flex justify-content-end'; + buttonDiv.appendChild(restoreButtonElement); + buttonDiv.appendChild(cancelButtonElement); + + alertElement.appendChild(buttonDiv); + + $('.content-block').prepend(alertElement); } } diff --git a/src/frontend/js/lib/util/renderable/index.ts b/src/frontend/js/lib/util/renderable/index.ts new file mode 100644 index 000000000..8cbafad73 --- /dev/null +++ b/src/frontend/js/lib/util/renderable/index.ts @@ -0,0 +1,2 @@ +export { Renderable } from "./lib/Renderable"; +export { Hidable } from "./lib/Hidable"; \ No newline at end of file diff --git a/src/frontend/js/lib/util/renderable/lib/Hidable.ts b/src/frontend/js/lib/util/renderable/lib/Hidable.ts new file mode 100644 index 000000000..1a9da787e --- /dev/null +++ b/src/frontend/js/lib/util/renderable/lib/Hidable.ts @@ -0,0 +1,20 @@ +/** + * Hidable class for managing visibility of HTML elements. + * This class provides methods to hide an element by setting its display and visibility styles, + * and updating its ARIA attributes. + * + * @template T - The type of the HTML element, defaulting to HTMLElement. + * @abstract + * @class Hidable + */ +export abstract class Hidable { + protected element: T | null = null; + + /** + * Hides the component. + */ + hide(): void { + if(!this.element) return; + this.element.remove(); + } +} \ No newline at end of file diff --git a/src/frontend/js/lib/util/renderable/lib/Renderable.ts b/src/frontend/js/lib/util/renderable/lib/Renderable.ts new file mode 100644 index 000000000..650735e3c --- /dev/null +++ b/src/frontend/js/lib/util/renderable/lib/Renderable.ts @@ -0,0 +1,26 @@ +/** + * Renderable interface for defining renderable components. + * This interface requires a render method that returns an HTML element or a jQuery-wrapped element. + * It also includes a renderAsync method that returns a Promise resolving to the same type. + * + * @template T - The type of the HTML element to be rendered, defaulting to HTMLElement. + * @interface Renderable + * @property {function(): T | JQuery} render - Synchronous render method. + * @property {function(): Promise>} renderAsync - Asynchronous render method returning a Promise. + * + * @example + * class MyComponent implements Renderable { + * render(): HTMLDivElement { + * const div = document.createElement('div'); + * div.textContent = 'Hello, World!'; + * return div; + * } + * } + */ +export interface Renderable { + /** + * Synchronous render method that returns an HTML element or a jQuery-wrapped element. + * @returns {T} The rendered HTML element or jQuery-wrapped element. + */ + render(): T; +} \ No newline at end of file diff --git a/views/edit.tt b/views/edit.tt index 0c3de8e13..e99bceac4 100755 --- a/views/edit.tt +++ b/views/edit.tt @@ -349,10 +349,7 @@ [% IF editable AND NOT edit_modal; - modal_description = "There are unsaved values from the last time you edited - " _ layout.record_name_with_article _ ". Would you like to restore the - values into this " _ layout.record_name _ "? The values will not be saved - until you submit this " _ layout.record_name _ "."; + modal_description = "Would you like to restore values to the following fields? The values will not be saved until you submit this " _ layout.record_name _ "."; INCLUDE wizard/restore_values.tt modalId = "restoreValuesModal" From f0423793dbf9a01df30dc7c123822e83492fb955 Mon Sep 17 00:00:00 2001 From: Andy Beverley Date: Fri, 6 Feb 2026 17:27:42 +0000 Subject: [PATCH 6/9] Updated to default to "all" view on view all button click (D795) --- lib/GADS.pm | 6 +++++- lib/GADS/API.pm | 2 +- src/frontend/css/stylesheets/base/_global.scss | 3 +++ views/navigation/records_top_bar.tt | 16 +++++++++++++--- views/snippets/datum.tt | 4 ++-- 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/lib/GADS.pm b/lib/GADS.pm index e00a7a710..9592bb03b 100644 --- a/lib/GADS.pm +++ b/lib/GADS.pm @@ -2675,13 +2675,17 @@ prefix '/:layout_name' => sub { if (query_parameters->get('curval_record_id')) { + my $curval = schema->resultset('Layout')->find(query_parameters->get('curval_layout_id')); $params->{curval_layout_id} = query_parameters->get('curval_layout_id'); $params->{curval_record_id} = query_parameters->get('curval_record_id'); + $params->{parent_record_id} = query_parameters->get('parent_record_id'); + $params->{parent_field_name} = $curval->name; + $params->{hide_view_menu} = 1; } my $records = GADS::Records->new(%params); - $records->view($view); + $records->view(query_parameters->get('curval_record_id') ? undef : $view); $records->rows($rows); $records->page($page); $records->sort(session 'sort'); diff --git a/lib/GADS/API.pm b/lib/GADS/API.pm index 515b727f5..fc1be173f 100644 --- a/lib/GADS/API.pm +++ b/lib/GADS/API.pm @@ -1092,7 +1092,7 @@ sub _get_records { my $sheetname = param 'sheet'; my $user = logged_in_user; my $layout = var('instances')->layout_by_shortname($sheetname); # borks on not found - my $view = current_view($user, $layout); + my $view = query_parameters->get('curval_record_id') ? undef : current_view($user, $layout); # Allow parameters to be passed by URL query or in the body. Flatten into # one parameters object diff --git a/src/frontend/css/stylesheets/base/_global.scss b/src/frontend/css/stylesheets/base/_global.scss index 349325f36..58486d675 100644 --- a/src/frontend/css/stylesheets/base/_global.scss +++ b/src/frontend/css/stylesheets/base/_global.scss @@ -110,4 +110,7 @@ table.table-bordered { @extend .pb-2; @extend .border-bottom } + +.text-primary { + color: $brand-secundary !important; } diff --git a/views/navigation/records_top_bar.tt b/views/navigation/records_top_bar.tt index 509280de4..070bc5b47 100644 --- a/views/navigation/records_top_bar.tt +++ b/views/navigation/records_top_bar.tt @@ -2,9 +2,15 @@
      + [% IF hide_view_menu %] +
    • +

      Records from field "[% parent_field_name | html %]" on record [% parent_record_id | html %]

      +
    • + [% ELSE %]
    • [% INCLUDE navigation/dropdown_select_view.tt %]
    • + [% END %]
    • [% @@ -49,14 +55,18 @@ INCLUDE navigation/dropdown_view_limits.tt; END; - INCLUDE navigation/dropdown_manage_views.tt; + UNLESS hide_view_menu; + INCLUDE navigation/dropdown_manage_views.tt; + END; IF viewtype == "graph"; INCLUDE navigation/dropdown_manage_graphs.tt; END; - INCLUDE navigation/dropdown_actions.tt; - + UNLESS hide_view_menu; + INCLUDE navigation/dropdown_actions.tt; + END; + IF page == "data_timeline" AND ! layout.no_download_pdf; INCLUDE navigation/dropdown_download_timeline.tt; END; diff --git a/views/snippets/datum.tt b/views/snippets/datum.tt index 8f67f77b3..ee6252871 100644 --- a/views/snippets/datum.tt +++ b/views/snippets/datum.tt @@ -37,8 +37,8 @@ [% ELSE %] [% curval.links.size %] [% END %] - row[%IF curval.links.size != 1%]s[%END%]. - view all)

      + row[%IF curval.links.size != 1%]s[%END%].| + view all)

      [% END %] [% END %] From 37b5f346cfa3d125faceaa61bca70a84635eff2a Mon Sep 17 00:00:00 2001 From: Andy Beverley Date: Fri, 6 Feb 2026 17:37:00 +0000 Subject: [PATCH 7/9] Fix syntax error from manual merge --- src/frontend/css/stylesheets/base/_global.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/frontend/css/stylesheets/base/_global.scss b/src/frontend/css/stylesheets/base/_global.scss index 58486d675..df36878f3 100644 --- a/src/frontend/css/stylesheets/base/_global.scss +++ b/src/frontend/css/stylesheets/base/_global.scss @@ -110,6 +110,7 @@ table.table-bordered { @extend .pb-2; @extend .border-bottom } +} .text-primary { color: $brand-secundary !important; From 8ca5bbce8b0d5dbc056df5206962419aa662b224 Mon Sep 17 00:00:00 2001 From: Andy Beverley Date: Fri, 6 Feb 2026 17:41:04 +0000 Subject: [PATCH 8/9] Rebuild JS and CSS --- public/css/general.css | 2 +- ...7b61c6ba25c1b1510409.js => filter.3f99116a0ed43159859a.js} | 2 +- public/js/site.js | 2 +- views/layouts/main.tt | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) rename public/js/{filter.7b61c6ba25c1b1510409.js => filter.3f99116a0ed43159859a.js} (68%) diff --git a/public/css/general.css b/public/css/general.css index 7a789b3bf..f3c243fd4 100644 --- a/public/css/general.css +++ b/public/css/general.css @@ -10,4 +10,4 @@ div.dt-rowReorder-float-parent{table-layout:fixed;outline:2px solid #0275d8;z-in * Copyright 2011-2022 The Bootstrap Authors * Copyright 2011-2022 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--blue: #3B3AF2;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #E30036;--orange: #fd7e14;--yellow: #ffc107;--green: #18856B;--teal: #20c997;--cyan: #007C88;--white: #FFF;--gray: #6c757d;--gray-dark: #343a40;--primary: #3B3AF2;--secondary: #6c757d;--success: #18856B;--info: #007C88;--warning: #FFBB01;--danger: #E30036;--light: #f8f9fa;--dark: #343a40;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:"Open Sans",Helvetica,Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.35;color:#40374a;text-align:left;background-color:#f9f9f9}[tabindex="-1"]:focus:not(:focus-visible){outline:0 !important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:#007c88;text-decoration:none;background-color:rgba(0,0,0,0)}a:hover{color:#007c88;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:1rem;padding-bottom:1rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:.5rem;font-weight:600;line-height:1.35;color:#504d6c}h1,.h1{font-size:1.563rem}h2,.h2{font-size:1.125rem}h3,.h3{font-size:1rem}h4,.h4{font-size:0.875rem}h5,.h5{font-size:0.75rem}h6,.h6{font-size:0.625rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.35}.display-2{font-size:5.5rem;font-weight:300;line-height:1.35}.display-3{font-size:4.5rem;font-weight:300;line-height:1.35}.display-4{font-size:3.5rem;font-weight:300;line-height:1.35}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}small,.small{font-size:0.875em;font-weight:400}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#f9f9f9;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-xl,.container-lg,.container-md,.container-sm{width:100%;padding-right:.5rem;padding-left:.5rem;margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-right:-0.5rem;margin-left:-0.5rem}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col-xl,.col-xl-auto,.col-xl-12,.col-xl-11,.col-xl-10,.col-xl-9,.col-xl-8,.col-xl-7,.col-xl-6,.col-xl-5,.col-xl-4,.col-xl-3,.col-xl-2,.col-xl-1,.col-lg,.col-lg-auto,.col-lg-12,.col-lg-11,.col-lg-10,.col-lg-9,.col-lg-8,.col-lg-7,.col-lg-6,.col-lg-5,.col-lg-4,.col-lg-3,.col-lg-2,.col-lg-1,.col-md,.col-md-auto,.col-md-12,.col-md-11,.col-md-10,.col-md-9,.col-md-8,.col-md-7,.col-md-6,.col-md-5,.col-md-4,.col-md-3,.col-md-2,.col-md-1,.col-sm,.col-sm-auto,.col-sm-12,.col-sm-11,.col-sm-10,.col-sm-9,.col-sm-8,.col-sm-7,.col-sm-6,.col-sm-5,.col-sm-4,.col-sm-3,.col-sm-2,.col-sm-1,.col,.col-auto,.col-12,.col-11,.col-10,.col-9,.col-8,.col-7,.col-6,.col-5,.col-4,.col-3,.col-2,.col-1{position:relative;width:100%;padding-right:.5rem;padding-left:.5rem}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media(min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media(min-width: 768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media(min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media(min-width: 1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{width:100%;margin-bottom:1rem;color:#40374a;background-color:#fff}.table th,.table td{padding:1rem;vertical-align:top;border-top:1px solid #f9f9f9}.table thead th{vertical-align:bottom;border-bottom:2px solid #f9f9f9}.table tbody+tbody{border-top:2px solid #f9f9f9}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #f9f9f9}.table-bordered th,.table-bordered td{border:1px solid #f9f9f9}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover tbody tr:hover{color:#40374a;background-color:rgba(0,124,136,.2)}.table-primary,.table-primary>th,.table-primary>td{background-color:#c8c8fb}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#9999f8}.table-hover .table-primary:hover{background-color:#b0b0f9}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b0b0f9}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#d6d8db}.table-secondary th,.table-secondary td,.table-secondary thead th,.table-secondary tbody+tbody{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>th,.table-success>td{background-color:#beddd6}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#87c0b2}.table-hover .table-success:hover{background-color:#add4cb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#add4cb}.table-info,.table-info>th,.table-info>td{background-color:#b8dade}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#7abbc1}.table-hover .table-info:hover{background-color:#a7d1d6}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#a7d1d6}.table-warning,.table-warning>th,.table-warning>td{background-color:#ffecb8}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#ffdc7b}.table-hover .table-warning:hover{background-color:#ffe59f}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe59f}.table-danger,.table-danger>th,.table-danger>td{background-color:#f7b8c7}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#f07a96}.table-hover .table-danger:hover{background-color:#f4a1b5}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f4a1b5}.table-light,.table-light>th,.table-light>td{background-color:#fdfdfe}.table-light th,.table-light td,.table-light thead th,.table-light tbody+tbody{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>th,.table-dark>td{background-color:#c6c8ca}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,124,136,.2)}.table-hover .table-active:hover{background-color:rgba(0,101,111,.2)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,101,111,.2)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#f9f9f9}.table-dark{color:#fff;background-color:#343a40}.table-dark th,.table-dark td,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media(max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media(max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media(max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media(max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.35em + 0.75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.35;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:5px;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:rgba(0,0,0,0);border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#b2b2fa;outline:0;box-shadow:0 0 0 .2rem rgba(59,58,242,.25)}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.35}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.125rem;line-height:1.5}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.35;color:#40374a;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + 0.5rem + 2px);padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:2rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#18856b}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.35;color:#fff;background-color:rgba(24,133,107,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#18856b;padding-right:calc(1.35em + 0.75rem) !important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2318856B' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.3375em + 0.1875rem) center;background-size:calc(0.675em + 0.375rem) calc(0.675em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#18856b;box-shadow:0 0 0 .2rem rgba(24,133,107,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:3rem !important;background-position:right 1.5rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.35em + 0.75rem);background-position:top calc(0.3375em + 0.1875rem) right calc(0.3375em + 0.1875rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#18856b;padding-right:calc(0.75em + 2.3125rem) !important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2318856B' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(0.675em + 0.375rem) calc(0.675em + 0.375rem) no-repeat}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#18856b;box-shadow:0 0 0 .2rem rgba(24,133,107,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#18856b}.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip,.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip{display:block}.was-validated .custom-control-input:valid~.custom-control-label,.custom-control-input.is-valid~.custom-control-label{color:#18856b}.was-validated .custom-control-input:valid~.custom-control-label::before,.custom-control-input.is-valid~.custom-control-label::before{border-color:#18856b}.was-validated .custom-control-input:valid:checked~.custom-control-label::before,.custom-control-input.is-valid:checked~.custom-control-label::before{border-color:#20b08e;background-color:#20b08e}.was-validated .custom-control-input:valid:focus~.custom-control-label::before,.custom-control-input.is-valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(24,133,107,.25)}.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before{border-color:#18856b}.was-validated .custom-file-input:valid~.custom-file-label,.custom-file-input.is-valid~.custom-file-label{border-color:#18856b}.was-validated .custom-file-input:valid:focus~.custom-file-label,.custom-file-input.is-valid:focus~.custom-file-label{border-color:#18856b;box-shadow:0 0 0 .2rem rgba(24,133,107,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#e30036}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.35;color:#fff;background-color:rgba(227,0,54,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#e30036;padding-right:calc(1.35em + 0.75rem) !important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23E30036' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23E30036' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.3375em + 0.1875rem) center;background-size:calc(0.675em + 0.375rem) calc(0.675em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#e30036;box-shadow:0 0 0 .2rem rgba(227,0,54,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:3rem !important;background-position:right 1.5rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.35em + 0.75rem);background-position:top calc(0.3375em + 0.1875rem) right calc(0.3375em + 0.1875rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#e30036;padding-right:calc(0.75em + 2.3125rem) !important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23E30036' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23E30036' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(0.675em + 0.375rem) calc(0.675em + 0.375rem) no-repeat}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#e30036;box-shadow:0 0 0 .2rem rgba(227,0,54,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#e30036}.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip,.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip{display:block}.was-validated .custom-control-input:invalid~.custom-control-label,.custom-control-input.is-invalid~.custom-control-label{color:#e30036}.was-validated .custom-control-input:invalid~.custom-control-label::before,.custom-control-input.is-invalid~.custom-control-label::before{border-color:#e30036}.was-validated .custom-control-input:invalid:checked~.custom-control-label::before,.custom-control-input.is-invalid:checked~.custom-control-label::before{border-color:#ff174e;background-color:#ff174e}.was-validated .custom-control-input:invalid:focus~.custom-control-label::before,.custom-control-input.is-invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(227,0,54,.25)}.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before{border-color:#e30036}.was-validated .custom-file-input:invalid~.custom-file-label,.custom-file-input.is-invalid~.custom-file-label{border-color:#e30036}.was-validated .custom-file-input:invalid:focus~.custom-file-label,.custom-file-input.is-invalid:focus~.custom-file-label{border-color:#e30036;box-shadow:0 0 0 .2rem rgba(227,0,54,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media(min-width: 576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#40374a;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);padding:.375rem .75rem;font-size:1rem;line-height:1.35;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#40374a;text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:0 0 0 .2rem rgba(59,58,242,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#3b3af2;border-color:#3b3af2}.btn-primary:hover{color:#fff;background-color:#1716f0;border-color:#110fea}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#1716f0;border-color:#110fea;box-shadow:0 0 0 .2rem rgba(88,88,244,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#3b3af2;border-color:#3b3af2}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#110fea;border-color:#100fde}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(88,88,244,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary:focus,.btn-secondary.focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#18856b;border-color:#18856b}.btn-success:hover{color:#fff;background-color:#126551;border-color:#105a48}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#126551;border-color:#105a48;box-shadow:0 0 0 .2rem rgba(59,151,129,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#18856b;border-color:#18856b}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#105a48;border-color:#0e4f40}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(59,151,129,.5)}.btn-info{color:#fff;background-color:#007c88;border-color:#007c88}.btn-info:hover{color:#fff;background-color:#005962;border-color:#004e55}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#005962;border-color:#004e55;box-shadow:0 0 0 .2rem rgba(38,144,154,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#007c88;border-color:#007c88}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#004e55;border-color:#004248}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,144,154,.5)}.btn-warning{color:#212529;background-color:#ffbb01;border-color:#ffbb01}.btn-warning:hover{color:#212529;background-color:#da9f00;border-color:#cd9600}.btn-warning:focus,.btn-warning.focus{color:#212529;background-color:#da9f00;border-color:#cd9600;box-shadow:0 0 0 .2rem rgba(222,165,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffbb01;border-color:#ffbb01}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#cd9600;border-color:#c08d00}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,165,7,.5)}.btn-danger{color:#fff;background-color:#e30036;border-color:#e30036}.btn-danger:hover{color:#fff;background-color:#bd002d;border-color:#b0002a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#bd002d;border-color:#b0002a;box-shadow:0 0 0 .2rem rgba(231,38,84,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#e30036;border-color:#e30036}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b0002a;border-color:#a30027}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(231,38,84,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light:focus,.btn-light.focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark:focus,.btn-dark.focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#3b3af2;border-color:#3b3af2}.btn-outline-primary:hover{color:#fff;background-color:#3b3af2;border-color:#3b3af2}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 .2rem rgba(59,58,242,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#3b3af2;background-color:rgba(0,0,0,0)}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#3b3af2;border-color:#3b3af2}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(59,58,242,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:rgba(0,0,0,0)}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#18856b;border-color:#18856b}.btn-outline-success:hover{color:#fff;background-color:#18856b;border-color:#18856b}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 .2rem rgba(24,133,107,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#18856b;background-color:rgba(0,0,0,0)}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#18856b;border-color:#18856b}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(24,133,107,.5)}.btn-outline-info{color:#007c88;border-color:#007c88}.btn-outline-info:hover{color:#fff;background-color:#007c88;border-color:#007c88}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 .2rem rgba(0,124,136,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#007c88;background-color:rgba(0,0,0,0)}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#007c88;border-color:#007c88}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,124,136,.5)}.btn-outline-warning{color:#ffbb01;border-color:#ffbb01}.btn-outline-warning:hover{color:#212529;background-color:#ffbb01;border-color:#ffbb01}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 .2rem rgba(255,187,1,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffbb01;background-color:rgba(0,0,0,0)}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffbb01;border-color:#ffbb01}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,187,1,.5)}.btn-outline-danger{color:#e30036;border-color:#e30036}.btn-outline-danger:hover{color:#fff;background-color:#e30036;border-color:#e30036}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 .2rem rgba(227,0,54,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#e30036;background-color:rgba(0,0,0,0)}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#e30036;border-color:#e30036}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(227,0,54,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:rgba(0,0,0,0)}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:rgba(0,0,0,0)}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007c88;text-decoration:none}.btn-link:hover{color:#007c88;text-decoration:underline}.btn-link:focus,.btn-link.focus{text-decoration:underline}.btn-link:disabled,.btn-link.disabled{color:#6c757d;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.width{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.width{transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#40374a;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=top],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:hover,.dropdown-item:focus{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#3b3af2}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:0.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-control-plaintext,.input-group>.custom-select,.input-group>.custom-file{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.form-control-plaintext+.form-control,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus~.custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.form-control:not(:last-child),.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-prepend,.input-group-append{display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-append .btn:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.35;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:5px}.input-group-text input[type=radio],.input-group-text input[type=checkbox]{margin-top:0}.input-group-lg>.form-control:not(textarea),.input-group-lg>.custom-select{height:calc(1.5em + 1rem + 2px)}.input-group-lg>.form-control,.input-group-lg>.custom-select,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + 0.5rem + 2px)}.input-group-sm>.form-control,.input-group-sm>.custom-select,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.35rem;padding-left:1.5rem;print-color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.175rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#3b3af2;background-color:#3b3af2}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(59,58,242,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#b2b2fa}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#e2e1fd;border-color:#e2e1fd}.custom-control-input[disabled]~.custom-control-label,.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input[disabled]~.custom-control-label::before,.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.175rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:1px solid #adb5bd}.custom-control-label::after{position:absolute;top:.175rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23FFF' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#3b3af2;background-color:#3b3af2}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23FFF' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(59,58,242,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(59,58,242,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23FFF'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(59,58,242,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(0.175rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;transform:translateX(0.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(59,58,242,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.35em + 0.75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.35;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#b2b2fa;outline:0;box-shadow:0 0 0 .2rem rgba(59,58,242,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + 0.5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.125rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.35em + 0.75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.35em + 0.75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#b2b2fa;box-shadow:0 0 0 .2rem rgba(59,58,242,.25)}.custom-file-input[disabled]~.custom-file-label,.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.35em + 0.75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.35;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:5px}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.35em + 0.75rem);padding:.375rem .75rem;line-height:1.35;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 5px 5px 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:rgba(0,0,0,0);-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #f9f9f9,0 0 0 .2rem rgba(59,58,242,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #f9f9f9,0 0 0 .2rem rgba(59,58,242,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #f9f9f9,0 0 0 .2rem rgba(59,58,242,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#3b3af2;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#e2e1fd}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dee2e6;border-color:rgba(0,0,0,0);border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#3b3af2;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#e2e1fd}.custom-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dee2e6;border-color:rgba(0,0,0,0);border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#3b3af2;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#e2e1fd}.custom-range::-ms-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0);border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#f9f9f9;border-color:#dee2e6 #dee2e6 #f9f9f9}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#3b3af2}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-sm,.navbar .container-md,.navbar .container-lg,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.415625rem;padding-bottom:.415625rem;margin-right:1rem;font-size:1.125rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.125rem;line-height:1;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);border-radius:.25rem}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media(max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media(max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media(max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media(max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(0.25rem - 1px);border-bottom-left-radius:calc(0.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(0.25rem - 1px)}.card-img,.card-img-top,.card-img-bottom{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(0.25rem - 1px);border-bottom-left-radius:calc(0.25rem - 1px)}.card-deck .card{margin-bottom:.5rem}@media(min-width: 576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-0.5rem;margin-left:-0.5rem}.card-deck .card{flex:1 0 0%;margin-right:.5rem;margin-bottom:0;margin-left:.5rem}}.card-group>.card{margin-bottom:.5rem}@media(min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media(min-width: 576px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007c88;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#007c88;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(59,58,242,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#3b3af2;border-color:#3b3af2}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.125rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.badge{transition:none}}a.badge:hover,a.badge:focus{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#3b3af2}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#110fea}a.badge-primary:focus,a.badge-primary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(59,58,242,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:hover,a.badge-secondary:focus{color:#fff;background-color:#545b62}a.badge-secondary:focus,a.badge-secondary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#18856b}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#105a48}a.badge-success:focus,a.badge-success.focus{outline:0;box-shadow:0 0 0 .2rem rgba(24,133,107,.5)}.badge-info{color:#fff;background-color:#007c88}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#004e55}a.badge-info:focus,a.badge-info.focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,124,136,.5)}.badge-warning{color:#212529;background-color:#ffbb01}a.badge-warning:hover,a.badge-warning:focus{color:#212529;background-color:#cd9600}a.badge-warning:focus,a.badge-warning.focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,187,1,.5)}.badge-danger{color:#fff;background-color:#e30036}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#b0002a}a.badge-danger:focus,a.badge-danger.focus{outline:0;box-shadow:0 0 0 .2rem rgba(227,0,54,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:hover,a.badge-light:focus{color:#212529;background-color:#dae0e5}a.badge-light:focus,a.badge-light.focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#1d2124}a.badge-dark:focus,a.badge-dark.focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media(min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:0 solid rgba(0,0,0,0);border-radius:0}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#3b3af2;background-color:#3b3af2;border-color:#5a5af4}.alert-primary hr{border-top-color:#4242f2}.alert-primary .alert-link{color:#110fea}.alert-secondary{color:#6c757d;background-color:#6c757d;border-color:#848b92}.alert-secondary hr{border-top-color:#777e86}.alert-secondary .alert-link{color:#545b62}.alert-success{color:#18856b;background-color:#18856b;border-color:#3d9983}.alert-success hr{border-top-color:#368773}.alert-success .alert-link{color:#105a48}.alert-info{color:#007c88;background-color:#007c88;border-color:#29919b}.alert-info hr{border-top-color:#247e87}.alert-info .alert-link{color:#004e55}.alert-warning{color:#ffbb01;background-color:#ffbb01;border-color:#ffc62a}.alert-warning hr{border-top-color:#ffbf11}.alert-warning .alert-link{color:#cd9600}.alert-danger{color:#e30036;background-color:#e30036;border-color:#e72956}.alert-danger hr{border-top-color:#de1947}.alert-danger .alert-link{color:#b0002a}.alert-light{color:#f8f9fa;background-color:#f8f9fa;border-color:#f9fafb}.alert-light hr{border-top-color:#eaedf1}.alert-light .alert-link{color:#dae0e5}.alert-dark{color:#343a40;background-color:#343a40;border-color:#545a5f}.alert-dark hr{border-top-color:#484d51}.alert-dark .alert-link{color:#1d2124}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;line-height:0;font-size:0.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#3b3af2;transition:width .6s ease}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#40374a;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#3b3af2;border-color:#3b3af2}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#1f1e7e;background-color:#c8c8fb}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#1f1e7e;background-color:#b0b0f9}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#1f1e7e;border-color:#1f1e7e}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#0c4538;background-color:#beddd6}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#0c4538;background-color:#add4cb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0c4538;border-color:#0c4538}.list-group-item-info{color:#004047;background-color:#b8dade}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#004047;background-color:#a7d1d6}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#004047;border-color:#004047}.list-group-item-warning{color:#856101;background-color:#ffecb8}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#856101;background-color:#ffe59f}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856101;border-color:#856101}.list-group-item-danger{color:#76001c;background-color:#f7b8c7}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#76001c;background-color:#f4a1b5}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#76001c;border-color:#76001c}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{opacity:.75}button.close{padding:0;background-color:rgba(0,0,0,0);border:0}a.close.disabled{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:0.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-header,.modal-dialog-scrollable .modal-footer{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:rgba(112,112,112,.38)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:2rem 2rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.modal-header .close{padding:2rem 2rem;margin:-2rem -2rem -2rem auto}.modal-title{margin-bottom:0;line-height:1.35}.modal-body{position:relative;flex:1 1 auto;padding:2rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1.75rem;border-top:1px solid rgba(0,0,0,0);border-bottom-right-radius:calc(0.3rem - 1px);border-bottom-left-radius:calc(0.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media(min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media(min-width: 1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:"Open Sans",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.35;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^=top]{padding:.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^=top] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^=top] .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^=right]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^=right] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^=right] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^=bottom] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^=bottom] .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^=left]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^=left] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^=left] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:"Open Sans",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.35;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^=top]{margin-bottom:.5rem}.bs-popover-top>.arrow,.bs-popover-auto[x-placement^=top]>.arrow{bottom:calc(-0.5rem - 1px)}.bs-popover-top>.arrow::before,.bs-popover-auto[x-placement^=top]>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-top>.arrow::after,.bs-popover-auto[x-placement^=top]>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^=right]{margin-left:.5rem}.bs-popover-right>.arrow,.bs-popover-auto[x-placement^=right]>.arrow{left:calc(-0.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-right>.arrow::before,.bs-popover-auto[x-placement^=right]>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-right>.arrow::after,.bs-popover-auto[x-placement^=right]>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^=bottom]{margin-top:.5rem}.bs-popover-bottom>.arrow,.bs-popover-auto[x-placement^=bottom]>.arrow{top:calc(-0.5rem - 1px)}.bs-popover-bottom>.arrow::before,.bs-popover-auto[x-placement^=bottom]>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-bottom>.arrow::after,.bs-popover-auto[x-placement^=bottom]>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^=left]{margin-right:.5rem}.bs-popover-left>.arrow,.bs-popover-auto[x-placement^=left]>.arrow{right:calc(-0.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-left>.arrow::before,.bs-popover-auto[x-placement^=left]>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-left>.arrow::after,.bs-popover-auto[x-placement^=left]>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:#504d6c;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#40374a}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-left),.active.carousel-item-right{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-right),.active.carousel-item-left{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFF' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFF' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;border:.25em solid currentcolor;border-right-color:rgba(0,0,0,0);border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;background-color:currentcolor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#3b3af2 !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#110fea !important}.bg-secondary{background-color:#6c757d !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#545b62 !important}.bg-success{background-color:#18856b !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#105a48 !important}.bg-info{background-color:#007c88 !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#004e55 !important}.bg-warning{background-color:#ffbb01 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#cd9600 !important}.bg-danger{background-color:#e30036 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#b0002a !important}.bg-light{background-color:#f8f9fa !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#dae0e5 !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#1d2124 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:rgba(0,0,0,0) !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#3b3af2 !important}.border-secondary{border-color:#6c757d !important}.border-success{border-color:#18856b !important}.border-info{border-color:#007c88 !important}.border-warning{border-color:#ffbb01 !important}.border-danger{border-color:#e30036 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#343a40 !important}.border-white{border-color:#fff !important}.rounded-sm{border-radius:.2rem !important}.rounded{border-radius:.25rem !important}.rounded-top{border-top-left-radius:.25rem !important;border-top-right-radius:.25rem !important}.rounded-right{border-top-right-radius:.25rem !important;border-bottom-right-radius:.25rem !important}.rounded-bottom{border-bottom-right-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-left{border-top-left-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-lg{border-radius:.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}@media(min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}}@media(min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}}@media(min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}}@media(min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714286%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-fill{flex:1 1 auto !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}@media(min-width: 576px){.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}}@media(min-width: 768px){.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}}@media(min-width: 992px){.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}}@media(min-width: 1200px){.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media(min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media(min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media(min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media(min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.user-select-all{-webkit-user-select:all !important;-moz-user-select:all !important;user-select:all !important}.user-select-auto{-webkit-user-select:auto !important;-moz-user-select:auto !important;user-select:auto !important}.user-select-none{-webkit-user-select:none !important;-moz-user-select:none !important;user-select:none !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports(position: sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.min-vw-100{min-width:100vw !important}.min-vh-100{min-height:100vh !important}.vw-100{width:100vw !important}.vh-100{height:100vh !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.error-container.alert-danger .error-message::before,.px-2{padding-right:.5rem !important}.pb-2,.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-n1{margin:-0.25rem !important}.mt-n1,.my-n1{margin-top:-0.25rem !important}.mr-n1,.mx-n1{margin-right:-0.25rem !important}.mb-n1,.my-n1{margin-bottom:-0.25rem !important}.ml-n1,.mx-n1{margin-left:-0.25rem !important}.m-n2{margin:-0.5rem !important}.mt-n2,.my-n2{margin-top:-0.5rem !important}.mr-n2,.mx-n2{margin-right:-0.5rem !important}.mb-n2,.my-n2{margin-bottom:-0.5rem !important}.ml-n2,.mx-n2{margin-left:-0.5rem !important}.m-n3{margin:-1rem !important}.mt-n3,.my-n3{margin-top:-1rem !important}.mr-n3,.mx-n3{margin-right:-1rem !important}.mb-n3,.my-n3{margin-bottom:-1rem !important}.ml-n3,.mx-n3{margin-left:-1rem !important}.m-n4{margin:-1.5rem !important}.mt-n4,.my-n4{margin-top:-1.5rem !important}.mr-n4,.mx-n4{margin-right:-1.5rem !important}.mb-n4,.my-n4{margin-bottom:-1.5rem !important}.ml-n4,.mx-n4{margin-left:-1.5rem !important}.m-n5{margin:-3rem !important}.mt-n5,.my-n5{margin-top:-3rem !important}.mr-n5,.mx-n5{margin-right:-3rem !important}.mb-n5,.my-n5{margin-bottom:-3rem !important}.ml-n5,.mx-n5{margin-left:-3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media(min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:.25rem !important}.mt-sm-1,.my-sm-1{margin-top:.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:.25rem !important}.m-sm-2{margin:.5rem !important}.mt-sm-2,.my-sm-2{margin-top:.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:.25rem !important}.pt-sm-1,.py-sm-1{padding-top:.25rem !important}.pr-sm-1,.px-sm-1{padding-right:.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem !important}.pl-sm-1,.px-sm-1{padding-left:.25rem !important}.p-sm-2{padding:.5rem !important}.pt-sm-2,.py-sm-2{padding-top:.5rem !important}.pr-sm-2,.px-sm-2{padding-right:.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem !important}.pl-sm-2,.px-sm-2{padding-left:.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-n1{margin:-0.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-0.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-0.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-0.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-0.25rem !important}.m-sm-n2{margin:-0.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-0.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-0.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-0.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-0.5rem !important}.m-sm-n3{margin:-1rem !important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem !important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem !important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem !important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem !important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem !important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem !important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem !important}.m-sm-n5{margin:-3rem !important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem !important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem !important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem !important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media(min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:.25rem !important}.mt-md-1,.my-md-1{margin-top:.25rem !important}.mr-md-1,.mx-md-1{margin-right:.25rem !important}.mb-md-1,.my-md-1{margin-bottom:.25rem !important}.ml-md-1,.mx-md-1{margin-left:.25rem !important}.m-md-2{margin:.5rem !important}.mt-md-2,.my-md-2{margin-top:.5rem !important}.mr-md-2,.mx-md-2{margin-right:.5rem !important}.mb-md-2,.my-md-2{margin-bottom:.5rem !important}.ml-md-2,.mx-md-2{margin-left:.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:.25rem !important}.pt-md-1,.py-md-1{padding-top:.25rem !important}.pr-md-1,.px-md-1{padding-right:.25rem !important}.pb-md-1,.py-md-1{padding-bottom:.25rem !important}.pl-md-1,.px-md-1{padding-left:.25rem !important}.p-md-2{padding:.5rem !important}.pt-md-2,.py-md-2{padding-top:.5rem !important}.pr-md-2,.px-md-2{padding-right:.5rem !important}.pb-md-2,.py-md-2{padding-bottom:.5rem !important}.pl-md-2,.px-md-2{padding-left:.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-n1{margin:-0.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-0.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-0.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-0.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-0.25rem !important}.m-md-n2{margin:-0.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-0.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-0.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-0.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-0.5rem !important}.m-md-n3{margin:-1rem !important}.mt-md-n3,.my-md-n3{margin-top:-1rem !important}.mr-md-n3,.mx-md-n3{margin-right:-1rem !important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem !important}.ml-md-n3,.mx-md-n3{margin-left:-1rem !important}.m-md-n4{margin:-1.5rem !important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem !important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem !important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem !important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem !important}.m-md-n5{margin:-3rem !important}.mt-md-n5,.my-md-n5{margin-top:-3rem !important}.mr-md-n5,.mx-md-n5{margin-right:-3rem !important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem !important}.ml-md-n5,.mx-md-n5{margin-left:-3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media(min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:.25rem !important}.mt-lg-1,.my-lg-1{margin-top:.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:.25rem !important}.m-lg-2{margin:.5rem !important}.mt-lg-2,.my-lg-2{margin-top:.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:.25rem !important}.pt-lg-1,.py-lg-1{padding-top:.25rem !important}.pr-lg-1,.px-lg-1{padding-right:.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem !important}.pl-lg-1,.px-lg-1{padding-left:.25rem !important}.p-lg-2{padding:.5rem !important}.pt-lg-2,.py-lg-2{padding-top:.5rem !important}.pr-lg-2,.px-lg-2{padding-right:.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem !important}.pl-lg-2,.px-lg-2{padding-left:.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-n1{margin:-0.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-0.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-0.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-0.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-0.25rem !important}.m-lg-n2{margin:-0.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-0.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-0.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-0.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-0.5rem !important}.m-lg-n3{margin:-1rem !important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem !important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem !important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem !important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem !important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem !important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem !important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem !important}.m-lg-n5{margin:-3rem !important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem !important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem !important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem !important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media(min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:.25rem !important}.mt-xl-1,.my-xl-1{margin-top:.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:.25rem !important}.m-xl-2{margin:.5rem !important}.mt-xl-2,.my-xl-2{margin-top:.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:.25rem !important}.pt-xl-1,.py-xl-1{padding-top:.25rem !important}.pr-xl-1,.px-xl-1{padding-right:.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem !important}.pl-xl-1,.px-xl-1{padding-left:.25rem !important}.p-xl-2{padding:.5rem !important}.pt-xl-2,.py-xl-2{padding-top:.5rem !important}.pr-xl-2,.px-xl-2{padding-right:.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem !important}.pl-xl-2,.px-xl-2{padding-left:.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-n1{margin:-0.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-0.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-0.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-0.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-0.25rem !important}.m-xl-n2{margin:-0.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-0.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-0.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-0.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-0.5rem !important}.m-xl-n3{margin:-1rem !important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem !important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem !important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem !important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem !important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem !important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem !important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem !important}.m-xl-n5{margin:-3rem !important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem !important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem !important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem !important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace !important}.text-justify{text-align:justify !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media(min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-lighter{font-weight:lighter !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-weight-bolder{font-weight:bolder !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#3b3af2 !important}a.text-primary:hover,a.text-primary:focus{color:#0f0ed2 !important}.text-secondary{color:#6c757d !important}a.text-secondary:hover,a.text-secondary:focus{color:#494f54 !important}.text-success{color:#18856b !important}a.text-success:hover,a.text-success:focus{color:#0c4437 !important}.text-info{color:#007c88 !important}a.text-info:hover,a.text-info:focus{color:#00363c !important}.text-warning{color:#ffbb01 !important}a.text-warning:hover,a.text-warning:focus{color:#b48300 !important}.text-danger{color:#e30036 !important}a.text-danger:hover,a.text-danger:focus{color:#970024 !important}.text-light{color:#f8f9fa !important}a.text-light:hover,a.text-light:focus{color:#cbd3da !important}.text-dark{color:#343a40 !important}a.text-dark:hover,a.text-dark:focus{color:#121416 !important}.text-body{color:#40374a !important}.text-muted{color:#6c757d !important}.text-black-50{color:rgba(0,0,0,.5) !important}.text-white-50{color:rgba(255,255,255,.5) !important}.text-hide{font:0/0 a;color:rgba(0,0,0,0);text-shadow:none;background-color:rgba(0,0,0,0);border:0}.text-decoration-none{text-decoration:none !important}.text-break{word-break:break-word !important;word-wrap:break-word !important}.text-reset{color:inherit !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #adb5bd;page-break-inside:avoid}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #dee2e6 !important}.table-dark{color:inherit}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#f9f9f9}.table .thead-dark th{color:inherit;border-color:#f9f9f9}}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;src:url(../js/2a947e89d2e241121d6f.woff2) format("woff2"),url(../js/fcc115e3c4b25a4d6c4c.woff) format("woff")}@font-face{font-family:"Open Sans";font-style:italic;font-weight:400;src:url(../js/49ac825fd755e5f078b8.woff2) format("woff2"),url(../js/f5f0584e10cc2a05a9c4.woff) format("woff")}@font-face{font-family:"Open Sans";font-style:normal;font-weight:600;src:url(../js/473ad7094608f924460a.woff2) format("woff2"),url(../js/87b09f87fd4f0ca3a5c6.woff) format("woff")}@font-face{font-family:"linkspace-font";font-style:normal;font-weight:400;src:url(../js/d9f4c69fd03653286df4.eot?9780675);src:url(../js/d9f4c69fd03653286df4.eot?9780675#iefix) format("embedded-opentype"),url(../js/24f91c365ff9f0a90573.woff?9780675) format("woff"),url(../js/d4a72d1c013470821372.ttf?9780675) format("truetype"),url(../js/8330cbb9084834cba72f.svg?9780675#linkspace-font) format("svg")}.user__link::before,.note-modal .modal-body .form-check-input:checked::after,.sortable__handle::before,.nav__link::before,.sidebar__toggle::before,span.rag::before,.popover-container:not(.popover-container--text) .popover__btn::before,.modal-header .close::before,.link--alert::after,.link--email::before,.link--phone::before,.link--next::before,.link--add::before,.link--table::before,.link--graph::before,.link--calendar::before,.link--timeline::before,.select-widget .form-control::after,.select__toggle::after,.input--file .file__delete::before,.input--password .input__reveal-password::after,.input--search::after,.query-builder.query-builder .glyphicon::before,.checkbox input[type=checkbox]:checked+label::after,.error-container.alert-danger .error-message::before,.dropdown__toggle::after,table.dataTable td.reorder::before,table.dataTable.dtr-column>tbody>tr>td.dtr-control::before,table.dataTable.dtr-column>tbody>tr>th.dtr-control::before,.data-table .data-table-row--child::after,.data-table__search label::after,.dataTables_filter label::after,.ld-draggable-handle::before,.ld-edit-button::before,.collapsible-dropdown .collapsible__toggle::after,.card--expandable .card__link::before,.card--expandable .card__toggle::after,.card--settings .card__title-icon::before,.rename::before,.table-toggle--remove .btn::before,.table-toggle--add .btn::before,.btn-download::after,.btn-help::before,.btn-back::before,.btn-title-back::before,.btn-round::before,.btn-import::before,.btn-export::before,.btn-add-link::before,.btn-edit::before,.btn-view::before,.btn-email::before,.btn-filter::before,.btn-search::before,.btn-sort::before,.btn-toggle::before,.btn-toggle-off::before,.btn-clear::before,.btn-remove::before,.btn-icon-close::before,.btn-edit-widget::before,.btn-drag-widget::before,.btn-info::after,.btn-add::before,.breadcrumbs__divider::after,.breadcrumbs__item.link:last-of-type::before,.attention::before,.alert::before{display:inline-block;font:normal normal normal 14px/1 "linkspace-font";font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}html{box-sizing:border-box;font-size:100%}*,*::before,*::after{box-sizing:inherit}.bg-no{background-color:#fff}.mb-4{margin-bottom:2rem !important}p:last-child{margin-bottom:0}a:hover{text-decoration:none}strong{font-weight:600}h3{margin-bottom:1rem;font-weight:600}.main{min-height:100vh;padding-right:1.25rem;padding-left:0;transition:all .2s ease}.main:not(.main--expanded){display:none}.hidden{display:none}.invisible{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.main__container{display:flex;flex-direction:column;height:100%;min-height:35rem}.code{padding:1rem 1rem;background-color:#f9f9f9;color:#40374a;font-family:monospace}.code pre{margin-bottom:0}@media(min-width: 992px){body{padding:0 2rem}.main{padding-right:0}.main:not(.main--expanded){display:block}}table.table-bordered{border:solid 1px #c6c6c6}table.table-bordered thead>tr>th,table.table-bordered tbody>tr>td{border:solid 1px #c6c6c6}.dropdown-menu li.spacer{border-bottom:1px solid #c6c6c6;width:98%;margin:0 auto}.alert{display:flex;align-items:center;margin-bottom:2rem;padding:1rem;color:#000}.alert ul{margin:0;padding-left:2rem}.alert p{margin-bottom:0}@media(min-width: 1200px){.alert{padding:2rem}.alert::before{display:block;flex:0 0 1.25rem;margin-right:1rem;border-radius:50%;font-size:1.125rem}}.alert-success{background-color:#26d2a9}.alert-info{background-color:#aba9eb}.alert-danger{background-color:#ff6155}.alert-success::before{content:"";color:#000}.alert-info::before{content:"";color:#000}.alert-danger::before{content:"";color:#000}.attention::before{content:"";margin-right:.5rem;transform:rotate(180deg)}.login .attention{text-align:center}.breadcrumbs{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:.875rem}.breadcrumbs .link{display:flex;align-items:center;color:#504d6c}.breadcrumbs .link:hover{border-bottom-color:rgba(0,0,0,0)}.breadcrumbs__item.link:not(:last-of-type){position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.breadcrumbs__item.link:last-of-type::before{content:"";margin-right:4px;transform:rotate(180deg);font-size:.75rem}.breadcrumbs__item--active,.breadcrumbs__divider{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}@media(min-width: 768px){.breadcrumbs__item.link,.breadcrumbs__item.link:not(:last-of-type){border-bottom:1px solid #504d6c}.breadcrumbs__item.link:last-of-type::before,.breadcrumbs__item.link:not(:last-of-type):last-of-type::before{content:normal}.breadcrumbs__item.link:not(:last-of-type),.breadcrumbs__item--active,.breadcrumbs__divider{position:static;width:auto;height:auto;margin:0;overflow:auto;clip:auto}.breadcrumbs__item--active{border-bottom:1px solid rgba(0,0,0,0);color:#555}.breadcrumbs__divider::after{content:"";display:block;font-size:8px}}.btn{width:100%;padding:10px 30px;transition:.2s all ease;border-radius:23px;line-height:1.35;vertical-align:unset}.btn:not(:last-of-type){margin-bottom:1rem}.btn-default{border:1px solid rgba(0,0,0,0);background-color:#007c88;color:#fff}.btn-default:hover,.btn-default:active,.btn-default:focus,.btn-default:active:focus{border:1px solid rgba(0,0,0,0);background-color:#504d6c;color:#fff}.btn-small{padding:7px 20px;font-size:.875rem}.btn-primary{border:1px solid rgba(0,0,0,0);background-color:#007c88;color:#fff;background-color:#504d6c}.btn-primary:hover,.btn-primary:active,.btn-primary:focus,.btn-primary:active:focus{border:1px solid rgba(0,0,0,0);background-color:#504d6c;color:#fff}.btn-primary:hover,.btn-primary:focus,.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled).active:focus{border:1px solid rgba(0,0,0,0);background-color:rgba(80,77,108,.8)}.btn-primary.disabled{border-color:rgba(0,0,0,0);background-color:#c6c6c6;color:#fff}.btn-add{border:1px solid rgba(0,0,0,0);background-color:#007c88;color:#fff}.btn-add:hover,.btn-add:active,.btn-add:focus,.btn-add:active:focus{border:1px solid rgba(0,0,0,0);background-color:#504d6c;color:#fff}.btn-add::before{content:"";margin-right:.5rem;color:#fff}.btn-add.btn-inverted::before{color:#007c88}.btn-add.btn-inverted:hover,.btn-add.btn-inverted:active,.btn-add.btn-inverted:focus,.btn-add.btn-inverted:active:focus{border:1px solid #504d6c;background-color:#fff}.btn-add.btn-inverted:hover::before,.btn-add.btn-inverted:active::before,.btn-add.btn-inverted:focus::before,.btn-add.btn-inverted:active:focus::before{color:#504d6c}.btn-info{border:1px solid rgba(0,0,0,0);background-color:#007c88;color:#fff}.btn-info:hover,.btn-info:active,.btn-info:focus,.btn-info:active:focus{border:1px solid rgba(0,0,0,0);background-color:#504d6c;color:#fff}.btn-info::after{content:"";margin-left:.5rem;color:#fff}.btn-info.btn-inverted::after{color:#007c88}.btn-info.btn-inverted:hover,.btn-info.btn-inverted:active,.btn-info.btn-inverted:focus,.btn-info.btn-inverted:active:focus{border:1px solid #504d6c;background-color:#fff}.btn-info.btn-inverted:hover::after,.btn-info.btn-inverted:active::after,.btn-info.btn-inverted:focus::after,.btn-info.btn-inverted:active:focus::after{color:#504d6c}.btn-cancel{border:1px solid #40374a;background-color:#fff;color:#40374a}.btn-cancel:hover,.btn-cancel:active,.btn-cancel:focus,.btn-cancel:active:focus{border-color:#212020;color:#212020}.btn-drag-widget{margin-right:.5rem}.btn-drag-widget::before{content:""}.btn-edit-widget{margin-right:.5rem}.btn-edit-widget::before{content:""}.btn-edit-widget,.btn-drag-widget{width:1.5rem;height:1.5rem;margin:0;padding:0;transition:.2s all ease;border-radius:5px;background-color:#fff}.btn-edit-widget::before,.btn-drag-widget::before{transition:.2s all ease}.btn-edit-widget span,.btn-drag-widget span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.btn-edit-widget:hover,.btn-edit-widget:active,.btn-edit-widget:focus,.btn-edit-widget:active:focus,.btn-drag-widget:hover,.btn-drag-widget:active,.btn-drag-widget:focus,.btn-drag-widget:active:focus{background-color:#504d6c;color:#504d6c}.btn-edit-widget:hover::before,.btn-edit-widget:active::before,.btn-edit-widget:focus::before,.btn-edit-widget:active:focus::before,.btn-drag-widget:hover::before,.btn-drag-widget:active::before,.btn-drag-widget:focus::before,.btn-drag-widget:active:focus::before{color:#fff}.btn-delete{display:flex;align-items:center;width:auto;padding:0;border:0;border-radius:0;color:#e30036}.btn-delete span{transition:.2s all ease;border-bottom:solid 1px rgba(0,0,0,0)}.btn-delete:hover,.btn-delete:active,.btn-delete:focus,.btn-delete:active:focus{box-shadow:unset;color:#e30036}.btn-delete:hover span,.btn-delete:active span,.btn-delete:focus span,.btn-delete:active:focus span{border-bottom:solid 1px #e30036}.btn-icon-close{width:auto;padding:0;border:0;border-radius:0}.btn-icon-close::before{content:"";font-size:.75rem}.btn-delete.btn-icon-close::before{margin-right:.75rem}.btn-disabled{background-color:#c6c6c6;color:#fff}.btn-disabled:hover{color:#fff;cursor:not-allowed}.btn-remove{border:1px solid rgba(0,0,0,0);background-color:#007c88;color:#fff}.btn-remove:hover,.btn-remove:active,.btn-remove:focus,.btn-remove:active:focus{border:1px solid rgba(0,0,0,0);background-color:#504d6c;color:#fff}.btn-remove::before{content:"";margin-right:.5rem;color:#fff}.btn-import,.btn-export,.btn-add-link,.btn-edit,.btn-view,.btn-email,.btn-filter,.btn-search,.btn-sort,.btn-toggle,.btn-toggle-off,.btn-clear{display:flex;align-items:center;width:-moz-max-content;width:max-content;padding:10px 0 0;border:0;border-bottom:1px solid rgba(0,0,0,0);border-radius:0;color:#007c88;background:rgba(0,0,0,0)}.btn-import::before,.btn-export::before,.btn-add-link::before,.btn-edit::before,.btn-view::before,.btn-email::before,.btn-filter::before,.btn-search::before,.btn-sort::before,.btn-toggle::before,.btn-toggle-off::before,.btn-clear::before{content:"";margin-right:.75rem;color:#007c88;background:rgba(0,0,0,0);transition:all .2s ease}.btn-import:hover,.btn-import:focus,.btn-import:active,.btn-export:hover,.btn-export:focus,.btn-export:active,.btn-add-link:hover,.btn-add-link:focus,.btn-add-link:active,.btn-edit:hover,.btn-edit:focus,.btn-edit:active,.btn-view:hover,.btn-view:focus,.btn-view:active,.btn-email:hover,.btn-email:focus,.btn-email:active,.btn-filter:hover,.btn-filter:focus,.btn-filter:active,.btn-search:hover,.btn-search:focus,.btn-search:active,.btn-sort:hover,.btn-sort:focus,.btn-sort:active,.btn-toggle:hover,.btn-toggle:focus,.btn-toggle:active,.btn-toggle-off:hover,.btn-toggle-off:focus,.btn-toggle-off:active,.btn-clear:hover,.btn-clear:focus,.btn-clear:active{border-bottom:solid 1px #007c88;box-shadow:none;color:#007c88;text-decoration:none;background:rgba(0,0,0,0)}.btn-round{width:auto;padding:10px 12px;transition:.2s all ease;border-radius:23px;background-color:#007c88;box-shadow:0 0 7px rgba(0,0,0,.2)}.btn-round::before{color:#fff;font-size:1.125rem}.btn-round span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.btn-round:hover,.btn-round:active,.btn-round:focus,.btn-round:active:focus{transform:translateY(-4px)}.btn-round.btn-add::before{margin-right:0}.btn-inverted{border:solid 1px #007c88;background-color:#fff;color:#007c88}.btn-inverted:hover,.btn-inverted:active,.btn-inverted:focus,.btn-inverted:active:focus{border-color:#504d6c;color:#504d6c}.btn-back,.btn-title-back{width:auto;padding:0;border:0;border-radius:0;color:#40374a;font-weight:600;text-align:left}.btn-back::before,.btn-title-back::before{content:"";margin-right:4px;transform:rotate(180deg);transition:margin-left .3s ease-in-out,padding-left .3s ease-in-out;font-size:.875rem}.btn-back:hover::before,.btn-back:active::before,.btn-title-back:hover::before,.btn-title-back:active::before{margin-left:-4px;padding-left:4px}.btn-back:focus,.btn-back:active:focus,.btn-title-back:focus,.btn-title-back:active:focus{box-shadow:unset}.btn-back:focus .btn__title,.btn-back:active:focus .btn__title,.btn-title-back:focus .btn__title,.btn-title-back:active:focus .btn__title{border-bottom:solid 1px #40374a}.btn-back:focus::before,.btn-back:active:focus::before,.btn-title-back:focus::before,.btn-title-back:active:focus::before{margin-left:-4px;padding-left:4px}.btn-title-back{font-size:1.125rem;font-weight:600;line-height:1.35;margin-top:0;color:#504d6c}.btn-title-back::before{color:#504d6c;font-size:1rem}.btn-title-back:hover,.btn-title-back:active{color:#504d6c}.btn-title-back:focus .btn__title,.btn-title-back:active:focus .btn__title{border-bottom:solid 1px #504d6c}.btn-link{width:-moz-max-content;width:max-content;padding:0;border-radius:0}.btn-link:hover,.btn-link:focus,.btn-link:active{border-bottom:solid 1px #007c88;text-decoration:none}.btn-help::before{transition:all .2s ease;content:""}.btn-plain{border:0;color:#40374a}.btn-plain:hover,.btn-plain:focus,.btn-plain:active{color:#007c88}.btn-import::before{content:""}.btn-edit{padding:0}.btn-edit::before{content:""}.btn-view{padding:0}.btn-view::before{content:"";font-size:1rem}.btn-email::before{content:""}.btn-clear::before{content:"";transform:rotate(180deg)}.btn-filter::before{content:""}.btn-search,.btn-sort{padding-top:0}.btn-search::before,.btn-sort::before{content:"";margin-right:0;font-size:1rem}.btn-search span,.btn-sort span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.btn-sort::before{content:"";transform:rotate(90deg)}.btn-toggle::before,.btn-toggle-off::before{font-size:1.4rem}.btn-toggle::before{content:""}.btn-toggle-off::before{content:""}.dt-ordering-asc .btn-sort::before{transform:rotate(-90deg)}.dt-ordering-desc .btn-sort::before{transform:rotate(90deg)}.btn-add-link{padding:0}.btn-add-link::before{content:"";font-size:1rem}.btn-download{display:flex;width:-moz-max-content;width:max-content;padding:0;border-radius:0}.btn-download .btn__title{text-align:left;word-break:break-all}.btn-download::after{content:"";margin-left:.5rem;padding:.25rem;transition:.2s all ease;border-radius:.25rem;color:#007c88}.btn-download:hover::after{background-color:#007c88;color:#fff}.btn-download.btn-round{padding:10px 12px;border-radius:23px;background-color:#f99d27}.btn-download.btn-round::after{margin-left:0;padding:0;color:#fff;font-size:1.125rem}.btn-download.btn-round:hover::after{background-color:#f99d27}.btn-invisible{display:none}@media(min-width: 576px){.btn{width:auto}.btn:not(:last-of-type){margin-right:1rem;margin-bottom:0}.btn-import,.btn-export,.btn-add-link,.btn-filter,.btn-clear{width:-moz-max-content;width:max-content}.btn-edit-widget,.btn-drag-widget,.btn-resize-widget{width:1.5rem;height:1.5rem}.btn-edit-widget:not(:last-of-type),.btn-drag-widget:not(:last-of-type),.btn-resize-widget:not(:last-of-type){margin-right:.5rem}}.table-toggle--add .btn,.table-toggle--remove .btn{position:absolute;right:1rem;width:19px;height:19px;margin:0;padding:0;font-size:18px;font-weight:bolder;line-height:16px}.table-toggle--add .btn::before{content:"";color:#18856b}.table-toggle--remove .btn::before{content:"";color:#e30036}.rename::before{content:""}.calculator-dropdown{margin-right:2rem}.card{padding:1rem 1rem;border-radius:10px;background-color:#fff;box-shadow:0 0 7px rgba(0,0,0,.4)}.card__body{margin:-2rem -1rem 0}.card__body>*{padding:0 1rem}.card__title{font-size:1rem;font-weight:600;line-height:1.35;display:flex;margin:0 0 1rem;color:#40374a}.card__title:not(:first-child){margin-top:2rem}.card__image,.card__content{margin-top:2rem}.card__image{flex:1 1 186px}.card__image img{width:100%;height:auto}.card__content{flex:100%}.card--primary,.card--secundary,.card--record{border:0;border-radius:0}.card--primary>.card__title{color:#504d6c}.card--secundary .card__title{color:#007c88}.card--help{line-height:1.5}.card--record{padding:1rem}.card--record h3{margin-bottom:2rem;color:#007c88}.card--record .list__item:nth-child(2){margin-bottom:1rem}.card--record .list__item:nth-child(4){margin-bottom:1.5rem}.card--header{border-radius:0}.card--header:not(:last-of-type){margin-bottom:1rem}.card--header .card__header{margin:-1rem -1rem 1rem;padding:1rem 1rem;background-color:#504d6c;color:#fff}.card--header .card__title{margin-top:0;color:#007c88}.card--header .list--key-value:not(:last-of-type){margin-bottom:1.5rem}.dashboard__widget .card{height:100%}@media(min-width: 768px){.card__image{flex:2 0 186px}.card__content{flex:10 1 200px}.card--primary>.card__title{font-size:1.125rem}}.card--settings{height:100%;border:0}.card--settings .card__title{color:#007c88}.card--settings .card__title span{transition:border-bottom .3s ease-in-out;border-bottom:solid 1px rgba(0,0,0,0)}.card--settings .card__content{color:#40374a}.card--settings .card__title-icon::before{content:"";margin-right:.5rem;color:#007c88;font-size:1.25rem}.card--settings:hover .card__title span{border-bottom:solid 1px #007c88}.card--settings .card__title-icon--user::before{content:""}.card--settings .card__title-icon--organisation::before{content:""}.card--settings .card__title-icon--department::before{content:""}.card--settings .card__title-icon--groups::before{content:""}.card--settings .card__title-icon--table::before{content:""}.card--settings .card__title-icon--email::before{content:""}.card--settings .card__title-icon--settings::before{content:""}.card--settings .card__title-icon--report::before{content:""}.card--expandable{padding:0;border:0;border-radius:0}.card--expandable .card__header{display:flex;align-items:center;justify-content:space-between}.card--expandable .card__title{flex-wrap:wrap;margin-bottom:0;transition:.2s all ease;border-bottom:1px solid rgba(0,0,0,0);color:#007c88}.card--expandable .card__subtitle{display:block;flex:0 0 100%;transition:.2s all ease;color:#555;font-weight:normal;text-align:left}.card--expandable .card__description{display:block;margin-bottom:1.5rem}.card--expandable .card__header-left{display:flex;flex:1;padding:1rem;border:0;background-color:rgba(0,0,0,0);text-align:left;cursor:pointer}.card--expandable .card__header-right{display:flex;padding-right:1rem}.card--expandable .card__toggle{padding:0;border:0;background-color:#fff;line-height:1.35}.card--expandable .card__toggle span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.card--expandable .card__toggle::after{content:"";margin-left:1rem;transform:rotate(90deg);color:#40374a}.card--expandable .card__toggle[aria-expanded=false]::after{transform:rotate(0deg)}.card--expandable .card__link{margin-bottom:0;color:#007c88}.card--expandable .card__link span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0;transition:.2s all ease;border-bottom:solid 1px rgba(0,0,0,0)}.card--expandable .card__link::before{content:"";margin-right:.5rem;color:#007c88}.card--expandable .card__link:hover span{border-bottom:solid 1px #007c88}.card--expandable .card__content{margin-top:0;padding:1rem}.card--expandable .card__edit-content,.card--expandable .btn-view{display:none}.card--expandable .btn-edit,.card--expandable .btn-view{margin-right:0;margin-bottom:0}@media(min-width: 576px){.card--expandable .card__subtitle{display:inline-block;flex:1 1 auto;margin-left:1.25rem}}@media(min-width: 768px){.card--expandable .card__link span{position:static;width:auto;height:auto;margin:0;overflow:auto;clip:auto}.card--expandable .card__toggle::after{margin-left:2rem}}.card--edit .card__edit-content,.card--edit .btn-view{display:block}.card--edit .card__view-content,.card--edit .btn-edit{display:none}.collapsible-dropdown{width:-moz-max-content;width:max-content}.collapsible-dropdown .collapsible__toggle{display:inline-flex;align-items:center;border:none;background-color:rgba(0,0,0,0);padding:0;color:#40374a}.collapsible-dropdown .collapsible__toggle::after{content:"";margin-left:.5rem;transform:rotate(90deg);transition:.2s transform ease;border:0;color:#40374a;font-size:10px}.collapsible-dropdown .collapsible__toggle:hover,.collapsible-dropdown .collapsible__toggle:focus,.collapsible-dropdown .collapsible__toggle:active,.collapsible-dropdown .collapsible__toggle:active:focus,.collapsible-dropdown .collapsible__toggle:active:hover{border:none;background-color:rgba(0,0,0,0)}.collapsible-dropdown .collapsible__toggle:hover::after,.collapsible-dropdown .collapsible__toggle:focus::after,.collapsible-dropdown .collapsible__toggle:active::after,.collapsible-dropdown .collapsible__toggle:active:focus::after,.collapsible-dropdown .collapsible__toggle:active:hover::after{transform:rotate(-90deg)}.collapsible-dropdown .collapsible__toggle.open .dropdown__toggle::after{transform:rotate(-90deg) translateX(-150%)}.collapsible-dropdown .collapsible-dropdown__content{margin-top:10px;background-color:#fff}.content-block{flex:1 1 100%;padding:0 0 2rem 1.25rem}.content-block__navigation{display:flex;position:relative;flex-wrap:wrap;gap:1rem;align-items:center;justify-content:space-between;margin-bottom:1px;padding:1rem 0 1rem}.content-block__navigation::after{content:"";position:absolute;right:0;bottom:-1px;left:0;height:1px;margin-right:-1.25rem;margin-left:-1.25rem;background:#c6c6c6}.content-block__navigation-left,.content-block__navigation-right{display:flex;flex:0 0 100%;align-items:center;gap:1rem}.content-block__head,.content-block__main{padding-top:2rem}.modal-dialog .content-block__head,.modal-dialog .content-block__main{padding-top:0}.content-block .alert{margin-top:2rem;margin-bottom:0}.content-block .modal-dialog .alert{margin-top:0;margin-bottom:2rem}.content-block__title{font-size:1.125rem;font-weight:600;line-height:1.35;margin-top:0;color:#504d6c}.content-block__aside{margin-top:1rem}.content-block__aside>.list--horizontal{display:flex}.content-block__aside>.list--horizontal .list__items{margin-bottom:0}.content-block--white .content-block__main{margin-top:1.5rem;padding:1.5rem 2rem;background-color:#fff;box-shadow:0 0 7px rgba(0,0,0,.0509803922)}.content-block--footer{display:flex;flex-direction:column}.content-block--footer .content-block__main{display:flex;flex:1 1 100%;flex-direction:column}.content-block--footer form,.content-block--footer fieldset{display:flex;flex:1 1 100%;flex-direction:column}.content-block--footer .content-block__main-content{flex:1 1 100%}.content-block--edit .content-block__left{display:none}.content-block--edit .content-block__right{flex:0 0 100%;max-width:100%}@media(min-width: 992px){.content-block{padding-left:2rem}.content-block__navigation::after{margin-right:-2rem;margin-left:-2rem}.content-block__aside{margin-top:0}.content-block__aside>.list--horizontal{justify-content:flex-end}}@media(min-width: 1200px){.content-block__aside{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end}.content-block__aside>*:not(:only-child){margin-bottom:1rem}.content-block__navigation-left,.content-block__navigation-right{flex:0 0 auto}}.content-block__footer{position:sticky;z-index:999;bottom:0;margin:2rem 0 -2rem -1.25rem}.content-block__footer-container{width:100%;padding:1rem 0 1rem 1.25rem}.content-block__footer-container::before{content:"";position:absolute;top:0;right:-1.25rem;bottom:0;left:0;background-color:#fff;box-shadow:0 0 7px rgba(0,0,0,.1)}.content-block--record .content-block__footer{display:none}.content-block--record.content-block--edit .content-block__footer{display:block}@media(min-width: 992px){.content-block__footer{margin:2rem 0 -2rem -2rem}.content-block__footer-container{padding:1rem 0 1rem 2rem}.content-block__footer-container::before{right:-2rem}}.dashboard{background:#f9f9f9}.layoutJSON{margin-top:10px;padding:10px;border:1px solid #000;background:#c6c6c6}.columns{-moz-columns:120px;columns:120px}.react-grid-item{box-sizing:border-box}.react-grid-item.react-grid-placeholder{background-color:rgba(0,124,136,.5)}.react-grid-item:not(.react-grid-placeholder){padding:1rem 1rem;border-radius:10px;background-color:#fff;box-shadow:0 0 7px rgba(0,0,0,.4)}.react-grid-item.resizing{opacity:.9}.react-grid-item.static{background:#f9f9f9}.react-grid-item .text{position:absolute;top:0;right:0;bottom:0;left:0;height:24px;margin:auto;font-size:24px;text-align:center}.react-grid-item .minMax{font-size:12px}.react-grid-item .add{cursor:pointer}.react-grid-dragHandleExample{cursor:move;cursor:grab}.ld-widget-handlers{position:absolute;right:20px;bottom:.5rem}.react-resizable-handle,.ld-widget-handlers{transition:.2s all ease;opacity:.2}.react-grid-item:hover .react-resizable-handle,.react-grid-item:hover .ld-widget-handlers{opacity:1}.ld-draggable-handle,.ld-edit-button{position:absolute;bottom:0;width:1.5rem;height:1.5rem}.ld-draggable-handle::before,.ld-edit-button::before{transition:.2s all ease}.ld-draggable-handle span,.ld-edit-button span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.ld-draggable-handle{right:1rem;cursor:move}.ld-draggable-handle::before{content:""}.ld-edit-button{right:3rem;cursor:pointer}.ld-edit-button::before{content:""}.ld-body-container{margin-bottom:4rem}.ld-widget-container{position:relative;overflow:hidden;border:1px solid rgba(0,0,0,0)}.ld-widget-container .ld-draggable-handle,.ld-widget-container .ld-edit-button,.ld-widget-container .react-resizable-handle{z-index:20;transition:opacity .2s;opacity:.2;color:#555}.ld-widget-container:hover .ld-draggable-handle,.ld-widget-container:hover .ld-edit-button,.ld-widget-container:hover .react-resizable-handle{opacity:1}.ld-widget-container--editable:hover{border-color:#c6c6c6}.ld-modal__header{position:relative;min-width:400px;padding:14px 12px;border-bottom:1px solid gray}.ld-modal__footer{position:relative;padding:8px 12px;border-top:1px solid gray}.ld-modal__right-container{position:absolute;top:8px;right:12px}.ld-modal__right-container>*{margin-right:12px}.ld-modal__right-container>*:last-child{margin-right:0}.ld-modal__content-container{position:relative;min-height:100px;max-height:80vh;max-height:calc(100vh - 120px);padding:15px;overflow-y:scroll}.ld-modal__loading{position:absolute;top:50%;left:50%;margin-right:-50%;transform:translate(-50%, -50%)}.ReactModal__Body--open{overflow-y:hidden}.ld-widget{height:100%;overflow-x:hidden;overflow-y:auto}.ld-footer-container{display:flex;position:fixed;z-index:999;right:2rem;bottom:2rem;flex-direction:column;justify-content:end}@media(min-width: 768px){.ld-footer-container{flex-direction:row}}.ld-header-container{text-align:right}.ld-header-container .spinner{display:inline-block;margin-right:10px}.data-table{border-spacing:0;font-size:.875rem}.data-table.table-thead-hidden thead{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.data-table thead{background-color:#fff;z-index:1}.data-table thead th{border-bottom:1px solid #c6c6c6;text-transform:uppercase;vertical-align:top}.data-table thead th[class*=sorting_asc],.data-table thead th[class*=sorting_desc]{color:#007c88}.data-table thead th.data-table__header--invisible span,.data-table thead th.dt__header--inivisible span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.data-table tfoot{background-color:rgba(0,124,136,.2);font-weight:bold}.data-table.table-lines th,.data-table.table-lines td{border-top:0;border-bottom:1px solid #c6c6c6}.data-table .autosize{max-height:30px}table.dataTable thead .sorting::before,table.dataTable thead .sorting::after,table.dataTable thead .sorting_disabled::before,table.dataTable thead .sorting_disabled::after{content:normal !important}.dataTables_wrapper{margin-bottom:.5rem;font-size:.875rem}.dataTables_wrapper:last-child{margin-bottom:0}.dataTables_wrapper .row{width:100%}.dataTables_wrapper .row--header,.dataTables_wrapper .row--main{margin-bottom:1rem}.row--fiv-header{margin-top:1.9rem}.dataTables_toggle_full_width .btn-toggle,.dataTables_toggle_full_width .btn-toggle-off{padding-top:7px}.data-table__container--scrollable{overflow:auto}.data-table__container--scrollable thead{position:sticky;top:0}.dataTables_info_wrapper{display:none}.dataTables_length_wrapper{margin-top:2rem}.dataTables_length .form-control{width:100%;height:auto;padding:.5rem 1rem;transition:.2s all ease;color:#000;text-align:left}.dataTables_length .form-control::-moz-placeholder{color:#707070;font-style:italic}.dataTables_length .form-control::placeholder{color:#707070;font-style:italic}.dataTables_length .form-control:hover,.dataTables_length .form-control:focus,.dataTables_length .form-control:active,.dataTables_length .form-control:active:focus,.dataTables_length .form-control:active:hover{border:1px solid #007c88;box-shadow:none}.dataTables_filter label{position:relative;display:flex;justify-content:flex-start}.dataTables_filter label .form-control{padding-left:2.75rem}.dataTables_filter label::after{content:"";position:absolute;top:50%;left:1rem;transform:translateY(-50%);font-size:1rem}.dataTables_filter .form-control{width:100%;height:auto;padding:.5rem 1rem;transition:.2s all ease;color:#000;text-align:left}.dataTables_filter .form-control::-moz-placeholder{color:#707070;font-style:italic}.dataTables_filter .form-control::placeholder{color:#707070;font-style:italic}.dataTables_filter .form-control:hover,.dataTables_filter .form-control:focus,.dataTables_filter .form-control:active,.dataTables_filter .form-control:active:focus,.dataTables_filter .form-control:active:hover{border:1px solid #007c88;box-shadow:none}.data-table__sort{display:flex;align-items:flex-start;order:2;padding:0;transition:.2s all ease-in;border:0;border-bottom:1px solid rgba(0,0,0,0);background-color:rgba(0,0,0,0);color:#40374a;font-weight:bold;text-align:left;text-transform:uppercase}.data-table__sort .btn-sort{margin-top:.1rem;margin-left:.25rem;opacity:0}.data-table__sort .btn-sort:hover{border-bottom:none}.data-table__sort:hover,.data-table__sort:active,.data-table__sort:focus,.dt-ordering-asc .data-table__sort,.dt-ordering-desc .data-table__sort{color:#007c88}.data-table__sort:hover .btn-sort,.data-table__sort:active .btn-sort,.data-table__sort:focus .btn-sort,.dt-ordering-asc .data-table__sort .btn-sort,.dt-ordering-desc .data-table__sort .btn-sort{opacity:1}.data-table__header--invisible .data-table__sort{display:none}.data-table__search{margin:0 .1rem 0 -1rem}.data-table__search .dropdown-toggle{margin-top:.1rem;transition:.2s opacity ease-in;opacity:0}.data-table__search .dropdown-toggle:hover,.data-table__search .dropdown-toggle:active,.data-table__search .dropdown-toggle:focus{opacity:1}.data-table__search .dropdown-toggle::after{content:normal}.data-table__search.show .dropdown-toggle{opacity:1}.data-table__search label{position:relative}.data-table__search label .form-control{padding-left:2.75rem}.data-table__search label::after{content:"";position:absolute;top:50%;left:1rem;transform:translateY(-50%);font-size:1rem}.data-table__search .input .form-control{width:auto}.data-table__header--invisible .data-table__search{display:none}.col .dt-search input[type=search]{width:98%}.dataTables_scrollHead .table--bordered,.dt-scroll-head .table--bordered{box-sizing:border-box;border:1px solid #c6c6c6;border-bottom:0;border-top-left-radius:5px;border-top-right-radius:5px}.dataTables_scrollHead .table--bordered thead,.dt-scroll-head .table--bordered thead{color:#585858}.dataTables_scrollBody:has(.table--bordered),.dt-scroll-body:has(.table--bordered){border:1px solid #c6c6c6;border-top:0;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.dataTables_scrollBody:has(.table--bordered) .table-striped,.dt-scroll-body:has(.table--bordered) .table-striped{border-bottom:0}.dataTables_scrollFoot .table-striped.table--bordered,.dt-scroll-foot .table-striped.table--bordered{border:0}.data-table__header-wrapper{display:flex;position:relative;align-items:flex-start}.data-table__header-wrapper.filter .data-table__search .dropdown-toggle.btn-search{opacity:1}.data-table__header-wrapper:hover .data-table__search .dropdown-toggle,.data-table__header-wrapper:active .data-table__search .dropdown-toggle,.data-table__header-wrapper:focus .data-table__search .dropdown-toggle{opacity:1}.dataTables_paginate .pagination{justify-content:center}.page-item .page-link{transition:.2s all ease}.page-item.active .page-link,.page-item .page-link:hover{border-color:#007c88;background-color:#007c88;color:#fff}div.dataTables_wrapper div.dataTables_length{text-align:left}div.dataTables_wrapper div.dataTables_length label{justify-content:flex-start}div.dataTables_wrapper div.dataTables_length label .form-control{margin-left:.5rem}div.dataTables_wrapper div.dataTables_filter input.form-control{width:100%;margin-left:0}:fullscreen body{padding:0;background-color:#fff}:fullscreen .main{max-width:none}:fullscreen .sidebar,:fullscreen .table-header,:fullscreen .content-block__navigation,:fullscreen .content-block__head{display:none}:fullscreen .content-block__main{padding-top:0}:fullscreen .dataTables_wrapper{padding-top:2rem}:fullscreen .data-table{margin-top:0 !important}@media(min-width: 992px){.dataTables_wrapper .row--main{margin-bottom:2rem}.dataTables_length_wrapper{margin-top:0}.dataTables_length label{justify-content:flex-end}.dataTables_info_wrapper{display:block;text-align:right}.dataTables_paginate .pagination{justify-content:flex-start}}.dataTables_processing,.dt-processing{position:fixed;top:50%;left:50%}table.table-purge thead tr th,table.table-purge tbody tr td{text-align:center !important}table.table-purge tbody tr td{border:1px solid #c6c6c6;border-top:0}table.table-purge thead tr th{background-color:#007c88;color:#fff}button.btn-remove,button.btn-add{margin:1rem 0}.dt-column-order{display:none;visibility:collapse}@media(max-width: 991.98px){.dataTables_scrollBody:has(.table-toggle){height:auto !important}}.table-toggle tr[data-field-is-toggled=false]{display:none}.table-toggle tbody tr:nth-child(odd of [data-field-is-toggled=true]){background-color:#f9f9f9}.table-modal{position:fixed;z-index:1020;top:0;right:0;bottom:0;left:0;padding:1rem;background:#fff}.table-modal .row{margin-right:0;margin-left:0}.data-table .data-table-row--child{position:relative;padding-left:2rem}.data-table .data-table-row--child::after{content:"";position:absolute;top:50%;left:1rem;margin-right:.5rem;transform:translateY(-50%);font-size:.9em}table.dataTable.dtr-column>tbody>tr>td.dtr-control::before,table.dataTable.dtr-column>tbody>tr>th.dtr-control::before{content:"";top:1.3rem;right:.5rem;left:auto;margin:0 .5rem 0 0;transform:rotate(90deg);border:0;background-color:rgba(0,0,0,0);box-shadow:none;color:#40374a;font-size:.9em;transition:all .2s ease-in-out}table.dataTable.dtr-column>tbody>tr.parent>td.dtr-control::before,table.dataTable.dtr-column>tbody>tr.parent>th.dtr-control::before{content:"";transform:rotate(-90deg);background-color:rgba(0,0,0,0)}table.dataTable>tbody>tr.child ul.dtr-details>li{border-bottom:none}table.dataTable>tbody>tr.child span.dtr-title{min-width:auto}table.dataTable.dtr-column>tbody>tr>td.dtr-control.data-table-row--child,table.dataTable.dtr-column>tbody>tr>th.dtr-control.data-table-row--child{padding-left:4rem}table.dataTable.dtr-column>tbody>tr>td.dtr-control.data-table-row--child::after,table.dataTable.dtr-column>tbody>tr>th.dtr-control.data-table-row--child::after{left:2rem}table.dataTable td{line-height:1.125rem}table.dataTable td.reorder{text-align:right;cursor:move}table.dataTable td.reorder span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}table.dataTable td.reorder::before{content:""}.table-striped{border-bottom:1px solid #c6c6c6}li .table-striped{border-bottom:none}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,0)}.table-striped tbody tr.odd,.table-striped tbody tr.odd+tr.child{background-color:#f9f9f9}.table-striped tbody tr>td{line-height:17px}.table-striped tbody tr.odd+tr.child:hover{background-color:#f9f9f9 !important}.table-striped.table-lines{border-bottom:none}.table-hover tbody tr.odd:hover{background-color:rgba(0,124,136,.2);cursor:pointer}.table-hover tbody td .link{display:block;margin:-1rem;padding:1rem 1rem;transition:none;border-bottom:none;color:#40374a}.table-hover tbody td .link:hover,.table-hover tbody td .link:active,.table-hover tbody td .link:focus{border-bottom:none;color:#40374a}.table-hover tbody td.child .dtr-data .link{margin:0;padding:0}.table-hover tbody tr:hover{cursor:pointer}.table-hover tbody tr.tr--focus,.table-hover tbody tr.odd.tr--focus{background-color:rgba(0,124,136,.2)}.dataTables_scroll .dataTables_scrollHead .dataTables_scrollHeadInner{width:100% !important}.dataTables_scroll .dataTables_scrollHead .dataTables_scrollHeadInner .data-table{width:100% !important}.dataTables_scroll .dataTables_scrollHead .dataTables_scrollHeadInner .data-table.table-striped{border-bottom:none}.dataTables_scroll .dataTables_scrollHead .dataTables_scrollHeadInner .data-table tr th{width:100% !important}.dataTables_scroll .dataTables_scrollBody>table>tbody tr:first-child td{border-top:1px solid rgba(0,0,0,.05)}.dropdown{position:static}.dropdown__toggle{display:inline-flex;align-items:center;border:none;background-color:rgba(0,0,0,0);padding:0;color:#40374a}.dropdown__toggle::after{content:"";margin-left:.5rem;transform:rotate(90deg);transition:.2s transform ease;border:0;color:#40374a;font-size:10px}.dropdown__toggle:hover,.dropdown__toggle:focus,.dropdown__toggle:active,.dropdown__toggle:active:focus,.dropdown__toggle:active:hover{border:none;background-color:rgba(0,0,0,0)}.dropdown__toggle:hover::after,.dropdown__toggle:focus::after,.dropdown__toggle:active::after,.dropdown__toggle:active:focus::after,.dropdown__toggle:active:hover::after{transform:rotate(-90deg)}.dropdown__toggle.open .dropdown__toggle::after{transform:rotate(-90deg) translateX(-150%)}.dropdown__menu{margin:.125rem 0;padding:0;border:1px solid #c6c6c6;border-radius:5px;overflow-y:auto;max-height:50vh}.dropdown__item{padding:.5rem 1rem}.dropdown__item:not(:last-child){border-bottom:1px solid #f9f9f9}.dropdown--small .dropdown__toggle,.dropdown--small .dropdown__menu{font-size:.875rem}.dropdown--large .dropdown__toggle{font-size:1.125rem}.dropdown-menu.show{z-index:1070}@media(min-width: 576px){.dropdown-menu.show{max-width:90vw}}@media(min-width: 768px){.dropdown-menu.show{max-width:70vw}}@media(min-width: 992px){.dropdown-menu.show{max-width:50vw}}.dropdown__group:not(:last-child){margin-bottom:.5rem}.dropdown__group-title{padding:.5rem 1rem 0;color:#504d6c;font-size:1.125rem;font-weight:600;line-height:1.35}.dropdown__list{margin:0;padding:0;list-style-type:none}.error-container.alert-danger::before{content:none}.error-container.alert-danger .error-message::before{content:""}.field--changed input,.field--changed .jstree-container-ul,.field--changed .form-control{background-color:#fff2cd;border-radius:5px}.modal-autosave{max-height:20rem;overflow-y:auto;overflow-x:hidden}li.li-success{list-style:none}li.li-success::before{content:"✓";color:green;font-size:1.5em;margin-right:.5em}li.li-error{list-style:none}li.li-error::before{content:"✗";color:red;font-size:1.5em;margin-right:.5em}.checkbox{margin-bottom:.5rem}.checkbox input[type=checkbox]{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.checkbox label{display:flex;position:relative;padding-left:1.5rem}.checkbox label::before{content:"";display:inline-block;position:absolute;left:0;flex:0 0 1rem;width:1rem;height:1rem;margin-right:.5rem;transition:.2s all ease;border:1px solid #c6c6c6;background-color:#fff}.checkbox label:hover::before{border-color:#007c88}.checkbox label::before{top:.125rem;border-radius:5px}.checkbox input[type=checkbox]:focus+label::before{border-color:#007c88;box-shadow:inset 0 1px 1px rgba(0,0,0,.08),0 0 8px rgba(0,124,136,.6)}.checkbox input[type=checkbox]:checked+label::before{border-color:#007c88;background-color:#007c88}.checkbox input[type=checkbox]:checked+label::after{content:"";position:absolute;top:.625rem;left:4px;transform:translateY(-50%);color:#fff;font-size:7px}.checkbox input[disabled]+label{color:#c6c6c6}.checkbox input[disabled]+label:hover::before{border-color:#c6c6c6}.checkbox input[type=checkbox]:checked:disabled+label::before{border-color:#c6c6c6;background-color:#c6c6c6}.checkbox label{justify-content:flex-start;margin-bottom:0}.checkbox-confirm{margin-top:2rem}.checkbox--hide-label input[type=checkbox]:checked+label::after{left:5px}.checkbox--hide-label label>span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.data-table .checkbox label::before{width:.9rem;height:.9rem}.data-table .checkbox label span{padding-top:.05rem}.checkbox-reveal{display:none}.checkbox-reveal--show{display:block}.input-daterange .input .form-control{margin-top:0}.input-daterange .input-group-addon{flex:1 1 auto}.input-daterange .input-group-text{justify-content:center;padding:.5rem 1rem;border-radius:0}.input-daterange .input--from{flex:1 1 auto}.input-daterange .input--from .form-control{border-right:1px solid rgba(0,0,0,0);border-radius:5px 0 0 5px}.input-daterange .input--to{flex:1 1 auto}.input-daterange .input--to .form-control{border-left:1px solid rgba(0,0,0,0);border-radius:0 5px 5px 0}.query-builder.query-builder .btn{padding:.25rem .5rem;border-radius:5px;font-size:.875rem}.query-builder.query-builder .rules-group-container{display:flex;flex-direction:column;flex-wrap:wrap;gap:.5rem;width:100%;border:1px solid #c6c6c6;background-color:#f9f9f9}.query-builder.query-builder .rules-group-header{display:flex;flex-wrap:wrap;justify-content:space-between;gap:.5rem;margin-bottom:0}.query-builder.query-builder .rules-group-header .group-conditions .btn{display:flex;align-items:center;min-width:4rem;margin-right:1px;margin-bottom:0;border-color:#c6c6c6;background-color:#fff;color:#40374a}.query-builder.query-builder .rules-group-header .group-conditions .btn.readonly:not(.active),.query-builder.query-builder .rules-group-header .group-conditions input[name$=_cond]{position:static;width:auto;height:auto;margin:0;overflow:auto;clip:auto;margin-right:.5rem}.query-builder.query-builder .rules-group-header .group-conditions .btn:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.query-builder.query-builder .rules-group-header .group-conditions .btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.query-builder.query-builder .rules-group-header .group-conditions .btn.active{border-color:#007c88}.query-builder.query-builder .rules-group-header .group-actions{flex:0 0 100%;gap:.5rem}.query-builder.query-builder .rules-group-header .group-actions .btn-success{margin:0;border:none;border-radius:5px;background-color:#007c88}.query-builder.query-builder .rules-list{padding-left:25px}.query-builder.query-builder .rule-container{display:flex;flex-wrap:wrap;padding:1rem;border:1px solid #c6c6c6;border-radius:0}.query-builder.query-builder .rule-container .rule-header{display:flex;align-items:center;justify-content:flex-end;order:2}.query-builder.query-builder .rule-container .btn-group{width:100%}.query-builder.query-builder .rule-container .form-control{margin-bottom:1rem}.query-builder.query-builder .rule-filter-container,.query-builder.query-builder .rule-operator-container{flex:1 0 auto}.query-builder.query-builder .rule-filter-container .form-control,.query-builder.query-builder .rule-operator-container .form-control{width:100%}.query-builder.query-builder .rule-value-container{flex:0 0 100%;padding-top:1rem;padding-left:0;border-top:1px solid #c6c6c6;border-left:0}.query-builder.query-builder .rule-value-container .form-control{width:100%}.query-builder.query-builder .glyphicon{margin-right:.5rem}.query-builder.query-builder .glyphicon-plus::before,.query-builder.query-builder .glyphicon-plus-sign::before{content:""}.query-builder.query-builder .glyphicon-remove::before{content:""}.query-builder.query-builder .glyphicon-warning-sign::before{content:""}@media(min-width: 992px){.query-builder.query-builder .rules-group-header{margin-bottom:0}.query-builder.query-builder .rules-group-header .group-actions{flex:none;order:2}.query-builder.query-builder .rules-group-header,.query-builder.query-builder .rule-container{flex-direction:row}.query-builder.query-builder .rules-group-header .btn-group,.query-builder.query-builder .rule-container .btn-group{width:auto}.query-builder.query-builder .rules-group-header .form-control,.query-builder.query-builder .rule-container .form-control{margin-bottom:0}.query-builder.query-builder .rule-container{gap:.5rem}.query-builder.query-builder .group-conditions .btn{margin-bottom:0}.query-builder.query-builder .rules-list{padding-left:40px}.query-builder.query-builder .rule-value-container{flex:0 0 auto;padding-top:0;padding-left:5px;border-top:0;border-left:1px solid #c6c6c6}.query-builder.query-builder .rule-value-container .form-control{width:auto}}.fieldset{position:relative}.fieldset__legend{display:flex}.fieldset__legend legend{margin-bottom:0;font-size:1rem;font-weight:600;width:auto;margin-bottom:.25rem;font-size:.875rem}.fieldset--invalid legend{color:#e30036}.fieldset__legend--hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.fieldset__legend--standalone{margin-bottom:1rem}.fieldset__legend+.form-group{margin-top:.25rem}.fieldset--required legend::after{content:"*"}.rule-value-container .tt__container .twitter-typeahead .tt-menu{max-height:6em;overflow-y:auto}.filter .rules-group-container .rules-group-body .rules-list .rule-container .rule-value-container .tt__container .twitter-typeahead .tt-menu{max-height:12em;overflow-y:auto}.form-inline .form-group{margin-right:1rem}.card__content>.row:last-of-type .form-group:last-child{margin-bottom:0}.form-group[data-has-dependency]{margin-left:2rem}.form-control[aria-invalid],.radio-group__input[aria-invalid]+.radio-group__label::before{border-color:#e30036}.form-text{margin-bottom:.5rem;font-size:.875rem}.form-text--error{margin-top:.5rem;color:#e30036}.tt-menu{background-color:#f9f9f9;border:solid 2px #e5e5e5;width:210px;margin-left:1px}.tt-menu .tt-suggestion{background-color:#f9f9f9;color:#40374a;border-bottom:1px solid #e5e5e5;padding:.5rem 1rem;font-weight:normal;text-transform:none}.tt-menu .tt-suggestion:hover{background-color:#e5e5e5}.input{position:relative;margin-bottom:.5rem}.input .input__label{display:flex;position:relative;align-items:center;padding-right:.5rem}.input .input__label .btn{margin-left:.5rem}.input label{margin-bottom:0;font-size:1rem;font-weight:600}.input .form-control[readonly]{border-color:rgba(0,0,0,0);background-color:#f9f9f9}.input .form-control[disabled]{border:solid 1px #c6c6c6;background-color:#f9f9f9;color:#c6c6c6;resize:none}.input .form-control[disabled]::-moz-placeholder{color:#c6c6c6}.input .form-control[disabled]::placeholder{color:#c6c6c6}.input .form-control[disabled]:hover,.input .form-control[disabled]:focus,.input .form-control[disabled]:active,.input .form-control[disabled]:active:focus,.input .form-control[disabled]:active:hover{border-color:#c6c6c6}.input .form-control{width:100%;height:auto;padding:.5rem 1rem;transition:.2s all ease;color:#000;text-align:left;margin-top:.5rem}.input .form-control::-moz-placeholder{color:#707070;font-style:italic}.input .form-control::placeholder{color:#707070;font-style:italic}.input .form-control:hover,.input .form-control:focus,.input .form-control:active,.input .form-control:active:focus,.input .form-control:active:hover{border:1px solid #007c88;box-shadow:none}.input__field{position:relative}.input--search{position:relative}.input--search .form-control{padding-left:2.75rem}.input--search::after{content:"";position:absolute;top:50%;left:1rem;transform:translateY(-50%);font-size:1rem}.input--required label:not(.checkbox-label)::after{content:"*"}.input--required.input--file .input__label>label::after{content:normal}.input.invalid label{color:#e30036}.input.invalid .form-control{border-color:#e30036}.input.invalid .form-control:hover,.input.invalid .form-control:focus,.input.invalid .form-control:active,.input.invalid .form-control:active:focus,.input.invalid .form-control:active:hover{border-color:#e30036}.input--password .input__reveal-password{position:absolute;top:50%;right:1rem;padding:0;transform:translateY(-50%);border:none;background-color:rgba(0,0,0,0)}.input--password .input__reveal-password::after{content:"";color:#c6c6c6;cursor:pointer}.input--password .input__reveal-password:hover::after{color:#555}.input--password .input__reveal-password span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.input--password .input__reveal-password.show::after{color:#000}.input--file{display:block;margin-bottom:1rem}.input--file .input__label{display:flex;z-index:2;flex-direction:column;align-items:center;margin-bottom:1rem}.input--file .input__label label{width:100%}.input--file .input__file-label{display:block;margin-bottom:.5rem;padding:10px 30px;transition:.2s opacity ease;border-radius:1.5rem;background-color:#504d6c;color:#fff;text-align:center;cursor:pointer}.input--file .input__file-label:hover,.input--file .input__file-label:active,.input--file .input__file-label:focus{opacity:.8}.input--file .file{display:flex;align-items:center}.input--file .file__name{max-width:12.5rem;margin-bottom:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.input--file .file__delete{margin-left:.5rem;font-size:unset;cursor:pointer}.input--file .file__delete::before{content:"";font-size:.75rem}.input--file .form-text{font-size:.875rem;font-style:italic}.input--file .form-control-file{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}@media(min-width: 576px){.input--file .input__label{flex-direction:row}.input--file .input__label label{width:auto}.input--file .input__file-label{margin-right:1rem;margin-bottom:0;text-align:left}}.input--autocomplete{font-family:"Open Sans",Helvetica,Arial,sans-serif}.input--autocomplete .form-control{padding-right:2rem}.input--document .progress-bar__container{display:none;margin-bottom:.5rem;padding:.5rem;border-radius:5px;background-color:rgba(0,0,0,0);color:#18856b;text-align:center;vertical-align:middle}.input--document .progress-bar__container .progress-bar__progress{background-color:rgba(24,133,107,.2)}.input--document .progress-bar__container .progress-bar__progress .progress-bar__percentage{display:inline-block;width:100%;text-align:center;font-size:.875rem;color:#18856b;white-space:nowrap}.input--document .progress-bar__container--fail{background-color:rgba(227,0,54,.2);color:#e30036}.input--document .fileupload__files{margin:0 0 .5rem 0;padding:0;list-style-type:none}.input--document.invalid .fileupload__files label{color:#007c88}.input--document.invalid .fileupload__files label::after{content:normal}.datepicker.datepicker-dropdown{padding:.5rem;font-size:.875rem}.datepicker.datepicker table tr td.active.active{background-color:#007c88;background-image:none}.multiple-select fieldset{display:flex;flex-direction:row;align-items:center;width:100%}.multiple-select .form-group{flex-basis:0;flex-grow:1;max-width:100%;margin-bottom:.5rem}.multiple-select label{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.multiple-select .btn-delete{flex:0 0 auto;height:-moz-max-content;height:max-content;margin:.5rem 0 .5rem 1rem}.multiple-select .btn-delete--hidden{display:none}.multiple-select__row{display:flex;flex-wrap:wrap;align-items:center}.multiple-select__row .input{flex-grow:1}.radio-group__option input[type=radio]{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.radio-group__option label{display:flex;position:relative;padding-left:1.5rem}.radio-group__option label::before{content:"";display:inline-block;position:absolute;left:0;flex:0 0 1rem;width:1rem;height:1rem;margin-right:.5rem;transition:.2s all ease;border:1px solid #c6c6c6;background-color:#fff}.radio-group__option label:hover::before{border-color:#007c88}.radio-group__option label::before{top:.2rem;border-radius:50%}.radio-group__option input[type=radio]:focus+label::before{border-color:#007c88;box-shadow:inset 0 1px 1px rgba(0,0,0,.08),0 0 8px rgba(0,124,136,.6)}.radio-group__option input[type=radio]:checked+label::after{content:"";display:inline-block;position:absolute;top:.45rem;left:.25rem;width:.5rem;height:.5rem;border-radius:50%;background-color:#007c88}.radio-group__option input[disabled]+label{color:#c6c6c6}.radio-group__option input[disabled]+label:hover::before{border-color:#c6c6c6}.radio-group__option input[type=radio]:checked:disabled+label::after{background-color:#c6c6c6}.form-inline .radio-group{display:flex}.radio-group--buttons .radio-group__option{border:solid 1px #007c88;background-color:#fff;color:#007c88;border-right:0}.radio-group--buttons .radio-group__option:hover,.radio-group--buttons .radio-group__option:active,.radio-group--buttons .radio-group__option:focus,.radio-group--buttons .radio-group__option:active:focus{border-color:#504d6c;color:#504d6c}.radio-group--buttons .radio-group__option:last-child{border-right:solid 1px #007c88}.radio-group--buttons .radio-group__option .radio-group__label{margin-bottom:0;padding:.5rem 1rem}.radio-group--buttons .radio-group__option .radio-group__label::before,.radio-group--buttons .radio-group__option .radio-group__label::after{content:normal}.radio-group--buttons .radio-group__option input[type=radio]:checked+label{background-color:#007c88;color:#fff}.radio-group--buttons .radio-group__option input[type=radio]:checked+label::after{content:normal}.select{position:relative}.select .select__label{display:flex;padding-right:.5rem}.select label{margin-bottom:0;font-size:1rem;font-weight:600}.select .select__menu-item{padding:.5rem 1rem;transition:.2s all ease}.select .select__menu-item:focus,.select .select__menu-item:active,.select .select__menu-item.select__menu-item--active{color:#007c88}.select .select__menu-item:hover,.select .select__menu-item.select__menu-item--hover{font-weight:600;cursor:pointer}.select .form-text{margin-bottom:.5rem;font-size:.875rem}.select__toggle{width:100%;height:auto;padding:.5rem 1rem;transition:.2s all ease;color:#000;text-align:left;display:flex;align-items:center;justify-content:space-between;margin-top:.5rem;white-space:normal}.select__toggle::-moz-placeholder{color:#707070;font-style:italic}.select__toggle::placeholder{color:#707070;font-style:italic}.select__toggle:hover,.select__toggle:focus,.select__toggle:active,.select__toggle:active:focus,.select__toggle:active:hover{border:1px solid #007c88;box-shadow:none}.select__toggle::after{content:"";transform:rotate(90deg);border:0;color:#40374a;font-size:10px}.select__toggle span{padding-right:1rem;color:#000}.select__toggle .select__placeholder{color:#707070;font-style:italic}.select.invalid label{color:#e30036}.select.invalid .select__toggle{border-color:#e30036}.select.show .select__toggle::after{transform:rotate(-90deg)}.select__value{display:flex}.select__prefix{margin-right:1.25rem;margin-bottom:0;color:#007c88;text-transform:uppercase}.select__menu{width:100%;max-height:19em;overflow-x:hidden;overflow-y:scroll}.select--required label::after{content:"*"}.select__toggle[disabled]{border:solid 1px #c6c6c6;background-color:#f9f9f9;color:#c6c6c6;resize:none}.select__toggle[disabled]::-moz-placeholder{color:#c6c6c6}.select__toggle[disabled]::placeholder{color:#c6c6c6}.select__toggle[disabled]:hover,.select__toggle[disabled]:focus,.select__toggle[disabled]:active,.select__toggle[disabled]:active:focus,.select__toggle[disabled]:active:hover{border-color:#c6c6c6}.select__toggle[disabled] span,.select__toggle[disabled]::after{color:#c6c6c6}.select-reveal__instance{display:none}.tree{font-size:.875rem}.tree .jstree-default .jstree-icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAABgCAYAAABsS6soAAAACXBIWXMAAAsSAAALEgHS3X78AAAJNklEQVR4nO3d72tb1x3H8a9LnBIyMoVCoL1rLUNCCy6NszFKBy1yGKvIowZxwp45poU96IPY+wcs/wN1UtjDYudZ6eHi7MHGzRiz1z5Z6da4a8LStZCETC4LjDjN3HRJWMcRR56aRFeSde+5uve8X2BibEXfo6urj86PKx/Bzimlvs3y8PleH35L4vx7zPeDCMBfBCAAbxGAALxFAALwFgEIwFsEIABvEYAAvEUAAvDWLp565EEQRq+JyKkem3qmUaueS/JhKaX6qq+1LlT9oiIAMbAgjCYbtep6WkfSht9KH/+lEoTR8aRC0IZPX/WVUseTCqGs6xcZAZhDSqmK1nptGFoehNGSiJRFZCrFMs2ez4mxQNTYU7E31Nc25L1rDfPttIgkFQDN+pVKpfkVZ21trflVsPqFRQDm06pSajnrln/x4ivmn5Misumi3qul74l8/lnsbdShZ1sBWEq6/uMTL8jPLl+Pvc3vKpVWABWufifmDdmckyKyoLWuu6qbBBZB8ssEjzn5nJ3o7UzP78b4odZPMmmDrw5++L7sund3+9Hv3fyXPH3xQpZHw0x/mDfkeaXUBaXUZF6eGgIw/1Zdh2AQRvVWAMO9L5+dkOc++H0zBE34jX/8YfNnWdFab2qtZ0TkuJ0OMefkbB5ODQIw/yZdhmAQRib45h/x83LxDu1w2io9IVd++GIzBE34XX75p3J/dHfmbbWLLuNmKlJEFpVS5rwc6vOCOcAB7fRvkmmtRxJshgnBm0qpVNtgw2/pUb97/g+/vfKTPuon/PiREKXUzQSnNMzcoBmb7x/W54cAHMAQvYiX7RAkbYftu/tDLh49NpfmpTD4v9aw1/T8Ht+63ewJJtgLXEggAL8vIq0h8FCvRBOA+TentT7t4lE0atW5gh/LXGgf9t63w+Hyx39qrcoPZNBzya4Ir9grA8y5mfnVCnGYA8y3GVfhh+Fx8eix7/T2zJxgEuE3KKVU3V4Oc9VcFzrs4Sf0AHMrF++uSfvk6//I4QNPxt7r+Wsb6TWgcV0Wgqdjb2KvwStm/Q7sAtyqnYs+rbXOzUiBAMwhrfXQTiqn5KyZUH/786v93PuZBJvSrH/+XD+fRitU/W7K9it3H79jJQ65YFegp3tsaxp/DKGv+in8MYRM6w8jcwUGVxMA8BLbYgLAAAhAAN4iAAF4iwAE4C0CEIC3CEAA3iIAAXiLAATgLQJwQElcjDkI3+sDgyAAAXiLAATgLQIQgLcIQADeIgABeIsABOAtAhCAtwhAAN5iTxDkQhBGr4nIvN14J47ZMGo56S08fa9fVPQA0bcgjEpBGJVdHbkgjFp7zXZ78Yvd1Hs2CKNF6ruhlJpUSs26qpckeoDYCXOynwrCaErefcfFAWxuBvTqUwdk4dAzsm90tOMNP7j1b/nFR5+KbWNSvaDt+ieeCWTf7s4vm39s3ZG5v1wsWv1uTEAvKqWm7c5wfW3flyUCsADsjmGLjrfLND2Nlfu7d/dw04E1e5tvHByT63//LPa+Xp6YSLW+ev+j2BvqV35cxPrxNbU+rZQyobckIheUUgt52bCfIXAxLNlAcmXM1ilfOnqsOST2/Qlwqf7Cc3JiLNiuuG90VybB185uwzlu9ma3vcFVpZSzaZKdogeYY0qpekat3z6xt0pPmH9WzXC4Uatu5vyQ5kL9r5dl8UfPN5sabfxT3nnpiNQ/uZxI05VSlQHv4oxdiDlpe4NzWuvlRBqXAgIwp5RSS/YkGwaThKBbZp7PhODrB8fkl3/+VC7duj1wfbOYYZ7HBB+IGRmYxRgCcNj5/nf1+ql/6caXcuvAkw/+eNKe7DOJNw4PMcPeH+zd01z0mCjtSyQAtdbrIjIy6P3YkYm5ZGd92M8HAtDSWg/8xLuqr5Qq2XfqXi6LSLx+8PPXVzrMOZaDMJps1KrrSbULDzPh1xr2muBrDYffu9bI9GjZ83LFrgqbXp8Z/g71iIAAzCFzUimlppIOwV41atXjnhzqofTGwfJ2+IkdDpuFkSzZucMV24SZYZ73a8cqcE7Zd9apYZ5fSdpXd+9TX0Te+tsXDw15zcJIVtrmDs2lMEfyEn5CDzDfbAjOKKVkiBZE0vBHM6wyL/z64fiezltXN1rfJjn02q7f7XKT8xs3ili/F3N5ufavHQFYAFprE4JnC/wQTY/i1KVbt0vdLgRus0B9N+ziSS7nfTOd+Ad6ZT97PN9+DWIHpudztlGrnkvy4PpefxiZKxeyXrwEgEwkcekYiyAAvEUAAvAWAQjAWwQgAG8RgAC8RQAC8BYBCMBbBCAAbxGAALxFAALwFgEIwFsEIABvEYAAvEUAAvAWAQjAWwQgAG8RgAC8xZ4gORKE0ardc7Wb5o5x7M8LxCMA+xSE0azZpKZRqzrddSsIo4rdD2J/t9pBGC3a/SPYvxeIkVgA2hfoqZQ3zb5ptt+L2Qu3tT/p/hTbYMJlOgijKdchaPZdNTWDMDKPs9ThNqbX92sbgABiJNkDNMEwk/LBnrIBJ48IwVb4zaXcBqnsGZ1cu3NvNaMQFPs4OwXgXF63KARcSyQAgzAym3KvO5hzWu8Qgu3hl/qu9G+W9jRr2hCccT3X1qhVY3u4tjcOoIukeoDzNphceDAE112GX8sDIeh0wcHOQ3bqARZ+P1ggKQNfBhOEUd1uxHzV4bPSCsHFLMKvxYTgm6U9JohW7bycK53CT7r8DkCbgXqAQRiZF9u0iBzx9aDuHRmRvY+NlLb++23Z1dxbo1atx/2eITDQm74CMAijK+bSirbh3qzt/bleCGif81uPWRhJ1dqde/KrzTumhJkHdDb0tM9DucOvzUKUy944kFv99gDNi2vJzHnZodZ0o1Ydd/zgH7XgEbc6nAobfpv2DWHN3cNv9gBjjzk9QKA3fc0B2hf6GRFZsQsfC46Pc6fV3vY5wZNpN+I3W3db4TflOvwAJKfvRZBGrbpsh1iT9nuX4hY82kMw1YWA5a++4aNmQAHsaBGkUaumfcFzJ90+4bGe8qdAxIbvguNVbwAp4LPAfcow/I2yWXnvYdGJOUCgBwRgTpi5xiCMTPDdDMKoW6M3HXwsEcg9AjBHGrWqt9dbAmngD6IC8BYBCMBbBCAAbxGAALxFAALwFgEIwFsEIAA/icj/ABwNU62ic/TFAAAAAElFTkSuQmCC)}.tree .jstree-default .jstree-clicked{background-color:#007c88;color:#fff;text-decoration:none}.tree .list--buttons .list__item .btn{margin-bottom:0}.select-widget .form-text{margin-bottom:.5rem;font-size:.875rem;margin-top:0}.select-widget .form-text--error{margin-top:.5rem}.select-widget .form-control{width:100%;height:auto;padding:.5rem 1rem;transition:.2s all ease;color:#000;text-align:left;display:flex;position:relative;align-items:center;justify-content:space-between;margin-top:.25rem;padding-bottom:0;white-space:normal}.select-widget .form-control::-moz-placeholder{color:#707070;font-style:italic}.select-widget .form-control::placeholder{color:#707070;font-style:italic}.select-widget .form-control:hover,.select-widget .form-control:focus,.select-widget .form-control:active,.select-widget .form-control:active:focus,.select-widget .form-control:active:hover{border:1px solid #007c88;box-shadow:none}.select-widget .form-control::after{content:"";position:absolute;top:50%;right:1rem;transform:translateY(-50%) rotate(90deg);border:0;color:#40374a;font-size:10px}.select-widget .current{display:flex;flex-wrap:wrap;align-items:center}.select-widget .current li{margin-right:.5rem;margin-bottom:.5rem}.select-widget .current li[data-list-item]{display:flex;align-items:center;padding:0 .5rem;border-radius:7px;background-color:#c6c6c6;color:#000}.select-widget .current .widget-value__value{padding-right:.2rem}.select-widget .current .none-selected{display:none}.select-widget .current.empty .none-selected{display:inline-block}.select-widget .form-control-search{padding:0 .5rem;border:0;border-left:1px solid #c6c6c6;outline:0}.select-widget .form-control-search::-ms-clear{display:none;width:0;height:0}.select-widget .form-control-search::-ms-reveal{display:none;width:0;height:0}.select-widget .form-control-search::-webkit-search-decoration,.select-widget .form-control-search::-webkit-search-cancel-button,.select-widget .form-control-search::-webkit-search-results-button,.select-widget .form-control-search::-webkit-search-results-decoration{display:none}.select-widget .form-control-search::-moz-placeholder{color:#707070;font-style:italic}.select-widget .form-control-search::placeholder{color:#707070;font-style:italic}.select-widget .available{padding:.5rem 0;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;background-color:#fff}.select-widget .available .answer,.select-widget .available .has-noresults,.select-widget .available .spinner{padding:.5rem 1rem 0}.select-widget .available .answer label,.select-widget .available .has-noresults label,.select-widget .available .spinner label{margin:0}.select-widget .available .alert{margin-top:0;padding-bottom:.5rem}.select-widget .available .answer{display:flex;align-items:center;justify-content:space-between}.select-widget+.btn{margin-top:.5rem}.select-widget.invalid .form-control{border-color:#e30036}.select-widget--open .form-control::after{transform:translateY(-50%) rotate(-90deg)}.select-widget-value__delete{font-size:1rem}.select-widget-dropdown ul{margin:0;padding:0;list-style-type:none}.switch input[type=checkbox]{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.switch label{position:relative;margin-bottom:0;padding-left:3rem}.switch label::before{content:"";display:block;position:absolute;top:50%;left:0;width:2rem;height:1rem;transform:translateY(-50%);border-radius:1rem;background:#c6c6c6;cursor:pointer}.switch label::after{content:"";position:absolute;top:50%;left:.1rem;box-sizing:content-box;width:.5rem;height:.5rem;transform:translateY(-50%);transition:.2s all ease;border:3px solid rgba(0,0,0,0);border-radius:.8rem;background:#fff;cursor:pointer}.switch input+label:hover::after,.switch input:focus+label::after{left:0;width:calc(.5rem + 3px);height:calc(.5rem + 3px);border:3px solid rgba(0,124,136,.4)}.switch input:checked+label::before{background:#007c88}.switch input:checked+label::after{left:1.9rem;transform:translate(-100%, -50%)}.switch input:checked+label:hover::after,.switch input:checked:focus+label::after{left:2rem}.textarea{position:relative}.textarea .form-control{width:100%;height:auto;padding:.5rem 1rem;transition:.2s all ease;color:#000;text-align:left;margin-top:.5rem}.textarea .form-control::-moz-placeholder{color:#707070;font-style:italic}.textarea .form-control::placeholder{color:#707070;font-style:italic}.textarea .form-control:hover,.textarea .form-control:focus,.textarea .form-control:active,.textarea .form-control:active:focus,.textarea .form-control:active:hover{border:1px solid #007c88;box-shadow:none}.textarea .textarea__label{display:flex;padding-right:.5rem}.textarea label{margin-bottom:0;font-size:1rem;font-weight:600}.textarea .form-control[disabled]{border:solid 1px #c6c6c6;background-color:#f9f9f9;color:#c6c6c6;resize:none}.textarea .form-control[disabled]::-moz-placeholder{color:#c6c6c6}.textarea .form-control[disabled]::placeholder{color:#c6c6c6}.textarea .form-control[disabled]:hover,.textarea .form-control[disabled]:focus,.textarea .form-control[disabled]:active,.textarea .form-control[disabled]:active:focus,.textarea .form-control[disabled]:active:hover{border-color:#c6c6c6}.textarea.invalid label{color:#e30036}.textarea--monospace .form-control{font-family:monospace}.textarea--required label::after{content:"*"}.input-group .form-control{border-radius:5px}@media(min-width: 576px){.input-group .btn{border-radius:0 5px 5px 0;border-left:0;padding:0 20px}.input-group .form-control{border-radius:5px 0 0 5px}}.graph{margin-bottom:2rem}.graph__container{height:32rem}.link{transition:.2s all ease;border-bottom:1px solid rgba(0,0,0,0);cursor:pointer}.link:hover,.link:focus,.link:active,.link.link--active{border-bottom:1px solid #007c88;color:#007c88;text-decoration:none}.link--bold{font-weight:600}.link--plain{color:#40374a}.link--primary{display:inline-block;padding:.5rem .75rem;color:#504d6c;font-size:.875rem;font-weight:600}.link--primary span{border-bottom:2px solid rgba(0,0,0,0)}.link--primary:hover,.link--primary:focus,.link--primary:active{border-bottom-color:rgba(0,0,0,0);color:#504d6c}.link--primary:hover span,.link--primary:focus span,.link--primary:active span{border-bottom:2px solid #504d6c}.link--primary.link--active{border-bottom:0;border-radius:5px;background-color:#504d6c;color:#fff}.link--primary.link--active span{border-bottom:0}.link--next,.link--add,.link--table,.link--graph,.link--calendar,.link--timeline{display:inline-flex;position:relative;align-items:center;padding-left:1.75rem}.link--next::before,.link--add::before,.link--table::before,.link--graph::before,.link--calendar::before,.link--timeline::before{position:absolute;top:50%;left:0;padding-right:1rem;transform:translateY(-50%);font-size:1rem}.link--next.link--primary,.link--add.link--primary,.link--table.link--primary,.link--graph.link--primary,.link--calendar.link--primary,.link--timeline.link--primary{padding-left:3rem}.link--next.link--primary::before,.link--add.link--primary::before,.link--table.link--primary::before,.link--graph.link--primary::before,.link--calendar.link--primary::before,.link--timeline.link--primary::before{left:.75rem}.link--next::before,.link--add::before,.link--table::before,.link--graph::before,.link--calendar::before,.link--timeline::before{content:"";font-size:1rem}.link--table::before,.link--graph::before,.link--calendar::before,.link--timeline::before{font-size:1.5rem}.link--table::before{content:""}.link--graph::before{content:""}.link--timeline::before{content:""}.link--calendar::before{content:""}.link--add{color:#007c88}.link--add::before{content:""}.link--phone{display:inline-flex;position:relative;align-items:center;padding-left:1.75rem}.link--phone::before{position:absolute;top:50%;left:0;padding-right:1rem;transform:translateY(-50%);font-size:1rem}.link--phone.link--primary{padding-left:3rem}.link--phone.link--primary::before{left:.75rem}.link--phone::before{content:""}.link--email{display:inline-flex;position:relative;align-items:center;padding-left:1.75rem}.link--email::before{position:absolute;top:50%;left:0;padding-right:1rem;transform:translateY(-50%);font-size:1rem}.link--email.link--primary{padding-left:3rem}.link--email.link--primary::before{left:.75rem}.link--email::before{content:""}.link--alert{display:inline-flex;position:relative;align-items:center;padding-right:1.5rem}.link--alert::after{position:absolute;top:50%;right:0;transform:translateY(-50%);font-size:1rem}.link--alert::after{content:""}@media(min-width: 768px){.link--primary{font-size:1rem}}.list__title{font-size:1rem;font-weight:600;line-height:1.35;color:#40374a}.list__items{margin:0;padding-left:.5rem;list-style-type:none}.list__item{padding-bottom:.5rem}.list--horizontal .list__items{display:flex;gap:1rem;flex-wrap:wrap;align-items:center;padding:0}.list--horizontal .list__item{padding-right:1rem;padding-bottom:0;border-right:1px solid #c6c6c6}.list--horizontal .list__item:last-child{padding-right:0;border-right:none}.list--horizontal .list__item .link--active{border-bottom:none}.list--horizontal.list--no-borders{gap:1rem}.list--horizontal.list--no-borders .list__item{padding-right:0;border-right:none}.list--horizontal.list--no-borders .list__item:last-child{padding-right:0}.list--checkboxes .list__items{flex-direction:column;padding:0}@media(min-width: 768px){.list--checkboxes.list--horizontal .list__items{flex-direction:row}.list--checkboxes.list--horizontal .list__item{flex-basis:calc(33.33% - 1rem);flex-grow:0;flex-shrink:0;max-width:13rem}}@media(min-width: 1200px){.list--checkboxes.list--horizontal .list__item{flex-basis:calc(25% - 1rem)}}.list--key-value .list__items{width:100%;padding:0}.list--key-value .list__items:not(:last-child){margin-bottom:1rem}.list--key-value .list__item{display:flex;flex-wrap:wrap;width:100%}.list--key-value .list__item:last-child{padding-bottom:0}.list--key-value .list__item--blank{display:none}.list--key-value .list__key{flex:0 0 100%;padding-right:1rem;font-weight:600}@media(min-width: 768px){.list--key-value .list__key{flex:0 0 9.375rem;width:auto;padding-right:2rem}.card--topic .list--key-value .list__key{flex:0 0 14rem}.list--key-value .list__value{flex:1}}.list--buttons .list__items{flex-direction:column;width:100%}.list--buttons .list__item{border-right:0}.list--buttons .list__item .btn{margin-bottom:10px;padding-bottom:10px}.list--buttons .list__item .btn-small{padding-top:7px;padding-bottom:7px}@media(min-width: 576px){.list--buttons .list__items{flex-direction:row;align-items:center;width:auto}.list--buttons .list__item{border-right:1px solid #c6c6c6}}.list--tabs .list__items{display:flex;flex-wrap:wrap;margin:0;padding:0;border-bottom:2px solid #504d6c}.list--tabs .list__item{padding:.5rem .5rem;border-top:2px solid #c6c6c6;border-left:2px solid #c6c6c6}.list--tabs .list__item:first-of-type{border-top-left-radius:5px}.list--tabs .list__item:last-of-type{border-right:2px solid #c6c6c6;border-top-right-radius:5px}.list--tabs .list__item .link{display:block;border-bottom:2px solid rgba(0,0,0,0)}.list--tabs .list__item .link:hover,.list--tabs .list__item .link:active,.list--tabs .list__item .link:focus{border-bottom-color:#504d6c}.list--tabs .list__item--active{position:relative;border-right:2px solid #504d6c;border-top-left-radius:5px;border-top-right-radius:5px;border-color:#504d6c;background-color:#f9f9f9}.list--tabs .list__item--active:last-of-type{border-right-color:#504d6c}.list--tabs .list__item--active+.list__item{border-left:0}.list--tabs .list__item--active::before{content:"";display:block;position:absolute;z-index:-1;top:-2px;right:-3px;left:-3px;height:2px;background-color:#c6c6c6}.list--tabs .list__item--active:first-of-type::before{left:0}.list--tabs .list__item--active:last-of-type::before{right:0}.list--tabs .list__item--active::after{content:"";display:block;position:absolute;right:0;bottom:-2px;left:0;height:2px;background-color:#f9f9f9}.list--tabs .link{border-bottom:none;color:#504d6c;font-size:.875rem}.list--tabs h2{margin-bottom:0;color:#555;font-size:.875rem;font-weight:normal}@media(min-width: 768px){.list--tabs .list__item{padding:.5rem 1rem}.list--tabs .link,.list--tabs h2{font-size:1.125rem;font-weight:600}}@media(min-width: 768px){.modal .list--checkboxes .list__item{flex:0 0 50%}}@media(min-width: 1200px){.modal .list--checkboxes .list__item{flex-basis:calc(33.33% - 1rem)}}.login{display:flex;flex-direction:column;min-height:100vh;padding:2rem 2rem;background:linear-gradient(0deg, #F9F9F9 0%, #3FB5C1 0%, #504D6C 100%)}.login__main{display:flex;flex:1 1 auto;align-items:center;justify-content:center}.login__logo{margin-bottom:2rem;text-align:center}.login__logo img{width:130px;height:auto}.login__form{padding:2rem 2rem;background-color:#fff;box-shadow:0 0 7px rgba(0,0,0,.1)}.login__head{margin-bottom:2rem}.login__title{font-size:1.125rem;font-weight:600;line-height:1.35;margin-top:0;margin-bottom:2rem;color:#504d6c;text-align:center}.login__intro{text-align:center}.login__subtext{margin-top:1rem;color:#fff;text-align:center}.login__subtext a{font-size:1.125rem;font-weight:600;line-height:1.35;color:#fff;text-decoration:underline}.login__subtext a:hover{color:#fff;text-decoration:none}.login__footer-container{font-size:1rem;font-style:italic;font-weight:400;line-height:1.38;display:flex;align-items:center;justify-content:flex-end;margin-top:1.5rem;color:#fff}.login__footer-logo{width:83px;height:auto;margin-left:1rem}@media(min-width: 576px){.login__btns{display:flex;justify-content:space-between}.login__btns .btn:only-child{flex:1 1 100%}.login__fields+.login__btns{margin-top:2rem}.login__fields .btn:only-child{width:100%}}@media(min-width: 992px){.login__logo{margin-bottom:4rem}.login__fields+.login__btns{margin-top:3rem}}.modal-open .modal{z-index:1080}.modal-content{border:none;border-radius:0;box-shadow:0 0 7px rgba(0,0,0,.2)}.modal-body{padding-top:0}.modal-header{padding-bottom:1rem;border-bottom:0}.modal-header .close{margin-bottom:-1rem;padding-bottom:1rem;line-height:1rem}.modal-header .close::before{content:"";font-size:1rem}.modal--wizzard .modal-header{padding-top:1.5rem;padding-bottom:1.5rem;border-radius:0;background-color:#504d6c;color:#fff}.modal--wizzard .modal-header .close{color:rgba(0,0,0,0)}.modal--wizzard .modal-body{padding:2rem 1.5rem}.modal--wizzard .modal-header__content{display:flex;align-items:center;justify-content:space-between;width:100%}.modal--wizzard .modal__steps{margin:0;list-style:none;counter-reset:step-counter}.modal--wizzard .modal__step{display:inline-block;counter-increment:step-counter}.modal--wizzard .modal__step::before{content:counter(step-counter);display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:1px solid #fff;border-radius:1.25rem;color:#fff;text-align:center}.modal--wizzard .modal__step span{display:none}.modal--wizzard .modal__step--active::before{background-color:#fff;color:#504d6c}.modal--wizzard .modal-title{color:#fff}@media(min-width: 992px){.modal--wizzard .modal__step:not(:last-child){margin-right:1rem}.modal--wizzard .modal__step--active::before{margin-right:.5rem}.modal--wizzard .modal__step--active span{display:inline}}.modal-footer{display:block}.modal-footer>*{margin:0}.modal-footer .btn{width:100%}.modal-footer_sticky{position:sticky;z-index:999;bottom:1rem}.modal-footer__left{margin-bottom:1rem}.modal-footer__right .btn:not(:last-child){margin-bottom:1rem}@media(min-width: 992px){.modal-footer{display:flex;justify-content:space-between}.modal-footer .btn{width:auto}.modal-footer__left,.modal-footer__right .btn:not(:last-child){margin-bottom:0}.modal-footer__left{margin-bottom:0}.modal-footer__right .btn:first-child:not(:only-child){margin-right:1rem}}.trigger{white-space:nowrap}.expandable{display:none}.expandable.expanded{display:block}.expandable.expanded.card{box-shadow:0 0 7px rgba(0,0,0,.2)}.expandable.expanded.popover{max-width:none}.more-less{position:relative}.more-less .table-curcommon .link{display:table-row}.more-less .table-curcommon tr td{padding:.5rem;border-top:1px solid #c6c6c6}.more-less .table-curcommon tr:first-of-type td{border-top:none;padding-top:0}.more-less .table-curcommon tr:last-of-type td{padding-bottom:0}.more-less .table-curcommon tr td:first-child{padding-left:0}.more-less .table-curcommon tr td:last-child{padding-right:0}.more-less .table-curcommon tr:hover{background-color:rgba(0,0,0,0)}.page-header{position:relative}.page-header_container{display:flex;justify-content:flex-end;width:100%;padding:1rem 0}.page-header_container::before{content:"";position:absolute;top:0;right:-1.25rem;bottom:0;left:0;background-color:#fff}@media(min-width: 992px){.page-header_container::before{right:-2rem}}.popover-container{position:initial}.popover-container:not(.popover-container--text) .popover__btn{position:relative;width:1rem;margin-left:.5rem;padding:0;border:0;background-color:rgba(0,0,0,0)}.popover-container:not(.popover-container--text) .popover__btn::before{content:"";transition:font-size .3s ease-in-out;color:#007c88;font-size:.938rem}.popover-container:not(.popover-container--text) .popover__btn:hover::before{font-size:1rem}.popover-container:not(.popover-container--text) .popover__btn:focus::before{border-radius:50%;box-shadow:0 0 0 .2rem rgba(0,124,136,.2)}.popover-container .popover__btn .arrow{display:none;position:absolute;z-index:101;bottom:-1px;left:0;width:1rem;height:.5rem;transform:translateY(100%)}.popover-container .popover__btn .arrow::before,.popover-container .popover__btn .arrow::after{content:"";display:block;position:absolute;border-width:0 .5rem .5rem .5rem;border-style:solid;border-color:rgba(0,0,0,0)}.popover-container .popover__btn .arrow::before{border-bottom-color:#007c88}.popover-container .popover__btn .arrow::after{top:1px;border-bottom-color:#fff}.popover-container .popover__btn .arrow.show{display:block}.popover-container .popover{display:none;z-index:1;top:1.5rem;max-width:100%;margin-top:.375rem;overflow-y:auto;border-color:#007c88;max-height:15rem}.popover-container .popover.show{display:block;z-index:100}.popover-container .popover-body{padding:1rem;overflow-y:auto;font-size:1rem}.popover-container--top .popover{top:-0.9rem;transform:translateY(-100%)}.popover-container--top .popover__btn .arrow{top:-1px;bottom:auto;transform:translateY(-100%) rotate(180deg)}.popover-container--large .popover-body{max-height:20rem}.popover-container--text .popover__btn{position:relative}.popover-container--text .popover__btn .arrow{left:50%;transform:translate(-50%, 100%)}.popover-container--text .popover{margin-top:1.125rem}span.rag span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}span.rag::before{margin-right:.5rem;padding:.313rem;border-radius:.125rem;color:#fff;font-size:1.25rem}.rag--danger::before{content:"";background-color:#e30036}.rag--warning::before{content:"";background-color:#f99d27}.rag--advisory::before{content:"";background-color:#ffc107}.rag--success::before{content:"";background-color:#18856b}.rag--undefined::before{content:"";background-color:#c6c6c6}.rag--unexpected::before{content:"";background-color:#504d6c}.rag--complete::before{content:"";background-color:#3b3af2}.rag--attention::before{content:"";background-color:#e30036}.rag--blank::before{content:"_";padding:0 .4375rem;background-color:rgba(0,0,0,0);color:#555;font-size:2rem;line-height:.95}.rag-legend__list{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:0;row-gap:.5rem}.rag-legend__title{display:block;margin-bottom:.5rem;font-weight:600}.rag-legend__meaning{flex-basis:calc(100% - 2.6rem);flex-grow:0;flex-shrink:0;margin-bottom:0}.rag-legend--horizontal{margin-bottom:1rem;font-size:.875rem}.rag-legend--horizontal .rag-legend__list{display:grid;grid-template-columns:2.5rem auto 2.5rem auto}.rag-legend--horizontal .rag-legend__meaning{margin-right:1rem}.rag-legend--horizontal .rag-legend__item:nth-of-type(odd){grid-column:1}.rag-legend--horizontal .rag-legend__meaning:nth-of-type(odd){grid-column:2}.rag-legend--horizontal .rag-legend__item:nth-of-type(even){grid-column:3}.rag-legend--horizontal .rag-legend__meaning:nth-of-type(even){grid-column:4}@media(min-width: 768px){.rag-legend--horizontal{margin-bottom:1rem}.rag-legend--horizontal .rag-legend__title{margin-right:.5rem}.rag-legend--horizontal .rag-legend__list{display:flex}.rag-legend--horizontal .rag-legend__meaning{flex-basis:auto;margin-right:1rem;margin-bottom:0}}.readonly{margin-bottom:2rem}.readonly--center{text-align:center}.readonly__value{display:block;margin-top:.5rem;padding:.5rem;background-color:#f9f9f9}.sidebar{min-height:35rem;padding:50px 0 80px;color:#fff;transition:all .2s ease}.sidebar::before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(0deg, #F9F9F9 0%, #3FB5C1 0%, #504D6C 100%)}@supports(position: sticky){.sidebar{height:100vh}}.sidebar:not(.sidebar--collapsed){flex:1 1 auto}.sidebar__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:50px;padding-right:2rem}.sidebar__logo,.sidebar__menu{position:relative}.sidebar__logo{flex:0 1 150px;padding-left:15px}.sidebar__logo img{width:100%;height:auto}.sidebar__toggle{border:none;background-color:rgba(0,0,0,0);box-shadow:none;position:relative;padding:9px 15px}.sidebar__toggle:hover,.sidebar__toggle:focus,.sidebar__toggle:active,.sidebar__toggle:active:focus,.sidebar__toggle:active:hover{border:none;outline:0;background-color:rgba(0,0,0,0);box-shadow:none}.sidebar__toggle::before{content:"";transform:rotate(180deg);transition:transform .2s ease;color:#fff;font-size:1.25rem}.sidebar__toggle:hover::before,.sidebar__toggle:active::before,.sidebar__toggle:focus::before,.sidebar__toggle:active:focus::before{transform:rotate(180deg) scale(1.25)}.sidebar__toggle span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.sidebar__menu{display:flex;flex:1 1 auto;flex-direction:column;justify-content:space-between}.sidebar__nav{font-size:1rem}.sidebar__nav .nav__item{padding:10px 0}.nav__link::before{width:32px;text-align:center}.nav__link span{padding-left:.5rem}.nav__link--dashboard::before{content:"";font-size:25px}.nav__link--tables::before{content:"";font-size:27px}.nav__link--users::before{content:"";font-size:30px}.nav__link--groups::before{content:"";font-size:30px}.nav__link--files::before{content:"";font-size:28px}.nav__link--admin-settings::before{content:"";font-size:28px}.nav__link--shortcut::before{content:"";font-size:21px}.sidebar__nav .nav__link,.sidebar__shortcuts .nav__link{display:flex;align-items:center;padding:10px 15px;transition:.2s all ease;color:#fff}.sidebar__nav .nav__link:hover,.sidebar__nav .nav__link:active,.sidebar__nav .nav__link:focus,.sidebar__nav .nav__link:active:focus,.sidebar__nav .nav__link.nav__link--active,.sidebar__shortcuts .nav__link:hover,.sidebar__shortcuts .nav__link:active,.sidebar__shortcuts .nav__link:focus,.sidebar__shortcuts .nav__link:active:focus,.sidebar__shortcuts .nav__link.nav__link--active{outline:0;background-color:rgba(255,255,255,.4);text-decoration:none}.sidebar__bottom{display:flex;position:absolute;bottom:2rem;justify-content:center;width:100%}.sidebar__bottom .sidebar__logo{display:none;flex:0 0 32px;padding-left:0}.sidebar__shortcuts h1{font-size:1.125rem;font-weight:600;line-height:1.33;padding-left:1rem}.sidebar--collapsible.sidebar--collapsed{flex:0 0 3.875rem;padding:50px 0 2rem}.sidebar--collapsible.sidebar--collapsed .sidebar__header{justify-content:center;padding-right:0}.sidebar--collapsible.sidebar--collapsed .sidebar__header .sidebar__logo{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.sidebar--collapsible.sidebar--collapsed .sidebar__shortcuts,.sidebar--collapsible.sidebar--collapsed .nav__link span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.sidebar--collapsible.sidebar--collapsed .sidebar__toggle::before{transform:rotate(0)}.sidebar--collapsible.sidebar--collapsed .sidebar__toggle:hover::before,.sidebar--collapsible.sidebar--collapsed .sidebar__toggle:active::before,.sidebar--collapsible.sidebar--collapsed .sidebar__toggle:focus::before,.sidebar--collapsible.sidebar--collapsed .sidebar__toggle:active:focus::before{transform:rotate(0) scale(1.3)}.sidebar--collapsible.sidebar--collapsed .sidebar__bottom .sidebar__logo{display:block}@media(min-width: 992px){.sidebar--collapsible.sidebar--collapsed{margin-left:-2rem}}.sidebar--collapsible+.main--expanded{flex:1;min-width:0}@media(min-width: 992px){.sidebar::before{left:-2.5rem}.sidebar .sidebar__toggle{display:block}.sidebar--collapsible+.main--expanded{max-width:none}}@media(min-width: 1200px){.sidebar__nav{font-size:1.125rem;font-weight:600;line-height:1.33}.nav__link span{padding-left:1rem}}.skip-links{position:absolute;z-index:1030;top:0;left:0;margin:0 0 0 2rem;padding:0;list-style-type:none}.skip-links a{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0;display:block;padding:1rem;border:1px solid #007c88;outline:0;background-color:#fff}.skip-links a:focus{position:static;width:auto;height:auto;margin:0;overflow:auto;clip:auto}.sortable .btn-default{margin-top:.5rem}.sortable .btn-icon-close{margin-left:.75rem}.sortable .btn-icon-close .btn__title{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.sortable__list{margin:0;padding:0}.sortable__handle{width:auto;padding:0;border:0;border-radius:0}.sortable__handle::before{content:"";margin-right:.75rem;cursor:grab}.sortable__handle span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.sortable .btn-icon-close--hidden,.sortable__handle--hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.sortable label{margin-bottom:0;font-size:1rem;font-weight:600}.sortable__row{display:flex;align-items:center}.sortable__row .input{width:100%}.sortable__row--hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.note-frame.card{padding:0}.note-btn-group .note-btn{margin-right:0;margin-bottom:0}.note-modal .modal-header .modal-title{color:#40374a}.note-modal .modal-header .close::before{content:normal}.note-modal .modal-body .form-check{margin-bottom:1rem;padding-left:1.5rem}.note-modal .modal-body .form-check-input{margin-left:-1.5rem}.note-modal .modal-body .form-check-input::before{content:"";display:inline-block;position:absolute;left:0;flex:0 0 1rem;width:1rem;height:1rem;margin-right:.5rem;transition:.2s all ease;border:1px solid #c6c6c6;background-color:#fff}.note-modal .modal-body .form-check-input:hover::before{border-color:#007c88}.note-modal .modal-body .form-check-input::before{top:.125rem;border-radius:5px}.note-modal .modal-body .form-check-input::before{top:50%;left:-1px;transform:translateY(-50%)}.note-modal .modal-body .form-check-input:focus{outline:0}.note-modal .modal-body .form-check-input:focus::before{border-color:#007c88;box-shadow:inset 0 1px 1px rgba(0,0,0,.08),0 0 8px rgba(0,124,136,.6)}.note-modal .modal-body .form-check-input:checked::before{border-color:#007c88;background-color:#007c88}.note-modal .modal-body .form-check-input:checked::after{content:"";position:absolute;top:.625rem;left:4px;transform:translateY(-50%);color:#fff;font-size:7px}.note-modal .modal-body .form-check-input:checked::after{top:.4rem}.note-btn-primary{border:1px solid rgba(0,0,0,0);background-color:#007c88;color:#fff}.note-btn-primary:hover,.note-btn-primary:active,.note-btn-primary:focus,.note-btn-primary:active:focus{border:1px solid rgba(0,0,0,0);background-color:#504d6c;color:#fff}.note-btn-primary:disabled{border-color:rgba(0,0,0,0);background-color:#c6c6c6;color:#fff}.table-header{position:relative;margin-bottom:2px}.table-header::after{content:"";position:absolute;right:0;bottom:-2px;left:0;height:2px;margin-right:-1.25rem;background:#504d6c}.table-header-container{position:relative;width:100%;padding:1rem 0 0 1.25rem}.table-header-container::before{content:"";position:absolute;top:0;right:-1.25rem;bottom:0;left:0;background-color:#fff}.table-header-top{position:relative;flex-direction:row;flex-wrap:nowrap;gap:1rem;padding-bottom:1.5rem}.table-header-bottom{position:relative}.table-header-bottom .list--tabs{position:relative;z-index:1;margin-bottom:-2px}.table-header__title{margin:1rem 1rem 0 0;color:#555}@media(min-width: 992px){.table-header::after{margin-right:-2rem}.table-header-container{padding:1rem 0 0 2rem}.table-header-container::before{right:-2rem}}#loading{display:flex;justify-content:center;align-items:center;border:1px solid #007c88;border-radius:.25rem;width:50%;margin:auto}.timeline__legend{display:flex;flex-wrap:wrap;margin-bottom:1rem}.timeline__color{display:flex;align-items:center;margin-right:1rem;padding:.25rem 0}.timeline__color-key{width:1rem;height:1rem}.timeline__color-text{margin-left:.5rem}.timeline__container{position:relative}.timeline__overlay{display:none;position:absolute;z-index:1050;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.3);color:#000;text-align:center}.timeline__loader{position:absolute;right:0;bottom:50%;left:0;width:50px;height:50px;margin:auto;animation:spin 2s linear infinite;border:5px solid #c6c6c6;border-top:5px solid #555;border-radius:50%}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.user{display:flex;position:relative;align-items:center;gap:1rem;margin:0;padding:0;list-style-type:none}.user__item:not(:last-child){padding-right:1rem;border-right:1px solid #c6c6c6}.user__link::before{color:#504d6c;font-size:1.25rem}.user__link span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.user__link--details::before{content:"";font-size:24px}.user__link--logout::before{content:""}div.form-group div.js-markdown-preview{height:8rem;overflow:auto}.drop-zone{border:2px dashed #c6c6c6;border-radius:5px;padding:25px;text-align:center;font-size:20px;cursor:pointer;transition:all .3s ease;color:#c6c6c6}.drop-zone.dragging{border-color:#007c88;color:#504d6c}.upload__error{color:#7f0000;font-size:14px;margin-top:5px;padding:5px;background-color:#ff6155;border:1px dashed #7f0000;border-radius:5px}.tt-menu{border:1px solid #c6c6c6;border-radius:5px;position:absolute;left:0;z-index:1000;width:100%;min-width:160px;margin:2px 0 0;list-style:none;text-align:left;background-color:#fff;background-clip:padding-box;max-height:15em;overflow-y:auto}.tt-menu .tt-suggestion,.tt-menu .tt-dataset div{background-color:#fff;margin:2px;color:#40374a;border-bottom:1px solid #c6c6c6;padding:.5rem 1rem;font-weight:normal;cursor:pointer}.tt-menu .tt-suggestion:last-child{border-bottom:none}.tt-menu .tt-suggestion:hover{background-color:#f9f9f9}.purge--header{padding:2rem 0 1rem}.purge--content{padding:2rem 0;border-top:solid 2px #40374a} + */:root{--blue: #3B3AF2;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #E30036;--orange: #fd7e14;--yellow: #ffc107;--green: #18856B;--teal: #20c997;--cyan: #007C88;--white: #FFF;--gray: #6c757d;--gray-dark: #343a40;--primary: #3B3AF2;--secondary: #6c757d;--success: #18856B;--info: #007C88;--warning: #FFBB01;--danger: #E30036;--light: #f8f9fa;--dark: #343a40;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:"Open Sans",Helvetica,Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.35;color:#40374a;text-align:left;background-color:#f9f9f9}[tabindex="-1"]:focus:not(:focus-visible){outline:0 !important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:#007c88;text-decoration:none;background-color:rgba(0,0,0,0)}a:hover{color:#007c88;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:1rem;padding-bottom:1rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{padding:0;border-style:none}input[type=radio],input[type=checkbox]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:.5rem;font-weight:600;line-height:1.35;color:#504d6c}h1,.h1{font-size:1.563rem}h2,.h2{font-size:1.125rem}h3,.h3{font-size:1rem}h4,.h4{font-size:0.875rem}h5,.h5{font-size:0.75rem}h6,.h6{font-size:0.625rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.35}.display-2{font-size:5.5rem;font-weight:300;line-height:1.35}.display-3{font-size:4.5rem;font-weight:300;line-height:1.35}.display-4{font-size:3.5rem;font-weight:300;line-height:1.35}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}small,.small{font-size:0.875em;font-weight:400}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#f9f9f9;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-xl,.container-lg,.container-md,.container-sm{width:100%;padding-right:.5rem;padding-left:.5rem;margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-right:-0.5rem;margin-left:-0.5rem}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col-xl,.col-xl-auto,.col-xl-12,.col-xl-11,.col-xl-10,.col-xl-9,.col-xl-8,.col-xl-7,.col-xl-6,.col-xl-5,.col-xl-4,.col-xl-3,.col-xl-2,.col-xl-1,.col-lg,.col-lg-auto,.col-lg-12,.col-lg-11,.col-lg-10,.col-lg-9,.col-lg-8,.col-lg-7,.col-lg-6,.col-lg-5,.col-lg-4,.col-lg-3,.col-lg-2,.col-lg-1,.col-md,.col-md-auto,.col-md-12,.col-md-11,.col-md-10,.col-md-9,.col-md-8,.col-md-7,.col-md-6,.col-md-5,.col-md-4,.col-md-3,.col-md-2,.col-md-1,.col-sm,.col-sm-auto,.col-sm-12,.col-sm-11,.col-sm-10,.col-sm-9,.col-sm-8,.col-sm-7,.col-sm-6,.col-sm-5,.col-sm-4,.col-sm-3,.col-sm-2,.col-sm-1,.col,.col-auto,.col-12,.col-11,.col-10,.col-9,.col-8,.col-7,.col-6,.col-5,.col-4,.col-3,.col-2,.col-1{position:relative;width:100%;padding-right:.5rem;padding-left:.5rem}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media(min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media(min-width: 768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media(min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media(min-width: 1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{width:100%;margin-bottom:1rem;color:#40374a;background-color:#fff}.table th,.table td{padding:1rem;vertical-align:top;border-top:1px solid #f9f9f9}.table thead th{vertical-align:bottom;border-bottom:2px solid #f9f9f9}.table tbody+tbody{border-top:2px solid #f9f9f9}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #f9f9f9}.table-bordered th,.table-bordered td{border:1px solid #f9f9f9}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover tbody tr:hover{color:#40374a;background-color:rgba(0,124,136,.2)}.table-primary,.table-primary>th,.table-primary>td{background-color:#c8c8fb}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#9999f8}.table-hover .table-primary:hover{background-color:#b0b0f9}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b0b0f9}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#d6d8db}.table-secondary th,.table-secondary td,.table-secondary thead th,.table-secondary tbody+tbody{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>th,.table-success>td{background-color:#beddd6}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#87c0b2}.table-hover .table-success:hover{background-color:#add4cb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#add4cb}.table-info,.table-info>th,.table-info>td{background-color:#b8dade}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#7abbc1}.table-hover .table-info:hover{background-color:#a7d1d6}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#a7d1d6}.table-warning,.table-warning>th,.table-warning>td{background-color:#ffecb8}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#ffdc7b}.table-hover .table-warning:hover{background-color:#ffe59f}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe59f}.table-danger,.table-danger>th,.table-danger>td{background-color:#f7b8c7}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#f07a96}.table-hover .table-danger:hover{background-color:#f4a1b5}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f4a1b5}.table-light,.table-light>th,.table-light>td{background-color:#fdfdfe}.table-light th,.table-light td,.table-light thead th,.table-light tbody+tbody{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>th,.table-dark>td{background-color:#c6c8ca}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,124,136,.2)}.table-hover .table-active:hover{background-color:rgba(0,101,111,.2)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,101,111,.2)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#f9f9f9}.table-dark{color:#fff;background-color:#343a40}.table-dark th,.table-dark td,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media(max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media(max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media(max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media(max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.35em + 0.75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.35;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:5px;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:rgba(0,0,0,0);border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#b2b2fa;outline:0;box-shadow:0 0 0 .2rem rgba(59,58,242,.25)}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.35}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.125rem;line-height:1.5}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.35;color:#40374a;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + 0.5rem + 2px);padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:2rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#18856b}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.35;color:#fff;background-color:rgba(24,133,107,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#18856b;padding-right:calc(1.35em + 0.75rem) !important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2318856B' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.3375em + 0.1875rem) center;background-size:calc(0.675em + 0.375rem) calc(0.675em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#18856b;box-shadow:0 0 0 .2rem rgba(24,133,107,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{padding-right:3rem !important;background-position:right 1.5rem center}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.35em + 0.75rem);background-position:top calc(0.3375em + 0.1875rem) right calc(0.3375em + 0.1875rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#18856b;padding-right:calc(0.75em + 2.3125rem) !important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2318856B' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(0.675em + 0.375rem) calc(0.675em + 0.375rem) no-repeat}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#18856b;box-shadow:0 0 0 .2rem rgba(24,133,107,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#18856b}.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip,.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip{display:block}.was-validated .custom-control-input:valid~.custom-control-label,.custom-control-input.is-valid~.custom-control-label{color:#18856b}.was-validated .custom-control-input:valid~.custom-control-label::before,.custom-control-input.is-valid~.custom-control-label::before{border-color:#18856b}.was-validated .custom-control-input:valid:checked~.custom-control-label::before,.custom-control-input.is-valid:checked~.custom-control-label::before{border-color:#20b08e;background-color:#20b08e}.was-validated .custom-control-input:valid:focus~.custom-control-label::before,.custom-control-input.is-valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(24,133,107,.25)}.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before{border-color:#18856b}.was-validated .custom-file-input:valid~.custom-file-label,.custom-file-input.is-valid~.custom-file-label{border-color:#18856b}.was-validated .custom-file-input:valid:focus~.custom-file-label,.custom-file-input.is-valid:focus~.custom-file-label{border-color:#18856b;box-shadow:0 0 0 .2rem rgba(24,133,107,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#e30036}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.35;color:#fff;background-color:rgba(227,0,54,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#e30036;padding-right:calc(1.35em + 0.75rem) !important;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23E30036' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23E30036' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.3375em + 0.1875rem) center;background-size:calc(0.675em + 0.375rem) calc(0.675em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#e30036;box-shadow:0 0 0 .2rem rgba(227,0,54,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{padding-right:3rem !important;background-position:right 1.5rem center}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.35em + 0.75rem);background-position:top calc(0.3375em + 0.1875rem) right calc(0.3375em + 0.1875rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#e30036;padding-right:calc(0.75em + 2.3125rem) !important;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23E30036' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23E30036' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(0.675em + 0.375rem) calc(0.675em + 0.375rem) no-repeat}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#e30036;box-shadow:0 0 0 .2rem rgba(227,0,54,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#e30036}.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip,.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip{display:block}.was-validated .custom-control-input:invalid~.custom-control-label,.custom-control-input.is-invalid~.custom-control-label{color:#e30036}.was-validated .custom-control-input:invalid~.custom-control-label::before,.custom-control-input.is-invalid~.custom-control-label::before{border-color:#e30036}.was-validated .custom-control-input:invalid:checked~.custom-control-label::before,.custom-control-input.is-invalid:checked~.custom-control-label::before{border-color:#ff174e;background-color:#ff174e}.was-validated .custom-control-input:invalid:focus~.custom-control-label::before,.custom-control-input.is-invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(227,0,54,.25)}.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before,.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before{border-color:#e30036}.was-validated .custom-file-input:invalid~.custom-file-label,.custom-file-input.is-invalid~.custom-file-label{border-color:#e30036}.was-validated .custom-file-input:invalid:focus~.custom-file-label,.custom-file-input.is-invalid:focus~.custom-file-label{border-color:#e30036;box-shadow:0 0 0 .2rem rgba(227,0,54,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media(min-width: 576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#40374a;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);padding:.375rem .75rem;font-size:1rem;line-height:1.35;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#40374a;text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:0 0 0 .2rem rgba(59,58,242,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#3b3af2;border-color:#3b3af2}.btn-primary:hover{color:#fff;background-color:#1716f0;border-color:#110fea}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#1716f0;border-color:#110fea;box-shadow:0 0 0 .2rem rgba(88,88,244,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#3b3af2;border-color:#3b3af2}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#110fea;border-color:#100fde}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(88,88,244,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary:focus,.btn-secondary.focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#18856b;border-color:#18856b}.btn-success:hover{color:#fff;background-color:#126551;border-color:#105a48}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#126551;border-color:#105a48;box-shadow:0 0 0 .2rem rgba(59,151,129,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#18856b;border-color:#18856b}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#105a48;border-color:#0e4f40}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(59,151,129,.5)}.btn-info{color:#fff;background-color:#007c88;border-color:#007c88}.btn-info:hover{color:#fff;background-color:#005962;border-color:#004e55}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#005962;border-color:#004e55;box-shadow:0 0 0 .2rem rgba(38,144,154,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#007c88;border-color:#007c88}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#004e55;border-color:#004248}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,144,154,.5)}.btn-warning{color:#212529;background-color:#ffbb01;border-color:#ffbb01}.btn-warning:hover{color:#212529;background-color:#da9f00;border-color:#cd9600}.btn-warning:focus,.btn-warning.focus{color:#212529;background-color:#da9f00;border-color:#cd9600;box-shadow:0 0 0 .2rem rgba(222,165,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffbb01;border-color:#ffbb01}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#cd9600;border-color:#c08d00}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,165,7,.5)}.btn-danger,.alert-restore .btn-alert-restore-cancel{color:#fff;background-color:#e30036;border-color:#e30036}.btn-danger:hover,.alert-restore .btn-alert-restore-cancel:hover{color:#fff;background-color:#bd002d;border-color:#b0002a}.btn-danger:focus,.alert-restore .btn-alert-restore-cancel:focus,.btn-danger.focus,.alert-restore .focus.btn-alert-restore-cancel{color:#fff;background-color:#bd002d;border-color:#b0002a;box-shadow:0 0 0 .2rem rgba(231,38,84,.5)}.btn-danger.disabled,.alert-restore .disabled.btn-alert-restore-cancel,.btn-danger:disabled,.alert-restore .btn-alert-restore-cancel:disabled{color:#fff;background-color:#e30036;border-color:#e30036}.btn-danger:not(:disabled):not(.disabled):active,.alert-restore .btn-alert-restore-cancel:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.alert-restore .btn-alert-restore-cancel:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle,.alert-restore .show>.dropdown-toggle.btn-alert-restore-cancel{color:#fff;background-color:#b0002a;border-color:#a30027}.btn-danger:not(:disabled):not(.disabled):active:focus,.alert-restore .btn-alert-restore-cancel:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.alert-restore .btn-alert-restore-cancel:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus,.alert-restore .show>.dropdown-toggle.btn-alert-restore-cancel:focus{box-shadow:0 0 0 .2rem rgba(231,38,84,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light:focus,.btn-light.focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark:focus,.btn-dark.focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#3b3af2;border-color:#3b3af2}.btn-outline-primary:hover{color:#fff;background-color:#3b3af2;border-color:#3b3af2}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 .2rem rgba(59,58,242,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#3b3af2;background-color:rgba(0,0,0,0)}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#3b3af2;border-color:#3b3af2}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(59,58,242,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:rgba(0,0,0,0)}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#18856b;border-color:#18856b}.btn-outline-success:hover{color:#fff;background-color:#18856b;border-color:#18856b}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 .2rem rgba(24,133,107,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#18856b;background-color:rgba(0,0,0,0)}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#18856b;border-color:#18856b}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(24,133,107,.5)}.btn-outline-info{color:#007c88;border-color:#007c88}.btn-outline-info:hover{color:#fff;background-color:#007c88;border-color:#007c88}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 .2rem rgba(0,124,136,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#007c88;background-color:rgba(0,0,0,0)}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#007c88;border-color:#007c88}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,124,136,.5)}.btn-outline-warning{color:#ffbb01;border-color:#ffbb01}.btn-outline-warning:hover{color:#212529;background-color:#ffbb01;border-color:#ffbb01}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 .2rem rgba(255,187,1,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffbb01;background-color:rgba(0,0,0,0)}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffbb01;border-color:#ffbb01}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,187,1,.5)}.btn-outline-danger{color:#e30036;border-color:#e30036}.btn-outline-danger:hover{color:#fff;background-color:#e30036;border-color:#e30036}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 .2rem rgba(227,0,54,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#e30036;background-color:rgba(0,0,0,0)}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#e30036;border-color:#e30036}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(227,0,54,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:rgba(0,0,0,0)}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:rgba(0,0,0,0)}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007c88;text-decoration:none}.btn-link:hover{color:#007c88;text-decoration:underline}.btn-link:focus,.btn-link.focus{text-decoration:underline}.btn-link:disabled,.btn-link.disabled{color:#6c757d;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.width{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.width{transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#40374a;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=top],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:hover,.dropdown-item:focus{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#3b3af2}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:0.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-control-plaintext,.input-group>.custom-select,.input-group>.custom-file{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.form-control-plaintext+.form-control,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus~.custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.form-control:not(:last-child),.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-prepend,.input-group-append{display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-append .btn:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.35;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:5px}.input-group-text input[type=radio],.input-group-text input[type=checkbox]{margin-top:0}.input-group-lg>.form-control:not(textarea),.input-group-lg>.custom-select{height:calc(1.5em + 1rem + 2px)}.input-group-lg>.form-control,.input-group-lg>.custom-select,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + 0.5rem + 2px)}.input-group-sm>.form-control,.input-group-sm>.custom-select,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.35rem;padding-left:1.5rem;print-color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.175rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#3b3af2;background-color:#3b3af2}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(59,58,242,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#b2b2fa}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#e2e1fd;border-color:#e2e1fd}.custom-control-input[disabled]~.custom-control-label,.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input[disabled]~.custom-control-label::before,.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.175rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:1px solid #adb5bd}.custom-control-label::after{position:absolute;top:.175rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23FFF' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#3b3af2;background-color:#3b3af2}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23FFF' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(59,58,242,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(59,58,242,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23FFF'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(59,58,242,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(0.175rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;transform:translateX(0.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(59,58,242,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.35em + 0.75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.35;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#b2b2fa;outline:0;box-shadow:0 0 0 .2rem rgba(59,58,242,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + 0.5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.125rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.35em + 0.75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.35em + 0.75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#b2b2fa;box-shadow:0 0 0 .2rem rgba(59,58,242,.25)}.custom-file-input[disabled]~.custom-file-label,.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.35em + 0.75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.35;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:5px}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.35em + 0.75rem);padding:.375rem .75rem;line-height:1.35;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 5px 5px 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:rgba(0,0,0,0);-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #f9f9f9,0 0 0 .2rem rgba(59,58,242,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #f9f9f9,0 0 0 .2rem rgba(59,58,242,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #f9f9f9,0 0 0 .2rem rgba(59,58,242,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#3b3af2;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#e2e1fd}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dee2e6;border-color:rgba(0,0,0,0);border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#3b3af2;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#e2e1fd}.custom-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dee2e6;border-color:rgba(0,0,0,0);border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#3b3af2;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#e2e1fd}.custom-range::-ms-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0);border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#f9f9f9;border-color:#dee2e6 #dee2e6 #f9f9f9}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#3b3af2}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-sm,.navbar .container-md,.navbar .container-lg,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.415625rem;padding-bottom:.415625rem;margin-right:1rem;font-size:1.125rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.125rem;line-height:1;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);border-radius:.25rem}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media(max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media(max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media(max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media(max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media(min-width: 1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(0.25rem - 1px);border-bottom-left-radius:calc(0.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(0.25rem - 1px)}.card-img,.card-img-top,.card-img-bottom{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(0.25rem - 1px);border-bottom-left-radius:calc(0.25rem - 1px)}.card-deck .card{margin-bottom:.5rem}@media(min-width: 576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-0.5rem;margin-left:-0.5rem}.card-deck .card{flex:1 0 0%;margin-right:.5rem;margin-bottom:0;margin-left:.5rem}}.card-group>.card{margin-bottom:.5rem}@media(min-width: 576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media(min-width: 576px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007c88;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#007c88;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(59,58,242,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#3b3af2;border-color:#3b3af2}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.125rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:0.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.badge{transition:none}}a.badge:hover,a.badge:focus{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#3b3af2}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#110fea}a.badge-primary:focus,a.badge-primary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(59,58,242,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:hover,a.badge-secondary:focus{color:#fff;background-color:#545b62}a.badge-secondary:focus,a.badge-secondary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#18856b}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#105a48}a.badge-success:focus,a.badge-success.focus{outline:0;box-shadow:0 0 0 .2rem rgba(24,133,107,.5)}.badge-info{color:#fff;background-color:#007c88}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#004e55}a.badge-info:focus,a.badge-info.focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,124,136,.5)}.badge-warning{color:#212529;background-color:#ffbb01}a.badge-warning:hover,a.badge-warning:focus{color:#212529;background-color:#cd9600}a.badge-warning:focus,a.badge-warning.focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,187,1,.5)}.badge-danger{color:#fff;background-color:#e30036}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#b0002a}a.badge-danger:focus,a.badge-danger.focus{outline:0;box-shadow:0 0 0 .2rem rgba(227,0,54,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:hover,a.badge-light:focus{color:#212529;background-color:#dae0e5}a.badge-light:focus,a.badge-light.focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#1d2124}a.badge-dark:focus,a.badge-dark.focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media(min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:0 solid rgba(0,0,0,0);border-radius:0}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#3b3af2;background-color:#3b3af2;border-color:#5a5af4}.alert-primary hr{border-top-color:#4242f2}.alert-primary .alert-link{color:#110fea}.alert-secondary{color:#6c757d;background-color:#6c757d;border-color:#848b92}.alert-secondary hr{border-top-color:#777e86}.alert-secondary .alert-link{color:#545b62}.alert-success{color:#18856b;background-color:#18856b;border-color:#3d9983}.alert-success hr{border-top-color:#368773}.alert-success .alert-link{color:#105a48}.alert-info{color:#007c88;background-color:#007c88;border-color:#29919b}.alert-info hr{border-top-color:#247e87}.alert-info .alert-link{color:#004e55}.alert-warning{color:#ffbb01;background-color:#ffbb01;border-color:#ffc62a}.alert-warning hr{border-top-color:#ffbf11}.alert-warning .alert-link{color:#cd9600}.alert-danger{color:#e30036;background-color:#e30036;border-color:#e72956}.alert-danger hr{border-top-color:#de1947}.alert-danger .alert-link{color:#b0002a}.alert-light{color:#f8f9fa;background-color:#f8f9fa;border-color:#f9fafb}.alert-light hr{border-top-color:#eaedf1}.alert-light .alert-link{color:#dae0e5}.alert-dark{color:#343a40;background-color:#343a40;border-color:#545a5f}.alert-dark hr{border-top-color:#484d51}.alert-dark .alert-link{color:#1d2124}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;line-height:0;font-size:0.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#3b3af2;transition:width .6s ease}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#40374a;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#3b3af2;border-color:#3b3af2}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#1f1e7e;background-color:#c8c8fb}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#1f1e7e;background-color:#b0b0f9}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#1f1e7e;border-color:#1f1e7e}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#0c4538;background-color:#beddd6}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#0c4538;background-color:#add4cb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0c4538;border-color:#0c4538}.list-group-item-info{color:#004047;background-color:#b8dade}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#004047;background-color:#a7d1d6}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#004047;border-color:#004047}.list-group-item-warning{color:#856101;background-color:#ffecb8}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#856101;background-color:#ffe59f}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856101;border-color:#856101}.list-group-item-danger{color:#76001c;background-color:#f7b8c7}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#76001c;background-color:#f4a1b5}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#76001c;border-color:#76001c}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{opacity:.75}button.close{padding:0;background-color:rgba(0,0,0,0);border:0}a.close.disabled{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:0.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-header,.modal-dialog-scrollable .modal-footer{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:rgba(112,112,112,.38)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:2rem 2rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.modal-header .close{padding:2rem 2rem;margin:-2rem -2rem -2rem auto}.modal-title{margin-bottom:0;line-height:1.35}.modal-body{position:relative;flex:1 1 auto;padding:2rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1.75rem;border-top:1px solid rgba(0,0,0,0);border-bottom-right-radius:calc(0.3rem - 1px);border-bottom-left-radius:calc(0.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media(min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media(min-width: 1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:"Open Sans",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.35;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^=top]{padding:.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^=top] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^=top] .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^=right]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^=right] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^=right] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^=bottom] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^=bottom] .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^=left]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^=left] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^=left] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:"Open Sans",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.35;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^=top]{margin-bottom:.5rem}.bs-popover-top>.arrow,.bs-popover-auto[x-placement^=top]>.arrow{bottom:calc(-0.5rem - 1px)}.bs-popover-top>.arrow::before,.bs-popover-auto[x-placement^=top]>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-top>.arrow::after,.bs-popover-auto[x-placement^=top]>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^=right]{margin-left:.5rem}.bs-popover-right>.arrow,.bs-popover-auto[x-placement^=right]>.arrow{left:calc(-0.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-right>.arrow::before,.bs-popover-auto[x-placement^=right]>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-right>.arrow::after,.bs-popover-auto[x-placement^=right]>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^=bottom]{margin-top:.5rem}.bs-popover-bottom>.arrow,.bs-popover-auto[x-placement^=bottom]>.arrow{top:calc(-0.5rem - 1px)}.bs-popover-bottom>.arrow::before,.bs-popover-auto[x-placement^=bottom]>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-bottom>.arrow::after,.bs-popover-auto[x-placement^=bottom]>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^=left]{margin-right:.5rem}.bs-popover-left>.arrow,.bs-popover-auto[x-placement^=left]>.arrow{right:calc(-0.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-left>.arrow::before,.bs-popover-auto[x-placement^=left]>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-left>.arrow::after,.bs-popover-auto[x-placement^=left]>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:#504d6c;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#40374a}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-left),.active.carousel-item-right{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-right),.active.carousel-item-left{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFF' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23FFF' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;border:.25em solid currentcolor;border-right-color:rgba(0,0,0,0);border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;background-color:currentcolor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#3b3af2 !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#110fea !important}.bg-secondary{background-color:#6c757d !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#545b62 !important}.bg-success{background-color:#18856b !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#105a48 !important}.bg-info{background-color:#007c88 !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#004e55 !important}.bg-warning{background-color:#ffbb01 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#cd9600 !important}.bg-danger{background-color:#e30036 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#b0002a !important}.bg-light{background-color:#f8f9fa !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#dae0e5 !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#1d2124 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:rgba(0,0,0,0) !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom,.hft-lines:not(:last-of-type){border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#3b3af2 !important}.border-secondary{border-color:#6c757d !important}.border-success{border-color:#18856b !important}.border-info{border-color:#007c88 !important}.border-warning{border-color:#ffbb01 !important}.border-danger{border-color:#e30036 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#343a40 !important}.border-white{border-color:#fff !important}.rounded-sm{border-radius:.2rem !important}.rounded{border-radius:.25rem !important}.rounded-top{border-top-left-radius:.25rem !important;border-top-right-radius:.25rem !important}.rounded-right{border-top-right-radius:.25rem !important;border-bottom-right-radius:.25rem !important}.rounded-bottom{border-bottom-right-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-left{border-top-left-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-lg{border-radius:.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}@media(min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}}@media(min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}}@media(min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}}@media(min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714286%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-fill{flex:1 1 auto !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}@media(min-width: 576px){.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}}@media(min-width: 768px){.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}}@media(min-width: 992px){.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}}@media(min-width: 1200px){.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media(min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media(min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media(min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media(min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.user-select-all{-webkit-user-select:all !important;-moz-user-select:all !important;user-select:all !important}.user-select-auto{-webkit-user-select:auto !important;-moz-user-select:auto !important;user-select:auto !important}.user-select-none{-webkit-user-select:none !important;-moz-user-select:none !important;user-select:none !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports(position: sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.min-vw-100{min-width:100vw !important}.min-vh-100{min-height:100vh !important}.vw-100{width:100vw !important}.vh-100{height:100vh !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.hft-lines,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.error-container.alert-danger .error-message::before,.px-2{padding-right:.5rem !important}.pb-2,.hft-lines:not(:last-of-type),.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-n1{margin:-0.25rem !important}.mt-n1,.my-n1{margin-top:-0.25rem !important}.mr-n1,.mx-n1{margin-right:-0.25rem !important}.mb-n1,.my-n1{margin-bottom:-0.25rem !important}.ml-n1,.mx-n1{margin-left:-0.25rem !important}.m-n2{margin:-0.5rem !important}.mt-n2,.my-n2{margin-top:-0.5rem !important}.mr-n2,.mx-n2{margin-right:-0.5rem !important}.mb-n2,.my-n2{margin-bottom:-0.5rem !important}.ml-n2,.mx-n2{margin-left:-0.5rem !important}.m-n3{margin:-1rem !important}.mt-n3,.my-n3{margin-top:-1rem !important}.mr-n3,.mx-n3{margin-right:-1rem !important}.mb-n3,.my-n3{margin-bottom:-1rem !important}.ml-n3,.mx-n3{margin-left:-1rem !important}.m-n4{margin:-1.5rem !important}.mt-n4,.my-n4{margin-top:-1.5rem !important}.mr-n4,.mx-n4{margin-right:-1.5rem !important}.mb-n4,.my-n4{margin-bottom:-1.5rem !important}.ml-n4,.mx-n4{margin-left:-1.5rem !important}.m-n5{margin:-3rem !important}.mt-n5,.my-n5{margin-top:-3rem !important}.mr-n5,.mx-n5{margin-right:-3rem !important}.mb-n5,.my-n5{margin-bottom:-3rem !important}.ml-n5,.mx-n5{margin-left:-3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media(min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:.25rem !important}.mt-sm-1,.my-sm-1{margin-top:.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:.25rem !important}.m-sm-2{margin:.5rem !important}.mt-sm-2,.my-sm-2{margin-top:.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:.25rem !important}.pt-sm-1,.py-sm-1{padding-top:.25rem !important}.pr-sm-1,.px-sm-1{padding-right:.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem !important}.pl-sm-1,.px-sm-1{padding-left:.25rem !important}.p-sm-2{padding:.5rem !important}.pt-sm-2,.py-sm-2{padding-top:.5rem !important}.pr-sm-2,.px-sm-2{padding-right:.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem !important}.pl-sm-2,.px-sm-2{padding-left:.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-n1{margin:-0.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-0.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-0.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-0.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-0.25rem !important}.m-sm-n2{margin:-0.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-0.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-0.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-0.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-0.5rem !important}.m-sm-n3{margin:-1rem !important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem !important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem !important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem !important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem !important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem !important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem !important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem !important}.m-sm-n5{margin:-3rem !important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem !important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem !important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem !important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media(min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:.25rem !important}.mt-md-1,.my-md-1{margin-top:.25rem !important}.mr-md-1,.mx-md-1{margin-right:.25rem !important}.mb-md-1,.my-md-1{margin-bottom:.25rem !important}.ml-md-1,.mx-md-1{margin-left:.25rem !important}.m-md-2{margin:.5rem !important}.mt-md-2,.my-md-2{margin-top:.5rem !important}.mr-md-2,.mx-md-2{margin-right:.5rem !important}.mb-md-2,.my-md-2{margin-bottom:.5rem !important}.ml-md-2,.mx-md-2{margin-left:.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:.25rem !important}.pt-md-1,.py-md-1{padding-top:.25rem !important}.pr-md-1,.px-md-1{padding-right:.25rem !important}.pb-md-1,.py-md-1{padding-bottom:.25rem !important}.pl-md-1,.px-md-1{padding-left:.25rem !important}.p-md-2{padding:.5rem !important}.pt-md-2,.py-md-2{padding-top:.5rem !important}.pr-md-2,.px-md-2{padding-right:.5rem !important}.pb-md-2,.py-md-2{padding-bottom:.5rem !important}.pl-md-2,.px-md-2{padding-left:.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-n1{margin:-0.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-0.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-0.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-0.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-0.25rem !important}.m-md-n2{margin:-0.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-0.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-0.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-0.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-0.5rem !important}.m-md-n3{margin:-1rem !important}.mt-md-n3,.my-md-n3{margin-top:-1rem !important}.mr-md-n3,.mx-md-n3{margin-right:-1rem !important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem !important}.ml-md-n3,.mx-md-n3{margin-left:-1rem !important}.m-md-n4{margin:-1.5rem !important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem !important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem !important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem !important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem !important}.m-md-n5{margin:-3rem !important}.mt-md-n5,.my-md-n5{margin-top:-3rem !important}.mr-md-n5,.mx-md-n5{margin-right:-3rem !important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem !important}.ml-md-n5,.mx-md-n5{margin-left:-3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media(min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:.25rem !important}.mt-lg-1,.my-lg-1{margin-top:.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:.25rem !important}.m-lg-2{margin:.5rem !important}.mt-lg-2,.my-lg-2{margin-top:.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:.25rem !important}.pt-lg-1,.py-lg-1{padding-top:.25rem !important}.pr-lg-1,.px-lg-1{padding-right:.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem !important}.pl-lg-1,.px-lg-1{padding-left:.25rem !important}.p-lg-2{padding:.5rem !important}.pt-lg-2,.py-lg-2{padding-top:.5rem !important}.pr-lg-2,.px-lg-2{padding-right:.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem !important}.pl-lg-2,.px-lg-2{padding-left:.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-n1{margin:-0.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-0.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-0.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-0.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-0.25rem !important}.m-lg-n2{margin:-0.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-0.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-0.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-0.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-0.5rem !important}.m-lg-n3{margin:-1rem !important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem !important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem !important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem !important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem !important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem !important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem !important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem !important}.m-lg-n5{margin:-3rem !important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem !important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem !important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem !important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media(min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:.25rem !important}.mt-xl-1,.my-xl-1{margin-top:.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:.25rem !important}.m-xl-2{margin:.5rem !important}.mt-xl-2,.my-xl-2{margin-top:.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:.25rem !important}.pt-xl-1,.py-xl-1{padding-top:.25rem !important}.pr-xl-1,.px-xl-1{padding-right:.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem !important}.pl-xl-1,.px-xl-1{padding-left:.25rem !important}.p-xl-2{padding:.5rem !important}.pt-xl-2,.py-xl-2{padding-top:.5rem !important}.pr-xl-2,.px-xl-2{padding-right:.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem !important}.pl-xl-2,.px-xl-2{padding-left:.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-n1{margin:-0.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-0.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-0.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-0.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-0.25rem !important}.m-xl-n2{margin:-0.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-0.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-0.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-0.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-0.5rem !important}.m-xl-n3{margin:-1rem !important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem !important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem !important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem !important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem !important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem !important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem !important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem !important}.m-xl-n5{margin:-3rem !important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem !important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem !important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem !important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace !important}.text-justify{text-align:justify !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media(min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-lighter{font-weight:lighter !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-weight-bolder{font-weight:bolder !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#3b3af2 !important}a.text-primary:hover,a.text-primary:focus{color:#0f0ed2 !important}.text-secondary{color:#6c757d !important}a.text-secondary:hover,a.text-secondary:focus{color:#494f54 !important}.text-success{color:#18856b !important}a.text-success:hover,a.text-success:focus{color:#0c4437 !important}.text-info{color:#007c88 !important}a.text-info:hover,a.text-info:focus{color:#00363c !important}.text-warning{color:#ffbb01 !important}a.text-warning:hover,a.text-warning:focus{color:#b48300 !important}.text-danger{color:#e30036 !important}a.text-danger:hover,a.text-danger:focus{color:#970024 !important}.text-light{color:#f8f9fa !important}a.text-light:hover,a.text-light:focus{color:#cbd3da !important}.text-dark{color:#343a40 !important}a.text-dark:hover,a.text-dark:focus{color:#121416 !important}.text-body{color:#40374a !important}.text-muted{color:#6c757d !important}.text-black-50{color:rgba(0,0,0,.5) !important}.text-white-50{color:rgba(255,255,255,.5) !important}.text-hide{font:0/0 a;color:rgba(0,0,0,0);text-shadow:none;background-color:rgba(0,0,0,0);border:0}.text-decoration-none{text-decoration:none !important}.text-break{word-break:break-word !important;word-wrap:break-word !important}.text-reset{color:inherit !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #adb5bd;page-break-inside:avoid}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #dee2e6 !important}.table-dark{color:inherit}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#f9f9f9}.table .thead-dark th{color:inherit;border-color:#f9f9f9}}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;src:url(../js/2a947e89d2e241121d6f.woff2) format("woff2"),url(../js/fcc115e3c4b25a4d6c4c.woff) format("woff")}@font-face{font-family:"Open Sans";font-style:italic;font-weight:400;src:url(../js/49ac825fd755e5f078b8.woff2) format("woff2"),url(../js/f5f0584e10cc2a05a9c4.woff) format("woff")}@font-face{font-family:"Open Sans";font-style:normal;font-weight:600;src:url(../js/473ad7094608f924460a.woff2) format("woff2"),url(../js/87b09f87fd4f0ca3a5c6.woff) format("woff")}@font-face{font-family:"linkspace-font";font-style:normal;font-weight:400;src:url(../js/d9f4c69fd03653286df4.eot?9780675);src:url(../js/d9f4c69fd03653286df4.eot?9780675#iefix) format("embedded-opentype"),url(../js/24f91c365ff9f0a90573.woff?9780675) format("woff"),url(../js/d4a72d1c013470821372.ttf?9780675) format("truetype"),url(../js/8330cbb9084834cba72f.svg?9780675#linkspace-font) format("svg")}.user__link::before,.note-modal .modal-body .form-check-input:checked::after,.sortable__handle::before,.nav__link::before,.sidebar__toggle::before,span.rag::before,.popover-container:not(.popover-container--text) .popover__btn::before,.modal-header .close::before,.link--alert::after,.link--email::before,.link--phone::before,.link--next::before,.link--add::before,.link--table::before,.link--graph::before,.link--calendar::before,.link--timeline::before,.select-widget .form-control::after,.select__toggle::after,.input--file .file__delete::before,.input--password .input__reveal-password::after,.input--search::after,.query-builder.query-builder .glyphicon::before,.checkbox input[type=checkbox]:checked+label::after,.error-container.alert-danger .error-message::before,.dropdown__toggle::after,table.dataTable td.reorder::before,table.dataTable.dtr-column>tbody>tr>td.dtr-control::before,table.dataTable.dtr-column>tbody>tr>th.dtr-control::before,.data-table .data-table-row--child::after,.data-table__search label::after,.dataTables_filter label::after,.ld-draggable-handle::before,.ld-edit-button::before,.collapsible-dropdown .collapsible__toggle::after,.card--expandable .card__link::before,.card--expandable .card__toggle::after,.card--settings .card__title-icon::before,.rename::before,.table-toggle--remove .btn::before,.table-toggle--add .btn::before,.btn-download::after,.btn-help::before,.btn-back::before,.btn-title-back::before,.btn-round::before,.btn-import::before,.btn-export::before,.btn-add-link::before,.btn-edit::before,.btn-view::before,.btn-email::before,.btn-filter::before,.btn-search::before,.btn-sort::before,.btn-toggle::before,.btn-toggle-off::before,.btn-clear::before,.btn-remove::before,.btn-icon-close::before,.btn-edit-widget::before,.btn-drag-widget::before,.btn-info::after,.btn-add::before,.breadcrumbs__divider::after,.breadcrumbs__item.link:last-of-type::before,.attention::before,.alert::before{display:inline-block;font:normal normal normal 14px/1 "linkspace-font";font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}html{box-sizing:border-box;font-size:100%}*,*::before,*::after{box-sizing:inherit}.bg-no{background-color:#fff}.mb-4{margin-bottom:2rem !important}p:last-child{margin-bottom:0}a:hover{text-decoration:none}strong{font-weight:600}h3{margin-bottom:1rem;font-weight:600}.main{min-height:100vh;padding-right:1.25rem;padding-left:0;transition:all .2s ease}.main:not(.main--expanded){display:none}.hidden{display:none}.invisible{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.main__container{display:flex;flex-direction:column;height:100%;min-height:35rem}.code{padding:1rem 1rem;background-color:#f9f9f9;color:#40374a;font-family:monospace}.code pre{margin-bottom:0}@media(min-width: 992px){body{padding:0 2rem}.main{padding-right:0}.main:not(.main--expanded){display:block}}table.table-bordered{border:solid 1px #c6c6c6}table.table-bordered thead>tr>th,table.table-bordered tbody>tr>td{border:solid 1px #c6c6c6}.dropdown-menu li.spacer{border-bottom:1px solid #c6c6c6;width:98%;margin:0 auto}.text-primary{color:#007c88 !important}.alert{display:flex;align-items:center;margin-bottom:2rem;padding:1rem;color:#000}.alert ul{margin:0;padding-left:2rem}.alert p{margin-bottom:0}@media(min-width: 1200px){.alert{padding:2rem}.alert::before{display:block;flex:0 0 1.25rem;margin-right:1rem;border-radius:50%;font-size:1.125rem}}.alert-success{background-color:#26d2a9}.alert-info{background-color:#aba9eb}.alert-danger{background-color:#ff6155}.alert-success::before{content:"";color:#000}.alert-info::before{content:"";color:#000}.alert-danger::before{content:"";color:#000}.attention::before{content:"";margin-right:.5rem;transform:rotate(180deg)}.login .attention{text-align:center}.breadcrumbs{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:.875rem}.breadcrumbs .link{display:flex;align-items:center;color:#504d6c}.breadcrumbs .link:hover{border-bottom-color:rgba(0,0,0,0)}.breadcrumbs__item.link:not(:last-of-type){position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.breadcrumbs__item.link:last-of-type::before{content:"";margin-right:4px;transform:rotate(180deg);font-size:.75rem}.breadcrumbs__item--active,.breadcrumbs__divider{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}@media(min-width: 768px){.breadcrumbs__item.link,.breadcrumbs__item.link:not(:last-of-type){border-bottom:1px solid #504d6c}.breadcrumbs__item.link:last-of-type::before,.breadcrumbs__item.link:not(:last-of-type):last-of-type::before{content:normal}.breadcrumbs__item.link:not(:last-of-type),.breadcrumbs__item--active,.breadcrumbs__divider{position:static;width:auto;height:auto;margin:0;overflow:auto;clip:auto}.breadcrumbs__item--active{border-bottom:1px solid rgba(0,0,0,0);color:#555}.breadcrumbs__divider::after{content:"";display:block;font-size:8px}}.btn{width:100%;padding:10px 30px;transition:.2s all ease;border-radius:23px;line-height:1.35;vertical-align:unset}.btn:not(:last-of-type){margin-bottom:1rem}.btn-default{border:1px solid rgba(0,0,0,0);background-color:#007c88;color:#fff}.btn-default:hover,.btn-default:active,.btn-default:focus,.btn-default:active:focus{border:1px solid rgba(0,0,0,0);background-color:#504d6c;color:#fff}.btn-small{padding:7px 20px;font-size:.875rem}.btn-primary{border:1px solid rgba(0,0,0,0);background-color:#007c88;color:#fff;background-color:#504d6c}.btn-primary:hover,.btn-primary:active,.btn-primary:focus,.btn-primary:active:focus{border:1px solid rgba(0,0,0,0);background-color:#504d6c;color:#fff}.btn-primary:hover,.btn-primary:focus,.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled).active:focus{border:1px solid rgba(0,0,0,0);background-color:rgba(80,77,108,.8)}.btn-primary.disabled{border-color:rgba(0,0,0,0);background-color:#c6c6c6;color:#fff}.btn-add{border:1px solid rgba(0,0,0,0);background-color:#007c88;color:#fff}.btn-add:hover,.btn-add:active,.btn-add:focus,.btn-add:active:focus{border:1px solid rgba(0,0,0,0);background-color:#504d6c;color:#fff}.btn-add::before{content:"";margin-right:.5rem;color:#fff}.btn-add.btn-inverted::before{color:#007c88}.btn-add.btn-inverted:hover,.btn-add.btn-inverted:active,.btn-add.btn-inverted:focus,.btn-add.btn-inverted:active:focus{border:1px solid #504d6c;background-color:#fff}.btn-add.btn-inverted:hover::before,.btn-add.btn-inverted:active::before,.btn-add.btn-inverted:focus::before,.btn-add.btn-inverted:active:focus::before{color:#504d6c}.btn-info{border:1px solid rgba(0,0,0,0);background-color:#007c88;color:#fff}.btn-info:hover,.btn-info:active,.btn-info:focus,.btn-info:active:focus{border:1px solid rgba(0,0,0,0);background-color:#504d6c;color:#fff}.btn-info::after{content:"";margin-left:.5rem;color:#fff}.btn-info.btn-inverted::after{color:#007c88}.btn-info.btn-inverted:hover,.btn-info.btn-inverted:active,.btn-info.btn-inverted:focus,.btn-info.btn-inverted:active:focus{border:1px solid #504d6c;background-color:#fff}.btn-info.btn-inverted:hover::after,.btn-info.btn-inverted:active::after,.btn-info.btn-inverted:focus::after,.btn-info.btn-inverted:active:focus::after{color:#504d6c}.btn-cancel{border:1px solid #40374a;background-color:#fff;color:#40374a}.btn-cancel:hover,.btn-cancel:active,.btn-cancel:focus,.btn-cancel:active:focus{border-color:#212020;color:#212020}.btn-drag-widget{margin-right:.5rem}.btn-drag-widget::before{content:""}.btn-edit-widget{margin-right:.5rem}.btn-edit-widget::before{content:""}.btn-edit-widget,.btn-drag-widget{width:1.5rem;height:1.5rem;margin:0;padding:0;transition:.2s all ease;border-radius:5px;background-color:#fff}.btn-edit-widget::before,.btn-drag-widget::before{transition:.2s all ease}.btn-edit-widget span,.btn-drag-widget span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.btn-edit-widget:hover,.btn-edit-widget:active,.btn-edit-widget:focus,.btn-edit-widget:active:focus,.btn-drag-widget:hover,.btn-drag-widget:active,.btn-drag-widget:focus,.btn-drag-widget:active:focus{background-color:#504d6c;color:#504d6c}.btn-edit-widget:hover::before,.btn-edit-widget:active::before,.btn-edit-widget:focus::before,.btn-edit-widget:active:focus::before,.btn-drag-widget:hover::before,.btn-drag-widget:active::before,.btn-drag-widget:focus::before,.btn-drag-widget:active:focus::before{color:#fff}.btn-delete{display:flex;align-items:center;width:auto;padding:0;border:0;border-radius:0;color:#e30036}.btn-delete span{transition:.2s all ease;border-bottom:solid 1px rgba(0,0,0,0)}.btn-delete:hover,.btn-delete:active,.btn-delete:focus,.btn-delete:active:focus{box-shadow:unset;color:#e30036}.btn-delete:hover span,.btn-delete:active span,.btn-delete:focus span,.btn-delete:active:focus span{border-bottom:solid 1px #e30036}.btn-icon-close{width:auto;padding:0;border:0;border-radius:0}.btn-icon-close::before{content:"";font-size:.75rem}.btn-delete.btn-icon-close::before{margin-right:.75rem}.btn-disabled{background-color:#c6c6c6;color:#fff}.btn-disabled:hover{color:#fff;cursor:not-allowed}.btn-remove{border:1px solid rgba(0,0,0,0);background-color:#007c88;color:#fff}.btn-remove:hover,.btn-remove:active,.btn-remove:focus,.btn-remove:active:focus{border:1px solid rgba(0,0,0,0);background-color:#504d6c;color:#fff}.btn-remove::before{content:"";margin-right:.5rem;color:#fff}.btn-import,.btn-export,.btn-add-link,.btn-edit,.btn-view,.btn-email,.btn-filter,.btn-search,.btn-sort,.btn-toggle,.btn-toggle-off,.btn-clear{display:flex;align-items:center;width:-moz-max-content;width:max-content;padding:10px 0 0;border:0;border-bottom:1px solid rgba(0,0,0,0);border-radius:0;color:#007c88;background:rgba(0,0,0,0)}.btn-import::before,.btn-export::before,.btn-add-link::before,.btn-edit::before,.btn-view::before,.btn-email::before,.btn-filter::before,.btn-search::before,.btn-sort::before,.btn-toggle::before,.btn-toggle-off::before,.btn-clear::before{content:"";margin-right:.75rem;color:#007c88;background:rgba(0,0,0,0);transition:all .2s ease}.btn-import:hover,.btn-import:focus,.btn-import:active,.btn-export:hover,.btn-export:focus,.btn-export:active,.btn-add-link:hover,.btn-add-link:focus,.btn-add-link:active,.btn-edit:hover,.btn-edit:focus,.btn-edit:active,.btn-view:hover,.btn-view:focus,.btn-view:active,.btn-email:hover,.btn-email:focus,.btn-email:active,.btn-filter:hover,.btn-filter:focus,.btn-filter:active,.btn-search:hover,.btn-search:focus,.btn-search:active,.btn-sort:hover,.btn-sort:focus,.btn-sort:active,.btn-toggle:hover,.btn-toggle:focus,.btn-toggle:active,.btn-toggle-off:hover,.btn-toggle-off:focus,.btn-toggle-off:active,.btn-clear:hover,.btn-clear:focus,.btn-clear:active{border-bottom:solid 1px #007c88;box-shadow:none;color:#007c88;text-decoration:none;background:rgba(0,0,0,0)}.btn-round{width:auto;padding:10px 12px;transition:.2s all ease;border-radius:23px;background-color:#007c88;box-shadow:0 0 7px rgba(0,0,0,.2)}.btn-round::before{color:#fff;font-size:1.125rem}.btn-round span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.btn-round:hover,.btn-round:active,.btn-round:focus,.btn-round:active:focus{transform:translateY(-4px)}.btn-round.btn-add::before{margin-right:0}.btn-inverted{border:solid 1px #007c88;background-color:#fff;color:#007c88}.btn-inverted:hover,.btn-inverted:active,.btn-inverted:focus,.btn-inverted:active:focus{border-color:#504d6c;color:#504d6c}.btn-back,.btn-title-back{width:auto;padding:0;border:0;border-radius:0;color:#40374a;font-weight:600;text-align:left}.btn-back::before,.btn-title-back::before{content:"";margin-right:4px;transform:rotate(180deg);transition:margin-left .3s ease-in-out,padding-left .3s ease-in-out;font-size:.875rem}.btn-back:hover::before,.btn-back:active::before,.btn-title-back:hover::before,.btn-title-back:active::before{margin-left:-4px;padding-left:4px}.btn-back:focus,.btn-back:active:focus,.btn-title-back:focus,.btn-title-back:active:focus{box-shadow:unset}.btn-back:focus .btn__title,.btn-back:active:focus .btn__title,.btn-title-back:focus .btn__title,.btn-title-back:active:focus .btn__title{border-bottom:solid 1px #40374a}.btn-back:focus::before,.btn-back:active:focus::before,.btn-title-back:focus::before,.btn-title-back:active:focus::before{margin-left:-4px;padding-left:4px}.btn-title-back{font-size:1.125rem;font-weight:600;line-height:1.35;margin-top:0;color:#504d6c}.btn-title-back::before{color:#504d6c;font-size:1rem}.btn-title-back:hover,.btn-title-back:active{color:#504d6c}.btn-title-back:focus .btn__title,.btn-title-back:active:focus .btn__title{border-bottom:solid 1px #504d6c}.btn-link{width:-moz-max-content;width:max-content;padding:0;border-radius:0}.btn-link:hover,.btn-link:focus,.btn-link:active{border-bottom:solid 1px #007c88;text-decoration:none}.btn-help::before{transition:all .2s ease;content:""}.btn-plain{border:0;color:#40374a}.btn-plain:hover,.btn-plain:focus,.btn-plain:active{color:#007c88}.btn-import::before{content:""}.btn-edit{padding:0}.btn-edit::before{content:""}.btn-view{padding:0}.btn-view::before{content:"";font-size:1rem}.btn-email::before{content:""}.btn-clear::before{content:"";transform:rotate(180deg)}.btn-filter::before{content:""}.btn-search,.btn-sort{padding-top:0}.btn-search::before,.btn-sort::before{content:"";margin-right:0;font-size:1rem}.btn-search span,.btn-sort span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.btn-sort::before{content:"";transform:rotate(90deg)}.btn-toggle::before,.btn-toggle-off::before{font-size:1.4rem}.btn-toggle::before{content:""}.btn-toggle-off::before{content:""}.dt-ordering-asc .btn-sort::before{transform:rotate(-90deg)}.dt-ordering-desc .btn-sort::before{transform:rotate(90deg)}.btn-add-link{padding:0}.btn-add-link::before{content:"";font-size:1rem}.btn-download{display:flex;width:-moz-max-content;width:max-content;padding:0;border-radius:0}.btn-download .btn__title{text-align:left;word-break:break-all}.btn-download::after{content:"";margin-left:.5rem;padding:.25rem;transition:.2s all ease;border-radius:.25rem;color:#007c88}.btn-download:hover::after{background-color:#007c88;color:#fff}.btn-download.btn-round{padding:10px 12px;border-radius:23px;background-color:#f99d27}.btn-download.btn-round::after{margin-left:0;padding:0;color:#fff;font-size:1.125rem}.btn-download.btn-round:hover::after{background-color:#f99d27}.btn-invisible{display:none}@media(min-width: 576px){.btn{width:auto}.btn:not(:last-of-type){margin-right:1rem;margin-bottom:0}.btn-import,.btn-export,.btn-add-link,.btn-filter,.btn-clear{width:-moz-max-content;width:max-content}.btn-edit-widget,.btn-drag-widget,.btn-resize-widget{width:1.5rem;height:1.5rem}.btn-edit-widget:not(:last-of-type),.btn-drag-widget:not(:last-of-type),.btn-resize-widget:not(:last-of-type){margin-right:.5rem}}.table-toggle--add .btn,.table-toggle--remove .btn{position:absolute;right:1rem;width:19px;height:19px;margin:0;padding:0;font-size:18px;font-weight:bolder;line-height:16px}.table-toggle--add .btn::before{content:"";color:#18856b}.table-toggle--remove .btn::before{content:"";color:#e30036}.rename::before{content:""}.calculator-dropdown{margin-right:2rem}.card{padding:1rem 1rem;border-radius:10px;background-color:#fff;box-shadow:0 0 7px rgba(0,0,0,.4)}.card__body{margin:-2rem -1rem 0}.card__body>*{padding:0 1rem}.card__title{font-size:1rem;font-weight:600;line-height:1.35;display:flex;margin:0 0 1rem;color:#40374a}.card__title:not(:first-child){margin-top:2rem}.card__image,.card__content{margin-top:2rem}.card__image{flex:1 1 186px}.card__image img{width:100%;height:auto}.card__content{flex:100%}.card--primary,.card--secundary,.card--record{border:0;border-radius:0}.card--primary>.card__title{color:#504d6c}.card--secundary .card__title{color:#007c88}.card--help{line-height:1.5}.card--record{padding:1rem}.card--record h3{margin-bottom:2rem;color:#007c88}.card--record .list__item:nth-child(2){margin-bottom:1rem}.card--record .list__item:nth-child(4){margin-bottom:1.5rem}.card--header{border-radius:0}.card--header:not(:last-of-type){margin-bottom:1rem}.card--header .card__header{margin:-1rem -1rem 1rem;padding:1rem 1rem;background-color:#504d6c;color:#fff}.card--header .card__title{margin-top:0;color:#007c88}.card--header .list--key-value:not(:last-of-type){margin-bottom:1.5rem}.dashboard__widget .card{height:100%}@media(min-width: 768px){.card__image{flex:2 0 186px}.card__content{flex:10 1 200px}.card--primary>.card__title{font-size:1.125rem}}.card--settings{height:100%;border:0}.card--settings .card__title{color:#007c88}.card--settings .card__title span{transition:border-bottom .3s ease-in-out;border-bottom:solid 1px rgba(0,0,0,0)}.card--settings .card__content{color:#40374a}.card--settings .card__title-icon::before{content:"";margin-right:.5rem;color:#007c88;font-size:1.25rem}.card--settings:hover .card__title span{border-bottom:solid 1px #007c88}.card--settings .card__title-icon--user::before{content:""}.card--settings .card__title-icon--organisation::before{content:""}.card--settings .card__title-icon--department::before{content:""}.card--settings .card__title-icon--groups::before{content:""}.card--settings .card__title-icon--table::before{content:""}.card--settings .card__title-icon--email::before{content:""}.card--settings .card__title-icon--settings::before{content:""}.card--settings .card__title-icon--report::before{content:""}.card--expandable{padding:0;border:0;border-radius:0}.card--expandable .card__header{display:flex;align-items:center;justify-content:space-between}.card--expandable .card__title{flex-wrap:wrap;margin-bottom:0;transition:.2s all ease;border-bottom:1px solid rgba(0,0,0,0);color:#007c88}.card--expandable .card__subtitle{display:block;flex:0 0 100%;transition:.2s all ease;color:#555;font-weight:normal;text-align:left}.card--expandable .card__description{display:block;margin-bottom:1.5rem}.card--expandable .card__header-left{display:flex;flex:1;padding:1rem;border:0;background-color:rgba(0,0,0,0);text-align:left;cursor:pointer}.card--expandable .card__header-right{display:flex;padding-right:1rem}.card--expandable .card__toggle{padding:0;border:0;background-color:#fff;line-height:1.35}.card--expandable .card__toggle span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.card--expandable .card__toggle::after{content:"";margin-left:1rem;transform:rotate(90deg);color:#40374a}.card--expandable .card__toggle[aria-expanded=false]::after{transform:rotate(0deg)}.card--expandable .card__link{margin-bottom:0;color:#007c88}.card--expandable .card__link span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0;transition:.2s all ease;border-bottom:solid 1px rgba(0,0,0,0)}.card--expandable .card__link::before{content:"";margin-right:.5rem;color:#007c88}.card--expandable .card__link:hover span{border-bottom:solid 1px #007c88}.card--expandable .card__content{margin-top:0;padding:1rem}.card--expandable .card__edit-content,.card--expandable .btn-view{display:none}.card--expandable .btn-edit,.card--expandable .btn-view{margin-right:0;margin-bottom:0}@media(min-width: 576px){.card--expandable .card__subtitle{display:inline-block;flex:1 1 auto;margin-left:1.25rem}}@media(min-width: 768px){.card--expandable .card__link span{position:static;width:auto;height:auto;margin:0;overflow:auto;clip:auto}.card--expandable .card__toggle::after{margin-left:2rem}}.card--edit .card__edit-content,.card--edit .btn-view{display:block}.card--edit .card__view-content,.card--edit .btn-edit{display:none}.collapsible-dropdown{width:-moz-max-content;width:max-content}.collapsible-dropdown .collapsible__toggle{display:inline-flex;align-items:center;border:none;background-color:rgba(0,0,0,0);padding:0;color:#40374a}.collapsible-dropdown .collapsible__toggle::after{content:"";margin-left:.5rem;transform:rotate(90deg);transition:.2s transform ease;border:0;color:#40374a;font-size:10px}.collapsible-dropdown .collapsible__toggle:hover,.collapsible-dropdown .collapsible__toggle:focus,.collapsible-dropdown .collapsible__toggle:active,.collapsible-dropdown .collapsible__toggle:active:focus,.collapsible-dropdown .collapsible__toggle:active:hover{border:none;background-color:rgba(0,0,0,0)}.collapsible-dropdown .collapsible__toggle:hover::after,.collapsible-dropdown .collapsible__toggle:focus::after,.collapsible-dropdown .collapsible__toggle:active::after,.collapsible-dropdown .collapsible__toggle:active:focus::after,.collapsible-dropdown .collapsible__toggle:active:hover::after{transform:rotate(-90deg)}.collapsible-dropdown .collapsible__toggle.open .dropdown__toggle::after{transform:rotate(-90deg) translateX(-150%)}.collapsible-dropdown .collapsible-dropdown__content{margin-top:10px;background-color:#fff}.content-block{flex:1 1 100%;padding:0 0 2rem 1.25rem}.content-block__navigation{display:flex;position:relative;flex-wrap:wrap;gap:1rem;align-items:center;justify-content:space-between;margin-bottom:1px;padding:1rem 0 1rem}.content-block__navigation::after{content:"";position:absolute;right:0;bottom:-1px;left:0;height:1px;margin-right:-1.25rem;margin-left:-1.25rem;background:#c6c6c6}.content-block__navigation-left,.content-block__navigation-right{display:flex;flex:0 0 100%;align-items:center;gap:1rem}.content-block__head,.content-block__main{padding-top:2rem}.modal-dialog .content-block__head,.modal-dialog .content-block__main{padding-top:0}.content-block .alert{margin-top:2rem;margin-bottom:0}.content-block .modal-dialog .alert{margin-top:0;margin-bottom:2rem}.content-block__title{font-size:1.125rem;font-weight:600;line-height:1.35;margin-top:0;color:#504d6c}.content-block__aside{margin-top:1rem}.content-block__aside>.list--horizontal{display:flex}.content-block__aside>.list--horizontal .list__items{margin-bottom:0}.content-block--white .content-block__main{margin-top:1.5rem;padding:1.5rem 2rem;background-color:#fff;box-shadow:0 0 7px rgba(0,0,0,.0509803922)}.content-block--footer{display:flex;flex-direction:column}.content-block--footer .content-block__main{display:flex;flex:1 1 100%;flex-direction:column}.content-block--footer form,.content-block--footer fieldset{display:flex;flex:1 1 100%;flex-direction:column}.content-block--footer .content-block__main-content{flex:1 1 100%}.content-block--edit .content-block__left{display:none}.content-block--edit .content-block__right{flex:0 0 100%;max-width:100%}@media(min-width: 992px){.content-block{padding-left:2rem}.content-block__navigation::after{margin-right:-2rem;margin-left:-2rem}.content-block__aside{margin-top:0}.content-block__aside>.list--horizontal{justify-content:flex-end}}@media(min-width: 1200px){.content-block__aside{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end}.content-block__aside>*:not(:only-child){margin-bottom:1rem}.content-block__navigation-left,.content-block__navigation-right{flex:0 0 auto}}.content-block__footer{position:sticky;z-index:999;bottom:0;margin:2rem 0 -2rem -1.25rem}.content-block__footer-container{width:100%;padding:1rem 0 1rem 1.25rem}.content-block__footer-container::before{content:"";position:absolute;top:0;right:-1.25rem;bottom:0;left:0;background-color:#fff;box-shadow:0 0 7px rgba(0,0,0,.1)}.content-block--record .content-block__footer{display:none}.content-block--record.content-block--edit .content-block__footer{display:block}@media(min-width: 992px){.content-block__footer{margin:2rem 0 -2rem -2rem}.content-block__footer-container{padding:1rem 0 1rem 2rem}.content-block__footer-container::before{right:-2rem}}.dashboard{background:#f9f9f9}.layoutJSON{margin-top:10px;padding:10px;border:1px solid #000;background:#c6c6c6}.columns{-moz-columns:120px;columns:120px}.react-grid-item{box-sizing:border-box}.react-grid-item.react-grid-placeholder{background-color:rgba(0,124,136,.5)}.react-grid-item:not(.react-grid-placeholder){padding:1rem 1rem;border-radius:10px;background-color:#fff;box-shadow:0 0 7px rgba(0,0,0,.4)}.react-grid-item.resizing{opacity:.9}.react-grid-item.static{background:#f9f9f9}.react-grid-item .text{position:absolute;top:0;right:0;bottom:0;left:0;height:24px;margin:auto;font-size:24px;text-align:center}.react-grid-item .minMax{font-size:12px}.react-grid-item .add{cursor:pointer}.react-grid-dragHandleExample{cursor:move;cursor:grab}.ld-widget-handlers{position:absolute;right:20px;bottom:.5rem}.react-resizable-handle,.ld-widget-handlers{transition:.2s all ease;opacity:.2}.react-grid-item:hover .react-resizable-handle,.react-grid-item:hover .ld-widget-handlers{opacity:1}.ld-draggable-handle,.ld-edit-button{position:absolute;bottom:0;width:1.5rem;height:1.5rem}.ld-draggable-handle::before,.ld-edit-button::before{transition:.2s all ease}.ld-draggable-handle span,.ld-edit-button span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.ld-draggable-handle{right:1rem;cursor:move}.ld-draggable-handle::before{content:""}.ld-edit-button{right:3rem;cursor:pointer}.ld-edit-button::before{content:""}.ld-body-container{margin-bottom:4rem}.ld-widget-container{position:relative;overflow:hidden;border:1px solid rgba(0,0,0,0)}.ld-widget-container .ld-draggable-handle,.ld-widget-container .ld-edit-button,.ld-widget-container .react-resizable-handle{z-index:20;transition:opacity .2s;opacity:.2;color:#555}.ld-widget-container:hover .ld-draggable-handle,.ld-widget-container:hover .ld-edit-button,.ld-widget-container:hover .react-resizable-handle{opacity:1}.ld-widget-container--editable:hover{border-color:#c6c6c6}.ld-modal__header{position:relative;min-width:400px;padding:14px 12px;border-bottom:1px solid gray}.ld-modal__footer{position:relative;padding:8px 12px;border-top:1px solid gray}.ld-modal__right-container{position:absolute;top:8px;right:12px}.ld-modal__right-container>*{margin-right:12px}.ld-modal__right-container>*:last-child{margin-right:0}.ld-modal__content-container{position:relative;min-height:100px;max-height:80vh;max-height:calc(100vh - 120px);padding:15px;overflow-y:scroll}.ld-modal__loading{position:absolute;top:50%;left:50%;margin-right:-50%;transform:translate(-50%, -50%)}.ReactModal__Body--open{overflow-y:hidden}.ld-widget{height:100%;overflow-x:hidden;overflow-y:auto}.ld-footer-container{display:flex;position:fixed;z-index:999;right:2rem;bottom:2rem;flex-direction:column;justify-content:end}@media(min-width: 768px){.ld-footer-container{flex-direction:row}}.ld-header-container{text-align:right}.ld-header-container .spinner{display:inline-block;margin-right:10px}.data-table{border-spacing:0;font-size:.875rem}.data-table.table-thead-hidden thead{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.data-table thead{background-color:#fff;z-index:1}.data-table thead th{border-bottom:1px solid #c6c6c6;text-transform:uppercase;vertical-align:top}.data-table thead th[class*=sorting_asc],.data-table thead th[class*=sorting_desc]{color:#007c88}.data-table thead th.data-table__header--invisible span,.data-table thead th.dt__header--inivisible span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.data-table tfoot{background-color:rgba(0,124,136,.2);font-weight:bold}.data-table.table-lines th,.data-table.table-lines td{border-top:0;border-bottom:1px solid #c6c6c6}.data-table .autosize{max-height:30px}table.dataTable thead .sorting::before,table.dataTable thead .sorting::after,table.dataTable thead .sorting_disabled::before,table.dataTable thead .sorting_disabled::after{content:normal !important}.dataTables_wrapper{margin-bottom:.5rem;font-size:.875rem}.dataTables_wrapper:last-child{margin-bottom:0}.dataTables_wrapper .row{width:100%}.dataTables_wrapper .row--header,.dataTables_wrapper .row--main{margin-bottom:1rem}.row--fiv-header{margin-top:1.9rem}.dataTables_toggle_full_width .btn-toggle,.dataTables_toggle_full_width .btn-toggle-off{padding-top:7px}.data-table__container--scrollable{overflow:auto}.data-table__container--scrollable thead{position:sticky;top:0}.dataTables_info_wrapper{display:none}.dataTables_length_wrapper{margin-top:2rem}.dataTables_length .form-control{width:100%;height:auto;padding:.5rem 1rem;transition:.2s all ease;color:#000;text-align:left}.dataTables_length .form-control::-moz-placeholder{color:#707070;font-style:italic}.dataTables_length .form-control::placeholder{color:#707070;font-style:italic}.dataTables_length .form-control:hover,.dataTables_length .form-control:focus,.dataTables_length .form-control:active,.dataTables_length .form-control:active:focus,.dataTables_length .form-control:active:hover{border:1px solid #007c88;box-shadow:none}.dataTables_filter label{position:relative;display:flex;justify-content:flex-start}.dataTables_filter label .form-control{padding-left:2.75rem}.dataTables_filter label::after{content:"";position:absolute;top:50%;left:1rem;transform:translateY(-50%);font-size:1rem}.dataTables_filter .form-control{width:100%;height:auto;padding:.5rem 1rem;transition:.2s all ease;color:#000;text-align:left}.dataTables_filter .form-control::-moz-placeholder{color:#707070;font-style:italic}.dataTables_filter .form-control::placeholder{color:#707070;font-style:italic}.dataTables_filter .form-control:hover,.dataTables_filter .form-control:focus,.dataTables_filter .form-control:active,.dataTables_filter .form-control:active:focus,.dataTables_filter .form-control:active:hover{border:1px solid #007c88;box-shadow:none}.data-table__sort{display:flex;align-items:flex-start;order:2;padding:0;transition:.2s all ease-in;border:0;border-bottom:1px solid rgba(0,0,0,0);background-color:rgba(0,0,0,0);color:#40374a;font-weight:bold;text-align:left;text-transform:uppercase}.data-table__sort .btn-sort{margin-top:.1rem;margin-left:.25rem;opacity:0}.data-table__sort .btn-sort:hover{border-bottom:none}.data-table__sort:hover,.data-table__sort:active,.data-table__sort:focus,.dt-ordering-asc .data-table__sort,.dt-ordering-desc .data-table__sort{color:#007c88}.data-table__sort:hover .btn-sort,.data-table__sort:active .btn-sort,.data-table__sort:focus .btn-sort,.dt-ordering-asc .data-table__sort .btn-sort,.dt-ordering-desc .data-table__sort .btn-sort{opacity:1}.data-table__header--invisible .data-table__sort{display:none}.data-table__search{margin:0 .1rem 0 -1rem}.data-table__search .dropdown-toggle{margin-top:.1rem;transition:.2s opacity ease-in;opacity:0}.data-table__search .dropdown-toggle:hover,.data-table__search .dropdown-toggle:active,.data-table__search .dropdown-toggle:focus{opacity:1}.data-table__search .dropdown-toggle::after{content:normal}.data-table__search.show .dropdown-toggle{opacity:1}.data-table__search label{position:relative}.data-table__search label .form-control{padding-left:2.75rem}.data-table__search label::after{content:"";position:absolute;top:50%;left:1rem;transform:translateY(-50%);font-size:1rem}.data-table__search .input .form-control{width:auto}.data-table__header--invisible .data-table__search{display:none}.col .dt-search input[type=search]{width:98%}.dataTables_scrollHead .table--bordered,.dt-scroll-head .table--bordered{box-sizing:border-box;border:1px solid #c6c6c6;border-bottom:0;border-top-left-radius:5px;border-top-right-radius:5px}.dataTables_scrollHead .table--bordered thead,.dt-scroll-head .table--bordered thead{color:#585858}.dataTables_scrollBody:has(.table--bordered),.dt-scroll-body:has(.table--bordered){border:1px solid #c6c6c6;border-top:0;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.dataTables_scrollBody:has(.table--bordered) .table-striped,.dt-scroll-body:has(.table--bordered) .table-striped{border-bottom:0}.dataTables_scrollFoot .table-striped.table--bordered,.dt-scroll-foot .table-striped.table--bordered{border:0}.data-table__header-wrapper{display:flex;position:relative;align-items:flex-start}.data-table__header-wrapper.filter .data-table__search .dropdown-toggle.btn-search{opacity:1}.data-table__header-wrapper:hover .data-table__search .dropdown-toggle,.data-table__header-wrapper:active .data-table__search .dropdown-toggle,.data-table__header-wrapper:focus .data-table__search .dropdown-toggle{opacity:1}.dataTables_paginate .pagination{justify-content:center}.page-item .page-link{transition:.2s all ease}.page-item.active .page-link,.page-item .page-link:hover{border-color:#007c88;background-color:#007c88;color:#fff}div.dataTables_wrapper div.dataTables_length{text-align:left}div.dataTables_wrapper div.dataTables_length label{justify-content:flex-start}div.dataTables_wrapper div.dataTables_length label .form-control{margin-left:.5rem}div.dataTables_wrapper div.dataTables_filter input.form-control{width:100%;margin-left:0}:fullscreen body{padding:0;background-color:#fff}:fullscreen .main{max-width:none}:fullscreen .sidebar,:fullscreen .table-header,:fullscreen .content-block__navigation,:fullscreen .content-block__head{display:none}:fullscreen .content-block__main{padding-top:0}:fullscreen .dataTables_wrapper{padding-top:2rem}:fullscreen .data-table{margin-top:0 !important}@media(min-width: 992px){.dataTables_wrapper .row--main{margin-bottom:2rem}.dataTables_length_wrapper{margin-top:0}.dataTables_length label{justify-content:flex-end}.dataTables_info_wrapper{display:block;text-align:right}.dataTables_paginate .pagination{justify-content:flex-start}}.dataTables_processing,.dt-processing{position:fixed;top:50%;left:50%}table.table-purge thead tr th,table.table-purge tbody tr td{text-align:center !important}table.table-purge tbody tr td{border:1px solid #c6c6c6;border-top:0}table.table-purge thead tr th{background-color:#007c88;color:#fff}button.btn-remove,button.btn-add{margin:1rem 0}.dt-column-order{display:none;visibility:collapse}@media(max-width: 991.98px){.dataTables_scrollBody:has(.table-toggle){height:auto !important}}.table-toggle tr[data-field-is-toggled=false]{display:none}.table-toggle tbody tr:nth-child(odd of [data-field-is-toggled=true]){background-color:#f9f9f9}.table-modal{position:fixed;z-index:1020;top:0;right:0;bottom:0;left:0;padding:1rem;background:#fff}.table-modal .row{margin-right:0;margin-left:0}.data-table .data-table-row--child{position:relative;padding-left:2rem}.data-table .data-table-row--child::after{content:"";position:absolute;top:50%;left:1rem;margin-right:.5rem;transform:translateY(-50%);font-size:.9em}table.dataTable.dtr-column>tbody>tr>td.dtr-control::before,table.dataTable.dtr-column>tbody>tr>th.dtr-control::before{content:"";top:1.3rem;right:.5rem;left:auto;margin:0 .5rem 0 0;transform:rotate(90deg);border:0;background-color:rgba(0,0,0,0);box-shadow:none;color:#40374a;font-size:.9em;transition:all .2s ease-in-out}table.dataTable.dtr-column>tbody>tr.parent>td.dtr-control::before,table.dataTable.dtr-column>tbody>tr.parent>th.dtr-control::before{content:"";transform:rotate(-90deg);background-color:rgba(0,0,0,0)}table.dataTable>tbody>tr.child ul.dtr-details>li{border-bottom:none}table.dataTable>tbody>tr.child span.dtr-title{min-width:auto}table.dataTable.dtr-column>tbody>tr>td.dtr-control.data-table-row--child,table.dataTable.dtr-column>tbody>tr>th.dtr-control.data-table-row--child{padding-left:4rem}table.dataTable.dtr-column>tbody>tr>td.dtr-control.data-table-row--child::after,table.dataTable.dtr-column>tbody>tr>th.dtr-control.data-table-row--child::after{left:2rem}table.dataTable td{line-height:1.125rem}table.dataTable td.reorder{text-align:right;cursor:move}table.dataTable td.reorder span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}table.dataTable td.reorder::before{content:""}.table-striped{border-bottom:1px solid #c6c6c6}li .table-striped{border-bottom:none}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,0)}.table-striped tbody tr.odd,.table-striped tbody tr.odd+tr.child{background-color:#f9f9f9}.table-striped tbody tr>td{line-height:17px}.table-striped tbody tr.odd+tr.child:hover{background-color:#f9f9f9 !important}.table-striped.table-lines{border-bottom:none}.table-hover tbody tr.odd:hover{background-color:rgba(0,124,136,.2);cursor:pointer}.table-hover tbody td .link{display:block;margin:-1rem;padding:1rem 1rem;transition:none;border-bottom:none;color:#40374a}.table-hover tbody td .link:hover,.table-hover tbody td .link:active,.table-hover tbody td .link:focus{border-bottom:none;color:#40374a}.table-hover tbody td.child .dtr-data .link{margin:0;padding:0}.table-hover tbody tr:hover{cursor:pointer}.table-hover tbody tr.tr--focus,.table-hover tbody tr.odd.tr--focus{background-color:rgba(0,124,136,.2)}.dataTables_scroll .dataTables_scrollHead .dataTables_scrollHeadInner{width:100% !important}.dataTables_scroll .dataTables_scrollHead .dataTables_scrollHeadInner .data-table{width:100% !important}.dataTables_scroll .dataTables_scrollHead .dataTables_scrollHeadInner .data-table.table-striped{border-bottom:none}.dataTables_scroll .dataTables_scrollHead .dataTables_scrollHeadInner .data-table tr th{width:100% !important}.dataTables_scroll .dataTables_scrollBody>table>tbody tr:first-child td{border-top:1px solid rgba(0,0,0,.05)}.dropdown{position:static}.dropdown__toggle{display:inline-flex;align-items:center;border:none;background-color:rgba(0,0,0,0);padding:0;color:#40374a}.dropdown__toggle::after{content:"";margin-left:.5rem;transform:rotate(90deg);transition:.2s transform ease;border:0;color:#40374a;font-size:10px}.dropdown__toggle:hover,.dropdown__toggle:focus,.dropdown__toggle:active,.dropdown__toggle:active:focus,.dropdown__toggle:active:hover{border:none;background-color:rgba(0,0,0,0)}.dropdown__toggle:hover::after,.dropdown__toggle:focus::after,.dropdown__toggle:active::after,.dropdown__toggle:active:focus::after,.dropdown__toggle:active:hover::after{transform:rotate(-90deg)}.dropdown__toggle.open .dropdown__toggle::after{transform:rotate(-90deg) translateX(-150%)}.dropdown__menu{margin:.125rem 0;padding:0;border:1px solid #c6c6c6;border-radius:5px;overflow-y:auto;max-height:50vh}.dropdown__item{padding:.5rem 1rem}.dropdown__item:not(:last-child){border-bottom:1px solid #f9f9f9}.dropdown--small .dropdown__toggle,.dropdown--small .dropdown__menu{font-size:.875rem}.dropdown--large .dropdown__toggle{font-size:1.125rem}.dropdown-menu.show{z-index:1070}@media(min-width: 576px){.dropdown-menu.show{max-width:90vw}}@media(min-width: 768px){.dropdown-menu.show{max-width:70vw}}@media(min-width: 992px){.dropdown-menu.show{max-width:50vw}}.dropdown__group:not(:last-child){margin-bottom:.5rem}.dropdown__group-title{padding:.5rem 1rem 0;color:#504d6c;font-size:1.125rem;font-weight:600;line-height:1.35}.dropdown__list{margin:0;padding:0;list-style-type:none}.error-container.alert-danger::before{content:none}.error-container.alert-danger .error-message::before{content:""}.field--changed input,.field--changed .jstree-container-ul,.field--changed .form-control{background-color:#fff2cd;border-radius:5px}.modal-autosave{max-height:20rem;overflow-y:auto;overflow-x:hidden}li.li-success{list-style:none}li.li-success::before{content:"✓";color:green;font-size:1.5em;margin-right:.5em}li.li-error{list-style:none}li.li-error::before{content:"✗";color:red;font-size:1.5em;margin-right:.5em}#restoreValuesModal .btn-js-delete-values{visibility:hidden;display:none}.alert-restore{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.alert-restore p{flex-grow:1}.alert-restore .btn-alert-restore{color:#212529;background-color:#fff;border-color:#007c88;color:#007c88}.alert-restore .btn-alert-restore:hover{color:#212529;background-color:#fff;border-color:#504d6c}.alert-restore .btn-alert-restore:focus,.alert-restore .btn-alert-restore.focus{color:#212529;background-color:#fff;border-color:#504d6c;box-shadow:0 0 0 .2rem rgba(5,111,122,.5)}.alert-restore .btn-alert-restore.disabled,.alert-restore .btn-alert-restore:disabled{color:#212529;background-color:#fff;border-color:#007c88}.alert-restore .btn-alert-restore:not(:disabled):not(.disabled):active,.alert-restore .btn-alert-restore:not(:disabled):not(.disabled).active,.show>.alert-restore .btn-alert-restore.dropdown-toggle{color:#fff;background-color:#007c88;border-color:#007c88}.alert-restore .btn-alert-restore:not(:disabled):not(.disabled):active:focus,.alert-restore .btn-alert-restore:not(:disabled):not(.disabled).active:focus,.show>.alert-restore .btn-alert-restore.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(5,111,122,.5)}.alert-restore .btn-alert-restore:hover{color:#504d6c}.checkbox{margin-bottom:.5rem}.checkbox input[type=checkbox]{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.checkbox label{display:flex;position:relative;padding-left:1.5rem}.checkbox label::before{content:"";display:inline-block;position:absolute;left:0;flex:0 0 1rem;width:1rem;height:1rem;margin-right:.5rem;transition:.2s all ease;border:1px solid #c6c6c6;background-color:#fff}.checkbox label:hover::before{border-color:#007c88}.checkbox label::before{top:.125rem;border-radius:5px}.checkbox input[type=checkbox]:focus+label::before{border-color:#007c88;box-shadow:inset 0 1px 1px rgba(0,0,0,.08),0 0 8px rgba(0,124,136,.6)}.checkbox input[type=checkbox]:checked+label::before{border-color:#007c88;background-color:#007c88}.checkbox input[type=checkbox]:checked+label::after{content:"";position:absolute;top:.625rem;left:4px;transform:translateY(-50%);color:#fff;font-size:7px}.checkbox input[disabled]+label{color:#c6c6c6}.checkbox input[disabled]+label:hover::before{border-color:#c6c6c6}.checkbox input[type=checkbox]:checked:disabled+label::before{border-color:#c6c6c6;background-color:#c6c6c6}.checkbox label{justify-content:flex-start;margin-bottom:0}.checkbox-confirm{margin-top:2rem}.checkbox--hide-label input[type=checkbox]:checked+label::after{left:5px}.checkbox--hide-label label>span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.data-table .checkbox label::before{width:.9rem;height:.9rem}.data-table .checkbox label span{padding-top:.05rem}.checkbox-reveal{display:none}.checkbox-reveal--show{display:block}.input-daterange .input .form-control{margin-top:0}.input-daterange .input-group-addon{flex:1 1 auto}.input-daterange .input-group-text{justify-content:center;padding:.5rem 1rem;border-radius:0}.input-daterange .input--from{flex:1 1 auto}.input-daterange .input--from .form-control{border-right:1px solid rgba(0,0,0,0);border-radius:5px 0 0 5px}.input-daterange .input--to{flex:1 1 auto}.input-daterange .input--to .form-control{border-left:1px solid rgba(0,0,0,0);border-radius:0 5px 5px 0}.query-builder.query-builder .btn{padding:.25rem .5rem;border-radius:5px;font-size:.875rem}.query-builder.query-builder .rules-group-container{display:flex;flex-direction:column;flex-wrap:wrap;gap:.5rem;width:100%;border:1px solid #c6c6c6;background-color:#f9f9f9}.query-builder.query-builder .rules-group-header{display:flex;flex-wrap:wrap;justify-content:space-between;gap:.5rem;margin-bottom:0}.query-builder.query-builder .rules-group-header .group-conditions .btn{display:flex;align-items:center;min-width:4rem;margin-right:1px;margin-bottom:0;border-color:#c6c6c6;background-color:#fff;color:#40374a}.query-builder.query-builder .rules-group-header .group-conditions .btn.readonly:not(.active),.query-builder.query-builder .rules-group-header .group-conditions input[name$=_cond]{position:static;width:auto;height:auto;margin:0;overflow:auto;clip:auto;margin-right:.5rem}.query-builder.query-builder .rules-group-header .group-conditions .btn:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.query-builder.query-builder .rules-group-header .group-conditions .btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.query-builder.query-builder .rules-group-header .group-conditions .btn.active{border-color:#007c88}.query-builder.query-builder .rules-group-header .group-actions{flex:0 0 100%;gap:.5rem}.query-builder.query-builder .rules-group-header .group-actions .btn-success{margin:0;border:none;border-radius:5px;background-color:#007c88}.query-builder.query-builder .rules-list{padding-left:25px}.query-builder.query-builder .rule-container{display:flex;flex-wrap:wrap;padding:1rem;border:1px solid #c6c6c6;border-radius:0}.query-builder.query-builder .rule-container .rule-header{display:flex;align-items:center;justify-content:flex-end;order:2}.query-builder.query-builder .rule-container .btn-group{width:100%}.query-builder.query-builder .rule-container .form-control{margin-bottom:1rem}.query-builder.query-builder .rule-filter-container,.query-builder.query-builder .rule-operator-container{flex:1 0 auto}.query-builder.query-builder .rule-filter-container .form-control,.query-builder.query-builder .rule-operator-container .form-control{width:100%}.query-builder.query-builder .rule-value-container{flex:0 0 100%;padding-top:1rem;padding-left:0;border-top:1px solid #c6c6c6;border-left:0}.query-builder.query-builder .rule-value-container .form-control{width:100%}.query-builder.query-builder .glyphicon{margin-right:.5rem}.query-builder.query-builder .glyphicon-plus::before,.query-builder.query-builder .glyphicon-plus-sign::before{content:""}.query-builder.query-builder .glyphicon-remove::before{content:""}.query-builder.query-builder .glyphicon-warning-sign::before{content:""}@media(min-width: 992px){.query-builder.query-builder .rules-group-header{margin-bottom:0}.query-builder.query-builder .rules-group-header .group-actions{flex:none;order:2}.query-builder.query-builder .rules-group-header,.query-builder.query-builder .rule-container{flex-direction:row}.query-builder.query-builder .rules-group-header .btn-group,.query-builder.query-builder .rule-container .btn-group{width:auto}.query-builder.query-builder .rules-group-header .form-control,.query-builder.query-builder .rule-container .form-control{margin-bottom:0}.query-builder.query-builder .rule-container{gap:.5rem}.query-builder.query-builder .group-conditions .btn{margin-bottom:0}.query-builder.query-builder .rules-list{padding-left:40px}.query-builder.query-builder .rule-value-container{flex:0 0 auto;padding-top:0;padding-left:5px;border-top:0;border-left:1px solid #c6c6c6}.query-builder.query-builder .rule-value-container .form-control{width:auto}}.fieldset{position:relative}.fieldset__legend{display:flex}.fieldset__legend legend{margin-bottom:0;font-size:1rem;font-weight:600;width:auto;margin-bottom:.25rem;font-size:.875rem}.fieldset--invalid legend{color:#e30036}.fieldset__legend--hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.fieldset__legend--standalone{margin-bottom:1rem}.fieldset__legend+.form-group{margin-top:.25rem}.fieldset--required legend::after{content:"*"}.rule-value-container .tt__container .twitter-typeahead .tt-menu{max-height:6em;overflow-y:auto}.filter .rules-group-container .rules-group-body .rules-list .rule-container .rule-value-container .tt__container .twitter-typeahead .tt-menu{max-height:12em;overflow-y:auto}.form-inline .form-group{margin-right:1rem}.card__content>.row:last-of-type .form-group:last-child{margin-bottom:0}.form-group[data-has-dependency]{margin-left:2rem}.form-control[aria-invalid],.radio-group__input[aria-invalid]+.radio-group__label::before{border-color:#e30036}.form-text{margin-bottom:.5rem;font-size:.875rem}.form-text--error{margin-top:.5rem;color:#e30036}.tt-menu{background-color:#f9f9f9;border:solid 2px #e5e5e5;width:210px;margin-left:1px}.tt-menu .tt-suggestion{background-color:#f9f9f9;color:#40374a;border-bottom:1px solid #e5e5e5;padding:.5rem 1rem;font-weight:normal;text-transform:none}.tt-menu .tt-suggestion:hover{background-color:#e5e5e5}.input{position:relative;margin-bottom:.5rem}.input .input__label{display:flex;position:relative;align-items:center;padding-right:.5rem}.input .input__label .btn{margin-left:.5rem}.input label{margin-bottom:0;font-size:1rem;font-weight:600}.input .form-control[readonly]{border-color:rgba(0,0,0,0);background-color:#f9f9f9}.input .form-control[disabled]{border:solid 1px #c6c6c6;background-color:#f9f9f9;color:#c6c6c6;resize:none}.input .form-control[disabled]::-moz-placeholder{color:#c6c6c6}.input .form-control[disabled]::placeholder{color:#c6c6c6}.input .form-control[disabled]:hover,.input .form-control[disabled]:focus,.input .form-control[disabled]:active,.input .form-control[disabled]:active:focus,.input .form-control[disabled]:active:hover{border-color:#c6c6c6}.input .form-control{width:100%;height:auto;padding:.5rem 1rem;transition:.2s all ease;color:#000;text-align:left;margin-top:.5rem}.input .form-control::-moz-placeholder{color:#707070;font-style:italic}.input .form-control::placeholder{color:#707070;font-style:italic}.input .form-control:hover,.input .form-control:focus,.input .form-control:active,.input .form-control:active:focus,.input .form-control:active:hover{border:1px solid #007c88;box-shadow:none}.input__field{position:relative}.input--search{position:relative}.input--search .form-control{padding-left:2.75rem}.input--search::after{content:"";position:absolute;top:50%;left:1rem;transform:translateY(-50%);font-size:1rem}.input--required label:not(.checkbox-label)::after{content:"*"}.input--required.input--file .input__label>label::after{content:normal}.input.invalid label{color:#e30036}.input.invalid .form-control{border-color:#e30036}.input.invalid .form-control:hover,.input.invalid .form-control:focus,.input.invalid .form-control:active,.input.invalid .form-control:active:focus,.input.invalid .form-control:active:hover{border-color:#e30036}.input--password .input__reveal-password{position:absolute;top:50%;right:1rem;padding:0;transform:translateY(-50%);border:none;background-color:rgba(0,0,0,0)}.input--password .input__reveal-password::after{content:"";color:#c6c6c6;cursor:pointer}.input--password .input__reveal-password:hover::after{color:#555}.input--password .input__reveal-password span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.input--password .input__reveal-password.show::after{color:#000}.input--file{display:block;margin-bottom:1rem}.input--file .input__label{display:flex;z-index:2;flex-direction:column;align-items:center;margin-bottom:1rem}.input--file .input__label label{width:100%}.input--file .input__file-label{display:block;margin-bottom:.5rem;padding:10px 30px;transition:.2s opacity ease;border-radius:1.5rem;background-color:#504d6c;color:#fff;text-align:center;cursor:pointer}.input--file .input__file-label:hover,.input--file .input__file-label:active,.input--file .input__file-label:focus{opacity:.8}.input--file .file{display:flex;align-items:center}.input--file .file__name{max-width:12.5rem;margin-bottom:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.input--file .file__delete{margin-left:.5rem;font-size:unset;cursor:pointer}.input--file .file__delete::before{content:"";font-size:.75rem}.input--file .form-text{font-size:.875rem;font-style:italic}.input--file .form-control-file{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}@media(min-width: 576px){.input--file .input__label{flex-direction:row}.input--file .input__label label{width:auto}.input--file .input__file-label{margin-right:1rem;margin-bottom:0;text-align:left}}.input--autocomplete{font-family:"Open Sans",Helvetica,Arial,sans-serif}.input--autocomplete .form-control{padding-right:2rem}.input--document .progress-bar__container{display:none;margin-bottom:.5rem;padding:.5rem;border-radius:5px;background-color:rgba(0,0,0,0);color:#18856b;text-align:center;vertical-align:middle}.input--document .progress-bar__container .progress-bar__progress{background-color:rgba(24,133,107,.2)}.input--document .progress-bar__container .progress-bar__progress .progress-bar__percentage{display:inline-block;width:100%;text-align:center;font-size:.875rem;color:#18856b;white-space:nowrap}.input--document .progress-bar__container--fail{background-color:rgba(227,0,54,.2);color:#e30036}.input--document .fileupload__files{margin:0 0 .5rem 0;padding:0;list-style-type:none}.input--document.invalid .fileupload__files label{color:#007c88}.input--document.invalid .fileupload__files label::after{content:normal}.datepicker.datepicker-dropdown{padding:.5rem;font-size:.875rem}.datepicker.datepicker table tr td.active.active{background-color:#007c88;background-image:none}.multiple-select fieldset{display:flex;flex-direction:row;align-items:center;width:100%}.multiple-select .form-group{flex-basis:0;flex-grow:1;max-width:100%;margin-bottom:.5rem}.multiple-select label{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.multiple-select .btn-delete{flex:0 0 auto;height:-moz-max-content;height:max-content;margin:.5rem 0 .5rem 1rem}.multiple-select .btn-delete--hidden{display:none}.multiple-select__row{display:flex;flex-wrap:wrap;align-items:center}.multiple-select__row .input{flex-grow:1}.radio-group__option input[type=radio]{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.radio-group__option label{display:flex;position:relative;padding-left:1.5rem}.radio-group__option label::before{content:"";display:inline-block;position:absolute;left:0;flex:0 0 1rem;width:1rem;height:1rem;margin-right:.5rem;transition:.2s all ease;border:1px solid #c6c6c6;background-color:#fff}.radio-group__option label:hover::before{border-color:#007c88}.radio-group__option label::before{top:.2rem;border-radius:50%}.radio-group__option input[type=radio]:focus+label::before{border-color:#007c88;box-shadow:inset 0 1px 1px rgba(0,0,0,.08),0 0 8px rgba(0,124,136,.6)}.radio-group__option input[type=radio]:checked+label::after{content:"";display:inline-block;position:absolute;top:.45rem;left:.25rem;width:.5rem;height:.5rem;border-radius:50%;background-color:#007c88}.radio-group__option input[disabled]+label{color:#c6c6c6}.radio-group__option input[disabled]+label:hover::before{border-color:#c6c6c6}.radio-group__option input[type=radio]:checked:disabled+label::after{background-color:#c6c6c6}.form-inline .radio-group{display:flex}.radio-group--buttons .radio-group__option{border:solid 1px #007c88;background-color:#fff;color:#007c88;border-right:0}.radio-group--buttons .radio-group__option:hover,.radio-group--buttons .radio-group__option:active,.radio-group--buttons .radio-group__option:focus,.radio-group--buttons .radio-group__option:active:focus{border-color:#504d6c;color:#504d6c}.radio-group--buttons .radio-group__option:last-child{border-right:solid 1px #007c88}.radio-group--buttons .radio-group__option .radio-group__label{margin-bottom:0;padding:.5rem 1rem}.radio-group--buttons .radio-group__option .radio-group__label::before,.radio-group--buttons .radio-group__option .radio-group__label::after{content:normal}.radio-group--buttons .radio-group__option input[type=radio]:checked+label{background-color:#007c88;color:#fff}.radio-group--buttons .radio-group__option input[type=radio]:checked+label::after{content:normal}.select{position:relative}.select .select__label{display:flex;padding-right:.5rem}.select label{margin-bottom:0;font-size:1rem;font-weight:600}.select .select__menu-item{padding:.5rem 1rem;transition:.2s all ease}.select .select__menu-item:focus,.select .select__menu-item:active,.select .select__menu-item.select__menu-item--active{color:#007c88}.select .select__menu-item:hover,.select .select__menu-item.select__menu-item--hover{font-weight:600;cursor:pointer}.select .form-text{margin-bottom:.5rem;font-size:.875rem}.select__toggle{width:100%;height:auto;padding:.5rem 1rem;transition:.2s all ease;color:#000;text-align:left;display:flex;align-items:center;justify-content:space-between;margin-top:.5rem;white-space:normal}.select__toggle::-moz-placeholder{color:#707070;font-style:italic}.select__toggle::placeholder{color:#707070;font-style:italic}.select__toggle:hover,.select__toggle:focus,.select__toggle:active,.select__toggle:active:focus,.select__toggle:active:hover{border:1px solid #007c88;box-shadow:none}.select__toggle::after{content:"";transform:rotate(90deg);border:0;color:#40374a;font-size:10px}.select__toggle span{padding-right:1rem;color:#000}.select__toggle .select__placeholder{color:#707070;font-style:italic}.select.invalid label{color:#e30036}.select.invalid .select__toggle{border-color:#e30036}.select.show .select__toggle::after{transform:rotate(-90deg)}.select__value{display:flex}.select__prefix{margin-right:1.25rem;margin-bottom:0;color:#007c88;text-transform:uppercase}.select__menu{width:100%;max-height:19em;overflow-x:hidden;overflow-y:scroll}.select--required label::after{content:"*"}.select__toggle[disabled]{border:solid 1px #c6c6c6;background-color:#f9f9f9;color:#c6c6c6;resize:none}.select__toggle[disabled]::-moz-placeholder{color:#c6c6c6}.select__toggle[disabled]::placeholder{color:#c6c6c6}.select__toggle[disabled]:hover,.select__toggle[disabled]:focus,.select__toggle[disabled]:active,.select__toggle[disabled]:active:focus,.select__toggle[disabled]:active:hover{border-color:#c6c6c6}.select__toggle[disabled] span,.select__toggle[disabled]::after{color:#c6c6c6}.select-reveal__instance{display:none}.tree{font-size:.875rem}.tree .jstree-default .jstree-icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAABgCAYAAABsS6soAAAACXBIWXMAAAsSAAALEgHS3X78AAAJNklEQVR4nO3d72tb1x3H8a9LnBIyMoVCoL1rLUNCCy6NszFKBy1yGKvIowZxwp45poU96IPY+wcs/wN1UtjDYudZ6eHi7MHGzRiz1z5Z6da4a8LStZCETC4LjDjN3HRJWMcRR56aRFeSde+5uve8X2BibEXfo6urj86PKx/Bzimlvs3y8PleH35L4vx7zPeDCMBfBCAAbxGAALxFAALwFgEIwFsEIABvEYAAvEUAAvDWLp565EEQRq+JyKkem3qmUaueS/JhKaX6qq+1LlT9oiIAMbAgjCYbtep6WkfSht9KH/+lEoTR8aRC0IZPX/WVUseTCqGs6xcZAZhDSqmK1nptGFoehNGSiJRFZCrFMs2ez4mxQNTYU7E31Nc25L1rDfPttIgkFQDN+pVKpfkVZ21trflVsPqFRQDm06pSajnrln/x4ivmn5Misumi3qul74l8/lnsbdShZ1sBWEq6/uMTL8jPLl+Pvc3vKpVWABWufifmDdmckyKyoLWuu6qbBBZB8ssEjzn5nJ3o7UzP78b4odZPMmmDrw5++L7sund3+9Hv3fyXPH3xQpZHw0x/mDfkeaXUBaXUZF6eGgIw/1Zdh2AQRvVWAMO9L5+dkOc++H0zBE34jX/8YfNnWdFab2qtZ0TkuJ0OMefkbB5ODQIw/yZdhmAQRib45h/x83LxDu1w2io9IVd++GIzBE34XX75p3J/dHfmbbWLLuNmKlJEFpVS5rwc6vOCOcAB7fRvkmmtRxJshgnBm0qpVNtgw2/pUb97/g+/vfKTPuon/PiREKXUzQSnNMzcoBmb7x/W54cAHMAQvYiX7RAkbYftu/tDLh49NpfmpTD4v9aw1/T8Ht+63ewJJtgLXEggAL8vIq0h8FCvRBOA+TentT7t4lE0atW5gh/LXGgf9t63w+Hyx39qrcoPZNBzya4Ir9grA8y5mfnVCnGYA8y3GVfhh+Fx8eix7/T2zJxgEuE3KKVU3V4Oc9VcFzrs4Sf0AHMrF++uSfvk6//I4QNPxt7r+Wsb6TWgcV0Wgqdjb2KvwStm/Q7sAtyqnYs+rbXOzUiBAMwhrfXQTiqn5KyZUH/786v93PuZBJvSrH/+XD+fRitU/W7K9it3H79jJQ65YFegp3tsaxp/DKGv+in8MYRM6w8jcwUGVxMA8BLbYgLAAAhAAN4iAAF4iwAE4C0CEIC3CEAA3iIAAXiLAATgLQJwQElcjDkI3+sDgyAAAXiLAATgLQIQgLcIQADeIgABeIsABOAtAhCAtwhAAN5iTxDkQhBGr4nIvN14J47ZMGo56S08fa9fVPQA0bcgjEpBGJVdHbkgjFp7zXZ78Yvd1Hs2CKNF6ruhlJpUSs26qpckeoDYCXOynwrCaErefcfFAWxuBvTqUwdk4dAzsm90tOMNP7j1b/nFR5+KbWNSvaDt+ieeCWTf7s4vm39s3ZG5v1wsWv1uTEAvKqWm7c5wfW3flyUCsADsjmGLjrfLND2Nlfu7d/dw04E1e5tvHByT63//LPa+Xp6YSLW+ev+j2BvqV35cxPrxNbU+rZQyobckIheUUgt52bCfIXAxLNlAcmXM1ilfOnqsOST2/Qlwqf7Cc3JiLNiuuG90VybB185uwzlu9ma3vcFVpZSzaZKdogeYY0qpekat3z6xt0pPmH9WzXC4Uatu5vyQ5kL9r5dl8UfPN5sabfxT3nnpiNQ/uZxI05VSlQHv4oxdiDlpe4NzWuvlRBqXAgIwp5RSS/YkGwaThKBbZp7PhODrB8fkl3/+VC7duj1wfbOYYZ7HBB+IGRmYxRgCcNj5/nf1+ql/6caXcuvAkw/+eNKe7DOJNw4PMcPeH+zd01z0mCjtSyQAtdbrIjIy6P3YkYm5ZGd92M8HAtDSWg/8xLuqr5Qq2XfqXi6LSLx+8PPXVzrMOZaDMJps1KrrSbULDzPh1xr2muBrDYffu9bI9GjZ83LFrgqbXp8Z/g71iIAAzCFzUimlppIOwV41atXjnhzqofTGwfJ2+IkdDpuFkSzZucMV24SZYZ73a8cqcE7Zd9apYZ5fSdpXd+9TX0Te+tsXDw15zcJIVtrmDs2lMEfyEn5CDzDfbAjOKKVkiBZE0vBHM6wyL/z64fiezltXN1rfJjn02q7f7XKT8xs3ili/F3N5ufavHQFYAFprE4JnC/wQTY/i1KVbt0vdLgRus0B9N+ziSS7nfTOd+Ad6ZT97PN9+DWIHpudztlGrnkvy4PpefxiZKxeyXrwEgEwkcekYiyAAvEUAAvAWAQjAWwQgAG8RgAC8RQAC8BYBCMBbBCAAbxGAALxFAALwFgEIwFsEIABvEYAAvEUAAvAWAQjAWwQgAG8RgAC8xZ4gORKE0ardc7Wb5o5x7M8LxCMA+xSE0azZpKZRqzrddSsIo4rdD2J/t9pBGC3a/SPYvxeIkVgA2hfoqZQ3zb5ptt+L2Qu3tT/p/hTbYMJlOgijKdchaPZdNTWDMDKPs9ThNqbX92sbgABiJNkDNMEwk/LBnrIBJ48IwVb4zaXcBqnsGZ1cu3NvNaMQFPs4OwXgXF63KARcSyQAgzAym3KvO5hzWu8Qgu3hl/qu9G+W9jRr2hCccT3X1qhVY3u4tjcOoIukeoDzNphceDAE112GX8sDIeh0wcHOQ3bqARZ+P1ggKQNfBhOEUd1uxHzV4bPSCsHFLMKvxYTgm6U9JohW7bycK53CT7r8DkCbgXqAQRiZF9u0iBzx9aDuHRmRvY+NlLb++23Z1dxbo1atx/2eITDQm74CMAijK+bSirbh3qzt/bleCGif81uPWRhJ1dqde/KrzTumhJkHdDb0tM9DucOvzUKUy944kFv99gDNi2vJzHnZodZ0o1Ydd/zgH7XgEbc6nAobfpv2DWHN3cNv9gBjjzk9QKA3fc0B2hf6GRFZsQsfC46Pc6fV3vY5wZNpN+I3W3db4TflOvwAJKfvRZBGrbpsh1iT9nuX4hY82kMw1YWA5a++4aNmQAHsaBGkUaumfcFzJ90+4bGe8qdAxIbvguNVbwAp4LPAfcow/I2yWXnvYdGJOUCgBwRgTpi5xiCMTPDdDMKoW6M3HXwsEcg9AjBHGrWqt9dbAmngD6IC8BYBCMBbBCAAbxGAALxFAALwFgEIwFsEIAA/icj/ABwNU62ic/TFAAAAAElFTkSuQmCC)}.tree .jstree-default .jstree-clicked{background-color:#007c88;color:#fff;text-decoration:none}.tree .list--buttons .list__item .btn{margin-bottom:0}.select-widget .form-text{margin-bottom:.5rem;font-size:.875rem;margin-top:0}.select-widget .form-text--error{margin-top:.5rem}.select-widget .form-control{width:100%;height:auto;padding:.5rem 1rem;transition:.2s all ease;color:#000;text-align:left;display:flex;position:relative;align-items:center;justify-content:space-between;margin-top:.25rem;padding-bottom:0;white-space:normal}.select-widget .form-control::-moz-placeholder{color:#707070;font-style:italic}.select-widget .form-control::placeholder{color:#707070;font-style:italic}.select-widget .form-control:hover,.select-widget .form-control:focus,.select-widget .form-control:active,.select-widget .form-control:active:focus,.select-widget .form-control:active:hover{border:1px solid #007c88;box-shadow:none}.select-widget .form-control::after{content:"";position:absolute;top:50%;right:1rem;transform:translateY(-50%) rotate(90deg);border:0;color:#40374a;font-size:10px}.select-widget .current{display:flex;flex-wrap:wrap;align-items:center}.select-widget .current li{margin-right:.5rem;margin-bottom:.5rem}.select-widget .current li[data-list-item]{display:flex;align-items:center;padding:0 .5rem;border-radius:7px;background-color:#c6c6c6;color:#000}.select-widget .current .widget-value__value{padding-right:.2rem}.select-widget .current .none-selected{display:none}.select-widget .current.empty .none-selected{display:inline-block}.select-widget .form-control-search{padding:0 .5rem;border:0;border-left:1px solid #c6c6c6;outline:0}.select-widget .form-control-search::-ms-clear{display:none;width:0;height:0}.select-widget .form-control-search::-ms-reveal{display:none;width:0;height:0}.select-widget .form-control-search::-webkit-search-decoration,.select-widget .form-control-search::-webkit-search-cancel-button,.select-widget .form-control-search::-webkit-search-results-button,.select-widget .form-control-search::-webkit-search-results-decoration{display:none}.select-widget .form-control-search::-moz-placeholder{color:#707070;font-style:italic}.select-widget .form-control-search::placeholder{color:#707070;font-style:italic}.select-widget .available{padding:.5rem 0;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;background-color:#fff}.select-widget .available .answer,.select-widget .available .has-noresults,.select-widget .available .spinner{padding:.5rem 1rem 0}.select-widget .available .answer label,.select-widget .available .has-noresults label,.select-widget .available .spinner label{margin:0}.select-widget .available .alert{margin-top:0;padding-bottom:.5rem}.select-widget .available .answer{display:flex;align-items:center;justify-content:space-between}.select-widget+.btn{margin-top:.5rem}.select-widget.invalid .form-control{border-color:#e30036}.select-widget--open .form-control::after{transform:translateY(-50%) rotate(-90deg)}.select-widget-value__delete{font-size:1rem}.select-widget-dropdown ul{margin:0;padding:0;list-style-type:none}.switch input[type=checkbox]{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.switch label{position:relative;margin-bottom:0;padding-left:3rem}.switch label::before{content:"";display:block;position:absolute;top:50%;left:0;width:2rem;height:1rem;transform:translateY(-50%);border-radius:1rem;background:#c6c6c6;cursor:pointer}.switch label::after{content:"";position:absolute;top:50%;left:.1rem;box-sizing:content-box;width:.5rem;height:.5rem;transform:translateY(-50%);transition:.2s all ease;border:3px solid rgba(0,0,0,0);border-radius:.8rem;background:#fff;cursor:pointer}.switch input+label:hover::after,.switch input:focus+label::after{left:0;width:calc(.5rem + 3px);height:calc(.5rem + 3px);border:3px solid rgba(0,124,136,.4)}.switch input:checked+label::before{background:#007c88}.switch input:checked+label::after{left:1.9rem;transform:translate(-100%, -50%)}.switch input:checked+label:hover::after,.switch input:checked:focus+label::after{left:2rem}.textarea{position:relative}.textarea .form-control{width:100%;height:auto;padding:.5rem 1rem;transition:.2s all ease;color:#000;text-align:left;margin-top:.5rem}.textarea .form-control::-moz-placeholder{color:#707070;font-style:italic}.textarea .form-control::placeholder{color:#707070;font-style:italic}.textarea .form-control:hover,.textarea .form-control:focus,.textarea .form-control:active,.textarea .form-control:active:focus,.textarea .form-control:active:hover{border:1px solid #007c88;box-shadow:none}.textarea .textarea__label{display:flex;padding-right:.5rem}.textarea label{margin-bottom:0;font-size:1rem;font-weight:600}.textarea .form-control[disabled]{border:solid 1px #c6c6c6;background-color:#f9f9f9;color:#c6c6c6;resize:none}.textarea .form-control[disabled]::-moz-placeholder{color:#c6c6c6}.textarea .form-control[disabled]::placeholder{color:#c6c6c6}.textarea .form-control[disabled]:hover,.textarea .form-control[disabled]:focus,.textarea .form-control[disabled]:active,.textarea .form-control[disabled]:active:focus,.textarea .form-control[disabled]:active:hover{border-color:#c6c6c6}.textarea.invalid label{color:#e30036}.textarea--monospace .form-control{font-family:monospace}.textarea--required label::after{content:"*"}.input-group .form-control{border-radius:5px}@media(min-width: 576px){.input-group .btn{border-radius:0 5px 5px 0;border-left:0;padding:0 20px}.input-group .form-control{border-radius:5px 0 0 5px}}.graph{margin-bottom:2rem}.graph__container{height:32rem}.link{transition:.2s all ease;border-bottom:1px solid rgba(0,0,0,0);cursor:pointer}.link:hover,.link:focus,.link:active,.link.link--active{border-bottom:1px solid #007c88;color:#007c88;text-decoration:none}.link--bold{font-weight:600}.link--plain{color:#40374a}.link--primary{display:inline-block;padding:.5rem .75rem;color:#504d6c;font-size:.875rem;font-weight:600}.link--primary span{border-bottom:2px solid rgba(0,0,0,0)}.link--primary:hover,.link--primary:focus,.link--primary:active{border-bottom-color:rgba(0,0,0,0);color:#504d6c}.link--primary:hover span,.link--primary:focus span,.link--primary:active span{border-bottom:2px solid #504d6c}.link--primary.link--active{border-bottom:0;border-radius:5px;background-color:#504d6c;color:#fff}.link--primary.link--active span{border-bottom:0}.link--next,.link--add,.link--table,.link--graph,.link--calendar,.link--timeline{display:inline-flex;position:relative;align-items:center;padding-left:1.75rem}.link--next::before,.link--add::before,.link--table::before,.link--graph::before,.link--calendar::before,.link--timeline::before{position:absolute;top:50%;left:0;padding-right:1rem;transform:translateY(-50%);font-size:1rem}.link--next.link--primary,.link--add.link--primary,.link--table.link--primary,.link--graph.link--primary,.link--calendar.link--primary,.link--timeline.link--primary{padding-left:3rem}.link--next.link--primary::before,.link--add.link--primary::before,.link--table.link--primary::before,.link--graph.link--primary::before,.link--calendar.link--primary::before,.link--timeline.link--primary::before{left:.75rem}.link--next::before,.link--add::before,.link--table::before,.link--graph::before,.link--calendar::before,.link--timeline::before{content:"";font-size:1rem}.link--table::before,.link--graph::before,.link--calendar::before,.link--timeline::before{font-size:1.5rem}.link--table::before{content:""}.link--graph::before{content:""}.link--timeline::before{content:""}.link--calendar::before{content:""}.link--add{color:#007c88}.link--add::before{content:""}.link--phone{display:inline-flex;position:relative;align-items:center;padding-left:1.75rem}.link--phone::before{position:absolute;top:50%;left:0;padding-right:1rem;transform:translateY(-50%);font-size:1rem}.link--phone.link--primary{padding-left:3rem}.link--phone.link--primary::before{left:.75rem}.link--phone::before{content:""}.link--email{display:inline-flex;position:relative;align-items:center;padding-left:1.75rem}.link--email::before{position:absolute;top:50%;left:0;padding-right:1rem;transform:translateY(-50%);font-size:1rem}.link--email.link--primary{padding-left:3rem}.link--email.link--primary::before{left:.75rem}.link--email::before{content:""}.link--alert{display:inline-flex;position:relative;align-items:center;padding-right:1.5rem}.link--alert::after{position:absolute;top:50%;right:0;transform:translateY(-50%);font-size:1rem}.link--alert::after{content:""}@media(min-width: 768px){.link--primary{font-size:1rem}}.list__title{font-size:1rem;font-weight:600;line-height:1.35;color:#40374a}.list__items{margin:0;padding-left:.5rem;list-style-type:none}.list__item{padding-bottom:.5rem}.list--horizontal .list__items{display:flex;gap:1rem;flex-wrap:wrap;align-items:center;padding:0}.list--horizontal .list__item{padding-right:1rem;padding-bottom:0;border-right:1px solid #c6c6c6}.list--horizontal .list__item:last-child{padding-right:0;border-right:none}.list--horizontal .list__item .link--active{border-bottom:none}.list--horizontal.list--no-borders{gap:1rem}.list--horizontal.list--no-borders .list__item{padding-right:0;border-right:none}.list--horizontal.list--no-borders .list__item:last-child{padding-right:0}.list--checkboxes .list__items{flex-direction:column;padding:0}@media(min-width: 768px){.list--checkboxes.list--horizontal .list__items{flex-direction:row}.list--checkboxes.list--horizontal .list__item{flex-basis:calc(33.33% - 1rem);flex-grow:0;flex-shrink:0;max-width:13rem}}@media(min-width: 1200px){.list--checkboxes.list--horizontal .list__item{flex-basis:calc(25% - 1rem)}}.list--key-value .list__items{width:100%;padding:0}.list--key-value .list__items:not(:last-child){margin-bottom:1rem}.list--key-value .list__item{display:flex;flex-wrap:wrap;width:100%}.list--key-value .list__item:last-child{padding-bottom:0}.list--key-value .list__item--blank{display:none}.list--key-value .list__key{flex:0 0 100%;padding-right:1rem;font-weight:600}@media(min-width: 768px){.list--key-value .list__key{flex:0 0 9.375rem;width:auto;padding-right:2rem}.card--topic .list--key-value .list__key{flex:0 0 14rem}.list--key-value .list__value{flex:1}}.list--buttons .list__items{flex-direction:column;width:100%}.list--buttons .list__item{border-right:0}.list--buttons .list__item .btn{margin-bottom:10px;padding-bottom:10px}.list--buttons .list__item .btn-small{padding-top:7px;padding-bottom:7px}@media(min-width: 576px){.list--buttons .list__items{flex-direction:row;align-items:center;width:auto}.list--buttons .list__item{border-right:1px solid #c6c6c6}}.list--tabs .list__items{display:flex;flex-wrap:wrap;margin:0;padding:0;border-bottom:2px solid #504d6c}.list--tabs .list__item{padding:.5rem .5rem;border-top:2px solid #c6c6c6;border-left:2px solid #c6c6c6}.list--tabs .list__item:first-of-type{border-top-left-radius:5px}.list--tabs .list__item:last-of-type{border-right:2px solid #c6c6c6;border-top-right-radius:5px}.list--tabs .list__item .link{display:block;border-bottom:2px solid rgba(0,0,0,0)}.list--tabs .list__item .link:hover,.list--tabs .list__item .link:active,.list--tabs .list__item .link:focus{border-bottom-color:#504d6c}.list--tabs .list__item--active{position:relative;border-right:2px solid #504d6c;border-top-left-radius:5px;border-top-right-radius:5px;border-color:#504d6c;background-color:#f9f9f9}.list--tabs .list__item--active:last-of-type{border-right-color:#504d6c}.list--tabs .list__item--active+.list__item{border-left:0}.list--tabs .list__item--active::before{content:"";display:block;position:absolute;z-index:-1;top:-2px;right:-3px;left:-3px;height:2px;background-color:#c6c6c6}.list--tabs .list__item--active:first-of-type::before{left:0}.list--tabs .list__item--active:last-of-type::before{right:0}.list--tabs .list__item--active::after{content:"";display:block;position:absolute;right:0;bottom:-2px;left:0;height:2px;background-color:#f9f9f9}.list--tabs .link{border-bottom:none;color:#504d6c;font-size:.875rem}.list--tabs h2{margin-bottom:0;color:#555;font-size:.875rem;font-weight:normal}@media(min-width: 768px){.list--tabs .list__item{padding:.5rem 1rem}.list--tabs .link,.list--tabs h2{font-size:1.125rem;font-weight:600}}@media(min-width: 768px){.modal .list--checkboxes .list__item{flex:0 0 50%}}@media(min-width: 1200px){.modal .list--checkboxes .list__item{flex-basis:calc(33.33% - 1rem)}}.login{display:flex;flex-direction:column;min-height:100vh;padding:2rem 2rem;background:linear-gradient(0deg, #F9F9F9 0%, #3FB5C1 0%, #504D6C 100%)}.login__main{display:flex;flex:1 1 auto;align-items:center;justify-content:center}.login__logo{margin-bottom:2rem;text-align:center}.login__logo img{width:130px;height:auto}.login__form{padding:2rem 2rem;background-color:#fff;box-shadow:0 0 7px rgba(0,0,0,.1)}.login__head{margin-bottom:2rem}.login__title{font-size:1.125rem;font-weight:600;line-height:1.35;margin-top:0;margin-bottom:2rem;color:#504d6c;text-align:center}.login__intro{text-align:center}.login__subtext{margin-top:1rem;color:#fff;text-align:center}.login__subtext a{font-size:1.125rem;font-weight:600;line-height:1.35;color:#fff;text-decoration:underline}.login__subtext a:hover{color:#fff;text-decoration:none}.login__footer-container{font-size:1rem;font-style:italic;font-weight:400;line-height:1.38;display:flex;align-items:center;justify-content:flex-end;margin-top:1.5rem;color:#fff}.login__footer-logo{width:83px;height:auto;margin-left:1rem}@media(min-width: 576px){.login__btns{display:flex;justify-content:space-between}.login__btns .btn:only-child{flex:1 1 100%}.login__fields+.login__btns{margin-top:2rem}.login__fields .btn:only-child{width:100%}}@media(min-width: 992px){.login__logo{margin-bottom:4rem}.login__fields+.login__btns{margin-top:3rem}}.modal-open .modal{z-index:1080}.modal-content{border:none;border-radius:0;box-shadow:0 0 7px rgba(0,0,0,.2)}.modal-body{padding-top:0}.modal-header{padding-bottom:1rem;border-bottom:0}.modal-header .close{margin-bottom:-1rem;padding-bottom:1rem;line-height:1rem}.modal-header .close::before{content:"";font-size:1rem}.modal--wizzard .modal-header{padding-top:1.5rem;padding-bottom:1.5rem;border-radius:0;background-color:#504d6c;color:#fff}.modal--wizzard .modal-header .close{color:rgba(0,0,0,0)}.modal--wizzard .modal-body{padding:2rem 1.5rem}.modal--wizzard .modal-header__content{display:flex;align-items:center;justify-content:space-between;width:100%}.modal--wizzard .modal__steps{margin:0;list-style:none;counter-reset:step-counter}.modal--wizzard .modal__step{display:inline-block;counter-increment:step-counter}.modal--wizzard .modal__step::before{content:counter(step-counter);display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border:1px solid #fff;border-radius:1.25rem;color:#fff;text-align:center}.modal--wizzard .modal__step span{display:none}.modal--wizzard .modal__step--active::before{background-color:#fff;color:#504d6c}.modal--wizzard .modal-title{color:#fff}@media(min-width: 992px){.modal--wizzard .modal__step:not(:last-child){margin-right:1rem}.modal--wizzard .modal__step--active::before{margin-right:.5rem}.modal--wizzard .modal__step--active span{display:inline}}.modal-footer{display:block}.modal-footer>*{margin:0}.modal-footer .btn{width:100%}.modal-footer_sticky{position:sticky;z-index:999;bottom:1rem}.modal-footer__left{margin-bottom:1rem}.modal-footer__right .btn:not(:last-child){margin-bottom:1rem}@media(min-width: 992px){.modal-footer{display:flex;justify-content:space-between}.modal-footer .btn{width:auto}.modal-footer__left,.modal-footer__right .btn:not(:last-child){margin-bottom:0}.modal-footer__left{margin-bottom:0}.modal-footer__right .btn:first-child:not(:only-child){margin-right:1rem}}.trigger{white-space:nowrap}.expandable{display:none}.expandable.expanded{display:block}.expandable.expanded.card{box-shadow:0 0 7px rgba(0,0,0,.2)}.expandable.expanded.popover{max-width:none}.more-less{position:relative}.more-less .table-curcommon .link{display:table-row}.more-less .table-curcommon tr td{padding:.5rem;border-top:1px solid #c6c6c6}.more-less .table-curcommon tr:first-of-type td{border-top:none;padding-top:0}.more-less .table-curcommon tr:last-of-type td{padding-bottom:0}.more-less .table-curcommon tr td:first-child{padding-left:0}.more-less .table-curcommon tr td:last-child{padding-right:0}.more-less .table-curcommon tr:hover{background-color:rgba(0,0,0,0)}.page-header{position:relative}.page-header_container{display:flex;justify-content:flex-end;width:100%;padding:1rem 0}.page-header_container::before{content:"";position:absolute;top:0;right:-1.25rem;bottom:0;left:0;background-color:#fff}@media(min-width: 992px){.page-header_container::before{right:-2rem}}.popover-container{position:initial}.popover-container:not(.popover-container--text) .popover__btn{position:relative;width:1rem;margin-left:.5rem;padding:0;border:0;background-color:rgba(0,0,0,0)}.popover-container:not(.popover-container--text) .popover__btn::before{content:"";transition:font-size .3s ease-in-out;color:#007c88;font-size:.938rem}.popover-container:not(.popover-container--text) .popover__btn:hover::before{font-size:1rem}.popover-container:not(.popover-container--text) .popover__btn:focus::before{border-radius:50%;box-shadow:0 0 0 .2rem rgba(0,124,136,.2)}.popover-container .popover__btn .arrow{display:none;position:absolute;z-index:101;bottom:-1px;left:0;width:1rem;height:.5rem;transform:translateY(100%)}.popover-container .popover__btn .arrow::before,.popover-container .popover__btn .arrow::after{content:"";display:block;position:absolute;border-width:0 .5rem .5rem .5rem;border-style:solid;border-color:rgba(0,0,0,0)}.popover-container .popover__btn .arrow::before{border-bottom-color:#007c88}.popover-container .popover__btn .arrow::after{top:1px;border-bottom-color:#fff}.popover-container .popover__btn .arrow.show{display:block}.popover-container .popover{display:none;z-index:1;top:1.5rem;max-width:100%;margin-top:.375rem;overflow-y:auto;border-color:#007c88;max-height:15rem}.popover-container .popover.show{display:block;z-index:100}.popover-container .popover-body{padding:1rem;overflow-y:auto;font-size:1rem}.popover-container--top .popover{top:-0.9rem;transform:translateY(-100%)}.popover-container--top .popover__btn .arrow{top:-1px;bottom:auto;transform:translateY(-100%) rotate(180deg)}.popover-container--large .popover-body{max-height:20rem}.popover-container--text .popover__btn{position:relative}.popover-container--text .popover__btn .arrow{left:50%;transform:translate(-50%, 100%)}.popover-container--text .popover{margin-top:1.125rem}span.rag span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}span.rag::before{margin-right:.5rem;padding:.313rem;border-radius:.125rem;color:#fff;font-size:1.25rem}.rag--danger::before{content:"";background-color:#e30036}.rag--warning::before{content:"";background-color:#f99d27}.rag--advisory::before{content:"";background-color:#ffc107}.rag--success::before{content:"";background-color:#18856b}.rag--undefined::before{content:"";background-color:#c6c6c6}.rag--unexpected::before{content:"";background-color:#504d6c}.rag--complete::before{content:"";background-color:#3b3af2}.rag--attention::before{content:"";background-color:#e30036}.rag--blank::before{content:"_";padding:0 .4375rem;background-color:rgba(0,0,0,0);color:#555;font-size:2rem;line-height:.95}.rag-legend__list{display:flex;flex-wrap:wrap;align-items:center;margin-bottom:0;row-gap:.5rem}.rag-legend__title{display:block;margin-bottom:.5rem;font-weight:600}.rag-legend__meaning{flex-basis:calc(100% - 2.6rem);flex-grow:0;flex-shrink:0;margin-bottom:0}.rag-legend--horizontal{margin-bottom:1rem;font-size:.875rem}.rag-legend--horizontal .rag-legend__list{display:grid;grid-template-columns:2.5rem auto 2.5rem auto}.rag-legend--horizontal .rag-legend__meaning{margin-right:1rem}.rag-legend--horizontal .rag-legend__item:nth-of-type(odd){grid-column:1}.rag-legend--horizontal .rag-legend__meaning:nth-of-type(odd){grid-column:2}.rag-legend--horizontal .rag-legend__item:nth-of-type(even){grid-column:3}.rag-legend--horizontal .rag-legend__meaning:nth-of-type(even){grid-column:4}@media(min-width: 768px){.rag-legend--horizontal{margin-bottom:1rem}.rag-legend--horizontal .rag-legend__title{margin-right:.5rem}.rag-legend--horizontal .rag-legend__list{display:flex}.rag-legend--horizontal .rag-legend__meaning{flex-basis:auto;margin-right:1rem;margin-bottom:0}}.readonly{margin-bottom:2rem}.readonly--center{text-align:center}.readonly__value{display:block;margin-top:.5rem;padding:.5rem;background-color:#f9f9f9}.sidebar{min-height:35rem;padding:50px 0 80px;color:#fff;transition:all .2s ease}.sidebar::before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(0deg, #F9F9F9 0%, #3FB5C1 0%, #504D6C 100%)}@supports(position: sticky){.sidebar{height:100vh}}.sidebar:not(.sidebar--collapsed){flex:1 1 auto}.sidebar__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:50px;padding-right:2rem}.sidebar__logo,.sidebar__menu{position:relative}.sidebar__logo{flex:0 1 150px;padding-left:15px}.sidebar__logo img{width:100%;height:auto}.sidebar__toggle{border:none;background-color:rgba(0,0,0,0);box-shadow:none;position:relative;padding:9px 15px}.sidebar__toggle:hover,.sidebar__toggle:focus,.sidebar__toggle:active,.sidebar__toggle:active:focus,.sidebar__toggle:active:hover{border:none;outline:0;background-color:rgba(0,0,0,0);box-shadow:none}.sidebar__toggle::before{content:"";transform:rotate(180deg);transition:transform .2s ease;color:#fff;font-size:1.25rem}.sidebar__toggle:hover::before,.sidebar__toggle:active::before,.sidebar__toggle:focus::before,.sidebar__toggle:active:focus::before{transform:rotate(180deg) scale(1.25)}.sidebar__toggle span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.sidebar__menu{display:flex;flex:1 1 auto;flex-direction:column;justify-content:space-between}.sidebar__nav{font-size:1rem}.sidebar__nav .nav__item{padding:10px 0}.nav__link::before{width:32px;text-align:center}.nav__link span{padding-left:.5rem}.nav__link--dashboard::before{content:"";font-size:25px}.nav__link--tables::before{content:"";font-size:27px}.nav__link--users::before{content:"";font-size:30px}.nav__link--groups::before{content:"";font-size:30px}.nav__link--files::before{content:"";font-size:28px}.nav__link--admin-settings::before{content:"";font-size:28px}.nav__link--shortcut::before{content:"";font-size:21px}.sidebar__nav .nav__link,.sidebar__shortcuts .nav__link{display:flex;align-items:center;padding:10px 15px;transition:.2s all ease;color:#fff}.sidebar__nav .nav__link:hover,.sidebar__nav .nav__link:active,.sidebar__nav .nav__link:focus,.sidebar__nav .nav__link:active:focus,.sidebar__nav .nav__link.nav__link--active,.sidebar__shortcuts .nav__link:hover,.sidebar__shortcuts .nav__link:active,.sidebar__shortcuts .nav__link:focus,.sidebar__shortcuts .nav__link:active:focus,.sidebar__shortcuts .nav__link.nav__link--active{outline:0;background-color:rgba(255,255,255,.4);text-decoration:none}.sidebar__bottom{display:flex;position:absolute;bottom:2rem;justify-content:center;width:100%}.sidebar__bottom .sidebar__logo{display:none;flex:0 0 32px;padding-left:0}.sidebar__shortcuts h1{font-size:1.125rem;font-weight:600;line-height:1.33;padding-left:1rem}.sidebar--collapsible.sidebar--collapsed{flex:0 0 3.875rem;padding:50px 0 2rem}.sidebar--collapsible.sidebar--collapsed .sidebar__header{justify-content:center;padding-right:0}.sidebar--collapsible.sidebar--collapsed .sidebar__header .sidebar__logo{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.sidebar--collapsible.sidebar--collapsed .sidebar__shortcuts,.sidebar--collapsible.sidebar--collapsed .nav__link span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.sidebar--collapsible.sidebar--collapsed .sidebar__toggle::before{transform:rotate(0)}.sidebar--collapsible.sidebar--collapsed .sidebar__toggle:hover::before,.sidebar--collapsible.sidebar--collapsed .sidebar__toggle:active::before,.sidebar--collapsible.sidebar--collapsed .sidebar__toggle:focus::before,.sidebar--collapsible.sidebar--collapsed .sidebar__toggle:active:focus::before{transform:rotate(0) scale(1.3)}.sidebar--collapsible.sidebar--collapsed .sidebar__bottom .sidebar__logo{display:block}@media(min-width: 992px){.sidebar--collapsible.sidebar--collapsed{margin-left:-2rem}}.sidebar--collapsible+.main--expanded{flex:1;min-width:0}@media(min-width: 992px){.sidebar::before{left:-2.5rem}.sidebar .sidebar__toggle{display:block}.sidebar--collapsible+.main--expanded{max-width:none}}@media(min-width: 1200px){.sidebar__nav{font-size:1.125rem;font-weight:600;line-height:1.33}.nav__link span{padding-left:1rem}}.skip-links{position:absolute;z-index:1030;top:0;left:0;margin:0 0 0 2rem;padding:0;list-style-type:none}.skip-links a{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0;display:block;padding:1rem;border:1px solid #007c88;outline:0;background-color:#fff}.skip-links a:focus{position:static;width:auto;height:auto;margin:0;overflow:auto;clip:auto}.sortable .btn-default{margin-top:.5rem}.sortable .btn-icon-close{margin-left:.75rem}.sortable .btn-icon-close .btn__title{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.sortable__list{margin:0;padding:0}.sortable__handle{width:auto;padding:0;border:0;border-radius:0}.sortable__handle::before{content:"";margin-right:.75rem;cursor:grab}.sortable__handle span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.sortable .btn-icon-close--hidden,.sortable__handle--hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.sortable label{margin-bottom:0;font-size:1rem;font-weight:600}.sortable__row{display:flex;align-items:center}.sortable__row .input{width:100%}.sortable__row--hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.note-frame.card{padding:0}.note-btn-group .note-btn{margin-right:0;margin-bottom:0}.note-modal .modal-header .modal-title{color:#40374a}.note-modal .modal-header .close::before{content:normal}.note-modal .modal-body .form-check{margin-bottom:1rem;padding-left:1.5rem}.note-modal .modal-body .form-check-input{margin-left:-1.5rem}.note-modal .modal-body .form-check-input::before{content:"";display:inline-block;position:absolute;left:0;flex:0 0 1rem;width:1rem;height:1rem;margin-right:.5rem;transition:.2s all ease;border:1px solid #c6c6c6;background-color:#fff}.note-modal .modal-body .form-check-input:hover::before{border-color:#007c88}.note-modal .modal-body .form-check-input::before{top:.125rem;border-radius:5px}.note-modal .modal-body .form-check-input::before{top:50%;left:-1px;transform:translateY(-50%)}.note-modal .modal-body .form-check-input:focus{outline:0}.note-modal .modal-body .form-check-input:focus::before{border-color:#007c88;box-shadow:inset 0 1px 1px rgba(0,0,0,.08),0 0 8px rgba(0,124,136,.6)}.note-modal .modal-body .form-check-input:checked::before{border-color:#007c88;background-color:#007c88}.note-modal .modal-body .form-check-input:checked::after{content:"";position:absolute;top:.625rem;left:4px;transform:translateY(-50%);color:#fff;font-size:7px}.note-modal .modal-body .form-check-input:checked::after{top:.4rem}.note-btn-primary{border:1px solid rgba(0,0,0,0);background-color:#007c88;color:#fff}.note-btn-primary:hover,.note-btn-primary:active,.note-btn-primary:focus,.note-btn-primary:active:focus{border:1px solid rgba(0,0,0,0);background-color:#504d6c;color:#fff}.note-btn-primary:disabled{border-color:rgba(0,0,0,0);background-color:#c6c6c6;color:#fff}.table-header{position:relative;margin-bottom:2px}.table-header::after{content:"";position:absolute;right:0;bottom:-2px;left:0;height:2px;margin-right:-1.25rem;background:#504d6c}.table-header-container{position:relative;width:100%;padding:1rem 0 0 1.25rem}.table-header-container::before{content:"";position:absolute;top:0;right:-1.25rem;bottom:0;left:0;background-color:#fff}.table-header-top{position:relative;flex-direction:row;flex-wrap:nowrap;gap:1rem;padding-bottom:1.5rem}.table-header-bottom{position:relative}.table-header-bottom .list--tabs{position:relative;z-index:1;margin-bottom:-2px}.table-header__title{margin:1rem 1rem 0 0;color:#555}@media(min-width: 992px){.table-header::after{margin-right:-2rem}.table-header-container{padding:1rem 0 0 2rem}.table-header-container::before{right:-2rem}}#loading{display:flex;justify-content:center;align-items:center;border:1px solid #007c88;border-radius:.25rem;width:50%;margin:auto}.timeline__legend{display:flex;flex-wrap:wrap;margin-bottom:1rem}.timeline__color{display:flex;align-items:center;margin-right:1rem;padding:.25rem 0}.timeline__color-key{width:1rem;height:1rem}.timeline__color-text{margin-left:.5rem}.timeline__container{position:relative}.timeline__overlay{display:none;position:absolute;z-index:1050;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.3);color:#000;text-align:center}.timeline__loader{position:absolute;right:0;bottom:50%;left:0;width:50px;height:50px;margin:auto;animation:spin 2s linear infinite;border:5px solid #c6c6c6;border-top:5px solid #555;border-radius:50%}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.user{display:flex;position:relative;align-items:center;gap:1rem;margin:0;padding:0;list-style-type:none}.user__item:not(:last-child){padding-right:1rem;border-right:1px solid #c6c6c6}.user__link::before{color:#504d6c;font-size:1.25rem}.user__link span{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);border:0}.user__link--details::before{content:"";font-size:24px}.user__link--logout::before{content:""}div.form-group div.js-markdown-preview{height:8rem;overflow:auto}.drop-zone{border:2px dashed #c6c6c6;border-radius:5px;padding:25px;text-align:center;font-size:20px;cursor:pointer;transition:all .3s ease;color:#c6c6c6}.drop-zone.dragging{border-color:#007c88;color:#504d6c}.upload__error{color:#7f0000;font-size:14px;margin-top:5px;padding:5px;background-color:#ff6155;border:1px dashed #7f0000;border-radius:5px}.tt-menu{border:1px solid #c6c6c6;border-radius:5px;position:absolute;left:0;z-index:1000;width:100%;min-width:160px;margin:2px 0 0;list-style:none;text-align:left;background-color:#fff;background-clip:padding-box;max-height:15em;overflow-y:auto}.tt-menu .tt-suggestion,.tt-menu .tt-dataset div{background-color:#fff;margin:2px;color:#40374a;border-bottom:1px solid #c6c6c6;padding:.5rem 1rem;font-weight:normal;cursor:pointer}.tt-menu .tt-suggestion:last-child{border-bottom:none}.tt-menu .tt-suggestion:hover{background-color:#f9f9f9}.purge--header{padding:2rem 0 1rem}.purge--content{padding:2rem 0;border-top:solid 2px #40374a} diff --git a/public/js/filter.7b61c6ba25c1b1510409.js b/public/js/filter.3f99116a0ed43159859a.js similarity index 68% rename from public/js/filter.7b61c6ba25c1b1510409.js rename to public/js/filter.3f99116a0ed43159859a.js index 4550b11d7..6a1c17cce 100644 --- a/public/js/filter.7b61c6ba25c1b1510409.js +++ b/public/js/filter.3f99116a0ed43159859a.js @@ -1 +1 @@ -"use strict";(self.webpackChunklinkspace=self.webpackChunklinkspace||[]).push([[181,202],{34789:(e,t,a)=>{a.r(t),a.d(t,{default:()=>l});const r=e=>{const t=[];let a=0;return e.records.forEach((e=>{e instanceof Object?t.push({name:e.label,id:e.id}):t.push({name:e,id:a++})})),t};class TypeaheadSourceOptions{constructor(e,t,a,r,i,s,n="GET"){this.name=e,this.ajaxSource=t,this.mapper=a,this.appendQuery=r,this.data=i,this.dataBuilder=s,this.method=n}}a(67751);var i=a(6016),s=a.n(i),n=a(74692);class Typeahead{constructor(e,t,a){this.$input=e,this.callback=t,this.sourceOptions=a,this.init()}init(){const{data:e,appendQuery:t,mapper:a,name:r,ajaxSource:i,method:l}=this.sourceOptions,o=new(s())({datumTokenizer:s().tokenizers.whitespace,queryTokenizer:s().tokenizers.whitespace,remote:{url:i+(t?"%QUERY":""),wildcard:"%QUERY",transform:e=>a(e),rateLimitBy:"debounce",rateLimitWait:300,cache:!1,transport:(t,a,r)=>{t.type=l,t.data=e||(this.sourceOptions.dataBuilder?this.sourceOptions.dataBuilder():void 0),n.ajax(t).done(a).fail(((e,t,a)=>{console.error("Typeahead ajax request failed:",t,a,e.responseText),r(a)}))}}});this.$input.typeahead({hint:!1,highlight:!1,minLength:1},{name:r,source:o,display:"name",limit:20,templates:{suggestion:e=>`
      ${e.name}
      `,pending:()=>"
      Loading...
      ",notFound:()=>"
      No results found
      "}}),this.$input.on("typeahead:select",((e,t)=>{this.callback(t)})),window.test&&(this.$input.on("typeahead:asyncrequest",(()=>{console.log("Typeahead async request")})),this.$input.on("typeahead:asyncreceive",(()=>{console.log("Typeahead async receive")})),this.$input.on("typeahead:asynccancel",(()=>{console.log("Typeahead async cancel")})))}}const l=class TypeaheadBuilder{constructor(){this.mapper=e=>e.map((e=>({name:e.name,id:e.id}))),this.method="GET",this.appendQuery=!1,this.data=void 0}withMethod(e="GET"){if("GET"!==e&&"POST"!==e)throw new Error("Method must be either 'GET' or 'POST'");return this.method=e,this}withInput(e){return this.$input=e,this}withCallback(e){return this.callback=e,this}withName(e){return this.name=e,this}withAjaxSource(e){return this.ajaxSource=e,this}withAppendQuery(e=!0){return this.appendQuery=e,this}withData(e){return this.dataBuilder=void 0,this.data=e,this}withMapper(e){return this.mapper=e,this}withDefaultMapper(){return this.mapper=r,this}withDataBuilder(e){return this.data=void 0,this.dataBuilder=e,this}build(){if(!this.$input)throw new Error("Input not set");if(!this.callback)throw new Error("Callback not set");if(!this.name)throw new Error("Name not set");if(!this.ajaxSource)throw new Error("Ajax source not set");const e=new TypeaheadSourceOptions(this.name,this.ajaxSource,this.mapper,this.appendQuery,this.data,this.dataBuilder,this.method);return new Typeahead(this.$input,this.callback,e)}}},96059:(e,t,a)=>{a.d(t,{T:()=>i});var r=a(74692);const i=e=>{const t=[],a=[];e.on("afterCreateRuleFilters.queryBuilder",((e,a)=>{const i=r(a.$el.find(`select[name=${a.id}_filter]`));t.includes(i[0])||t.push(i[0]),i&&i[0]?(i.data("live-search","true"),i.selectpicker()):console.error("No select found")})),e.on("afterCreateRuleOperators.queryBuilder",((e,t,i)=>{const s=r(t.$el.find(`select[name=${t.id}_operator]`));s&&s[0]?(a.includes(s[0])||a.push(s[0]),s.data("live-search")||(s.data("live-search","true"),s.selectpicker())):console.error("No operator select found")})),e.on("afterSetRules.queryBuilder",(()=>{for(const e of t)e&&r(e).selectpicker("refresh");for(const e of a)e&&r(e).selectpicker("refresh")})),e.on("afterSetRuleOperator.queryBuilder",(()=>{for(const e of a)e&&r(e).selectpicker("refresh")}))}},63768:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});var r=a(17527),i=(a(63035),a(14536),a(11977)),s=a(34789),n=a(96059),l=a(74692);class FilterComponent extends r.uA{constructor(e){super(e),this.el=l(this.element),this.operators=[{type:"equal",accept_values:!0,apply_to:["string","number","datetime"]},{type:"not_equal",accept_values:!0,apply_to:["string","number","datetime"]},{type:"less",accept_values:!0,apply_to:["string","number","datetime"]},{type:"less_or_equal",accept_values:!0,apply_to:["string","number","datetime"]},{type:"greater",accept_values:!0,apply_to:["string","number","datetime"]},{type:"greater_or_equal",accept_values:!0,apply_to:["string","number","datetime"]},{type:"contains",accept_values:!0,apply_to:["datetime","string"]},{type:"not_contains",accept_values:!0,apply_to:["datetime","string"]},{type:"begins_with",accept_values:!0,apply_to:["string"]},{type:"not_begins_with",accept_values:!0,apply_to:["string"]},{type:"is_empty",accept_values:!1,apply_to:["string","number","datetime"]},{type:"is_not_empty",accept_values:!1,apply_to:["string","number","datetime"]},{type:"changed_after",nb_inputs:1,accept_values:!0,multiple:!1,apply_to:["string","number","datetime"]}],this.ragProperties={input:"select",values:{b_red:"Red",c_amber:"Amber",c_yellow:"Yellow",d_green:"Green",a_grey:"Grey",e_purple:"Purple",d_blue:"Blue",b_attention:"Red (Attention)"}},this.initFilter()}initFilter(){const e=this,t=this.el,a=l(this.el).data("builder-id"),r=l(`#builder_json_${a}`);if(!r.length)return;const o=JSON.parse(r.html()),u=t.data("filter-base");if(o.filters.length&&(o.filterNotDone&&this.makeUpdateFilter(),(0,n.T)(this.el),t.queryBuilder({showPreviousValues:o.showPreviousValues,filters:o.filters.map((e=>this.buildFilter(o,e))),allow_empty:!0,operators:this.operators,lang:{operators:{changed_after:"changed on or after"}}}),t.on("validationError.queryBuilder",(function(e,t,a,r){i.m.log(a),i.m.log(r),i.m.log(e),i.m.log(t)})),t.on("afterCreateRuleInput.queryBuilder",(function(t,a){let r;if(o.filters.forEach((function(e){if(e.filterId===a.filter.id)return r=e,!1})),!r||"rag"===r.type||!r.hasFilterTypeahead)return;const i=l(`#${a.id} .rule-value-container input[type='text']`),n=l(`#${a.id} .rule-value-container input[type='hidden']`);i.attr("autocomplete","off"),i.on("keyup",(()=>{n.val(i.val())}));(new s.default).withInput(i).withAjaxSource(e.getURL(o.layoutId,r.urlSuffix)).withMethod("POST").withDataBuilder((()=>({q:i.val(),oi:r.instanceId,csrf_token:l("body").data("csrf")}))).withDefaultMapper().withName("rule").withAppendQuery().withCallback((e=>{r.useIdInFilter?n.val(e.id):n.val(e.name)})).build()})),u)){const e=atob(u,"base64");try{const a=JSON.parse(e);a.rules&&a.rules.length?t.queryBuilder("setRules",a):t.queryBuilder("setRules",{rules:[]})}catch(e){i.m.log("Incorrect data object passed to queryBuilder")}}}getURL(e,t){const a=window.siteConfig&&window.siteConfig.urls.filterApi;return a||`/${e}/match/layout/${t}?q=`}makeUpdateFilter(){window.UpdateFilter=(e,t)=>{e.queryBuilder("validate")||t.preventDefault();const a=e.queryBuilder("getRules");l("#filter").val(JSON.stringify(a,null,2))}}buildFilter=(e,t)=>({id:t.filterId,label:t.label,type:"string",operators:this.buildFilterOperators(t.type),..."rag"===t.type?this.ragProperties:t.hasFilterTypeahead?this.typeaheadProperties:{}});buildFilterOperators(e){if(!["date","daterange"].includes(e))return;const t=["equal","not_equal","less","less_or_equal","greater","greater_or_equal","is_empty","is_not_empty"];return"daterange"===e&&t.push("contain"),t}get typeaheadProperties(){return{input:(e,t)=>`
      \n \n \n
      `,valueSetter:(e,t)=>{e.$el.find(".typeahead_hidden").val(t);const a=e.$el.find(".typeahead_text");a.typeahead("val",e.data.text),a.val(e.data.text)},validation:{callback:()=>!0}}}getRecords=(e,t,a,r)=>l.ajax({type:"POST",url:this.getURL(e,t),data:{q:r,oi:a},dataType:"json",path:"records"})}const o=FilterComponent}}]); \ No newline at end of file +"use strict";(self.webpackChunklinkspace=self.webpackChunklinkspace||[]).push([[181,202],{34789:(e,t,a)=>{a.r(t),a.d(t,{default:()=>l});const r=e=>{const t=[];let a=0;return e.records.forEach((e=>{e instanceof Object?t.push({name:e.label,id:e.id}):t.push({name:e,id:a++})})),t};class TypeaheadSourceOptions{constructor(e,t,a,r,i,s,n="GET"){this.name=e,this.ajaxSource=t,this.mapper=a,this.appendQuery=r,this.data=i,this.dataBuilder=s,this.method=n}}a(67751);var i=a(6016),s=a.n(i),n=a(74692);class Typeahead{constructor(e,t,a){this.$input=e,this.callback=t,this.sourceOptions=a,this.init()}init(){const{data:e,appendQuery:t,mapper:a,name:r,ajaxSource:i,method:l}=this.sourceOptions,o=new(s())({datumTokenizer:s().tokenizers.whitespace,queryTokenizer:s().tokenizers.whitespace,remote:{url:i+(t?"%QUERY":""),wildcard:"%QUERY",transform:e=>a(e),rateLimitBy:"debounce",rateLimitWait:300,cache:!1,transport:(t,a,r)=>{t.type=l,t.data=e||(this.sourceOptions.dataBuilder?this.sourceOptions.dataBuilder():void 0),n.ajax(t).done(a).fail(((e,t,a)=>{console.error("Typeahead ajax request failed:",t,a,e.responseText),r(a)}))}}});this.$input.typeahead({hint:!1,highlight:!1,minLength:1},{name:r,source:o,display:"name",limit:20,templates:{suggestion:e=>`
      ${e.name}
      `,pending:()=>"
      Loading...
      ",notFound:()=>"
      No results found
      "}}),this.$input.on("typeahead:select",((e,t)=>{this.callback(t)})),window.test&&(this.$input.on("typeahead:asyncrequest",(()=>{console.log("Typeahead async request")})),this.$input.on("typeahead:asyncreceive",(()=>{console.log("Typeahead async receive")})),this.$input.on("typeahead:asynccancel",(()=>{console.log("Typeahead async cancel")})))}}const l=class TypeaheadBuilder{constructor(){this.mapper=e=>e.map((e=>({name:e.name,id:e.id}))),this.method="GET",this.appendQuery=!1,this.data=void 0}withMethod(e="GET"){if("GET"!==e&&"POST"!==e)throw new Error("Method must be either 'GET' or 'POST'");return this.method=e,this}withInput(e){return this.$input=e,this}withCallback(e){return this.callback=e,this}withName(e){return this.name=e,this}withAjaxSource(e){return this.ajaxSource=e,this}withAppendQuery(e=!0){return this.appendQuery=e,this}withData(e){return this.dataBuilder=void 0,this.data=e,this}withMapper(e){return this.mapper=e,this}withDefaultMapper(){return this.mapper=r,this}withDataBuilder(e){return this.data=void 0,this.dataBuilder=e,this}build(){if(!this.$input)throw new Error("Input not set");if(!this.callback)throw new Error("Callback not set");if(!this.name)throw new Error("Name not set");if(!this.ajaxSource)throw new Error("Ajax source not set");const e=new TypeaheadSourceOptions(this.name,this.ajaxSource,this.mapper,this.appendQuery,this.data,this.dataBuilder,this.method);return new Typeahead(this.$input,this.callback,e)}}},96059:(e,t,a)=>{a.d(t,{T:()=>i});var r=a(74692);const i=e=>{const t=[],a=[];e.on("afterCreateRuleFilters.queryBuilder",((e,a)=>{const i=r(a.$el.find(`select[name=${a.id}_filter]`));t.includes(i[0])||t.push(i[0]),i&&i[0]?(i.data("live-search","true"),i.selectpicker()):console.error("No select found")})),e.on("afterCreateRuleOperators.queryBuilder",((e,t,i)=>{const s=r(t.$el.find(`select[name=${t.id}_operator]`));s&&s[0]?(a.includes(s[0])||a.push(s[0]),s.data("live-search")||(s.data("live-search","true"),s.selectpicker())):console.error("No operator select found")})),e.on("afterSetRules.queryBuilder",(()=>{for(const e of t)e&&r(e).selectpicker("refresh");for(const e of a)e&&r(e).selectpicker("refresh")})),e.on("afterSetRuleOperator.queryBuilder",(()=>{for(const e of a)e&&r(e).selectpicker("refresh")}))}},63768:(e,t,a)=>{a.r(t),a.d(t,{default:()=>o});var r=a(17527),i=(a(63035),a(14536),a(11977)),s=a(34789),n=a(96059),l=a(74692);class FilterComponent extends r.uA{constructor(e){super(e),this.el=l(this.element),this.operators=[{type:"equal",accept_values:!0,apply_to:["string","number","datetime"]},{type:"not_equal",accept_values:!0,apply_to:["string","number","datetime"]},{type:"less",accept_values:!0,apply_to:["string","number","datetime"]},{type:"less_or_equal",accept_values:!0,apply_to:["string","number","datetime"]},{type:"greater",accept_values:!0,apply_to:["string","number","datetime"]},{type:"greater_or_equal",accept_values:!0,apply_to:["string","number","datetime"]},{type:"contains",accept_values:!0,apply_to:["datetime","string"]},{type:"not_contains",accept_values:!0,apply_to:["datetime","string"]},{type:"begins_with",accept_values:!0,apply_to:["string"]},{type:"not_begins_with",accept_values:!0,apply_to:["string"]},{type:"is_empty",accept_values:!1,apply_to:["string","number","datetime"]},{type:"is_not_empty",accept_values:!1,apply_to:["string","number","datetime"]},{type:"changed_after",nb_inputs:1,accept_values:!0,multiple:!1,apply_to:["string","number","datetime"]}],this.ragProperties={input:"select",values:{b_red:"Red",c_amber:"Amber",c_yellow:"Yellow",d_green:"Green",a_grey:"Grey",e_purple:"Purple",d_blue:"Blue",b_attention:"Red (Attention)"}},this.initFilter()}initFilter(){const e=this,t=this.el,a=l(this.el).data("builder-id"),r=l(`#builder_json_${a}`);if(!r.length)return;const o=JSON.parse(r.html()),u=t.data("filter-base");if(o.filters.length)if(o.filterNotDone&&this.makeUpdateFilter(),(0,n.T)(this.el),t.queryBuilder({showPreviousValues:o.showPreviousValues,filters:o.filters.map((e=>this.buildFilter(o,e))),allow_empty:!0,operators:this.operators,lang:{operators:{changed_after:"changed on or after"}}}),t.on("validationError.queryBuilder",(function(e,t,a,r){i.m.log(a),i.m.log(r),i.m.log(e),i.m.log(t)})),t.on("afterCreateRuleInput.queryBuilder",(function(t,a){let r;if(o.filters.forEach((function(e){if(e.filterId===a.filter.id)return r=e,!1})),!r||"rag"===r.type||!r.hasFilterTypeahead)return;const i=l(`#${a.id} .rule-value-container input[type='text']`),n=l(`#${a.id} .rule-value-container input[type='hidden']`);i.attr("autocomplete","off"),i.on("keyup",(()=>{n.val(i.val())}));(new s.default).withInput(i).withAjaxSource(e.getURL(o.layoutId,r.urlSuffix)).withMethod("POST").withDataBuilder((()=>({q:i.val(),oi:r.instanceId,csrf_token:l("body").data("csrf")}))).withDefaultMapper().withName("rule").withAppendQuery().withCallback((e=>{r.useIdInFilter?n.val(e.id):n.val(e.name)})).build()})),u){const e=atob(u,"base64");try{const a=JSON.parse(e);a.rules&&a.rules.length?t.queryBuilder("setRules",a):t.queryBuilder("setRules",{rules:[]})}catch(e){i.m.log("Incorrect data object passed to queryBuilder")}}else t.queryBuilder("setRules",{rules:[]})}getURL(e,t){const a=window.siteConfig&&window.siteConfig.urls.filterApi;return a||`/${e}/match/layout/${t}?q=`}makeUpdateFilter(){window.UpdateFilter=(e,t)=>{e.queryBuilder("validate")||t.preventDefault();const a=e.queryBuilder("getRules");l("#filter").val(JSON.stringify(a,null,2))}}buildFilter=(e,t)=>({id:t.filterId,label:t.label,type:"string",operators:this.buildFilterOperators(t.type),..."rag"===t.type?this.ragProperties:t.hasFilterTypeahead?this.typeaheadProperties:{}});buildFilterOperators(e){if(!["date","daterange"].includes(e))return;const t=["equal","not_equal","less","less_or_equal","greater","greater_or_equal","is_empty","is_not_empty"];return"daterange"===e&&t.push("contain"),t}get typeaheadProperties(){return{input:(e,t)=>`
      \n \n \n
      `,valueSetter:(e,t)=>{e.$el.find(".typeahead_hidden").val(t);const a=e.$el.find(".typeahead_text");a.typeahead("val",e.data.text),a.val(e.data.text)},validation:{callback:()=>!0}}}getRecords=(e,t,a,r)=>l.ajax({type:"POST",url:this.getURL(e,t),data:{q:r,oi:a},dataType:"json",path:"records"})}const o=FilterComponent}}]); \ No newline at end of file diff --git a/public/js/site.js b/public/js/site.js index 1eecf0ef2..6219a429b 100644 --- a/public/js/site.js +++ b/public/js/site.js @@ -1 +1 @@ -(()=>{var e,t,n={27e3:(e,t,n)=>{"use strict";n.d(t,{Bt:()=>r,Rf:()=>s,kl:()=>a});var i=n(74692);const r=e=>{const t=i(e);t.hasClass("hidden")||(t.addClass("hidden"),t.attr("aria-hidden","true"),t.css("display","none"),t.css("visibility","hidden"))},a=e=>{const t=i(e);t.hasClass("hidden")&&(t.removeClass("hidden"),t.removeAttr("aria-hidden"),t.removeAttr("style"))},s=e=>{try{return e&&""!==e?"string"==typeof e?JSON.parse(e):e:{}}catch(e){return{}}}},68298:(e,t,n)=>{"use strict";async function i(e,t){const n=a(t,"encrypt"),i=crypto.getRandomValues(new Uint8Array(12)),r=(new TextEncoder).encode(e),s=crypto.subtle.encrypt({name:"AES-GCM",iv:i},await n,r),o=Array.from(i),l=Array.from(new Uint8Array(await s)),d=o.concat(l);return btoa(JSON.stringify(d))}async function r(e,t){const n=a(t,"decrypt"),i=JSON.parse(atob(e)),r=new Uint8Array(i.slice(0,12)),s=new Uint8Array(i.slice(12)),o=crypto.subtle.decrypt({name:"AES-GCM",iv:r},await n,s);return(new TextDecoder).decode(await o)}async function a(e,t){const n=(new TextEncoder).encode("salt"),i=new TextEncoder,r=crypto.subtle.importKey("raw",i.encode(e),"PBKDF2",!1,["deriveKey"]),a=crypto.subtle.deriveKey({name:"PBKDF2",salt:n,iterations:1e5,hash:"SHA-256"},await r,{name:"AES-GCM",length:256},!0,[t]);return await a}n.d(t,{A:()=>s});class EncryptedStorage{static instance(){return EncryptedStorage._instance||(EncryptedStorage._instance=new EncryptedStorage(i,r)),EncryptedStorage._instance}constructor(e,t,n){this.encrypt=e,this.decrypt=t,this.storage=n||window.localStorage}async setItem(e,t,n){const i=await this.encrypt(t,n);this.storage.setItem(e,i)}async getItem(e,t){const n=this.storage.getItem(e);return n?await this.decrypt(n,t):null}removeItem(e){this.storage.removeItem(e)}clear(){this.storage.clear()}key(e){return this.storage.key(e)}get length(){return this.storage.length}}class GadsStorage{constructor(){this.test=!1,this.enabled=!0,this.test&&console.log("Using localStorage"),this.storage=this.test?localStorage:EncryptedStorage.instance()}async getStorageKey(){if(window.test)return void(this.storageKey="test");const e=await fetch("/api/get_key"),t=await e.json();if(0!==t.error)throw new Error("Failed to get storage key");this.storageKey=t.key}async setItem(e,t){await this.getItem("recovering")||await this.getItem(e)!==t&&(this.storageKey||await this.getStorageKey(),await this.storage.setItem(e,t,this.storageKey))}async getItem(e){return this.storageKey||await this.getStorageKey(),await this.storage.getItem(e,this.storageKey)}removeItem(e){this.storage.removeItem(e)}clear(){this.storage.clear()}key(e){return this.storage.key(e)}get length(){return this.storage.length}}class NullStorage{constructor(){this.enabled=!1,this.length=0}setItem(){return Promise.resolve()}getItem(){return Promise.resolve(null)}removeItem(){}clear(){}key(){return null}}const s=class AppStorage{static CreateStorageInstance(){return crypto.subtle&&void 0!==crypto.subtle?new GadsStorage:new NullStorage}}.CreateStorageInstance()},84573:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var i=n(68298),r=n(27e3);const a=class StorageProvider{get provider(){return this.storage}constructor(e,t=i.A){this.instance=e,this.storage=t}async setItem(e,t){let n=await this.storage.getItem(this.instance);n||(n="{}");const i=(0,r.Rf)(n);i[e]=t,await this.storage.setItem(this.instance,JSON.stringify(i))}async getItem(e){const t=await this.storage.getItem(this.instance);if(!t)return;return(0,r.Rf)(t)[e]||void 0}async getAll(){const e=await this.storage.getItem(this.instance);return e?(0,r.Rf)(e):{}}async clear(){this.storage.removeItem(this.instance)}async removeItem(e){const t=await this.storage.getItem(this.instance);if(!t)return;const n=(0,r.Rf)(t);delete n[e],await this.storage.setItem(this.instance,JSON.stringify(n))}}},56420:(e,t,n)=>{"use strict";n.d(t,{L:()=>r});var i=n(74692);const r=window.do_plot_json=function(e,t){((e,t)=>{const n=e.xlabels;let r={};const s="line"==t.type;r.highlighter={showMarker:s,tooltipContentEditor:(e,t,n,i)=>i._plotData[t][n][1]};const o=a();t.type in o?r.seriesDefaults=o[t.type]:r.seriesDefaults=o.default,"donut"!=t.type&&"pie"!=t.type&&(r.series=e.labels,r.axes={xaxis:{renderer:i.jqplot.CategoryAxisRenderer,ticks:n,label:t.x_axis_name,labelRenderer:i.jqplot.CanvasAxisLabelRenderer},yaxis:{label:t.y_axis_label,labelRenderer:i.jqplot.CanvasAxisLabelRenderer}},e.options.y_max&&(r.axes.yaxis.max=e.options.y_max),e.options.is_metric&&(r.axes.yaxis.tickOptions={formatString:"%d%"}),r.axesDefaults={tickRenderer:i.jqplot.CanvasAxisTickRenderer,tickOptions:{angle:-30,fontSize:"8pt"}}),r.stackSeries=t.stackseries,r.legend={renderer:i.jqplot.EnhancedLegendRenderer,show:t.showlegend,location:"ne",placement:"inside"},r.grid={background:"#ffffff",shadow:!1},i(`[data-chart-id=${t.id}]`).jqplot(e.points,r)})(e=JSON.parse(atob(e)),t=JSON.parse(atob(t)))},a=()=>({bar:{renderer:i.jqplot.BarRenderer,rendererOptions:{shadow:!1,fillToZero:!0,barMinWidth:10},pointLabels:{show:!1,hideZeros:!0}},donut:{renderer:i.jqplot.DonutRenderer,rendererOptions:{sliceMargin:3,showDataLabels:!0,dataLabels:"value",shadow:!1}},pie:{renderer:i.jqplot.PieRenderer,rendererOptions:{showDataLabels:!0,startAngle:-90,dataLabels:"value",shadow:!1}},default:{pointLabels:{show:!1}}})},28817:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var i=n(17527),r=n(97468);class Frame{constructor(e,t){this.object=e,this.step=e.data("config").step,this.number=e.data("config").frame,this.item=e.data("config").item||null,this.skip=e.data("config").skip||null,this.back=t,this.requiredFields=e.find("input[required]"),this.isValid=!0,this.error=[],this.buttons={next:e.find(".modal-footer .btn-js-next"),back:e.find(".modal-footer .btn-js-back"),skip:e.find(".modal-footer .btn-js-skip"),addNext:e.find(".modal-footer .btn-js-add-next"),invisible:e.find(".modal-footer .btn-js-add-next"),save:e.find(".modal-footer .btn-js-save")}}}var a=n(11977),s=n(74692);class ModalComponent extends i.uA{static get allowReinitialization(){return!0}constructor(e){super(e),this.el=s(this.element),this.isWizzard=this.el.hasClass("modal--wizzard"),this.isForm=this.el.hasClass("modal--form"),this.frames=this.el.find(".modal-frame"),this.typingTimer=null,this.wasInitialized||this.initModal()}initModal(){this.el.on("show.bs.modal",(()=>{if(r.y.addSubscriber(this),this.isWizzard){try{this.activateFrame(1,0)}catch(e){a.m.error(e),this.preventModalToOpen()}this.el.on("hide.bs.modal",(e=>{this.dataHasChanged()&&(confirm("Are you sure you want to close this popup? Any unsaved data will be lost.")||e.preventDefault())}))}(this.isWizzard||this.isForm)&&this.el.on("hidden.bs.modal",(()=>{this.el.off("hide.bs.modal"),r.y.close()})),this.hideContent(!0)}))}dataHasChanged(){const e=s(this.el).find("input, textarea");let t=!1;return e.each(((e,n)=>{if(s(n).val())if("hidden"!==s(n).attr("type")&&"checkbox"!==s(n).attr("type")&&"radio"!==s(n).attr("type")||"hidden"===s(n).attr("type")&&s(n).parents(".select").length){if(s(n).data("original-value")&&s(n).val().toString()!==s(n).data("original-value").toString()||!s(n).data("original-value"))return t=!0,!1}else if("hidden"!==s(n).attr("type")&&(s(n).data("original-value")&&s(n).prop("checked")&&s(n).val()!==s(n).data("original-value").toString()||!s(n).data("original-value")&&s(n).prop("checked")))return t=!0,!1})),t}hideContent(e){e?s("body").children().attr("aria-hidden",!0):s("body").children().removeAttr("aria-hidden")}preventModalToOpen(){const e=this.el.attr("id")||"";s(`.btn[data-target="#${e}"]`).on("click",(function(e){e.stopPropagation()}))}clearFields(e){s(e).find("input, textarea").each(((e,t)=>{const n=s(t);"radio"===n.attr("type")?n.prop("checked",!1):"checkbox"===n.attr("type")?n.is(":checked")&&n.trigger("click"):(n.data("restore-value")?n.val(n.data("restore-value")):n.val(""),s(t).removeData("original-value"),n.trigger("change")),n.is(":invalid")&&(n.attr("aria-invalid",!1),n.closest(".input").removeClass("input--invalid"))}))}clearFrames(e){e?s(e).each(((e,t)=>{const n=this.getFrameByNumber(t);n&&this.clearFields(n)})):this.frames.each(((e,t)=>{this.clearFields(t)}))}getFrameNumber(e){const t=s(e).data("config");if(t.frame&&!isNaN(t.frame))return t.frame}getFrameByNumber(e){let t=null;return this.frames.each(((n,i)=>{if(s(i).data("config").frame===e)return t=i,!1})),t}activateFrame(e,t,n){this.frames.each(((i,r)=>{const o=s(r).data("config");if(!o.frame||isNaN(o.frame))throw"activateFrame: frame is not a number!";if(this.unbindEventHandlers(s(r)),o.frame===e){try{this.frame=this.createFrame(r,t)}catch(e){a.m.error(e)}this.frame.object.removeClass("invisible"),this.frame.object.find(".alert").hide(),this.activateStep(this.frame.step),this.bindEventHandlers(),this.frame.requiredFields.length&&(this.frame.buttons.next&&this.setNextButtonState(!1),this.frame.buttons.invisible&&this.setInvisibleButtonState(!1)),n&&(this.clearFields(r),this.validateFrame())}else s(r).addClass("invisible")}))}createFrame(e,t){if(isNaN(s(e).data("config").step)||isNaN(s(e).data("config").frame))throw"createFrame: Parameter is not a number!";if(s(e).data("config").skip&&isNaN(s(e).data("config").skip))throw"createFrame: Skip parameter is not a number!";return new Frame(s(e),t)}bindEventHandlers(){this.frame.buttons.next.click((()=>{r.y.next(this.frame.object)})),this.frame.buttons.back.click((()=>{r.y.back(this.frame.object)})),this.frame.buttons.skip.click((()=>{this.frame.skip&&r.y.skip(this.frame.skip)})),this.frame.buttons.addNext.click((()=>{r.y.add(this.frame.object)})),this.frame.buttons.save.click((()=>{r.y.save()})),this.frame.requiredFields.bind("keyup.modalEvent",(e=>{this.handleKeyup(e)})),this.frame.requiredFields.bind("keydown.modalEvent",(()=>{this.handleKeydown()})),this.frame.requiredFields.bind("blur.modalEvent",(e=>{this.handleBlur(e)}))}handleKeyup(e){const t=e.target;clearTimeout(this.typingTimer),this.typingTimer=setTimeout((()=>{s(t).val()&&this.validateField(t)}),1e3)}handleKeydown(){clearTimeout(this.typingTimer)}handleBlur(e){const t=e.target;clearTimeout(this.typingTimer),s(t).val()&&this.validateField(t)}isValidField(e){return!s(e).is(":invalid")&&""!=s(e).val()}validateField(e){const t=this.isValidField(e);if(this.frame.error=[],!t){const t=s(e).closest(".input").find("label").html();this.frame.error.push(`${t} is invalid`)}this.setInputState(s(e),t),this.validateFrame()}validateFrame(){this.frame&&(this.frame.isValid=!0,this.frame.requiredFields.each(((e,t)=>{this.isValidField(s(t))||(this.frame.isValid=!1)})),this.setFrameState())}setInputState(e){e.is(":invalid")?(e.attr("aria-invalid",!0),e.closest(".input").addClass("input--invalid")):(e.attr("aria-invalid",!1),e.closest(".input").removeClass("input--invalid"))}setFrameState(){const e=this.frame.object.find(".alert");if(this.frame.buttons.next&&this.setNextButtonState(this.frame.isValid),this.frame.buttons.invisible&&this.setInvisibleButtonState(this.frame.isValid),!this.frame.isValid&&this.frame.error.length>0){const t="

      There were problems with the following fields:

      ";let n="";s.each(this.frame.error,((e,t)=>{const i=s("").text(t).html();n+=`
    • ${i}
    • `})),e.html(`
      ${t}
        ${n}
      `),e.show(),this.el.animate({scrollTop:e.offset().top},500)}else e.hide()}unbindEventHandlers(e){e.find(".modal-footer .btn").unbind(),e.find("input[required]").unbind(".modalEvent")}setNextButtonState(e){e?(this.frame.buttons.next.removeAttr("disabled"),this.frame.buttons.next.removeClass("btn-disabled"),this.frame.buttons.next.addClass("btn-default")):(this.frame.buttons.next.attr("disabled","disabled"),this.frame.buttons.next.addClass("btn-disabled"),this.frame.buttons.next.removeClass("btn-default"))}setInvisibleButtonState(e){e?this.frame.buttons.invisible.removeClass("btn-invisible"):this.frame.buttons.invisible.addClass("btn-invisible")}activateStep(e){this.el.find(".modal__step").each(((t,n)=>{s(n).data("step")===e?s(n).addClass("modal__step--active"):s(n).removeClass("modal__step--active")}))}handleUpload(e){const t=this,n=this.el.data("config").url,i=this.el.data("config").id,r=s("body").data("csrf").toString();e.csrf_token=r||"";const a=JSON.stringify(e),o=i?`${n}/${i}`:n;s.ajax({method:"POST",contentType:"application/json",url:o,data:a,processData:!1}).done((function(){location.reload()})).fail((function(e){const n=e.responseJSON.message;t.showError(n)}))}showError(e){const t=this.frame.object.find(".alert"),n=s("").text(e).html();t.html(`

      Error: ${n}

      `),t.show(),this.el.animate({scrollTop:t.offset().top},500)}handleNext(){const e=this.frame.number+1;this.frames.length>=e&&this.activateFrame(e,this.frame.number)}handleBack(){this.frame.back>0&&this.activateFrame(this.frame.back,this.frame.back-1),this.validateFrame()}handleSkip(e){this.activateFrame(e,this.frame.number)}handleAdd(e){r.y.update(e),this.clearFields(e),this.validateFrame()}handleActivate(e,t){this.activateFrame(e,this.frame.number,t)}handleShow(e){s(e).modal("show")}handleClear(e){this.clearFrames(e)}handleValidate(){this.validateFrame()}handleClose(){this.clearFrames(),this.isWizzard&&(this.activateFrame(1,0,!0),this.el.data("config")&&this.el.data("config").id&&(this.el.data("config").id=null)),this.el.unbind("hide.bs.modal hidden.bs.modal"),r.y.unsubscribe(this)}}const o=ModalComponent},97468:(e,t,n)=>{"use strict";n.d(t,{y:()=>i});const i=new class Modal{constructor(){this.observers=[]}addSubscriber(e){this.observers.push(e)}unsubscribe(e){var t=this.observers.indexOf(e);this.observers.splice(t,1)}activate(e,t,n){this.observers.forEach((i=>i.handleActivate?.(e,t,n)))}add(e){this.observers.forEach((t=>t.handleAdd?.(e)))}back(e){this.observers.forEach((t=>t.handleBack?.(e)))}next(e){this.observers.forEach((t=>t.handleNext?.(e)))}show(e){this.observers.forEach((t=>t.handleShow?.(e)))}save(){this.observers.forEach((e=>e.handleSave?.()))}upload(e){this.observers.forEach((t=>t.handleUpload?.(e)))}clear(e){this.observers.forEach((t=>t.handleClear?.(e)))}close(){this.observers.forEach((e=>e.handleClose?.()))}skip(e){this.observers.forEach((t=>t.handleSkip?.(e)))}validate(){this.observers.forEach((e=>e.handleValidate?.()))}update(e){this.observers.forEach((t=>t.handleUpdate?.(e)))}}},22224:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,o:()=>d});var i=n(74692);const r=function(e,t,n){const i=t+"px",r=e+n+"px";if(this.css({left:i,top:r}),document.body&&document.body.clientWidth&&this.get(0).getBoundingClientRect){const e=document.body.clientWidth-this.get(0).getBoundingClientRect().right;e<0&&this.css({left:t+e+"px"})}},a=function(e,t,n,i){t.attr("aria-expanded",n),t.toggleClass("expanded--permanent",n&&i);const a=t.data("label-expanded"),s=t.data("label-collapsed");s&&a&&t.text(n?a:s);const o=t.siblings(".expandable").first();if(o.toggleClass("expanded",n),o.hasClass("popover")){const e=t.offset();let n=e.top,i=e.left;const a=t.offsetParent();if(a){const e=a.offset();n-=e.top,i-=e.left}r.call(o,n,i,t.outerHeight()+6)}t.trigger(n?"expand":"collapse",o),e.stopPropagation()},s=function(e){const t=i(this),n=t.hasClass("expanded--permanent");a(e,t,!n,!0)},o=function(e){const t=i(this);"true"===t.attr("aria-expanded")||a(e,t,!0,!1)},l=function(e){const t=i(this),n="true"===t.attr("aria-expanded"),r=t.hasClass("expanded--permanent");n&&!r&&a(e,t,!1,!1)},d=function(e){i(".trigger[aria-expanded]",e).on("click keydown",(function(e){"click"!==e.type&&("keydown"!==e.type||13!==e.which&&32!==e.which)||(e.preventDefault(),s.call(this,e))})),i(".trigger[aria-expanded][data-expand-on-hover=true]",e).on("mouseover",o),i(".trigger[aria-expanded][data-expand-on-hover=true]",e).on("mouseout",l)}},96688:(e,t,n)=>{"use strict";n.d(t,{B:()=>i});const i=new class MoreLess{constructor(){this.observers=[]}addSubscriber(e){this.observers.push(e)}unsubscribe(e){var t=this.observers.indexOf(e);this.observers.splice(t,1)}reinitialize(){this.observers.forEach((e=>e.reInitMoreLess?.()))}}},63513:(e,t,n)=>{"use strict";n.d(t,{W:()=>i});const i=new class SidebarObservable{constructor(){this.observers=[]}addSubscriber(e){this.observers.push(e)}sideBarChange(){this.observers.forEach((e=>e.handleSideBarChange?.()))}}},30410:(e,t,n)=>{"use strict";n.d(t,{A:()=>pt});var i=n(17527);function r(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function a(e){return e instanceof r(e).Element||e instanceof Element}function s(e){return e instanceof r(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof r(e).ShadowRoot||e instanceof ShadowRoot)}var l=Math.max,d=Math.min,c=Math.round;function h(){var e=navigator.userAgentData;return null!=e&&e.brands&&Array.isArray(e.brands)?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function u(){return!/^((?!chrome|android).)*safari/i.test(h())}function f(e,t,n){void 0===t&&(t=!1),void 0===n&&(n=!1);var i=e.getBoundingClientRect(),o=1,l=1;t&&s(e)&&(o=e.offsetWidth>0&&c(i.width)/e.offsetWidth||1,l=e.offsetHeight>0&&c(i.height)/e.offsetHeight||1);var d=(a(e)?r(e):window).visualViewport,h=!u()&&n,f=(i.left+(h&&d?d.offsetLeft:0))/o,p=(i.top+(h&&d?d.offsetTop:0))/l,g=i.width/o,m=i.height/l;return{width:g,height:m,top:p,right:f+g,bottom:p+m,left:f,x:f,y:p}}function p(e){var t=r(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function g(e){return e?(e.nodeName||"").toLowerCase():null}function m(e){return((a(e)?e.ownerDocument:e.document)||window.document).documentElement}function _(e){return f(m(e)).left+p(e).scrollLeft}function v(e){return r(e).getComputedStyle(e)}function y(e){var t=v(e),n=t.overflow,i=t.overflowX,r=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+r+i)}function b(e,t,n){void 0===n&&(n=!1);var i,a,o=s(t),l=s(t)&&function(e){var t=e.getBoundingClientRect(),n=c(t.width)/e.offsetWidth||1,i=c(t.height)/e.offsetHeight||1;return 1!==n||1!==i}(t),d=m(t),h=f(e,l,n),u={scrollLeft:0,scrollTop:0},v={x:0,y:0};return(o||!o&&!n)&&(("body"!==g(t)||y(d))&&(u=(i=t)!==r(i)&&s(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:p(i)),s(t)?((v=f(t,!0)).x+=t.clientLeft,v.y+=t.clientTop):d&&(v.x=_(d))),{x:h.left+u.scrollLeft-v.x,y:h.top+u.scrollTop-v.y,width:h.width,height:h.height}}function w(e){var t=f(e),n=e.offsetWidth,i=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-i)<=1&&(i=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:i}}function k(e){return"html"===g(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||m(e)}function x(e){return["html","body","#document"].indexOf(g(e))>=0?e.ownerDocument.body:s(e)&&y(e)?e:x(k(e))}function j(e,t){var n;void 0===t&&(t=[]);var i=x(e),a=i===(null==(n=e.ownerDocument)?void 0:n.body),s=r(i),o=a?[s].concat(s.visualViewport||[],y(i)?i:[]):i,l=t.concat(o);return a?l:l.concat(j(k(o)))}function C(e){return["table","td","th"].indexOf(g(e))>=0}function T(e){return s(e)&&"fixed"!==v(e).position?e.offsetParent:null}function E(e){for(var t=r(e),n=T(e);n&&C(n)&&"static"===v(n).position;)n=T(n);return n&&("html"===g(n)||"body"===g(n)&&"static"===v(n).position)?t:n||function(e){var t=/firefox/i.test(h());if(/Trident/i.test(h())&&s(e)&&"fixed"===v(e).position)return null;var n=k(e);for(o(n)&&(n=n.host);s(n)&&["html","body"].indexOf(g(n))<0;){var i=v(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||t}var D="top",S="bottom",A="right",O="left",N="auto",L=[D,S,A,O],I="start",M="end",P="clippingParents",F="viewport",$="popper",R="reference",q=L.reduce((function(e,t){return e.concat([t+"-"+I,t+"-"+M])}),[]),H=[].concat(L,[N]).reduce((function(e,t){return e.concat([t,t+"-"+I,t+"-"+M])}),[]),U=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function B(e){var t=new Map,n=new Set,i=[];function r(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var i=t.get(e);i&&r(i)}})),i.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||r(e)})),i}var z={placement:"bottom",modifiers:[],strategy:"absolute"};function W(){for(var e=arguments.length,t=new Array(e),n=0;n=0?"x":"y"}function J(e){var t,n=e.reference,i=e.element,r=e.placement,a=r?K(r):null,s=r?X(r):null,o=n.x+n.width/2-i.width/2,l=n.y+n.height/2-i.height/2;switch(a){case D:t={x:o,y:n.y-i.height};break;case S:t={x:o,y:n.y+n.height};break;case A:t={x:n.x+n.width,y:l};break;case O:t={x:n.x-i.width,y:l};break;default:t={x:n.x,y:n.y}}var d=a?Q(a):null;if(null!=d){var c="y"===d?"height":"width";switch(s){case I:t[d]=t[d]-(n[c]/2-i[c]/2);break;case M:t[d]=t[d]+(n[c]/2-i[c]/2)}}return t}var Z={top:"auto",right:"auto",bottom:"auto",left:"auto"};function G(e){var t,n=e.popper,i=e.popperRect,a=e.placement,s=e.variation,o=e.offsets,l=e.position,d=e.gpuAcceleration,h=e.adaptive,u=e.roundOffsets,f=e.isFixed,p=o.x,g=void 0===p?0:p,_=o.y,y=void 0===_?0:_,b="function"==typeof u?u({x:g,y}):{x:g,y};g=b.x,y=b.y;var w=o.hasOwnProperty("x"),k=o.hasOwnProperty("y"),x=O,j=D,C=window;if(h){var T=E(n),N="clientHeight",L="clientWidth";if(T===r(n)&&"static"!==v(T=m(n)).position&&"absolute"===l&&(N="scrollHeight",L="scrollWidth"),a===D||(a===O||a===A)&&s===M)j=S,y-=(f&&T===C&&C.visualViewport?C.visualViewport.height:T[N])-i.height,y*=d?1:-1;if(a===O||(a===D||a===S)&&s===M)x=A,g-=(f&&T===C&&C.visualViewport?C.visualViewport.width:T[L])-i.width,g*=d?1:-1}var I,P=Object.assign({position:l},h&&Z),F=!0===u?function(e,t){var n=e.x,i=e.y,r=t.devicePixelRatio||1;return{x:c(n*r)/r||0,y:c(i*r)/r||0}}({x:g,y},r(n)):{x:g,y};return g=F.x,y=F.y,d?Object.assign({},P,((I={})[j]=k?"0":"",I[x]=w?"0":"",I.transform=(C.devicePixelRatio||1)<=1?"translate("+g+"px, "+y+"px)":"translate3d("+g+"px, "+y+"px, 0)",I)):Object.assign({},P,((t={})[j]=k?y+"px":"",t[x]=w?g+"px":"",t.transform="",t))}const ee={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},i=t.attributes[e]||{},r=t.elements[e];s(r)&&g(r)&&(Object.assign(r.style,n),Object.keys(i).forEach((function(e){var t=i[e];!1===t?r.removeAttribute(e):r.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var i=t.elements[e],r=t.attributes[e]||{},a=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});s(i)&&g(i)&&(Object.assign(i.style,a),Object.keys(r).forEach((function(e){i.removeAttribute(e)})))}))}},requires:["computeStyles"]};const te={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,i=e.name,r=n.offset,a=void 0===r?[0,0]:r,s=H.reduce((function(e,n){return e[n]=function(e,t,n){var i=K(e),r=[O,D].indexOf(i)>=0?-1:1,a="function"==typeof n?n(Object.assign({},t,{placement:e})):n,s=a[0],o=a[1];return s=s||0,o=(o||0)*r,[O,A].indexOf(i)>=0?{x:o,y:s}:{x:s,y:o}}(n,t.rects,a),e}),{}),o=s[t.placement],l=o.x,d=o.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=d),t.modifiersData[i]=s}};var ne={left:"right",right:"left",bottom:"top",top:"bottom"};function ie(e){return e.replace(/left|right|bottom|top/g,(function(e){return ne[e]}))}var re={start:"end",end:"start"};function ae(e){return e.replace(/start|end/g,(function(e){return re[e]}))}function se(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var i=t;do{if(i&&e.isSameNode(i))return!0;i=i.parentNode||i.host}while(i)}return!1}function oe(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function le(e,t,n){return t===F?oe(function(e,t){var n=r(e),i=m(e),a=n.visualViewport,s=i.clientWidth,o=i.clientHeight,l=0,d=0;if(a){s=a.width,o=a.height;var c=u();(c||!c&&"fixed"===t)&&(l=a.offsetLeft,d=a.offsetTop)}return{width:s,height:o,x:l+_(e),y:d}}(e,n)):a(t)?function(e,t){var n=f(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(t,n):oe(function(e){var t,n=m(e),i=p(e),r=null==(t=e.ownerDocument)?void 0:t.body,a=l(n.scrollWidth,n.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),s=l(n.scrollHeight,n.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),o=-i.scrollLeft+_(e),d=-i.scrollTop;return"rtl"===v(r||n).direction&&(o+=l(n.clientWidth,r?r.clientWidth:0)-a),{width:a,height:s,x:o,y:d}}(m(e)))}function de(e,t,n,i){var r="clippingParents"===t?function(e){var t=j(k(e)),n=["absolute","fixed"].indexOf(v(e).position)>=0&&s(e)?E(e):e;return a(n)?t.filter((function(e){return a(e)&&se(e,n)&&"body"!==g(e)})):[]}(e):[].concat(t),o=[].concat(r,[n]),c=o[0],h=o.reduce((function(t,n){var r=le(e,n,i);return t.top=l(r.top,t.top),t.right=d(r.right,t.right),t.bottom=d(r.bottom,t.bottom),t.left=l(r.left,t.left),t}),le(e,c,i));return h.width=h.right-h.left,h.height=h.bottom-h.top,h.x=h.left,h.y=h.top,h}function ce(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function he(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function ue(e,t){void 0===t&&(t={});var n=t,i=n.placement,r=void 0===i?e.placement:i,s=n.strategy,o=void 0===s?e.strategy:s,l=n.boundary,d=void 0===l?P:l,c=n.rootBoundary,h=void 0===c?F:c,u=n.elementContext,p=void 0===u?$:u,g=n.altBoundary,_=void 0!==g&&g,v=n.padding,y=void 0===v?0:v,b=ce("number"!=typeof y?y:he(y,L)),w=p===$?R:$,k=e.rects.popper,x=e.elements[_?w:p],j=de(a(x)?x:x.contextElement||m(e.elements.popper),d,h,o),C=f(e.elements.reference),T=J({reference:C,element:k,strategy:"absolute",placement:r}),E=oe(Object.assign({},k,T)),O=p===$?E:C,N={top:j.top-O.top+b.top,bottom:O.bottom-j.bottom+b.bottom,left:j.left-O.left+b.left,right:O.right-j.right+b.right},I=e.modifiersData.offset;if(p===$&&I){var M=I[r];Object.keys(N).forEach((function(e){var t=[A,S].indexOf(e)>=0?1:-1,n=[D,S].indexOf(e)>=0?"y":"x";N[e]+=M[n]*t}))}return N}function fe(e,t,n){return l(e,d(t,n))}const pe={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,i=e.name,r=n.mainAxis,a=void 0===r||r,s=n.altAxis,o=void 0!==s&&s,c=n.boundary,h=n.rootBoundary,u=n.altBoundary,f=n.padding,p=n.tether,g=void 0===p||p,m=n.tetherOffset,_=void 0===m?0:m,v=ue(t,{boundary:c,rootBoundary:h,padding:f,altBoundary:u}),y=K(t.placement),b=X(t.placement),k=!b,x=Q(y),j="x"===x?"y":"x",C=t.modifiersData.popperOffsets,T=t.rects.reference,N=t.rects.popper,L="function"==typeof _?_(Object.assign({},t.rects,{placement:t.placement})):_,M="number"==typeof L?{mainAxis:L,altAxis:L}:Object.assign({mainAxis:0,altAxis:0},L),P=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,F={x:0,y:0};if(C){if(a){var $,R="y"===x?D:O,q="y"===x?S:A,H="y"===x?"height":"width",U=C[x],B=U+v[R],z=U-v[q],W=g?-N[H]/2:0,V=b===I?T[H]:N[H],Y=b===I?-N[H]:-T[H],J=t.elements.arrow,Z=g&&J?w(J):{width:0,height:0},G=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},ee=G[R],te=G[q],ne=fe(0,T[H],Z[H]),ie=k?T[H]/2-W-ne-ee-M.mainAxis:V-ne-ee-M.mainAxis,re=k?-T[H]/2+W+ne+te+M.mainAxis:Y+ne+te+M.mainAxis,ae=t.elements.arrow&&E(t.elements.arrow),se=ae?"y"===x?ae.clientTop||0:ae.clientLeft||0:0,oe=null!=($=null==P?void 0:P[x])?$:0,le=U+re-oe,de=fe(g?d(B,U+ie-oe-se):B,U,g?l(z,le):z);C[x]=de,F[x]=de-U}if(o){var ce,he="x"===x?D:O,pe="x"===x?S:A,ge=C[j],me="y"===j?"height":"width",_e=ge+v[he],ve=ge-v[pe],ye=-1!==[D,O].indexOf(y),be=null!=(ce=null==P?void 0:P[j])?ce:0,we=ye?_e:ge-T[me]-N[me]-be+M.altAxis,ke=ye?ge+T[me]+N[me]-be-M.altAxis:ve,xe=g&&ye?function(e,t,n){var i=fe(e,t,n);return i>n?n:i}(we,ge,ke):fe(g?we:_e,ge,g?ke:ve);C[j]=xe,F[j]=xe-ge}t.modifiersData[i]=F}},requiresIfExists:["offset"]};const ge={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,i=e.name,r=e.options,a=n.elements.arrow,s=n.modifiersData.popperOffsets,o=K(n.placement),l=Q(o),d=[O,A].indexOf(o)>=0?"height":"width";if(a&&s){var c=function(e,t){return ce("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:he(e,L))}(r.padding,n),h=w(a),u="y"===l?D:O,f="y"===l?S:A,p=n.rects.reference[d]+n.rects.reference[l]-s[l]-n.rects.popper[d],g=s[l]-n.rects.reference[l],m=E(a),_=m?"y"===l?m.clientHeight||0:m.clientWidth||0:0,v=p/2-g/2,y=c[u],b=_-h[d]-c[f],k=_/2-h[d]/2+v,x=fe(y,k,b),j=l;n.modifiersData[i]=((t={})[j]=x,t.centerOffset=x-k,t)}},effect:function(e){var t=e.state,n=e.options.element,i=void 0===n?"[data-popper-arrow]":n;null!=i&&("string"!=typeof i||(i=t.elements.popper.querySelector(i)))&&se(t.elements.popper,i)&&(t.elements.arrow=i)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function me(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function _e(e){return[D,A,S,O].some((function(t){return e[t]>=0}))}var ve=V({defaultModifiers:[{name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,i=e.options,a=i.scroll,s=void 0===a||a,o=i.resize,l=void 0===o||o,d=r(t.elements.popper),c=[].concat(t.scrollParents.reference,t.scrollParents.popper);return s&&c.forEach((function(e){e.addEventListener("scroll",n.update,Y)})),l&&d.addEventListener("resize",n.update,Y),function(){s&&c.forEach((function(e){e.removeEventListener("scroll",n.update,Y)})),l&&d.removeEventListener("resize",n.update,Y)}},data:{}},{name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=J({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},{name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,i=n.gpuAcceleration,r=void 0===i||i,a=n.adaptive,s=void 0===a||a,o=n.roundOffsets,l=void 0===o||o,d={placement:K(t.placement),variation:X(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:r,isFixed:"fixed"===t.options.strategy};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,G(Object.assign({},d,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:s,roundOffsets:l})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,G(Object.assign({},d,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},ee,te,{name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,i=e.name;if(!t.modifiersData[i]._skip){for(var r=n.mainAxis,a=void 0===r||r,s=n.altAxis,o=void 0===s||s,l=n.fallbackPlacements,d=n.padding,c=n.boundary,h=n.rootBoundary,u=n.altBoundary,f=n.flipVariations,p=void 0===f||f,g=n.allowedAutoPlacements,m=t.options.placement,_=K(m),v=l||(_===m||!p?[ie(m)]:function(e){if(K(e)===N)return[];var t=ie(e);return[ae(e),t,ae(t)]}(m)),y=[m].concat(v).reduce((function(e,n){return e.concat(K(n)===N?function(e,t){void 0===t&&(t={});var n=t,i=n.placement,r=n.boundary,a=n.rootBoundary,s=n.padding,o=n.flipVariations,l=n.allowedAutoPlacements,d=void 0===l?H:l,c=X(i),h=c?o?q:q.filter((function(e){return X(e)===c})):L,u=h.filter((function(e){return d.indexOf(e)>=0}));0===u.length&&(u=h);var f=u.reduce((function(t,n){return t[n]=ue(e,{placement:n,boundary:r,rootBoundary:a,padding:s})[K(n)],t}),{});return Object.keys(f).sort((function(e,t){return f[e]-f[t]}))}(t,{placement:n,boundary:c,rootBoundary:h,padding:d,flipVariations:p,allowedAutoPlacements:g}):n)}),[]),b=t.rects.reference,w=t.rects.popper,k=new Map,x=!0,j=y[0],C=0;C=0,F=P?"width":"height",$=ue(t,{placement:T,boundary:c,rootBoundary:h,altBoundary:u,padding:d}),R=P?M?A:O:M?S:D;b[F]>w[F]&&(R=ie(R));var U=ie(R),B=[];if(a&&B.push($[E]<=0),o&&B.push($[R]<=0,$[U]<=0),B.every((function(e){return e}))){j=T,x=!1;break}k.set(T,B)}if(x)for(var z=function(e){var t=y.find((function(t){var n=k.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return j=t,"break"},W=p?3:1;W>0;W--){if("break"===z(W))break}t.placement!==j&&(t.modifiersData[i]._skip=!0,t.placement=j,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}},pe,ge,{name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,i=t.rects.reference,r=t.rects.popper,a=t.modifiersData.preventOverflow,s=ue(t,{elementContext:"reference"}),o=ue(t,{altBoundary:!0}),l=me(s,i),d=me(o,r,a),c=_e(l),h=_e(d);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:d,isReferenceHidden:c,hasPopperEscaped:h},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":c,"data-popper-escaped":h})}}]}),ye="tippy-content",be="tippy-backdrop",we="tippy-arrow",ke="tippy-svg-arrow",xe={passive:!0,capture:!0},je=function(){return document.body};function Ce(e,t,n){if(Array.isArray(e)){var i=e[t];return null==i?Array.isArray(n)?n[t]:n:i}return e}function Te(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function Ee(e,t){return"function"==typeof e?e.apply(void 0,t):e}function De(e,t){return 0===t?e:function(i){clearTimeout(n),n=setTimeout((function(){e(i)}),t)};var n}function Se(e){return[].concat(e)}function Ae(e,t){-1===e.indexOf(t)&&e.push(t)}function Oe(e){return e.split("-")[0]}function Ne(e){return[].slice.call(e)}function Le(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function Ie(){return document.createElement("div")}function Me(e){return["Element","Fragment"].some((function(t){return Te(e,t)}))}function Pe(e){return Te(e,"MouseEvent")}function Fe(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function $e(e){return Me(e)?[e]:function(e){return Te(e,"NodeList")}(e)?Ne(e):Array.isArray(e)?e:Ne(document.querySelectorAll(e))}function Re(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function qe(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function He(e){var t,n=Se(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function Ue(e,t,n){var i=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[i](t,n)}))}function Be(e,t){for(var n=t;n;){var i;if(e.contains(n))return!0;n=null==n.getRootNode||null==(i=n.getRootNode())?void 0:i.host}return!1}var ze={isTouch:!1},We=0;function Ve(){ze.isTouch||(ze.isTouch=!0,window.performance&&document.addEventListener("mousemove",Ye))}function Ye(){var e=performance.now();e-We<20&&(ze.isTouch=!1,document.removeEventListener("mousemove",Ye)),We=e}function Ke(){var e=document.activeElement;if(Fe(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var Xe=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto;var Qe={animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},Je=Object.assign({appendTo:je,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},Qe,{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),Ze=Object.keys(Je);function Ge(e){var t=(e.plugins||[]).reduce((function(t,n){var i,r=n.name,a=n.defaultValue;r&&(t[r]=void 0!==e[r]?e[r]:null!=(i=Je[r])?i:a);return t}),{});return Object.assign({},e,t)}function et(e,t){var n=Object.assign({},t,{content:Ee(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(Ge(Object.assign({},Je,{plugins:t}))):Ze).reduce((function(t,n){var i=(e.getAttribute("data-tippy-"+n)||"").trim();if(!i)return t;if("content"===n)t[n]=i;else try{t[n]=JSON.parse(i)}catch(e){t[n]=i}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},Je.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}var tt=function(){return"innerHTML"};function nt(e,t){e[tt()]=t}function it(e){var t=Ie();return!0===e?t.className=we:(t.className=ke,Me(e)?t.appendChild(e):nt(t,e)),t}function rt(e,t){Me(t.content)?(nt(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?nt(e,t.content):e.textContent=t.content)}function at(e){var t=e.firstElementChild,n=Ne(t.children);return{box:t,content:n.find((function(e){return e.classList.contains(ye)})),arrow:n.find((function(e){return e.classList.contains(we)||e.classList.contains(ke)})),backdrop:n.find((function(e){return e.classList.contains(be)}))}}function st(e){var t=Ie(),n=Ie();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var i=Ie();function r(n,i){var r=at(t),a=r.box,s=r.content,o=r.arrow;i.theme?a.setAttribute("data-theme",i.theme):a.removeAttribute("data-theme"),"string"==typeof i.animation?a.setAttribute("data-animation",i.animation):a.removeAttribute("data-animation"),i.inertia?a.setAttribute("data-inertia",""):a.removeAttribute("data-inertia"),a.style.maxWidth="number"==typeof i.maxWidth?i.maxWidth+"px":i.maxWidth,i.role?a.setAttribute("role",i.role):a.removeAttribute("role"),n.content===i.content&&n.allowHTML===i.allowHTML||rt(s,e.props),i.arrow?o?n.arrow!==i.arrow&&(a.removeChild(o),a.appendChild(it(i.arrow))):a.appendChild(it(i.arrow)):o&&a.removeChild(o)}return i.className=ye,i.setAttribute("data-state","hidden"),rt(i,e.props),t.appendChild(n),n.appendChild(i),r(e.props,e.props),{popper:t,onUpdate:r}}st.$$tippy=!0;var ot=1,lt=[],dt=[];function ct(e,t){var n,i,r,a,s,o,l,d,c=et(e,Object.assign({},Je,Ge(Le(t)))),h=!1,u=!1,f=!1,p=!1,g=[],m=De(Y,c.interactiveDebounce),_=ot++,v=(d=c.plugins).filter((function(e,t){return d.indexOf(e)===t})),y={id:_,reference:e,popper:Ie(),popperInstance:null,props:c,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:v,clearDelayTimeouts:function(){clearTimeout(n),clearTimeout(i),cancelAnimationFrame(r)},setProps:function(t){0;if(y.state.isDestroyed)return;L("onBeforeUpdate",[y,t]),W();var n=y.props,i=et(e,Object.assign({},n,Le(t),{ignoreAttributes:!0}));y.props=i,z(),n.interactiveDebounce!==i.interactiveDebounce&&(P(),m=De(Y,i.interactiveDebounce));n.triggerTarget&&!i.triggerTarget?Se(n.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):i.triggerTarget&&e.removeAttribute("aria-expanded");M(),N(),k&&k(n,i);y.popperInstance&&(J(),G().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));L("onAfterUpdate",[y,t])},setContent:function(e){y.setProps({content:e})},show:function(){0;var e=y.state.isVisible,t=y.state.isDestroyed,n=!y.state.isEnabled,i=ze.isTouch&&!y.props.touch,r=Ce(y.props.duration,0,Je.duration);if(e||t||n||i)return;if(D().hasAttribute("disabled"))return;if(L("onShow",[y],!1),!1===y.props.onShow(y))return;y.state.isVisible=!0,E()&&(w.style.visibility="visible");N(),q(),y.state.isMounted||(w.style.transition="none");if(E()){var a=A();Re([a.box,a.content],0)}o=function(){var e;if(y.state.isVisible&&!p){if(p=!0,w.offsetHeight,w.style.transition=y.props.moveTransition,E()&&y.props.animation){var t=A(),n=t.box,i=t.content;Re([n,i],r),qe([n,i],"visible")}I(),M(),Ae(dt,y),null==(e=y.popperInstance)||e.forceUpdate(),L("onMount",[y]),y.props.animation&&E()&&function(e,t){U(e,t)}(r,(function(){y.state.isShown=!0,L("onShown",[y])}))}},function(){var e,t=y.props.appendTo,n=D();e=y.props.interactive&&t===je||"parent"===t?n.parentNode:Ee(t,[n]);e.contains(w)||e.appendChild(w);y.state.isMounted=!0,J(),!1}()},hide:function(){0;var e=!y.state.isVisible,t=y.state.isDestroyed,n=!y.state.isEnabled,i=Ce(y.props.duration,1,Je.duration);if(e||t||n)return;if(L("onHide",[y],!1),!1===y.props.onHide(y))return;y.state.isVisible=!1,y.state.isShown=!1,p=!1,h=!1,E()&&(w.style.visibility="hidden");if(P(),H(),N(!0),E()){var r=A(),a=r.box,s=r.content;y.props.animation&&(Re([a,s],i),qe([a,s],"hidden"))}I(),M(),y.props.animation?E()&&function(e,t){U(e,(function(){!y.state.isVisible&&w.parentNode&&w.parentNode.contains(w)&&t()}))}(i,y.unmount):y.unmount()},hideWithInteractivity:function(e){0;S().addEventListener("mousemove",m),Ae(lt,m),m(e)},enable:function(){y.state.isEnabled=!0},disable:function(){y.hide(),y.state.isEnabled=!1},unmount:function(){0;y.state.isVisible&&y.hide();if(!y.state.isMounted)return;Z(),G().forEach((function(e){e._tippy.unmount()})),w.parentNode&&w.parentNode.removeChild(w);dt=dt.filter((function(e){return e!==y})),y.state.isMounted=!1,L("onHidden",[y])},destroy:function(){0;if(y.state.isDestroyed)return;y.clearDelayTimeouts(),y.unmount(),W(),delete e._tippy,y.state.isDestroyed=!0,L("onDestroy",[y])}};if(!c.render)return y;var b=c.render(y),w=b.popper,k=b.onUpdate;w.setAttribute("data-tippy-root",""),w.id="tippy-"+y.id,y.popper=w,e._tippy=y,w._tippy=y;var x=v.map((function(e){return e.fn(y)})),j=e.hasAttribute("aria-expanded");return z(),M(),N(),L("onCreate",[y]),c.showOnCreate&&ee(),w.addEventListener("mouseenter",(function(){y.props.interactive&&y.state.isVisible&&y.clearDelayTimeouts()})),w.addEventListener("mouseleave",(function(){y.props.interactive&&y.props.trigger.indexOf("mouseenter")>=0&&S().addEventListener("mousemove",m)})),y;function C(){var e=y.props.touch;return Array.isArray(e)?e:[e,0]}function T(){return"hold"===C()[0]}function E(){var e;return!(null==(e=y.props.render)||!e.$$tippy)}function D(){return l||e}function S(){var e=D().parentNode;return e?He(e):document}function A(){return at(w)}function O(e){return y.state.isMounted&&!y.state.isVisible||ze.isTouch||a&&"focus"===a.type?0:Ce(y.props.delay,e?0:1,Je.delay)}function N(e){void 0===e&&(e=!1),w.style.pointerEvents=y.props.interactive&&!e?"":"none",w.style.zIndex=""+y.props.zIndex}function L(e,t,n){var i;(void 0===n&&(n=!0),x.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(i=y.props)[e].apply(i,t)}function I(){var t=y.props.aria;if(t.content){var n="aria-"+t.content,i=w.id;Se(y.props.triggerTarget||e).forEach((function(e){var t=e.getAttribute(n);if(y.state.isVisible)e.setAttribute(n,t?t+" "+i:i);else{var r=t&&t.replace(i,"").trim();r?e.setAttribute(n,r):e.removeAttribute(n)}}))}}function M(){!j&&y.props.aria.expanded&&Se(y.props.triggerTarget||e).forEach((function(e){y.props.interactive?e.setAttribute("aria-expanded",y.state.isVisible&&e===D()?"true":"false"):e.removeAttribute("aria-expanded")}))}function P(){S().removeEventListener("mousemove",m),lt=lt.filter((function(e){return e!==m}))}function F(t){if(!ze.isTouch||!f&&"mousedown"!==t.type){var n=t.composedPath&&t.composedPath()[0]||t.target;if(!y.props.interactive||!Be(w,n)){if(Se(y.props.triggerTarget||e).some((function(e){return Be(e,n)}))){if(ze.isTouch)return;if(y.state.isVisible&&y.props.trigger.indexOf("click")>=0)return}else L("onClickOutside",[y,t]);!0===y.props.hideOnClick&&(y.clearDelayTimeouts(),y.hide(),u=!0,setTimeout((function(){u=!1})),y.state.isMounted||H())}}}function $(){f=!0}function R(){f=!1}function q(){var e=S();e.addEventListener("mousedown",F,!0),e.addEventListener("touchend",F,xe),e.addEventListener("touchstart",R,xe),e.addEventListener("touchmove",$,xe)}function H(){var e=S();e.removeEventListener("mousedown",F,!0),e.removeEventListener("touchend",F,xe),e.removeEventListener("touchstart",R,xe),e.removeEventListener("touchmove",$,xe)}function U(e,t){var n=A().box;function i(e){e.target===n&&(Ue(n,"remove",i),t())}if(0===e)return t();Ue(n,"remove",s),Ue(n,"add",i),s=i}function B(t,n,i){void 0===i&&(i=!1),Se(y.props.triggerTarget||e).forEach((function(e){e.addEventListener(t,n,i),g.push({node:e,eventType:t,handler:n,options:i})}))}function z(){var e;T()&&(B("touchstart",V,{passive:!0}),B("touchend",K,{passive:!0})),(e=y.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(B(e,V),e){case"mouseenter":B("mouseleave",K);break;case"focus":B(Xe?"focusout":"blur",X);break;case"focusin":B("focusout",X)}}))}function W(){g.forEach((function(e){var t=e.node,n=e.eventType,i=e.handler,r=e.options;t.removeEventListener(n,i,r)})),g=[]}function V(e){var t,n=!1;if(y.state.isEnabled&&!Q(e)&&!u){var i="focus"===(null==(t=a)?void 0:t.type);a=e,l=e.currentTarget,M(),!y.state.isVisible&&Pe(e)&<.forEach((function(t){return t(e)})),"click"===e.type&&(y.props.trigger.indexOf("mouseenter")<0||h)&&!1!==y.props.hideOnClick&&y.state.isVisible?n=!0:ee(e),"click"===e.type&&(h=!n),n&&!i&&te(e)}}function Y(e){var t=e.target,n=D().contains(t)||w.contains(t);if("mousemove"!==e.type||!n){var i=G().concat(w).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:c}:null})).filter(Boolean);(function(e,t){var n=t.clientX,i=t.clientY;return e.every((function(e){var t=e.popperRect,r=e.popperState,a=e.props.interactiveBorder,s=Oe(r.placement),o=r.modifiersData.offset;if(!o)return!0;var l="bottom"===s?o.top.y:0,d="top"===s?o.bottom.y:0,c="right"===s?o.left.x:0,h="left"===s?o.right.x:0,u=t.top-i+l>a,f=i-t.bottom-d>a,p=t.left-n+c>a,g=n-t.right-h>a;return u||f||p||g}))})(i,e)&&(P(),te(e))}}function K(e){Q(e)||y.props.trigger.indexOf("click")>=0&&h||(y.props.interactive?y.hideWithInteractivity(e):te(e))}function X(e){y.props.trigger.indexOf("focusin")<0&&e.target!==D()||y.props.interactive&&e.relatedTarget&&w.contains(e.relatedTarget)||te(e)}function Q(e){return!!ze.isTouch&&T()!==e.type.indexOf("touch")>=0}function J(){Z();var t=y.props,n=t.popperOptions,i=t.placement,r=t.offset,a=t.getReferenceClientRect,s=t.moveTransition,l=E()?at(w).arrow:null,d=a?{getBoundingClientRect:a,contextElement:a.contextElement||D()}:e,c={name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(E()){var n=A().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}},h=[{name:"offset",options:{offset:r}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},c];E()&&l&&h.push({name:"arrow",options:{element:l,padding:3}}),h.push.apply(h,(null==n?void 0:n.modifiers)||[]),y.popperInstance=ve(d,w,Object.assign({},n,{placement:i,onFirstUpdate:o,modifiers:h}))}function Z(){y.popperInstance&&(y.popperInstance.destroy(),y.popperInstance=null)}function G(){return Ne(w.querySelectorAll("[data-tippy-root]"))}function ee(e){y.clearDelayTimeouts(),e&&L("onTrigger",[y,e]),q();var t=O(!0),i=C(),r=i[0],a=i[1];ze.isTouch&&"hold"===r&&a&&(t=a),t?n=setTimeout((function(){y.show()}),t):y.show()}function te(e){if(y.clearDelayTimeouts(),L("onUntrigger",[y,e]),y.state.isVisible){if(!(y.props.trigger.indexOf("mouseenter")>=0&&y.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&h)){var t=O(!1);t?i=setTimeout((function(){y.state.isVisible&&y.hide()}),t):r=requestAnimationFrame((function(){y.hide()}))}}else H()}}function ht(e,t){void 0===t&&(t={});var n=Je.plugins.concat(t.plugins||[]);document.addEventListener("touchstart",Ve,xe),window.addEventListener("blur",Ke);var i=Object.assign({},t,{plugins:n}),r=$e(e).reduce((function(e,t){var n=t&&ct(t,i);return n&&e.push(n),e}),[]);return Me(e)?r[0]:r}ht.defaultProps=Je,ht.setDefaultProps=function(e){Object.keys(e).forEach((function(t){Je[t]=e[t]}))},ht.currentInput=ze;Object.assign({},ee,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}});ht.setDefaultProps({render:st});const ut=ht;var ft=n(74692);class TippyComponent extends i.uA{constructor(e){super(e),this.el=ft(this.element)}initTippy(e){ut(this.element,{theme:"light",allowHTML:!0,interactive:!0,appendTo:e})}}const pt=TippyComponent},17527:(e,t,n)=>{"use strict";n.d(t,{Nj:()=>o,Rz:()=>d,VZ:()=>l,sy:()=>c,uA:()=>Component});var i=n(74692);const r=e=>"data-component-initialized-"+e,a=(e,t)=>!!e.getAttribute(r(t));class Component{static get allowReinitialization(){return!1}constructor(e){if(!(e instanceof HTMLElement))throw new Error("Components can only be initialized with an HTMLElement as argument to the constructor");this.element=e,this.wasInitialized=a(this.element,this.constructor.name),this.element.setAttribute(r(this.constructor.name),!0)}}const s=[],o=e=>{s.push(e)},l=e=>{s.forEach((t=>{t(e)}))},d=(e,t)=>{const n=e.querySelectorAll(t);return n.length?Array.from(n):[]},c=(e,t,n)=>{if(!(n.prototype instanceof Component))throw new Error("Components can only be initialized when they inherit the basecomponent");const r=(e instanceof i?e.get():[e]).flatMap((e=>"function"==typeof t?t(e):d(e,t)));return r.length?r.filter((e=>n.allowReinitialization||!a(e,n.name))).map((e=>new n(e))):[]}},11977:(e,t,n)=>{"use strict";n.d(t,{m:()=>i});const i=new class Logging{constructor(){this.allowLogging=window.test||"localhost"===location.hostname||"127.0.0.1"===location.hostname||location.hostname.endsWith(".peek.digitpaint.nl")}log(...e){this.allowLogging&&console.log(e)}info(...e){this.allowLogging&&console.info(e)}warn(...e){this.allowLogging&&console.warn(e)}error(...e){this.allowLogging&&console.error(e)}}},56197:(e,t,n)=>{"use strict";n.d(t,{Pc:()=>f,Px:()=>h,Rv:()=>a,dg:()=>u,pT:()=>r});var i=n(74692);const r=e=>{if(e.hasClass("input--required")){const t=e.find(".input__file-label");if(e.hasClass("input--document")){const n=e.find(".list"),i=n.find('input[type="checkbox"]'),r=e.find(".form-control-file");t.on("blur",(()=>{u(n)})),r.on("change",(()=>{u(n)})),i.on("blur change",(()=>{u(n)}))}else{const t=e.find("input[required]"),n=e.find(".input__file-label");t.on("blur change",(()=>{setTimeout((()=>{c(e)}),300)})),n.on("blur",(()=>{c(e)}))}}else if(e.hasClass("textarea--required")){e.find("textarea[required]").on("blur change",(()=>{setTimeout((()=>{c(e)}),300)}))}else if(e.hasClass("select--required")){const t=e.find("button"),n=e.find("input[required]");t.on("blur",(()=>{setTimeout((()=>{c(e)}),300)})),n.on("change",(()=>{c(e)}))}else if(e.hasClass("radio-group--required")){e.find("input[required]").on("blur change",(()=>{setTimeout((()=>{h(e)}),300)}))}else if(e.hasClass("select-widget--required"))if(e.hasClass("multi")){const t=e.find(".form-control-search"),n=e.find('input[type="checkbox"]');let i;n.on("blur change",(()=>{i=setTimeout((()=>{u(e)}),300)})),t.on("blur",(()=>{i=setTimeout((()=>{u(e)}),300)})),n.on("focus",(()=>{clearTimeout(i)}))}else{const t=e.find(".form-control-search"),n=e.find("input[required]");let i;n.on("blur change",(()=>{i=setTimeout((()=>{h(e)}),300)})),t.on("blur",(()=>{i=setTimeout((()=>{h(e)}),300)})),n.on("focus",(()=>{clearTimeout(i)}))}else if(e.hasClass("tree--required")){const t=e.find(".jstree-anchor");let n;t.on("blur change",(()=>{n=setTimeout((()=>{f(e)}),300)})),t.on("focus",(()=>{clearTimeout(n)}))}},a=e=>{let t=!0;return e.find(".input--required:not(.input--document), .textarea--required, .select--required").each(((e,n)=>{c(i(n))||(p(n),t=!1)})),e.find(".input--document.input--required").each(((e,n)=>{u(i(n).closest(".fieldset").find(".list"))||(p(n),t=!1)})),e.find(".radio-group--required").each(((e,n)=>{h(i(n))||(p(n),t=!1)})),e.find(".select-widget--required").each(((e,n)=>{i(n).hasClass("multi")?u(i(n))||(p(n),t=!1):h(i(n))||(p(n),t=!1)})),e.find(".tree--required").each(((e,n)=>{f(i(n))||(i(n).closest(".card--expandable").find(".collapse").collapse("show"),t=!1)})),e.find(".checkbox-fieldset--required").each(((e,n)=>{s(i(n))||(o(i(n),i(n).find(".fieldset__legend legend").text(),i(n).attr("id")),i(n).addClass("invalid"),i(n).closest(".fieldset--required").addClass("fieldset--invalid"),t=!1)})),t},s=e=>{let t=!1;return e.find("input[type=checkbox]").each(((e,n)=>{if(n.isChecked||i(n).is(":checked"))return t=!0,!0})),t},o=(e,t,n)=>{const r=i('
      ');let a=i(``);a.text(`${t} is a required field.`),r.html(a),e.append(r)},l=e=>{e.find(".error").remove()},d=e=>e.closest(".form-group[data-has-dependency='1'][style*='display: none']").length>0,c=e=>{const t=e.find("[required]"),n=e.find("label").text()||"",r=t.attr("id")||"";return l(i(e)),""!==t.val()||d(e)?(t.removeAttr("aria-invalid"),l(e),e.removeClass("invalid"),e.closest(".fieldset--required").removeClass("fieldset--invalid"),!0):(t.attr("aria-invalid",!0),o(e,n,r),e.addClass("invalid"),e.closest(".fieldset--required").addClass("fieldset--invalid"),!1)},h=e=>{const t=e.find("input[required]"),n=e.closest(".fieldset--required").find(".fieldset__legend legend").text()||"",r=e.attr("id")||"";let a=!1;return l(i(e)),t.each(((e,t)=>{i(t).is(":checked")&&(a=!0)})),a||d(e)?(t.removeAttr("aria-invalid"),l(e),e.removeClass("invalid"),e.closest(".fieldset--required").removeClass("fieldset--invalid"),!0):(t.attr("aria-invalid",!0),o(e,n,r),e.addClass("invalid"),e.closest(".fieldset--required").addClass("fieldset--invalid"),!1)},u=e=>{const t=e.find('input[type="checkbox"]'),n=e.closest(".fieldset--required").find(".fieldset__legend legend").text()||"",r=e.attr("id")||"";let a=!1;return l(i(e)),t.each(((e,t)=>{i(t).is(":checked")&&(a=!0)})),a||d(e)?(l(e),e.removeClass("invalid"),e.closest(".fieldset--required").removeClass("fieldset--invalid"),!0):(o(e,n,r),e.addClass("invalid"),e.closest(".fieldset--required").addClass("fieldset--invalid"),!1)},f=e=>{const t=e.find('input[type="hidden"]'),n=e.closest(".fieldset--required");if(!n||!n.length)return;const r=n.find(".fieldset__legend legend").text()||"",a=e.attr("id")||"";return l(i(e)),t.length&&""!==t.val()||d(e)?(t.removeAttr("aria-invalid"),l(e),e.removeClass("invalid"),e.closest(".fieldset--required").removeClass("fieldset--invalid"),!0):(t.attr("aria-invalid",!0),o(e,r,a),e.addClass("invalid"),e.closest(".fieldset--required").addClass("fieldset--invalid"),!1)},p=e=>{const t=i(e).closest(".card--expandable").find(".collapse");if(!t||!t.collapse)return;const n=i(e).closest(".form-group").find("legend, label");t.prev().find(".btn-edit:visible").trigger("click"),t.hasClass("show")?n[0].scrollIntoView():(t.on("shown.bs.collapse.foobar",(function(){n[0].scrollIntoView(),i(this).off("shown.bs.collapse.foobar")})),t.collapse("show"))}},59780:(e,t,n)=>{var i,r,a;r=[n(74692)],void 0===(a="function"==typeof(i=function(e,t){function n(){return new Date(Date.UTC.apply(Date,arguments))}function i(){var e=new Date;return n(e.getFullYear(),e.getMonth(),e.getDate())}function r(e,t){return e.getUTCFullYear()===t.getUTCFullYear()&&e.getUTCMonth()===t.getUTCMonth()&&e.getUTCDate()===t.getUTCDate()}function a(n,i){return function(){return i!==t&&e.fn.datepicker.deprecated(i),this[n].apply(this,arguments)}}function s(e){return e&&!isNaN(e.getTime())}var o,l=(o={get:function(e){return this.slice(e)[0]},contains:function(e){for(var t=e&&e.valueOf(),n=0,i=this.length;n]/g)||[]).length<=0||e(n).length>0)}catch(e){return!1}},_process_options:function(t){this._o=e.extend({},this._o,t);var r=this.o=e.extend({},this._o),a=r.language;_[a]||(a=a.split("-")[0],_[a]||(a=g.language)),r.language=a,r.startView=this._resolveViewName(r.startView),r.minViewMode=this._resolveViewName(r.minViewMode),r.maxViewMode=this._resolveViewName(r.maxViewMode),r.startView=Math.max(this.o.minViewMode,Math.min(this.o.maxViewMode,r.startView)),!0!==r.multidate&&(r.multidate=Number(r.multidate)||!1,!1!==r.multidate&&(r.multidate=Math.max(0,r.multidate))),r.multidateSeparator=String(r.multidateSeparator),r.weekStart%=7,r.weekEnd=(r.weekStart+6)%7;var s=v.parseFormat(r.format);r.startDate!==-1/0&&(r.startDate?r.startDate instanceof Date?r.startDate=this._local_to_utc(this._zero_time(r.startDate)):r.startDate=v.parseDate(r.startDate,s,r.language,r.assumeNearbyYear):r.startDate=-1/0),r.endDate!==1/0&&(r.endDate?r.endDate instanceof Date?r.endDate=this._local_to_utc(this._zero_time(r.endDate)):r.endDate=v.parseDate(r.endDate,s,r.language,r.assumeNearbyYear):r.endDate=1/0),r.daysOfWeekDisabled=this._resolveDaysOfWeek(r.daysOfWeekDisabled||[]),r.daysOfWeekHighlighted=this._resolveDaysOfWeek(r.daysOfWeekHighlighted||[]),r.datesDisabled=r.datesDisabled||[],Array.isArray(r.datesDisabled)||(r.datesDisabled=r.datesDisabled.split(",")),r.datesDisabled=e.map(r.datesDisabled,(function(e){return v.parseDate(e,s,r.language,r.assumeNearbyYear)}));var o=String(r.orientation).toLowerCase().split(/\s+/g),l=r.orientation.toLowerCase();if(o=e.grep(o,(function(e){return/^auto|left|right|top|bottom$/.test(e)})),r.orientation={x:"auto",y:"auto"},l&&"auto"!==l)if(1===o.length)switch(o[0]){case"top":case"bottom":r.orientation.y=o[0];break;case"left":case"right":r.orientation.x=o[0]}else l=e.grep(o,(function(e){return/^left|right$/.test(e)})),r.orientation.x=l[0]||"auto",l=e.grep(o,(function(e){return/^top|bottom$/.test(e)})),r.orientation.y=l[0]||"auto";if(r.defaultViewDate instanceof Date||"string"==typeof r.defaultViewDate)r.defaultViewDate=v.parseDate(r.defaultViewDate,s,r.language,r.assumeNearbyYear);else if(r.defaultViewDate){var d=r.defaultViewDate.year||(new Date).getFullYear(),c=r.defaultViewDate.month||0,h=r.defaultViewDate.day||1;r.defaultViewDate=n(d,c,h)}else r.defaultViewDate=i()},_applyEvents:function(e){for(var n,i,r,a=0;aa?(this.picker.addClass("datepicker-orient-right"),f+=u-t):this.o.rtl?this.picker.addClass("datepicker-orient-right"):this.picker.addClass("datepicker-orient-left");var g=this.o.orientation.y;if("auto"===g&&(g=-s+p-n<0?"bottom":"top"),this.picker.addClass("datepicker-orient-"+g),"top"===g?p-=n+parseInt(this.picker.css("padding-top")):p+=h,this.o.rtl){var m=a-(f+u);this.picker.css({top:p,right:m,zIndex:d})}else this.picker.css({top:p,left:f,zIndex:d});return this},_allow_update:!0,update:function(){if(!this._allow_update)return this;var t=this.dates.copy(),n=[],i=!1;return arguments.length?(e.each(arguments,e.proxy((function(e,t){t instanceof Date&&(t=this._local_to_utc(t)),n.push(t)}),this)),i=!0):(n=(n=this.isInput?this.element.val():this.element.data("date")||this.inputField.val())&&this.o.multidate?n.split(this.o.multidateSeparator):[n],delete this.element.data().date),n=e.map(n,e.proxy((function(e){return v.parseDate(e,this.o.format,this.o.language,this.o.assumeNearbyYear)}),this)),n=e.grep(n,e.proxy((function(e){return!this.dateWithinRange(e)||!e}),this),!0),this.dates.replace(n),this.o.updateViewDate&&(this.dates.length?this.viewDate=new Date(this.dates.get(-1)):this.viewDatethis.o.endDate?this.viewDate=new Date(this.o.endDate):this.viewDate=this.o.defaultViewDate),i?(this.setValue(),this.element.change()):this.dates.length&&String(t)!==String(this.dates)&&i&&(this._trigger("changeDate"),this.element.change()),!this.dates.length&&t.length&&(this._trigger("clearDate"),this.element.change()),this.fill(),this},fillDow:function(){if(this.o.showWeekDays){var t=this.o.weekStart,n="";for(this.o.calendarWeeks&&(n+=' ');t";n+="",this.picker.find(".datepicker-days thead").append(n)}},fillMonths:function(){for(var e=this._utc_to_local(this.viewDate),t="",n=0;n<12;n++)t+=''+_[this.o.language].monthsShort[n]+"";this.picker.find(".datepicker-months td").html(t)},setRange:function(t){t&&t.length?this.range=e.map(t,(function(e){return e.valueOf()})):delete this.range,this.fill()},getClassNames:function(t){var n=[],a=this.viewDate.getUTCFullYear(),s=this.viewDate.getUTCMonth(),o=i();return t.getUTCFullYear()a||t.getUTCFullYear()===a&&t.getUTCMonth()>s)&&n.push("new"),this.focusDate&&t.valueOf()===this.focusDate.valueOf()&&n.push("focused"),this.o.todayHighlight&&r(t,o)&&n.push("today"),-1!==this.dates.contains(t)&&n.push("active"),this.dateWithinRange(t)||n.push("disabled"),this.dateIsDisabled(t)&&n.push("disabled","disabled-date"),-1!==e.inArray(t.getUTCDay(),this.o.daysOfWeekHighlighted)&&n.push("highlighted"),this.range&&(t>this.range[0]&&to)&&d.push("disabled"),y===_&&d.push("focused"),l!==e.noop&&((h=l(new Date(y,0,1)))===t?h={}:"boolean"==typeof h?h={enabled:h}:"string"==typeof h&&(h={classes:h}),!1===h.enabled&&d.push("disabled"),h.classes&&(d=d.concat(h.classes.split(/\s+/))),h.tooltip&&(c=h.tooltip)),u+='"+y+"";p.find(".datepicker-switch").text(g+"-"+m),p.find("td").html(u)},fill:function(){var r,a,s=new Date(this.viewDate),o=s.getUTCFullYear(),l=s.getUTCMonth(),d=this.o.startDate!==-1/0?this.o.startDate.getUTCFullYear():-1/0,c=this.o.startDate!==-1/0?this.o.startDate.getUTCMonth():-1/0,h=this.o.endDate!==1/0?this.o.endDate.getUTCFullYear():1/0,u=this.o.endDate!==1/0?this.o.endDate.getUTCMonth():1/0,f=_[this.o.language].today||_.en.today||"",p=_[this.o.language].clear||_.en.clear||"",g=_[this.o.language].titleFormat||_.en.titleFormat,m=i(),y=(!0===this.o.todayBtn||"linked"===this.o.todayBtn)&&m>=this.o.startDate&&m<=this.o.endDate&&!this.weekOfDateIsDisabled(m);if(!isNaN(o)&&!isNaN(l)){this.picker.find(".datepicker-days .datepicker-switch").text(v.formatDate(s,g,this.o.language)),this.picker.find("tfoot .today").text(f).css("display",y?"table-cell":"none"),this.picker.find("tfoot .clear").text(p).css("display",!0===this.o.clearBtn?"table-cell":"none"),this.picker.find("thead .datepicker-title").text(this.o.title).css("display","string"==typeof this.o.title&&""!==this.o.title?"table-cell":"none"),this.updateNavArrows(),this.fillMonths();var b=n(o,l,0),w=b.getUTCDate();b.setUTCDate(w-(b.getUTCDay()-this.o.weekStart+7)%7);var k=new Date(b);b.getUTCFullYear()<100&&k.setUTCFullYear(b.getUTCFullYear()),k.setUTCDate(k.getUTCDate()+42),k=k.valueOf();for(var x,j,C=[];b.valueOf()"),this.o.calendarWeeks)){var T=new Date(+b+(this.o.weekStart-x-7)%7*864e5),E=new Date(Number(T)+(11-T.getUTCDay())%7*864e5),D=new Date(Number(D=n(E.getUTCFullYear(),0,1))+(11-D.getUTCDay())%7*864e5),S=(E-D)/864e5/7+1;C.push(''+S+"")}(j=this.getClassNames(b)).push("day");var A=b.getUTCDate();this.o.beforeShowDay!==e.noop&&((a=this.o.beforeShowDay(this._utc_to_local(b)))===t?a={}:"boolean"==typeof a?a={enabled:a}:"string"==typeof a&&(a={classes:a}),!1===a.enabled&&j.push("disabled"),a.classes&&(j=j.concat(a.classes.split(/\s+/))),a.tooltip&&(r=a.tooltip),a.content&&(A=a.content)),j="function"==typeof e.uniqueSort?e.uniqueSort(j):e.unique(j),C.push(''+A+""),r=null,x===this.o.weekEnd&&C.push(""),b.setUTCDate(b.getUTCDate()+1)}this.picker.find(".datepicker-days tbody").html(C.join(""));var O=_[this.o.language].monthsTitle||_.en.monthsTitle||"Months",N=this.picker.find(".datepicker-months").find(".datepicker-switch").text(this.o.maxViewMode<2?O:o).end().find("tbody span").removeClass("active");if(e.each(this.dates,(function(e,t){t.getUTCFullYear()===o&&N.eq(t.getUTCMonth()).addClass("active")})),(oh)&&N.addClass("disabled"),o===d&&N.slice(0,c).addClass("disabled"),o===h&&N.slice(u+1).addClass("disabled"),this.o.beforeShowMonth!==e.noop){var L=this;e.each(N,(function(n,i){var r=new Date(o,n,1),a=L.o.beforeShowMonth(r);a===t?a={}:"boolean"==typeof a?a={enabled:a}:"string"==typeof a&&(a={classes:a}),!1!==a.enabled||e(i).hasClass("disabled")||e(i).addClass("disabled"),a.classes&&e(i).addClass(a.classes),a.tooltip&&e(i).prop("title",a.tooltip)}))}this._fill_yearsView(".datepicker-years","year",10,o,d,h,this.o.beforeShowYear),this._fill_yearsView(".datepicker-decades","decade",100,o,d,h,this.o.beforeShowDecade),this._fill_yearsView(".datepicker-centuries","century",1e3,o,d,h,this.o.beforeShowCentury)}},updateNavArrows:function(){if(this._allow_update){var e,t,n=new Date(this.viewDate),i=n.getUTCFullYear(),r=n.getUTCMonth(),a=this.o.startDate!==-1/0?this.o.startDate.getUTCFullYear():-1/0,s=this.o.startDate!==-1/0?this.o.startDate.getUTCMonth():-1/0,o=this.o.endDate!==1/0?this.o.endDate.getUTCFullYear():1/0,l=this.o.endDate!==1/0?this.o.endDate.getUTCMonth():1/0,d=1;switch(this.viewMode){case 4:d*=10;case 3:d*=10;case 2:d*=10;case 1:e=Math.floor(i/d)*d<=a,t=Math.floor(i/d)*d+d>o;break;case 0:e=i<=a&&r<=s,t=i>=o&&r>=l}this.picker.find(".prev").toggleClass("disabled",e),this.picker.find(".next").toggleClass("disabled",t)}},click:function(t){var r,a,s,o;t.preventDefault(),t.stopPropagation(),(r=e(t.target)).hasClass("datepicker-switch")&&this.viewMode!==this.o.maxViewMode&&this.setViewMode(this.viewMode+1),r.hasClass("today")&&!r.hasClass("day")&&(this.setViewMode(0),this._setDate(i(),"linked"===this.o.todayBtn?null:"view")),r.hasClass("clear")&&this.clearDates(),r.hasClass("disabled")||(r.hasClass("month")||r.hasClass("year")||r.hasClass("decade")||r.hasClass("century"))&&(this.viewDate.setUTCDate(1),a=1,1===this.viewMode?(o=r.parent().find("span").index(r),s=this.viewDate.getUTCFullYear(),this.viewDate.setUTCMonth(o)):(o=0,s=Number(r.text()),this.viewDate.setUTCFullYear(s)),this._trigger(v.viewModes[this.viewMode-1].e,this.viewDate),this.viewMode===this.o.minViewMode?this._setDate(n(s,o,a)):(this.setViewMode(this.viewMode-1),this.fill())),this.picker.is(":visible")&&this._focused_from&&this._focused_from.focus(),delete this._focused_from},dayCellClick:function(t){var n=e(t.currentTarget).data("date"),i=new Date(n);this.o.updateViewDate&&(i.getUTCFullYear()!==this.viewDate.getUTCFullYear()&&this._trigger("changeYear",this.viewDate),i.getUTCMonth()!==this.viewDate.getUTCMonth()&&this._trigger("changeMonth",this.viewDate)),this._setDate(i)},navArrowsClick:function(t){var n=e(t.currentTarget).hasClass("prev")?-1:1;0!==this.viewMode&&(n*=12*v.viewModes[this.viewMode].navStep),this.viewDate=this.moveMonth(this.viewDate,n),this._trigger(v.viewModes[this.viewMode].e,this.viewDate),this.fill()},_toggle_multidate:function(e){var t=this.dates.contains(e);if(e||this.dates.clear(),-1!==t?(!0===this.o.multidate||this.o.multidate>1||this.o.toggleActive)&&this.dates.remove(t):!1===this.o.multidate?(this.dates.clear(),this.dates.push(e)):this.dates.push(e),"number"==typeof this.o.multidate)for(;this.dates.length>this.o.multidate;)this.dates.remove(0)},_setDate:function(e,t){t&&"date"!==t||this._toggle_multidate(e&&new Date(e)),(!t&&this.o.updateViewDate||"view"===t)&&(this.viewDate=e&&new Date(e)),this.fill(),this.setValue(),t&&"view"===t||this._trigger("changeDate"),this.inputField.trigger("change"),!this.o.autoclose||t&&"date"!==t||this.hide()},moveDay:function(e,t){var n=new Date(e);return n.setUTCDate(e.getUTCDate()+t),n},moveWeek:function(e,t){return this.moveDay(e,7*t)},moveMonth:function(e,t){if(!s(e))return this.o.defaultViewDate;if(!t)return e;var n,i,r=new Date(e.valueOf()),a=r.getUTCDate(),o=r.getUTCMonth(),l=Math.abs(t);if(t=t>0?1:-1,1===l)i=-1===t?function(){return r.getUTCMonth()===o}:function(){return r.getUTCMonth()!==n},n=o+t,r.setUTCMonth(n),n=(n+12)%12;else{for(var d=0;d0},dateWithinRange:function(e){return e>=this.o.startDate&&e<=this.o.endDate},keydown:function(e){if(this.picker.is(":visible")){var t,n,i=!1,r=this.focusDate||this.viewDate;switch(e.keyCode){case 27:this.focusDate?(this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.fill()):this.hide(),e.preventDefault(),e.stopPropagation();break;case 37:case 38:case 39:case 40:if(!this.o.keyboardNavigation||7===this.o.daysOfWeekDisabled.length)break;t=37===e.keyCode||38===e.keyCode?-1:1,0===this.viewMode?e.ctrlKey?(n=this.moveAvailableDate(r,t,"moveYear"))&&this._trigger("changeYear",this.viewDate):e.shiftKey?(n=this.moveAvailableDate(r,t,"moveMonth"))&&this._trigger("changeMonth",this.viewDate):37===e.keyCode||39===e.keyCode?n=this.moveAvailableDate(r,t,"moveDay"):this.weekOfDateIsDisabled(r)||(n=this.moveAvailableDate(r,t,"moveWeek")):1===this.viewMode?(38!==e.keyCode&&40!==e.keyCode||(t*=4),n=this.moveAvailableDate(r,t,"moveMonth")):2===this.viewMode&&(38!==e.keyCode&&40!==e.keyCode||(t*=4),n=this.moveAvailableDate(r,t,"moveYear")),n&&(this.focusDate=this.viewDate=n,this.setValue(),this.fill(),e.preventDefault());break;case 13:if(!this.o.forceParse)break;r=this.focusDate||this.dates.get(-1)||this.viewDate,this.o.keyboardNavigation&&(this._toggle_multidate(r),i=!0),this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.setValue(),this.fill(),this.picker.is(":visible")&&(e.preventDefault(),e.stopPropagation(),this.o.autoclose&&this.hide());break;case 9:this.focusDate=null,this.viewDate=this.dates.get(-1)||this.viewDate,this.fill(),this.hide()}i&&(this.dates.length?this._trigger("changeDate"):this._trigger("clearDate"),this.inputField.trigger("change"))}else 40!==e.keyCode&&27!==e.keyCode||(this.show(),e.stopPropagation())},setViewMode:function(e){this.viewMode=e,this.picker.children("div").hide().filter(".datepicker-"+v.viewModes[this.viewMode].clsName).show(),this.updateNavArrows(),this._trigger("changeViewMode",new Date(this.viewDate))}};var c=function(t,n){e.data(t,"datepicker",this),this.element=e(t),this.inputs=e.map(n.inputs,(function(e){return e.jquery?e[0]:e})),delete n.inputs,this.keepEmptyValues=n.keepEmptyValues,delete n.keepEmptyValues,p.call(e(this.inputs),n).on("changeDate",e.proxy(this.dateUpdated,this)),this.pickers=e.map(this.inputs,(function(t){return e.data(t,"datepicker")})),this.updateDates()};function h(t,n){var i=e(t).data(),r={},a=new RegExp("^"+n.toLowerCase()+"([A-Z])");function s(e,t){return t.toLowerCase()}for(var o in n=new RegExp("^"+n.toLowerCase()),i)n.test(o)&&(r[o.replace(a,s)]=i[o]);return r}function u(t){var n={};if(_[t]||(t=t.split("-")[0],_[t])){var i=_[t];return e.each(m,(function(e,t){t in i&&(n[t]=i[t])})),n}}c.prototype={updateDates:function(){this.dates=e.map(this.pickers,(function(e){return e.getUTCDate()})),this.updateRanges()},updateRanges:function(){var t=e.map(this.dates,(function(e){return e.valueOf()}));e.each(this.pickers,(function(e,n){n.setRange(t)}))},clearDates:function(){e.each(this.pickers,(function(e,t){t.clearDates()}))},dateUpdated:function(n){if(!this.updating){this.updating=!0;var i=e.data(n.target,"datepicker");if(i!==t){var r=i.getUTCDate(),a=this.keepEmptyValues,s=e.inArray(n.target,this.inputs),o=s-1,l=s+1,d=this.inputs.length;if(-1!==s){if(e.each(this.pickers,(function(e,t){t.getUTCDate()||t!==i&&a||t.setUTCDate(r)})),r=0&&r0;)this.pickers[o--].setUTCDate(r);else if(r>this.dates[l])for(;lthis.dates[l]&&(this.pickers[l].element.val()||"").length>0;)this.pickers[l++].setUTCDate(r);this.updateDates(),delete this.updating}}}},destroy:function(){e.map(this.pickers,(function(e){e.destroy()})),e(this.inputs).off("changeDate",this.dateUpdated),delete this.element.data().datepicker},remove:a("destroy","Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead")};var f=e.fn.datepicker,p=function(n){var i,r=Array.apply(null,arguments);if(r.shift(),this.each((function(){var t=e(this),a=t.data("datepicker"),s="object"==typeof n&&n;if(!a){var o=h(this,"date"),l=u(e.extend({},g,o,s).language),f=e.extend({},g,l,o,s);t.hasClass("input-daterange")||f.inputs?(e.extend(f,{inputs:f.inputs||t.find("input").toArray()}),a=new c(this,f)):a=new d(this,f),t.data("datepicker",a)}"string"==typeof n&&"function"==typeof a[n]&&(i=a[n].apply(a,r))})),i===t||i instanceof d||i instanceof c)return this;if(this.length>1)throw new Error("Using only allowed for the collection of a single element ("+n+" function)");return i};e.fn.datepicker=p;var g=e.fn.datepicker.defaults={assumeNearbyYear:!1,autoclose:!1,beforeShowDay:e.noop,beforeShowMonth:e.noop,beforeShowYear:e.noop,beforeShowDecade:e.noop,beforeShowCentury:e.noop,calendarWeeks:!1,clearBtn:!1,toggleActive:!1,daysOfWeekDisabled:[],daysOfWeekHighlighted:[],datesDisabled:[],endDate:1/0,forceParse:!0,format:"mm/dd/yyyy",isInline:null,keepEmptyValues:!1,keyboardNavigation:!0,language:"en",minViewMode:0,maxViewMode:4,multidate:!1,multidateSeparator:",",orientation:"auto",rtl:!1,startDate:-1/0,startView:0,todayBtn:!1,todayHighlight:!1,updateViewDate:!0,weekStart:0,disableTouchKeyboard:!1,enableOnReadonly:!0,showOnFocus:!0,zIndexOffset:10,container:"body",immediateUpdates:!1,title:"",templates:{leftArrow:"«",rightArrow:"»"},showWeekDays:!0},m=e.fn.datepicker.locale_opts=["format","rtl","weekStart"];e.fn.datepicker.Constructor=d;var _=e.fn.datepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",clear:"Clear",titleFormat:"MM yyyy"}},v={viewModes:[{names:["days","month"],clsName:"days",e:"changeMonth"},{names:["months","year"],clsName:"months",e:"changeYear",navStep:1},{names:["years","decade"],clsName:"years",e:"changeDecade",navStep:10},{names:["decades","century"],clsName:"decades",e:"changeCentury",navStep:100},{names:["centuries","millennium"],clsName:"centuries",e:"changeMillennium",navStep:1e3}],validParts:/dd?|DD?|mm?|MM?|yy(?:yy)?/g,nonpunctuation:/[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g,parseFormat:function(e){if("function"==typeof e.toValue&&"function"==typeof e.toDisplay)return e;var t=e.replace(this.validParts,"\0").split("\0"),n=e.match(this.validParts);if(!t||!t.length||!n||0===n.length)throw new Error("Invalid date format.");return{separators:t,parts:n}},parseDate:function(n,r,a,s){if(!n)return t;if(n instanceof Date)return n;if("string"==typeof r&&(r=v.parseFormat(r)),r.toValue)return r.toValue(n,r,a);var o,l,c,h,u,f={d:"moveDay",m:"moveMonth",w:"moveWeek",y:"moveYear"},p={yesterday:"-1d",today:"+0d",tomorrow:"+1d"};if(n in p&&(n=p[n]),/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/i.test(n)){for(o=n.match(/([\-+]\d+)([dmwy])/gi),n=new Date,h=0;h(new Date).getFullYear()+t&&(e-=100),e}o=n&&n.match(this.nonpunctuation)||[];var m,y,b={},w=["yyyy","yy","M","MM","m","mm","d","dd"],k={yyyy:function(e,t){return e.setUTCFullYear(s?g(t,s):t)},m:function(e,t){if(isNaN(e))return e;for(t-=1;t<0;)t+=12;for(t%=12,e.setUTCMonth(t);e.getUTCMonth()!==t;)e.setUTCDate(e.getUTCDate()-1);return e},d:function(e,t){return e.setUTCDate(t)}};k.yy=k.yyyy,k.M=k.MM=k.mm=k.m,k.dd=k.d,n=i();var x=r.parts.slice();function j(){var e=this.slice(0,o[h].length),t=o[h].slice(0,e.length);return e.toLowerCase()===t.toLowerCase()}if(o.length!==x.length&&(x=e(x).filter((function(t,n){return-1!==e.inArray(n,w)})).toArray()),o.length===x.length){var C,T,E;for(h=0,C=x.length;h'+g.templates.leftArrow+''+g.templates.rightArrow+"",contTemplate:'',footTemplate:''};v.template='
      '+v.headTemplate+""+v.footTemplate+'
      '+v.headTemplate+v.contTemplate+v.footTemplate+'
      '+v.headTemplate+v.contTemplate+v.footTemplate+'
      '+v.headTemplate+v.contTemplate+v.footTemplate+'
      '+v.headTemplate+v.contTemplate+v.footTemplate+"
      ",e.fn.datepicker.DPGlobal=v,e.fn.datepicker.noConflict=function(){return e.fn.datepicker=f,this},e.fn.datepicker.version="1.10.0",e.fn.datepicker.deprecated=function(e){var t=window.console;t&&t.warn&&t.warn("DEPRECATED: "+e)},e(document).on("focus.datepicker.data-api click.datepicker.data-api",'[data-provide="datepicker"]',(function(t){var n=e(this);n.data("datepicker")||(t.preventDefault(),p.call(n,"show"))})),e((function(){p.call(e('[data-provide="datepicker-inline"]'))}))})?i.apply(t,r):i)||(e.exports=a)},52754:function(e,t,n){!function(e,t,n){"use strict";function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=i(t),a=i(n);function s(e,t){for(var n=0;n=s)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};v.jQueryDetection(),_();var y="alert",b="4.6.2",w="bs.alert",k="."+w,x=".data-api",j=r.default.fn[y],C="alert",T="fade",E="show",D="close"+k,S="closed"+k,A="click"+k+x,O='[data-dismiss="alert"]',N=function(){function e(e){this._element=e}var t=e.prototype;return t.close=function(e){var t=this._element;e&&(t=this._getRootElement(e)),this._triggerCloseEvent(t).isDefaultPrevented()||this._removeElement(t)},t.dispose=function(){r.default.removeData(this._element,w),this._element=null},t._getRootElement=function(e){var t=v.getSelectorFromElement(e),n=!1;return t&&(n=document.querySelector(t)),n||(n=r.default(e).closest("."+C)[0]),n},t._triggerCloseEvent=function(e){var t=r.default.Event(D);return r.default(e).trigger(t),t},t._removeElement=function(e){var t=this;if(r.default(e).removeClass(E),r.default(e).hasClass(T)){var n=v.getTransitionDurationFromElement(e);r.default(e).one(v.TRANSITION_END,(function(n){return t._destroyElement(e,n)})).emulateTransitionEnd(n)}else this._destroyElement(e)},t._destroyElement=function(e){r.default(e).detach().trigger(S).remove()},e._jQueryInterface=function(t){return this.each((function(){var n=r.default(this),i=n.data(w);i||(i=new e(this),n.data(w,i)),"close"===t&&i[t](this)}))},e._handleDismiss=function(e){return function(t){t&&t.preventDefault(),e.close(this)}},o(e,null,[{key:"VERSION",get:function(){return b}}]),e}();r.default(document).on(A,O,N._handleDismiss(new N)),r.default.fn[y]=N._jQueryInterface,r.default.fn[y].Constructor=N,r.default.fn[y].noConflict=function(){return r.default.fn[y]=j,N._jQueryInterface};var L="button",I="4.6.2",M="bs.button",P="."+M,F=".data-api",$=r.default.fn[L],R="active",q="btn",H="focus",U="click"+P+F,B="focus"+P+F+" blur"+P+F,z="load"+P+F,W='[data-toggle^="button"]',V='[data-toggle="buttons"]',Y='[data-toggle="button"]',K='[data-toggle="buttons"] .btn',X='input:not([type="hidden"])',Q=".active",J=".btn",Z=function(){function e(e){this._element=e,this.shouldAvoidTriggerChange=!1}var t=e.prototype;return t.toggle=function(){var e=!0,t=!0,n=r.default(this._element).closest(V)[0];if(n){var i=this._element.querySelector(X);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(R))e=!1;else{var a=n.querySelector(Q);a&&r.default(a).removeClass(R)}e&&("checkbox"!==i.type&&"radio"!==i.type||(i.checked=!this._element.classList.contains(R)),this.shouldAvoidTriggerChange||r.default(i).trigger("change")),i.focus(),t=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(t&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(R)),e&&r.default(this._element).toggleClass(R))},t.dispose=function(){r.default.removeData(this._element,M),this._element=null},e._jQueryInterface=function(t,n){return this.each((function(){var i=r.default(this),a=i.data(M);a||(a=new e(this),i.data(M,a)),a.shouldAvoidTriggerChange=n,"toggle"===t&&a[t]()}))},o(e,null,[{key:"VERSION",get:function(){return I}}]),e}();r.default(document).on(U,W,(function(e){var t=e.target,n=t;if(r.default(t).hasClass(q)||(t=r.default(t).closest(J)[0]),!t||t.hasAttribute("disabled")||t.classList.contains("disabled"))e.preventDefault();else{var i=t.querySelector(X);if(i&&(i.hasAttribute("disabled")||i.classList.contains("disabled")))return void e.preventDefault();"INPUT"!==n.tagName&&"LABEL"===t.tagName||Z._jQueryInterface.call(r.default(t),"toggle","INPUT"===n.tagName)}})).on(B,W,(function(e){var t=r.default(e.target).closest(J)[0];r.default(t).toggleClass(H,/^focus(in)?$/.test(e.type))})),r.default(window).on(z,(function(){for(var e=[].slice.call(document.querySelectorAll(K)),t=0,n=e.length;t0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var t=e.prototype;return t.next=function(){this._isSliding||this._slide(_e)},t.nextWhenVisible=function(){var e=r.default(this._element);!document.hidden&&e.is(":visible")&&"hidden"!==e.css("visibility")&&this.next()},t.prev=function(){this._isSliding||this._slide(ve)},t.pause=function(e){e||(this._isPaused=!0),this._element.querySelector($e)&&(v.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},t.cycle=function(e){e||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},t.to=function(e){var t=this;this._activeElement=this._element.querySelector(Me);var n=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)r.default(this._element).one(ke,(function(){return t.to(e)}));else{if(n===e)return this.pause(),void this.cycle();var i=e>n?_e:ve;this._slide(i,this._items[e])}},t.dispose=function(){r.default(this._element).off(ne),r.default.removeData(this._element,te),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},t._getConfig=function(e){return e=l({},Ue,e),v.typeCheckConfig(G,e,Be),e},t._handleSwipe=function(){var e=Math.abs(this.touchDeltaX);if(!(e<=le)){var t=e/this.touchDeltaX;this.touchDeltaX=0,t>0&&this.prev(),t<0&&this.next()}},t._addEventListeners=function(){var e=this;this._config.keyboard&&r.default(this._element).on(xe,(function(t){return e._keydown(t)})),"hover"===this._config.pause&&r.default(this._element).on(je,(function(t){return e.pause(t)})).on(Ce,(function(t){return e.cycle(t)})),this._config.touch&&this._addTouchEventListeners()},t._addTouchEventListeners=function(){var e=this;if(this._touchSupported){var t=function(t){e._pointerEvent&&ze[t.originalEvent.pointerType.toUpperCase()]?e.touchStartX=t.originalEvent.clientX:e._pointerEvent||(e.touchStartX=t.originalEvent.touches[0].clientX)},n=function(t){e.touchDeltaX=t.originalEvent.touches&&t.originalEvent.touches.length>1?0:t.originalEvent.touches[0].clientX-e.touchStartX},i=function(t){e._pointerEvent&&ze[t.originalEvent.pointerType.toUpperCase()]&&(e.touchDeltaX=t.originalEvent.clientX-e.touchStartX),e._handleSwipe(),"hover"===e._config.pause&&(e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout((function(t){return e.cycle(t)}),oe+e._config.interval))};r.default(this._element.querySelectorAll(Fe)).on(Oe,(function(e){return e.preventDefault()})),this._pointerEvent?(r.default(this._element).on(Se,(function(e){return t(e)})),r.default(this._element).on(Ae,(function(e){return i(e)})),this._element.classList.add(me)):(r.default(this._element).on(Te,(function(e){return t(e)})),r.default(this._element).on(Ee,(function(e){return n(e)})),r.default(this._element).on(De,(function(e){return i(e)})))}},t._keydown=function(e){if(!/input|textarea/i.test(e.target.tagName))switch(e.which){case ae:e.preventDefault(),this.prev();break;case se:e.preventDefault(),this.next()}},t._getItemIndex=function(e){return this._items=e&&e.parentNode?[].slice.call(e.parentNode.querySelectorAll(Pe)):[],this._items.indexOf(e)},t._getItemByDirection=function(e,t){var n=e===_e,i=e===ve,r=this._getItemIndex(t),a=this._items.length-1;if((i&&0===r||n&&r===a)&&!this._config.wrap)return t;var s=(r+(e===ve?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},t._triggerSlideEvent=function(e,t){var n=this._getItemIndex(e),i=this._getItemIndex(this._element.querySelector(Me)),a=r.default.Event(we,{relatedTarget:e,direction:t,from:i,to:n});return r.default(this._element).trigger(a),a},t._setActiveIndicatorElement=function(e){if(this._indicatorsElement){var t=[].slice.call(this._indicatorsElement.querySelectorAll(Ie));r.default(t).removeClass(ce);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&r.default(n).addClass(ce)}},t._updateInterval=function(){var e=this._activeElement||this._element.querySelector(Me);if(e){var t=parseInt(e.getAttribute("data-interval"),10);t?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=t):this._config.interval=this._config.defaultInterval||this._config.interval}},t._slide=function(e,t){var n,i,a,s=this,o=this._element.querySelector(Me),l=this._getItemIndex(o),d=t||o&&this._getItemByDirection(e,o),c=this._getItemIndex(d),h=Boolean(this._interval);if(e===_e?(n=fe,i=pe,a=ye):(n=ue,i=ge,a=be),d&&r.default(d).hasClass(ce))this._isSliding=!1;else if(!this._triggerSlideEvent(d,a).isDefaultPrevented()&&o&&d){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(d),this._activeElement=d;var u=r.default.Event(ke,{relatedTarget:d,direction:a,from:l,to:c});if(r.default(this._element).hasClass(he)){r.default(d).addClass(i),v.reflow(d),r.default(o).addClass(n),r.default(d).addClass(n);var f=v.getTransitionDurationFromElement(o);r.default(o).one(v.TRANSITION_END,(function(){r.default(d).removeClass(n+" "+i).addClass(ce),r.default(o).removeClass(ce+" "+i+" "+n),s._isSliding=!1,setTimeout((function(){return r.default(s._element).trigger(u)}),0)})).emulateTransitionEnd(f)}else r.default(o).removeClass(ce),r.default(d).addClass(ce),this._isSliding=!1,r.default(this._element).trigger(u);h&&this.cycle()}},e._jQueryInterface=function(t){return this.each((function(){var n=r.default(this).data(te),i=l({},Ue,r.default(this).data());"object"==typeof t&&(i=l({},i,t));var a="string"==typeof t?t:i.slide;if(n||(n=new e(this,i),r.default(this).data(te,n)),"number"==typeof t)n.to(t);else if("string"==typeof a){if(void 0===n[a])throw new TypeError('No method named "'+a+'"');n[a]()}else i.interval&&i.ride&&(n.pause(),n.cycle())}))},e._dataApiClickHandler=function(t){var n=v.getSelectorFromElement(this);if(n){var i=r.default(n)[0];if(i&&r.default(i).hasClass(de)){var a=l({},r.default(i).data(),r.default(this).data()),s=this.getAttribute("data-slide-to");s&&(a.interval=!1),e._jQueryInterface.call(r.default(i),a),s&&r.default(i).data(te).to(s),t.preventDefault()}}},o(e,null,[{key:"VERSION",get:function(){return ee}},{key:"Default",get:function(){return Ue}}]),e}();r.default(document).on(Le,qe,We._dataApiClickHandler),r.default(window).on(Ne,(function(){for(var e=[].slice.call(document.querySelectorAll(He)),t=0,n=e.length;t0&&(this._selector=s,this._triggerArray.push(a))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var t=e.prototype;return t.toggle=function(){r.default(this._element).hasClass(Ze)?this.hide():this.show()},t.show=function(){var t,n,i=this;if(!(this._isTransitioning||r.default(this._element).hasClass(Ze)||(this._parent&&0===(t=[].slice.call(this._parent.querySelectorAll(dt)).filter((function(e){return"string"==typeof i._config.parent?e.getAttribute("data-parent")===i._config.parent:e.classList.contains(Ge)}))).length&&(t=null),t&&(n=r.default(t).not(this._selector).data(Ke))&&n._isTransitioning))){var a=r.default.Event(rt);if(r.default(this._element).trigger(a),!a.isDefaultPrevented()){t&&(e._jQueryInterface.call(r.default(t).not(this._selector),"hide"),n||r.default(t).data(Ke,null));var s=this._getDimension();r.default(this._element).removeClass(Ge).addClass(et),this._element.style[s]=0,this._triggerArray.length&&r.default(this._triggerArray).removeClass(tt).attr("aria-expanded",!0),this.setTransitioning(!0);var o=function(){r.default(i._element).removeClass(et).addClass(Ge+" "+Ze),i._element.style[s]="",i.setTransitioning(!1),r.default(i._element).trigger(at)},l="scroll"+(s[0].toUpperCase()+s.slice(1)),d=v.getTransitionDurationFromElement(this._element);r.default(this._element).one(v.TRANSITION_END,o).emulateTransitionEnd(d),this._element.style[s]=this._element[l]+"px"}}},t.hide=function(){var e=this;if(!this._isTransitioning&&r.default(this._element).hasClass(Ze)){var t=r.default.Event(st);if(r.default(this._element).trigger(t),!t.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",v.reflow(this._element),r.default(this._element).addClass(et).removeClass(Ge+" "+Ze);var i=this._triggerArray.length;if(i>0)for(var a=0;a0},t._getOffset=function(){var e=this,t={};return"function"==typeof this._config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e._config.offset(t.offsets,e._element)),t}:t.offset=this._config.offset,t},t._getPopperConfig=function(){var e={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(e.modifiers.applyStyle={enabled:!1}),l({},e,this._config.popperConfig)},e._jQueryInterface=function(t){return this.each((function(){var n=r.default(this).data(mt);if(n||(n=new e(this,"object"==typeof t?t:null),r.default(this).data(mt,n)),"string"==typeof t){if(void 0===n[t])throw new TypeError('No method named "'+t+'"');n[t]()}}))},e._clearMenus=function(t){if(!t||t.which!==Ct&&("keyup"!==t.type||t.which===kt))for(var n=[].slice.call(document.querySelectorAll(Ut)),i=0,a=n.length;i0&&s--,t.which===jt&&sdocument.documentElement.clientHeight;n||(this._element.style.overflowY="hidden"),this._element.classList.add(mn);var i=v.getTransitionDurationFromElement(this._dialog);r.default(this._element).off(v.TRANSITION_END),r.default(this._element).one(v.TRANSITION_END,(function(){e._element.classList.remove(mn),n||r.default(e._element).one(v.TRANSITION_END,(function(){e._element.style.overflowY=""})).emulateTransitionEnd(e._element,i)})).emulateTransitionEnd(i),this._element.focus()}},t._showElement=function(e){var t=this,n=r.default(this._element).hasClass(pn),i=this._dialog?this._dialog.querySelector(An):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),r.default(this._dialog).hasClass(cn)&&i?i.scrollTop=0:this._element.scrollTop=0,n&&v.reflow(this._element),r.default(this._element).addClass(gn),this._config.focus&&this._enforceFocus();var a=r.default.Event(wn,{relatedTarget:e}),s=function(){t._config.focus&&t._element.focus(),t._isTransitioning=!1,r.default(t._element).trigger(a)};if(n){var o=v.getTransitionDurationFromElement(this._dialog);r.default(this._dialog).one(v.TRANSITION_END,s).emulateTransitionEnd(o)}else s()},t._enforceFocus=function(){var e=this;r.default(document).off(kn).on(kn,(function(t){document!==t.target&&e._element!==t.target&&0===r.default(e._element).has(t.target).length&&e._element.focus()}))},t._setEscapeEvent=function(){var e=this;this._isShown?r.default(this._element).on(Cn,(function(t){e._config.keyboard&&t.which===dn?(t.preventDefault(),e.hide()):e._config.keyboard||t.which!==dn||e._triggerBackdropTransition()})):this._isShown||r.default(this._element).off(Cn)},t._setResizeEvent=function(){var e=this;this._isShown?r.default(window).on(xn,(function(t){return e.handleUpdate(t)})):r.default(window).off(xn)},t._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._showBackdrop((function(){r.default(document.body).removeClass(fn),e._resetAdjustments(),e._resetScrollbar(),r.default(e._element).trigger(yn)}))},t._removeBackdrop=function(){this._backdrop&&(r.default(this._backdrop).remove(),this._backdrop=null)},t._showBackdrop=function(e){var t=this,n=r.default(this._element).hasClass(pn)?pn:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=un,n&&this._backdrop.classList.add(n),r.default(this._backdrop).appendTo(document.body),r.default(this._element).on(jn,(function(e){t._ignoreBackdropClick?t._ignoreBackdropClick=!1:e.target===e.currentTarget&&("static"===t._config.backdrop?t._triggerBackdropTransition():t.hide())})),n&&v.reflow(this._backdrop),r.default(this._backdrop).addClass(gn),!e)return;if(!n)return void e();var i=v.getTransitionDurationFromElement(this._backdrop);r.default(this._backdrop).one(v.TRANSITION_END,e).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){r.default(this._backdrop).removeClass(gn);var a=function(){t._removeBackdrop(),e&&e()};if(r.default(this._element).hasClass(pn)){var s=v.getTransitionDurationFromElement(this._backdrop);r.default(this._backdrop).one(v.TRANSITION_END,a).emulateTransitionEnd(s)}else a()}else e&&e()},t._adjustDialog=function(){var e=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&e&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!e&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var e=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(e.left+e.right)
      ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",customClass:"",sanitize:!0,sanitizeFn:null,whiteList:Rn,popperConfig:null},ci={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},hi={HIDE:"hide"+Yn,HIDDEN:"hidden"+Yn,SHOW:"show"+Yn,SHOWN:"shown"+Yn,INSERTED:"inserted"+Yn,CLICK:"click"+Yn,FOCUSIN:"focusin"+Yn,FOCUSOUT:"focusout"+Yn,MOUSEENTER:"mouseenter"+Yn,MOUSELEAVE:"mouseleave"+Yn},ui=function(){function e(e,t){if(void 0===a.default)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var t=e.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(e){if(this._isEnabled)if(e){var t=this.constructor.DATA_KEY,n=r.default(e.currentTarget).data(t);n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),r.default(e.currentTarget).data(t,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(r.default(this.getTipElement()).hasClass(Gn))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),r.default.removeData(this.element,this.constructor.DATA_KEY),r.default(this.element).off(this.constructor.EVENT_KEY),r.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&r.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===r.default(this.element).css("display"))throw new Error("Please use show on visible elements");var t=r.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){r.default(this.element).trigger(t);var n=v.findShadowRoot(this.element),i=r.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var s=this.getTipElement(),o=v.getUID(this.constructor.NAME);s.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&r.default(s).addClass(Zn);var l="function"==typeof this.config.placement?this.config.placement.call(this,s,this.element):this.config.placement,d=this._getAttachment(l);this.addAttachmentClass(d);var c=this._getContainer();r.default(s).data(this.constructor.DATA_KEY,this),r.default.contains(this.element.ownerDocument.documentElement,this.tip)||r.default(s).appendTo(c),r.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new a.default(this.element,s,this._getPopperConfig(d)),r.default(s).addClass(Gn),r.default(s).addClass(this.config.customClass),"ontouchstart"in document.documentElement&&r.default(document.body).children().on("mouseover",null,r.default.noop);var h=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,r.default(e.element).trigger(e.constructor.Event.SHOWN),t===ti&&e._leave(null,e)};if(r.default(this.tip).hasClass(Zn)){var u=v.getTransitionDurationFromElement(this.tip);r.default(this.tip).one(v.TRANSITION_END,h).emulateTransitionEnd(u)}else h()}},t.hide=function(e){var t=this,n=this.getTipElement(),i=r.default.Event(this.constructor.Event.HIDE),a=function(){t._hoverState!==ei&&n.parentNode&&n.parentNode.removeChild(n),t._cleanTipClass(),t.element.removeAttribute("aria-describedby"),r.default(t.element).trigger(t.constructor.Event.HIDDEN),null!==t._popper&&t._popper.destroy(),e&&e()};if(r.default(this.element).trigger(i),!i.isDefaultPrevented()){if(r.default(n).removeClass(Gn),"ontouchstart"in document.documentElement&&r.default(document.body).children().off("mouseover",null,r.default.noop),this._activeTrigger[si]=!1,this._activeTrigger[ai]=!1,this._activeTrigger[ri]=!1,r.default(this.tip).hasClass(Zn)){var s=v.getTransitionDurationFromElement(n);r.default(n).one(v.TRANSITION_END,a).emulateTransitionEnd(s)}else a();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(e){r.default(this.getTipElement()).addClass(Xn+"-"+e)},t.getTipElement=function(){return this.tip=this.tip||r.default(this.config.template)[0],this.tip},t.setContent=function(){var e=this.getTipElement();this.setElementContent(r.default(e.querySelectorAll(ni)),this.getTitle()),r.default(e).removeClass(Zn+" "+Gn)},t.setElementContent=function(e,t){"object"!=typeof t||!t.nodeType&&!t.jquery?this.config.html?(this.config.sanitize&&(t=Bn(t,this.config.whiteList,this.config.sanitizeFn)),e.html(t)):e.text(t):this.config.html?r.default(t).parent().is(e)||e.empty().append(t):e.text(r.default(t).text())},t.getTitle=function(){var e=this.element.getAttribute("data-original-title");return e||(e="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),e},t._getPopperConfig=function(e){var t=this;return l({},{placement:e,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:ii},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){return t._handlePopperPlacementChange(e)}},this.config.popperConfig)},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:v.isElement(this.config.container)?r.default(this.config.container):r.default(document).find(this.config.container)},t._getAttachment=function(e){return li[e.toUpperCase()]},t._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach((function(t){if("click"===t)r.default(e.element).on(e.constructor.Event.CLICK,e.config.selector,(function(t){return e.toggle(t)}));else if(t!==oi){var n=t===ri?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,i=t===ri?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;r.default(e.element).on(n,e.config.selector,(function(t){return e._enter(t)})).on(i,e.config.selector,(function(t){return e._leave(t)}))}})),this._hideModalHandler=function(){e.element&&e.hide()},r.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==e)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(e,t){var n=this.constructor.DATA_KEY;(t=t||r.default(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),r.default(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusin"===e.type?ai:ri]=!0),r.default(t.getTipElement()).hasClass(Gn)||t._hoverState===ei?t._hoverState=ei:(clearTimeout(t._timeout),t._hoverState=ei,t.config.delay&&t.config.delay.show?t._timeout=setTimeout((function(){t._hoverState===ei&&t.show()}),t.config.delay.show):t.show())},t._leave=function(e,t){var n=this.constructor.DATA_KEY;(t=t||r.default(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),r.default(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusout"===e.type?ai:ri]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState=ti,t.config.delay&&t.config.delay.hide?t._timeout=setTimeout((function(){t._hoverState===ti&&t.hide()}),t.config.delay.hide):t.hide())},t._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},t._getConfig=function(e){var t=r.default(this.element).data();return Object.keys(t).forEach((function(e){-1!==Jn.indexOf(e)&&delete t[e]})),"number"==typeof(e=l({},this.constructor.Default,t,"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),v.typeCheckConfig(zn,e,this.constructor.DefaultType),e.sanitize&&(e.template=Bn(e.template,e.whiteList,e.sanitizeFn)),e},t._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},t._cleanTipClass=function(){var e=r.default(this.getTipElement()),t=e.attr("class").match(Qn);null!==t&&t.length&&e.removeClass(t.join(""))},t._handlePopperPlacementChange=function(e){this.tip=e.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},t._fixTransition=function(){var e=this.getTipElement(),t=this.config.animation;null===e.getAttribute("x-placement")&&(r.default(e).removeClass(Zn),this.config.animation=!1,this.hide(),this.show(),this.config.animation=t)},e._jQueryInterface=function(t){return this.each((function(){var n=r.default(this),i=n.data(Vn),a="object"==typeof t&&t;if((i||!/dispose|hide/.test(t))&&(i||(i=new e(this,a),n.data(Vn,i)),"string"==typeof t)){if(void 0===i[t])throw new TypeError('No method named "'+t+'"');i[t]()}}))},o(e,null,[{key:"VERSION",get:function(){return Wn}},{key:"Default",get:function(){return di}},{key:"NAME",get:function(){return zn}},{key:"DATA_KEY",get:function(){return Vn}},{key:"Event",get:function(){return hi}},{key:"EVENT_KEY",get:function(){return Yn}},{key:"DefaultType",get:function(){return ci}}]),e}();r.default.fn[zn]=ui._jQueryInterface,r.default.fn[zn].Constructor=ui,r.default.fn[zn].noConflict=function(){return r.default.fn[zn]=Kn,ui._jQueryInterface};var fi="popover",pi="4.6.2",gi="bs.popover",mi="."+gi,_i=r.default.fn[fi],vi="bs-popover",yi=new RegExp("(^|\\s)"+vi+"\\S+","g"),bi="fade",wi="show",ki=".popover-header",xi=".popover-body",ji=l({},ui.Default,{placement:"right",trigger:"click",content:"",template:''}),Ci=l({},ui.DefaultType,{content:"(string|element|function)"}),Ti={HIDE:"hide"+mi,HIDDEN:"hidden"+mi,SHOW:"show"+mi,SHOWN:"shown"+mi,INSERTED:"inserted"+mi,CLICK:"click"+mi,FOCUSIN:"focusin"+mi,FOCUSOUT:"focusout"+mi,MOUSEENTER:"mouseenter"+mi,MOUSELEAVE:"mouseleave"+mi},Ei=function(e){function t(){return e.apply(this,arguments)||this}d(t,e);var n=t.prototype;return n.isWithContent=function(){return this.getTitle()||this._getContent()},n.addAttachmentClass=function(e){r.default(this.getTipElement()).addClass(vi+"-"+e)},n.getTipElement=function(){return this.tip=this.tip||r.default(this.config.template)[0],this.tip},n.setContent=function(){var e=r.default(this.getTipElement());this.setElementContent(e.find(ki),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this.element)),this.setElementContent(e.find(xi),t),e.removeClass(bi+" "+wi)},n._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},n._cleanTipClass=function(){var e=r.default(this.getTipElement()),t=e.attr("class").match(yi);null!==t&&t.length>0&&e.removeClass(t.join(""))},t._jQueryInterface=function(e){return this.each((function(){var n=r.default(this).data(gi),i="object"==typeof e?e:null;if((n||!/dispose|hide/.test(e))&&(n||(n=new t(this,i),r.default(this).data(gi,n)),"string"==typeof e)){if(void 0===n[e])throw new TypeError('No method named "'+e+'"');n[e]()}}))},o(t,null,[{key:"VERSION",get:function(){return pi}},{key:"Default",get:function(){return ji}},{key:"NAME",get:function(){return fi}},{key:"DATA_KEY",get:function(){return gi}},{key:"Event",get:function(){return Ti}},{key:"EVENT_KEY",get:function(){return mi}},{key:"DefaultType",get:function(){return Ci}}]),t}(ui);r.default.fn[fi]=Ei._jQueryInterface,r.default.fn[fi].Constructor=Ei,r.default.fn[fi].noConflict=function(){return r.default.fn[fi]=_i,Ei._jQueryInterface};var Di="scrollspy",Si="4.6.2",Ai="bs.scrollspy",Oi="."+Ai,Ni=".data-api",Li=r.default.fn[Di],Ii="dropdown-item",Mi="active",Pi="activate"+Oi,Fi="scroll"+Oi,$i="load"+Oi+Ni,Ri="offset",qi="position",Hi='[data-spy="scroll"]',Ui=".nav, .list-group",Bi=".nav-link",zi=".nav-item",Wi=".list-group-item",Vi=".dropdown",Yi=".dropdown-item",Ki=".dropdown-toggle",Xi={offset:10,method:"auto",target:""},Qi={offset:"number",method:"string",target:"(string|element)"},Ji=function(){function e(e,t){var n=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(t),this._selector=this._config.target+" "+Bi+","+this._config.target+" "+Wi+","+this._config.target+" "+Yi,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,r.default(this._scrollElement).on(Fi,(function(e){return n._process(e)})),this.refresh(),this._process()}var t=e.prototype;return t.refresh=function(){var e=this,t=this._scrollElement===this._scrollElement.window?Ri:qi,n="auto"===this._config.method?t:this._config.method,i=n===qi?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(e){var t,a=v.getSelectorFromElement(e);if(a&&(t=document.querySelector(a)),t){var s=t.getBoundingClientRect();if(s.width||s.height)return[r.default(t)[n]().top+i,a]}return null})).filter(Boolean).sort((function(e,t){return e[0]-t[0]})).forEach((function(t){e._offsets.push(t[0]),e._targets.push(t[1])}))},t.dispose=function(){r.default.removeData(this._element,Ai),r.default(this._scrollElement).off(Oi),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},t._getConfig=function(e){if("string"!=typeof(e=l({},Xi,"object"==typeof e&&e?e:{})).target&&v.isElement(e.target)){var t=r.default(e.target).attr("id");t||(t=v.getUID(Di),r.default(e.target).attr("id",t)),e.target="#"+t}return v.typeCheckConfig(Di,e,Qi),e},t._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},t._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},t._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},t._process=function(){var e=this._getScrollTop()+this._config.offset,t=this._getScrollHeight(),n=this._config.offset+t-this._getOffsetHeight();if(this._scrollHeight!==t&&this.refresh(),e>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&e0)return this._activeTarget=null,void this._clear();for(var r=this._offsets.length;r--;)this._activeTarget!==this._targets[r]&&e>=this._offsets[r]&&(void 0===this._offsets[r+1]||e0&&t-1 in e)}function E(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}C.fn=C.prototype={jquery:x,constructor:C,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=C.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return C.each(this,e)},map:function(e){return this.pushStack(C.map(this,(function(t,n){return e.call(t,n,t)})))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(C.grep(this,(function(e,t){return(t+1)%2})))},odd:function(){return this.pushStack(C.grep(this,(function(e,t){return t%2})))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n+~]|"+O+")"+O+"*"),H=new RegExp(O+"|>"),U=new RegExp(F),B=new RegExp("^"+L+"$"),z={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),bool:new RegExp("^(?:"+T+")$","i"),needsContext:new RegExp("^"+O+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,V=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,X=new RegExp("\\\\[\\da-fA-F]{1,6}"+O+"?|\\\\([^\\r\\n\\f])","g"),Q=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},J=function(){le()},Z=ue((function(e){return!0===e.disabled&&E(e,"fieldset")}),{dir:"parentNode",next:"legend"});try{g.apply(a=o.call(M.childNodes),M.childNodes),a[M.childNodes.length].nodeType}catch(e){g={apply:function(e,t){P.apply(e,o.call(t))},call:function(e){P.apply(e,o.call(arguments,1))}}}function G(e,t,n,i){var r,a,s,o,d,c,f,p=t&&t.ownerDocument,v=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==v&&9!==v&&11!==v)return n;if(!i&&(le(t),t=t||l,h)){if(11!==v&&(d=Y.exec(e)))if(r=d[1]){if(9===v){if(!(s=t.getElementById(r)))return n;if(s.id===r)return g.call(n,s),n}else if(p&&(s=p.getElementById(r))&&G.contains(t,s)&&s.id===r)return g.call(n,s),n}else{if(d[2])return g.apply(n,t.getElementsByTagName(e)),n;if((r=d[3])&&t.getElementsByClassName)return g.apply(n,t.getElementsByClassName(r)),n}if(!(x[e+" "]||u&&u.test(e))){if(f=e,p=t,1===v&&(H.test(e)||q.test(e))){for((p=K.test(e)&&oe(t.parentNode)||t)==t&&m.scope||((o=t.getAttribute("id"))?o=C.escapeSelector(o):t.setAttribute("id",o=_)),a=(c=ce(e)).length;a--;)c[a]=(o?"#"+o:":scope")+" "+he(c[a]);f=c.join(",")}try{return g.apply(n,p.querySelectorAll(f)),n}catch(t){x(e,!0)}finally{o===_&&t.removeAttribute("id")}}}return ve(e.replace(N,"$1"),t,n,i)}function ee(){var e=[];return function n(i,r){return e.push(i+" ")>t.cacheLength&&delete n[e.shift()],n[i+" "]=r}}function te(e){return e[_]=!0,e}function ne(e){var t=l.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ie(e){return function(t){return E(t,"input")&&t.type===e}}function re(e){return function(t){return(E(t,"input")||E(t,"button"))&&t.type===e}}function ae(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&Z(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function se(e){return te((function(t){return t=+t,te((function(n,i){for(var r,a=e([],n.length,t),s=a.length;s--;)n[r=a[s]]&&(n[r]=!(i[r]=n[r]))}))}))}function oe(e){return e&&void 0!==e.getElementsByTagName&&e}function le(e){var n,i=e?e.ownerDocument||e:M;return i!=l&&9===i.nodeType&&i.documentElement?(d=(l=i).documentElement,h=!C.isXMLDoc(l),p=d.matches||d.webkitMatchesSelector||d.msMatchesSelector,d.msMatchesSelector&&M!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",J),m.getById=ne((function(e){return d.appendChild(e).id=C.expando,!l.getElementsByName||!l.getElementsByName(C.expando).length})),m.disconnectedMatch=ne((function(e){return p.call(e,"*")})),m.scope=ne((function(){return l.querySelectorAll(":scope")})),m.cssHas=ne((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}})),m.getById?(t.filter.ID=function(e){var t=e.replace(X,Q);return function(e){return e.getAttribute("id")===t}},t.find.ID=function(e,t){if(void 0!==t.getElementById&&h){var n=t.getElementById(e);return n?[n]:[]}}):(t.filter.ID=function(e){var t=e.replace(X,Q);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},t.find.ID=function(e,t){if(void 0!==t.getElementById&&h){var n,i,r,a=t.getElementById(e);if(a){if((n=a.getAttributeNode("id"))&&n.value===e)return[a];for(r=t.getElementsByName(e),i=0;a=r[i++];)if((n=a.getAttributeNode("id"))&&n.value===e)return[a]}return[]}}),t.find.TAG=function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},t.find.CLASS=function(e,t){if(void 0!==t.getElementsByClassName&&h)return t.getElementsByClassName(e)},u=[],ne((function(e){var t;d.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||u.push("\\["+O+"*(?:value|"+T+")"),e.querySelectorAll("[id~="+_+"-]").length||u.push("~="),e.querySelectorAll("a#"+_+"+*").length||u.push(".#.+[+~]"),e.querySelectorAll(":checked").length||u.push(":checked"),(t=l.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),d.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&u.push(":enabled",":disabled"),(t=l.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||u.push("\\["+O+"*name"+O+"*="+O+"*(?:''|\"\")")})),m.cssHas||u.push(":has"),u=u.length&&new RegExp(u.join("|")),j=function(e,t){if(e===t)return s=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!m.sortDetached&&t.compareDocumentPosition(e)===n?e===l||e.ownerDocument==M&&G.contains(M,e)?-1:t===l||t.ownerDocument==M&&G.contains(M,t)?1:r?c.call(r,e)-c.call(r,t):0:4&n?-1:1)},l):l}for(e in G.matches=function(e,t){return G(e,null,null,t)},G.matchesSelector=function(e,t){if(le(e),h&&!x[t+" "]&&(!u||!u.test(t)))try{var n=p.call(e,t);if(n||m.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){x(t,!0)}return G(t,l,null,[e]).length>0},G.contains=function(e,t){return(e.ownerDocument||e)!=l&&le(e),C.contains(e,t)},G.attr=function(e,n){(e.ownerDocument||e)!=l&&le(e);var i=t.attrHandle[n.toLowerCase()],r=i&&f.call(t.attrHandle,n.toLowerCase())?i(e,n,!h):void 0;return void 0!==r?r:e.getAttribute(n)},G.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},C.uniqueSort=function(e){var t,n=[],i=0,a=0;if(s=!m.sortStable,r=!m.sortStable&&o.call(e,0),S.call(e,j),s){for(;t=e[a++];)t===e[a]&&(i=n.push(a));for(;i--;)A.call(e,n[i],1)}return r=null,e},C.fn.uniqueSort=function(){return this.pushStack(C.uniqueSort(o.apply(this)))},t=C.expr={cacheLength:50,createPseudo:te,match:z,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(X,Q),e[3]=(e[3]||e[4]||e[5]||"").replace(X,Q),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||G.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&G.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return z.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&U.test(n)&&(t=ce(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(X,Q).toLowerCase();return"*"===e?function(){return!0}:function(e){return E(e,t)}},CLASS:function(e){var t=b[e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&b(e,(function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,n){return function(i){var r=G.attr(i,e);return null==r?"!="===t:!t||(r+="","="===t?r===n:"!="===t?r!==n:"^="===t?n&&0===r.indexOf(n):"*="===t?n&&r.indexOf(n)>-1:"$="===t?n&&r.slice(-n.length)===n:"~="===t?(" "+r.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(r===n||r.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,i,r){var a="nth"!==e.slice(0,3),s="last"!==e.slice(-4),o="of-type"===t;return 1===i&&0===r?function(e){return!!e.parentNode}:function(t,n,l){var d,c,h,u,f,p=a!==s?"nextSibling":"previousSibling",g=t.parentNode,m=o&&t.nodeName.toLowerCase(),y=!l&&!o,b=!1;if(g){if(a){for(;p;){for(h=t;h=h[p];)if(o?E(h,m):1===h.nodeType)return!1;f=p="only"===e&&!f&&"nextSibling"}return!0}if(f=[s?g.firstChild:g.lastChild],s&&y){for(b=(u=(d=(c=g[_]||(g[_]={}))[e]||[])[0]===v&&d[1])&&d[2],h=u&&g.childNodes[u];h=++u&&h&&h[p]||(b=u=0)||f.pop();)if(1===h.nodeType&&++b&&h===t){c[e]=[v,u,b];break}}else if(y&&(b=u=(d=(c=t[_]||(t[_]={}))[e]||[])[0]===v&&d[1]),!1===b)for(;(h=++u&&h&&h[p]||(b=u=0)||f.pop())&&(!(o?E(h,m):1===h.nodeType)||!++b||(y&&((c=h[_]||(h[_]={}))[e]=[v,b]),h!==t)););return(b-=r)===i||b%i==0&&b/i>=0}}},PSEUDO:function(e,n){var i,r=t.pseudos[e]||t.setFilters[e.toLowerCase()]||G.error("unsupported pseudo: "+e);return r[_]?r(n):r.length>1?(i=[e,e,"",n],t.setFilters.hasOwnProperty(e.toLowerCase())?te((function(e,t){for(var i,a=r(e,n),s=a.length;s--;)e[i=c.call(e,a[s])]=!(t[i]=a[s])})):function(e){return r(e,0,i)}):r}},pseudos:{not:te((function(e){var t=[],n=[],i=_e(e.replace(N,"$1"));return i[_]?te((function(e,t,n,r){for(var a,s=i(e,null,r,[]),o=e.length;o--;)(a=s[o])&&(e[o]=!(t[o]=a))})):function(e,r,a){return t[0]=e,i(t,null,a,n),t[0]=null,!n.pop()}})),has:te((function(e){return function(t){return G(e,t).length>0}})),contains:te((function(e){return e=e.replace(X,Q),function(t){return(t.textContent||C.text(t)).indexOf(e)>-1}})),lang:te((function(e){return B.test(e||"")||G.error("unsupported lang: "+e),e=e.replace(X,Q).toLowerCase(),function(t){var n;do{if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}})),target:function(e){var t=i.location&&i.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===d},focus:function(e){return e===function(){try{return l.activeElement}catch(e){}}()&&l.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:ae(!1),disabled:ae(!0),checked:function(e){return E(e,"input")&&!!e.checked||E(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!t.pseudos.empty(e)},header:function(e){return V.test(e.nodeName)},input:function(e){return W.test(e.nodeName)},button:function(e){return E(e,"input")&&"button"===e.type||E(e,"button")},text:function(e){var t;return E(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:se((function(){return[0]})),last:se((function(e,t){return[t-1]})),eq:se((function(e,t,n){return[n<0?n+t:n]})),even:se((function(e,t){for(var n=0;nt?t:n;--i>=0;)e.push(i);return e})),gt:se((function(e,t,n){for(var i=n<0?n+t:n;++i1?function(t,n,i){for(var r=e.length;r--;)if(!e[r](t,n,i))return!1;return!0}:e[0]}function pe(e,t,n,i,r){for(var a,s=[],o=0,l=e.length,d=null!=t;o-1&&(a[d]=!(s[d]=u))}}else f=pe(f===s?f.splice(_,f.length):f),r?r(null,s,f,l):g.apply(s,f)}))}function me(e){for(var i,r,a,s=e.length,o=t.relative[e[0].type],l=o||t.relative[" "],d=o?1:0,h=ue((function(e){return e===i}),l,!0),u=ue((function(e){return c.call(i,e)>-1}),l,!0),f=[function(e,t,r){var a=!o&&(r||t!=n)||((i=t).nodeType?h(e,t,r):u(e,t,r));return i=null,a}];d1&&fe(f),d>1&&he(e.slice(0,d-1).concat({value:" "===e[d-2].type?"*":""})).replace(N,"$1"),r,d0,a=e.length>0,s=function(s,o,d,c,u){var f,p,m,_=0,y="0",b=s&&[],w=[],k=n,x=s||a&&t.find.TAG("*",u),j=v+=null==k?1:Math.random()||.1,T=x.length;for(u&&(n=o==l||o||u);y!==T&&null!=(f=x[y]);y++){if(a&&f){for(p=0,o||f.ownerDocument==l||(le(f),d=!h);m=e[p++];)if(m(f,o||l,d)){g.call(c,f);break}u&&(v=j)}r&&((f=!m&&f)&&_--,s&&b.push(f))}if(_+=y,r&&y!==_){for(p=0;m=i[p++];)m(b,w,o,d);if(s){if(_>0)for(;y--;)b[y]||w[y]||(w[y]=D.call(c));w=pe(w)}g.apply(c,w),u&&!s&&w.length>0&&_+i.length>1&&C.uniqueSort(c)}return u&&(v=j,n=k),b};return r?te(s):s}(s,a)),o.selector=e}return o}function ve(e,n,i,r){var a,s,o,l,d,c="function"==typeof e&&e,u=!r&&ce(e=c.selector||e);if(i=i||[],1===u.length){if((s=u[0]=u[0].slice(0)).length>2&&"ID"===(o=s[0]).type&&9===n.nodeType&&h&&t.relative[s[1].type]){if(!(n=(t.find.ID(o.matches[0].replace(X,Q),n)||[])[0]))return i;c&&(n=n.parentNode),e=e.slice(s.shift().value.length)}for(a=z.needsContext.test(e)?0:s.length;a--&&(o=s[a],!t.relative[l=o.type]);)if((d=t.find[l])&&(r=d(o.matches[0].replace(X,Q),K.test(s[0].type)&&oe(n.parentNode)||n))){if(s.splice(a,1),!(e=r.length&&he(s)))return g.apply(i,r),i;break}}return(c||_e(e,u))(r,n,!h,i,!n||K.test(e)&&oe(n.parentNode)||n),i}de.prototype=t.filters=t.pseudos,t.setFilters=new de,m.sortStable=_.split("").sort(j).join("")===_,le(),m.sortDetached=ne((function(e){return 1&e.compareDocumentPosition(l.createElement("fieldset"))})),C.find=G,C.expr[":"]=C.expr.pseudos,C.unique=C.uniqueSort,G.compile=_e,G.select=ve,G.setDocument=le,G.tokenize=ce,G.escape=C.escapeSelector,G.getText=C.text,G.isXML=C.isXMLDoc,G.selectors=C.expr,G.support=C.support,G.uniqueSort=C.uniqueSort}();var F=function(e,t,n){for(var i=[],r=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(r&&C(e).is(n))break;i.push(e)}return i},$=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},R=C.expr.match.needsContext,q=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function H(e,t,n){return _(t)?C.grep(e,(function(e,i){return!!t.call(e,i,e)!==n})):t.nodeType?C.grep(e,(function(e){return e===t!==n})):"string"!=typeof t?C.grep(e,(function(e){return c.call(t,e)>-1!==n})):C.filter(t,e,n)}C.filter=function(e,t,n){var i=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===i.nodeType?C.find.matchesSelector(i,e)?[i]:[]:C.find.matches(e,C.grep(t,(function(e){return 1===e.nodeType})))},C.fn.extend({find:function(e){var t,n,i=this.length,r=this;if("string"!=typeof e)return this.pushStack(C(e).filter((function(){for(t=0;t1?C.uniqueSort(n):n},filter:function(e){return this.pushStack(H(this,e||[],!1))},not:function(e){return this.pushStack(H(this,e||[],!0))},is:function(e){return!!H(this,"string"==typeof e&&R.test(e)?C(e):e||[],!1).length}});var U,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(C.fn.init=function(e,t,n){var i,r;if(!e)return this;if(n=n||U,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:B.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof C?t[0]:t,C.merge(this,C.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:y,!0)),q.test(i[1])&&C.isPlainObject(t))for(i in t)_(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(r=y.getElementById(i[2]))&&(this[0]=r,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):_(e)?void 0!==n.ready?n.ready(e):e(C):C.makeArray(e,this)}).prototype=C.fn,U=C(y);var z=/^(?:parents|prev(?:Until|All))/,W={children:!0,contents:!0,next:!0,prev:!0};function V(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}C.fn.extend({has:function(e){var t=C(e,this),n=t.length;return this.filter((function(){for(var e=0;e-1:1===n.nodeType&&C.find.matchesSelector(n,e))){a.push(n);break}return this.pushStack(a.length>1?C.uniqueSort(a):a)},index:function(e){return e?"string"==typeof e?c.call(C(e),this[0]):c.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(C.uniqueSort(C.merge(this.get(),C(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),C.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return F(e,"parentNode")},parentsUntil:function(e,t,n){return F(e,"parentNode",n)},next:function(e){return V(e,"nextSibling")},prev:function(e){return V(e,"previousSibling")},nextAll:function(e){return F(e,"nextSibling")},prevAll:function(e){return F(e,"previousSibling")},nextUntil:function(e,t,n){return F(e,"nextSibling",n)},prevUntil:function(e,t,n){return F(e,"previousSibling",n)},siblings:function(e){return $((e.parentNode||{}).firstChild,e)},children:function(e){return $(e.firstChild)},contents:function(e){return null!=e.contentDocument&&s(e.contentDocument)?e.contentDocument:(E(e,"template")&&(e=e.content||e),C.merge([],e.childNodes))}},(function(e,t){C.fn[e]=function(n,i){var r=C.map(this,t,n);return"Until"!==e.slice(-5)&&(i=n),i&&"string"==typeof i&&(r=C.filter(i,r)),this.length>1&&(W[e]||C.uniqueSort(r),z.test(e)&&r.reverse()),this.pushStack(r)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(e){return e}function X(e){throw e}function Q(e,t,n,i){var r;try{e&&_(r=e.promise)?r.call(e).done(t).fail(n):e&&_(r=e.then)?r.call(e,t,n):t.apply(void 0,[e].slice(i))}catch(e){n.apply(void 0,[e])}}C.Callbacks=function(e){e="string"==typeof e?function(e){var t={};return C.each(e.match(Y)||[],(function(e,n){t[n]=!0})),t}(e):C.extend({},e);var t,n,i,r,a=[],s=[],o=-1,l=function(){for(r=r||e.once,i=t=!0;s.length;o=-1)for(n=s.shift();++o-1;)a.splice(n,1),n<=o&&o--})),this},has:function(e){return e?C.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return r=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return r=s=[],n||t||(a=n=""),this},locked:function(){return!!r},fireWith:function(e,n){return r||(n=[e,(n=n||[]).slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return d.fireWith(this,arguments),this},fired:function(){return!!i}};return d},C.extend({Deferred:function(e){var t=[["notify","progress",C.Callbacks("memory"),C.Callbacks("memory"),2],["resolve","done",C.Callbacks("once memory"),C.Callbacks("once memory"),0,"resolved"],["reject","fail",C.Callbacks("once memory"),C.Callbacks("once memory"),1,"rejected"]],n="pending",r={state:function(){return n},always:function(){return a.done(arguments).fail(arguments),this},catch:function(e){return r.then(null,e)},pipe:function(){var e=arguments;return C.Deferred((function(n){C.each(t,(function(t,i){var r=_(e[i[4]])&&e[i[4]];a[i[1]]((function(){var e=r&&r.apply(this,arguments);e&&_(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,r?[e]:arguments)}))})),e=null})).promise()},then:function(e,n,r){var a=0;function s(e,t,n,r){return function(){var o=this,l=arguments,d=function(){var i,d;if(!(e=a&&(n!==X&&(o=void 0,l=[i]),t.rejectWith(o,l))}};e?c():(C.Deferred.getErrorHook?c.error=C.Deferred.getErrorHook():C.Deferred.getStackHook&&(c.error=C.Deferred.getStackHook()),i.setTimeout(c))}}return C.Deferred((function(i){t[0][3].add(s(0,i,_(r)?r:K,i.notifyWith)),t[1][3].add(s(0,i,_(e)?e:K)),t[2][3].add(s(0,i,_(n)?n:X))})).promise()},promise:function(e){return null!=e?C.extend(e,r):r}},a={};return C.each(t,(function(e,i){var s=i[2],o=i[5];r[i[1]]=s.add,o&&s.add((function(){n=o}),t[3-e][2].disable,t[3-e][3].disable,t[0][2].lock,t[0][3].lock),s.add(i[3].fire),a[i[0]]=function(){return a[i[0]+"With"](this===a?void 0:this,arguments),this},a[i[0]+"With"]=s.fireWith})),r.promise(a),e&&e.call(a,a),a},when:function(e){var t=arguments.length,n=t,i=Array(n),r=o.call(arguments),a=C.Deferred(),s=function(e){return function(n){i[e]=this,r[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(i,r)}};if(t<=1&&(Q(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||_(r[n]&&r[n].then)))return a.then();for(;n--;)Q(r[n],s(n),a.reject);return a.promise()}});var J=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;C.Deferred.exceptionHook=function(e,t){i.console&&i.console.warn&&e&&J.test(e.name)&&i.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},C.readyException=function(e){i.setTimeout((function(){throw e}))};var Z=C.Deferred();function G(){y.removeEventListener("DOMContentLoaded",G),i.removeEventListener("load",G),C.ready()}C.fn.ready=function(e){return Z.then(e).catch((function(e){C.readyException(e)})),this},C.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--C.readyWait:C.isReady)||(C.isReady=!0,!0!==e&&--C.readyWait>0||Z.resolveWith(y,[C]))}}),C.ready.then=Z.then,"complete"===y.readyState||"loading"!==y.readyState&&!y.documentElement.doScroll?i.setTimeout(C.ready):(y.addEventListener("DOMContentLoaded",G),i.addEventListener("load",G));var ee=function(e,t,n,i,r,a,s){var o=0,l=e.length,d=null==n;if("object"===k(n))for(o in r=!0,n)ee(e,t,o,n[o],!0,a,s);else if(void 0!==i&&(r=!0,_(i)||(s=!0),d&&(s?(t.call(e,i),t=null):(d=t,t=function(e,t,n){return d.call(C(e),n)})),t))for(;o1,null,!0)},removeData:function(e){return this.each((function(){le.remove(this,e)}))}}),C.extend({queue:function(e,t,n){var i;if(e)return t=(t||"fx")+"queue",i=oe.get(e,t),n&&(!i||Array.isArray(n)?i=oe.access(e,t,C.makeArray(n)):i.push(n)),i||[]},dequeue:function(e,t){t=t||"fx";var n=C.queue(e,t),i=n.length,r=n.shift(),a=C._queueHooks(e,t);"inprogress"===r&&(r=n.shift(),i--),r&&("fx"===t&&n.unshift("inprogress"),delete a.stop,r.call(e,(function(){C.dequeue(e,t)}),a)),!i&&a&&a.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return oe.get(e,n)||oe.access(e,n,{empty:C.Callbacks("once memory").add((function(){oe.remove(e,[t+"queue",n])}))})}}),C.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ee=/^$|^module$|\/(?:java|ecma)script/i;xe=y.createDocumentFragment().appendChild(y.createElement("div")),(je=y.createElement("input")).setAttribute("type","radio"),je.setAttribute("checked","checked"),je.setAttribute("name","t"),xe.appendChild(je),m.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",m.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",m.option=!!xe.lastChild;var De={thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function Se(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&E(e,t)?C.merge([e],n):n}function Ae(e,t){for(var n=0,i=e.length;n",""]);var Oe=/<|&#?\w+;/;function Ne(e,t,n,i,r){for(var a,s,o,l,d,c,h=t.createDocumentFragment(),u=[],f=0,p=e.length;f-1)r&&r.push(a);else if(d=me(a),s=Se(h.appendChild(a),"script"),d&&Ae(s),n)for(c=0;a=s[c++];)Ee.test(a.type||"")&&n.push(a);return h}var Le=/^([^.]*)(?:\.(.+)|)/;function Ie(){return!0}function Me(){return!1}function Pe(e,t,n,i,r,a){var s,o;if("object"==typeof t){for(o in"string"!=typeof n&&(i=i||n,n=void 0),t)Pe(e,o,n,i,t[o],a);return e}if(null==i&&null==r?(r=n,i=n=void 0):null==r&&("string"==typeof n?(r=i,i=void 0):(r=i,i=n,n=void 0)),!1===r)r=Me;else if(!r)return e;return 1===a&&(s=r,r=function(e){return C().off(e),s.apply(this,arguments)},r.guid=s.guid||(s.guid=C.guid++)),e.each((function(){C.event.add(this,t,r,i,n)}))}function Fe(e,t,n){n?(oe.set(e,t,!1),C.event.add(e,t,{namespace:!1,handler:function(e){var n,i=oe.get(this,t);if(1&e.isTrigger&&this[t]){if(i)(C.event.special[t]||{}).delegateType&&e.stopPropagation();else if(i=o.call(arguments),oe.set(this,t,i),this[t](),n=oe.get(this,t),oe.set(this,t,!1),i!==n)return e.stopImmediatePropagation(),e.preventDefault(),n}else i&&(oe.set(this,t,C.event.trigger(i[0],i.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Ie)}})):void 0===oe.get(e,t)&&C.event.add(e,t,Ie)}C.event={global:{},add:function(e,t,n,i,r){var a,s,o,l,d,c,h,u,f,p,g,m=oe.get(e);if(ae(e))for(n.handler&&(n=(a=n).handler,r=a.selector),r&&C.find.matchesSelector(ge,r),n.guid||(n.guid=C.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(t){return void 0!==C&&C.event.triggered!==t.type?C.event.dispatch.apply(e,arguments):void 0}),d=(t=(t||"").match(Y)||[""]).length;d--;)f=g=(o=Le.exec(t[d])||[])[1],p=(o[2]||"").split(".").sort(),f&&(h=C.event.special[f]||{},f=(r?h.delegateType:h.bindType)||f,h=C.event.special[f]||{},c=C.extend({type:f,origType:g,data:i,handler:n,guid:n.guid,selector:r,needsContext:r&&C.expr.match.needsContext.test(r),namespace:p.join(".")},a),(u=l[f])||((u=l[f]=[]).delegateCount=0,h.setup&&!1!==h.setup.call(e,i,p,s)||e.addEventListener&&e.addEventListener(f,s)),h.add&&(h.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),r?u.splice(u.delegateCount++,0,c):u.push(c),C.event.global[f]=!0)},remove:function(e,t,n,i,r){var a,s,o,l,d,c,h,u,f,p,g,m=oe.hasData(e)&&oe.get(e);if(m&&(l=m.events)){for(d=(t=(t||"").match(Y)||[""]).length;d--;)if(f=g=(o=Le.exec(t[d])||[])[1],p=(o[2]||"").split(".").sort(),f){for(h=C.event.special[f]||{},u=l[f=(i?h.delegateType:h.bindType)||f]||[],o=o[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=a=u.length;a--;)c=u[a],!r&&g!==c.origType||n&&n.guid!==c.guid||o&&!o.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(u.splice(a,1),c.selector&&u.delegateCount--,h.remove&&h.remove.call(e,c));s&&!u.length&&(h.teardown&&!1!==h.teardown.call(e,p,m.handle)||C.removeEvent(e,f,m.handle),delete l[f])}else for(f in l)C.event.remove(e,f+t[d],n,i,!0);C.isEmptyObject(l)&&oe.remove(e,"handle events")}},dispatch:function(e){var t,n,i,r,a,s,o=new Array(arguments.length),l=C.event.fix(e),d=(oe.get(this,"events")||Object.create(null))[l.type]||[],c=C.event.special[l.type]||{};for(o[0]=l,t=1;t=1))for(;d!==this;d=d.parentNode||this)if(1===d.nodeType&&("click"!==e.type||!0!==d.disabled)){for(a=[],s={},n=0;n-1:C.find(r,this,null,[d]).length),s[r]&&a.push(i);a.length&&o.push({elem:d,handlers:a})}return d=this,l\s*$/g;function He(e,t){return E(e,"table")&&E(11!==t.nodeType?t:t.firstChild,"tr")&&C(e).children("tbody")[0]||e}function Ue(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Be(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function ze(e,t){var n,i,r,a,s,o;if(1===t.nodeType){if(oe.hasData(e)&&(o=oe.get(e).events))for(r in oe.remove(t,"handle events"),o)for(n=0,i=o[r].length;n1&&"string"==typeof p&&!m.checkClone&&Re.test(p))return e.each((function(r){var a=e.eq(r);g&&(t[0]=p.call(this,r,a.html())),Ve(a,t,n,i)}));if(u&&(a=(r=Ne(t,e[0].ownerDocument,!1,e,i)).firstChild,1===r.childNodes.length&&(r=a),a||i)){for(o=(s=C.map(Se(r,"script"),Ue)).length;h0&&Ae(s,!l&&Se(e,"script")),o},cleanData:function(e){for(var t,n,i,r=C.event.special,a=0;void 0!==(n=e[a]);a++)if(ae(n)){if(t=n[oe.expando]){if(t.events)for(i in t.events)r[i]?C.event.remove(n,i):C.removeEvent(n,i,t.handle);n[oe.expando]=void 0}n[le.expando]&&(n[le.expando]=void 0)}}}),C.fn.extend({detach:function(e){return Ye(this,e,!0)},remove:function(e){return Ye(this,e)},text:function(e){return ee(this,(function(e){return void 0===e?C.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return Ve(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||He(this,e).appendChild(e)}))},prepend:function(){return Ve(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=He(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return Ve(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return Ve(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(C.cleanData(Se(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map((function(){return C.clone(this,e,t)}))},html:function(e){return ee(this,(function(e){var t=this[0]||{},n=0,i=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!$e.test(e)&&!De[(Te.exec(e)||["",""])[1].toLowerCase()]){e=C.htmlPrefilter(e);try{for(;n=0&&(l+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-a-l-o-.5))||0),l+d}function ct(e,t,n){var i=Qe(e),r=(!m.boxSizingReliable()||n)&&"border-box"===C.css(e,"boxSizing",!1,i),a=r,s=Ge(e,t,i),o="offset"+t[0].toUpperCase()+t.slice(1);if(Ke.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&r||!m.reliableTrDimensions()&&E(e,"tr")||"auto"===s||!parseFloat(s)&&"inline"===C.css(e,"display",!1,i))&&e.getClientRects().length&&(r="border-box"===C.css(e,"boxSizing",!1,i),(a=o in e)&&(s=e[o])),(s=parseFloat(s)||0)+dt(e,t,n||(r?"border":"content"),a,i,s)+"px"}function ht(e,t,n,i,r){return new ht.prototype.init(e,t,n,i,r)}C.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Ge(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var r,a,s,o=re(t),l=Xe.test(t),d=e.style;if(l||(t=rt(o)),s=C.cssHooks[t]||C.cssHooks[o],void 0===n)return s&&"get"in s&&void 0!==(r=s.get(e,!1,i))?r:d[t];"string"===(a=typeof n)&&(r=fe.exec(n))&&r[1]&&(n=ye(e,t,r),a="number"),null!=n&&n==n&&("number"!==a||l||(n+=r&&r[3]||(C.cssNumber[o]?"":"px")),m.clearCloneStyle||""!==n||0!==t.indexOf("background")||(d[t]="inherit"),s&&"set"in s&&void 0===(n=s.set(e,n,i))||(l?d.setProperty(t,n):d[t]=n))}},css:function(e,t,n,i){var r,a,s,o=re(t);return Xe.test(t)||(t=rt(o)),(s=C.cssHooks[t]||C.cssHooks[o])&&"get"in s&&(r=s.get(e,!0,n)),void 0===r&&(r=Ge(e,t,i)),"normal"===r&&t in ot&&(r=ot[t]),""===n||n?(a=parseFloat(r),!0===n||isFinite(a)?a||0:r):r}}),C.each(["height","width"],(function(e,t){C.cssHooks[t]={get:function(e,n,i){if(n)return!at.test(C.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?ct(e,t,i):Je(e,st,(function(){return ct(e,t,i)}))},set:function(e,n,i){var r,a=Qe(e),s=!m.scrollboxSize()&&"absolute"===a.position,o=(s||i)&&"border-box"===C.css(e,"boxSizing",!1,a),l=i?dt(e,t,i,o,a):0;return o&&s&&(l-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(a[t])-dt(e,t,"border",!1,a)-.5)),l&&(r=fe.exec(n))&&"px"!==(r[3]||"px")&&(e.style[t]=n,n=C.css(e,t)),lt(0,n,l)}}})),C.cssHooks.marginLeft=et(m.reliableMarginLeft,(function(e,t){if(t)return(parseFloat(Ge(e,"marginLeft"))||e.getBoundingClientRect().left-Je(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),C.each({margin:"",padding:"",border:"Width"},(function(e,t){C.cssHooks[e+t]={expand:function(n){for(var i=0,r={},a="string"==typeof n?n.split(" "):[n];i<4;i++)r[e+pe[i]+t]=a[i]||a[i-2]||a[0];return r}},"margin"!==e&&(C.cssHooks[e+t].set=lt)})),C.fn.extend({css:function(e,t){return ee(this,(function(e,t,n){var i,r,a={},s=0;if(Array.isArray(t)){for(i=Qe(e),r=t.length;s1)}}),C.Tween=ht,ht.prototype={constructor:ht,init:function(e,t,n,i,r,a){this.elem=e,this.prop=n,this.easing=r||C.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=i,this.unit=a||(C.cssNumber[n]?"":"px")},cur:function(){var e=ht.propHooks[this.prop];return e&&e.get?e.get(this):ht.propHooks._default.get(this)},run:function(e){var t,n=ht.propHooks[this.prop];return this.options.duration?this.pos=t=C.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ht.propHooks._default.set(this),this}},ht.prototype.init.prototype=ht.prototype,ht.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=C.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){C.fx.step[e.prop]?C.fx.step[e.prop](e):1!==e.elem.nodeType||!C.cssHooks[e.prop]&&null==e.elem.style[rt(e.prop)]?e.elem[e.prop]=e.now:C.style(e.elem,e.prop,e.now+e.unit)}}},ht.propHooks.scrollTop=ht.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},C.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},C.fx=ht.prototype.init,C.fx.step={};var ut,ft,pt=/^(?:toggle|show|hide)$/,gt=/queueHooks$/;function mt(){ft&&(!1===y.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(mt):i.setTimeout(mt,C.fx.interval),C.fx.tick())}function _t(){return i.setTimeout((function(){ut=void 0})),ut=Date.now()}function vt(e,t){var n,i=0,r={height:e};for(t=t?1:0;i<4;i+=2-t)r["margin"+(n=pe[i])]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function yt(e,t,n){for(var i,r=(bt.tweeners[t]||[]).concat(bt.tweeners["*"]),a=0,s=r.length;a1)},removeAttr:function(e){return this.each((function(){C.removeAttr(this,e)}))}}),C.extend({attr:function(e,t,n){var i,r,a=e.nodeType;if(3!==a&&8!==a&&2!==a)return void 0===e.getAttribute?C.prop(e,t,n):(1===a&&C.isXMLDoc(e)||(r=C.attrHooks[t.toLowerCase()]||(C.expr.match.bool.test(t)?wt:void 0)),void 0!==n?null===n?void C.removeAttr(e,t):r&&"set"in r&&void 0!==(i=r.set(e,n,t))?i:(e.setAttribute(t,n+""),n):r&&"get"in r&&null!==(i=r.get(e,t))?i:null==(i=C.find.attr(e,t))?void 0:i)},attrHooks:{type:{set:function(e,t){if(!m.radioValue&&"radio"===t&&E(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,i=0,r=t&&t.match(Y);if(r&&1===e.nodeType)for(;n=r[i++];)e.removeAttribute(n)}}),wt={set:function(e,t,n){return!1===t?C.removeAttr(e,n):e.setAttribute(n,n),n}},C.each(C.expr.match.bool.source.match(/\w+/g),(function(e,t){var n=kt[t]||C.find.attr;kt[t]=function(e,t,i){var r,a,s=t.toLowerCase();return i||(a=kt[s],kt[s]=r,r=null!=n(e,t,i)?s:null,kt[s]=a),r}}));var xt=/^(?:input|select|textarea|button)$/i,jt=/^(?:a|area)$/i;function Ct(e){return(e.match(Y)||[]).join(" ")}function Tt(e){return e.getAttribute&&e.getAttribute("class")||""}function Et(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(Y)||[]}C.fn.extend({prop:function(e,t){return ee(this,C.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[C.propFix[e]||e]}))}}),C.extend({prop:function(e,t,n){var i,r,a=e.nodeType;if(3!==a&&8!==a&&2!==a)return 1===a&&C.isXMLDoc(e)||(t=C.propFix[t]||t,r=C.propHooks[t]),void 0!==n?r&&"set"in r&&void 0!==(i=r.set(e,n,t))?i:e[t]=n:r&&"get"in r&&null!==(i=r.get(e,t))?i:e[t]},propHooks:{tabIndex:{get:function(e){var t=C.find.attr(e,"tabindex");return t?parseInt(t,10):xt.test(e.nodeName)||jt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(C.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),C.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){C.propFix[this.toLowerCase()]=this})),C.fn.extend({addClass:function(e){var t,n,i,r,a,s;return _(e)?this.each((function(t){C(this).addClass(e.call(this,t,Tt(this)))})):(t=Et(e)).length?this.each((function(){if(i=Tt(this),n=1===this.nodeType&&" "+Ct(i)+" "){for(a=0;a-1;)n=n.replace(" "+r+" "," ");s=Ct(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(e,t){var n,i,r,a,s=typeof e,o="string"===s||Array.isArray(e);return _(e)?this.each((function(n){C(this).toggleClass(e.call(this,n,Tt(this),t),t)})):"boolean"==typeof t&&o?t?this.addClass(e):this.removeClass(e):(n=Et(e),this.each((function(){if(o)for(a=C(this),r=0;r-1)return!0;return!1}});var Dt=/\r/g;C.fn.extend({val:function(e){var t,n,i,r=this[0];return arguments.length?(i=_(e),this.each((function(n){var r;1===this.nodeType&&(null==(r=i?e.call(this,n,C(this).val()):e)?r="":"number"==typeof r?r+="":Array.isArray(r)&&(r=C.map(r,(function(e){return null==e?"":e+""}))),(t=C.valHooks[this.type]||C.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,r,"value")||(this.value=r))}))):r?(t=C.valHooks[r.type]||C.valHooks[r.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(r,"value"))?n:"string"==typeof(n=r.value)?n.replace(Dt,""):null==n?"":n:void 0}}),C.extend({valHooks:{option:{get:function(e){var t=C.find.attr(e,"value");return null!=t?t:Ct(C.text(e))}},select:{get:function(e){var t,n,i,r=e.options,a=e.selectedIndex,s="select-one"===e.type,o=s?null:[],l=s?a+1:r.length;for(i=a<0?l:s?a:0;i-1)&&(n=!0);return n||(e.selectedIndex=-1),a}}}}),C.each(["radio","checkbox"],(function(){C.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=C.inArray(C(e).val(),t)>-1}},m.checkOn||(C.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}));var St=i.location,At={guid:Date.now()},Ot=/\?/;C.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new i.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||C.error("Invalid XML: "+(n?C.map(n.childNodes,(function(e){return e.textContent})).join("\n"):e)),t};var Nt=/^(?:focusinfocus|focusoutblur)$/,Lt=function(e){e.stopPropagation()};C.extend(C.event,{trigger:function(e,t,n,r){var a,s,o,l,d,c,h,u,p=[n||y],g=f.call(e,"type")?e.type:e,m=f.call(e,"namespace")?e.namespace.split("."):[];if(s=u=o=n=n||y,3!==n.nodeType&&8!==n.nodeType&&!Nt.test(g+C.event.triggered)&&(g.indexOf(".")>-1&&(m=g.split("."),g=m.shift(),m.sort()),d=g.indexOf(":")<0&&"on"+g,(e=e[C.expando]?e:new C.Event(g,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=m.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:C.makeArray(t,[e]),h=C.event.special[g]||{},r||!h.trigger||!1!==h.trigger.apply(n,t))){if(!r&&!h.noBubble&&!v(n)){for(l=h.delegateType||g,Nt.test(l+g)||(s=s.parentNode);s;s=s.parentNode)p.push(s),o=s;o===(n.ownerDocument||y)&&p.push(o.defaultView||o.parentWindow||i)}for(a=0;(s=p[a++])&&!e.isPropagationStopped();)u=s,e.type=a>1?l:h.bindType||g,(c=(oe.get(s,"events")||Object.create(null))[e.type]&&oe.get(s,"handle"))&&c.apply(s,t),(c=d&&s[d])&&c.apply&&ae(s)&&(e.result=c.apply(s,t),!1===e.result&&e.preventDefault());return e.type=g,r||e.isDefaultPrevented()||h._default&&!1!==h._default.apply(p.pop(),t)||!ae(n)||d&&_(n[g])&&!v(n)&&((o=n[d])&&(n[d]=null),C.event.triggered=g,e.isPropagationStopped()&&u.addEventListener(g,Lt),n[g](),e.isPropagationStopped()&&u.removeEventListener(g,Lt),C.event.triggered=void 0,o&&(n[d]=o)),e.result}},simulate:function(e,t,n){var i=C.extend(new C.Event,n,{type:e,isSimulated:!0});C.event.trigger(i,null,t)}}),C.fn.extend({trigger:function(e,t){return this.each((function(){C.event.trigger(e,t,this)}))},triggerHandler:function(e,t){var n=this[0];if(n)return C.event.trigger(e,t,n,!0)}});var It=/\[\]$/,Mt=/\r?\n/g,Pt=/^(?:submit|button|image|reset|file)$/i,Ft=/^(?:input|select|textarea|keygen)/i;function $t(e,t,n,i){var r;if(Array.isArray(t))C.each(t,(function(t,r){n||It.test(e)?i(e,r):$t(e+"["+("object"==typeof r&&null!=r?t:"")+"]",r,n,i)}));else if(n||"object"!==k(t))i(e,t);else for(r in t)$t(e+"["+r+"]",t[r],n,i)}C.param=function(e,t){var n,i=[],r=function(e,t){var n=_(t)?t():t;i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!C.isPlainObject(e))C.each(e,(function(){r(this.name,this.value)}));else for(n in e)$t(n,e[n],t,r);return i.join("&")},C.fn.extend({serialize:function(){return C.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=C.prop(this,"elements");return e?C.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!C(this).is(":disabled")&&Ft.test(this.nodeName)&&!Pt.test(e)&&(this.checked||!Ce.test(e))})).map((function(e,t){var n=C(this).val();return null==n?null:Array.isArray(n)?C.map(n,(function(e){return{name:t.name,value:e.replace(Mt,"\r\n")}})):{name:t.name,value:n.replace(Mt,"\r\n")}})).get()}});var Rt=/%20/g,qt=/#.*$/,Ht=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)$/gm,Bt=/^(?:GET|HEAD)$/,zt=/^\/\//,Wt={},Vt={},Yt="*/".concat("*"),Kt=y.createElement("a");function Xt(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var i,r=0,a=t.toLowerCase().match(Y)||[];if(_(n))for(;i=a[r++];)"+"===i[0]?(i=i.slice(1)||"*",(e[i]=e[i]||[]).unshift(n)):(e[i]=e[i]||[]).push(n)}}function Qt(e,t,n,i){var r={},a=e===Vt;function s(o){var l;return r[o]=!0,C.each(e[o]||[],(function(e,o){var d=o(t,n,i);return"string"!=typeof d||a||r[d]?a?!(l=d):void 0:(t.dataTypes.unshift(d),s(d),!1)})),l}return s(t.dataTypes[0])||!r["*"]&&s("*")}function Jt(e,t){var n,i,r=C.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((r[n]?e:i||(i={}))[n]=t[n]);return i&&C.extend(!0,e,i),e}Kt.href=St.href,C.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:St.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(St.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Yt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":C.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Jt(Jt(e,C.ajaxSettings),t):Jt(C.ajaxSettings,e)},ajaxPrefilter:Xt(Wt),ajaxTransport:Xt(Vt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var n,r,a,s,o,l,d,c,h,u,f=C.ajaxSetup({},t),p=f.context||f,g=f.context&&(p.nodeType||p.jquery)?C(p):C.event,m=C.Deferred(),_=C.Callbacks("once memory"),v=f.statusCode||{},b={},w={},k="canceled",x={readyState:0,getResponseHeader:function(e){var t;if(d){if(!s)for(s={};t=Ut.exec(a);)s[t[1].toLowerCase()+" "]=(s[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=s[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return d?a:null},setRequestHeader:function(e,t){return null==d&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==d&&(f.mimeType=e),this},statusCode:function(e){var t;if(e)if(d)x.always(e[x.status]);else for(t in e)v[t]=[v[t],e[t]];return this},abort:function(e){var t=e||k;return n&&n.abort(t),j(0,t),this}};if(m.promise(x),f.url=((e||f.url||St.href)+"").replace(zt,St.protocol+"//"),f.type=t.method||t.type||f.method||f.type,f.dataTypes=(f.dataType||"*").toLowerCase().match(Y)||[""],null==f.crossDomain){l=y.createElement("a");try{l.href=f.url,l.href=l.href,f.crossDomain=Kt.protocol+"//"+Kt.host!=l.protocol+"//"+l.host}catch(e){f.crossDomain=!0}}if(f.data&&f.processData&&"string"!=typeof f.data&&(f.data=C.param(f.data,f.traditional)),Qt(Wt,f,t,x),d)return x;for(h in(c=C.event&&f.global)&&0==C.active++&&C.event.trigger("ajaxStart"),f.type=f.type.toUpperCase(),f.hasContent=!Bt.test(f.type),r=f.url.replace(qt,""),f.hasContent?f.data&&f.processData&&0===(f.contentType||"").indexOf("application/x-www-form-urlencoded")&&(f.data=f.data.replace(Rt,"+")):(u=f.url.slice(r.length),f.data&&(f.processData||"string"==typeof f.data)&&(r+=(Ot.test(r)?"&":"?")+f.data,delete f.data),!1===f.cache&&(r=r.replace(Ht,"$1"),u=(Ot.test(r)?"&":"?")+"_="+At.guid+++u),f.url=r+u),f.ifModified&&(C.lastModified[r]&&x.setRequestHeader("If-Modified-Since",C.lastModified[r]),C.etag[r]&&x.setRequestHeader("If-None-Match",C.etag[r])),(f.data&&f.hasContent&&!1!==f.contentType||t.contentType)&&x.setRequestHeader("Content-Type",f.contentType),x.setRequestHeader("Accept",f.dataTypes[0]&&f.accepts[f.dataTypes[0]]?f.accepts[f.dataTypes[0]]+("*"!==f.dataTypes[0]?", "+Yt+"; q=0.01":""):f.accepts["*"]),f.headers)x.setRequestHeader(h,f.headers[h]);if(f.beforeSend&&(!1===f.beforeSend.call(p,x,f)||d))return x.abort();if(k="abort",_.add(f.complete),x.done(f.success),x.fail(f.error),n=Qt(Vt,f,t,x)){if(x.readyState=1,c&&g.trigger("ajaxSend",[x,f]),d)return x;f.async&&f.timeout>0&&(o=i.setTimeout((function(){x.abort("timeout")}),f.timeout));try{d=!1,n.send(b,j)}catch(e){if(d)throw e;j(-1,e)}}else j(-1,"No Transport");function j(e,t,s,l){var h,u,y,b,w,k=t;d||(d=!0,o&&i.clearTimeout(o),n=void 0,a=l||"",x.readyState=e>0?4:0,h=e>=200&&e<300||304===e,s&&(b=function(e,t,n){for(var i,r,a,s,o=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=e.mimeType||t.getResponseHeader("Content-Type"));if(i)for(r in o)if(o[r]&&o[r].test(i)){l.unshift(r);break}if(l[0]in n)a=l[0];else{for(r in n){if(!l[0]||e.converters[r+" "+l[0]]){a=r;break}s||(s=r)}a=a||s}if(a)return a!==l[0]&&l.unshift(a),n[a]}(f,x,s)),!h&&C.inArray("script",f.dataTypes)>-1&&C.inArray("json",f.dataTypes)<0&&(f.converters["text script"]=function(){}),b=function(e,t,n,i){var r,a,s,o,l,d={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)d[s.toLowerCase()]=e.converters[s];for(a=c.shift();a;)if(e.responseFields[a]&&(n[e.responseFields[a]]=t),!l&&i&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=a,a=c.shift())if("*"===a)a=l;else if("*"!==l&&l!==a){if(!(s=d[l+" "+a]||d["* "+a]))for(r in d)if((o=r.split(" "))[1]===a&&(s=d[l+" "+o[0]]||d["* "+o[0]])){!0===s?s=d[r]:!0!==d[r]&&(a=o[0],c.unshift(o[1]));break}if(!0!==s)if(s&&e.throws)t=s(t);else try{t=s(t)}catch(e){return{state:"parsererror",error:s?e:"No conversion from "+l+" to "+a}}}return{state:"success",data:t}}(f,b,x,h),h?(f.ifModified&&((w=x.getResponseHeader("Last-Modified"))&&(C.lastModified[r]=w),(w=x.getResponseHeader("etag"))&&(C.etag[r]=w)),204===e||"HEAD"===f.type?k="nocontent":304===e?k="notmodified":(k=b.state,u=b.data,h=!(y=b.error))):(y=k,!e&&k||(k="error",e<0&&(e=0))),x.status=e,x.statusText=(t||k)+"",h?m.resolveWith(p,[u,k,x]):m.rejectWith(p,[x,k,y]),x.statusCode(v),v=void 0,c&&g.trigger(h?"ajaxSuccess":"ajaxError",[x,f,h?u:y]),_.fireWith(p,[x,k]),c&&(g.trigger("ajaxComplete",[x,f]),--C.active||C.event.trigger("ajaxStop")))}return x},getJSON:function(e,t,n){return C.get(e,t,n,"json")},getScript:function(e,t){return C.get(e,void 0,t,"script")}}),C.each(["get","post"],(function(e,t){C[t]=function(e,n,i,r){return _(n)&&(r=r||i,i=n,n=void 0),C.ajax(C.extend({url:e,type:t,dataType:r,data:n,success:i},C.isPlainObject(e)&&e))}})),C.ajaxPrefilter((function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")})),C._evalUrl=function(e,t,n){return C.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){C.globalEval(e,t,n)}})},C.fn.extend({wrapAll:function(e){var t;return this[0]&&(_(e)&&(e=e.call(this[0])),t=C(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return _(e)?this.each((function(t){C(this).wrapInner(e.call(this,t))})):this.each((function(){var t=C(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)}))},wrap:function(e){var t=_(e);return this.each((function(n){C(this).wrapAll(t?e.call(this,n):e)}))},unwrap:function(e){return this.parent(e).not("body").each((function(){C(this).replaceWith(this.childNodes)})),this}}),C.expr.pseudos.hidden=function(e){return!C.expr.pseudos.visible(e)},C.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},C.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(e){}};var Zt={0:200,1223:204},Gt=C.ajaxSettings.xhr();m.cors=!!Gt&&"withCredentials"in Gt,m.ajax=Gt=!!Gt,C.ajaxTransport((function(e){var t,n;if(m.cors||Gt&&!e.crossDomain)return{send:function(r,a){var s,o=e.xhr();if(o.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(s in e.xhrFields)o[s]=e.xhrFields[s];for(s in e.mimeType&&o.overrideMimeType&&o.overrideMimeType(e.mimeType),e.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest"),r)o.setRequestHeader(s,r[s]);t=function(e){return function(){t&&(t=n=o.onload=o.onerror=o.onabort=o.ontimeout=o.onreadystatechange=null,"abort"===e?o.abort():"error"===e?"number"!=typeof o.status?a(0,"error"):a(o.status,o.statusText):a(Zt[o.status]||o.status,o.statusText,"text"!==(o.responseType||"text")||"string"!=typeof o.responseText?{binary:o.response}:{text:o.responseText},o.getAllResponseHeaders()))}},o.onload=t(),n=o.onerror=o.ontimeout=t("error"),void 0!==o.onabort?o.onabort=n:o.onreadystatechange=function(){4===o.readyState&&i.setTimeout((function(){t&&n()}))},t=t("abort");try{o.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}})),C.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),C.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return C.globalEval(e),e}}}),C.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),C.ajaxTransport("script",(function(e){var t,n;if(e.crossDomain||e.scriptAttrs)return{send:function(i,r){t=C(" - + From 782686c9fcd42c6428a099f0abf534a6746304e3 Mon Sep 17 00:00:00 2001 From: Dave Roberts <145559566+droberts-ctrlo@users.noreply.github.com> Date: Wed, 4 Feb 2026 14:35:14 +0000 Subject: [PATCH 9/9] Jest cleanup (#601) * Formatted test and config code and updated test files Also removed extra yarn commands that weren't needed, and automated download of browserslist updates on build. * Update autosave.test.ts * Updated filter where typeahead is missed * Update component.js * Reset erroneous changes * Removed invalid import where required * Update package.json * Updated error handler Updated error handler * Updated ts-ignore where this was causing issues with linting and checking correctness * Updated layoutbuilder to ensure cypress tests pass --- .github/workflows/tests.yml | 2 + .../support/builders/layout/LayoutBuilder.ts | 1 - jest.config.js | 300 +-- package.json | 13 +- .../components/button/lib/common.test.ts | 14 +- .../components/button/lib/component.test.ts | 26 +- .../button/lib/create-report-button.test.ts | 4 +- .../button/lib/delete-button.test.ts | 78 + .../components/button/lib/delete-button.ts | 5 +- .../button/lib/remove-curval-button.test.js | 64 + .../button/lib/show-blank-button.test.ts | 32 + .../button/lib/submit-field-button.test.ts | 9 +- src/frontend/components/card/lib/component.js | 1 + .../components/card/lib/component.test.ts | 185 ++ .../collapsible/lib/component.test.ts | 57 + .../dashboard/lib/react/Footer.test.tsx | 120 + .../dashboard/lib/react/Header.test.tsx | 35 + .../components/data-table/lib/helper.test.ts | 75 + .../form-group/autosave/lib/autosave.test.ts | 5 +- .../form-group/select-widget/lib/component.js | 1 - .../form-group/value-lookup/lib/component.js | 6 +- .../help-view/lib/component.test.ts | 19 +- src/frontend/js/lib/set-field-value.test.ts | 34 +- .../actionsHandler/lib/actionsLoader.test.ts | 7 +- .../lib/clearAutorecoverAction.test.ts | 3 +- .../util/actionsHandler/lib/handler.test.ts | 4 +- src/frontend/js/lib/util/common.test.ts | 20 +- src/frontend/js/lib/util/common.ts | 8 +- .../util/domutils/lib/elementFactory.test.ts | 13 +- .../lib/encryptedStorage.test.ts | 8 +- .../errorHandler/lib/errorHandler.test.ts | 2 - .../js/lib/util/filedrag/lib/filedrag.test.ts | 7 +- .../js/lib/util/formatters/lua.test.ts | 25 +- .../js/lib/util/formatters/markdown.test.ts | 13 +- .../util/gadsStorage/lib/AppStorage.test.ts | 9 +- .../util/gadsStorage/lib/GadsStorage.test.ts | 17 +- .../util/gadsStorage/lib/NullStorage.test.ts | 3 +- .../js/lib/util/mapper/formdataMapper.test.ts | 1 + .../js/lib/util/mapper/mapper.test.ts | 1 + .../lib/storageProvider.test.ts | 4 +- .../typeahead/lib/TypeaheadBuilder.test.ts | 4 +- .../js/lib/util/upload/UploadControl.test.ts | 4 +- src/frontend/testing/extensions.ts | 17 + src/frontend/testing/globals.definitions.ts | 16 +- src/frontend/testing/setup.ts | 14 + tsconfig.json | 82 +- yarn.lock | 2091 ++++++++++------- 47 files changed, 2260 insertions(+), 1199 deletions(-) create mode 100644 src/frontend/components/button/lib/delete-button.test.ts create mode 100644 src/frontend/components/button/lib/remove-curval-button.test.js create mode 100644 src/frontend/components/button/lib/show-blank-button.test.ts create mode 100644 src/frontend/components/card/lib/component.test.ts create mode 100644 src/frontend/components/collapsible/lib/component.test.ts create mode 100644 src/frontend/components/dashboard/lib/react/Footer.test.tsx create mode 100644 src/frontend/components/dashboard/lib/react/Header.test.tsx create mode 100644 src/frontend/components/data-table/lib/helper.test.ts create mode 100644 src/frontend/testing/extensions.ts create mode 100644 src/frontend/testing/setup.ts diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6a11290d6..ecbb26547 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -5,6 +5,7 @@ on: - master - dev - hotfix + - dev-bootstrap paths-ignore: - '*.md' - VERSION @@ -13,6 +14,7 @@ on: - master - dev - hotfix + - dev-bootstrap paths-ignore: - '*.md' - VERSION diff --git a/cypress/support/builders/layout/LayoutBuilder.ts b/cypress/support/builders/layout/LayoutBuilder.ts index a9a04c0fe..3f1a55cde 100644 --- a/cypress/support/builders/layout/LayoutBuilder.ts +++ b/cypress/support/builders/layout/LayoutBuilder.ts @@ -222,6 +222,5 @@ class CurvalLayoutBuilder extends LayoutBuilderBase implements ICurvalLayoutBuil cy.get("label") .contains(this.field) .click(); - //Someone owes me a drink! } } diff --git a/jest.config.js b/jest.config.js index f7fea59ff..4a0879c5c 100644 --- a/jest.config.js +++ b/jest.config.js @@ -5,202 +5,206 @@ /** @type {import('jest').Config} */ const config = { - // All imported modules in your tests should be mocked automatically - // automock: false, + // All imported modules in your tests should be mocked automatically + // automock: false, + + // Stop running tests after `n` failures + // bail: 0, + + // The directory where Jest should store its cached dependency information + // cacheDirectory: "/tmp/jest_rt", + + // Automatically clear mock calls, instances, contexts and results before every test + // clearMocks: false, + + // Indicates whether the coverage information should be collected while executing the test + // collectCoverage: false, - // Stop running tests after `n` failures - // bail: 0, + // An array of glob patterns indicating a set of files for which coverage information should be collected + // collectCoverageFrom: undefined, - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/tmp/jest_rt", + // The directory where Jest should output its coverage files + // coverageDirectory: undefined, - // Automatically clear mock calls, instances, contexts and results before every test - // clearMocks: false, + // An array of regexp pattern strings used to skip coverage collection + // coveragePathIgnorePatterns: [ + // "/node_modules/" + // ], - // Indicates whether the coverage information should be collected while executing the test - // collectCoverage: false, + // Indicates which provider should be used to instrument code for coverage + // coverageProvider: "babel", - // An array of glob patterns indicating a set of files for which coverage information should be collected - // collectCoverageFrom: undefined, + // A list of reporter names that Jest uses when writing coverage reports + // coverageReporters: [ + // "json", + // "text", + // "lcov", + // "clover" + // ], - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, + // An object that configures minimum threshold enforcement for coverage results + // coverageThreshold: undefined, - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], + // A path to a custom dependency extractor + // dependencyExtractor: undefined, - // Indicates which provider should be used to instrument code for coverage - // coverageProvider: "babel", + // Make calling deprecated APIs throw helpful error messages + // errorOnDeprecated: false, - // A list of reporter names that Jest uses when writing coverage reports - // coverageReporters: [ - // "json", - // "text", - // "lcov", - // "clover" - // ], + // The default configuration for fake timers + // fakeTimers: { + // "enableGlobally": false + // }, - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, + // Force coverage collection from ignored files using an array of glob patterns + // forceCoverageMatch: [], - // A path to a custom dependency extractor - // dependencyExtractor: undefined, + // A path to a module which exports an async function that is triggered once before all test suites + // globalSetup: undefined, - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, + // A path to a module which exports an async function that is triggered once after all test suites + // globalTeardown: undefined, - // The default configuration for fake timers - // fakeTimers: { - // "enableGlobally": false - // }, + // A set of global variables that need to be available in all test environments + // globals: {}, - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], + // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. + // maxWorkers: "50%", - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, + // An array of directory names to be searched recursively up from the requiring module's location + // moduleDirectories: [ + // "node_modules" + // ], - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, + // An array of file extensions your modules use + // moduleFileExtensions: [ + // "js", + // "mjs", + // "cjs", + // "jsx", + // "ts", + // "tsx", + // "json", + // "node" + // ], - // A set of global variables that need to be available in all test environments - // globals: {}, + // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module + moduleNameMapper: { + "^component$": "/src/frontend/js/lib/component", + "^validation$": "/src/frontend/js/lib/validation", + "^logging$": "/src/frontend/js/lib/logging", + "^util/(.*)$": "/src/frontend/js/lib/util/$1", + "^components/(.*)$": "/src/frontend/components/$1", + "^set-field-values$": "/src/frontend/js/lib/set-field-values", + "^guid$": "/src/frontend/js/lib/guid", + "^testing/(.*)$": "/src/frontend/testing/$1", + }, - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", + // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader + // modulePathIgnorePatterns: [], - // An array of directory names to be searched recursively up from the requiring module's location - // moduleDirectories: [ - // "node_modules" - // ], + // Activates notifications for test results + // notify: false, - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "mjs", - // "cjs", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], + // An enum that specifies notification mode. Requires { notify: true } + // notifyMode: "failure-change", - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - moduleNameMapper: { - "^component$": "/src/frontend/js/lib/component", - "^validation$": "/src/frontend/js/lib/validation", - "^logging$": "/src/frontend/js/lib/logging", - "^util/(.*)$": "/src/frontend/js/lib/util/$1", - "^components/(.*)$": "/src/frontend/components/$1", - "^set-field-values$": "/src/frontend/js/lib/set-field-values", - "^guid$": "/src/frontend/js/lib/guid", - }, + // A preset that is used as a base for Jest's configuration + // preset: undefined, - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], + // Run tests from one or more projects + // projects: undefined, - // Activates notifications for test results - // notify: false, + // Use this configuration option to add custom reporters to Jest + // reporters: undefined, - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", + // Automatically reset mock state before every test + // resetMocks: false, - // A preset that is used as a base for Jest's configuration - // preset: undefined, + // Reset the module registry before running each individual test + // resetModules: false, - // Run tests from one or more projects - // projects: undefined, + // A path to a custom resolver + // resolver: undefined, - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, + // Automatically restore mock state and implementation before every test + // restoreMocks: false, - // Automatically reset mock state before every test - // resetMocks: false, + // The root directory that Jest should scan for tests and modules within + // rootDir: undefined, - // Reset the module registry before running each individual test - // resetModules: false, + // A list of paths to directories that Jest should use to search for files in + // roots: [ + // "" + // ], - // A path to a custom resolver - // resolver: undefined, + // Allows you to use a custom runner instead of Jest's default test runner + // runner: "jest-runner", - // Automatically restore mock state and implementation before every test - // restoreMocks: false, + // The paths to modules that run some code to configure or set up the testing environment before each test + setupFiles: ['/src/frontend/testing/setup.ts'], - // The root directory that Jest should scan for tests and modules within - // rootDir: undefined, + // A list of paths to modules that run some code to configure or set up the testing framework before each test + // setupFilesAfterEnv: [], - // A list of paths to directories that Jest should use to search for files in - // roots: [ - // "" - // ], + // The number of seconds after which a test is considered as slow and reported as such in the results. + // slowTestThreshold: 5, - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", + // A list of paths to snapshot serializer modules Jest should use for snapshot testing + // snapshotSerializers: [], - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], + // The test environment that will be used for testing + testEnvironment: "jsdom", - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], + // Options that will be passed to the testEnvironment + // testEnvironmentOptions: {}, - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, + // Adds a location field to test results + // testLocationInResults: false, - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], + // The glob patterns Jest uses to detect test files + // testMatch: [ + // "**/__tests__/**/*.[jt]s?(x)", + // "**/?(*.)+(spec|test).[tj]s?(x)" + // ], - // The test environment that will be used for testing - testEnvironment: "jsdom", + // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped + testPathIgnorePatterns: [ + "/node_modules", + "/cypress", + "/public", + "/handlebars" + ], - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, + // The regexp pattern or array of patterns that Jest uses to detect test files + // testRegex: [], - // Adds a location field to test results - // testLocationInResults: false, + // This option allows the use of a custom results processor + // testResultsProcessor: undefined, - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], + // This option allows use of a custom test runner + // testRunner: "jest-circus/runner", - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], + // A map from regular expressions to paths to transformers + // transform: undefined, - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], + // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation + // transformIgnorePatterns: [ + // "/node_modules/", + // "\\.pnp\\.[^\\/]+$" + // ], - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, + // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them + // unmockedModulePathPatterns: undefined, - // This option allows use of a custom test runner - // testRunner: "jest-circus/runner", + // Indicates whether each individual test should be reported during the run + // verbose: undefined, - // A map from regular expressions to paths to transformers - // transform: undefined, + // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode + // watchPathIgnorePatterns: [], - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, + // Whether to use watchman for file crawling + // watchman: true, }; module.exports = config; diff --git a/package.json b/package.json index 08d0428c1..00751886e 100644 --- a/package.json +++ b/package.json @@ -3,17 +3,12 @@ "version": "0.0.1", "private": true, "scripts": { - "build": "NODE_ENV=production webpack --progress --watch", + "build": "NODE_ENV=production webpack --progress", "lint": "eslint src", "test": "jest", - "build:dev": "webpack --env development --progress -c webpack.config.js -w", + "build:dev": "webpack --env development --progress -w", "test:watch": "jest --watch", - "e2e": "yarn cypress run", - "e2e:open": "yarn cypress open", - "e2e:chrome": "yarn cypress run --browser chrome", - "e2e:firefox": "yarn cypress run --browser firefox", - "e2e:edge": "yarn cypress run --browser edge", - "e2e:electron": "yarn cypress run --browser electron" + "e2e": "yarn cypress run" }, "dependencies": { "@egjs/hammerjs": "^2.0.0", @@ -60,6 +55,7 @@ "@babel/preset-typescript": "^7.16.7", "@babel/runtime-corejs3": "^7.14.7", "@jest/globals": "^29.7.0", + "@testing-library/react": "12", "@types/jest": "^29.5.6", "@types/jquery": "^3.5.24", "@types/jstree": "^3.3.46", @@ -71,7 +67,6 @@ "@typescript-eslint/parser": "^7.7.0", "@webpack-cli/serve": "^2.0.1", "autoprefixer": "^9.8.8", - "babel-jest": "^29.7.0", "babel-loader": "^8.2.2", "buffer": "^6.0.3", "clean-webpack-plugin": "^4.0.0", diff --git a/src/frontend/components/button/lib/common.test.ts b/src/frontend/components/button/lib/common.test.ts index 33729acaf..674324fa1 100644 --- a/src/frontend/components/button/lib/common.test.ts +++ b/src/frontend/components/button/lib/common.test.ts @@ -1,22 +1,22 @@ -import "../../../testing/globals.definitions"; -import {layoutId, recordId, table_key} from "./common"; +import { describe, it, expect } from "@jest/globals" +import { layoutId, recordId, table_key } from "./common"; -describe("Common button tests",()=>{ - it("should populate table_key",()=>{ +describe("Common button tests", () => { + it("should populate table_key", () => { expect(table_key()).toBe("linkspace-record-change-undefined-0"); // Undefined because $('body').data('layout-identifier') is not defined }); - it("should have a layoutId", ()=>{ + it("should have a layoutId", () => { $('body').data('layout-identifier', 'layoutId'); expect(layoutId()).toBe('layoutId'); }); - it("should have a recordId", ()=>{ + it("should have a recordId", () => { expect(isNaN(parseInt(location.pathname.split('/').pop() ?? ""))).toBe(true); expect(recordId()).toBe(0); }); - it("should populate table_key fully",()=>{ + it("should populate table_key fully", () => { $('body').data('layout-identifier', 'layoutId'); expect(table_key()).toBe("linkspace-record-change-layoutId-0"); }); diff --git a/src/frontend/components/button/lib/component.test.ts b/src/frontend/components/button/lib/component.test.ts index d1c128f12..f0c8bb8dd 100644 --- a/src/frontend/components/button/lib/component.test.ts +++ b/src/frontend/components/button/lib/component.test.ts @@ -1,19 +1,19 @@ -import "../../../testing/globals.definitions"; +import { describe, it, expect } from "@jest/globals" import ButtonComponent from './component'; describe("Button Component", () => { const buttonDefinitions = [ - {name: "report", class: "btn-js-report"}, - {name: "more info", class: "btn-js-more-info"}, - {name: "delete", class: "btn-js-delete"}, - {name: "submit field", class: "btn-js-submit-field"}, - {name: "add all fields", class: "btn-js-toggle-all-fields"}, - {name: "submit draft record", class: "btn-js-submit-draft-record"}, - {name: "submit record", class: "btn-js-submit-record"}, - {name: "save view", class: "btn-js-save-view"}, - {name: "show blank", class: "btn-js-show-blank"}, - {name: "curval remove", class: "btn-js-curval-remove"}, - {name: "remove unload", class: "btn-js-remove-unload"} + { name: "report", class: "btn-js-report" }, + { name: "more info", class: "btn-js-more-info" }, + { name: "delete", class: "btn-js-delete" }, + { name: "submit field", class: "btn-js-submit-field" }, + { name: "add all fields", class: "btn-js-toggle-all-fields" }, + { name: "submit draft record", class: "btn-js-submit-draft-record" }, + { name: "submit record", class: "btn-js-submit-record" }, + { name: "save view", class: "btn-js-save-view" }, + { name: "show blank", class: "btn-js-show-blank" }, + { name: "curval remove", class: "btn-js-curval-remove" }, + { name: "remove unload", class: "btn-js-remove-unload" } ]; it("should not create a button with an invalid type", () => { @@ -30,7 +30,7 @@ describe("Button Component", () => { expect(button.linkedClasses).toStrictEqual([]); }); - for(const buttonDefinition of buttonDefinitions) { + for (const buttonDefinition of buttonDefinitions) { it(`Should create a ${buttonDefinition.name} button`, () => { const buttonElement = document.createElement('button'); buttonElement.classList.add(buttonDefinition.class); diff --git a/src/frontend/components/button/lib/create-report-button.test.ts b/src/frontend/components/button/lib/create-report-button.test.ts index 88f9fc910..77d9f35b1 100644 --- a/src/frontend/components/button/lib/create-report-button.test.ts +++ b/src/frontend/components/button/lib/create-report-button.test.ts @@ -1,6 +1,6 @@ -import "../../../testing/globals.definitions"; -import {validateRequiredFields} from 'validation'; +import { validateRequiredFields } from 'validation'; import CreateReportButtonComponent from "./create-report-button"; +import { describe, it, expect, jest } from "@jest/globals" describe('create-report-button', () => { it('does not submit form if no checkboxes are checked', () => { diff --git a/src/frontend/components/button/lib/delete-button.test.ts b/src/frontend/components/button/lib/delete-button.test.ts new file mode 100644 index 000000000..ef11b3b9d --- /dev/null +++ b/src/frontend/components/button/lib/delete-button.test.ts @@ -0,0 +1,78 @@ +import { describe, it, expect } from "@jest/globals"; +import createDeleteButton from './delete-button'; + +describe('button tests', () => { + it('should throw on absence of id', () => { + const button = document.createElement('button'); + button.setAttribute('data-title', 'title'); + button.setAttribute('data-target', 'target'); + button.setAttribute('data-toggle', 'toggle'); + document.body.appendChild(button); + const $button = $(button); + createDeleteButton($button) + expect(() => { $button.trigger('click') }).toThrow('Delete button should have data attributes id, toggle and target!'); + }); + + it('should throw on absence of target', () => { + const button = document.createElement('button'); + button.setAttribute('data-title', 'title'); + button.setAttribute('data-id', 'id'); + button.setAttribute('data-toggle', 'toggle'); + document.body.appendChild(button); + const $button = $(button); + createDeleteButton($button); + expect(() => { $button.trigger('click') }).toThrow('Delete button should have data attributes id, toggle and target!'); + }); + + it('should throw on absence of toggle', () => { + const button = document.createElement('button'); + button.setAttribute('data-title', 'title'); + button.setAttribute('data-id', 'id'); + button.setAttribute('data-target', 'target'); + document.body.appendChild(button); + const $button = $(button); + createDeleteButton($button); + expect(() => { $button.trigger('click') }).toThrow('Delete button should have data attributes id, toggle and target!'); + }); + + it('should set the title of the modal', () => { + const button = document.createElement('button'); + button.setAttribute('data-title', 'title'); + button.setAttribute('data-id', 'id'); + button.setAttribute('data-target', 'target'); + button.setAttribute('data-toggle', 'toggle'); + document.body.appendChild(button); + const modal = document.createElement('div'); + modal.classList.add('modal--deletetarget'); + const title = document.createElement('div'); + title.classList.add('modal-title'); + modal.appendChild(title); + document.body.appendChild(modal); + const $button = $(button); + createDeleteButton($button); + $button.trigger('click'); + expect($(modal).find('.modal-title').text()).toBe('Delete - title'); + }); + + it('should set the id of the delete button', () => { + const button = document.createElement('button'); + button.setAttribute('data-title', 'title'); + button.setAttribute('data-id', 'id'); + button.setAttribute('data-target', 'target'); + button.setAttribute('data-toggle', 'toggle'); + document.body.appendChild(button); + const modal = document.createElement('div'); + modal.classList.add('modal--deletetarget'); + const title = document.createElement('div'); + title.classList.add('modal-title'); + modal.appendChild(title); + const submit = document.createElement('button'); + submit.setAttribute('type', 'submit'); + modal.appendChild(submit); + document.body.appendChild(modal); + const $button = $(button); + createDeleteButton($button); + $button.trigger('click'); + expect($(modal).find('button[type=submit]').val()).toBe('id'); + }) +}); diff --git a/src/frontend/components/button/lib/delete-button.ts b/src/frontend/components/button/lib/delete-button.ts index b9ac6b091..f776b7303 100644 --- a/src/frontend/components/button/lib/delete-button.ts +++ b/src/frontend/components/button/lib/delete-button.ts @@ -18,15 +18,16 @@ export default function createDeleteButton(element: JQuery) { try { if (!id || !target || !toggle) { - throw 'Delete button should have data attributes id, toggle and target!' + throw new Error('Delete button should have data attributes id, toggle and target!') } else if ($deleteModal.length === 0) { throw `There is no modal with id: ${target}` } } catch (e) { logging.error(e) - this.el.on('click', function (e: JQuery.ClickEvent) { + element.on('click', function (e: JQuery.ClickEvent) { e.stopPropagation() }); + if(window.test) throw e; } $deleteModal.find('.modal-title').text(modalTitle) diff --git a/src/frontend/components/button/lib/remove-curval-button.test.js b/src/frontend/components/button/lib/remove-curval-button.test.js new file mode 100644 index 000000000..fb52076e6 --- /dev/null +++ b/src/frontend/components/button/lib/remove-curval-button.test.js @@ -0,0 +1,64 @@ +import { jest, describe, it, expect, beforeAll, afterEach } from "@jest/globals"; +import createRemoveCurvalButton from "./remove-curval-button"; + +describe("RemoveCurvalButton", () => { + // @ts-expect-error - jest types are not complete + window.confirm = jest.fn().mockReturnValue(true); + + beforeAll(() => { + document.body.innerHTML = ""; + }); + + afterEach(() => { + document.body.innerHTML = ""; + }); + + it("should mock as expected", () => { + expect(confirm("Are you sure you wish to continue?")).toBe(true); + }); + + it('Should remove a value from a table', () => { + const table = document.createElement("table"); + table.className = "table-curval-group"; + const tbody = document.createElement("tbody"); + const tr = document.createElement("tr"); + tr.className = "table-curval-item"; + const td = document.createElement("td"); + tr.appendChild(td); + tbody.appendChild(tr); + table.appendChild(tbody); + document.body.appendChild(table); + const td2 = document.createElement("td"); + const button = document.createElement("button"); + button.className = "remove-curval"; + td2.appendChild(button); + tr.appendChild(td2); + createRemoveCurvalButton($(button)); + button.click(); + expect(table.children[0].children.length).toBe(0); + }); + + it('Should remove a value from a select widget', () => { + const selectWidget = document.createElement("div"); + selectWidget.className = "select-widget"; + const answer = document.createElement("div"); + answer.className = "answer"; + const input = document.createElement("input"); + input.id = "input"; + answer.appendChild(input); + selectWidget.appendChild(answer); + const current = document.createElement("div"); + current.className = "current"; + const li = document.createElement("li"); + li.dataset.listItem = "input"; + current.appendChild(li); + selectWidget.appendChild(current); + document.body.appendChild(selectWidget); + const button = document.createElement("button"); + button.className = "remove-curval"; + answer.appendChild(button); + createRemoveCurvalButton($(button)); + button.click(); + expect(current.children.length).toBe(0); + }); +}); diff --git a/src/frontend/components/button/lib/show-blank-button.test.ts b/src/frontend/components/button/lib/show-blank-button.test.ts new file mode 100644 index 000000000..7d36ebd01 --- /dev/null +++ b/src/frontend/components/button/lib/show-blank-button.test.ts @@ -0,0 +1,32 @@ +import { describe, it, expect, afterEach, jest } from "@jest/globals"; +import showBlankButton from "./show-blank-button"; + +describe("ShowBlankButton", () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it("shows blank fields", () => { + const element = $("
      "); + const button = $(""); + element.append(button); + const item = $("
      "); + element.append(item); + $("body").append(element); + showBlankButton(element); + button.trigger("click"); + expect(item.css("display")).not.toBe("none"); + }); + + // For some reason this won't behave as expected - disabling the test for now + it.skip("hides blank fields", () => { + const element = $("
      "); + const button = $(""); + element.append(button); + const item = $("
      "); + element.append(item); + showBlankButton(element); + button.trigger("click"); + expect(item.css("display")).toBe("none"); + }); +}); diff --git a/src/frontend/components/button/lib/submit-field-button.test.ts b/src/frontend/components/button/lib/submit-field-button.test.ts index 489e8115f..d80a761c0 100644 --- a/src/frontend/components/button/lib/submit-field-button.test.ts +++ b/src/frontend/components/button/lib/submit-field-button.test.ts @@ -1,13 +1,14 @@ -import { initGlobals } from "../../../testing/globals.definitions"; +import { describe, it, expect, beforeEach } from "@jest/globals" +import { initGlobals } from "testing/globals.definitions"; import SubmitFieldButtonComponent from "./submit-field-button"; describe("Submit field button tests", () => { - beforeEach(()=>{ + beforeEach(() => { initGlobals(); }) async function loadSubmitFieldButtonComponent(element: HTMLElement) { - const {default: SubmitFieldButtonComponent} = await import("./submit-field-button"); + const { default: SubmitFieldButtonComponent } = await import("./submit-field-button"); return new SubmitFieldButtonComponent($(element)); } @@ -36,4 +37,4 @@ describe("Submit field button tests", () => { expect($.ajax).toHaveBeenCalled(); expect(window.alert).toHaveBeenCalled(); }); -}); \ No newline at end of file +}); diff --git a/src/frontend/components/card/lib/component.js b/src/frontend/components/card/lib/component.js index c0aaa1092..fa2e28b27 100644 --- a/src/frontend/components/card/lib/component.js +++ b/src/frontend/components/card/lib/component.js @@ -1,4 +1,5 @@ import { Component } from 'component' +import "bootstrap"; class ExpandableCardComponent extends Component { constructor(element) { diff --git a/src/frontend/components/card/lib/component.test.ts b/src/frontend/components/card/lib/component.test.ts new file mode 100644 index 000000000..5acf2c1a9 --- /dev/null +++ b/src/frontend/components/card/lib/component.test.ts @@ -0,0 +1,185 @@ +import { describe, it, expect, beforeEach, afterEach } from "@jest/globals"; +import ExpandableCardComponent from "./component"; + +describe('ExpandableCardComponent', () => { + beforeEach(() => { + // Create the HTML structure for the tests + document.body.innerHTML = ` +
      +
      +
      + +
      + + + +
      +
      +
      +
      +
      +
      +
        +
      • + Surname + +
        Pig
        +
        +
      • +
      • + Forename + +
        Daddy
        +
        +
      • +
      • + Full Name + +
        Daddy Pig
        +
        +
      • +
      • + Age + 9783 +
      • +
      +
      +
      +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +`; + }); + + afterEach(() => { + document.body.innerHTML = ''; + }); + + describe('Without topic', () => { + it('Should create an expandable card component', () => { + const target = document.getElementById('target'); + expect(target).not.toBeNull(); + expect(target?.dataset.componentInitializedExpandablecardcomponent).toBeUndefined(); + new ExpandableCardComponent(target as HTMLElement); + expect(target?.dataset.componentInitializedExpandablecardcomponent).toBe('true'); + expect(target?.classList.contains('card--edit')).toBe(false); + }); + + it('Should go into edit mode', () => { + const target = document.getElementById('target'); + if (!target) throw new Error('Target not found'); + new ExpandableCardComponent(target as HTMLElement); + const editButton = target.querySelector('.btn-js-edit') as HTMLButtonElement; + expect(editButton).not.toBeNull(); + editButton.click(); + expect(target.classList.contains('card--edit')).toBe(true); + }); + + it('Should go into view mode', () => { + const target = document.getElementById('target'); + if (!target) throw new Error('Target not found'); + new ExpandableCardComponent(target as HTMLElement); + const editButton = target.querySelector('.btn-js-edit') as HTMLButtonElement; + expect(editButton).not.toBeNull(); + editButton.click(); + expect(target.classList.contains('card--edit')).toBe(true); + const viewButton = target.querySelector('.btn-js-view') as HTMLButtonElement; + expect(viewButton).not.toBeNull(); + viewButton.click(); + expect(target.classList.contains('card--edit')).toBe(false); + }); + }); + + describe('With topic', () => { + beforeEach(() => { + const target = document.getElementById('target'); + if (!target) throw new Error('Target not found'); + target?.classList.add('card--topic'); + }); + + it('should create an expandable topic component', () => { + const target = document.getElementById('target'); + if (!target) throw new Error('Target not found'); + // Set the items in the card to be invisible, as if there was nothing to show + const $target = $(target); + $target.find('.list--fields').find('ul li').each((_i, el) => { + $(el).css('display', 'none'); + }); + $target.find('.linkspace-field').each((_i, el) => { + $(el).css('display', 'none'); + }); + new ExpandableCardComponent(target as HTMLElement); + expect(target?.dataset.componentInitializedExpandablecardcomponent).toBe('true'); + // We expect the card to be hidden + expect(target?.style.display).toBe('none'); + }); + }); +}); diff --git a/src/frontend/components/collapsible/lib/component.test.ts b/src/frontend/components/collapsible/lib/component.test.ts new file mode 100644 index 000000000..02862e892 --- /dev/null +++ b/src/frontend/components/collapsible/lib/component.test.ts @@ -0,0 +1,57 @@ +import { describe, it, expect, beforeEach, afterEach } from '@jest/globals'; +import Collapsible from './component'; + +describe('Collapsible', () => { + beforeEach(() => { + // Set up the HTML structure for the collapsible component + document.body.innerHTML = ` +
      +
      + +
      +
      +
      + Content is: + content +
      +
      Please make a secure note of this content now, as it will not be displayed again.
      +
      +
      + ` + }); + + afterEach(() => { + document.body.innerHTML = ''; + }); + + it('should create a new collapsible component', () => { + const target = document.getElementById('target'); + expect(target).not.toBeNull(); + expect(target?.dataset.componentInitializedCollapsiblecomponent).not.toBe('true'); + new Collapsible(target as HTMLElement); + expect(target?.dataset.componentInitializedCollapsiblecomponent).toBe('true'); + }); + + it('should toggle the collapsible content', () => { + const target = document.getElementById('target'); + if (target === null) throw new Error('Target element not found'); + new Collapsible(target as HTMLElement); + const button = target.querySelector('.btn-collapsible') as HTMLButtonElement; + const titleCollapsed = target.querySelector('.btn__title--collapsed') as HTMLSpanElement; + const titleExpanded = target.querySelector('.btn__title--expanded') as HTMLSpanElement; + // Initial state + expect(titleCollapsed.classList.contains('hidden')).toBe(false); + expect(titleExpanded.classList.contains('hidden')).toBe(true); + // Toggle + button.click(); + expect(titleCollapsed.classList.contains('hidden')).toBe(true); + expect(titleExpanded.classList.contains('hidden')).toBe(false); + // Toggle again + button.click(); + expect(titleCollapsed.classList.contains('hidden')).toBe(false); + expect(titleExpanded.classList.contains('hidden')).toBe(true); + }); +}); diff --git a/src/frontend/components/dashboard/lib/react/Footer.test.tsx b/src/frontend/components/dashboard/lib/react/Footer.test.tsx new file mode 100644 index 000000000..638188a46 --- /dev/null +++ b/src/frontend/components/dashboard/lib/react/Footer.test.tsx @@ -0,0 +1,120 @@ +import React from 'react'; +import { act, render, screen } from '@testing-library/react'; +import '@testing-library/dom'; +import { describe, it, expect, jest } from '@jest/globals'; + +import Footer from './Footer'; + +import 'testing/extensions'; + +describe('Footer', () => { + it('Creates a footer', () => { + const footerProps = { + addWidget: jest.fn(), + currentDashboard: { + name: 'Dashboard 1', + url: 'http://localhost:3000/dashboard/1', + download_url: 'http://localhost:3000/dashboard/1/download' + }, + noDownload: false, + readOnly: false, + widgetTypes: ['type1', 'type2'] + }; + + render(