diff options
54 files changed, 1444 insertions, 1303 deletions
| diff --git a/CHANGES.md b/CHANGES.md index 8560da311..821d79c04 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,883 +1,50 @@  Ishtar changelog  ================ -v2.1.0 - dev ------------- - -### Features ### -- manage delayed imports with a background task manager -- parcel is no more mandatory for context records - - -v2.0.0 (2017-03-01) -------------------- - -For release for v2. Many great improvements and bug fixes. - -### Main features ### -- migration to Django 1.11 -- full rework on the UI (using bootstrap) -- update / change many JS libraries (particularly DataTables for tables and lightgallery for photos) -- real full-txt search (postgres search field) with unaccented search management -- JSON fields (import and display in card) -- new library for managing OpenDocument templates (secretary) - migration script - image management -- conservation module -- underwater module -- site module -- manage relation between towns (particularly to manage INSEE code) -- imports: target key can be associated to current import, current user, current group or to all users - -v1.0.0 (2017-09-21) -------------------- - -First release! - -### Bug fixes ### -- Fix pined search - -v0.99.27 (2017-09-09) ---------------------- -### Features ### -- Find deletions: delete associated base find -- Finds: delete associated treatment on find deletion -- Sheet: add a specific sheet_address_section -- Find forms: add discovery date -- Context record form/sheet: add opening/closing dates - -### Bug fixes ### -- Data importer: allow many split for UnicodeFormater -- Year limit is now 1000 -- Fix ParcelField compress method - -v0.99.26 (2017-07-26) ---------------------- -### Features ### -- Import: add FieldDoesNotExist to possible error on imports -- Add reference documents -- Update fixtures - -### Bug fixes ### -- Datings: post-fix of duplicates associated to the same object (usually on imports) -- Tests: fix fixtures management - -v0.99.25 (2017-07-20) ---------------------- -### Features ### -- Context record sheet: add documentation field - -### Bug fixes ### -- Imports: fix skip of lines when import file is not utf-8 -- Fix display view - -v0.99.24 (2017-07-12) ---------------------- -### Features ### -- Find deletion tests - -### Bug fixes ### -- CSV Export: add documentation type to models to exports - fail silently if type is not available - -v0.99.23 (2017-07-11) ---------------------- -### Features ### -- Tests: add show-* tests -- Tests: improve wizard test management - -### Bug fixes ### -- Fix find deletion when warehouse module is activated -- Archaeologivcal files: safely manage is_preventive test if preventive type is not created - show-file test -- Account : fix form initialization when raw name is empty - -v0.99.22 (2017-06-30) ---------------------- -### Features ### -- Imports: explicit message (instead of crash) on misconfiguration of importers -- Sources: change external id type to TextField -- Sheet find: hover text on ID - -### Bug fixes ### -- Sources wizard: fix author deletion -- Fix container export - CSV - -v0.99.21 (2017-06-14) ---------------------- -### Features ### -- OA code is now a string - -### Bug fixes ### -- Context record wizard: fix related context record association on creation - -v0.99.20 (2017-06-01) ---------------------- -### Features ### -- Add the ability to scheduled administration task inside Django admin -- Alert when PROJECT_SLUG or profile slug is set to "default" -- Operation wizard: collaborators in a specific panel -- Autocomplete: on no result return an empty list instead of an empty string - -### Bug fixes ### -- Finds: fix full CSV export columns - -v0.99.19 (2017-05-16) ---------------------- -### Features ### -- Can manage find index by context record -- Sheet find: put a warning when displaying a find with attached downstream treatment -- Find search: search by context records (and within relations) -- Scripts to manage access control import and export -- Add an access control fixture (specific format for ishtar) -- Treament file dashboard: add filter form -- Treament dashboard: add filter form - -### Bug fixes ### -- Treatment form: remove "target_is_basket" field in modification form -- Float field: fix clean with native float -- Treatment form: reordering of some fields -- Access control: fix show own item (not *all* items) -- get_item: refactoring of access control check - -v0.99.18 (2017-04-11) ---------------------- - -### Features ### -- Update fixtures -- CSS: update input width -- Manage hierarchical display with select2 -- Fix hiearchical display of types - -v0.99.17 (2017-04-07) ---------------------- - -### Features ### -- Operations: add collaborators field -- Operation wizard: an operation cannot be related to herself -- Operation forms: filter some fields if "files" module is not activated -- Replace MultipleAutocompleteField with Select2MultipleField -- JS: new version of select2 -- Base finds: bulk update of finds on context record change -- Warehouse sheet: provide statistics -- Sheets: larger tables -- Treatment - Treatment files dashboard: first overview -- Documentation generation: add some variables to treatments -- Shortcut menu: hide/show information saved in the session -- Allow old operations - -### Bug fixes ### -- Many fixes on access controls and permissions -- UI: use the url to detect the current action (more accurate) -- UI: prevent menu from dancing (less cool but prevent seasickness) -- Warehouse: divisions forms is readonly if containers are localised in this warehouse -- Warehouse form: name can be up to 200 chars -- Base finds: fix cache generation on context record change -- Fix find modify action -- Finds: do not resize the image and regenerate a thumb on find duplication -- New person form: fix empty title -- Filter autocomplete by own if relevant -- Sources: fix query owns requests -- Widget: fix Select2Multiple initialization with string - -v0.99.16 (2017-03-21) ---------------------- - -### Features ### -- Operation: add a location field -- Operation sheet: add list of containers -- Operation sheet: add INSEE code to towns -- Operation source table: change headers -- Context record: add type of excavation technics -- Context record form/sheet: add documentation types, diameter and depth of appearance -- Context records table: add new fields and reorder -- Find table: add new fields and reorder -- Find search: conditionnal search (warehouse module available) for warehouses and containers -- Find search: search by warehouse (location & responsible) -- Find sheet: link for documents related to finds -- Warehouse form: can add a warehouse responsible if not available -- Warehouse/Container sheet: add a Modify button -- Container: add an image -- Container wizard: display container sheet at the end of the process -- Treatment/Treatment file history: navigation between version and restore action -- Treatment/Treatment file sheet: add source list, administrative act list -- Basket: add a close button -- Sources: ordering author by author type -- Person sheet: link to the attached organization -- Sheets: remove ":" from labels -- Sheets: mark explicitly some fields as translated fields -- Sheets: improve layout -- Sheets: add ishtar ID -- Tables: add missing headers -- Admin: add batch types -- Imports: admin can see all imports -- Imports: add a name -- Imports: clean empty m2m -- Add a default robots.txt - -### Bug fixes ### -- Refactoring: EXTRA_FULL_FIELDS_LABELS -> COL_LABELS (with merge) -- Warehouse modification: error message is displayed when putting identical division types -- Container form: fix message when no warehouse is set -- Dashboard: fix area unity and effective operation tables -- Test import of files with exotic encoding - -v0.99.15 (2017-03-09) ---------------------- -### Features ### -- Export: full path for urls -- Export: get header from colum importer settings -- Export: specific configuration to manage ambiguous column -- Person form: title is not required anymore -- Operation tables: adapt columns -- Person sheet: nicer layout -- Sheets: better display of creation and modification date/user -- Script: translate importer basefind to find -- Fixture: update importers - -### Bug fixes ### -- Person: raw name is modified on save -- Export: allow models_finds and models_treatments settings -- Export: manage empty m2m - -v0.99.14 (2017-03-06) ---------------------- -### Features ### -- Operations: bulk update of base find, finds and context records -- Creation wizard: can jump to the next form with mandatory fields -- UI: explicitly remind the current pinned search above the result table -- Update translations -- Tests: create necessary view(s) on _pre_setup - -### Bug fixes ### -- Fix cache operation update - Parcel associated with context records are not removed! -- Fix CSV export -- Update context record label on parcel change -- Simplify empty value for get_types (and potentially fix strange errors) - -v0.99.13.1 (2017-02-20) ------------------------ -### Bug fixes ### -- Warehouse: fix warehouse creation with no divisions - -v0.99.13 (2017-02-17) --------------------- -### Features ### -- Accounts: initialize new account with default username extract from raw name -- Imports: -  - Prevent creation of new items when data is empty -  - Item keys are now related to the current importer -  - Report bad configuration on importers in a cleaner way - -### Bug fixes ### -- Fix password initialization on user creation -- Fix MCC operation import -- Makefile: graph model generation fix -- Finds table: fix columns - -v0.99.12.2 (2017-02-10) ------------------------ -### Features ### -- Sheet find: change comment/description position - -v0.99.12.1 (2017-02-10) ------------------------ -### Features ### -- Sheet find: add comment - -v0.99.12 (2017-02-10) ---------------------- -### Features ### -- Admin: add search_fields for archaeological_finds/materialtype search -- Admin: debug and add label for context records search -- Admin: improve importer column form -- Sheets: remove title from Created_by and add link to creator sheet -- Update translations - -### Bug fixes ### -- Shortcut menu: fix when current selected find is an integer - -v0.99.11 (2017-02-06) ---------------------- -### Features ### -- Imports: manage model limitation (don't create items not in a whitelist) -- Harmonize CSV import and CSV exports -- Imports: multi format parse of dates -- Find sheet: display treatment states in treatment table -- Basket sheet: add basket name and basic informations -- Admin: improve search and ordering -- Update labels and translations - -### Bug fixes ### -- Fix UI bug: validation button at the bottom of the page - -v0.99.10 (2017-02-04) ---------------------- - -### Features ### -- Admin: many changes on ordering, label and table columns -- Admin: add CSV export to general types -- Admin: add basic tests for general types -- Admin: add title types, formats and support types -- Fixtures: update all fixtures from reference -- Fixtures: add spatial ref system -- Makefile: add format, title type and support type to common fixtures, adapt fixtures -- Test - warehouse: explicit error on container creation form - -0.99.9 (2017-02-03) -------------------- - -### Features ### -- Admin: add comment columns for general types - -### Bug fixes ### -- get_item: deactivate hierarchic dependency when the parent item is a basket -- Fix find-basket for own request - -0.99.8 (2017-02-02) -------------------- - -### Features ### -- Add a footer with version number -- Finds: batch is now a real type -- Update french translation -- Importer configuration - -### Bug fixes ### -- Change field length in DB to match importers -- update-current-item: prevent errors when session is not well initialized - -0.99.7.2 (2017-01-30) ---------------------- - -### Bug fixes ### - -- Finds: fix material col in tables - -0.99.7.1 (2017-01-30) ---------------------- - -### Bug fixes ### - -- Fix shortcut menu for not owned current items - -0.99.7 (2017-01-30) -------------------- - -### Features ### - -- Spatial ref. system: add auth_name to SRS model -- Improve search tests - -### Bug fixes ### - -- Fix material type search for finds. -- Fix shortcut menu for baskets. - -0.99.6 (2017-01-29) -------------------- - -### Features ### - -- Containers, warehouses: add external ids -- Importers: add "container type" to available types for type columns - -### Bug fixes ### - -- Fix performance issues for shortcut menu - - -0.99.5 (2017-01-24) -------------------- - -- UI: short menu don't hide the main content -- Wizard: fix parcel reuse in creation - -0.99.4 (2017-01-24) -------------------- - -### Features ### - -- New specific view to display items (available for finds) -- Add a command to clean Ishtar DB -- Import: new formater types - new fixture -- Admin: add item key - -### Bug fixes ### - -- Operations: fix deletion of sym-linked operations -- Parcels: on associated operation or file detachment remove the parcel -- Fix inline_formset id in template -- Imports: fix attached files imports - - -0.99.3 (2017-01-20) -------------------- - -### Features ### - -- Add a status page -- Disable cache generation when loading from fixture -- Putting color for modules -- Sheet find: limit to 15 related finds in treatment tables -- Container: volume integer -> float -- More tests... - -### Bug fixes ### - -- Fix treatments views -- Fix container creation -- Find form: fix period saving -- Tables: many fix on column content - - -0.99.2 (2017-01-12) -------------------- - -### Features ### - -- Common: manage spatial reference systems -- Common: add a mapping module -- Finds: add explicit x, y, z, point (2d) -- Finds: automatically update point and point_2d when changing explicit coordinates - -### Bug fixes ### - -- Fix treatments views on cyclic treatments (should not happen but...) -- Fix treatment views migrations - - -0.99.1 (2017-01-11) -------------------- - -### Features ### - -- Treatment: add cost fields -- Container: remove old localisation when changing warehouse -- Treatment sheet: list related operations - -### Bug fixes ### - -- Fix simple form for adding containers -- Treatment file select form: fix treatment file check - -0.99.0 (2017-01-10) -------------------- - -### Main features ### - -- Management of treatments, treatments requests, containers, associated sources and administrative acts - -### Features ### - -- Performances improvements for tables -- Better cache key management -- Fix tests -- Shortcut menu: put research archaeological files in blue -- Finds: add thickness, point of topographic reference, MNI fields -- Explicit CSV headers - -0.98.10 (2016-11-03) --------------------- - -### Features ### - -- Force regeneration of cached labels when add M2M or changing ids -- Use lazy model evaluation for fixed type constraints -- Imports: add label to column definitions -- Use spatialite for tests -- Change default logging conf - -### Bug fixes ### - -- JQueryJqGrid: by default sorting is made using ordering in meta (fixes serious - performance issues) - -0.98.9 (2016-10-23) +v3.0.4 - 2020-03-11  ------------------- - -### Bug fixes ### - -- Fix bad regexp for "get-by-importer" - -0.98.8 (2016-10-22) -------------------- -  ### Features ### - -- Better management of cached label generation: -  - cascading update management -  - relevant history saving -  - force generation on rollback -  - better performance (but can still be slow) -- Manage export with importer's templates -- Sheets: highlight main references -- Update default french fixtures -- Image filename are now up to 255 characters. Length test is done on forms. -- Fixed position for shortcut menu and top bar -- Show/hide shortcut menu -- Context record: move "has furniture" to general panel - +- Quick actions - sheets: add duplicate for site, operation, document and context record +- Quick actions - tables: +  - person: bulk update - organization field +  - document: bulk update - creation date field +  - operation: bulk update - operator field +  - site: add bulk update form (towns field) +  - find: bulk update - appraisal date and treatment emergency fields +- Search - criteria: +  - Containers: +    - find ID, label +    - operation: town, scientist +  - Warehouse: +    - town +  - All document items: +    - has associated file +    - has associated image +    - has associated url +      ### Bug fixes ### +- Tables: fix display of links in columns +- Criteria search: manage empty field (but not NULL) multiple level search for file (including images) fields -- Operation: fix sort existing parcels -- Fix basket displaying in default menu -- Fix random image choice -- Makefile: fix bad fixture generation rules -- Small CSS fix -0.98.7 (2016-10-17) +v3.0.3 - 2020-02-24  ------------------- - -### Features ### - -- Context records: display and export context records relations from operation and context record sheet - -0.98.6 (2016-10-11) -------------------- - -### Features ### - -- Shortcut menu: add a new advanced menu with autocomplete search -  ### Bug fixes ### +- Import: fix concatenation when the concat string is empty -- Operation: add a related name for towns - -0.98.5 (2016-09-24) +v3.0.2 - 2020-02-17  ------------------- - -### Features ### - -- Cache: immediately refresh cache after types modifications -- Cache: manage long keys -- Fancy display for authors - -0.98.4 (2016-09-22) -------------------- - -### Features ### - -- Remove ISHTAR_LOCAL_PREFIX and FILE_PREFIX (now managed by the profile) -  ### Bug fixes ### +- Admin: improve performance +- Sentry integration -- Fix autocomplete in new item window -- File: fix label when no external_id is defined - -0.98.3 (2016-09-15) +v3.0.1 - 2020-02-11  ------------------- - -### Features ### - -- Operation: add comment about scientific documentation -- Finds : rename "Integrity" field into "Integrity / Interest" -- Searches: 6 to 9 visible fields by default -- Find search: add operation numeric index -  ### Bug fixes ### +- Finds: do not duplicate treatments on duplicate action +- QA basket: fix add to a shared basket -- Dashboard operation: fix table layout - -0.98.2 (2016-09-13) -------------------- - -### Features ### - -- Manual merge action -- Dashboard: layout improvement - -0.98.1 (2016-09-11) -------------------- - -### Bug fixes ### - -- Fix right caching - -0.98.0 (2016-09-11) -------------------- - -### Features ### - -- Many changes on shortcut menu: -  - AJAX loading -  - list use chosen library -  - automatic changes of dependent items when selecting on parent item -  - pin (from the sheet) and unpin items (not only our items) -  - default searches now take into account parent items -- Operation: manage deadline for finds and documentation receipt -- Imports: explicit error when conservative is check and no unicity key is defined -- cached labels for context records and finds - -### Bug fixes ### - -- Fix test initialization -- Operation: fix parcel display in last panel -- Operation sheet: fix stats -- Source: display sheet after creation / modification - -0.97.8 (2016-09-08) -------------------- - -### Features ### - -- Many improvement and cleaning on sheet layout - -### Bug fixes ### - -- Context records: related parcel are now kept when you modify operation -- Wizards: fix file initialization when navigating between steps - -0.97.7 (2016-09-06) -------------------- - -### Features ### - -- Context record: can change operation -- Context record: display operation code in label -- Person: add salutation field - -### Bug fixes ### - -- Prevent circular save on import -- Fix person creation with new title management -- Fix context records creation - -0.97.6 (2016-09-05) -------------------- - -### Bug fixes ### - -- Fix random images rights and manage broken images - -0.97.5 (2016-09-05) -------------------- - -### Features ### - -- Add town and parcel to find tables -- Random image on welcome page -- Add images for operation, context records and sources -- Operation: display statistics on the sheet -- Add title types to default fixture - -### Bug fixes ### - -- Sheets: add missing links to persons -- Source sheet: author link to persons -- Fix form initialization - -0.97.4 (2016-09-02) -------------------- - -### Features ### - -- Non-available types are displayed when modifying old items using theses types -- Title types are no more hard-coded -- Archive item to exclude them from merge detection mechanism (python API only) -- Organization, Person sheets: add link to files -- Install: default nginx conf wait after long uwsgi response - -### Bug fixes ### - -- Account modify: fix bad initialization of the form -- Imports: delete town when associated import is deleted - -0.97.3 (2016-08-29) -------------------- - -### Features ### - -- Automatically generate raw_name on save for person - formula set in profile -- UI: better simple table layout -- UI: rework on dashboard -- Autocomplete widget: larger and full content on hover -- Import: target form - better display of the key -- Update french translation -- Imports: loading indicator - -### Bug fixes ### - -- Cache: fix caching key for models with the same name on different app (such as Rela -tionType) -- Fix french translation - -0.97.2 (2016-08-25) -------------------- - -### Features ### - -- Cache: update cache when saving -- Update french translation - -0.97.1 (2016-08-24) -------------------- - -### Features ### - -- UI: new (and nicer) layout for sheet header -- Templatetag: generic header for sheet -- Imports: manage report state -- Administrative act: can modify index -- Treatments: better query for upstream and downstream, fix treatment list on find sheet - -0.97.0 (2016-08-23) -------------------- - -### Features ### - -- Sync external ID on manual insert -- BeautifulSoup: v3 -> v4 -- Account management: fix edit - can delete an account -- Person - Organization: add full export -- Person sheet: improve display of documents -- Closing operation or archaeological file: today by default -- Operation: search on "code_patriarche" and "common_name" for autocomplete -- Operation sheet: add link to scientist and to operator -- Operation: check PATRIARCHE unicity inside forms -- Archaeological sites: more explicit label -- Manage operation relation types in context record and find searches -- Parcels: add public domain field - better management of parcel formsets -- Context records: add comments on dating -- Context records: centimeters to meters for dimensions -- Finds: add creation date, creator, modification date, modifier to sheet -- Finds: add remarkability -- Finds: add estimated value. Manage a currency for an Ishtar profile -- Docs: search by operation code -- Docs: display weblink in source tables -- Docs: add search view -- Logo is now a link - -### Bug fixes ### - -- CSV export: manage data with inappropriate characters for encoding -- Image saving: fix deletion of image -- Archaeological files: floatfield for surface - fix error display on main form -- Operations: DRACAR to old code -- Context records: fix parcel attribution with public domain -- Context record sheet: fix head scientist of the associated operation -- Finds: fix test intitialization -- Admin: do not allow password modification on "ishtar user" + help text - - -0.96.3 (2016-07-18) -------------------- - -### Features ### -- Versioning of CSS and JS files - -### Bug fixes ### -- Many fix on dashboard - -0.96.2 (2016-07-17) -------------------- - -### Features ### -- Overload of columns for specific exports -- Tiny label for relations types. - -0.96.1 (2016-07-16) -------------------- - -### Features ### -- Test wizards -- Work on treatments (conditional wizard, tests) but kept disabled at the moment - -### Bug fixes ### -- Fix fixtures for auth and groups -- Installation: better management of rights of media directories -- Administrative act: fix redirect when no documents are available - - -0.96 (2016-07-14) ------------------ - -### Features ### -- GIS fields in database -- Sources: link to modify in sheet, better presentation of tables -- UI: font-awesome icons -- Documentation: update installation - data loading -- Finds: conservatory and dimensions comments - -### Bug fixes ### -- Templatetags: fix https links, urls -- Many fix on imports: - - year formater - - better management of files (temporary files have a size) - - remove File from uniqueness detection - - forced new are created only one time -- Many fix on fixtures: relation types, report states, importer columns, labels, comments, order, accents - -0.95 (2016-06-08) ------------------ - -### Features ### -- A welcome page (default and to be defined in site profile) -- Displaying treatments in find sheet -- Many improvements in the find sheet - -### Bug fixes ### -- Basket update after a treatment -- Fix operation code for operation with no year (or year 0) -- Fix warehouse creation -- Allow to save a find if no operation is defined -- Add PROJECT_SLUG to default installation - -0.94 (2016-06-03) ------------------ - -### Features ### -- First management of baskets -- Change context record of a find -- Full exports of sources - -### Bug fixes ### -- Many fix in permission management - -0.93 (2016-04-19) ------------------ - -### Major features ### -- Many fixes in install script -- New fields for persons -- Better layout for searches - -### Minor features ### -- Context records: search within relations -- Better management of archaeological sites -- Better display of sheet sources -- Update translations - -### Bug fixes ### -- Allow simultanaeous creation of operations -- Fix simultanaeous creation of files -- Shortcut list: choices for finds and context records are now kept -- Parcel rearranging on operation form when file exists - -0.92 (2016-02-26) ------------------ - -### Major features ### -- New management of modules -- More selective merging process -- Manage relation types in searches -- Use flex layout for searches -- Update translations - -### Minor features ### -- Update searches -- Add archaeological site to importers types -- Update operation fixtures -- Update translations -- Add abstract in operations -- Change archaeological sites form - -### Bug fixes ### -- Fix cache for multiple instance of Ishtar -- Fix default item after creation -- Fix management of departments -- Labels and values on sheets -- Unicode error on adresses -- Fix dynamic table display in ODT and PDF - -0.91 (2016-01-18) ------------------ - -- First public release. +v3.0.0 +------ +A lot of changes since v2. Main change is python3 and Django 1.11 support. diff --git a/archaeological_context_records/admin.py b/archaeological_context_records/admin.py index 3c980d550..9bd2f5c05 100644 --- a/archaeological_context_records/admin.py +++ b/archaeological_context_records/admin.py @@ -56,6 +56,7 @@ class AdminContextRecordForm(forms.ModelForm):      town = AutoCompleteSelectField('town', required=False)      archaeological_site = AutoCompleteSelectField('archaeological_site',                                                    required=False) +    lock_user = AutoCompleteSelectField('user', required=False)  class ContextRecordAdmin(HistorizedObjectAdmin): @@ -68,6 +69,7 @@ class ContextRecordAdmin(HistorizedObjectAdmin):      readonly_fields = HistorizedObjectAdmin.readonly_fields + [          'cached_label', 'datings'      ] +    exclude = ["documents", "main_image"]  admin_site.register(models.ContextRecord, ContextRecordAdmin) diff --git a/archaeological_context_records/forms.py b/archaeological_context_records/forms.py index 2061ecc1f..5ed9935e9 100644 --- a/archaeological_context_records/forms.py +++ b/archaeological_context_records/forms.py @@ -35,7 +35,7 @@ from archaeological_context_records import models  from ishtar_common.forms import FinalForm, FormSet, \      reverse_lazy, get_form_selection, ManageOldType, CustomForm, \      FieldType, CustomFormSearch, IshtarForm, FormHeader, HistorySelect, \ -    MultiSearchForm, LockForm +    MultiSearchForm, LockForm, DocumentItemSelect  from ishtar_common.forms_common import get_town_field  from archaeological_operations.forms import OperationSelect, ParcelField, \      RecordRelationsForm as OpeRecordRelationsForm, RecordRelationsFormSetBase @@ -60,7 +60,7 @@ class OperationFormSelection(CustomForm, forms.Form):          validators=[valid_id(Operation)]) -class RecordSelect(HistorySelect): +class RecordSelect(DocumentItemSelect):      _model = models.ContextRecord      form_admin_name = _(u"Context record - 001 - Search")      form_slug = "contextrecord-001-search" @@ -147,6 +147,27 @@ class RecordFormMultiSelection(LockForm, MultiSearchForm):          validators=[valid_ids(models.ContextRecord)]) +def get_init_parcel(form, operation, prefix=""): +    parcels = operation.parcels.all() +    sort = lambda x: (x.town.name, x.section) +    parcels = sorted(parcels, key=sort) +    for key, gparcels in groupby(parcels, sort): +        form.fields[prefix + 'parcel'].choices.append( +            (" - ".join([k for k in key if k]), +             [(parcel.pk, parcel.short_label) for parcel in gparcels]) +        ) +    if len(form.fields[prefix + 'parcel'].choices) == 1 and \ +            (prefix + 'town') in form.fields: +        # only the empty choice is available +        form.fields.pop(prefix + 'parcel') +        form.fields[prefix + 'town'].required = True +    if (prefix + 'town') in form.fields: +        if form.fields[prefix + 'town'].required: +            form.fields[prefix + 'town'].choices = []  # remove the empty choice +        form.fields[prefix + 'town'].choices += [ +            (t.pk, str(t)) for t in operation.towns.all()] + +  class RecordFormGeneral(CustomForm, ManageOldType):      HEADERS = {}      form_label = _("General") @@ -279,25 +300,7 @@ class RecordFormGeneral(CustomForm, ManageOldType):          if operation:              self.fields['operation_id'].initial = operation.pk -            parcels = operation.parcels.all() -            sort = lambda x: (x.town.name, x.section) -            parcels = sorted(parcels, key=sort) -            for key, gparcels in groupby(parcels, sort): -                self.fields['parcel'].choices.append( -                    (" - ".join([k for k in key if k]), -                     [(parcel.pk, parcel.short_label) for parcel in gparcels]) -                ) -            if len(self.fields['parcel'].choices) == 1 and \ -                    'town' in self.fields: -                # only the empty choice is available -                self.fields.pop('parcel') -                self.fields['town'].required = True -            if 'town' in self.fields: -                if self.fields['town'].required: -                    self.fields['town'].choices = []  # remove the empty choice -                self.fields['town'].choices += [(t.pk, str(t)) -                                                for t in operation.towns.all()] - +            get_init_parcel(self, operation)              self.fields['archaeological_site'].choices += [                  (site.pk, str(site))                  for site in operation.archaeological_sites.all() @@ -478,3 +481,67 @@ class QAOperationCR(IshtarForm):          else:              data["town_id"] = self.cleaned_data['town']          models.ContextRecord.objects.create(**data) + + +class QAContextRecordDuplicateForm(IshtarForm): +    qa_label = forms.CharField(label=_("ID"), max_length=None, required=True) +    qa_parcel = forms.ChoiceField(label=_(u"Parcel"), choices=[]) +    qa_town = forms.ChoiceField(label=_(u"Town"), choices=[], required=False) +    qa_unit = forms.ChoiceField(label=_(u"Context record type"), required=False, +                                choices=[]) + +    TYPES = [ +        FieldType('qa_unit', models.Unit), +    ] + +    def __init__(self, *args, **kwargs): +        self.user = None +        if 'user' in kwargs: +            self.user = kwargs.pop('user') +            if hasattr(self.user, 'ishtaruser'): +                self.user = self.user.ishtaruser +        self.context_record = kwargs.pop('items')[0] +        super(QAContextRecordDuplicateForm, self).__init__(*args, **kwargs) + +        profile = IshtarSiteProfile.get_current_profile() +        self.fields['qa_parcel'].choices = [('', '--')] +        if not profile.parcel_mandatory: +            self.fields['qa_parcel'].required = False +            self.fields['qa_town'].choices = [('', '--')] +        else: +            self.fields.pop('qa_town') + +        get_init_parcel(self, self.context_record.operation, prefix="qa_") + +        if "qa_town" in self.fields and self.context_record.town: +            self.fields["qa_town"].initial = self.context_record.town.pk +        if "qa_parcel" in self.fields and self.context_record.parcel: +            self.fields["qa_parcel"].initial = self.context_record.parcel.pk + +        self.fields['qa_label'].initial = ( +            self.context_record.label or "") + str(_(" - duplicate")) +        if self.context_record.unit: +            self.fields["qa_unit"].initial = self.context_record.unit.pk + +    def save(self): +        data = {"label": self.cleaned_data["qa_label"]} +        if self.cleaned_data.get("qa_unit", None): +            try: +                data["unit"] = models.Unit.objects.get(pk=int( +                    self.cleaned_data["qa_unit"]), available=True) +            except models.Unit.DoesNotExist: +                pass +        if self.cleaned_data.get("qa_town", None): +            try: +                data["town"] = Town.objects.get(pk=int( +                    self.cleaned_data["qa_town"])) +            except Town.DoesNotExist: +                pass +        if self.cleaned_data.get("qa_parcel", None): +            try: +                data["parcel"] = Parcel.objects.get(pk=int( +                    self.cleaned_data["qa_parcel"])) +            except Parcel.DoesNotExist: +                pass +        return self.context_record.duplicate( +            self.user, data=data) diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py index febc7cfdd..02b074706 100644 --- a/archaeological_context_records/models.py +++ b/archaeological_context_records/models.py @@ -362,6 +362,11 @@ class ContextRecord(BulkUpdatedItem, DocumentItem, BaseHistorizedItem,          'operation_id': 'operation_id',          'unit__label': "unit__label"      } +    REVERSED_BOOL_FIELDS = [ +        'documents__image__isnull', +        'documents__associated_file__isnull', +        'documents__associated_url__isnull', +    ]      RELATION_TYPES_PREFIX = {'ope_relation_types': 'operation__',                               'cr_relation_types': ''}      # alternative names of fields for searches @@ -416,6 +421,7 @@ class ContextRecord(BulkUpdatedItem, DocumentItem, BaseHistorizedItem,          ),      }      ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) +    ALT_NAMES.update(DocumentItem.ALT_NAMES)      PARENT_ONLY_SEARCH_VECTORS = ["operation", "archaeological_site", "parcel"]      BASE_SEARCH_VECTORS = [ @@ -459,7 +465,11 @@ class ContextRecord(BulkUpdatedItem, DocumentItem, BaseHistorizedItem,          rights=['change_contextrecord', 'change_own_contextrecord']      )      QUICK_ACTIONS = [ -        QA_LOCK +        QA_LOCK, +        QuickAction( +            url="contextrecord-qa-duplicate", icon_class="fa fa-clone", +            text=_(u"Duplicate"), target="one", +            rights=['change_contextrecord', 'change_own_contextrecord']),      ]      history = HistoricalRecords(bases=[HistoryModel]) @@ -723,6 +733,19 @@ class ContextRecord(BulkUpdatedItem, DocumentItem, BaseHistorizedItem,      def show_url(self):          return reverse('show-contextrecord', args=[self.pk, '']) +    def get_extra_actions(self, request): +        # url, base_text, icon, extra_text, extra css class, is a quick action +        actions = super(ContextRecord, self).get_extra_actions(request) + +        #is_locked = hasattr(self, "is_locked") and self.is_locked(request.user) +        can_edit_cr = self.can_do(request, 'change_contextrecord') +        if can_edit_cr: +            actions += [ +                (reverse("contextrecord-qa-duplicate", args=[self.pk]), +                 _("Duplicate"), "fa fa-clone", "", "", True), +            ] +        return actions +      @classmethod      def get_query_owns(cls, ishtaruser):          q = cls._construct_query_own( diff --git a/archaeological_context_records/templates/ishtar/forms/qa_contextrecord_duplicate.html b/archaeological_context_records/templates/ishtar/forms/qa_contextrecord_duplicate.html new file mode 100644 index 000000000..a018a67fa --- /dev/null +++ b/archaeological_context_records/templates/ishtar/forms/qa_contextrecord_duplicate.html @@ -0,0 +1,39 @@ +{% extends "ishtar/forms/qa_base.html" %} +{% load i18n inline_formset table_form %} + +{% block main_form %} +{% if form.non_field_errors %} +<div class="alert alert-danger" role="alert"> +    {{form.non_field_errors}} +</div> +{% endif %} +<div class="form-row"> +    <div class="form-group col-lg-12 required full-width"> +        <label>{% trans "Operation" %}{% trans ":" %}</label> +        {{operation}} +    </div> +</div> +{% with force_large_col=True %} +<div class="form-row"> +    {% with form.qa_label as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +<div class="form-row"> +    {% with form.qa_parcel as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% if form.qa_town %}<div class="form-row"> +    {% with form.qa_town as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div>{% endif %} +{% if form.qa_parcel %}<div class="form-row"> +    {% with form.qa_unit as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div>{% endif %} +{% endwith %} +{% endblock %} + diff --git a/archaeological_context_records/templates/ishtar/sheet_contextrecord.html b/archaeological_context_records/templates/ishtar/sheet_contextrecord.html index a7d01c6dd..ffeba676c 100644 --- a/archaeological_context_records/templates/ishtar/sheet_contextrecord.html +++ b/archaeological_context_records/templates/ishtar/sheet_contextrecord.html @@ -104,7 +104,6 @@    <div class="tab-pane fade show active" id="{{window_id}}-identification"         role="tabpanel" aria-labelledby="{{window_id}}-identification-tab"> -        {% if has_image %}          <div class="clearfix">              <div class="card float-left col-12 col-md-6 col-lg-4">                  {% include "ishtar/blocks/window_image.html" %} @@ -116,17 +115,10 @@                      </p>                  </div>              </div> -        </div> -        {% else %} -        <div> -            <p class='window-refs'>{{ item.parcel.short_label }}</p> -            <p class="window-refs">{{ item.label|default:"" }}</p> -            {% include "ishtar/blocks/sheet_external_id.html" %} -        </div> -        {% endif %} -        <div class='row'> -            {% field_flex_2 "Complete ID" item.full_label %} -            {% field_flex_2 "Type" item.unit %} +            <div class='row'> +                {% field_flex_2 "Complete ID" item.full_label %} +                {% field_flex_2 "Type" item.unit %} +            </div>          </div>          <h3>{% trans "Description"%}</h3>          <div class="row"> diff --git a/archaeological_context_records/urls.py b/archaeological_context_records/urls.py index d5c2c7d7d..434aa79f9 100644 --- a/archaeological_context_records/urls.py +++ b/archaeological_context_records/urls.py @@ -95,5 +95,9 @@ urlpatterns = [      url(r'^contextrecord-qa-lock/(?P<pks>[0-9-]+)?/$',          views.QAContextRecordLockView.as_view(), name='contextrecord-qa-lock',          kwargs={"model": models.ContextRecord}), +    url(r'^contextrecord-qa-duplicate/(?P<pks>[0-9-]+)?/$', +        check_rights(['change_contextrecord', 'change_own_contextrecord'])( +            views.QAContextRecordDuplicateFormView.as_view()), +        name='contextrecord-qa-duplicate'),  ] diff --git a/archaeological_context_records/views.py b/archaeological_context_records/views.py index 74def46a4..215dd2b4a 100644 --- a/archaeological_context_records/views.py +++ b/archaeological_context_records/views.py @@ -233,3 +233,26 @@ class QAContextRecordLockView(QABaseLockView):      model = models.ContextRecord      base_url = "contextrecord-qa-lock" + +class QAContextRecordDuplicateFormView(QAItemForm): +    template_name = 'ishtar/forms/qa_contextrecord_duplicate.html' +    model = models.ContextRecord +    page_name = _("Duplicate") +    form_class = forms.QAContextRecordDuplicateForm +    base_url = "contextrecord-qa-duplicate" + +    def get_form_kwargs(self): +        kwargs = super(QAContextRecordDuplicateFormView, self).get_form_kwargs() +        kwargs['user'] = self.request.user +        return kwargs + +    def form_valid(self, form): +        form.save() +        return HttpResponseRedirect(reverse("success")) + +    def get_context_data(self, **kwargs): +        data = super(QAContextRecordDuplicateFormView, self).get_context_data( +            **kwargs) +        data['action_name'] = _(u"Duplicate") +        data["operation"] = self.items[0].operation +        return data diff --git a/archaeological_files/admin.py b/archaeological_files/admin.py index 58c1791c0..b5709bd65 100644 --- a/archaeological_files/admin.py +++ b/archaeological_files/admin.py @@ -35,22 +35,26 @@ class FileAdmin(HistorizedObjectAdmin):      if settings.COUNTRY == 'fr':          list_filter += ['saisine_type']      search_fields = ('name', 'towns__name', 'permit_reference') +    ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy() +    ajax_form_dict.update({ +        'in_charge': 'person', +        'general_contractor': 'person', +        'corporation_general_contractor': 'organization', +        'responsible_town_planning_service': 'person', +        'planning_service': 'organization', +        'organization': 'organization', +        'scientist': 'person', +        'main_town': 'town', +        'towns': 'town', +        'related_file': 'file' +    })      form = make_ajax_form( -        models.File, {'in_charge': 'person', -                      'general_contractor': 'person', -                      'corporation_general_contractor': 'organization', -                      'responsible_town_planning_service': 'person', -                      'planning_service': 'organization', -                      'organization': 'organization', -                      'scientist': 'person', -                      'main_town': 'town', -                      'towns': 'town', -                      'related_file': 'file' -                      }) +        models.File, ajax_form_dict)      readonly_fields = HistorizedObjectAdmin.readonly_fields + [          'raw_general_contractor', 'raw_town_planning_service',          'cached_label', 'imported_line'      ] +    exclude = ["documents", "main_image"]      model = models.File diff --git a/archaeological_files/forms.py b/archaeological_files/forms.py index 9a2f63a1d..a9936c47a 100644 --- a/archaeological_files/forms.py +++ b/archaeological_files/forms.py @@ -37,8 +37,8 @@ from archaeological_operations.models import ActType, AdministrativeAct, \  from . import models  from ishtar_common.forms import FinalForm, get_now, reverse_lazy, TableSelect, \ -    ManageOldType, CustomForm, FieldType, IshtarForm, HistorySelect, \ -    MultiSearchForm, LockForm, CustomFormSearch +    ManageOldType, CustomForm, FieldType, IshtarForm, \ +    MultiSearchForm, LockForm, CustomFormSearch, DocumentItemSelect  from ishtar_common.forms_common import get_town_field  from archaeological_operations.forms import AdministrativeActForm, \      AdministrativeActOpeFormSelection, SLICING, AdministrativeActModifForm, \ @@ -47,7 +47,7 @@ from ishtar_common import widgets  from bootstrap_datepicker.widgets import DatePicker -class FileSelect(HistorySelect): +class FileSelect(DocumentItemSelect):      _model = models.File      form_admin_name = _(u"File - 001 - Search")      form_slug = "file-001-search" diff --git a/archaeological_files/models.py b/archaeological_files/models.py index 018b5d429..310301c59 100644 --- a/archaeological_files/models.py +++ b/archaeological_files/models.py @@ -161,6 +161,12 @@ class File(ClosedItem, DocumentItem, BaseHistorizedItem, OwnPerms, ValueGetter,          'towns_label': _(u"Towns"),      } +    REVERSED_BOOL_FIELDS = [ +        'documents__image__isnull', +        'documents__associated_file__isnull', +        'documents__associated_url__isnull', +    ] +      # alternative names of fields for searches      ALT_NAMES = {          'year': SearchAltName( @@ -230,6 +236,7 @@ class File(ClosedItem, DocumentItem, BaseHistorizedItem, OwnPerms, ValueGetter,          ),      }      ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) +    ALT_NAMES.update(DocumentItem.ALT_NAMES)      POST_PROCESS_REQUEST = {          'towns__numero_insee__startswith': '_get_department_code', diff --git a/archaeological_finds/admin.py b/archaeological_finds/admin.py index f129881e8..1da39ed82 100644 --- a/archaeological_finds/admin.py +++ b/archaeological_finds/admin.py @@ -18,7 +18,8 @@  # See the file COPYING for details.  from ajax_select import make_ajax_form -from ajax_select.fields import AutoCompleteSelectField +from ajax_select.fields import AutoCompleteSelectField, \ +    AutoCompleteSelectMultipleField  from django import forms  from django.contrib import admin @@ -84,7 +85,8 @@ class FindAdmin(HistorizedObjectAdmin):      search_fields = ('label', "base_finds__cache_complete_id",                       "base_finds__context_record__operation__cached_label")      model = models.Find -    form = make_ajax_form(model, { +    ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy() +    ajax_form_dict.update({          'base_finds': 'base_find',          'container': 'container',          'container_ref': 'container', @@ -95,6 +97,7 @@ class FindAdmin(HistorizedObjectAdmin):          'main_image': 'document',          'documents': 'document',      }) +    form = make_ajax_form(model, ajax_form_dict)      readonly_fields = HistorizedObjectAdmin.readonly_fields + [          'datings', 'cached_label'      ] @@ -121,21 +124,31 @@ class PropertyAdmin(HistorizedObjectAdmin):  admin_site.register(models.Property, PropertyAdmin) +class AdminTreatmentForm(forms.ModelForm): +    class Meta: +        model = models.Treatment +        exclude = [] +    person = AutoCompleteSelectField('person', required=False) +    organization = AutoCompleteSelectField('organization', required=False) +    file = AutoCompleteSelectField('treatment_file', required=False) +    location = AutoCompleteSelectField("warehouse", required=False) +    container = AutoCompleteSelectField("container", required=False) +    scientific_monitoring_manager = AutoCompleteSelectField("person", +                                                            required=False) +    # finds = AutoCompleteSelectMultipleField("find", required=False) +    lock_user = AutoCompleteSelectField("user", required=False) + +  class TreatmentAdmin(HistorizedObjectAdmin): -    list_display = ('year', 'index', 'label','treatment_types_lbl', 'location', +    list_display = ('year', 'index', 'label', 'treatment_types_lbl', 'location',                      'downstream_lbl', 'upstream_lbl', 'container', 'person')      list_filter = ('treatment_types', 'treatment_state', 'year')      model = models.Treatment -    form = make_ajax_form(model, { -        'person': 'person', -        'organization': 'organization', -        'file': 'treatment_file', -        'location': 'warehouse', -        'container': 'container', -    }) +    form = AdminTreatmentForm      readonly_fields = HistorizedObjectAdmin.readonly_fields + [ -        'cached_label', 'downstream_lbl', 'upstream_lbl' +        'cached_label', 'downstream_lbl', 'upstream_lbl',      ] +    exclude = ["documents", "main_image"]      def has_add_permission(self, request):          return False @@ -152,14 +165,17 @@ class TreatmentFileAdmin(HistorizedObjectAdmin):                       'applicant__raw_name', 'applicant_organisation__name',                       'cached_label')      model = models.TreatmentFile -    form = make_ajax_form(model, { +    ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy() +    ajax_form_dict.update({          'in_charge': 'person',          'applicant': 'person',          'applicant_organisation': 'organization',      }) +    form = make_ajax_form(model, ajax_form_dict)      readonly_fields = HistorizedObjectAdmin.readonly_fields + [          'cached_label',      ] +    exclude = ["documents", "main_image"]  admin_site.register(models.TreatmentFile, TreatmentFileAdmin) diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index 5fcf57a27..90805e656 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -56,7 +56,7 @@ from ishtar_common import widgets  from ishtar_common.forms import CustomForm, CustomFormSearch, FormSet, \      FloatField, reverse_lazy, TableSelect, get_now, FinalForm, \      ManageOldType, FieldType, IshtarForm, FormHeader, QAForm, HistorySelect, \ -    MultiSearchForm, LockForm +    MultiSearchForm, LockForm, DocumentItemSelect  from ishtar_common.forms_common import get_town_field  from ishtar_common.models import valid_id, valid_ids, get_current_profile, \      SpatialReferenceSystem, Area, OperationType, IshtarUser @@ -524,8 +524,8 @@ class ResultingFindsForm(CustomForm, ManageOldType):          label=_(u"Prefix label for resulting finds"),          validators=[validators.MaxLengthValidator(200)],          help_text=_( -            u'E.g.: with a prefix "item-", each resulting item will be named ' -            u'"item-1", "item-2", "item-3"') +            'E.g.: with a prefix "item-", each resulting item will be named ' +            '"item-1", "item-2", "item-3"')      )      resultings_start_number = forms.IntegerField(          label=_(u"Numbering starting from"), initial=1, min_value=0 @@ -569,12 +569,14 @@ class QAFindFormMulti(QAForm):          'qa_checked_type': models.CheckedType,          'qa_period': Period,          "qa_conservatory_state": models.ConservatoryState, +        "qa_treatment_emergency": models.TreatmentEmergencyType,      }      MULTI = True      REPLACE_FIELDS = [          'qa_denomination', 'qa_ue', 'qa_manufacturing_place', 'qa_checked_type', -        'qa_check_date', 'qa_conservatory_state' +        'qa_check_date', 'qa_conservatory_state', 'qa_treatment_emergency', +        'qa_appraisal_date',      ]      HEADERS = { @@ -629,8 +631,10 @@ class QAFindFormMulti(QAForm):      qa_alteration_causes = widgets.Select2MultipleField(          label=_(u"Alteration cause"), required=False      ) -    qa_conservatory_state= forms.ChoiceField(label=_("Conservatory state"), -                                             required=False, choices=[]) +    qa_conservatory_state = forms.ChoiceField(label=_("Conservatory state"), +                                              required=False, choices=[]) +    qa_treatment_emergency = forms.ChoiceField(label=_("Treatment emergency"), +                                               choices=[], required=False)      qa_comment = forms.CharField(          label=_(u"Comment"), required=False,          widget=forms.Textarea) @@ -638,6 +642,8 @@ class QAFindFormMulti(QAForm):      qa_checked_type = forms.ChoiceField(label=_(u"Check"), required=False)      qa_check_date = forms.DateField(          label=_(u"Check date"), widget=DatePicker, required=False) +    qa_appraisal_date = forms.DateField( +        label=_("Appraisal date"), widget=DatePicker, required=False)      qa_period = widgets.Select2MultipleField(          label=_("Period"), choices=[], required=False) @@ -655,6 +661,7 @@ class QAFindFormMulti(QAForm):                    is_multiple=True),          FieldType('qa_checked_type', models.CheckedType),          FieldType('qa_conservatory_state', models.ConservatoryState), +        FieldType('qa_treatment_emergency', models.TreatmentEmergencyType),          FieldType('qa_period', Period, is_multiple=True),      ] @@ -726,6 +733,12 @@ class QAFindBasketForm(IshtarForm):              if not self.cleaned_data['qa_bf_basket']:                  raise forms.ValidationError(                      _(u"On update, you have to select a basket.")) +            q = Q(user=self.user) | Q(shared_write_with__pk=self.user.pk) +            q = models.FindBasket.objects.filter(q).filter( +                pk=self.cleaned_data['qa_bf_basket']) +            if not q.count(): +                raise forms.ValidationError( +                    _("You cannot update the selected basket."))              return self.cleaned_data          label = self.cleaned_data['qa_bf_label'].strip()          if not label: @@ -738,8 +751,9 @@ class QAFindBasketForm(IshtarForm):      def save(self, items):          if self.cleaned_data['qa_bf_create_or_update'] == 'update': -            basket = models.FindBasket.objects.get( -                user=self.user, pk=self.cleaned_data['qa_bf_basket']) +            q = Q(user=self.user) | Q(shared_write_with__pk=self.user.pk) +            basket = models.FindBasket.objects.filter(q).get( +                pk=self.cleaned_data['qa_bf_basket'])          else:              label = self.cleaned_data['qa_bf_label'].strip()              basket = models.FindBasket.objects.create( @@ -763,7 +777,7 @@ class QAFindDuplicateForm(IshtarForm):          self.find = kwargs.pop('items')[0]          super(QAFindDuplicateForm, self).__init__(*args, **kwargs)          self.fields['label'].initial = self.find.label + str( -            _(u" - duplicate")) +            _(" - duplicate"))          self.fields['denomination'].initial = self.find.denomination or ""      def save(self): @@ -894,9 +908,9 @@ DatingFormSet.form_admin_name = _(u"Find - 040 - Dating")  DatingFormSet.form_slug = "find-040-dating" -class FindSelect(HistorySelect): +class FindSelect(DocumentItemSelect):      _model = models.Find -    form_admin_name = _(u"Find - 001 - Search") +    form_admin_name = _("Find - 001 - Search")      form_slug = "find-001-search"      FORM_FILTERS = [          (_(u"Find origin"), [ @@ -1037,9 +1051,9 @@ class FindSelect(HistorySelect):              reverse_lazy('autocomplete-materialtype'),              associated_model=models.MaterialType),      ) -    material_type_quality = forms.ChoiceField(label=_(u"Material type quality"), +    material_type_quality = forms.ChoiceField(label=_("Material type quality"),                                                choices=[]) -    material_comment = forms.CharField(label=_(u"Comment on the material")) +    material_comment = forms.CharField(label=_("Comment on the material"))      object_types = forms.IntegerField(          label=_(u"Object type"),          widget=widgets.JQueryAutoComplete( @@ -1168,7 +1182,6 @@ class FindSelect(HistorySelect):      appraisal_date__before = forms.DateField(          label=_(u"Appraisal date before"), widget=DatePicker) -    documents__image__isnull = forms.NullBooleanField(label=_(u"Has an image?"))      loan = forms.NullBooleanField(label=_(u"Loan?"))      treatments_file_end_date = forms.DateField(          label=_(u"Treatment file end date before"), widget=DatePicker diff --git a/archaeological_finds/forms_treatments.py b/archaeological_finds/forms_treatments.py index f03dec18a..b80b6c0fe 100644 --- a/archaeological_finds/forms_treatments.py +++ b/archaeological_finds/forms_treatments.py @@ -33,8 +33,8 @@ from archaeological_warehouse.models import Warehouse, Container  from bootstrap_datepicker.widgets import DatePicker  from ishtar_common import widgets  from ishtar_common.forms import reverse_lazy, TableSelect, FinalForm, \ -    ManageOldType, CustomForm, FieldType, IshtarForm, HistorySelect, \ -    MultiSearchForm +    ManageOldType, CustomForm, FieldType, IshtarForm, \ +    DocumentItemSelect, MultiSearchForm  from ishtar_common.models import Person, valid_id, valid_ids, Organization, \      get_current_profile @@ -43,7 +43,7 @@ logger = logging.getLogger(__name__)  # Treatment -class TreatmentSelect(HistorySelect): +class TreatmentSelect(DocumentItemSelect):      _model = models.Treatment      form_admin_name = _(u"Treatment - 001 - Search")      form_slug = "treatment-001-search" @@ -63,7 +63,6 @@ class TreatmentSelect(HistorySelect):              associated_model=Person),          label=_(u"Scientific monitoring manager"))      treatment_types = forms.ChoiceField(label=_(u"Treatment type"), choices=[]) -    documents__image__isnull = forms.NullBooleanField(label=_(u"Has an image?"))      def __init__(self, *args, **kwargs):          super(TreatmentSelect, self).__init__(*args, **kwargs) @@ -662,7 +661,7 @@ class AdministrativeActTreatmentModifForm(  # treatment requests -class TreatmentFileSelect(HistorySelect): +class TreatmentFileSelect(DocumentItemSelect):      _model = models.TreatmentFile      form_admin_name = _(u"Treatment file - 001 - Search")      form_slug = "treatmentfile-001-search" diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index f4056cf4b..328821386 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -880,7 +880,9 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,      )      # search parameters -    REVERSED_BOOL_FIELDS = ['documents__image__isnull'] +    REVERSED_BOOL_FIELDS = ['documents__image__isnull', +                            'documents__associated_url__isnull', +                            'documents__associated_file__isnull']      BOOL_FIELDS = ['is_complete']      RELATION_TYPES_PREFIX = {          'ope_relation_types': @@ -1042,10 +1044,6 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,              SearchAltName(                  pgettext_lazy("key for text search", "checked"),                  'checked_type__label__iexact'), -        'documents__image__isnull': -            SearchAltName( -                pgettext_lazy("key for text search", "has-image"), -                'documents__image__isnull'),          'container_ref__location':              SearchAltName(                  pgettext_lazy("key for text search", "location"), @@ -1364,6 +1362,7 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,          ),      }      ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) +    ALT_NAMES.update(DocumentItem.ALT_NAMES)      DYNAMIC_REQUESTS = {          'current_division': DynamicRequest( @@ -1608,9 +1607,9 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,          on_delete=models.SET_NULL,          blank=True, null=True      ) -    insurance_value = models.FloatField(_(u"Insurance value"), blank=True, +    insurance_value = models.FloatField(_("Insurance value"), blank=True,                                          null=True) -    appraisal_date = models.DateField(_(u"Appraisal date"), blank=True, +    appraisal_date = models.DateField(_("Appraisal date"), blank=True,                                        null=True)      public_description = models.TextField(_("Public description"), blank=True,                                            null=True) @@ -1993,6 +1992,11 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,          if data:              for k in data:                  setattr(new, k, data[k]) +        # remove associated treatments +        if not duplicate_for_treatment and ( +                new.upstream_treatment or new.downstream_treatment): +            new.upstream_treatment, new.downstream_treatment = None, None +        new.uuid = uuid.uuid4()          new.save()          # m2m fields @@ -2023,6 +2027,8 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,                      user=user, data={"label": new.label, "external_id": None}))              # remove documents for this kind of duplicate (data entry)              new.documents.clear() +            # remove associated treatments +            new.treatments.clear()          return new      @classmethod diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py index 1f2ad1c0f..071d80af1 100644 --- a/archaeological_finds/models_treatments.py +++ b/archaeological_finds/models_treatments.py @@ -74,7 +74,11 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem,                    'person__cached_label',                    'start_date', 'downstream_cached_label',                    'upstream_cached_label') -    REVERSED_BOOL_FIELDS = ['documents__image__isnull'] +    REVERSED_BOOL_FIELDS = [ +        'documents__image__isnull', +        'documents__associated_file__isnull', +        'documents__associated_url__isnull', +    ]      EXTRA_REQUEST_KEYS = {          "downstream_cached_label": "downstream__cached_label",          "upstream_cached_label": "upstream__cached_label", @@ -115,10 +119,6 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem,              pgettext_lazy("key for text search", "index"),              'index'          ), -        'documents__image__isnull': SearchAltName( -            pgettext_lazy("key for text search", "has-image"), -            'documents__image__isnull' -        ),          'treatment_types': SearchAltName(              pgettext_lazy("key for text search", "type"),              'treatment_types__label__iexact' @@ -129,6 +129,7 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem,          ),      }      ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) +    ALT_NAMES.update(DocumentItem.ALT_NAMES)      HISTORICAL_M2M = [          'treatment_types',      ] @@ -143,6 +144,9 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem,          SearchVectorConfig("description", "local"),          SearchVectorConfig("other_reference"),      ] +    PROPERTY_SEARCH_VECTORS = [ +        SearchVectorConfig("year_index"), +    ]      INT_SEARCH_VECTORS = [          SearchVectorConfig("year"),          SearchVectorConfig("index"), @@ -248,6 +252,10 @@ class Treatment(DashboardFormItem, ValueGetter, DocumentItem,      def natural_key(self):          return (self.external_id, ) +    @property +    def year_index(self): +        return "{}-{}".format(self.year, self.index) +      @classmethod      def get_query_owns(cls, ishtaruser):          return (Q(history_creator=ishtaruser.user_ptr) | @@ -907,6 +915,11 @@ class TreatmentFile(DashboardFormItem, ClosedItem, DocumentItem,          "in_charge__pk": "in_charge__pk",  # used by dynamic_table_documents          "applicant__pk": "applicant__pk",  # used by dynamic_table_documents      } +    REVERSED_BOOL_FIELDS = [ +        'documents__image__isnull', +        'documents__associated_file__isnull', +        'documents__associated_url__isnull', +    ]      # alternative names of fields for searches      ALT_NAMES = {          'name': SearchAltName( @@ -959,6 +972,7 @@ class TreatmentFile(DashboardFormItem, ClosedItem, DocumentItem,          ),      }      ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) +    ALT_NAMES.update(DocumentItem.ALT_NAMES)      DATED_FIELDS = ['exhibition_start_date__lte',                      'exhibition_start_date__gte', diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py index e39ebda32..cfdcb1585 100644 --- a/archaeological_finds/tests.py +++ b/archaeological_finds/tests.py @@ -27,6 +27,7 @@ from rest_framework.authtoken.models import Token  from django.conf import settings  from django.contrib.auth.models import User, Permission, ContentType  from django.contrib.gis.geos import GEOSGeometry +from django.core.exceptions import ObjectDoesNotExist  from django.core.files import File  from django.core.files.uploadedfile import SimpleUploadedFile  from django.core.urlresolvers import reverse @@ -1207,12 +1208,22 @@ class FindQATest(FindInit, TestCase):              codename='change_find'))      def test_duplicate(self): +        t1, __ = models.Treatment.objects.get_or_create( +            label="Treatment 1", +            treatment_state=models.TreatmentState.objects.all()[0] +        ) +        t2, __ = models.Treatment.objects.get_or_create( +            label="Treatment 1", +            treatment_state=models.TreatmentState.objects.all()[0] +        )          find = self.finds[0]          default_desc = "Description for duplicate"          find.description = default_desc +        find.upstream_treatment = t1          find.save()          d = Document.objects.create()          d.finds.add(find) +        find.treatments.add(t2)          c = Client()          url = reverse('find-qa-duplicate', args=[find.pk]) @@ -1245,6 +1256,10 @@ class FindQATest(FindInit, TestCase):          base_bf = find.get_first_base_find()          self.assertEqual(new_bf.context_record, base_bf.context_record)          self.assertNotIn(d, list(new.documents.all())) +        # associated treatments are removed #4850 +        self.assertIsNone(new.upstream_treatment) +        self.assertIsNone(new.downstream_treatment) +        self.assertNotIn(t2, list(new.treatments.all()))      def test_bulk_update(self):          c = Client() @@ -1292,6 +1307,63 @@ class FindQATest(FindInit, TestCase):          self.assertEqual(models.Find.objects.get(pk=find_1.pk).description,                           base_desc_1 + u"\n" + extra_desc) +    def test_basket(self): +        find_0 = self.finds[0] +        find_1 = self.finds[1] +        nb_basket = models.FindBasket.objects.count() +        url = reverse('find-qa-basket', args=[find_0.pk]) +        c = Client() +        response = c.get(url) +        self.assertRedirects(response, '/') + +        c.login(username=self.username, password=self.password) +        response = c.get(url) +        self.assertEqual(response.status_code, 200) +        label = "Test - basket" +        data = { +            "qa_bf_create_or_update": "create", +            "qa_bf_label": label +        } +        response = c.post(url, data) +        if response.status_code != 200: +            self.assertRedirects(response, '/success/') +        self.assertEqual( +            nb_basket + 1, +            models.FindBasket.objects.count()) +        q = models.FindBasket.objects.filter( +            user=self.user.ishtaruser, label=label) +        self.assertEqual(q.count(), 1) +        # no duplicate with same user, same name +        c.post(url, data) +        self.assertEqual(q.count(), 1) +        basket = q.all()[0] +        self.assertEqual(basket.items.count(), 1) + +        # update +        url = reverse('find-qa-basket', args=[find_1.pk]) +        self.assertEqual(basket.items.count(), 1) +        data = { +            "qa_bf_create_or_update": "update", +            "qa_bf_basket": basket.pk +        } +        c.post(url, data) +        self.assertEqual(basket.items.count(), 2) +        self.assertIn(find_1, list(basket.items.all())) + +        # no permission +        basket.user = self.alt_user.ishtaruser +        basket.items.clear() +        basket.save() +        self.assertEqual(basket.items.count(), 0) +        c.post(url, data) +        # no update +        self.assertEqual(basket.items.count(), 0) + +        # write permission +        basket.shared_write_with.add(self.user.ishtaruser) +        c.post(url, data) +        self.assertEqual(basket.items.count(), 1) +      def test_packaging(self):          c = Client()          find_0 = self.finds[0] diff --git a/archaeological_operations/admin.py b/archaeological_operations/admin.py index 7d32f6039..057936fc8 100644 --- a/archaeological_operations/admin.py +++ b/archaeological_operations/admin.py @@ -73,6 +73,13 @@ class ArchaeologicalSiteAdmin(HistorizedObjectAdmin):      search_fields = ('name', 'reference')      model = models.ArchaeologicalSite      inlines = [OperationInline] +    ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy() +    ajax_form_dict.update({ +        'towns': 'town', +    }) +    form = make_ajax_form( +        models.ArchaeologicalSite, ajax_form_dict) +    exclude = ["documents", "main_image"]  admin_site.register(models.ArchaeologicalSite, ArchaeologicalSiteAdmin) @@ -103,6 +110,7 @@ class AdminOperationForm(forms.ModelForm):          'archaeological_site', required=False)      if settings.COUNTRY == 'fr':          cira_rapporteur = AutoCompleteSelectField('person', required=False) +    lock_user = AutoCompleteSelectField('user', required=False)  class OperationAdmin(HistorizedObjectAdmin): @@ -115,9 +123,10 @@ class OperationAdmin(HistorizedObjectAdmin):          search_fields += ['code_patriarche']      model = models.Operation      readonly_fields = HistorizedObjectAdmin.readonly_fields + [ -        'cached_label'] +        'cached_label', 'top_sites']      form = AdminOperationForm      inlines = [ArchaeologicalSiteInline] +    exclude = ["documents", "main_image"]  admin_site.register(models.Operation, OperationAdmin) diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index 18534fe9d..d665fc779 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -41,7 +41,7 @@ from ishtar_common import widgets  from ishtar_common.forms import FinalForm, FormSet, get_now, \      reverse_lazy, TableSelect, get_data_from_formset, QAForm, CustomFormSearch,\      ManageOldType, IshtarForm, CustomForm, FieldType, FormHeader, \ -    HistorySelect, LockForm, MultiSearchForm +    DocumentItemSelect, LockForm, MultiSearchForm  from ishtar_common.forms_common import TownFormSet, get_town_field, TownForm  from ishtar_common.models import valid_id, valid_ids, Person, Town, \      DocumentTemplate, Organization, get_current_profile, \ @@ -472,7 +472,7 @@ RecordRelationsFormSet.form_admin_name = _(u"Operation - 080 - Relations")  RecordRelationsFormSet.form_slug = "operation-080-relations" -class OperationSelect(HistorySelect): +class OperationSelect(DocumentItemSelect):      _model = models.Operation      form_admin_name = _(u"Operation - 001 - Search")      form_slug = "operation-001-search" @@ -604,6 +604,7 @@ class OperationFormSelection(LockForm, CustomFormSearch):      SEARCH_AND_SELECT = True      form_label = _(u"Operation search")      associated_models = {'pk': models.Operation} +    extra_form_modals = ["person", "organization"]      currents = {'pk': models.Operation}      pk = forms.IntegerField(          label="", required=False, @@ -617,6 +618,7 @@ class OperationFormSelection(LockForm, CustomFormSearch):  class OperationFormMultiSelection(LockForm, MultiSearchForm):      form_label = _(u"Operation search")      associated_models = {'pks': models.Operation} +    extra_form_modals = ["person", "organization"]      pk_key = 'pks'      pk = forms.CharField(          label="", required=False, @@ -1365,7 +1367,7 @@ class OperationDeletionForm(FinalForm):  ######### -class SiteSelect(HistorySelect): +class SiteSelect(DocumentItemSelect):      _model = models.ArchaeologicalSite      form_admin_name = _(u"Archaeological site - 001 - Search")      form_slug = "archaeological_site-001-search" @@ -1848,22 +1850,32 @@ class AdministrativeActRegisterFormSelection(IshtarForm):  class QAOperationFormMulti(QAForm): -    form_admin_name = _(u"Operation - Quick action - Modify") +    form_admin_name = _("Operation - Quick action - Modify")      form_slug = "operation-quickaction-modify"      base_models = ['qa_operation_type']      associated_models = {          'qa_operation_type': models.OperationType, -        'qa_towns': Town +        'qa_towns': Town, +        'qa_operator': Organization,      }      MULTI = True      REPLACE_FIELDS = [          'qa_operation_type', +        'qa_operator',      ]      qa_operation_type = forms.ChoiceField(          label=_(u"Operation type"), required=False      )      qa_towns = get_town_field(required=False) +    qa_operator = forms.IntegerField( +        label=_("Operator"), +        widget=widgets.JQueryAutoComplete( +            reverse_lazy('autocomplete-organization', +                         args=[organization_type_pk_lazy('operator')]), +            limit={'organization_type': organization_type_pk_lazy('operator')}, +            associated_model=Organization, new=True), +        validators=[valid_id(Organization)], required=False)      TYPES = [          FieldType('qa_operation_type', models.OperationType), @@ -1876,3 +1888,116 @@ class QAOperationFormMulti(QAForm):              return ""          return value +    def _get_qa_operator(self, value): +        try: +            value = Organization.objects.get(pk=value).cached_label +        except Organization.DoesNotExist: +            return "" +        return value + + +class QAOperationDuplicateForm(IshtarForm): +    qa_code_patriarche = forms.CharField( +        max_length=500, widget=OAWidget, label=_("Code PATRIARCHE"), +        required=False) +    qa_year = forms.IntegerField(label=_("Year"), required=False, +                              validators=[validators.MinValueValidator(1000), +                                          validators.MaxValueValidator(2100)]) +    qa_common_name = forms.CharField(label=_("Generic name"), required=False, +                                  max_length=500, widget=forms.Textarea) +    qa_operation_type = forms.ChoiceField(label=_("Operation type"), choices=[]) + +    TYPES = [ +        FieldType('qa_operation_type', models.OperationType), +    ] + +    def __init__(self, *args, **kwargs): +        self.user = None +        if 'user' in kwargs: +            self.user = kwargs.pop('user') +            if hasattr(self.user, 'ishtaruser'): +                self.user = self.user.ishtaruser +        self.operation = kwargs.pop('items')[0] +        super(QAOperationDuplicateForm, self).__init__(*args, **kwargs) + +        self.fields['qa_year'].initial = self.operation.year +        self.fields['qa_common_name'].initial = self.operation.common_name + +        self.fields["qa_operation_type"].initial =  \ +            self.operation.operation_type.pk + +    def clean_qa_code_patriarche(self): +        code = self.cleaned_data['qa_code_patriarche'] +        if models.Operation.objects \ +                .filter(code_patriarche=code).count(): +            raise forms.ValidationError(_("This code already exists.")) +        return code + +    def save(self): +        data = {"operation_code": None} +        for k in ("code_patriarche", "common_name", "year"): +            data[k] = self.cleaned_data.get("qa_" + k, None) +        try: +            data["operation_type"] = models.OperationType.objects.get( +                pk=self.cleaned_data["qa_operation_type"], available=True +            ) +        except models.OperationType.DoesNotExist: +            return +        operation = self.operation.duplicate(self.user, data=data) +        # clear associated sites +        operation.archaeological_sites.clear() +        operation.skip_history_when_saving = True +        operation._cached_label_checked = False +        operation._search_updated = False +        operation._no_move = True +        operation.save()  # regen of labels +        return operation + + +class QAArchaeologicalSiteDuplicateForm(IshtarForm): +    qa_reference = forms.CharField(label=_("Reference"), max_length=200) +    qa_name = forms.CharField(label=_("Name"), max_length=200, required=False) + +    def __init__(self, *args, **kwargs): +        self.user = None +        if 'user' in kwargs: +            self.user = kwargs.pop('user') +            if hasattr(self.user, 'ishtaruser'): +                self.user = self.user.ishtaruser +        self.site = kwargs.pop('items')[0] +        super(QAArchaeologicalSiteDuplicateForm, self).__init__(*args, **kwargs) + +        self.fields['qa_reference'].initial = ( +                self.site.reference or "") + str(_(" - duplicate")) +        self.fields['qa_name'].initial = self.site.name + +    def clean_qa_reference(self): +        reference = self.cleaned_data['qa_reference'] +        if models.ArchaeologicalSite.objects \ +                .filter(reference=reference).count(): +            raise forms.ValidationError(_("This reference already exists.")) +        return reference + +    def save(self): +        data = {} +        for k in ("name", "reference"): +            data[k] = self.cleaned_data.get("qa_" + k, None) +        return self.site.duplicate(self.user, data=data) + + +class QAArchaeologicalSiteFormMulti(QAForm): +    form_admin_name = _("Archaeological files - Quick action - Modify") +    form_slug = "archaeological_site-quickaction-modify" +    associated_models = { +        'qa_towns': Town, +    } + +    MULTI = True +    qa_towns = get_town_field(required=False) + +    def _get_qa_towns(self, value): +        try: +            value = Town.objects.get(pk=value).cached_label +        except Town.DoesNotExist: +            return "" +        return value diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index 402f45485..8a415c0c5 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -180,6 +180,11 @@ class ArchaeologicalSite(DocumentItem, BaseHistorizedItem, QRCodeItem,      }      # alternative names of fields for searches +    REVERSED_BOOL_FIELDS = [ +        'documents__image__isnull', +        'documents__associated_file__isnull', +        'documents__associated_url__isnull', +    ]      ALT_NAMES = {          'reference': SearchAltName(              pgettext_lazy("key for text search", "reference"), @@ -264,6 +269,7 @@ class ArchaeologicalSite(DocumentItem, BaseHistorizedItem, QRCodeItem,          ),      }      ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) +    ALT_NAMES.update(DocumentItem.ALT_NAMES)      UP_MODEL_QUERY = {          "operation": (pgettext_lazy("key for text search", "operation"), @@ -278,12 +284,25 @@ class ArchaeologicalSite(DocumentItem, BaseHistorizedItem, QRCodeItem,      DOWN_MODEL_UPDATE = ["context_records"]      QA_LOCK = QuickAction( -        url="operation-qa-lock", icon_class="fa fa-lock", +        url="site-qa-lock", icon_class="fa fa-lock",          text=_(u"Lock/Unlock"), target="many", -        rights=['change_operation', 'change_own_operation'] +        rights=['change_archaeologicalsite', +                'change_own_archaeologicalsite'] +    ) +    QA_EDIT = QuickAction( +        url="site-qa-bulk-update", icon_class="fa fa-pencil", +        text=_(u"Bulk update"), target="many", +        rights=['change_archaeologicalsite', +                'change_own_archaeologicalsite']      )      QUICK_ACTIONS = [ -        QA_LOCK +        QA_EDIT, +        QA_LOCK, +        QuickAction( +            url="site-qa-duplicate", icon_class="fa fa-clone", +            text=_("Duplicate"), target="one", +            rights=['change_archaeologicalsite', +                    'change_own_archaeologicalsite']),      ]      objects = SiteManager() @@ -409,6 +428,22 @@ class ArchaeologicalSite(DocumentItem, BaseHistorizedItem, QRCodeItem,          return Find.objects.filter(              base_finds__context_record__archaeological_site__pk=self.pk) +    def get_extra_actions(self, request): +        """ +        For sheet template +        """ +        # url, base_text, icon, extra_text, extra css class, is a quick action +        actions = super(ArchaeologicalSite, self).get_extra_actions(request) +        # is_locked = self.is_locked(request.user) + +        can_edit_site = self.can_do(request, 'change_archaeologicalsite') +        if can_edit_site: +            actions += [ +                (reverse("site-qa-duplicate", args=[self.pk]), +                 _("Duplicate"), "fa fa-clone", "", "", True), +            ] +        return actions +      @classmethod      def _get_query_owns_dicts(cls, ishtaruser, no_rel=False):          profile = ishtaruser.current_profile @@ -665,6 +700,11 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem, QRCodeItem,      # search parameters      BOOL_FIELDS = ['end_date__isnull', 'virtual_operation',                     'documentation_received', 'finds_received'] +    REVERSED_BOOL_FIELDS = [ +        'documents__image__isnull', +        'documents__associated_file__isnull', +        'documents__associated_url__isnull', +    ]      DATED_FIELDS = [          'start_date__lte', 'start_date__gte', 'excavation_end_date__lte',          'excavation_end_date__gte', 'documentation_deadline__lte', @@ -922,9 +962,12 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem, QRCodeItem,          ),      }      ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) +    ALT_NAMES.update(DocumentItem.ALT_NAMES) +      QA_EDIT = QuickAction(          url="operation-qa-bulk-update", icon_class="fa fa-pencil",          text=_(u"Bulk update"), target="many", +        rights=['change_operation', 'change_own_operation']      )      QA_LOCK = QuickAction(          url="operation-qa-lock", icon_class="fa fa-lock", @@ -932,7 +975,11 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem, QRCodeItem,          rights=['change_operation', 'change_own_operation']      )      QUICK_ACTIONS = [ -        QA_EDIT, QA_LOCK +        QA_EDIT, QA_LOCK, +        QuickAction( +            url="operation-qa-duplicate", icon_class="fa fa-clone", +            text=_("Duplicate"), target="one", +            rights=['change_operation', 'change_own_operation']),      ]      UP_MODEL_QUERY = { @@ -1352,9 +1399,16 @@ class Operation(ClosedItem, DocumentItem, BaseHistorizedItem, QRCodeItem,          """          # url, base_text, icon, extra_text, extra css class, is a quick action          actions = super(Operation, self).get_extra_actions(request) +        is_locked = self.is_locked(request.user) +        can_edit_operation = self.can_do(request, 'change_operation') +        if can_edit_operation: +            actions += [ +                (reverse("operation-qa-duplicate", args=[self.pk]), +                 _("Duplicate"), "fa fa-clone", "", "", True), +            ]          can_add_cr = self.can_do(request, 'add_contextrecord') -        if can_add_cr and not self.is_locked(request.user): +        if can_add_cr and not is_locked:              actions += [                  (reverse('operation-qa-contextrecord', args=[self.pk]),                   _("Add context record"), "fa fa-plus", diff --git a/archaeological_operations/templates/ishtar/forms/qa_operation_duplicate.html b/archaeological_operations/templates/ishtar/forms/qa_operation_duplicate.html new file mode 100644 index 000000000..3c07cdf65 --- /dev/null +++ b/archaeological_operations/templates/ishtar/forms/qa_operation_duplicate.html @@ -0,0 +1,39 @@ +{% extends "ishtar/forms/qa_base.html" %} +{% load i18n inline_formset table_form %} + +{% block main_form %} +{% if form.non_field_errors %} +<div class="alert alert-danger" role="alert"> +    {{form.non_field_errors}} +</div> +{% endif %} +<div class="form-row"> +    {% with form.qa_code_patriarche as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% with force_large_col=True %} +<div class="form-row"> +    {% with form.qa_year as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +<div class="form-row"> +    {% with form.qa_common_name as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +<div class="form-row"> +    {% with form.qa_operation_type as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% endwith %} +{% comment %} +<p> +    <label for="id_modify">{% trans "Edit the duplicated find" %}{% trans ":" %}</label> +    <input type="checkbox" name="modify" id="id_modify"> +</p> +{% endcomment %} +{% endblock %} + diff --git a/archaeological_operations/templates/ishtar/forms/qa_site_duplicate.html b/archaeological_operations/templates/ishtar/forms/qa_site_duplicate.html new file mode 100644 index 000000000..3affec502 --- /dev/null +++ b/archaeological_operations/templates/ishtar/forms/qa_site_duplicate.html @@ -0,0 +1,23 @@ +{% extends "ishtar/forms/qa_base.html" %} +{% load i18n inline_formset table_form %} + +{% block main_form %} +{% if form.non_field_errors %} +<div class="alert alert-danger" role="alert"> +    {{form.non_field_errors}} +</div> +{% endif %} +{% with force_large_col=True %} +<div class="form-row"> +    {% with form.qa_reference as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +<div class="form-row"> +    {% with form.qa_name as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% endwith %} +{% endblock %} + diff --git a/archaeological_operations/urls.py b/archaeological_operations/urls.py index a52aab3de..77791058a 100644 --- a/archaeological_operations/urls.py +++ b/archaeological_operations/urls.py @@ -185,12 +185,31 @@ urlpatterns = [          check_rights(['change_operation', 'change_own_operation'])(              views.QAOperationForm.as_view()),          name='operation-qa-bulk-update-confirm', kwargs={"confirm": True}), +    url(r'^operation-qa-duplicate/(?P<pks>[0-9-]+)?/$', +        check_rights(['change_operation', 'change_own_operation'])( +            views.QAOperationdDuplicateFormView.as_view()), +        name='operation-qa-duplicate'),      url(r'^operation-qa-lock/(?P<pks>[0-9-]+)?/$',          views.QAOperationLockView.as_view(), name='operation-qa-lock',          kwargs={"model": models.Operation}), +    url(r'^site-qa-duplicate/(?P<pks>[0-9-]+)?/$', +        check_rights(['change_archaeologicalsite', +                      'change_own_archaeologicalsite'])( +            views.QAArchaeologicalSiteDuplicateFormView.as_view()), +        name='site-qa-duplicate'),      url(r'^site-qa-lock/(?P<pks>[0-9-]+)?/$',          views.QASiteLockView.as_view(), name='site-qa-lock',          kwargs={"model": models.ArchaeologicalSite}), +    url(r'^site-qa-bulk-update/(?P<pks>[0-9-]+)?/$', +        check_rights(['change_archaeologicalsite', +                      'change_own_archaeologicalsite'])( +            views.QAArchaeologicalSiteForm.as_view()), +        name='site-qa-bulk-update'), +    url(r'^site-qa-bulk-update/(?P<pks>[0-9-]+)?/confirm/$', +        check_rights(['change_archaeologicalsite', +                      'change_own_archaeologicalsite'])( +            views.QAArchaeologicalSiteForm.as_view()), +        name='site-qa-bulk-update-confirm', kwargs={"confirm": True}),  ] diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py index 38280ccbf..ecacdb560 100644 --- a/archaeological_operations/views.py +++ b/archaeological_operations/views.py @@ -28,33 +28,15 @@ from django.shortcuts import render, redirect  from ishtar_common.utils import ugettext_lazy as _, pgettext_lazy  from archaeological_operations import models -from archaeological_operations.forms import ArchaeologicalSiteForm, \ -    OperationFormSelection, OperationFormFileChoice, OperationFormGeneral, \ -    OperationFormModifGeneral, FinalOperationClosingForm, \ -    CollaboratorForm, ArchaeologicalSiteFormSet, OperationFormPreventive, \ -    OperationFormPreventiveDiag, TownFormset, SelectedTownFormset, \ -    SelectedParcelGeneralFormSet, SelectedParcelFormSet, RemainForm, \ -    PeriodForm, RecordRelationsFormSet, OperationFormAbstract, \ -    OperationDeletionForm, SiteFormSelection, \ -    AdministrativeActOpeFormSelection, AdministrativeActOpeForm, \ -    AdministrativeActOpeModifForm, FinalAdministrativeActDeleteForm, \ -    AdministrativeActRegisterFormSelection, DocumentGenerationAdminActForm, \ -    SiteForm, SiteTownFormset, SiteUnderwaterForm, check_underwater_module, \ -    CourtOrderedSeizureForm, SiteSelect, OperationSelect, \ -    QAOperationFormMulti, OperationFormMultiSelection, SiteFormMultiSelection -from archaeological_operations.wizards import has_associated_file, \ -    is_preventive, is_judiciary, OperationWizard, OperationModificationWizard, \ -    OperationClosingWizard, OperationDeletionWizard, SiteSearch, \ -    OperationAdministrativeActWizard, OperationEditAdministrativeActWizard, \ -    AdministrativeActDeletionWizard, SiteWizard, SiteModificationWizard, \ -    SiteDeletionWizard, OperationSearch +from archaeological_operations import forms +from archaeological_operations import wizards  from ishtar_common.forms import ClosingDateFormSelection, FinalForm, \      FinalDeleteForm  from ishtar_common.models import get_current_profile, IshtarSiteProfile, \      DocumentTemplate  from ishtar_common.utils import put_session_message, check_rights_condition  from ishtar_common.views import gen_generate_doc, QAItemEditForm, \ -    QABaseLockView, wizard_is_available +    QABaseLockView, wizard_is_available, QAItemForm  from ishtar_common.views_item import get_item, show_item, revert_item, \      new_qa_item  from ishtar_common.wizards import SearchWizard @@ -108,7 +90,7 @@ def autocomplete_archaeologicalsite(request):  new_archaeologicalsite = new_qa_item(models.ArchaeologicalSite, -                                     ArchaeologicalSiteForm, many=True) +                                     forms.ArchaeologicalSiteForm, many=True)  def autocomplete_operation(request): @@ -159,7 +141,7 @@ def get_available_operation_code(request, year=None):  get_operation = get_item(models.Operation, 'get_operation', 'operation', -                         search_form=OperationSelect) +                         search_form=forms.OperationSelect)  show_operation = show_item(models.Operation, 'operation')  revert_operation = revert_item(models.Operation) @@ -183,28 +165,28 @@ def dashboard_operation(request, *args, **kwargs):      return render(request, 'ishtar/dashboards/dashboard_operation.html', dct) -operation_search_wizard = OperationSearch.as_view( -    [('general-operation_search', OperationFormSelection)], +operation_search_wizard = wizards.OperationSearch.as_view( +    [('general-operation_search', forms.OperationFormSelection)],      label=_(u"Operation search"),      url_name='operation_search',)  wizard_steps = [ -    ('filechoice-operation_creation', OperationFormFileChoice), -    ('general-operation_creation', OperationFormGeneral), -    ('judiciary-operation_creation', CourtOrderedSeizureForm), -    ('collaborators-operation_creation', CollaboratorForm), -    ('archaeologicalsite-operation_creation', ArchaeologicalSiteFormSet), -    ('preventive-operation_creation', OperationFormPreventive), -    ('preventivediag-operation_creation', OperationFormPreventiveDiag), -    ('townsgeneral-operation_creation', TownFormset), -    ('towns-operation_creation', SelectedTownFormset), -    ('parcelsgeneral-operation_creation', SelectedParcelGeneralFormSet), -    ('parcels-operation_creation', SelectedParcelFormSet), -    ('remains-operation_creation', RemainForm), -    ('periods-operation_creation', PeriodForm), -    ('relations-operation_creation', RecordRelationsFormSet), -    ('abstract-operation_creation', OperationFormAbstract), +    ('filechoice-operation_creation', forms.OperationFormFileChoice), +    ('general-operation_creation', forms.OperationFormGeneral), +    ('judiciary-operation_creation', forms.CourtOrderedSeizureForm), +    ('collaborators-operation_creation', forms.CollaboratorForm), +    ('archaeologicalsite-operation_creation', forms.ArchaeologicalSiteFormSet), +    ('preventive-operation_creation', forms.OperationFormPreventive), +    ('preventivediag-operation_creation', forms.OperationFormPreventiveDiag), +    ('townsgeneral-operation_creation', forms.TownFormset), +    ('towns-operation_creation', forms.SelectedTownFormset), +    ('parcelsgeneral-operation_creation', forms.SelectedParcelGeneralFormSet), +    ('parcels-operation_creation', forms.SelectedParcelFormSet), +    ('remains-operation_creation', forms.RemainForm), +    ('periods-operation_creation', forms.PeriodForm), +    ('relations-operation_creation', forms.RecordRelationsFormSet), +    ('abstract-operation_creation', forms.OperationFormAbstract),      ('final-operation_creation', FinalForm)] @@ -224,49 +206,51 @@ check_files_for_operation = get_check_files_for_operation()  ope_crea_condition_dict = {      'filechoice-operation_creation': check_files_for_operation, -    'judiciary-operation_creation': is_judiciary( +    'judiciary-operation_creation': wizards.is_judiciary(          'general-operation_creation', models.OperationType, 'operation_type',      ),      'preventive-operation_creation':      get_check_files_for_operation( -        is_preventive('general-operation_creation', models.OperationType, -                      'operation_type', 'prev_excavation')), +        wizards.is_preventive('general-operation_creation', +                              models.OperationType, 'operation_type', +                              'prev_excavation')),      'preventivediag-operation_creation':      get_check_files_for_operation( -        is_preventive('general-operation_creation', models.OperationType, -                      'operation_type', 'arch_diagnostic')), -    'townsgeneral-operation_creation': has_associated_file( +        wizards.is_preventive('general-operation_creation', +                              models.OperationType, 'operation_type', +                              'arch_diagnostic')), +    'townsgeneral-operation_creation': wizards.has_associated_file(          'filechoice-operation_creation', negate=True), -    'towns-operation_creation': has_associated_file( +    'towns-operation_creation': wizards.has_associated_file(          'filechoice-operation_creation'), -    'parcelsgeneral-operation_creation': has_associated_file( +    'parcelsgeneral-operation_creation': wizards.has_associated_file(          'filechoice-operation_creation', negate=True), -    'parcels-operation_creation': has_associated_file( +    'parcels-operation_creation': wizards.has_associated_file(          'filechoice-operation_creation'),  } -operation_creation_wizard = OperationWizard.as_view( +operation_creation_wizard = wizards.OperationWizard.as_view(      wizard_steps,      label=_(u"New operation"),      condition_dict=ope_crea_condition_dict,      url_name='operation_creation',)  operation_modif_wizard_steps = [ -    ('selec-operation_modification', OperationFormSelection), -    ('general-operation_modification', OperationFormModifGeneral), -    ('judiciary-operation_modification', CourtOrderedSeizureForm), -    ('collaborators-operation_modification', CollaboratorForm), -    ('archaeologicalsite-operation_modification', ArchaeologicalSiteFormSet), -    ('preventive-operation_modification', OperationFormPreventive), -    ('preventivediag-operation_modification', OperationFormPreventiveDiag), -    ('towns-operation_modification', SelectedTownFormset), -    ('townsgeneral-operation_modification', TownFormset), -    ('parcels-operation_modification', SelectedParcelFormSet), -    ('parcelsgeneral-operation_modification', SelectedParcelGeneralFormSet), -    ('remains-operation_modification', RemainForm), -    ('periods-operation_modification', PeriodForm), -    ('relations-operation_modification', RecordRelationsFormSet), -    ('abstract-operation_modification', OperationFormAbstract), +    ('selec-operation_modification', forms.OperationFormSelection), +    ('general-operation_modification', forms.OperationFormModifGeneral), +    ('judiciary-operation_modification', forms.CourtOrderedSeizureForm), +    ('collaborators-operation_modification', forms.CollaboratorForm), +    ('archaeologicalsite-operation_modification', forms.ArchaeologicalSiteFormSet), +    ('preventive-operation_modification', forms.OperationFormPreventive), +    ('preventivediag-operation_modification', forms.OperationFormPreventiveDiag), +    ('towns-operation_modification', forms.SelectedTownFormset), +    ('townsgeneral-operation_modification', forms.TownFormset), +    ('parcels-operation_modification', forms.SelectedParcelFormSet), +    ('parcelsgeneral-operation_modification', forms.SelectedParcelGeneralFormSet), +    ('remains-operation_modification', forms.RemainForm), +    ('periods-operation_modification', forms.PeriodForm), +    ('relations-operation_modification', forms.RecordRelationsFormSet), +    ('abstract-operation_modification', forms.OperationFormAbstract),      ('final-operation_modification', FinalForm)  ] @@ -274,27 +258,29 @@ operation_modif_wizard_steps = [  ope_modif_condition_dict = {      'preventive-operation_modification':      get_check_files_for_operation( -        is_preventive('general-operation_modification', models.OperationType, -                      'operation_type', 'prev_excavation')), +        wizards.is_preventive('general-operation_modification', +                              models.OperationType, 'operation_type', +                              'prev_excavation')),      'preventivediag-operation_modification':      get_check_files_for_operation( -        is_preventive('general-operation_modification', models.OperationType, -                      'operation_type', 'arch_diagnostic')), -    'judiciary-operation_modification': is_judiciary( +        wizards.is_preventive('general-operation_modification', +                              models.OperationType, 'operation_type', +                              'arch_diagnostic')), +    'judiciary-operation_modification': wizards.is_judiciary(          'general-operation_modification', models.OperationType, 'operation_type',      ), -    'townsgeneral-operation_modification': has_associated_file( +    'townsgeneral-operation_modification': wizards.has_associated_file(          'general-operation_modification', negate=True), -    'towns-operation_modification': has_associated_file( +    'towns-operation_modification': wizards.has_associated_file(          'general-operation_modification'), -    'parcelsgeneral-operation_modification': has_associated_file( +    'parcelsgeneral-operation_modification': wizards.has_associated_file(          'general-operation_modification', negate=True), -    'parcels-operation_modification': has_associated_file( +    'parcels-operation_modification': wizards.has_associated_file(          'general-operation_modification'),  } -operation_modification_wizard = OperationModificationWizard.as_view( +operation_modification_wizard = wizards.OperationModificationWizard.as_view(      operation_modif_wizard_steps,      label=_(u"Operation modification"),      condition_dict=ope_modif_condition_dict, @@ -307,7 +293,7 @@ def operation_modify(request, pk):          return HttpResponseRedirect("/")      wizard_url = 'operation_modification' -    OperationModificationWizard.session_set_value( +    wizards.OperationModificationWizard.session_set_value(          request, 'selec-' + wizard_url, 'pk', pk, reset=True)      return redirect(reverse(wizard_url,                              kwargs={'step': 'general-' + wizard_url})) @@ -315,29 +301,29 @@ def operation_modify(request, pk):  def operation_add(request, file_id):      operation_creation_wizard(request) -    OperationWizard.session_set_value( +    wizards.OperationWizard.session_set_value(          request, 'filechoice-operation_creation', 'associated_file',          file_id, reset=True)      return redirect(reverse('operation_creation',                              kwargs={'step': 'general-operation_creation'}))  operation_closing_steps = [ -    ('selec-operation_closing', OperationFormSelection), +    ('selec-operation_closing', forms.OperationFormSelection),      ('date-operation_closing', ClosingDateFormSelection), -    ('final-operation_closing', FinalOperationClosingForm)] +    ('final-operation_closing', forms.FinalOperationClosingForm)] -operation_closing_wizard = OperationClosingWizard.as_view( +operation_closing_wizard = wizards.OperationClosingWizard.as_view(      operation_closing_steps,      label=_(u"Operation closing"),      url_name='operation_closing',)  operation_deletion_steps = [ -    ('selec-operation_deletion', OperationFormMultiSelection), -    ('final-operation_deletion', OperationDeletionForm) +    ('selec-operation_deletion', forms.OperationFormMultiSelection), +    ('final-operation_deletion', forms.OperationDeletionForm)  ] -operation_deletion_wizard = OperationDeletionWizard.as_view( +operation_deletion_wizard = wizards.OperationDeletionWizard.as_view(      operation_deletion_steps,      label=_(u"Operation deletion"),      url_name='operation_deletion',) @@ -349,7 +335,7 @@ def operation_delete(request, pk):          return HttpResponseRedirect("/")      wizard_url = 'operation_deletion' -    OperationDeletionWizard.session_set_value( +    wizards.OperationDeletionWizard.session_set_value(          request, 'selec-' + wizard_url, 'pks', pk, reset=True)      return redirect(reverse(wizard_url,                              kwargs={'step': 'final-' + wizard_url})) @@ -362,43 +348,44 @@ def site_extra_context(request, item):  get_site = get_item(models.ArchaeologicalSite, 'get_site', 'site', -                    search_form=SiteSelect) +                    search_form=forms.SiteSelect)  show_site = show_item(      models.ArchaeologicalSite, 'site',      extra_dct=site_extra_context  )  revert_site = revert_item(models.ArchaeologicalSite) -site_search_wizard = SiteSearch.as_view( -    [('general-site_search', SiteFormSelection)], +site_search_wizard = wizards.SiteSearch.as_view( +    [('general-site_search', forms.SiteFormSelection)],      url_name='site_search',  )  site_creation_steps = [ -    ('general-site_creation', SiteForm), -    ('towns-site_creation', SiteTownFormset), -    ('underwater-site_creation', SiteUnderwaterForm), +    ('general-site_creation', forms.SiteForm), +    ('towns-site_creation', forms.SiteTownFormset), +    ('underwater-site_creation', forms.SiteUnderwaterForm),      ('final-site_creation', FinalForm)  ] -site_creation_wizard = SiteWizard.as_view( +site_creation_wizard = wizards.SiteWizard.as_view(      site_creation_steps, -    condition_dict={'underwater-site_creation': check_underwater_module}, +    condition_dict={'underwater-site_creation': forms.check_underwater_module},      url_name='site_creation',  )  site_modification_steps = [ -    ('selec-site_modification', SiteFormSelection), -    ('general-site_modification', SiteForm), -    ('towns-site_modification', SiteTownFormset), -    ('underwater-site_modification', SiteUnderwaterForm), +    ('selec-site_modification', forms.SiteFormSelection), +    ('general-site_modification', forms.SiteForm), +    ('towns-site_modification', forms.SiteTownFormset), +    ('underwater-site_modification', forms.SiteUnderwaterForm),      ('final-site_modification', FinalForm)  ] -site_modification_wizard = SiteModificationWizard.as_view( +site_modification_wizard = wizards.SiteModificationWizard.as_view(      site_modification_steps, -    condition_dict={'underwater-site_modification': check_underwater_module}, +    condition_dict={ +        'underwater-site_modification': forms.check_underwater_module},      url_name='site_modification',  ) @@ -408,18 +395,18 @@ def site_modify(request, pk):                                 models.ArchaeologicalSite, pk):          return HttpResponseRedirect("/")      wizard_url = 'site_modification' -    SiteModificationWizard.session_set_value( +    wizards.SiteModificationWizard.session_set_value(          request, 'selec-' + wizard_url, 'pk', pk, reset=True)      return redirect(reverse(wizard_url,                              kwargs={'step': 'general-' + wizard_url}))  site_deletion_steps = [ -    ('selec-site_deletion', SiteFormMultiSelection), +    ('selec-site_deletion', forms.SiteFormMultiSelection),      ('final-site_deletion', FinalDeleteForm)  ] -site_deletion_wizard = SiteDeletionWizard.as_view( +site_deletion_wizard = wizards.SiteDeletionWizard.as_view(      site_deletion_steps,      label=_(u"Site deletion"),      url_name='site_deletion',) @@ -430,38 +417,38 @@ def site_delete(request, pk):                                 models.ArchaeologicalSite, pk):          return HttpResponseRedirect("/")      wizard_url = 'site_deletion' -    SiteDeletionWizard.session_set_value( +    wizards.SiteDeletionWizard.session_set_value(          request, 'selec-' + wizard_url, 'pks', pk, reset=True)      return redirect(reverse(wizard_url,                              kwargs={'step': 'final-' + wizard_url})) -operation_administrativeactop_search_wizard = SearchWizard.as_view([ +operation_administrativeactop_search_wizard = wizards.SearchWizard.as_view([      ('general-operation_administrativeactop_search', -     AdministrativeActOpeFormSelection)], +     forms.AdministrativeActOpeFormSelection)],      label=_(u"Administrative act search"),      url_name='operation_administrativeactop_search',)  administrativeactop_steps = [ -    ('selec-operation_administrativeactop', OperationFormSelection), +    ('selec-operation_administrativeactop', forms.OperationFormSelection),      ('administrativeact-operation_administrativeactop', -     AdministrativeActOpeForm), +     forms.AdministrativeActOpeForm),      ('final-operation_administrativeactop', FinalForm)]  operation_administrativeactop_wizard = \ -    OperationAdministrativeActWizard.as_view( +    wizards.OperationAdministrativeActWizard.as_view(          administrativeactop_steps,          label=_(u"Operation: new administrative act"),          url_name='operation_administrativeactop',)  operation_administrativeactop_modification_wizard = \ -    OperationEditAdministrativeActWizard.as_view([ +    wizards.OperationEditAdministrativeActWizard.as_view([          ('selec-operation_administrativeactop_modification', -         AdministrativeActOpeFormSelection), +         forms.AdministrativeActOpeFormSelection),          ('administrativeact-operation_administrativeactop_modification', -         AdministrativeActOpeModifForm), +         forms.AdministrativeActOpeModifForm),          ('final-operation_administrativeactop_modification', FinalForm)], -        label=_(u"Operation: administrative act modification"), +        label=_("Operation: administrative act modification"),          url_name='operation_administrativeactop_modification',) @@ -471,18 +458,18 @@ def operation_administrativeactop_modify(request, pk):              models.AdministrativeAct, pk):          return HttpResponseRedirect("/")      wizard_url = 'operation_administrativeactop_modification' -    OperationEditAdministrativeActWizard.session_set_value( +    wizards.OperationEditAdministrativeActWizard.session_set_value(          request, 'selec-' + wizard_url, 'pk', pk, reset=True)      return redirect(          reverse(wizard_url, kwargs={'step': 'administrativeact-' + wizard_url}))  operation_administrativeactop_deletion_wizard = \ -    AdministrativeActDeletionWizard.as_view([ +    wizards.AdministrativeActDeletionWizard.as_view([          ('selec-operation_administrativeactop_deletion', -         AdministrativeActOpeFormSelection), +         forms.AdministrativeActOpeFormSelection),          ('final-operation_administrativeactop_deletion', -         FinalAdministrativeActDeleteForm)], +         forms.FinalAdministrativeActDeleteForm)],          label=_(u"Operation: administrative act deletion"),          url_name='operation_administrativeactop_deletion',) @@ -493,7 +480,7 @@ def operation_administrativeactop_delete(request, pk):              models.AdministrativeAct, pk):          return HttpResponseRedirect("/")      wizard_url = 'operation_administrativeactop_deletion' -    AdministrativeActDeletionWizard.session_set_value( +    wizards.AdministrativeActDeletionWizard.session_set_value(          request, 'selec-' + wizard_url, 'pk', pk, reset=True)      return redirect(          reverse(wizard_url, kwargs={'step': 'final-' + wizard_url})) @@ -501,7 +488,7 @@ def operation_administrativeactop_delete(request, pk):  administrativact_register_wizard = SearchWizard.as_view([      ('general-administrativact_register', -     AdministrativeActRegisterFormSelection)], +     forms.AdministrativeActRegisterFormSelection)],      label=pgettext_lazy('admin act register', u"Register"),      url_name='administrativact_register',) @@ -511,7 +498,7 @@ generatedoc_administrativeactop = gen_generate_doc(models.AdministrativeAct)  def administrativeactfile_document(          request, file=False, treatment=False, treatment_file=False): -    search_form = AdministrativeActOpeFormSelection +    search_form = forms.AdministrativeActOpeFormSelection      document_type = 'O'      if file:          from archaeological_files.forms import \ @@ -533,6 +520,7 @@ def administrativeactfile_document(                                   models.AdministrativeAct):          return HttpResponse(content_type='text/plain')      dct = {} +    DocumentGenerationAdminActForm = forms.DocumentGenerationAdminActForm      if request.POST:          dct['search_form'] = search_form(request.POST)          dct['template_form'] = DocumentGenerationAdminActForm( @@ -578,22 +566,22 @@ def administrativeactfile_document(  def reset_wizards(request):      for wizard_class, url_name in ( -            (OperationWizard, 'operation_creation'), -            (OperationModificationWizard, 'operation_modification'), -            (OperationClosingWizard, 'operation_closing'), -            (OperationDeletionWizard, 'operation_deletion_wizard'), -            (OperationAdministrativeActWizard, +            (wizards.OperationWizard, 'operation_creation'), +            (wizards.OperationModificationWizard, 'operation_modification'), +            (wizards.OperationClosingWizard, 'operation_closing'), +            (wizards.OperationDeletionWizard, 'operation_deletion_wizard'), +            (wizards.OperationAdministrativeActWizard,               'operation_administrativeactop'), -            (OperationEditAdministrativeActWizard, +            (wizards.OperationEditAdministrativeActWizard,               'operation_administrativeactop_modification'), -            (AdministrativeActDeletionWizard, +            (wizards.AdministrativeActDeletionWizard,               'operation_administrativeactop_deletion'),):          wizard_class.session_reset(request, url_name)  class QAOperationForm(QAItemEditForm):      model = models.Operation -    form_class = QAOperationFormMulti +    form_class = forms.QAOperationFormMulti  class QAOperationLockView(QABaseLockView): @@ -604,3 +592,55 @@ class QAOperationLockView(QABaseLockView):  class QASiteLockView(QABaseLockView):      model = models.ArchaeologicalSite      base_url = "site-qa-lock" + + +class QAOperationdDuplicateFormView(QAItemForm): +    template_name = 'ishtar/forms/qa_operation_duplicate.html' +    model = models.Operation +    page_name = _("Duplicate") +    form_class = forms.QAOperationDuplicateForm +    base_url = "operation-qa-duplicate" + +    def get_form_kwargs(self): +        kwargs = super(QAOperationdDuplicateFormView, self).get_form_kwargs() +        kwargs['user'] = self.request.user +        return kwargs + +    def form_valid(self, form): +        form.save() +        return HttpResponseRedirect(reverse("success")) + +    def get_context_data(self, **kwargs): +        data = super(QAOperationdDuplicateFormView, self).get_context_data( +            **kwargs) +        data['action_name'] = _("Duplicate") +        return data + + +class QAArchaeologicalSiteDuplicateFormView(QAItemForm): +    template_name = 'ishtar/forms/qa_site_duplicate.html' +    model = models.ArchaeologicalSite +    page_name = _("Duplicate") +    form_class = forms.QAArchaeologicalSiteDuplicateForm +    base_url = "site-qa-duplicate" + +    def get_form_kwargs(self): +        kwargs = super(QAArchaeologicalSiteDuplicateFormView, +                       self).get_form_kwargs() +        kwargs['user'] = self.request.user +        return kwargs + +    def form_valid(self, form): +        form.save() +        return HttpResponseRedirect(reverse("success")) + +    def get_context_data(self, **kwargs): +        data = super(QAArchaeologicalSiteDuplicateFormView, +                     self).get_context_data(**kwargs) +        data['action_name'] = _("Duplicate") +        return data + + +class QAArchaeologicalSiteForm(QAItemEditForm): +    model = models.ArchaeologicalSite +    form_class = forms.QAArchaeologicalSiteFormMulti diff --git a/archaeological_warehouse/admin.py b/archaeological_warehouse/admin.py index 1284fe676..22e53490b 100644 --- a/archaeological_warehouse/admin.py +++ b/archaeological_warehouse/admin.py @@ -37,11 +37,15 @@ class WarehouseAdmin(HistorizedObjectAdmin):      list_filter = ('warehouse_type',)      search_fields = ('name', 'town')      model = models.Warehouse -    form = make_ajax_form(model, { +    ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy() +    ajax_form_dict.update({          'town': 'town', +        'precise_town': 'town',          'person_in_charge': 'person'      }) +    form = make_ajax_form(model, ajax_form_dict)      inlines = [DivisionInline] +    exclude = ["documents", "main_image"]  admin_site.register(models.Warehouse, WarehouseAdmin) @@ -63,10 +67,13 @@ class ContainerAdmin(HistorizedObjectAdmin):      readonly_fields = HistorizedObjectAdmin.readonly_fields + [          'history_date'      ] -    form = make_ajax_form(model, { +    ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy() +    ajax_form_dict.update({          'location': 'warehouse',          'responsible': 'warehouse'      }) +    form = make_ajax_form(model, ajax_form_dict) +    exclude = ["documents", "main_image"]  admin_site.register(models.Container, ContainerAdmin) diff --git a/archaeological_warehouse/forms.py b/archaeological_warehouse/forms.py index b950a5d3c..a7b6c575e 100644 --- a/archaeological_warehouse/forms.py +++ b/archaeological_warehouse/forms.py @@ -27,7 +27,7 @@ from django.forms.formsets import formset_factory  from ishtar_common.utils import ugettext_lazy as _  from ishtar_common.models import Person, valid_id, Town, \ -    SpatialReferenceSystem, Organization, valid_ids +    SpatialReferenceSystem, Organization, valid_ids, person_type_pks_lazy  from archaeological_operations.models import ArchaeologicalSite  from archaeological_context_records.models import ContextRecord  from archaeological_finds.models import TreatmentType, FindBasket, \ @@ -42,7 +42,7 @@ from bootstrap_datepicker.widgets import DatePicker  from ishtar_common.forms import name_validator, reverse_lazy, \      get_form_selection, ManageOldType, FinalForm, FormSet, \ -    CustomForm, FieldType, HistorySelect, FormHeader, TableSelect, \ +    CustomForm, FieldType, DocumentItemSelect, FormHeader, TableSelect, \      CustomFormSearch, MultiSearchForm, LockForm  from ishtar_common.forms_common import get_town_field  from archaeological_finds.forms import FindMultipleFormSelection, \ @@ -99,8 +99,9 @@ class WarehouseSelect(CustomForm, TableSelect):          label=_(u"Full text search"), widget=widgets.SearchWidget(              'archaeological-warehouse', 'warehouse'          )) -    name = forms.CharField(label=_(u"Name")) -    warehouse_type = forms.ChoiceField(label=_(u"Warehouse type"), choices=[]) +    name = forms.CharField(label=_("Name")) +    warehouse_type = forms.ChoiceField(label=_("Warehouse type"), choices=[]) +    town = get_town_field(label=_("Town"))      def __init__(self, *args, **kwargs):          super(WarehouseSelect, self).__init__(*args, **kwargs) @@ -353,7 +354,7 @@ class ContainerModifyForm(ContainerForm):          return cleaned_data -class ContainerSelect(HistorySelect): +class ContainerSelect(DocumentItemSelect):      _model = models.Container      form_admin_name = _(u"Container - 001 - Search")      form_slug = "container-001-search" @@ -390,14 +391,22 @@ class ContainerSelect(HistorySelect):      archaeological_sites_context_record_name = forms.CharField(          label=_(u"Archaeological site name (attached to the context record)")      ) -    code_patriarche = forms.IntegerField(label=_(u"Code PATRIARCHE"), +    code_patriarche = forms.IntegerField(label=_("Operation - Code PATRIARCHE"),                                           widget=OAWidget) +    operation_town = get_town_field(label=_("Operation - town")) +    operation_scientist = forms.IntegerField( +        widget=widgets.JQueryAutoComplete( +            reverse_lazy('autocomplete-person-permissive'), +            associated_model=Person), +        label=_("Operation - Scientist"))      context_record = forms.IntegerField(          label=_("Context record"),          widget=widgets.JQueryAutoComplete(              reverse_lazy('autocomplete-contextrecord'),              associated_model=ContextRecord),          validators=[valid_id(ContextRecord)]) +    find_label = forms.CharField(label=_("Find - Label")) +    find_denomination = forms.CharField(label=_("Find - Denomination"))      description = forms.CharField(label=_(u"Find - Description"))      material_types = forms.IntegerField(          label=_(u"Material type"), diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index 64a766cea..63d4497ac 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -20,7 +20,6 @@  import datetime  import uuid -from django.conf import settings  from django.contrib.gis.db import models  from django.contrib.postgres.indexes import GinIndex  from django.core.urlresolvers import reverse @@ -66,6 +65,7 @@ class Warehouse(Address, DocumentItem, GeoItem, QRCodeItem, DashboardFormItem,          SearchVectorConfig("warehouse_type__label"),          SearchVectorConfig("external_id"),          SearchVectorConfig("town"), +        SearchVectorConfig("precise_town__name"),          SearchVectorConfig("comment", "local"),      ] @@ -84,6 +84,11 @@ class Warehouse(Address, DocumentItem, GeoItem, QRCodeItem, DashboardFormItem,              pgettext_lazy("key for text search", "type"),              'warehouse_type__label__iexact'          ), +        'town': +            SearchAltName( +                pgettext_lazy("key for text search", "town"), +                'precise_town__cached_label__iexact' +            ),      }      GEO_LABEL = "name"      DOWN_MODEL_UPDATE = ["containers"] @@ -497,6 +502,18 @@ class Container(DocumentItem, LightHistorizedItem, QRCodeItem, GeoItem,              pgettext_lazy("key for text search", "comment"),              'comment__iexact'          ), +        'operation_town': +            SearchAltName( +                pgettext_lazy("key for text search", "operation-town"), +                'finds__base_finds__context_record__operation__' +                'towns__cached_label__iexact' +            ), +        'operation_scientist': +            SearchAltName( +                pgettext_lazy("key for text search", "operation-scientist"), +                'finds__base_finds__context_record__operation__' +                'scientist__cached_label__iexact' +            ),          'code_patriarche':              SearchAltName(                  pgettext_lazy("key for text search", "code-patriarche"), @@ -528,6 +545,14 @@ class Container(DocumentItem, LightHistorizedItem, QRCodeItem, GeoItem,              SearchAltName(                  pgettext_lazy("key for text search", "context-record"),                  'finds__base_finds__context_record__cached_label__icontains'), +        'find_label': +            SearchAltName( +                pgettext_lazy("key for text search", "find-label"), +                'finds__label__icontains'), +        'find_denomination': +            SearchAltName( +                pgettext_lazy("key for text search", "find-denomination"), +                'finds__denomination__icontains'),          'material_types':              SearchAltName(                  pgettext_lazy("key for text search", "material"), @@ -578,9 +603,15 @@ class Container(DocumentItem, LightHistorizedItem, QRCodeItem, GeoItem,          ),      } +    REVERSED_BOOL_FIELDS = [ +        'documents__image__isnull', +        'documents__associated_file__isnull', +        'documents__associated_url__isnull', +    ]      REVERSED_MANY_COUNTED_FIELDS = ['finds', 'finds_ref']      ALT_NAMES.update(LightHistorizedItem.ALT_NAMES) +    ALT_NAMES.update(DocumentItem.ALT_NAMES)      DYNAMIC_REQUESTS = {          'division': DynamicRequest( @@ -909,7 +940,25 @@ class Container(DocumentItem, LightHistorizedItem, QRCodeItem, GeoItem,              loca.delete() -post_save.connect(cached_label_and_geo_changed, sender=Container) +def container_post_save(sender, **kwargs): +    cached_label_and_geo_changed(sender=sender, **kwargs) +    if not kwargs.get('instance'): +        return +    instance = kwargs.get('instance') +    for loca in ContainerLocalisation.objects.filter( +            container=instance).exclude( +            division__warehouse=instance.location).all(): +        q = WarehouseDivisionLink.objects.filter( +            warehouse=instance.location, +            division=loca.division.division +        ) +        if not q.count(): +            continue +        loca.division = q.all()[0] +        loca.save() + + +post_save.connect(container_post_save, sender=Container)  m2m_changed.connect(document_attached_changed,                      sender=Container.documents.through) diff --git a/archaeological_warehouse/tests.py b/archaeological_warehouse/tests.py index 72124e685..37c342ef7 100644 --- a/archaeological_warehouse/tests.py +++ b/archaeological_warehouse/tests.py @@ -527,15 +527,23 @@ class WarehouseTest(TestCase):  class ContainerTest(FindInit, TestCase):      fixtures = WAREHOUSE_FIXTURES -    def test_form_creation(self): -        main_warehouse = models.Warehouse.objects.create( +    def setUp(self): +        self.main_warehouse = models.Warehouse.objects.create(              name="Main",              warehouse_type=models.WarehouseType.objects.all()[0]          ) +        self.division = models.WarehouseDivision.objects.create( +            label='division') +        self.alt_division = models.WarehouseDivision.objects.create( +            label='division2') +        self.div_link = models.WarehouseDivisionLink.objects.create( +            warehouse=self.main_warehouse, division=self.division) + +    def test_form_creation(self):          data = {              'reference': 'hop-ref', -            "responsible": main_warehouse.pk, -            "location": main_warehouse.pk, +            "responsible": self.main_warehouse.pk, +            "location": self.main_warehouse.pk,              "container_type": models.ContainerType.objects.all()[0].pk          }          form = forms.ContainerForm(data=data) @@ -547,29 +555,21 @@ class ContainerTest(FindInit, TestCase):                           self.container_number + 1)      def test_change_location(self): -        main_warehouse = models.Warehouse.objects.create( -            name="Main", -            warehouse_type=models.WarehouseType.objects.all()[0] -        ) -        div = models.WarehouseDivision.objects.create(label='division') -        div_link = models.WarehouseDivisionLink.objects.create( -            warehouse=main_warehouse, division=div) -          container = models.Container.objects.create( -            reference="Test", responsible=main_warehouse, -            location=main_warehouse, +            reference="Test", responsible=self.main_warehouse, +            location=self.main_warehouse,              container_type=models.ContainerType.objects.all()[0]          )          container.save()          container = models.Container.objects.get(pk=container.pk) -        self.assertIn(main_warehouse.name, container.cached_location) +        self.assertIn(self.main_warehouse.name, container.cached_location)          models.ContainerLocalisation.objects.create( -            container=container, division=div_link, +            container=container, division=self.div_link,          )          self.assertTrue(models.ContainerLocalisation.objects.filter( -            division__warehouse=main_warehouse).count()) +            division__warehouse=self.main_warehouse).count())          # changing location remove irrelevant localisation          other_warehouse = models.Warehouse.objects.create(              name="Other", @@ -578,23 +578,58 @@ class ContainerTest(FindInit, TestCase):          container.location = other_warehouse          container.save()          self.assertFalse(models.ContainerLocalisation.objects.filter( -            division__warehouse=main_warehouse).count()) +            division__warehouse=self.main_warehouse).count()) -    def test_update_containers_on_warehouse_update(self): -        main_warehouse = models.Warehouse.objects.create( -            name="Main", +    def test_reassign_existing_division_on_warehouse_change(self): +        container = models.Container.objects.create( +            reference="Test", responsible=self.main_warehouse, +            location=self.main_warehouse, +            container_type=models.ContainerType.objects.all()[0] +        ) +        container_loca = models.ContainerLocalisation.objects.create( +            container=container, division=self.div_link, +        ) + +        alt_warehouse = models.Warehouse.objects.create( +            name="Alternative",              warehouse_type=models.WarehouseType.objects.all()[0]          ) +        new_div_link = models.WarehouseDivisionLink.objects.create( +            warehouse=alt_warehouse, division=self.division) + +        nb_container_loca = models.ContainerLocalisation.objects.count() + +        container.location = alt_warehouse +        container.save() + +        # no new container localisation +        self.assertEqual(nb_container_loca, +                         models.ContainerLocalisation.objects.count()) +        # but the new one is reaffected +        container_loca = models.ContainerLocalisation.objects.get( +            pk=container_loca.pk) +        self.assertEqual(container_loca.division, new_div_link) + +        # reaffect first division link +        self.div_link.division = self.alt_division +        self.div_link.save() +        container.location = self.main_warehouse +        container.save() +        # cannot reaffect -> the location is not preserved +        self.assertEqual(nb_container_loca, +                         models.ContainerLocalisation.objects.count() + 1) + +    def test_update_containers_on_warehouse_update(self):          container = models.Container.objects.create( -            reference="Test", responsible=main_warehouse, -            location=main_warehouse, +            reference="Test", responsible=self.main_warehouse, +            location=self.main_warehouse,              container_type=models.ContainerType.objects.all()[0]          )          container.save()          container = models.Container.objects.get(pk=container.pk) -        self.assertIn(main_warehouse.name, container.cached_location) -        main_warehouse.name = "New name" -        main_warehouse.save() +        self.assertIn(self.main_warehouse.name, container.cached_location) +        self.main_warehouse.name = "New name" +        self.main_warehouse.save()          self.assertEqual(              models.Container.objects.filter(                  need_update=True @@ -619,19 +654,15 @@ class ContainerTest(FindInit, TestCase):          profile.locate_warehouses = True          profile.save()          wgs84 = SpatialReferenceSystem.objects.get(srid=4326) -        main_warehouse = models.Warehouse.objects.create( -            name="Main", -            warehouse_type=models.WarehouseType.objects.all()[0], -        )          container = models.Container.objects.create( -            reference="Test", responsible=main_warehouse, -            location=main_warehouse, +            reference="Test", responsible=self.main_warehouse, +            location=self.main_warehouse,              container_type=models.ContainerType.objects.all()[0]          )          container.save()          self.assertEqual(container.x, None) -        main_warehouse = models.Warehouse.objects.get(pk=main_warehouse.pk) +        main_warehouse = models.Warehouse.objects.get(pk=self.main_warehouse.pk)          main_warehouse.x, main_warehouse.y = 33, 42          main_warehouse.spatial_reference_system = wgs84          main_warehouse.save() diff --git a/debian/changelog b/debian/changelog deleted file mode 100644 index 385a7355c..000000000 --- a/debian/changelog +++ /dev/null @@ -1,5 +0,0 @@ -python-django-ishtar (0.9-1) UNRELEASED; urgency=low - -  * Initial release. - - -- Étienne Loks <etienne.loks@peacefrogs.net>  Thu, 24 Apr 2014 17:14:29 +0200 diff --git a/debian/compat b/debian/compat deleted file mode 100644 index ec635144f..000000000 --- a/debian/compat +++ /dev/null @@ -1 +0,0 @@ -9 diff --git a/debian/control b/debian/control deleted file mode 100644 index eaa0d9fc8..000000000 --- a/debian/control +++ /dev/null @@ -1,33 +0,0 @@ -Source: python-django-ishtar -Section: python -Priority: optional -Maintainer: Étienne Loks <etienne.loks@peacefrogs.net> -Build-Depends: debhelper (>= 9.0.0), - python | python-all | python-dev | python-all-dev, - python-setuptools -Standards-Version: 3.9.3 -Homepage: http://pypi.python.org/pypi/ishtar - -Package: python-django-ishtar -Architecture: all -Depends: ${misc:Depends}, - ${python:Depends}, - python-django (>= 1.4), - python-django (<< 1.5), - python-psycopg2, - python-imaging, - python-django-registration, - python-django-south, - python-pisa, - python-reportlab, - python-dbf, - python-tidylib, - python-lxml, - python-html5lib, - python-memcache -Recommends: javascript-common, - libjs-jquery, - libjs-jquery-ui, - libjs-jquery-ui-theme-base, - memcached -Description: TBD diff --git a/debian/copyright b/debian/copyright deleted file mode 100644 index 6297d8604..000000000 --- a/debian/copyright +++ /dev/null @@ -1,42 +0,0 @@ -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: ishtar -Source: git://lysithea.proxience.com/git/ishtar.git - -Files: * -Copyright: 2013 Étienne Loks <etienne.loks@peacefrogs.net> -License: AGPL-3.0+ - -Files: debian/* -Copyright: 2013 Étienne Loks <etienne.loks@peacefrogs.net> -License: GPL-3.0+ - -License: GPL-3.0+ - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - . - This package is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - GNU General Public License for more details. - . - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - . - On Debian systems, the complete text of the GNU General - Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". - -License: AGPL-3.0 - This program is free software: you can use, redistribute, and/or modify - this code under the terms of the GNU Affero General Public License - version 3. - . - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - . - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - diff --git a/debian/rules b/debian/rules deleted file mode 100755 index dd12cc51f..000000000 --- a/debian/rules +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -PYTHON2=$(shell pyversions -vr) - -# Prevent setuptools/distribute from accessing the internet. -export http_proxy = http://127.0.9.1:9 - -%: -	dh $@ --with python2 - -override_dh_auto_clean: -	dh_auto_clean -	rm -rf build -	rm -rf *.egg-info diff --git a/debian/source/format b/debian/source/format deleted file mode 100644 index 163aaf8d8..000000000 --- a/debian/source/format +++ /dev/null @@ -1 +0,0 @@ -3.0 (quilt) diff --git a/example_project/celery_app.py.sample b/example_project/celery_app.py.sample index 23c050732..81000bc14 100644 --- a/example_project/celery_app.py.sample +++ b/example_project/celery_app.py.sample @@ -1,6 +1,7 @@  import os  from celery import Celery +  # change example_project with your project name  project_name = "example_project" @@ -10,4 +11,4 @@ os.environ.setdefault('DJANGO_SETTINGS_MODULE', project_name + '.settings')  app = Celery(project_name)  app.config_from_object('django.conf:settings', namespace='CELERY') -app.autodiscover_tasks()
\ No newline at end of file +app.autodiscover_tasks() diff --git a/example_project/settings.py b/example_project/settings.py index b858c5907..a5d1d3b3e 100644 --- a/example_project/settings.py +++ b/example_project/settings.py @@ -6,6 +6,13 @@ import os  import sys  from importlib import import_module +try: +    import sentry_sdk +    from sentry_sdk.integrations.celery import CeleryIntegration +    from sentry_sdk.integrations.django import DjangoIntegration +except ImportError: +    sentry_sdk = None +  DEBUG = False  DEBUG_TOOLBAR = False  DEBUG_TO_CONSOLE = False @@ -286,8 +293,8 @@ MAX_UPLOAD_SIZE = 100  # in Mo  DOT_BINARY = "/usr/bin/dot"  TEST_RUNNER = 'ishtar_common.tests.ManagedModelTestRunner' -  CELERY_BROKER_URL = '' +SENTRY_ID = None  try:      from local_settings import * @@ -392,3 +399,13 @@ if 'test' in sys.argv:  if not DEBUG:      # persistent connection      DATABASES['default']['CONN_MAX_AGE'] = 600 + +if SENTRY_ID and sentry_sdk: +    sentry_integrations = [DjangoIntegration()] +    if USE_BACKGROUND_TASK: +        sentry_integrations.append(CeleryIntegration()) +    sentry_sdk.init( +        dsn=SENTRY_ID, +        integrations=sentry_integrations, +        send_default_pii=True +    ) diff --git a/install/local_settings.py.sample b/install/local_settings.py.sample index aecad17a6..7c6bac348 100644 --- a/install/local_settings.py.sample +++ b/install/local_settings.py.sample @@ -39,4 +39,7 @@ DATABASES = {  try:      from extra_settings import *  except ImportError as e: -    print('Unable to load extra_settings.py:', e) +    try: +        from .extra_settings import *  # relative import for celery +    except ImportError as e: +        print('Unable to load extra_settings.py:', e) diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index 2cf189d2d..71dc2cbdc 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -211,7 +211,12 @@ admin_site.register(Token, TokenAdmin)  class HistorizedObjectAdmin(admin.ModelAdmin): -    readonly_fields = ['history_creator', 'history_modifier', 'search_vector'] +    readonly_fields = ['history_creator', 'history_modifier', 'search_vector', +                       'history_m2m'] + +    AJAX_FORM_DICT = { +        'lock_user': 'user', +    }      def save_model(self, request, obj, form, change):          obj.history_modifier = request.user diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index 85c5437d1..8ce613755 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -890,6 +890,7 @@ class Importer(object):          self.match_table = {}          self.concats = set()          self.concat_str = {} +        self.to_be_close = []          if import_instance and import_instance.imported_images:              self.archive = import_instance.imported_images          self._defaults = self.DEFAULTS.copy() @@ -1005,7 +1006,7 @@ class Importer(object):      @classmethod      def _field_name_to_data_dict(              cls, field_name, value, data, force_value=False, concat=False, -            concat_str=u"", force_new=False): +            concat_str="", force_new=False):          field_names = field_name          if type(field_names) not in (list, tuple):              field_names = [field_name] @@ -1027,8 +1028,8 @@ class Importer(object):                              if not value:                                  continue                              current_data[key] = ( -                                    current_data[key] + concat_str) \ -                                if current_data[key] else u"" +                                current_data[key] + (concat_str or "")) \ +                                if current_data[key] else ""                              current_data[key] += value                      elif force_value and value:                          if concat_str and key in current_data \ @@ -1104,9 +1105,14 @@ class Importer(object):                  results.append(self._line_processing(idx_line, line))              except ImporterError as msg:                  self.errors.append((idx_line, None, msg)) +        for item in self.to_be_close: +            item.close()          return results      def _line_processing(self, idx_line, line): +        for item in self.to_be_close: +            item.close() +        self.to_be_close = []          self.idx_line = idx_line          if self.skip_lines > idx_line:              self.validity.append(line) @@ -1302,7 +1308,6 @@ class Importer(object):                          # keep an empty value if there is only empty values                          values = [values[0]]              formated_values = [] -              field_name = formater.field_name              force_new = formater.force_new              if type(field_name) in (list, tuple): @@ -1342,6 +1347,10 @@ class Importer(object):                      return                  if formater.value_format and value is not None and value != "":                      value = formater.value_format.format(value) +                if hasattr(value, "close"): +                    # opened file are kept - they need to be listed and closed +                    # later +                    self.to_be_close.append(value)                  formated_values.append(value)              if hasattr(func, 'match_table'):                  if field_name not in self.match_table: diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py index 16edbdcd4..939563334 100644 --- a/ishtar_common/forms.py +++ b/ishtar_common/forms.py @@ -782,23 +782,39 @@ class HistorySelect(CustomForm, TableSelect):          label=_("Modified after"), widget=DatePicker,          required=False)      _explicit_ordering = True +    CURRENT_FIELDS = ["history_creator", "history_modifier", +                      "modified_before", "modified_after"]      def __init__(self, *args, **kwargs):          super(HistorySelect, self).__init__(*args, **kwargs)          field_order = self.fields.keys() -        current_fields = ["history_creator", "history_modifier", -                          "modified_before", "modified_after"]          fields = OrderedDict()          for k in field_order: -            if k in current_fields: +            if k in self.CURRENT_FIELDS:                  continue              fields[k] = self.fields[k] -        for k in current_fields: +        for k in self.CURRENT_FIELDS:              fields[k] = self.fields[k]          self.fields = fields          self.custom_form_ordering() +class DocumentItemSelect(HistorySelect): +    documents__image__isnull = forms.NullBooleanField(label=_("Has an image?")) +    documents__associated_file__isnull = forms.NullBooleanField( +        label=_("Has an attached file?")) +    documents__associated_url__isnull = forms.NullBooleanField( +        label=_("Has a web address?")) +    CURRENT_FIELDS = [ +        'documents__image__isnull', +        'documents__associated_file__isnull', +        'documents__associated_url__isnull', +        "history_creator", "history_modifier", +        "modified_before", "modified_after" +    ] +    _explicit_ordering = True + +  def get_now():      format = formats.get_format('DATE_INPUT_FORMATS')[0]      value = datetime.datetime.now().strftime(format) @@ -1035,6 +1051,7 @@ class QAForm(CustomForm, ManageOldType):                  else:                      self._set_value(item, base_key)              item.history_modifier = user +            item._cached_label_checked = False              item.save() diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index 7a6f2fe72..2b52f0919 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -57,7 +57,7 @@ from archaeological_finds.models import Find, FindBasket  from archaeological_warehouse.models import Container -def get_town_field(label=_(u"Town"), required=True): +def get_town_field(label=_("Town"), required=True):      help_text = _(          u"<p>Type name, department code of the "          u"town you would like to select. The search is insensitive to case." @@ -575,20 +575,37 @@ class QAPersonFormMulti(QAForm):      base_models = ['qa_title']      associated_models = {          'qa_title': models.TitleType, +        'qa_attached_to': models.Organization,      }      MULTI = True      REPLACE_FIELDS = [          'qa_title', +        'qa_attached_to'      ]      qa_title = forms.ChoiceField(          label=_(u"Title"), required=False      ) +    qa_attached_to = forms.IntegerField( +        label=_("Organization"), +        widget=widgets.JQueryAutoComplete( +            reverse_lazy('autocomplete-organization'), +            associated_model=models.Organization), +        validators=[models.valid_id(models.Organization)], +        required=False +    )      TYPES = [          FieldType('qa_title', models.TitleType),      ] +    def _get_qa_attached_to(self, value): +        try: +            value = models.Organization.objects.get(pk=value).cached_label +        except models.Organization.DoesNotExist: +            return "" +        return value +  class PersonMergeFormSelection(ManualMerge, forms.Form):      SEARCH_AND_SELECT = True @@ -1302,9 +1319,9 @@ class DocumentForm(forms.ModelForm, CustomForm, ManageOldType):                  not cleaned_data.get('image', None) and \                  not cleaned_data.get('associated_file', None) and \                  not cleaned_data.get('associated_url', None): -            raise forms.ValidationError(_(u"You should at least fill one of " -                                          u"this field: title, url, image or " -                                          u"file.")) +            raise forms.ValidationError(_("You should at least fill one of " +                                          "this field: title, url, image or " +                                          "file."))          for rel in models.Document.RELATED_MODELS:              if cleaned_data.get(rel, None):                  return cleaned_data @@ -1457,6 +1474,7 @@ class QADocumentFormMulti(QAForm):      MULTI = True      REPLACE_FIELDS = [          'qa_source_type', +        'qa_creation_date',      ]      qa_source_type = forms.ChoiceField(          label=_(u"Source type"), required=False @@ -1464,6 +1482,8 @@ class QADocumentFormMulti(QAForm):      qa_authors = widgets.ModelJQueryAutocompleteField(          model=models.Author, label=_(u"Author"), new=True,          required=False) +    qa_creation_date = forms.DateField( +        label=_("Creation date"), widget=DatePicker, required=False)      TYPES = [          FieldType('qa_source_type', models.SourceType), @@ -1477,6 +1497,68 @@ class QADocumentFormMulti(QAForm):          return value +class QADocumentDuplicateForm(IshtarForm): +    qa_title = forms.CharField(label=_("Reference"), max_length=500, +                               required=False) +    qa_source_type = forms.ChoiceField(label=_("Type"), choices=[], +                                       required=False) + +    TYPES = [ +        FieldType('qa_source_type', models.SourceType), +    ] + +    def __init__(self, *args, **kwargs): +        self.user = None +        if 'user' in kwargs: +            self.user = kwargs.pop('user') +            if hasattr(self.user, 'ishtaruser'): +                self.user = self.user.ishtaruser +        self.document = kwargs.pop('items')[0] +        super(QADocumentDuplicateForm, self).__init__(*args, **kwargs) + +        self.fields['qa_title'].initial = self.document.title + str( +            _(" - duplicate")) +        if self.document.source_type: +            self.fields['qa_source_type'].initial = self.document.source_type.pk + +        for related_key in models.Document.RELATED_MODELS_ALT: +            related = getattr(self.document, related_key) +            if not related.count(): +                continue +            model = models.Document._meta.get_field(related_key).related_model +            initial = [] +            for item in related.all(): +                initial.append(item.pk) +            self.fields["qa_" + related_key] = widgets.Select2MultipleField( +                model=model, remote=True, label=model._meta.verbose_name_plural, +                required=False, long_widget=True, initial=initial +            ) + +    def save(self): +        data = {"index": None} +        for k in ["title"]: +            data[k] = self.cleaned_data.get("qa_" + k, None) +        if self.cleaned_data.get("qa_source_type", None): +            try: +                data["source_type"] = models.SourceType.objects.get( +                    pk=int(self.cleaned_data["qa_source_type"]), available=True) +            except models.SourceType.DoesNotExist: +                return +        new = self.document.duplicate_item(self.user, data=data) +        for related_key in models.Document.RELATED_MODELS_ALT: +            getattr(new, related_key).clear() +            values = self.cleaned_data.get("qa_" + related_key, []) +            model = models.Document._meta.get_field(related_key).related_model +            for value in values: +                getattr(new, related_key).add(model.objects.get(pk=value)) +        new.skip_history_when_saving = True +        new._cached_label_checked = False +        new._search_updated = False +        new._no_move = True +        new.save()  # regen of labels +        return new + +  class QALockForm(forms.Form):      action = forms.ChoiceField(          label=_("Action"), choices=(('lock', _("Lock")), diff --git a/ishtar_common/management/commands/json_summary.py b/ishtar_common/management/commands/json_summary.py new file mode 100644 index 000000000..bbd60df69 --- /dev/null +++ b/ishtar_common/management/commands/json_summary.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import datetime +import sys +import json + +from django.core.management.base import BaseCommand + +from archaeological_operations.models import Operation, ArchaeologicalSite +from archaeological_finds.models import Find + + +class Command(BaseCommand): +    args = "" +    help = "Json export of sums" + +    def handle(self, *args, **options): +        data = { +            "date": datetime.datetime.now().isoformat(), +            "finds": Find.objects.count(), +            "operations": Operation.objects.count(), +            "sites": ArchaeologicalSite.objects.count(), +        } +        sys.stdout.write(json.dumps(data)) + diff --git a/ishtar_common/management/commands/regenerate_search_vector_cached_label.py b/ishtar_common/management/commands/regenerate_search_vector_cached_label.py index 22b913805..6a560df80 100644 --- a/ishtar_common/management/commands/regenerate_search_vector_cached_label.py +++ b/ishtar_common/management/commands/regenerate_search_vector_cached_label.py @@ -31,7 +31,7 @@ APPS = ['ishtar_common', 'archaeological_operations',  class Command(BaseCommand):      args = '' -    help = 'Regenerate cached labels and search vectors' +    help = 'Regenerate geo, cached labels and search vectors'      def add_arguments(self, parser):          parser.add_argument('app_name', nargs='?', default=None, @@ -68,6 +68,12 @@ class Command(BaseCommand):                      obj = model.objects.get(pk=obj_id['pk'])                      obj.skip_history_when_saving = True                      obj._no_move = True +                    if hasattr(obj, "point_source") and obj.point_source in ( +                            "M", "T"): +                        obj.point = None +                        obj.point_2d = None +                        obj.x = None +                        obj.y = None                      cmsg = u"\r{} {}/{}".format(msg, idx + 1, ln)                      if not quiet:                          sys.stdout.write(cmsg) diff --git a/ishtar_common/models.py b/ishtar_common/models.py index e3a052a87..5fa668faf 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -1164,6 +1164,7 @@ class ImageModel(models.Model, ImageContainerModel):          filename = os.path.splitext(os.path.split(self.image.name)[-1])[0]          old_path = self.image.path          filename = "%s.jpg" % filename +        image = None          try:              image = Image.open(self.image.file)              # convert to RGB @@ -1191,6 +1192,9 @@ class ImageModel(models.Model, ImageContainerModel):                  save=False)          except IOError:              pass +        finally: +            if image: +                image.close()          return super(ImageModel, self).save(*args, **kwargs)      def _get_thumb_name(self, filename): @@ -1208,7 +1212,7 @@ class HistoryError(Exception):          return repr(self.value) -PRIVATE_FIELDS = ('id', 'history_modifier', 'order') +PRIVATE_FIELDS = ('id', 'history_modifier', 'order', 'uuid')  class BulkUpdatedItem(object): @@ -1804,8 +1808,8 @@ class QRCodeItem(models.Model, ImageContainerModel):              tmpdir_created = True          filename = tmpdir + os.sep + 'qrcode.png'          qr.png(filename, scale=settings.ISHTAR_QRCODE_SCALE) -        self.qrcode.save( -            "qrcode.png", File(open(filename, 'rb'))) +        with open(filename, 'rb') as qrfile: +            self.qrcode.save("qrcode.png", File(qrfile))          self.skip_history_when_saving = True          self._no_move = True          self.save() @@ -1814,6 +1818,21 @@ class QRCodeItem(models.Model, ImageContainerModel):  class DocumentItem(object): +    ALT_NAMES = { +        'documents__image__isnull': +            SearchAltName( +                pgettext_lazy("key for text search", "has-image"), +                'documents__image__isnull'), +        'documents__associated_url__isnull': +            SearchAltName( +                pgettext_lazy("key for text search", "has-url"), +                'documents__associated_url__isnull'), +        'documents__associated_file__isnull': +            SearchAltName( +                pgettext_lazy("key for text search", "has-attached-file"), +                'documents__associated_file__isnull'), +    } +      def public_representation(self):          images = []          if getattr(self, "main_image", None): @@ -1848,7 +1867,10 @@ class DocumentItem(object):          For sheet template: return "Add document / image" action          """          # url, base_text, icon, extra_text, extra css class, is a quick action -        actions = super(DocumentItem, self).get_extra_actions(request) +        try: +            actions = super(DocumentItem, self).get_extra_actions(request) +        except AttributeError: +            actions = []          if not hasattr(self, 'SLUG'):              return actions @@ -2120,6 +2142,34 @@ class CascasdeUpdate:                      post_save_geo(item.__class__, instance=item) +def duplicate_item(item, user=None, data=None): +    model = item.__class__ +    new = model.objects.get(pk=item.pk) + +    for field in model._meta.fields: +        # pk is in PRIVATE_FIELDS so: new.pk = None and a new +        # item will be created on save +        if field.name == "uuid": +            new.uuid = uuid.uuid4() +        elif field.name in PRIVATE_FIELDS: +            setattr(new, field.name, None) +    if user: +        new.history_user = user +    if data: +        for k in data: +            setattr(new, k, data[k]) +    new.save() + +    # m2m fields +    m2m = [field.name for field in model._meta.many_to_many +           if field.name not in PRIVATE_FIELDS] +    for field in m2m: +        for val in getattr(item, field).all(): +            if val not in getattr(new, field).all(): +                getattr(new, field).add(val) +    return new + +  class BaseHistorizedItem(StatisticItem, TemplateItem, FullSearch, Imported,                           JsonData, FixAssociated, CascasdeUpdate):      """ @@ -2187,29 +2237,7 @@ class BaseHistorizedItem(StatisticItem, TemplateItem, FullSearch, Imported,          return {}      def duplicate(self, user=None, data=None): -        model = self.__class__ -        new = model.objects.get(pk=self.pk) - -        for field in model._meta.fields: -            # pk is in PRIVATE_FIELDS so: new.pk = None and a new -            # item will be created on save -            if field.name in PRIVATE_FIELDS: -                setattr(new, field.name, None) -        if user: -            new.history_user = user -        if data: -            for k in data: -                setattr(new, k, data[k]) -        new.save() - -        # m2m fields -        m2m = [field.name for field in model._meta.many_to_many -               if field.name not in PRIVATE_FIELDS] -        for field in m2m: -            for val in getattr(self, field).all(): -                if val not in getattr(new, field).all(): -                    getattr(new, field).add(val) -        return new +        return duplicate_item(self, user, data)      def update_external_id(self, save=False):          if not self.EXTERNAL_ID_KEY or ( @@ -3568,8 +3596,8 @@ class DocumentTemplate(models.Model):              raise TemplateSyntaxError(str(e), 0)          except Exception as e:              raise TemplateSyntaxError(str(e), 0) -        output = open(output_name, 'wb') -        output.write(result) +        with open(output_name, 'wb') as output: +            output.write(result)          return output_name      def publish_labels(self, objects): @@ -3599,8 +3627,8 @@ class DocumentTemplate(models.Model):                  raise TemplateSyntaxError(str(e), e.lineno)              output_name = main_output_name + "-" + str(idx) + suffix              names.append(output_name) -            output = open(output_name, 'wb') -            output.write(result) +            with open(output_name, 'wb') as output: +                output.write(result)          output_name = main_output_name + suffix          o = OOoPy(infile=names[0], outfile=output_name)          if len(names) > 1: @@ -3735,6 +3763,13 @@ class Town(Imported, models.Model):                    'year': self.year or ""}          return values +    def get_values(self, prefix='', no_values=False, no_base_finds=True): +        return { +            prefix or "label": str(self), +            prefix + "name": self.name, +            prefix + "numero_insee": self.numero_insee +        } +      @classmethod      def history_decompress(cls, full_value, create=False):          if not full_value: @@ -5219,7 +5254,12 @@ class Document(BaseHistorizedItem, QRCodeItem, OwnPerms, ImageModel,          text=_(u"Bulk update"), target="many",          rights=['change_document', 'change_own_document'])      QUICK_ACTIONS = [ -        QA_EDIT +        QA_EDIT, +        QuickAction( +            url="document-qa-duplicate", icon_class="fa fa-clone", +            text=_("Duplicate"), target="one", +            rights=['change_document', +                    'change_own_document']),      ]      SERIALIZATION_FILES = ["image", "thumbnail", "associated_file"] @@ -5307,6 +5347,8 @@ class Document(BaseHistorizedItem, QRCodeItem, OwnPerms, ImageModel,          return "{}-{:04d}".format(self.operation.code_patriarche or '',                                     self.index)      """ +    def duplicate_item(self, user=None, data=None): +        return duplicate_item(self, user, data)      def public_representation(self):          site = Site.objects.get_current() @@ -5338,6 +5380,28 @@ class Document(BaseHistorizedItem, QRCodeItem, OwnPerms, ImageModel,              "thumbnail": thumbnail,          } +    def get_extra_actions(self, request): +        """ +        For sheet template +        """ +        # url, base_text, icon, extra_text, extra css class, is a quick action +        actions = super(Document, self).get_extra_actions(request) +        # is_locked = self.is_locked(request.user) + +        can_edit_document = self.can_do(request, 'change_document') +        if can_edit_document: +            actions += [ +                (reverse("document-qa-duplicate", args=[self.pk]), +                 _("Duplicate"), "fa fa-clone", "", "", True), +            ] +        return actions + +    @property +    def thumbnail_path(self): +        if not self.thumbnail: +            return "" +        return self.thumbnail.path +      @property      def image_path(self):          if not self.image: @@ -5348,6 +5412,7 @@ class Document(BaseHistorizedItem, QRCodeItem, OwnPerms, ImageModel,          values = super(Document, self).get_values(prefix=prefix,                                                    no_values=no_values)          values[prefix + "image_path"] = self.image_path +        values[prefix + "thumbnail_path"] = self.thumbnail_path          return values      @property @@ -5550,6 +5615,8 @@ class Document(BaseHistorizedItem, QRCodeItem, OwnPerms, ImageModel,          no_path_change = 'no_path_change' in kwargs \                           and kwargs.pop('no_path_change')          self.set_index() +        if not self.associated_url: +            self.associated_url = None          super(Document, self).save(*args, **kwargs)          if self.image and not no_path_change and \ diff --git a/ishtar_common/static/bootstrap/bootstrap.css b/ishtar_common/static/bootstrap/bootstrap.css index 6948a3607..8527e44d0 100644 --- a/ishtar_common/static/bootstrap/bootstrap.css +++ b/ishtar_common/static/bootstrap/bootstrap.css @@ -3,4 +3,4 @@   * Copyright 2011-2019 The Bootstrap Authors   * Copyright 2011-2019 Twitter, Inc.   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */:root{--blue: #007bff;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #dc3545;--orange: #fd7e14;--yellow: #ffc107;--green: #28a745;--teal: #20c997;--cyan: #17a2b8;--white: #fff;--gray: #6c757d;--gray-dark: #343a40;--primary: #007bff;--secondary: #6c757d;--success: #28a745;--info: #17a2b8;--warning: #ffc107;--danger: #dc3545;--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", 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:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{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;text-decoration:underline dotted;cursor:help;border-bottom:0;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:-.25em}sup{top:-.5em}a{color:#6f3b93;text-decoration:none;background-color:transparent}a:hover{color:#542c6f;text-decoration:none}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):hover,a:not([href]):not([tabindex]):focus{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}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}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:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}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}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}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}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:500;line-height:1.2}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;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:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;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-break: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{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333%;max-width:8.33333%}.col-2{flex:0 0 16.66667%;max-width:16.66667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333%;max-width:33.33333%}.col-5{flex:0 0 41.66667%;max-width:41.66667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333%;max-width:58.33333%}.col-8{flex:0 0 66.66667%;max-width:66.66667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333%;max-width:83.33333%}.col-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@media (min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media (min-width: 768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media (min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media (min-width: 1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table th,.table td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.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:rgba(0,0,0,0.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,0.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#b8daff}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.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:#c3e6cb}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>th,.table-info>td{background-color:#bee5eb}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>th,.table-warning>td{background-color:#ffeeba}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>th,.table-danger>td{background-color:#f5c6cb}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.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,0,0,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,0.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.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,0.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,0.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.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}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(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;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 + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;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:1rem}.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{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:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,0.9);border-radius:.25rem}.was-validated .form-control:valid,.form-control.is-valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' 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:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,0.25)}.was-validated .form-control:valid ~ .valid-feedback,.was-validated .form-control:valid ~ .valid-tooltip,.form-control.is-valid ~ .valid-feedback,.form-control.is-valid ~ .valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' 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") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,0.25)}.was-validated .custom-select:valid ~ .valid-feedback,.was-validated .custom-select:valid ~ .valid-tooltip,.custom-select.is-valid ~ .valid-feedback,.custom-select.is-valid ~ .valid-tooltip{display:block}.was-validated .form-control-file:valid ~ .valid-feedback,.was-validated .form-control-file:valid ~ .valid-tooltip,.form-control-file.is-valid ~ .valid-feedback,.form-control-file.is-valid ~ .valid-tooltip{display:block}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#28a745}.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:#28a745}.was-validated .custom-control-input:valid ~ .custom-control-label::before,.custom-control-input.is-valid ~ .custom-control-label::before{border-color:#28a745}.was-validated .custom-control-input:valid ~ .valid-feedback,.was-validated .custom-control-input:valid ~ .valid-tooltip,.custom-control-input.is-valid ~ .valid-feedback,.custom-control-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,.custom-control-input.is-valid:checked ~ .custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.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(40,167,69,0.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:#28a745}.was-validated .custom-file-input:valid ~ .custom-file-label,.custom-file-input.is-valid ~ .custom-file-label{border-color:#28a745}.was-validated .custom-file-input:valid ~ .valid-feedback,.was-validated .custom-file-input:valid ~ .valid-tooltip,.custom-file-input.is-valid ~ .valid-feedback,.custom-file-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-file-input:valid:focus ~ .custom-file-label,.custom-file-input.is-valid:focus ~ .custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,0.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,0.9);border-radius:.25rem}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}.was-validated .form-control:invalid ~ .invalid-feedback,.was-validated .form-control:invalid ~ .invalid-tooltip,.form-control.is-invalid ~ .invalid-feedback,.form-control.is-invalid ~ .invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}.was-validated .custom-select:invalid ~ .invalid-feedback,.was-validated .custom-select:invalid ~ .invalid-tooltip,.custom-select.is-invalid ~ .invalid-feedback,.custom-select.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-control-file:invalid ~ .invalid-feedback,.was-validated .form-control-file:invalid ~ .invalid-tooltip,.form-control-file.is-invalid ~ .invalid-feedback,.form-control-file.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#dc3545}.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:#dc3545}.was-validated .custom-control-input:invalid ~ .custom-control-label::before,.custom-control-input.is-invalid ~ .custom-control-label::before{border-color:#dc3545}.was-validated .custom-control-input:invalid ~ .invalid-feedback,.was-validated .custom-control-input:invalid ~ .invalid-tooltip,.custom-control-input.is-invalid ~ .invalid-feedback,.custom-control-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,.custom-control-input.is-invalid:checked ~ .custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.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(220,53,69,0.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:#dc3545}.was-validated .custom-file-input:invalid ~ .custom-file-label,.custom-file-input.is-invalid ~ .custom-file-label{border-color:#dc3545}.was-validated .custom-file-input:invalid ~ .invalid-feedback,.was-validated .custom-file-input:invalid ~ .invalid-tooltip,.custom-file-input.is-invalid ~ .invalid-feedback,.custom-file-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,.custom-file-input.is-invalid:focus ~ .custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,0.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:#212529;text-align:center;vertical-align:middle;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary:focus,.btn-primary.focus{box-shadow:0 0 0 .2rem rgba(38,143,255,0.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.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(38,143,255,0.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{box-shadow:0 0 0 .2rem rgba(130,138,145,0.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,0.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success:focus,.btn-success.focus{box-shadow:0 0 0 .2rem rgba(72,180,97,0.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.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(72,180,97,0.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info:focus,.btn-info.focus{box-shadow:0 0 0 .2rem rgba(58,176,195,0.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.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(58,176,195,0.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning:focus,.btn-warning.focus{box-shadow:0 0 0 .2rem rgba(222,170,12,0.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.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,170,12,0.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger:focus,.btn-danger.focus{box-shadow:0 0 0 .2rem rgba(225,83,97,0.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.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(225,83,97,0.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{box-shadow:0 0 0 .2rem rgba(216,217,219,0.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,0.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{box-shadow:0 0 0 .2rem rgba(82,88,93,0.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,0.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.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:#007bff;border-color:#007bff}.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(0,123,255,0.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,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.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,0.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.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:#28a745;border-color:#28a745}.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(40,167,69,0.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.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:#17a2b8;border-color:#17a2b8}.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(23,162,184,0.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.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:#ffc107;border-color:#ffc107}.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,193,7,0.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.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:#dc3545;border-color:#dc3545}.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(220,53,69,0.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,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.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,0.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,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.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,0.5)}.btn-link{font-weight:400;color:#6f3b93;text-decoration:none}.btn-link:hover{color:#542c6f;text-decoration:none}.btn-link:focus,.btn-link.focus{text-decoration:none;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#6c757d;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.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 0.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 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{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 transparent;border-bottom:0;border-left:.3em solid transparent}.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:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,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 transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.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 transparent;border-right:0;border-bottom:.3em solid transparent;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 transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.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:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.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%;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(:last-child),.input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.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-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.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.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.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + .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:.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>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.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;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus ~ .custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.custom-control-input:focus:not(:checked) ~ .custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active ~ .custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled ~ .custom-control-label{color:#6c757d}.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:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50% / 50% 50%}.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' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{border-color:#007bff;background-color:#007bff}.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' 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(0,123,255,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(0,123,255,0.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' 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(0,123,255,0.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(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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(.75rem)}.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.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-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.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.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,0.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,0.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,0.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;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 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.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{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;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.25rem;line-height:1;background-color:transparent;border:1px solid transparent;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:no-repeat center center;background-size:100% 100%}@media (max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{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{flex-wrap:nowrap}.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{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{flex-wrap:nowrap}.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{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{flex-wrap:nowrap}.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{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{flex-wrap:nowrap}.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{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{flex-wrap:nowrap}.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,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,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,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0,0,0,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,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,0.5)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,0.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.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,0.5);border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255,255,255,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.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,0.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.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,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:flex;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width: 576px){.card-deck{flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:flex;flex:1 0 0%;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:flex;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width: 576px){.card-group{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{column-count:3;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{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{display:inline-block;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:#6f3b93;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#542c6f;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.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:1;color:#fff;background-color:#007bff;border-color:#007bff}.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.25rem;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:.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 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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:#007bff}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#0062cc}a.badge-primary:focus,a.badge-primary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.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,0.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#1e7e34}a.badge-success:focus,a.badge-success.focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#117a8b}a.badge-info:focus,a.badge-info.focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:hover,a.badge-warning:focus{color:#212529;background-color:#d39e00}a.badge-warning:focus,a.badge-warning.focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#bd2130}a.badge-danger:focus,a.badge-danger.focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,0.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,0.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,0.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:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width 0.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:progress-bar-stripes 1s linear infinite}@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}.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:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.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:#007bff;border-color:#007bff}.list-group-horizontal{flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.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:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.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:transparent;border:0;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);box-shadow:0 0.25rem 0.75rem rgba(0,0,0,0.1);backdrop-filter:blur(10px);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,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05)}.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 0.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-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);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,0.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;align-items:center;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.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)}.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:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.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:transparent;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:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,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:transparent;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((.5rem + 1px) * -1)}.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,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((.5rem + 1px) * -1);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,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((.5rem + 1px) * -1)}.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,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:-.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((.5rem + 1px) * -1);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,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;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.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:0s .6s opacity}@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%;color:#fff;text-align:center;opacity:.5;transition:opacity 0.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:no-repeat 50% / 100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%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' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-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 transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity 0.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:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.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:#007bff !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#0062cc !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:#28a745 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#1e7e34 !important}.bg-info{background-color:#17a2b8 !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#117a8b !important}.bg-warning{background-color:#ffc107 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#d39e00 !important}.bg-danger{background-color:#dc3545 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#bd2130 !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:transparent !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:#007bff !important}.border-secondary{border-color:#6c757d !important}.border-success{border-color:#28a745 !important}.border-info{border-color:#17a2b8 !important}.border-warning{border-color:#ffc107 !important}.border-danger{border-color:#dc3545 !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.85714%}.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}}.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;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 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow{box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,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}.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)}.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,.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:-.25rem !important}.mt-n1,.my-n1{margin-top:-.25rem !important}.mr-n1,.mx-n1{margin-right:-.25rem !important}.mb-n1,.my-n1{margin-bottom:-.25rem !important}.ml-n1,.mx-n1{margin-left:-.25rem !important}.m-n2{margin:-.5rem !important}.mt-n2,.my-n2{margin-top:-.5rem !important}.mr-n2,.mx-n2{margin-right:-.5rem !important}.mb-n2,.my-n2{margin-bottom:-.5rem !important}.ml-n2,.mx-n2{margin-left:-.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:-.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem !important}.m-sm-n2{margin:-.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-.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:-.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem !important}.m-md-n2{margin:-.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-.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:-.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem !important}.m-lg-n2{margin:-.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-.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:-.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem !important}.m-xl-n2{margin:-.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-.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}}.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:#007bff !important}a.text-primary:hover,a.text-primary:focus{color:#0056b3 !important}.text-secondary{color:#6c757d !important}a.text-secondary:hover,a.text-secondary:focus{color:#494f54 !important}.text-success{color:#28a745 !important}a.text-success:hover,a.text-success:focus{color:#19692c !important}.text-info{color:#17a2b8 !important}a.text-info:hover,a.text-info:focus{color:#0f6674 !important}.text-warning{color:#ffc107 !important}a.text-warning:hover,a.text-warning:focus{color:#ba8b00 !important}.text-danger{color:#dc3545 !important}a.text-danger:hover,a.text-danger:focus{color:#a71d2a !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:#212529 !important}.text-muted{color:#6c757d !important}.text-black-50{color:rgba(0,0,0,0.5) !important}.text-white-50{color:rgba(255,255,255,0.5) !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none !important}.text-break{word-break:break-word !important;overflow-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}thead{display:table-header-group}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:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}.switch{font-size:1rem;position:relative}.switch input{position:absolute;height:1px;width:1px;background:none;border:0;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden;padding:0}.switch input+label{position:relative;min-width:calc(calc(2.375rem * .8) * 2);border-radius:calc(2.375rem * .8);height:calc(2.375rem * .8);line-height:calc(2.375rem * .8);display:inline-block;cursor:pointer;outline:none;user-select:none;vertical-align:middle;text-indent:calc(calc(calc(2.375rem * .8) * 2) + .5rem)}.switch input+label::before,.switch input+label::after{content:'';position:absolute;top:0;left:0;width:calc(calc(2.375rem * .8) * 2);bottom:0;display:block}.switch input+label::before{right:0;background-color:#dee2e6;border-radius:calc(2.375rem * .8);transition:0.2s all}.switch input+label::after{top:2px;left:2px;width:calc(calc(2.375rem * .8) - calc(2px * 2));height:calc(calc(2.375rem * .8) - calc(2px * 2));border-radius:50%;background-color:#fff;transition:0.2s all}.switch input:checked+label::before{background-color:#08d}.switch input:checked+label::after{margin-left:calc(2.375rem * .8)}.switch input:focus+label::before{outline:none;box-shadow:0 0 0 .2rem rgba(0,136,221,0.25)}.switch input:disabled+label{color:#868e96;cursor:not-allowed}.switch input:disabled+label::before{background-color:#e9ecef}.switch.switch-sm{font-size:.875rem}.switch.switch-sm input+label{min-width:calc(calc(1.9375rem * .8) * 2);height:calc(1.9375rem * .8);line-height:calc(1.9375rem * .8);text-indent:calc(calc(calc(1.9375rem * .8) * 2) + .5rem)}.switch.switch-sm input+label::before{width:calc(calc(1.9375rem * .8) * 2)}.switch.switch-sm input+label::after{width:calc(calc(1.9375rem * .8) - calc(2px * 2));height:calc(calc(1.9375rem * .8) - calc(2px * 2))}.switch.switch-sm input:checked+label::after{margin-left:calc(1.9375rem * .8)}.switch.switch-lg{font-size:1.25rem}.switch.switch-lg input+label{min-width:calc(calc(3rem * .8) * 2);height:calc(3rem * .8);line-height:calc(3rem * .8);text-indent:calc(calc(calc(3rem * .8) * 2) + .5rem)}.switch.switch-lg input+label::before{width:calc(calc(3rem * .8) * 2)}.switch.switch-lg input+label::after{width:calc(calc(3rem * .8) - calc(2px * 2));height:calc(calc(3rem * .8) - calc(2px * 2))}.switch.switch-lg input:checked+label::after{margin-left:calc(3rem * .8)}.switch+.switch{margin-left:1rem}.switch.danger input:checked+label::before{background-color:#dc3545}.switch.danger input:focus+label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}html{font-size:0.8em;background-color:#f8f9fa}body{background-color:transparent;position:relative}label{margin-bottom:.2rem;min-height:1.5rem}dd>pre{padding:0 1em}.form-control.form-row{height:auto}.form-group span label{display:inline-block}.form-group label{display:block}.form-group.full-width input{width:100%}.form-group.no-label{margin-top:1.7rem}.form-group li label{display:inline-block;min-height:1rem;margin:0}.form-group li .form-control{width:auto;vertical-align:middle}.form-group li input[type="radio"].form-control,.form-group li input[type="checkbox"].form-control{display:inline}.form-check-label{margin:0.1em 0.5em}.form-check-label .fa{font-size:1.4em;color:#432776}pre{white-space:pre-wrap}.raw-description{white-space:pre-line}.form-control.small-input,.input-group>.form-control.small-input{width:110px;flex:none}.input-group>input[type=checkbox]{margin:0.5em 1em}.form-row.odd{background-color:#e9ecef}.form-row-modal{padding:0.5rem 2rem}.field-tip{position:absolute;right:10px;top:5px;opacity:0.7}.form-group .select2-container--default .select2-selection--multiple{border:1px solid #ced4da}.page-link.imported-page{color:#aa8fda}.page-link.imported-page.current-page,.page-link.current-page{color:black;font-weight:bold}#modal-advanced-search .modal-header{flex-wrap:wrap;padding-bottom:0}#advanced-search-info{margin-bottom:0}.search-widget #advanced-search-info .alert{margin-bottom:0.6rem}#modal-advanced-search .modal-header .alert-secondary{background-color:#fff}.modal-header,.modal-footer{background-color:#e9ecef}.modal-header .input-group-text{background-color:#dee2e6;border-color:#ced4da}.modal-body.body-scroll{max-height:calc(100vh - 270px);overflow-y:auto}.window-pop{overflow:hidden}.window-pop .modal-body.body-scroll{max-height:calc(100vh - 122px)}.modal-dialog.full{width:98%;height:98%;max-width:none;padding:1%}.modal-dialog.full .display.dataTable{width:100% !important}.modal-dialog.full .modal-content{height:auto;min-height:100%;border-radius:0}.table{background-color:white}.tab-content{padding-top:0}.input-progress.form-control:focus,.input-progress{background-color:#dee2e6}.card-header,.input-progress,.table-striped tbody tr:nth-of-type(2n+1),.dt-bootstrap4 table.dataTable.stripe tbody tr.odd,.dt-bootstrap4 table.dataTable.display tbody tr.odd{background-color:#e9ecef}.dropdown-item:hover,.dropdown-item:focus,.dt-bootstrap4 table.dataTable.hover tbody tr:hover,.dt-bootstrap4 table.dataTable.display tbody tr:hover{background-color:#f6f6f6;background-color:#dee2e6}table.dataTable{font-size:0.8em}.ishtar-gallery-wrapper .ishtar-gallery-info,.container-fluid .dataTables_wrapper .dataTables_info{clear:none;font-size:0.8em;padding:0.5em 2em}.ishtar-gallery-wrapper label select{width:75px;display:inline-block;font-size:1em}.ishtar-gallery-wrapper label{font-size:0.8em}.ishtar-gallery .no-data{width:100%;font-size:0.85em;text-align:center;background-color:#dee2e6;padding:0.2em;margin:0.6em 0}.table-modal-lg table.dataTable{font-size:1em}div.dt-buttons{float:right}.dt-button{color:#fff;background-color:#007bff;border-color:#007bff;display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;border:1px solid transparent;color:#fff;background-color:#6c757d;border-color:#6c757d;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}.dt-button:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.dt-button:focus,.dt-button.focus{box-shadow:0 0 0 .2rem rgba(130,138,145,0.5)}.dt-button.disabled,.dt-button:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.dt-button:not(:disabled):not(.disabled):active,.dt-button:not(:disabled):not(.disabled).active,.show>.dt-button.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.dt-button:not(:disabled):not(.disabled):active:focus,.dt-button:not(:disabled):not(.disabled).active:focus,.show>.dt-button.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,0.5)}@media (prefers-reduced-motion: reduce){.dt-button{transition:none}}.dt-button.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.dt-button.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.dt-button.btn-success:focus,.dt-button.btn-success.focus{box-shadow:0 0 0 .2rem rgba(72,180,97,0.5)}.dt-button.btn-success.disabled,.dt-button.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.dt-button.btn-success:not(:disabled):not(.disabled):active,.dt-button.btn-success:not(:disabled):not(.disabled).active,.show>.dt-button.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.dt-button.btn-success:not(:disabled):not(.disabled):active:focus,.dt-button.btn-success:not(:disabled):not(.disabled).active:focus,.show>.dt-button.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,0.5)}.dt-button.disabled{background-color:#f8f9fa;border-color:#f8f9fa;color:#adb5bd;cursor:not-allowed}.small-button{padding:0.1em 0.2em}.previous-value{display:block;padding:0.2em 0.4em;background-color:#e9ecef;border:1px solid #ced4da}h3,.h3{font-size:1.5rem}h4,.h4{font-size:1.1rem}textarea{height:90px}.sheet .col-1,.sheet .col-2,.sheet .col-3,.sheet .col-4,.sheet .col-5,.sheet .col-6,.sheet .col-7,.sheet .col-8,.sheet .col-9,.sheet .col-10,.sheet .col-11,.sheet .col-12,.sheet .col,.sheet .col-auto,.sheet .col-sm-1,.sheet .col-sm-2,.sheet .col-sm-3,.sheet .col-sm-4,.sheet .col-sm-5,.sheet .col-sm-6,.sheet .col-sm-7,.sheet .col-sm-8,.sheet .col-sm-9,.sheet .col-sm-10,.sheet .col-sm-11,.sheet .col-sm-12,.sheet .col-sm,.sheet .col-sm-auto,.sheet .col-md-1,.sheet .col-md-2,.sheet .col-md-3,.sheet .col-md-4,.sheet .col-md-5,.sheet .col-md-6,.sheet .col-md-7,.sheet .col-md-8,.sheet .col-md-9,.sheet .col-md-10,.sheet .col-md-11,.sheet .col-md-12,.sheet .col-md,.sheet .col-md-auto,.sheet .col-lg-1,.sheet .col-lg-2,.sheet .col-lg-3,.sheet .col-lg-4,.sheet .col-lg-5,.sheet .col-lg-6,.sheet .col-lg-7,.sheet .col-lg-8,.sheet .col-lg-9,.sheet .col-lg-10,.sheet .col-lg-11,.sheet .col-lg-12,.sheet .col-lg,.sheet .col-lg-auto,.sheet .col-xl-1,.sheet .col-xl-2,.sheet .col-xl-3,.sheet .col-xl-4,.sheet .col-xl-5,.sheet .col-xl-6,.sheet .col-xl-7,.sheet .col-xl-8,.sheet .col-xl-9,.sheet .col-xl-10,.sheet .col-xl-11,.sheet .col-xl-12,.sheet .col-xl,.sheet .col-xl-auto{padding-right:5px;padding-left:5px}.sheet ol,.sheet ul,.sheet dl{margin-bottom:0.5rem}.sheet dt{line-height:1.4em}.sheet h4{color:#6c757d}#bookmark-list .input-link{width:100%;padding-right:5px}#window-fixed-menu{background-color:#e9ecef;position:fixed;right:0;margin-top:100px;z-index:50;width:200px}#window-fixed-menu-list li{padding-bottom:0.5em}#window-fixed-menu-list li a.nav-link{background-color:white}#window-fixed-menu-list li a.nav-link.active{background-color:#007bff}#window-menu-title{font-size:1.3em}#window-menu-control{font-size:0.6em;padding-top:0.2em}#window-fixed-menu.hidden{transform:rotate(270deg);transform-origin:right bottom 0}#window-fixed-menu.hidden i.fa-times{transform:rotate(45deg);transform-origin:10px 10px 0;padding-left:0.1em}#warning-banner{font-size:1.5em;background-color:#8c2525;color:#fff;padding:0 0.6em;text-align:right}#warning-banner a{color:#888}#warning-banner a:hover{color:#fff}.form h4,.form h3,.collapse-form .card-header,#window h3{background-color:#ced4da}.form h4.card-title{background-color:transparent}.collapse-form .card,.collapse-form .card-header{border-radius:0;border:0 solid}.collapse-form .card-header{padding:0;text-align:center}.collapse-form .card-header h4{margin-bottom:0}.collapse-form .card-header .btn.btn-link{color:#212529;width:100%}.collapse-form .card-body{border:1px solid #ced4da}.collapse-form .fa-expand,.collapse-form .collapsed .fa-compress{display:none}.collapse-form .collapsed .fa-expand,.collapse-form .fa-compress{display:inline-block}.clean-table h4,.form h4,.form h3,.collapse-form .card-header h4 .btn,.sheet h4,.sheet h3,.sheet h2{text-align:center;text-shadow:2px 2px 2px rgba(150,150,150,0.7)}.sheet .subsection{background-color:#e9ecef}.sheet .row.toolbar{padding:0.5em 0.75em}.sheet .row{padding:0 0.75em;margin:0}.clean-table h4{margin-top:1em}#main-container{margin-bottom:16em}.bg-dark{background-color:#432776 !important}.navbar{padding:0 0.5rem}.navbar-dark .navbar-nav.action-menu .nav-link{color:#ffe484;border:1px solid #ffe484;border-radius:4px;margin:0.2em;padding:0.3em 0.6em}.navbar-dark .navbar-nav.action-menu .d-none .nav-link{border:0px solid transparent}.navbar-dark .navbar-nav.action-menu .d-none .nav-link:hover{background-color:transparent;color:#ffe484}.navbar-dark .navbar-nav.action-menu .nav-link:hover{background-color:#ffe484;color:#343a40}.navbar-dark .navbar-nav.action-menu .nav-link.dropdown-toggle::after{color:#ffe484}.navbar-dark .navbar-nav.action-menu .nav-link.dropdown-toggle:hover::after{color:#343a40}#context-menu,#reminder,.confirm-message,div#validation-bar{background-color:#6f42c1;color:rgba(255,255,255,0.8)}#reminder{padding:0.6em 1em 0.1em 1em}#alert-list{padding:0.6em 0}#alert-list a{font-size:1.1rem}.confirm-message{text-align:center;margin:0;padding:0.5rem;font-weight:bold}.is-invalid input{border-color:#f99}.errorlist{color:#900}#shortcut-menu{width:700px;padding:1em}#context-menu a.nav-link{color:rgba(255,255,255,0.8);padding:0.8rem 0.5rem 0.7rem 0.5rem}#context-menu .breadcrumb{margin-bottom:0;background-color:transparent}#current_items{width:100%}div#foot{background-color:#432776;color:rgba(255,255,255,0.5)}div#foot a{color:#ddd}div#foot a:hover{color:#fff}.breadcrumb button{border:0 transparent;background-color:transparent}.breadcrumb a:hover{text-decoration:none}.breadcrumb button:hover{cursor:pointer;color:#0062cc}.input-group.date input{border:1px solid #dee2e6;border-radius:.25rem;padding:.375rem .75rem;font-size:1rem;line-height:1.5}.input-group.date .input-group-text:hover{cursor:pointer}.input-group>ul{padding:0.5em;border:1px solid #dee2e6;border-radius:.25rem;margin:0;list-style:none;height:auto}ul.compact{padding:0;margin:0}.help-text{max-height:250px;overflow:auto}.input-link{color:#6c757d}.input-link.disabled{color:#adb5bd}.input-link:hover{color:#343a40;cursor:pointer}.input-link.disabled:hover{color:#adb5bd;cursor:not-allowed}.input-sep{background-color:#fff;padding:0.3rem}.search .form-group{font-size:0.9em;margin-bottom:0}.search .search-widget{margin-bottom:1rem}.search_button{display:none}.search-vector{width:100%;padding-bottom:1em}.search-vector .form-group{margin-bottom:0}.ishtar-gallery .card{width:200px}.svg-image{display:inline-block;position:relative;width:100%;vertical-align:middle;text-align:center;overflow:hidden}.window-main-image{height:300px;display:block}.thumb-image{height:200px}.window-main-image,.thumb-image{position:relative;overflow:hidden}.window-main-image img,.thumb-image img{display:inline-block;max-width:100%;max-height:100%;width:auto;height:auto;position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-o-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.lightgallery-captions{display:none}.lightgallery-subimage{display:inline-block;width:80px;padding:0.2em}.lightgallery-subimage img{width:100%}.simple-window{position:absolute;left:50%;display:none}.simple-window-content{position:relative;left:-50%;top:-470px;width:350px;background-color:#fff;border:1px solid #adb5bd;border-radius:0.3rem}.simple-window .modal-body{max-height:300px;overflow-x:hidden;overflow-y:auto}.lg .lg-sub-html{text-align:left}.lg .lg-sub-html .close{color:#fff}.lg .lg-sub-html .close:hover{opacity:0.9}#basket-manage #foot_pk{display:none}#basket-manage #grid_pk_meta_wrapper{width:50%;float:left;padding-bottom:80px}#basket-add-button{width:8%;float:left;margin:20vh 1% 0 1%}#basket-content-wrapper{width:40%;float:left}#basket-content{text-align:left;overflow:auto;max-height:60vh}.ui-widget-content{border:1px solid #dee2e6;background-color:#fff}.ui-menu-item{padding:0.2em 0.4em;border:1px solid #fff}.ui-menu-item:hover{color:#6f3b93;border:1px solid #6f3b93;cursor:pointer}.ui-autocomplete{font-size:0.7em;z-index:10000 !important;width:350px;border:5px solid #dee2e6;outline:none}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none;font-size:1.1em}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ishtar-table-map,.window-map{border:solid 1px #adb5bd;background:url(../media/images/map-background.jpg) repeat}.window-map{width:100%;height:300px;margin-bottom:0.5em}.sheet .ishtar-table-map{display:none}.ishtar-table-map{width:100%;height:200px;margin-bottom:150px}@media screen and (min-height: 640px){.ishtar-table-map{height:calc(100vh - 440px);margin-bottom:0}}.sheet .ishtar-table-map{height:300px}.ishtar-map-top{padding:0.5em}.ishtar-map-popup{background-color:#fff;padding:0.5em 1em;border-radius:0.5em;border-style:solid;border-width:1px;border-color:#adb5bd;display:none}.simple-window-content ul,.ishtar-map-popup ul{margin:0;padding:0;list-style:none}.ishtar-map-popup::after{content:"";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#495057 transparent transparent transparent}.ol-overviewmap{bottom:3em}.ol-rotate{top:2.8em}.track-position{left:.5em;top:5em}.resize-handler{position:absolute;width:16px;height:16px;padding:4px;bottom:0;right:0;cursor:nwse-resize;background:url(../media/images/resize-handler.png) no-repeat}.chart-wrapper{display:block;position:relative;height:400px;width:calc(100% - 100px)}.chart-content{height:96%}.chart-resize{border:1px #999 dashed} + */:root{--blue: #007bff;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #dc3545;--orange: #fd7e14;--yellow: #ffc107;--green: #28a745;--teal: #20c997;--cyan: #17a2b8;--white: #fff;--gray: #6c757d;--gray-dark: #343a40;--primary: #007bff;--secondary: #6c757d;--success: #28a745;--info: #17a2b8;--warning: #ffc107;--danger: #dc3545;--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", 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:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{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;text-decoration:underline dotted;cursor:help;border-bottom:0;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:-.25em}sup{top:-.5em}a{color:#6f3b93;text-decoration:none;background-color:transparent}a:hover{color:#542c6f;text-decoration:none}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):hover,a:not([href]):not([tabindex]):focus{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}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}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:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}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}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}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}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:500;line-height:1.2}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;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:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;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-break: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{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333%;max-width:8.33333%}.col-2{flex:0 0 16.66667%;max-width:16.66667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333%;max-width:33.33333%}.col-5{flex:0 0 41.66667%;max-width:41.66667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333%;max-width:58.33333%}.col-8{flex:0 0 66.66667%;max-width:66.66667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333%;max-width:83.33333%}.col-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@media (min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media (min-width: 768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media (min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media (min-width: 1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{flex:0 0 91.66667%;max-width:91.66667%}.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.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table th,.table td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.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:rgba(0,0,0,0.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,0.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#b8daff}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.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:#c3e6cb}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>th,.table-info>td{background-color:#bee5eb}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>th,.table-warning>td{background-color:#ffeeba}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>th,.table-danger>td{background-color:#f5c6cb}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.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,0,0,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,0.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.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,0.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,0.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.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}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(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;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 + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;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:1rem}.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{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:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,0.9);border-radius:.25rem}.was-validated .form-control:valid,.form-control.is-valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' 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:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,0.25)}.was-validated .form-control:valid ~ .valid-feedback,.was-validated .form-control:valid ~ .valid-tooltip,.form-control.is-valid ~ .valid-feedback,.form-control.is-valid ~ .valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' 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") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,0.25)}.was-validated .custom-select:valid ~ .valid-feedback,.was-validated .custom-select:valid ~ .valid-tooltip,.custom-select.is-valid ~ .valid-feedback,.custom-select.is-valid ~ .valid-tooltip{display:block}.was-validated .form-control-file:valid ~ .valid-feedback,.was-validated .form-control-file:valid ~ .valid-tooltip,.form-control-file.is-valid ~ .valid-feedback,.form-control-file.is-valid ~ .valid-tooltip{display:block}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#28a745}.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:#28a745}.was-validated .custom-control-input:valid ~ .custom-control-label::before,.custom-control-input.is-valid ~ .custom-control-label::before{border-color:#28a745}.was-validated .custom-control-input:valid ~ .valid-feedback,.was-validated .custom-control-input:valid ~ .valid-tooltip,.custom-control-input.is-valid ~ .valid-feedback,.custom-control-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,.custom-control-input.is-valid:checked ~ .custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.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(40,167,69,0.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:#28a745}.was-validated .custom-file-input:valid ~ .custom-file-label,.custom-file-input.is-valid ~ .custom-file-label{border-color:#28a745}.was-validated .custom-file-input:valid ~ .valid-feedback,.was-validated .custom-file-input:valid ~ .valid-tooltip,.custom-file-input.is-valid ~ .valid-feedback,.custom-file-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-file-input:valid:focus ~ .custom-file-label,.custom-file-input.is-valid:focus ~ .custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,0.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,0.9);border-radius:.25rem}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}.was-validated .form-control:invalid ~ .invalid-feedback,.was-validated .form-control:invalid ~ .invalid-tooltip,.form-control.is-invalid ~ .invalid-feedback,.form-control.is-invalid ~ .invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}.was-validated .custom-select:invalid ~ .invalid-feedback,.was-validated .custom-select:invalid ~ .invalid-tooltip,.custom-select.is-invalid ~ .invalid-feedback,.custom-select.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-control-file:invalid ~ .invalid-feedback,.was-validated .form-control-file:invalid ~ .invalid-tooltip,.form-control-file.is-invalid ~ .invalid-feedback,.form-control-file.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#dc3545}.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:#dc3545}.was-validated .custom-control-input:invalid ~ .custom-control-label::before,.custom-control-input.is-invalid ~ .custom-control-label::before{border-color:#dc3545}.was-validated .custom-control-input:invalid ~ .invalid-feedback,.was-validated .custom-control-input:invalid ~ .invalid-tooltip,.custom-control-input.is-invalid ~ .invalid-feedback,.custom-control-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,.custom-control-input.is-invalid:checked ~ .custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.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(220,53,69,0.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:#dc3545}.was-validated .custom-file-input:invalid ~ .custom-file-label,.custom-file-input.is-invalid ~ .custom-file-label{border-color:#dc3545}.was-validated .custom-file-input:invalid ~ .invalid-feedback,.was-validated .custom-file-input:invalid ~ .invalid-tooltip,.custom-file-input.is-invalid ~ .invalid-feedback,.custom-file-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,.custom-file-input.is-invalid:focus ~ .custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,0.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:#212529;text-align:center;vertical-align:middle;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary:focus,.btn-primary.focus{box-shadow:0 0 0 .2rem rgba(38,143,255,0.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.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(38,143,255,0.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{box-shadow:0 0 0 .2rem rgba(130,138,145,0.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,0.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success:focus,.btn-success.focus{box-shadow:0 0 0 .2rem rgba(72,180,97,0.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.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(72,180,97,0.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info:focus,.btn-info.focus{box-shadow:0 0 0 .2rem rgba(58,176,195,0.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.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(58,176,195,0.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning:focus,.btn-warning.focus{box-shadow:0 0 0 .2rem rgba(222,170,12,0.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.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,170,12,0.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger:focus,.btn-danger.focus{box-shadow:0 0 0 .2rem rgba(225,83,97,0.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.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(225,83,97,0.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{box-shadow:0 0 0 .2rem rgba(216,217,219,0.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,0.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{box-shadow:0 0 0 .2rem rgba(82,88,93,0.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,0.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.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:#007bff;border-color:#007bff}.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(0,123,255,0.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,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.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,0.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.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:#28a745;border-color:#28a745}.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(40,167,69,0.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.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:#17a2b8;border-color:#17a2b8}.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(23,162,184,0.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.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:#ffc107;border-color:#ffc107}.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,193,7,0.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.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:#dc3545;border-color:#dc3545}.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(220,53,69,0.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,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.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,0.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,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.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,0.5)}.btn-link{font-weight:400;color:#6f3b93;text-decoration:none}.btn-link:hover{color:#542c6f;text-decoration:none}.btn-link:focus,.btn-link.focus{text-decoration:none;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#6c757d;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.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 0.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 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{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 transparent;border-bottom:0;border-left:.3em solid transparent}.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:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,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 transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.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 transparent;border-right:0;border-bottom:.3em solid transparent;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 transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.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:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.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%;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(:last-child),.input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.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-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.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.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.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + .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:.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>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.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;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus ~ .custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.custom-control-input:focus:not(:checked) ~ .custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active ~ .custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled ~ .custom-control-label{color:#6c757d}.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:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50% / 50% 50%}.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' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{border-color:#007bff;background-color:#007bff}.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' 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(0,123,255,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(0,123,255,0.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' 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(0,123,255,0.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(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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(.75rem)}.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.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-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.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.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,0.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,0.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,0.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;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 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.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{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;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.25rem;line-height:1;background-color:transparent;border:1px solid transparent;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:no-repeat center center;background-size:100% 100%}@media (max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{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{flex-wrap:nowrap}.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{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{flex-wrap:nowrap}.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{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{flex-wrap:nowrap}.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{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{flex-wrap:nowrap}.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{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{flex-wrap:nowrap}.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,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,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,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0,0,0,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,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,0.5)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,0.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.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,0.5);border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255,255,255,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.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,0.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.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,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:flex;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width: 576px){.card-deck{flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:flex;flex:1 0 0%;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:flex;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width: 576px){.card-group{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{column-count:3;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{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{display:inline-block;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:#6f3b93;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#542c6f;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.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:1;color:#fff;background-color:#007bff;border-color:#007bff}.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.25rem;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:.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 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.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:#007bff}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#0062cc}a.badge-primary:focus,a.badge-primary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.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,0.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#1e7e34}a.badge-success:focus,a.badge-success.focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#117a8b}a.badge-info:focus,a.badge-info.focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:hover,a.badge-warning:focus{color:#212529;background-color:#d39e00}a.badge-warning:focus,a.badge-warning.focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#bd2130}a.badge-danger:focus,a.badge-danger.focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,0.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,0.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,0.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:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width 0.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:progress-bar-stripes 1s linear infinite}@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}.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:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.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:#007bff;border-color:#007bff}.list-group-horizontal{flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.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:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.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:transparent;border:0;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);box-shadow:0 0.25rem 0.75rem rgba(0,0,0,0.1);backdrop-filter:blur(10px);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,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05)}.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 0.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-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);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,0.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;align-items:center;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.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)}.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:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.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:transparent;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:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,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:transparent;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((.5rem + 1px) * -1)}.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,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((.5rem + 1px) * -1);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,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((.5rem + 1px) * -1)}.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,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:-.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((.5rem + 1px) * -1);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,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;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.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:0s .6s opacity}@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%;color:#fff;text-align:center;opacity:.5;transition:opacity 0.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:no-repeat 50% / 100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%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' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-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 transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity 0.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:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.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:#007bff !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#0062cc !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:#28a745 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#1e7e34 !important}.bg-info{background-color:#17a2b8 !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#117a8b !important}.bg-warning{background-color:#ffc107 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#d39e00 !important}.bg-danger{background-color:#dc3545 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#bd2130 !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:transparent !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:#007bff !important}.border-secondary{border-color:#6c757d !important}.border-success{border-color:#28a745 !important}.border-info{border-color:#17a2b8 !important}.border-warning{border-color:#ffc107 !important}.border-danger{border-color:#dc3545 !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.85714%}.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}}.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;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 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow{box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,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}.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)}.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,.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:-.25rem !important}.mt-n1,.my-n1{margin-top:-.25rem !important}.mr-n1,.mx-n1{margin-right:-.25rem !important}.mb-n1,.my-n1{margin-bottom:-.25rem !important}.ml-n1,.mx-n1{margin-left:-.25rem !important}.m-n2{margin:-.5rem !important}.mt-n2,.my-n2{margin-top:-.5rem !important}.mr-n2,.mx-n2{margin-right:-.5rem !important}.mb-n2,.my-n2{margin-bottom:-.5rem !important}.ml-n2,.mx-n2{margin-left:-.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:-.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem !important}.m-sm-n2{margin:-.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-.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:-.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem !important}.m-md-n2{margin:-.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-.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:-.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem !important}.m-lg-n2{margin:-.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-.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:-.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem !important}.m-xl-n2{margin:-.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-.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}}.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:#007bff !important}a.text-primary:hover,a.text-primary:focus{color:#0056b3 !important}.text-secondary{color:#6c757d !important}a.text-secondary:hover,a.text-secondary:focus{color:#494f54 !important}.text-success{color:#28a745 !important}a.text-success:hover,a.text-success:focus{color:#19692c !important}.text-info{color:#17a2b8 !important}a.text-info:hover,a.text-info:focus{color:#0f6674 !important}.text-warning{color:#ffc107 !important}a.text-warning:hover,a.text-warning:focus{color:#ba8b00 !important}.text-danger{color:#dc3545 !important}a.text-danger:hover,a.text-danger:focus{color:#a71d2a !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:#212529 !important}.text-muted{color:#6c757d !important}.text-black-50{color:rgba(0,0,0,0.5) !important}.text-white-50{color:rgba(255,255,255,0.5) !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none !important}.text-break{word-break:break-word !important;overflow-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}thead{display:table-header-group}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:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}.switch{font-size:1rem;position:relative}.switch input{position:absolute;height:1px;width:1px;background:none;border:0;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden;padding:0}.switch input+label{position:relative;min-width:calc(calc(2.375rem * .8) * 2);border-radius:calc(2.375rem * .8);height:calc(2.375rem * .8);line-height:calc(2.375rem * .8);display:inline-block;cursor:pointer;outline:none;user-select:none;vertical-align:middle;text-indent:calc(calc(calc(2.375rem * .8) * 2) + .5rem)}.switch input+label::before,.switch input+label::after{content:'';position:absolute;top:0;left:0;width:calc(calc(2.375rem * .8) * 2);bottom:0;display:block}.switch input+label::before{right:0;background-color:#dee2e6;border-radius:calc(2.375rem * .8);transition:0.2s all}.switch input+label::after{top:2px;left:2px;width:calc(calc(2.375rem * .8) - calc(2px * 2));height:calc(calc(2.375rem * .8) - calc(2px * 2));border-radius:50%;background-color:#fff;transition:0.2s all}.switch input:checked+label::before{background-color:#08d}.switch input:checked+label::after{margin-left:calc(2.375rem * .8)}.switch input:focus+label::before{outline:none;box-shadow:0 0 0 .2rem rgba(0,136,221,0.25)}.switch input:disabled+label{color:#868e96;cursor:not-allowed}.switch input:disabled+label::before{background-color:#e9ecef}.switch.switch-sm{font-size:.875rem}.switch.switch-sm input+label{min-width:calc(calc(1.9375rem * .8) * 2);height:calc(1.9375rem * .8);line-height:calc(1.9375rem * .8);text-indent:calc(calc(calc(1.9375rem * .8) * 2) + .5rem)}.switch.switch-sm input+label::before{width:calc(calc(1.9375rem * .8) * 2)}.switch.switch-sm input+label::after{width:calc(calc(1.9375rem * .8) - calc(2px * 2));height:calc(calc(1.9375rem * .8) - calc(2px * 2))}.switch.switch-sm input:checked+label::after{margin-left:calc(1.9375rem * .8)}.switch.switch-lg{font-size:1.25rem}.switch.switch-lg input+label{min-width:calc(calc(3rem * .8) * 2);height:calc(3rem * .8);line-height:calc(3rem * .8);text-indent:calc(calc(calc(3rem * .8) * 2) + .5rem)}.switch.switch-lg input+label::before{width:calc(calc(3rem * .8) * 2)}.switch.switch-lg input+label::after{width:calc(calc(3rem * .8) - calc(2px * 2));height:calc(calc(3rem * .8) - calc(2px * 2))}.switch.switch-lg input:checked+label::after{margin-left:calc(3rem * .8)}.switch+.switch{margin-left:1rem}.switch.danger input:checked+label::before{background-color:#dc3545}.switch.danger input:focus+label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}html{font-size:0.8em;background-color:#f8f9fa}body{background-color:transparent;position:relative}label{margin-bottom:.2rem;min-height:1.5rem}dd>pre{padding:0 1em}.form-control.form-row{height:auto}.form-group span label{display:inline-block}.form-group label{display:block}.form-group.full-width input{width:100%}.form-group.no-label{margin-top:1.7rem}.form-group li label{display:inline-block;min-height:1rem;margin:0}.form-group li .form-control{width:auto;vertical-align:middle}.form-group li input[type="radio"].form-control,.form-group li input[type="checkbox"].form-control{display:inline}.form-check-label{margin:0.1em 0.5em}.form-check-label .fa{font-size:1.4em;color:#432776}pre{white-space:pre-wrap}.raw-description{white-space:pre-line}.form-control.small-input,.input-group>.form-control.small-input{width:110px;flex:none}.input-group>input[type=checkbox]{margin:0.5em 1em}.form-row.odd{background-color:#e9ecef}.form-row-modal{padding:0.5rem 2rem}.field-tip{position:absolute;right:10px;top:5px;opacity:0.7}.form-group .select2-container--default .select2-selection--multiple{border:1px solid #ced4da}.modal-dialog .select2-selection{width:470px}.page-link.imported-page{color:#aa8fda}.page-link.imported-page.current-page,.page-link.current-page{color:black;font-weight:bold}#modal-advanced-search .modal-header{flex-wrap:wrap;padding-bottom:0}#advanced-search-info{margin-bottom:0}.search-widget #advanced-search-info .alert{margin-bottom:0.6rem}#modal-advanced-search .modal-header .alert-secondary{background-color:#fff}.modal-header,.modal-footer{background-color:#e9ecef}.modal-header .input-group-text{background-color:#dee2e6;border-color:#ced4da}.modal-body.body-scroll{max-height:calc(100vh - 270px);overflow-y:auto}.window-pop{overflow:hidden}.window-pop .modal-body.body-scroll{max-height:calc(100vh - 122px)}.modal-dialog.full{width:98%;height:98%;max-width:none;padding:1%}.modal-dialog.full .display.dataTable{width:100% !important}.modal-dialog.full .modal-content{height:auto;min-height:100%;border-radius:0}.table{background-color:white}.tab-content{padding-top:0}.input-progress.form-control:focus,.input-progress{background-color:#dee2e6}.card-header,.input-progress,.table-striped tbody tr:nth-of-type(2n+1),.dt-bootstrap4 table.dataTable.stripe tbody tr.odd,.dt-bootstrap4 table.dataTable.display tbody tr.odd{background-color:#e9ecef}.dropdown-item:hover,.dropdown-item:focus,.dt-bootstrap4 table.dataTable.hover tbody tr:hover,.dt-bootstrap4 table.dataTable.display tbody tr:hover{background-color:#f6f6f6;background-color:#dee2e6}table.dataTable{font-size:0.8em}.ishtar-gallery-wrapper .ishtar-gallery-info,.container-fluid .dataTables_wrapper .dataTables_info{clear:none;font-size:0.8em;padding:0.5em 2em}.ishtar-gallery-wrapper label select{width:75px;display:inline-block;font-size:1em}.ishtar-gallery-wrapper label{font-size:0.8em}.ishtar-gallery .no-data{width:100%;font-size:0.85em;text-align:center;background-color:#dee2e6;padding:0.2em;margin:0.6em 0}.table-modal-lg table.dataTable{font-size:1em}div.dt-buttons{float:right}.dt-button{color:#fff;background-color:#007bff;border-color:#007bff;display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;border:1px solid transparent;color:#fff;background-color:#6c757d;border-color:#6c757d;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}.dt-button:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.dt-button:focus,.dt-button.focus{box-shadow:0 0 0 .2rem rgba(130,138,145,0.5)}.dt-button.disabled,.dt-button:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.dt-button:not(:disabled):not(.disabled):active,.dt-button:not(:disabled):not(.disabled).active,.show>.dt-button.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.dt-button:not(:disabled):not(.disabled):active:focus,.dt-button:not(:disabled):not(.disabled).active:focus,.show>.dt-button.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,0.5)}@media (prefers-reduced-motion: reduce){.dt-button{transition:none}}.dt-button.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.dt-button.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.dt-button.btn-success:focus,.dt-button.btn-success.focus{box-shadow:0 0 0 .2rem rgba(72,180,97,0.5)}.dt-button.btn-success.disabled,.dt-button.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.dt-button.btn-success:not(:disabled):not(.disabled):active,.dt-button.btn-success:not(:disabled):not(.disabled).active,.show>.dt-button.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.dt-button.btn-success:not(:disabled):not(.disabled):active:focus,.dt-button.btn-success:not(:disabled):not(.disabled).active:focus,.show>.dt-button.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,0.5)}.dt-button.disabled{background-color:#f8f9fa;border-color:#f8f9fa;color:#adb5bd;cursor:not-allowed}.small-button{padding:0.1em 0.2em}.previous-value{display:block;padding:0.2em 0.4em;background-color:#e9ecef;border:1px solid #ced4da}h3,.h3{font-size:1.5rem}h4,.h4{font-size:1.1rem}textarea{height:90px}.sheet .col-1,.sheet .col-2,.sheet .col-3,.sheet .col-4,.sheet .col-5,.sheet .col-6,.sheet .col-7,.sheet .col-8,.sheet .col-9,.sheet .col-10,.sheet .col-11,.sheet .col-12,.sheet .col,.sheet .col-auto,.sheet .col-sm-1,.sheet .col-sm-2,.sheet .col-sm-3,.sheet .col-sm-4,.sheet .col-sm-5,.sheet .col-sm-6,.sheet .col-sm-7,.sheet .col-sm-8,.sheet .col-sm-9,.sheet .col-sm-10,.sheet .col-sm-11,.sheet .col-sm-12,.sheet .col-sm,.sheet .col-sm-auto,.sheet .col-md-1,.sheet .col-md-2,.sheet .col-md-3,.sheet .col-md-4,.sheet .col-md-5,.sheet .col-md-6,.sheet .col-md-7,.sheet .col-md-8,.sheet .col-md-9,.sheet .col-md-10,.sheet .col-md-11,.sheet .col-md-12,.sheet .col-md,.sheet .col-md-auto,.sheet .col-lg-1,.sheet .col-lg-2,.sheet .col-lg-3,.sheet .col-lg-4,.sheet .col-lg-5,.sheet .col-lg-6,.sheet .col-lg-7,.sheet .col-lg-8,.sheet .col-lg-9,.sheet .col-lg-10,.sheet .col-lg-11,.sheet .col-lg-12,.sheet .col-lg,.sheet .col-lg-auto,.sheet .col-xl-1,.sheet .col-xl-2,.sheet .col-xl-3,.sheet .col-xl-4,.sheet .col-xl-5,.sheet .col-xl-6,.sheet .col-xl-7,.sheet .col-xl-8,.sheet .col-xl-9,.sheet .col-xl-10,.sheet .col-xl-11,.sheet .col-xl-12,.sheet .col-xl,.sheet .col-xl-auto{padding-right:5px;padding-left:5px}.sheet ol,.sheet ul,.sheet dl{margin-bottom:0.5rem}.sheet dt{line-height:1.4em}.sheet h4{color:#6c757d}#bookmark-list .input-link{width:100%;padding-right:5px}#window-fixed-menu{background-color:#e9ecef;position:fixed;right:0;margin-top:100px;z-index:50;width:200px}#window-fixed-menu-list li{padding-bottom:0.5em}#window-fixed-menu-list li a.nav-link{background-color:white}#window-fixed-menu-list li a.nav-link.active{background-color:#007bff}#window-menu-title{font-size:1.3em}#window-menu-control{font-size:0.6em;padding-top:0.2em}#window-fixed-menu.hidden{transform:rotate(270deg);transform-origin:right bottom 0}#window-fixed-menu.hidden i.fa-times{transform:rotate(45deg);transform-origin:10px 10px 0;padding-left:0.1em}#warning-banner{font-size:1.5em;background-color:#8c2525;color:#fff;padding:0 0.6em;text-align:right}#warning-banner a{color:#888}#warning-banner a:hover{color:#fff}.form h4,.form h3,.collapse-form .card-header,#window h3{background-color:#ced4da}.form h4.card-title{background-color:transparent}.collapse-form .card,.collapse-form .card-header{border-radius:0;border:0 solid}.collapse-form .card-header{padding:0;text-align:center}.collapse-form .card-header h4{margin-bottom:0}.collapse-form .card-header .btn.btn-link{color:#212529;width:100%}.collapse-form .card-body{border:1px solid #ced4da}.collapse-form .fa-expand,.collapse-form .collapsed .fa-compress{display:none}.collapse-form .collapsed .fa-expand,.collapse-form .fa-compress{display:inline-block}.clean-table h4,.form h4,.form h3,.collapse-form .card-header h4 .btn,.sheet h4,.sheet h3,.sheet h2{text-align:center;text-shadow:2px 2px 2px rgba(150,150,150,0.7)}.sheet .subsection{background-color:#e9ecef}.sheet .row.toolbar{padding:0.5em 0.75em}.sheet .row{padding:0 0.75em;margin:0}.clean-table h4{margin-top:1em}#main-container{margin-bottom:16em}.bg-dark{background-color:#432776 !important}.navbar{padding:0 0.5rem}.navbar-dark .navbar-nav.action-menu .nav-link{color:#ffe484;border:1px solid #ffe484;border-radius:4px;margin:0.2em;padding:0.3em 0.6em}.navbar-dark .navbar-nav.action-menu .d-none .nav-link{border:0px solid transparent}.navbar-dark .navbar-nav.action-menu .d-none .nav-link:hover{background-color:transparent;color:#ffe484}.navbar-dark .navbar-nav.action-menu .nav-link:hover{background-color:#ffe484;color:#343a40}.navbar-dark .navbar-nav.action-menu .nav-link.dropdown-toggle::after{color:#ffe484}.navbar-dark .navbar-nav.action-menu .nav-link.dropdown-toggle:hover::after{color:#343a40}#context-menu,#reminder,.confirm-message,div#validation-bar{background-color:#6f42c1;color:rgba(255,255,255,0.8)}#reminder{padding:0.6em 1em 0.1em 1em}#alert-list{padding:0.6em 0}#alert-list a{font-size:1.1rem}.confirm-message{text-align:center;margin:0;padding:0.5rem;font-weight:bold}.is-invalid input{border-color:#f99}.errorlist{color:#900}#shortcut-menu{width:700px;padding:1em}#context-menu a.nav-link{color:rgba(255,255,255,0.8);padding:0.8rem 0.5rem 0.7rem 0.5rem}#context-menu .breadcrumb{margin-bottom:0;background-color:transparent}#current_items{width:100%}div#foot{background-color:#432776;color:rgba(255,255,255,0.5)}div#foot a{color:#ddd}div#foot a:hover{color:#fff}.breadcrumb button{border:0 transparent;background-color:transparent}.breadcrumb a:hover{text-decoration:none}.breadcrumb button:hover{cursor:pointer;color:#0062cc}.input-group.date input{border:1px solid #dee2e6;border-radius:.25rem;padding:.375rem .75rem;font-size:1rem;line-height:1.5}.input-group.date .input-group-text:hover{cursor:pointer}.input-group>ul{padding:0.5em;border:1px solid #dee2e6;border-radius:.25rem;margin:0;list-style:none;height:auto}ul.compact{padding:0;margin:0}.help-text{max-height:250px;overflow:auto}.input-link{color:#6c757d}.input-link.disabled{color:#adb5bd}.input-link:hover{color:#343a40;cursor:pointer}.input-link.disabled:hover{color:#adb5bd;cursor:not-allowed}.input-sep{background-color:#fff;padding:0.3rem}.search .form-group{font-size:0.9em;margin-bottom:0}.search .search-widget{margin-bottom:1rem}.search_button{display:none}.search-vector{width:100%;padding-bottom:1em}.search-vector .form-group{margin-bottom:0}.ishtar-gallery .card{width:200px}.svg-image{display:inline-block;position:relative;width:100%;vertical-align:middle;text-align:center;overflow:hidden}.window-main-image{height:300px;display:block}.thumb-image{height:200px}.window-main-image,.thumb-image{position:relative;overflow:hidden}.window-main-image img,.thumb-image img{display:inline-block;max-width:100%;max-height:100%;width:auto;height:auto;position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-o-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.lightgallery-captions{display:none}.lightgallery-subimage{display:inline-block;width:80px;padding:0.2em}.lightgallery-subimage img{width:100%}.simple-window{position:absolute;left:50%;display:none}.simple-window-content{position:relative;left:-50%;top:-470px;width:350px;background-color:#fff;border:1px solid #adb5bd;border-radius:0.3rem}.simple-window .modal-body{max-height:300px;overflow-x:hidden;overflow-y:auto}.lg .lg-sub-html{text-align:left}.lg .lg-sub-html .close{color:#fff}.lg .lg-sub-html .close:hover{opacity:0.9}#basket-manage #foot_pk{display:none}#basket-manage #grid_pk_meta_wrapper{width:50%;float:left;padding-bottom:80px}#basket-add-button{width:8%;float:left;margin:20vh 1% 0 1%}#basket-content-wrapper{width:40%;float:left}#basket-content{text-align:left;overflow:auto;max-height:60vh}.ui-widget-content{border:1px solid #dee2e6;background-color:#fff}.ui-menu-item{padding:0.2em 0.4em;border:1px solid #fff}.ui-menu-item:hover{color:#6f3b93;border:1px solid #6f3b93;cursor:pointer}.ui-autocomplete{font-size:0.7em;z-index:10000 !important;width:350px;border:5px solid #dee2e6;outline:none}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none;font-size:1.1em}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ishtar-table-map,.window-map{border:solid 1px #adb5bd;background:url(../media/images/map-background.jpg) repeat}.window-map{width:100%;height:300px;margin-bottom:0.5em}.sheet .ishtar-table-map{display:none}.ishtar-table-map{width:100%;height:200px;margin-bottom:150px}@media screen and (min-height: 640px){.ishtar-table-map{height:calc(100vh - 440px);margin-bottom:0}}.sheet .ishtar-table-map{height:300px}.ishtar-map-top{padding:0.5em}.ishtar-map-popup{background-color:#fff;padding:0.5em 1em;border-radius:0.5em;border-style:solid;border-width:1px;border-color:#adb5bd;display:none}.simple-window-content ul,.ishtar-map-popup ul{margin:0;padding:0;list-style:none}.ishtar-map-popup::after{content:"";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#495057 transparent transparent transparent}.ol-overviewmap{bottom:3em}.ol-rotate{top:2.8em}.track-position{left:.5em;top:5em}.resize-handler{position:absolute;width:16px;height:16px;padding:4px;bottom:0;right:0;cursor:nwse-resize;background:url(../media/images/resize-handler.png) no-repeat}.chart-wrapper{display:block;position:relative;height:400px;width:calc(100% - 100px)}.chart-content{height:96%}.chart-resize{border:1px #999 dashed} diff --git a/ishtar_common/static/datatables/ellipsis.js b/ishtar_common/static/datatables/ellipsis.js index 186e9e56a..562eb701e 100644 --- a/ishtar_common/static/datatables/ellipsis.js +++ b/ishtar_common/static/datatables/ellipsis.js @@ -71,8 +71,12 @@ jQuery.fn.dataTable.render.ellipsis = function ( cutoff, wordbreak, escapeHtml )  		if ( d.length <= cutoff ) {  			return d;  		} +		if (d.substr(0, 2) ==  "<a"){  // do not cut links +		console.log(d); +			return d; +		} -		var shortened = d.substr(0, cutoff-1); +		var shortened = d.substr(0, cutoff - 1);  		// Find the last white space character in the string  		if ( wordbreak ) { diff --git a/ishtar_common/tasks.py b/ishtar_common/tasks.py index eec97d68a..223eded06 100644 --- a/ishtar_common/tasks.py +++ b/ishtar_common/tasks.py @@ -44,6 +44,11 @@ from archaeological_warehouse.views import get_warehouse  @task() +def trigger_error(): +    return 1/0 + + +@task()  def launch_import(import_task_id):      try:          import_task = ImportTask.objects.get(pk=import_task_id) diff --git a/ishtar_common/templates/ishtar/forms/qa_document_duplicate.html b/ishtar_common/templates/ishtar/forms/qa_document_duplicate.html new file mode 100644 index 000000000..4dc04d15d --- /dev/null +++ b/ishtar_common/templates/ishtar/forms/qa_document_duplicate.html @@ -0,0 +1,95 @@ +{% extends "ishtar/forms/qa_base.html" %} +{% load i18n inline_formset table_form %} + +{% block main_form %} +{% if form.non_field_errors %} +<div class="alert alert-danger" role="alert"> +    {{form.non_field_errors}} +</div> +{% endif %} +{% with force_large_col=True %} +<div class="form-row"> +    {% with form.qa_title as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +<div class="form-row"> +    {% with form.qa_source_type as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% endwith %} + +{% if form.qa_finds %} +<div class="form-row"> +    {% with form.qa_finds as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% endif %} + +{% if form.qa_context_records %} +<div class="form-row"> +    {% with form.qa_context_records as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% endif %} + +{% if form.qa_operations %} +<div class="form-row"> +    {% with form.qa_operations as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% endif %} + +{% if form.qa_sites %} +<div class="form-row"> +    {% with form.qa_sites as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% endif %} + +{% if form.qa_files %} +<div class="form-row"> +    {% with form.qa_files as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% endif %} + +{% if form.qa_warehouses %} +<div class="form-row"> +    {% with form.qa_warehouses as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% endif %} + +{% if form.qa_containers %} +<div class="form-row"> +    {% with form.qa_containers as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% endif %} + +{% if form.qa_treatments %} +<div class="form-row"> +    {% with form.qa_treatments as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% endif %} + +{% if form.qa_files %} +<div class="form-row"> +    {% with form.qa_treatment_files as field %} +    {% include "blocks/bs_field_snippet.html" %} +    {% endwith %} +</div> +{% endif %} + +{% endblock %} diff --git a/ishtar_common/templates/ishtar/sheet_document.html b/ishtar_common/templates/ishtar/sheet_document.html index 386b33a8a..93951c056 100644 --- a/ishtar_common/templates/ishtar/sheet_document.html +++ b/ishtar_common/templates/ishtar/sheet_document.html @@ -37,7 +37,7 @@      {% field_flex "Creation date" item.creation_date %}      {% field_flex "Receipt date" item.receipt_date %}      {% field_flex "Receipt date in documentation" item.receipt_date_in_documentation %} -    {% field_flex "Has a duplicate" item.duplicate %} +    {% if item.duplicate %}{% field_flex "Has a duplicate" item.duplicate %}{% endif %}      {% field_flex "Description" item.description %}      {% field_flex "Comment" item.comment %}      {% field_flex "Additional information" item.additional_information %} diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 3b7ced5ae..cc8d3eed4 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -32,6 +32,9 @@ from ishtar_common.utils import check_rights, get_urls_for_model  # forms  urlpatterns = [      url(r'^status/$', views.status, name='status'), +    url(r'^raise-error/$', views.raise_error, name='raise-error'), +    url(r'^raise-task-error/$', views.raise_task_error, +        name='raise-task-error'),      url(r'^ty/(?P<url_id>[a-zA-Z0-9]+)$', views.tiny_redirect,          name='tiny-redirect'),      url(r'^robots\.txt$', TemplateView.as_view(template_name='robots.txt', @@ -316,6 +319,10 @@ urlpatterns += [          check_rights(['change_document', 'change_own_document'])(              views.QADocumentForm.as_view()),          name='document-qa-bulk-update-confirm', kwargs={"confirm": True}), +    url(r'^document-qa-duplicate/(?P<pks>[0-9-]+)?/$', +        check_rights(['change_document', 'change_own_document'])( +            views.QADocumentDuplicateFormView.as_view()), +        name='document-qa-duplicate'),      url(r'^qa-not-available(?:/(?P<context>[0-9a-z-]+))?/$',          views.QANotAvailable.as_view(), name='qa-not-available'), diff --git a/ishtar_common/views.py b/ishtar_common/views.py index b44e07f48..4724d61b7 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -67,6 +67,7 @@ from ishtar_common.utils import clean_session_cache, CSV_OPTIONS, \      get_field_labels_from_path, get_random_item_image_link, shortify, \      dict_to_tuple, put_session_message, get_model_by_slug  from ishtar_common.widgets import JQueryAutoComplete +from ishtar_common import tasks  from .views_item import CURRENT_ITEM_KEYS, CURRENT_ITEM_KEYS_DICT, \      check_permission, display_item, get_item, show_item, new_qa_item @@ -78,6 +79,16 @@ def status(request):      return HttpResponse('OK') +def raise_error(request): +    return 1/0 + + +def raise_task_error(request): +    if settings.USE_BACKGROUND_TASK: +        tasks.trigger_error.delay() +    return HttpResponse('OK') + +  def wizard_is_available(wizard, request, model, pk):      try:          wizard(request) @@ -2253,6 +2264,8 @@ class QAItemForm(IshtarMixin, LoginRequiredMixin, FormView):          # check availability          quick_action = self.get_quick_action() +        if not quick_action: +            raise Http404()          if not quick_action.is_available(                  user=request.user, session=request.session):              for item in self.items: @@ -2368,3 +2381,27 @@ class QADocumentForm(QAItemEditForm):      form_class = forms.QADocumentFormMulti +class QADocumentDuplicateFormView(QAItemForm): +    template_name = 'ishtar/forms/qa_document_duplicate.html' +    model = models.Document +    page_name = _("Duplicate") +    form_class = forms.QADocumentDuplicateForm +    base_url = "document-qa-duplicate" + +    def get_form_kwargs(self): +        kwargs = super(QADocumentDuplicateFormView, +                       self).get_form_kwargs() +        kwargs['user'] = self.request.user +        return kwargs + +    def form_valid(self, form): +        form.save() +        return HttpResponseRedirect(reverse("success")) + +    def get_context_data(self, **kwargs): +        data = super(QADocumentDuplicateFormView, +                     self).get_context_data(**kwargs) +        data['action_name'] = _("Duplicate") +        return data + + diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index 88cd70b43..8cd903a00 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -20,7 +20,7 @@ from django.core.cache import cache  from django.core.exceptions import ObjectDoesNotExist  from django.core.urlresolvers import reverse, NoReverseMatch  from django.db.models import Q, Count, Sum, ImageField, Func, \ -    ExpressionWrapper, FloatField +    ExpressionWrapper, FloatField, FileField  from django.db.models.fields import FieldDoesNotExist  from django.http import HttpResponse  from django.shortcuts import render @@ -654,17 +654,23 @@ def _manage_bool_fields(model, bool_fields, reversed_bool_fields, dct, or_reqs):          if k in reversed_bool_fields:              dct[k] = not dct[k]          # check also for empty value with image field -        field_name = k.split('__')[0] +        field_names = k.split('__')          # TODO: can be improved in later version of Django          try: -            c_field = model._meta.get_field(field_name) +            c_field = model._meta.get_field(field_names[0]) +            for field_name in field_names[1:-1]: +                if not hasattr(c_field, "related_model"): +                    return +                c_field = c_field.related_model._meta.get_field(field_name)              if k.endswith('__isnull') and \ -                    isinstance(c_field, ImageField): +                    (isinstance(c_field, (ImageField, FileField)) +                     or field_names[-2] == "associated_url"): +                key = "__".join(k.split('__')[:-1])                  if dct[k]:                      or_reqs.append( -                        (k, {k.split('__')[0] + '__exact': ''})) +                        (k, {key + '__exact': ''}))                  else: -                    dct[k.split('__')[0] + '__regex'] = '.{1}.*' +                    dct[key + '__regex'] = '.{1}.*'          except FieldDoesNotExist:              pass @@ -816,18 +822,13 @@ def _manage_hierarchic_fields(dct, and_reqs):                  if val.startswith('"') and val.endswith('"'):                      val = val[1:-1]                  reqs = Q(**{req: val}) -                base_req = req[:]                  for idx in range(HIERARCHIC_LEVELS):                      req = req[:-(len(suffix))] + 'parent__' + suffix                      q = Q(**{req: val})                      reqs |= q -                req = base_req[:] -                for idx in range(HIERARCHIC_LEVELS): -                    req = req[:-(len(suffix))] + 'children__' + suffix -                    q = Q(**{req: val}) -                    reqs |= q                  and_reqs.append(reqs) +                # TODO: improve query with "IN ()"?                  continue              if req.endswith('town__pk') or req.endswith('towns__pk') \ @@ -855,6 +856,7 @@ def _manage_hierarchic_fields(dct, and_reqs):                      q = Q(**{req: val})                      reqs |= q                  and_reqs.append(reqs) +                # TODO: improve query with "IN ()"?                  continue              for k_hr in HIERARCHIC_FIELDS: @@ -908,6 +910,7 @@ def _manage_hierarchic_fields(dct, and_reqs):                              req = req[:-(len(suffix))] + 'parent__' + suffix                              q = Q(**{req: val})                              reqs |= q +                    # TODO: improve query with "IN ()"?                      if reqs:                          and_reqs.append(reqs)                      break @@ -1861,7 +1864,7 @@ def get_item(model, func_name, default_name, extra_request_keys=None,              "<a class='display_details' href='#' " \              "onclick='load_window(\"{}\")'>" \              "<i class=\"fa fa-info-circle\" aria-hidden=\"true\"></i><lock></a>" -        link_ext_template = '<a href="{}" target="_blank"></a>' +        link_ext_template = '<a href="{}" target="_blank">{}</a>'          lock = ' <i class="fa fa-lock text-danger" aria-hidden="true"></i>'          own_lock = ' <i class="fa fa-lock text-success" ' \                     'aria-hidden="true"></i>' diff --git a/scss/custom.scss b/scss/custom.scss index b00664552..4b0e4dfb8 100644 --- a/scss/custom.scss +++ b/scss/custom.scss @@ -116,6 +116,10 @@ pre {      border: $input-border-width solid $input-border-color;  } +.modal-dialog .select2-selection{ +	width: 470px; +} +  .page-link.imported-page {      color: $ishtar-light-color;  } diff --git a/version.py b/version.py index fc3896d8f..86a031090 100644 --- a/version.py +++ b/version.py @@ -1,5 +1,5 @@ -# 3.0.dev.11 -VERSION = (3, 0, 'dev', 11) +# 3.0.2 +VERSION = (3, 0, 2)  def get_version(): | 
