From c5332c1a329eaa2f471c4f8e742cfc89c0ca80f8 Mon Sep 17 00:00:00 2001 From: Aleksandr Komissarov Date: Sun, 18 Aug 2024 19:19:11 +0200 Subject: [PATCH] [LITE-30645] - HUB CD mapping added --- Dockerfile | 2 +- connect_ext_datalake/apis/settings.py | 5 + connect_ext_datalake/schemas.py | 2 + .../services/events/fulfillment.py | 12 +- .../services/events/tier_config.py | 4 +- connect_ext_datalake/services/payloads.py | 6 +- connect_ext_datalake/services/publish.py | 6 +- connect_ext_datalake/services/settings.py | 19 +- ...b2.js => settings.09c852fbb5f0f553fd30.js} | 129 ++++--- ....css => settings.9ac680fbcf453b441321.css} | 2 +- connect_ext_datalake/static/settings.html | 2 +- poetry.lock | 10 +- pyproject.toml | 2 +- tests/api/test_settings.py | 27 ++ tests/conftest.py | 11 + tests/fixtures/fulfillment_request.json | 330 ++++++++++++++++++ tests/fixtures/tcr_request.json | 259 ++++++++++++++ tests/test_events.py | 1 - tests/test_payloads.py | 77 ++++ ui/src/components/PubCard.vue | 18 +- 20 files changed, 841 insertions(+), 83 deletions(-) rename connect_ext_datalake/static/{settings.7539d5a41b9d9d5031b2.js => settings.09c852fbb5f0f553fd30.js} (96%) rename connect_ext_datalake/static/{settings.76b9b3b73b6d809fc5e7.css => settings.9ac680fbcf453b441321.css} (92%) create mode 100644 tests/fixtures/fulfillment_request.json create mode 100644 tests/fixtures/tcr_request.json create mode 100644 tests/test_payloads.py diff --git a/Dockerfile b/Dockerfile index f547b26..d3cf1bc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM cloudblueconnect/connect-extension-runner:29.4 +FROM cloudblueconnect/connect-extension-runner:31.0 COPY pyproject.toml /install_temp/. COPY poetry.* /install_temp/. diff --git a/connect_ext_datalake/apis/settings.py b/connect_ext_datalake/apis/settings.py index 1bd7003..a144814 100644 --- a/connect_ext_datalake/apis/settings.py +++ b/connect_ext_datalake/apis/settings.py @@ -19,6 +19,7 @@ get_all_settings, get_settings, update_settings, + validate_hub_cd, ) @@ -51,6 +52,8 @@ def validate_settings( pubsub_client = GooglePubsubClient(settings) pubsub_client.validate() + validate_hub_cd(settings.hub.hub_cd, hub_id) + return settings except Exception as e: return self.get_error_response(e) @@ -69,6 +72,8 @@ def save_settings( logger: LoggerAdapter = Depends(get_logger), ): try: + validate_hub_cd(setting.hub_cd, hub_id) + pubsub_client = GooglePubsubClient(setting) pubsub_client.validate() diff --git a/connect_ext_datalake/schemas.py b/connect_ext_datalake/schemas.py index 56a09b8..1792b0e 100644 --- a/connect_ext_datalake/schemas.py +++ b/connect_ext_datalake/schemas.py @@ -12,11 +12,13 @@ class Hub(BaseModel): id: str name: str icon: str | None = None + hub_cd: str | None = None class SettingInput(BaseModel): account_info: dict product_topic: str + hub_cd: str | None = None class Setting(SettingInput): diff --git a/connect_ext_datalake/services/events/fulfillment.py b/connect_ext_datalake/services/events/fulfillment.py index e3a3ab6..2d4e504 100644 --- a/connect_ext_datalake/services/events/fulfillment.py +++ b/connect_ext_datalake/services/events/fulfillment.py @@ -5,7 +5,7 @@ from connect_ext_datalake.services.client import GooglePubsubClient from connect_ext_datalake.services.publish import publish_ff_request -from connect_ext_datalake.services.settings import get_settings +from connect_ext_datalake.services.settings import get_settings, validate_hub_cd class FulfillmentEventsMixin: @@ -15,12 +15,14 @@ def __process_ff_request_event(self, ff_request): if hub_id: setting = get_settings(self.installation, hub_id) if setting: + validate_hub_cd(setting.hub.hub_cd, hub_id) try: client = GooglePubsubClient(setting) publish_ff_request( client, ff_request, self.logger, + setting.hub.hub_cd, ) except Exception as e: self.logger.exception( @@ -48,7 +50,6 @@ def __process_ff_request_event(self, ff_request): 'scheduled', 'revoking', 'revoked', - 'tiers_setup', ], ) def handle_asset_suspend_request_processing(self, ff_request): @@ -64,7 +65,6 @@ def handle_asset_suspend_request_processing(self, ff_request): 'scheduled', 'revoking', 'revoked', - 'tiers_setup', ], ) def handle_asset_adjustment_request_processing(self, ff_request): @@ -79,7 +79,6 @@ def handle_asset_adjustment_request_processing(self, ff_request): 'scheduled', 'revoking', 'revoked', - 'tiers_setup', ], ) def handle_asset_cancel_request_processing(self, ff_request): @@ -106,7 +105,6 @@ def handle_tier_account_update_request_processing(self, ff_request): 'scheduled', 'revoking', 'revoked', - 'tiers_setup', ], ) def handle_asset_purchase_request_processing(self, ff_request): @@ -122,7 +120,6 @@ def handle_asset_purchase_request_processing(self, ff_request): 'scheduled', 'revoking', 'revoked', - 'tiers_setup', ], ) def handle_asset_change_request_processing(self, ff_request): @@ -137,7 +134,6 @@ def handle_asset_change_request_processing(self, ff_request): 'scheduled', 'revoking', 'revoked', - 'tiers_setup', ], ) def handle_asset_resume_request_processing(self, ff_request): @@ -148,7 +144,7 @@ def handle_asset_resume_request_processing(self, ff_request): [ { 'name': 'FF_REQUEST_PAGE_SIZE', - 'initial_value': 100, + 'initial_value': '100', }, ], ) diff --git a/connect_ext_datalake/services/events/tier_config.py b/connect_ext_datalake/services/events/tier_config.py index 438d76f..ee0e440 100644 --- a/connect_ext_datalake/services/events/tier_config.py +++ b/connect_ext_datalake/services/events/tier_config.py @@ -6,7 +6,7 @@ from connect_ext_datalake.services.client import GooglePubsubClient from connect_ext_datalake.services.publish import publish_tc, publish_tc_from_tcr, publish_tcr -from connect_ext_datalake.services.settings import get_settings +from connect_ext_datalake.services.settings import get_settings, validate_hub_cd class TierConfigEventsMixin: @@ -16,6 +16,7 @@ def __process_tcr_event(self, tcr): hub_id = tcr['configuration']['connection']['hub']['id'] setting = get_settings(self.installation, hub_id) if setting: + validate_hub_cd(setting.hub.hub_cd, hub_id) client = GooglePubsubClient(setting) publish_tc_from_tcr( self.installation_client, @@ -27,6 +28,7 @@ def __process_tcr_event(self, tcr): client, tcr, self.logger, + setting.hub.hub_cd, ) else: self.logger.info( diff --git a/connect_ext_datalake/services/payloads.py b/connect_ext_datalake/services/payloads.py index f137b2d..02d1875 100644 --- a/connect_ext_datalake/services/payloads.py +++ b/connect_ext_datalake/services/payloads.py @@ -286,7 +286,7 @@ def prepare_tc_data(client: ConnectClient, tc: dict): } -def prepare_tcr_data(tcr: dict): +def prepare_tcr_data(tcr: dict, hub_cd): tcr["activation_link"] = tcr.get('activation', {}).get('link', None) tcr["name"] = f"Tier Configuration Request for {tcr['configuration']['account']['id']}." tcr['tier_account_id'] = tcr['configuration']['account']['id'] @@ -295,6 +295,7 @@ def prepare_tcr_data(tcr: dict): tcr["published_at"] = datetime.now(tz=timezone(timedelta(hours=0))).isoformat( timespec='seconds' ) + tcr["hub_cd"] = hub_cd sanitize_tcr(tcr) return { @@ -304,7 +305,7 @@ def prepare_tcr_data(tcr: dict): } -def prepare_ff_request_data(ff_request: dict): +def prepare_ff_request_data(ff_request: dict, hub_cd): ff_request["name"] = f"Fulfillment request for asset {ff_request['asset']['id']}." ff_request["asset_id"] = ff_request['asset']['id'] ff_request['product_id'] = ff_request['asset']['product']['id'] @@ -314,6 +315,7 @@ def prepare_ff_request_data(ff_request: dict): ff_request["published_at"] = datetime.now(tz=timezone(timedelta(hours=0))).isoformat( timespec='seconds' ) + ff_request["hub_cd"] = hub_cd sanitize_ff_request(ff_request) return { diff --git a/connect_ext_datalake/services/publish.py b/connect_ext_datalake/services/publish.py index 347f97e..a14a3d9 100644 --- a/connect_ext_datalake/services/publish.py +++ b/connect_ext_datalake/services/publish.py @@ -47,8 +47,9 @@ def publish_tcr( pubsub_client: GooglePubsubClient, tcr, logger, + hub_cd, ): - payload = prepare_tcr_data(tcr) + payload = prepare_tcr_data(tcr, hub_cd) logger.info(f"Start publishing Tier Config Request {tcr['id']}. Payload: {payload}") pubsub_client.publish(payload) logger.info(f"Publish of Tier Config Request {tcr['id']}" f' is successful.') @@ -58,8 +59,9 @@ def publish_ff_request( pubsub_client: GooglePubsubClient, ff_request, logger, + hub_cd, ): - payload = prepare_ff_request_data(ff_request) + payload = prepare_ff_request_data(ff_request, hub_cd) logger.info(f"Start publishing Fulfillment Request {ff_request['id']}. Payload: {payload}") pubsub_client.publish(payload) logger.info(f"Publish of Fulfillment Request {ff_request['id']}" f' is successful.') diff --git a/connect_ext_datalake/services/settings.py b/connect_ext_datalake/services/settings.py index 1ee62e9..e08ef63 100644 --- a/connect_ext_datalake/services/settings.py +++ b/connect_ext_datalake/services/settings.py @@ -3,6 +3,9 @@ from connect_ext_datalake.schemas import Hub, Setting, SettingInput +HUB_CD_LIST = ["NA", "EU", "OC", "SG"] + + def get_all_settings(installation: dict): settings = [] @@ -51,10 +54,7 @@ def update_settings( existing_setting['account_info'] = setting.account_info existing_setting['product_topic'] = setting.product_topic - existing_setting['hub'] = { - 'id': hub['id'], - 'name': hub['name'], - } + existing_setting['hub'] = {'id': hub['id'], 'name': hub['name'], 'hub_cd': setting.hub_cd} client('devops').installations[installation['id']].update( payload={ @@ -168,3 +168,14 @@ def creating_settings_map_from_product( installation, client, ) + + +def validate_hub_cd(hub_cd=None, hub_id=None): + if not hub_cd: + raise Exception(f"Hub_cd is not set for {hub_id}") + else: + if hub_cd not in HUB_CD_LIST: + raise Exception( + f"Value of hub_cd '{hub_cd}' not in the list of available values: " + + ", ".join(HUB_CD_LIST) + ) diff --git a/connect_ext_datalake/static/settings.7539d5a41b9d9d5031b2.js b/connect_ext_datalake/static/settings.09c852fbb5f0f553fd30.js similarity index 96% rename from connect_ext_datalake/static/settings.7539d5a41b9d9d5031b2.js rename to connect_ext_datalake/static/settings.09c852fbb5f0f553fd30.js index 04b8cf8..a8836c8 100644 --- a/connect_ext_datalake/static/settings.7539d5a41b9d9d5031b2.js +++ b/connect_ext_datalake/static/settings.09c852fbb5f0f553fd30.js @@ -2,7 +2,7 @@ /******/ "use strict"; /******/ var __webpack_modules__ = ({ -/***/ 49: +/***/ 2342: /***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { @@ -1869,153 +1869,159 @@ function SyncCardvue_type_script_lang_js_asyncToGenerator(fn) { return function const SyncCard_exports_ = /*#__PURE__*/(0,exportHelper/* default */.Z)(SyncCardvue_type_script_lang_js, [['render',SyncCardvue_type_template_id_5c01c1f5_scoped_true_render],['__scopeId',"data-v-5c01c1f5"]]) /* harmony default export */ const SyncCard = (SyncCard_exports_); -;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-1.use!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[1].rules[8].use[0]!./ui/src/components/PubCard.vue?vue&type=template&id=c352baea&scoped=true +;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-1.use!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[1].rules[8].use[0]!./ui/src/components/PubCard.vue?vue&type=template&id=3d5f2951&scoped=true -var PubCardvue_type_template_id_c352baea_scoped_true_withScopeId = function _withScopeId(n) { - return (0,vue_esm_bundler/* pushScopeId */.dD)("data-v-c352baea"), n = n(), (0,vue_esm_bundler/* popScopeId */.Cn)(), n; +var PubCardvue_type_template_id_3d5f2951_scoped_true_withScopeId = function _withScopeId(n) { + return (0,vue_esm_bundler/* pushScopeId */.dD)("data-v-3d5f2951"), n = n(), (0,vue_esm_bundler/* popScopeId */.Cn)(), n; }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_1 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_1 = { id: "publishing-card", "class": "ez-card" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_2 = /*#__PURE__*/PubCardvue_type_template_id_c352baea_scoped_true_withScopeId(function () { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_2 = /*#__PURE__*/PubCardvue_type_template_id_3d5f2951_scoped_true_withScopeId(function () { return /*#__PURE__*/(0,vue_esm_bundler/* createElementVNode */._)("header", { "class": "ez-card__header" }, [/*#__PURE__*/(0,vue_esm_bundler/* createElementVNode */._)("h2", { "class": "ez-card__title" }, " Settings ")], -1 /* HOISTED */); }); -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_3 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_3 = { "class": "table-item" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_4 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_4 = { "class": "table-item__title" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_5 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_5 = { "class": "table-item__assistive" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_6 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_6 = { key: 0, "class": "table-item" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_7 = /*#__PURE__*/PubCardvue_type_template_id_c352baea_scoped_true_withScopeId(function () { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_7 = /*#__PURE__*/PubCardvue_type_template_id_3d5f2951_scoped_true_withScopeId(function () { return /*#__PURE__*/(0,vue_esm_bundler/* createElementVNode */._)("p", { "class": "table-item__title monospace-text" }, " ********* ", -1 /* HOISTED */); }); -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_8 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_8 = { "class": "table-item__assistive" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_9 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_9 = { key: 1, "class": "table-item_empty" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_10 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_10 = { "class": "table-icons" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_11 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_11 = { "class": "menu-items" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_12 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_12 = { key: 0, "class": "menu-item" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_13 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_13 = { key: 0, "class": "ez-dialog__inner" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_14 = /*#__PURE__*/PubCardvue_type_template_id_c352baea_scoped_true_withScopeId(function () { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_14 = /*#__PURE__*/PubCardvue_type_template_id_3d5f2951_scoped_true_withScopeId(function () { return /*#__PURE__*/(0,vue_esm_bundler/* createElementVNode */._)("header", { "class": "ez-dialog__header" }, " Settings ", -1 /* HOISTED */); }); -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_15 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_15 = { ref: "dialogContentEl", "class": "ez-dialog__content" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_16 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_16 = { "class": "hub-info" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_17 = /*#__PURE__*/PubCardvue_type_template_id_c352baea_scoped_true_withScopeId(function () { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_17 = /*#__PURE__*/PubCardvue_type_template_id_3d5f2951_scoped_true_withScopeId(function () { return /*#__PURE__*/(0,vue_esm_bundler/* createElementVNode */._)("p", { "class": "label-text" }, " Hub ", -1 /* HOISTED */); }); -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_18 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_18 = { "class": "table-item" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_19 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_19 = { "class": "table-item__title" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_20 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_20 = { "class": "table-item__assistive" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_21 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_21 = { action: "", "class": "ez-dialog__form" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_22 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_22 = { "class": "account-json-wrapper" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_23 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_23 = { "class": "custom-file-input ez-dialog__controls" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_24 = { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_24 = { "for": "file-input", "class": "custom-file-input__label" }; -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_25 = /*#__PURE__*/PubCardvue_type_template_id_c352baea_scoped_true_withScopeId(function () { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_25 = /*#__PURE__*/PubCardvue_type_template_id_3d5f2951_scoped_true_withScopeId(function () { return /*#__PURE__*/(0,vue_esm_bundler/* createElementVNode */._)("label", { "for": "account_info", "class": "label-text" }, "Google Credentials JSON", -1 /* HOISTED */); }); -var PubCardvue_type_template_id_c352baea_scoped_true_hoisted_26 = /*#__PURE__*/PubCardvue_type_template_id_c352baea_scoped_true_withScopeId(function () { +var PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_26 = /*#__PURE__*/PubCardvue_type_template_id_3d5f2951_scoped_true_withScopeId(function () { return /*#__PURE__*/(0,vue_esm_bundler/* createElementVNode */._)("label", { "for": "product_topic", "class": "label-text" }, "Pub/Sub Topic", -1 /* HOISTED */); }); -var _hoisted_27 = { +var _hoisted_27 = /*#__PURE__*/PubCardvue_type_template_id_3d5f2951_scoped_true_withScopeId(function () { + return /*#__PURE__*/(0,vue_esm_bundler/* createElementVNode */._)("label", { + "for": "hub_cd", + "class": "label-text" + }, "HUB CD (for commerce system - available values are \"NA, EU, OC, SG\")", -1 /* HOISTED */); +}); +var _hoisted_28 = { "class": "ez-dialog__footer" }; -var _hoisted_28 = { +var _hoisted_29 = { key: 0, "class": "ez-dialog__inner" }; -var _hoisted_29 = /*#__PURE__*/PubCardvue_type_template_id_c352baea_scoped_true_withScopeId(function () { +var _hoisted_30 = /*#__PURE__*/PubCardvue_type_template_id_3d5f2951_scoped_true_withScopeId(function () { return /*#__PURE__*/(0,vue_esm_bundler/* createElementVNode */._)("header", { "class": "ez-dialog__header" }, " Delete credentials ", -1 /* HOISTED */); }); -var _hoisted_30 = { +var _hoisted_31 = { "class": "ez-dialog__content" }; -var _hoisted_31 = { +var _hoisted_32 = { "class": "delete-dialog-text" }; -var _hoisted_32 = { +var _hoisted_33 = { "class": "ez-dialog__footer" }; -function PubCardvue_type_template_id_c352baea_scoped_true_render(_ctx, _cache, $props, $setup, $data, $options) { +function PubCardvue_type_template_id_3d5f2951_scoped_true_render(_ctx, _cache, $props, $setup, $data, $options) { var _component_c_icon = (0,vue_esm_bundler/* resolveComponent */.up)("c-icon"); var _component_c_button = (0,vue_esm_bundler/* resolveComponent */.up)("c-button"); var _component_c_menu = (0,vue_esm_bundler/* resolveComponent */.up)("c-menu"); var _component_ez_table = (0,vue_esm_bundler/* resolveComponent */.up)("ez-table"); var _component_c_alert = (0,vue_esm_bundler/* resolveComponent */.up)("c-alert"); - return (0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createElementBlock */.iD)("section", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_1, [PubCardvue_type_template_id_c352baea_scoped_true_hoisted_2, (0,vue_esm_bundler/* createVNode */.Wm)(_component_ez_table, { + return (0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createElementBlock */.iD)("section", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_1, [PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_2, (0,vue_esm_bundler/* createVNode */.Wm)(_component_ez_table, { items: $options.items, headers: $data.headers }, { hub: (0,vue_esm_bundler/* withCtx */.w5)(function (item) { - return [(0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_3, [(0,vue_esm_bundler/* createElementVNode */._)("p", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_4, (0,vue_esm_bundler/* toDisplayString */.zw)(item.hub.name), 1 /* TEXT */), (0,vue_esm_bundler/* createElementVNode */._)("p", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_5, (0,vue_esm_bundler/* toDisplayString */.zw)(item.hub.id), 1 /* TEXT */)])]; + return [(0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_3, [(0,vue_esm_bundler/* createElementVNode */._)("p", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_4, (0,vue_esm_bundler/* toDisplayString */.zw)(item.hub.name), 1 /* TEXT */), (0,vue_esm_bundler/* createElementVNode */._)("p", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_5, (0,vue_esm_bundler/* toDisplayString */.zw)(item.hub.id), 1 /* TEXT */)])]; }), credentials: (0,vue_esm_bundler/* withCtx */.w5)(function (item) { - return [item.credentials ? ((0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createElementBlock */.iD)("div", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_6, [PubCardvue_type_template_id_c352baea_scoped_true_hoisted_7, (0,vue_esm_bundler/* createElementVNode */._)("p", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_8, (0,vue_esm_bundler/* toDisplayString */.zw)(item.credentials.topic), 1 /* TEXT */)])) : ((0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createElementBlock */.iD)("span", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_9, "—"))]; + return [item.credentials ? ((0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createElementBlock */.iD)("div", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_6, [PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_7, (0,vue_esm_bundler/* createElementVNode */._)("p", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_8, (0,vue_esm_bundler/* toDisplayString */.zw)(item.credentials.topic), 1 /* TEXT */)])) : ((0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createElementBlock */.iD)("span", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_9, "—"))]; }), actions: (0,vue_esm_bundler/* withCtx */.w5)(function (item) { - return [(0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_10, [(0,vue_esm_bundler/* createVNode */.Wm)(_component_c_icon, { + return [(0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_10, [(0,vue_esm_bundler/* createVNode */.Wm)(_component_c_icon, { "class": (0,vue_esm_bundler/* normalizeClass */.C_)(["error-icon", { 'error-icon_visible': $data.itemsWithErrors[item.hub.id] }]), @@ -2044,7 +2050,7 @@ function PubCardvue_type_template_id_c352baea_scoped_true_render(_ctx, _cache, $ }, null, 8 /* PROPS */, ["disabled", "icon", "title"])]; }), "default": (0,vue_esm_bundler/* withCtx */.w5)(function () { - return [(0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_11, [(0,vue_esm_bundler/* createElementVNode */._)("div", { + return [(0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_11, [(0,vue_esm_bundler/* createElementVNode */._)("div", { "class": (0,vue_esm_bundler/* normalizeClass */.C_)(["menu-item", { 'menu-item_disabled': !item.credentials }]) @@ -2059,7 +2065,7 @@ function PubCardvue_type_template_id_c352baea_scoped_true_render(_ctx, _cache, $ onClick: function onClick($event) { return $options.validateConfig(item); } - }, null, 8 /* PROPS */, ["disabled", "icon", "title", "onClick"])], 2 /* CLASS */), item.credentials ? ((0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createElementBlock */.iD)("div", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_12, [(0,vue_esm_bundler/* createVNode */.Wm)(_component_c_button, { + }, null, 8 /* PROPS */, ["disabled", "icon", "title", "onClick"])], 2 /* CLASS */), item.credentials ? ((0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createElementBlock */.iD)("div", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_12, [(0,vue_esm_bundler/* createVNode */.Wm)(_component_c_button, { icon: $data.icons.googleDeleteBaseline, "upper-case": false, "class": "menu-item__btn", @@ -2079,14 +2085,14 @@ function PubCardvue_type_template_id_c352baea_scoped_true_render(_ctx, _cache, $ "class": (0,vue_esm_bundler/* normalizeClass */.C_)(["ez-dialog", { 'ez-dialog_open': $data.isEditDialogOpen }]) - }, [$data.isEditDialogOpen ? ((0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createElementBlock */.iD)("section", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_13, [PubCardvue_type_template_id_c352baea_scoped_true_hoisted_14, (0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_15, [$data.dialogError ? ((0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createBlock */.j4)(_component_c_alert, { + }, [$data.isEditDialogOpen ? ((0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createElementBlock */.iD)("section", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_13, [PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_14, (0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_15, [$data.dialogError ? ((0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createBlock */.j4)(_component_c_alert, { key: 0, "class": "ez-card__alert", icon: $data.icons.googleWarningBaseline, message: $data.dialogError, type: "error", fluid: "" - }, null, 8 /* PROPS */, ["icon", "message"])) : (0,vue_esm_bundler/* createCommentVNode */.kq)("v-if", true), (0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_16, [PubCardvue_type_template_id_c352baea_scoped_true_hoisted_17, (0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_18, [(0,vue_esm_bundler/* createElementVNode */._)("p", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_19, (0,vue_esm_bundler/* toDisplayString */.zw)($data.currentItem.hub.name), 1 /* TEXT */), (0,vue_esm_bundler/* createElementVNode */._)("p", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_20, (0,vue_esm_bundler/* toDisplayString */.zw)($data.currentItem.hub.id), 1 /* TEXT */)])]), (0,vue_esm_bundler/* createElementVNode */._)("form", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_21, [(0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_22, [(0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_23, [(0,vue_esm_bundler/* createElementVNode */._)("label", PubCardvue_type_template_id_c352baea_scoped_true_hoisted_24, [(0,vue_esm_bundler/* createVNode */.Wm)(_component_c_icon, { + }, null, 8 /* PROPS */, ["icon", "message"])) : (0,vue_esm_bundler/* createCommentVNode */.kq)("v-if", true), (0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_16, [PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_17, (0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_18, [(0,vue_esm_bundler/* createElementVNode */._)("p", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_19, (0,vue_esm_bundler/* toDisplayString */.zw)($data.currentItem.hub.name), 1 /* TEXT */), (0,vue_esm_bundler/* createElementVNode */._)("p", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_20, (0,vue_esm_bundler/* toDisplayString */.zw)($data.currentItem.hub.id), 1 /* TEXT */)])]), (0,vue_esm_bundler/* createElementVNode */._)("form", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_21, [(0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_22, [(0,vue_esm_bundler/* createElementVNode */._)("div", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_23, [(0,vue_esm_bundler/* createElementVNode */._)("label", PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_24, [(0,vue_esm_bundler/* createVNode */.Wm)(_component_c_icon, { icon: $data.icons.googleUploadBaseline, size: "16", "class": "custom-file-input__label-icon" @@ -2098,7 +2104,7 @@ function PubCardvue_type_template_id_c352baea_scoped_true_render(_ctx, _cache, $ onChange: _cache[0] || (_cache[0] = function () { return $options.onFileChange && $options.onFileChange.apply($options, arguments); }) - }, null, 32 /* HYDRATE_EVENTS */)]), PubCardvue_type_template_id_c352baea_scoped_true_hoisted_25, (0,vue_esm_bundler/* withDirectives */.wy)((0,vue_esm_bundler/* createElementVNode */._)("textarea", { + }, null, 32 /* HYDRATE_EVENTS */)]), PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_25, (0,vue_esm_bundler/* withDirectives */.wy)((0,vue_esm_bundler/* createElementVNode */._)("textarea", { id: "account_info", ref: "textarea-account-info", "onUpdate:modelValue": _cache[1] || (_cache[1] = function ($event) { @@ -2106,14 +2112,21 @@ function PubCardvue_type_template_id_c352baea_scoped_true_render(_ctx, _cache, $ }), "class": "code account-info-area", materialize: "" - }, null, 512 /* NEED_PATCH */), [[vue_esm_bundler/* vModelText */.nr, $data.accountInfo]])]), PubCardvue_type_template_id_c352baea_scoped_true_hoisted_26, (0,vue_esm_bundler/* withDirectives */.wy)((0,vue_esm_bundler/* createElementVNode */._)("textarea", { + }, null, 512 /* NEED_PATCH */), [[vue_esm_bundler/* vModelText */.nr, $data.accountInfo]])]), PubCardvue_type_template_id_3d5f2951_scoped_true_hoisted_26, (0,vue_esm_bundler/* withDirectives */.wy)((0,vue_esm_bundler/* createElementVNode */._)("textarea", { id: "product_topic", "onUpdate:modelValue": _cache[2] || (_cache[2] = function ($event) { return $data.productTopic = $event; }), "class": "code topic-area", materialize: "" - }, null, 512 /* NEED_PATCH */), [[vue_esm_bundler/* vModelText */.nr, $data.productTopic]])])], 512 /* NEED_PATCH */), (0,vue_esm_bundler/* createElementVNode */._)("footer", _hoisted_27, [(0,vue_esm_bundler/* createVNode */.Wm)(_component_c_button, { + }, null, 512 /* NEED_PATCH */), [[vue_esm_bundler/* vModelText */.nr, $data.productTopic]]), _hoisted_27, (0,vue_esm_bundler/* withDirectives */.wy)((0,vue_esm_bundler/* createElementVNode */._)("textarea", { + id: "hub_cd", + "onUpdate:modelValue": _cache[3] || (_cache[3] = function ($event) { + return $data.hubCd = $event; + }), + "class": "code topic-area", + materialize: "" + }, null, 512 /* NEED_PATCH */), [[vue_esm_bundler/* vModelText */.nr, $data.hubCd]])])], 512 /* NEED_PATCH */), (0,vue_esm_bundler/* createElementVNode */._)("footer", _hoisted_28, [(0,vue_esm_bundler/* createVNode */.Wm)(_component_c_button, { label: "cancel", onClick: $options.closeEditDialog }, null, 8 /* PROPS */, ["onClick"]), (0,vue_esm_bundler/* createVNode */.Wm)(_component_c_button, { @@ -2126,7 +2139,7 @@ function PubCardvue_type_template_id_c352baea_scoped_true_render(_ctx, _cache, $ "class": (0,vue_esm_bundler/* normalizeClass */.C_)(["ez-dialog", { 'ez-dialog_open': $data.isDeleteDialogOpen }]) - }, [$data.isDeleteDialogOpen ? ((0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createElementBlock */.iD)("section", _hoisted_28, [_hoisted_29, (0,vue_esm_bundler/* createElementVNode */._)("div", _hoisted_30, [(0,vue_esm_bundler/* createElementVNode */._)("p", _hoisted_31, " Are you sure you want to delete the credentials for " + (0,vue_esm_bundler/* toDisplayString */.zw)($data.currentItem.hub.name) + " hub (" + (0,vue_esm_bundler/* toDisplayString */.zw)($data.currentItem.hub.id) + ")? ", 1 /* TEXT */)]), (0,vue_esm_bundler/* createElementVNode */._)("footer", _hoisted_32, [(0,vue_esm_bundler/* createVNode */.Wm)(_component_c_button, { + }, [$data.isDeleteDialogOpen ? ((0,vue_esm_bundler/* openBlock */.wg)(), (0,vue_esm_bundler/* createElementBlock */.iD)("section", _hoisted_29, [_hoisted_30, (0,vue_esm_bundler/* createElementVNode */._)("div", _hoisted_31, [(0,vue_esm_bundler/* createElementVNode */._)("p", _hoisted_32, " Are you sure you want to delete the credentials for " + (0,vue_esm_bundler/* toDisplayString */.zw)($data.currentItem.hub.name) + " hub (" + (0,vue_esm_bundler/* toDisplayString */.zw)($data.currentItem.hub.id) + ")? ", 1 /* TEXT */)]), (0,vue_esm_bundler/* createElementVNode */._)("footer", _hoisted_33, [(0,vue_esm_bundler/* createVNode */.Wm)(_component_c_button, { color: "black", label: "Cancel", onClick: $options.closeDeleteDialog @@ -2137,7 +2150,7 @@ function PubCardvue_type_template_id_c352baea_scoped_true_render(_ctx, _cache, $ onClick: $options.deleteCredentials }, null, 8 /* PROPS */, ["loading", "onClick"])])])) : (0,vue_esm_bundler/* createCommentVNode */.kq)("v-if", true)], 2 /* CLASS */)]); } -;// CONCATENATED MODULE: ./ui/src/components/PubCard.vue?vue&type=template&id=c352baea&scoped=true +;// CONCATENATED MODULE: ./ui/src/components/PubCard.vue?vue&type=template&id=3d5f2951&scoped=true // EXTERNAL MODULE: ./node_modules/@cloudblueconnect/material-svg/icons/google/upload/baseline.svg var upload_baseline = __webpack_require__(8390); @@ -2241,6 +2254,7 @@ var simplestJSONLength = 9; dialogError: '', accountInfo: '', productTopic: '', + hubCd: '', itemsWithErrors: {}, icons: { googleUploadBaseline: upload_baseline/* default */.Z, @@ -2271,7 +2285,7 @@ var simplestJSONLength = 9; return isValidJSON(vm.accountInfo) && vm.accountInfo.length >= simplestJSONLength; }, canSaveCreds: function canSaveCreds(vm) { - return vm.validAccountInfo && !!vm.productTopic; + return vm.validAccountInfo && !!vm.productTopic && !!vm.hubCd; }, items: function items(_ref) { var hubs = _ref.hubs, @@ -2282,7 +2296,8 @@ var simplestJSONLength = 9; }); var credentials = settingsEl && Object.keys(settingsEl.account_info).length ? { topic: settingsEl.product_topic, - info: JSON.stringify(settingsEl.account_info, null, 2) + info: JSON.stringify(settingsEl.account_info, null, 2), + hub_cd: settingsEl.hub.hub_cd } : null; return { hub: hub, @@ -2303,9 +2318,11 @@ var simplestJSONLength = 9; if (item.credentials) { this.productTopic = item.credentials.topic; this.accountInfo = item.credentials.info; + this.hubCd = item.credentials.hub_cd; } else { this.productTopic = ''; this.accountInfo = ''; + this.hubCd = ''; } this.isEditDialogOpen = true; }, @@ -2314,6 +2331,7 @@ var simplestJSONLength = 9; this.dialogError = ''; this.accountInfo = ''; this.productTopic = ''; + this.hubCd = ''; }, openDeleteDialog: function openDeleteDialog(item) { this.isDeleteDialogOpen = true; @@ -2336,7 +2354,8 @@ var simplestJSONLength = 9; _context.next = 5; return updateSettings(_this.currentItem.hub.id, { account_info: JSON.parse(_this.accountInfo), - product_topic: _this.productTopic + product_topic: _this.productTopic, + hub_cd: _this.hubCd }); case 5: _yield$updateSettings = _context.sent; @@ -2539,7 +2558,7 @@ var simplestJSONLength = 9; -const PubCard_exports_ = /*#__PURE__*/(0,exportHelper/* default */.Z)(PubCardvue_type_script_lang_js, [['render',PubCardvue_type_template_id_c352baea_scoped_true_render],['__scopeId',"data-v-c352baea"]]) +const PubCard_exports_ = /*#__PURE__*/(0,exportHelper/* default */.Z)(PubCardvue_type_script_lang_js, [['render',PubCardvue_type_template_id_3d5f2951_scoped_true_render],['__scopeId',"data-v-3d5f2951"]]) /* harmony default export */ const PubCard = (PubCard_exports_); ;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-1.use!./node_modules/vue-loader/dist/index.js??ruleSet[1].rules[8].use[0]!./ui/src/components/App.vue?vue&type=script&lang=js @@ -2774,7 +2793,7 @@ All rights reserved. /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module depends on other loaded chunks and execution need to be delayed -/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [216], () => (__webpack_require__(49))) +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [216], () => (__webpack_require__(2342))) /******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); /******/ /******/ })() diff --git a/connect_ext_datalake/static/settings.76b9b3b73b6d809fc5e7.css b/connect_ext_datalake/static/settings.9ac680fbcf453b441321.css similarity index 92% rename from connect_ext_datalake/static/settings.76b9b3b73b6d809fc5e7.css rename to connect_ext_datalake/static/settings.9ac680fbcf453b441321.css index 1683a96..fc5aed2 100644 --- a/connect_ext_datalake/static/settings.76b9b3b73b6d809fc5e7.css +++ b/connect_ext_datalake/static/settings.9ac680fbcf453b441321.css @@ -1 +1 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(62ced72e5832f02c2796.woff2) format("woff2"),url(268f264f58eba5c07c88.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(cad7d3d9cb265e334e58.woff2) format("woff2"),url(965aebef74db72eaf236.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(6fb9cffb1d3e72bf9293.woff2) format("woff2"),url(eaa367bbd0b333a7f80b.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(9ac81fefbe6c319ea40b.woff2) format("woff2"),url(1a05a4887ccb810cb4dd.woff) format("woff");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(d8642a3d1d4ef6179644.woff2) format("woff2"),url(657896dad292ee9a0a0a.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(9165081d10e1ba601384.woff2) format("woff2"),url(252057e589a0379208ed.woff) format("woff");unicode-range:u+0100-02af,u+0304,u+0308,u+0329,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(f25d774ecfe0996f8eb5.woff2) format("woff2"),url(1f075502d0094a398e21.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(804378952da8a10faae2.woff2) format("woff2"),url(af4d91666ea345601bea.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(71a33b6b50457b2c903a.woff2) format("woff2"),url(c1d66054fe23e181d92c.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(169619821ea93019d1bb.woff2) format("woff2"),url(f708607d2a7290fb8bfa.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(c35e4c3958e209d17b31.woff2) format("woff2"),url(dfdff8fa12eac629d29f.woff) format("woff");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(3230f9b040f3c630e0c3.woff2) format("woff2"),url(e0e8ba725ebd107367a8.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(861b791f9de857a6e7bc.woff2) format("woff2"),url(e757c42df6aaa3e11b62.woff) format("woff");unicode-range:u+0100-02af,u+0304,u+0308,u+0329,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(b009a76ad6afe4ebd301.woff2) format("woff2"),url(3f2b9a42f643e62a49b7.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(4777461b144e55145268.woff2) format("woff2"),url(3503ec5cc6330e21f695.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(1431d1cef06ad04f5458.woff2) format("woff2"),url(5b5f2f31962967dfc22c.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(35b9d6be04b95f0f0530.woff2) format("woff2"),url(392a45a84c081c4b412d.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(db2632771401f61463fe.woff2) format("woff2"),url(8ecd7085cfe9bc2c22ac.woff) format("woff");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(32fc45a3d1e8ea11fabc.woff2) format("woff2"),url(8472d69545c7409091b4.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(dc7dcec8e3f654e0ed63.woff2) format("woff2"),url(182712ab85f1472cdb2f.woff) format("woff");unicode-range:u+0100-02af,u+0304,u+0308,u+0329,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(c48fb6765a9fcb00b330.woff2) format("woff2"),url(0515ab82dae6923cab85.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(13c026e0294440303c69.woff2) format("woff2"),url(9a2551a4a9738eee8a2b.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(a0d40ee5847af8bed2df.woff2) format("woff2"),url(ed9ab99f30b1817e29dd.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(95e7a382e12921ef32ee.woff2) format("woff2"),url(53a8c06d66188773d92a.woff) format("woff");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(a9575edb558363648d81.woff2) format("woff2"),url(e1fae9411d94530c3582.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(22aea4e27b4b7405853a.woff2) format("woff2"),url(ecd99f6c56de9a3be407.woff) format("woff");unicode-range:u+0100-02af,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(d3026ee29728abffa752.woff2) format("woff2"),url(b889d0d8188d05910d31.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}:root{--primary:var(--theme_primary);--primary-rgb:var(--theme_primary_rgb);--accent:var(--theme_accent);--accent-rgb:var(--theme_accent_rgb);--contrast:var(--theme_contrast);--contrast-rgb:var(--theme_contrast_rgb);--contrast-accent:var(--theme_contrast);--module:4px;--edge-gap:calc(var(--module)*6);--theme-content-min-width:1200px;--tab-border-width:3px;--conversation-width:340px;--toolbar-height:64;--general-font-size:14px;--general-line-height:20px;--theme-font-family:Roboto,"Helvetica Neue",sans-serif;--monospace-font-family:"Roboto Mono",Courier,Consolas,"SF Mono",monospace;--theme-font-size:16;--theme-font-size-h1:24;--theme-line-height-h1:28;--theme-font-size-h2:20;--theme-line-height-h2:24;--theme-font-size-smaller:14;--theme-font-size-small:12;--theme-space-1:64;--theme-space-2:24;--theme-space-3:16;--theme-space-4:8;--base-text-color:#212121;--assistive-text-color:#707070;--theme-grey-1:#666;--theme-light-1:#e0e0e0;--theme-black:rgba(0,0,0,.97);--theme-black-2:rgba(0,0,0,.67);--theme-black-3:rgba(0,0,0,.57);--theme-black-4:rgba(0,0,0,.37);--theme-black-5:rgba(0,0,0,.5);--theme-hover-accent:rgba(0,0,0,.04);--theme-white:hsla(0,0%,100%,.97);--theme-white-2:hsla(0,0%,100%,.67);--theme-white-3:hsla(0,0%,100%,.57);--theme-white-4:hsla(0,0%,100%,.85);--theme-primary-color:#2196f3;--theme-icon-common-color:rgba(0,0,0,.87);--theme-border-color:rgba(0,0,0,.12);--theme-controls-background:rgba(0,0,0,.01);--theme-empty-state-text-color:rgba(0,0,0,.37);--white:#fff;--white-smoke:#f5f5f5;--layout-padding:16px;--layout-xs:600px;--layout-sm:960px;--layout-md:1280px;--layout-lg:1920px;--font-weight-light:300;--font-weight-normal:400;--font-weight-bold:500;--sidebar-width-small:232px;--sidebar-width-medium:320px;--red:#f44336;--pink:#d21a44;--nice-red:#ff6a6a;--green:#0bb071;--light-green:#00c853;--olive:#8bc34a;--dark-grey:#424242;--mid-grey:#bdbdbd;--light-grey:#e0e0e0;--orange:#f5871f;--orange-dimmed:#f2994a;--orange-tenn:#d65900;--success:var(--light-green);--failed:var(--pink);--warning:var(--red);--dark-blue:#1565c0;--light-blue:#2c98f0;--nice-yellow:#f2c94c}*{background-repeat:no-repeat;margin:0;padding:0}*,:after,:before{box-sizing:inherit}body{font-family:var(--theme-font-family,"Roboto")}.hidden{display:none!important}.loader{animation:rotation 1s linear infinite;border:5px solid;border-color:#fff #fff #1565c0;border-radius:50%;box-sizing:border-box;display:block;height:48px;margin:96px auto 0;width:48px}@keyframes rotation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}h1{font-size:20px;font-weight:500}.group-set{display:flex;flex-flow:column nowrap;justify-content:flex-start}.group-set+.group-set{margin-top:24px}.monospace-text{font-family:var(--monospace-font-family,"Roboto Mono");font-size:13px;font-weight:400;line-height:20px;margin:0}.label-text,.monospace-text{color:var(--base-text-color,#212121);font-style:normal}.label-text{display:block;font-family:var(--theme-font-family,"Roboto");font-size:14px;font-weight:500;line-height:16px;margin:0 0 8px}.switch{color:rgba(var(--pure-material-onsurface-rgb,0,0,0),.87);display:inline-block;font-family:var(--pure-material-font,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);font-size:16px;line-height:1.5;position:relative;z-index:0}.switch>input{appearance:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(var(--pure-material-onsurface-rgb,0,0,0),.38);border-radius:50%;display:block;height:40px;margin:0;opacity:0;outline:none;pointer-events:none;position:absolute;right:6px;top:-8px;transform:scale(1);transition:opacity .3s .1s,transform .2s .1s;width:40px;z-index:-1}.switch>span{cursor:pointer;display:inline-block;width:100%}.switch>span:before{background-color:rgba(var(--pure-material-onsurface-rgb,0,0,0),.38);border-radius:7px;content:"";display:inline-block;float:right;height:14px;margin:5px 0 5px 10px;transition:background-color .2s,opacity .2s;vertical-align:top;width:36px}.switch>span:after{background-color:rgb(var(--pure-material-onprimary-rgb,255,255,255));border-radius:50%;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);content:"";height:20px;position:absolute;right:16px;top:2px;transition:background-color .2s,transform .2s;width:20px}.switch>input:checked{background-color:rgb(var(--pure-material-primary-rgb,33,150,243));right:-10px}.switch>input:checked+span:before{background-color:rgba(var(--pure-material-primary-rgb,33,150,243),.6)}.switch>input:checked+span:after{background-color:rgb(var(--pure-material-primary-rgb,33,150,243));transform:translateX(16px)}.switch:hover>input{opacity:.04}.switch>input:focus{opacity:.12}.switch:hover>input:focus{opacity:.16}.switch>input:active{opacity:1;transform:scale(0);transition:transform 0s,opacity 0s}.switch>input:active+span:before{background-color:rgba(var(--pure-material-primary-rgb,33,150,243),.6)}.switch>input:checked:active+span:before{background-color:rgba(var(--pure-material-onsurface-rgb,0,0,0),.38)}.switch>input:disabled{opacity:0}.switch>input:disabled+span{color:rgb(var(--pure-material-onsurface-rgb,0,0,0));cursor:default;opacity:.38}.switch>input:disabled+span:before{background-color:rgba(var(--pure-material-onsurface-rgb,0,0,0),.38)}.switch>input:checked:disabled+span:before{background-color:rgba(var(--pure-material-primary-rgb,33,150,243),.6)}.button-container{align-items:flex-end;display:flex;flex-direction:row-reverse;margin-right:15px}.button{background-color:transparent;border:none;border-radius:4px;box-sizing:border-box;color:rgb(var(--pure-material-primary-rgb,33,150,243));cursor:pointer;display:inline-block;font-family:var(--pure-material-font,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);font-size:14px;font-weight:500;height:36px;line-height:36px;min-width:64px;outline:none;overflow:hidden;padding:0 8px;position:relative;text-align:center;text-overflow:ellipsis;text-transform:uppercase;vertical-align:middle}.button::-moz-focus-inner{border:none}.button:before{bottom:0;left:0;right:0;top:0;transition:opacity .2s}.button:after,.button:before{background-color:currentColor;content:"";opacity:0;position:absolute}.button:after{border-radius:50%;height:32px;left:50%;padding:50%;top:50%;transform:translate(-50%,-50%) scale(1);transition:opacity 1s,transform .5s;width:32px}.button:hover:before{opacity:.04}.button:focus:before{opacity:.12}.button:hover:focus:before{opacity:.16}.button:active:after{opacity:.16;transform:translate(-50%,-50%) scale(0);transition:transform 0s}.button:disabled{background-color:transparent;color:rgba(var(--pure-material-onsurface-rgb,0,0,0),.38);cursor:auto}.button:disabled:after,.button:disabled:before{opacity:0}.list-wrapper{margin:30px auto}.list{background-color:#fff;border-radius:2px;margin:0;padding:15px}.list .list-item{display:flex;padding:10px 5px}.list .list-item .switch{align-items:center;display:flex}.list .list-item:not(:last-child){border-bottom:1px solid #eee}.list .image{flex-shrink:0;height:80px}.list .list-item-image img{height:70px;width:70px}.list .list-item-content{padding:0 20px;width:90%}.list .list-item-content h4{font-size:18px;margin:15px 0 0}.list .list-item-content p{color:#aaa;margin-bottom:0;margin-top:5px}.main-container{align-items:center;display:flex;flex-direction:row;justify-content:space-evenly}.group{margin:45px 0;position:relative}input[type=email],input[type=number],input[type=password],input[type=tel],input[type=text]{background:none;border:none;border-bottom:1px solid #757575;border-radius:0;display:block;font-size:18px;padding:10px 10px 10px 5px;width:610px}input[type=email]:focus,input[type=number]:focus,input[type=password]:focus,input[type=tel]:focus,input[type=text]:focus{border-color:rgb(var(--pure-material-primary-rgb,33,150,243));outline:none}input[type=email]:focus~label,input[type=number]:focus~label,input[type=password]:focus~label,input[type=tel]:focus~label,input[type=text]:focus~label{color:rgb(var(--pure-material-primary-rgb,33,150,243));font-size:12px;top:-14px}input[type=password]{letter-spacing:.3em}.bar{display:block;position:relative}.ez-card{border:1px solid #e0e0e0;border-radius:8px;color:inherit;display:block;margin:0 auto;max-width:680px;overflow:hidden;padding:24px;text-decoration:inherit}.ez-card--error{color:var(--nice-red)}.ez-card+.ez-card{margin-top:24px}.ez-card__header{align-items:center;display:flex;flex-flow:row nowrap;justify-content:flex-start;margin-bottom:22px}.ez-card__header:last-child{margin-bottom:0}.ez-card__title{flex-grow:1;font-family:var(--theme-font-family,"Roboto");font-size:18px;font-style:normal;font-weight:500;line-height:24px;margin:0}.ez-card__controls{display:flex;flex-flow:row nowrap;gap:4px}.ez-card__subtitle{color:#707070;font-size:14px;line-height:20px;margin:0}.ez-card__alert{margin-bottom:24px}.btn{align-items:center;background-color:#fff;border:1px solid #fff;border-radius:2px;color:var(--base-text-color);cursor:pointer;display:flex;font-family:var(--theme-font-family,"Roboto");font-size:12px;font-style:normal;font-weight:500;gap:10px;height:28px;justify-content:center;letter-spacing:.48px;line-height:20px;padding:4px 10px;text-transform:uppercase}.btn_outlined{border:1px solid var(--light-grey,#e0e0e0)}.btn_accent{color:var(--accent,#2c98f0)}.btn_large{align-items:center;display:flex;gap:10px;height:36px;justify-content:center;padding:0 16px}.btn:disabled,.btn[disabled]{color:var(--mid-grey,#bdbdbd);cursor:default}.btn_default{align-items:center;background-color:var(--light-blue,#2c98f0);border-color:var(--light-blue,#2c98f0);border-radius:2px;color:#fff;display:flex;gap:4px;height:28px;justify-content:center;padding:0 10px 0 8px}.btn_default:disabled,.btn_default[disabled]{background-color:hsla(0,0%,74%,.2);border-color:hsla(0,0%,74%,.2);color:var(--mid-grey,#bdbdbd)}.ez-dialog{align-items:center;background-color:#fff;display:flex;height:100%;justify-content:center;left:0;opacity:0;pointer-events:none;position:absolute;top:0;transition:opacity .3s ease-in;width:100%;z-index:9999}.ez-dialog_open{opacity:1;pointer-events:auto}.ez-dialog__inner{background-color:#fff;border:1px solid var(--light-grey,#e0e0e0);border-radius:4px;box-shadow:0 4px 32px 0 rgba(0,0,0,.25);left:50%;max-height:654px;opacity:0;overflow-y:auto;padding:0;position:absolute;top:48px;transform:translateX(-50%);transition:opacity .3s ease-in;width:580px}.ez-dialog_open>.ez-dialog__inner{opacity:1}.ez-dialog__header{background-color:var(--white-smoke,#f5f5f5);color:var(--base-text-color,#212121);font-family:var(--theme-font-family);font-size:20px;font-style:normal;font-weight:500;line-height:24px;padding:24px 24px 20px;text-transform:capitalize}.ez-dialog__header:not(:last-child){border-bottom:1px solid var(--light-grey,#e0e0e0);padding-bottom:19px}.ez-dialog__content{max-height:540px;overflow:auto;padding:24px;position:relative}.ez-dialog__search{margin-bottom:12px}.ez-dialog__form{display:flex;flex-flow:column nowrap;margin:0;width:auto}.ez-dialog__footer{border-top:1px solid var(--light-grey,#e0e0e0);display:flex;flex-flow:row nowrap;gap:16px;justify-content:flex-end;padding:7px 16px 8px}.ez-dialog__controls{position:absolute;right:0;top:-6px}.ez-text-field{align-items:center;align-self:stretch;background:#fbfbfb;border:1px solid #d8d8d8;border-radius:2px;color:var(--assistive-text-color,#707070);display:flex;font-family:var(--theme-font-family);font-size:14px;font-style:normal;font-weight:400;height:44px;line-height:20px;outline:none;padding:4px 12px}.ez-text-field__icon{margin-right:12px}.ez-text-field__input{align-self:stretch;background:#fbfbfb;border-width:0;color:var(--assistive-text-color,#707070);font-family:var(--theme-font-family);font-size:14px;font-style:normal;font-weight:400;line-height:20px;outline:none;width:100%}.ez-text-field__input:active,.ez-text-field__input:focus,.ez-text-field__input:hover{outline:none}.c-icon{fill:currentColor;caret-color:currentColor;color:#757575;height:24px;vertical-align:text-bottom;width:24px}.c-icon_disabled{color:#c5c5c5!important;pointer-events:none}.c-icon_link{cursor:pointer;outline:none}button .c-icon{color:inherit}.c-alert{align-items:center;background-color:hsla(0,0%,74%,.15);border-radius:8px;box-sizing:border-box;color:#bdbdbd;display:inline-flex;max-width:600px;min-height:64px;min-width:240px;padding:16px}.c-alert_align-top{align-items:flex-start}.c-alert_dense{min-height:56px;padding-bottom:12px;padding-top:12px}.c-alert_fluid{display:flex;max-width:none}.c-alert_grid{display:grid;grid-template-areas:"icon text" "x actions";grid-template-columns:32px auto;grid-template-rows:auto}.c-alert_error{background-color:hsla(0,100%,71%,.2);color:#ff6a6a}.c-alert_info{background-color:rgba(var(--theme_accent_rgb),.15);color:var(--theme_accent)}.c-alert_success{background-color:rgba(11,176,113,.15);color:#0bb071}.c-alert_warning{background-color:rgba(242,201,76,.15);color:#f2c94c}.c-alert__icon{display:flex;flex:0 0 auto;margin-right:12px}.c-alert__icon>.c-icon,.c-alert__icon>.v-icon{color:currentColor}.c-alert_align-top .c-alert__icon{margin-top:-2px}.c-alert_grid .c-alert__icon{grid-area:icon}.c-alert__text{color:#212121;flex:1 1 auto;font-family:var(--theme-font-family);font-size:14px;letter-spacing:0;line-height:20px;text-align:left}.c-alert__text:first-letter{text-transform:uppercase}.c-alert_grid .c-alert__text{grid-area:text}.c-alert__actions{flex:0 0 auto;margin-left:24px;margin-right:-4px}.c-alert__actions button{margin:-2px 0}.c-alert__actions button+.c-alert__actions button{margin-left:16px}.c-alert_dense .c-alert__actions{margin-right:-8px}.c-alert_dense .c-alert__actions button{margin-bottom:-4px;margin-top:-4px}.c-alert_grid .c-alert__actions{grid-area:actions;margin-left:0}.c-button{--button-color:33,33,33;--button-computed-color:var(--button-custom-color,var(--button-color));--button-border-color:#e0e0e0;--button-padding:8px;--button-height:36px;--button-min-width:80px;--button-label-size:14px;--button-label-margin:8px;--button-label-letter-spacing:.6px;--button-icon-margin:4px;align-items:center;background-color:transparent;border:none;border-radius:2px;box-sizing:border-box;color:rgb(var(--button-computed-color));cursor:pointer;display:inline-flex;height:var(--button-height);justify-content:center;min-width:var(--button-min-width);overflow:hidden;padding-left:var(--button-padding);padding-right:var(--button-padding);position:relative;vertical-align:bottom}.c-button_fluid{width:100%}.c-button__link{bottom:0;cursor:pointer;left:0;position:absolute;right:0;top:0}.c-button:hover,.c-button_active{background-color:rgba(var(--button-computed-color),.1)}.c-button_solid{background-color:rgb(var(--button-computed-color));color:rgb(var(--solid-content-color))}.c-button_solid.c-button_active,.c-button_solid:hover{background-image:linear-gradient(hsla(0,0%,100%,.4),hsla(0,0%,100%,.4)),linear-gradient(rgb(var(--button-computed-color)),rgb(var(--button-computed-color)))}.c-button_outlined{--button-padding:7px;background-color:#fff;border:1px solid var(--button-border-color)}.c-button__label{flex-grow:0;flex-shrink:1;font-size:var(--button-label-size);line-height:20px;margin-left:var(--button-label-margin);margin-right:var(--button-label-margin);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-button__label_uppercase{letter-spacing:var(--button-label-letter-spacing);text-transform:uppercase}.c-button__icon-left,.c-button__icon-right{display:flex;flex:0 0 auto}.c-button__icon-left .c-icon,.c-button__icon-right .c-icon{color:inherit}.c-button__icon-left{margin-left:var(--button-icon-margin)}.c-button__icon-right{margin-right:var(--button-icon-margin)}.c-button_small{--button-height:28px;--button-min-width:64px;--button-padding:6px;--button-label-size:12px;--button-label-margin:4px;--button-label-letter-spacing:.5px;--button-icon-margin:2px}.c-button_icon-only{--button-padding:0;--button-icon-margin:0;--button-min-width:var(--button-height);width:var(--button-height)}.c-button_txt-only .c-icon{position:absolute}.c-button_rounded{border-radius:50%}.c-button_disabled{color:#bdbdbd;cursor:default;pointer-events:none}.c-button_disabled.c-button_solid{background:#f2f2f2}.c-button_fluid{display:flex}.c-button__label_loading{visibility:hidden}.c-button__label a{color:inherit;text-decoration:none}.c-menu{--c-menu-trigger-color:transparent;--c-menu-offsetX:-80px;--c-menu-offsetY:0;--c-menu-left:0;--c-menu-top:0;display:inline-block;position:static;vertical-align:middle}.c-menu__trigger{cursor:pointer;position:relative}.c-menu__container{background:#fff;border-radius:4px;box-shadow:0 4px 10px 0 rgba(0,0,0,.25);contain:content;display:inline-block;left:var(--c-menu-left);overflow-x:hidden;overflow-y:auto;position:absolute;top:var(--c-menu-top);transform-origin:left top;white-space:nowrap;will-change:transform}.v-dialog .c-menu__container{z-index:201!important}.c-menu_position-center .c-menu__container{left:revert;top:revert;transform:translateX(-50%) translateY(0)}.c-menu_position-left .c-menu__container{left:revert;top:revert}.c-menu_position-right .c-menu__container{left:revert;top:revert;transform:translateX(var(--c-menu-offsetX)) translateY(var(--c-menu-offsetY))}.c-menu_at-top .c-menu__container{bottom:100%;top:auto}.c-menu_active .c-menu__trigger .c-button{background:var(--c-menu-trigger-color)}.c-menu_disabled{cursor:default}.c-menu_full-width{width:100%}.c-menu_attached.c-menu_at-top{position:relative}.products-list[data-v-5c01c1f5]{list-style:none;margin:0;padding:0}.products-list__item_all[data-v-5c01c1f5]{align-items:center;flex-shrink:0;height:48px;padding:4px 0}.products-list__item_header[data-v-5c01c1f5]{background:var(--white-smoke,#f5f5f5);border-bottom:1px solid var(--assistive-text-color,#070707)}.products-item[data-v-5c01c1f5]{align-items:center;border-bottom:1px solid var(--light-grey,#e0e0e0);display:flex;flex-flow:row nowrap;justify-content:flex-start;padding:6px 8px}.products-item[data-v-5c01c1f5]:last-of-type{border-width:0}.products-item__part[data-v-5c01c1f5]{align-items:center;display:flex;flex-flow:row nowrap;justify-content:flex-start;width:calc(50% - 22px)}.products-item__part[data-v-5c01c1f5]:nth-last-of-type(2){flex-grow:1}.products-item__part[data-v-5c01c1f5]:last-child{padding:15px 11px 15px 15px;width:44px}.products-item__heading[data-v-5c01c1f5]{color:var(--assistive-text-color,#707070);font-size:12px;font-style:normal;font-weight:500;letter-spacing:.48px;line-height:20px;text-transform:uppercase;width:calc(50% - 22px)}.products-item__logo[data-v-5c01c1f5]{border-radius:2px;border-width:0;box-sizing:border-box;display:block;height:32px;margin-right:8px;overflow:hidden;width:32px}.products-item__title[data-v-5c01c1f5]{color:var(--content-body-text,#212121);display:flex;flex-flow:column nowrap;flex-grow:1;font-size:14px;font-style:normal;font-weight:400;line-height:20px;text-overflow:ellipsis}.products-item__assistive-text[data-v-5c01c1f5]{color:var(--light-grey,#e0e0e0);font-size:12px;font-style:normal;font-weight:400;line-height:16px}.products-item__checkbox[data-v-5c01c1f5]{height:18px;width:18px}.menu-items[data-v-5c01c1f5]{display:flex;flex-direction:column}table[data-v-5be50262]{border-collapse:collapse;border-spacing:0;max-width:100%;table-layout:fixed;width:100%}thead[data-v-5be50262]{background-color:#f5f5f5;border-top:1px solid #e0e0e0}thead[data-v-5be50262],tr[data-v-5be50262]{border-bottom:1px solid #e0e0e0}tr[data-v-5be50262]:last-child{border-bottom:none}th[data-v-5be50262]{box-sizing:content-box;color:#707070;font-size:12px;font-weight:700;height:32px;letter-spacing:.5px;line-height:20px;min-height:32px;overflow:hidden;padding-left:12px;padding-right:12px;text-align:left;text-transform:uppercase}th[data-v-5be50262]:first-child{border-left:none;padding-left:24px}th[data-v-5be50262]:last-child{border-right:none;padding-right:24px}td[data-v-5be50262]{box-sizing:content-box;font-size:14px;height:48px;padding-left:12px;padding-right:12px}td[data-v-5be50262]:first-child{padding-left:24px}td[data-v-5be50262]:last-child{padding-right:24px}textarea[materialize][data-v-c352baea]{appearance:none;-webkit-appearance:none;-moz-appearance:none;background:var(--theme-controls-background);border:1px solid var(--theme-border-color);border-radius:2px;box-sizing:border-box;color:var(--base-text-color);font-family:var(--theme-font-family);font-size:var(--theme-font-size-smaller);font-style:normal;font-weight:400;line-height:1.2em;padding:12px;width:100%}textarea[materialize][data-v-c352baea]:focus-visible{border-color:var(--dark-grey);outline-width:0}textarea[materialize][data-v-c352baea]:disabled{border-style:dashed}.code[data-v-c352baea],textarea[materialize].code[data-v-c352baea]{background:var(--controls-field-bg,#fbfbfb);border:1px solid var(--controls-field-outline,#d8d8d8);border-radius:2px;color:var(--base-text-color);font-family:var(--monospace-font-family);font-size:13px;font-style:normal;font-weight:400;line-height:20px}textarea[materialize].code[data-v-c352baea]:not(:last-child){margin-bottom:24px}.account-info-area[data-v-c352baea]{min-height:240px}.topic-area[data-v-c352baea]{min-height:84px}.custom-file-input[data-v-c352baea]{color:var(--base-text-color,#212121)}.custom-file-input__label[data-v-c352baea]{align-items:center;box-sizing:border-box;color:inherit;cursor:default;display:flex;font-size:12px;font-style:normal;font-weight:500;gap:4px;height:28px;justify-content:center;letter-spacing:.48px;line-height:20px;padding:4px 10px 4px 8px;text-transform:uppercase;transition:opacity .1s ease-in}.custom-file-input__label[data-v-c352baea]:focus,.custom-file-input__label[data-v-c352baea]:hover{cursor:pointer;opacity:.6}.custom-file-input__label[data-v-c352baea]:active{opacity:.8}.custom-file-input__label-icon[data-v-c352baea]{color:inherit}.custom-file-input__input[data-v-c352baea]{display:none}.table-icons[data-v-c352baea]{align-items:center;display:flex;flex-direction:row}.table-item[data-v-c352baea]{display:flex;flex-direction:column}.table-item__title[data-v-c352baea]{color:#212121;font-size:14px;font-weight:400;line-height:20px;text-align:left}.table-item__assistive[data-v-c352baea]{color:#707070;font-size:12px;font-weight:400;line-height:16px;text-align:left}.table-item_empty[data-v-c352baea]{color:#707070;font-size:14px;line-height:20px;text-align:left}.hub-info[data-v-c352baea]{margin-bottom:24px}.account-json-wrapper[data-v-c352baea]{margin-bottom:24px;position:relative}.menu-items[data-v-c352baea]{display:flex;flex-direction:column}.menu-item[data-v-c352baea]{border-bottom:1px solid #e0e0e0}.menu-item[data-v-c352baea]:hover{background:#f5f5f5;cursor:pointer}.menu-item_disabled[data-v-c352baea]{color:#bdbdbd}.menu-item_disabled[data-v-c352baea]:hover{background:transparent;cursor:default}.menu-item_red .menu-item__btn[data-v-c352baea]{color:#ff6a6a}.menu-item[data-v-c352baea]:last-child{border-bottom:none}.menu-item__btn[data-v-c352baea]{align-items:center;background:transparent;border:none;border-radius:2px;cursor:pointer;display:flex;flex-direction:row;font-size:14px;font-weight:400;height:48px;justify-content:flex-start;line-height:20px;margin:0;padding:6px 12px}.menu-item__btn[disabled][data-v-c352baea]{color:#bdbdbd;cursor:default}.error-icon[data-v-c352baea]{padding:5px;visibility:hidden}.error-icon_visible[data-v-c352baea]{visibility:visible}.delete-dialog-text[data-v-c352baea]{color:#212121;font-size:14px;line-height:20px}textarea[data-v-c352baea]{resize:vertical}.app[data-v-36357ed7]{box-sizing:border-box;min-height:740px;padding-top:24px}.loader[data-v-36357ed7]{animation:rotation-36357ed7 1s linear infinite;border:5px solid;border-color:#fff #fff #1565c0;border-radius:50%;box-sizing:border-box;display:block;height:48px;margin:96px auto 0;width:48px}@keyframes rotation-36357ed7{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}} \ No newline at end of file +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(62ced72e5832f02c2796.woff2) format("woff2"),url(268f264f58eba5c07c88.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(cad7d3d9cb265e334e58.woff2) format("woff2"),url(965aebef74db72eaf236.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(6fb9cffb1d3e72bf9293.woff2) format("woff2"),url(eaa367bbd0b333a7f80b.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(9ac81fefbe6c319ea40b.woff2) format("woff2"),url(1a05a4887ccb810cb4dd.woff) format("woff");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(d8642a3d1d4ef6179644.woff2) format("woff2"),url(657896dad292ee9a0a0a.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(9165081d10e1ba601384.woff2) format("woff2"),url(252057e589a0379208ed.woff) format("woff");unicode-range:u+0100-02af,u+0304,u+0308,u+0329,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(f25d774ecfe0996f8eb5.woff2) format("woff2"),url(1f075502d0094a398e21.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(804378952da8a10faae2.woff2) format("woff2"),url(af4d91666ea345601bea.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(71a33b6b50457b2c903a.woff2) format("woff2"),url(c1d66054fe23e181d92c.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(169619821ea93019d1bb.woff2) format("woff2"),url(f708607d2a7290fb8bfa.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(c35e4c3958e209d17b31.woff2) format("woff2"),url(dfdff8fa12eac629d29f.woff) format("woff");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(3230f9b040f3c630e0c3.woff2) format("woff2"),url(e0e8ba725ebd107367a8.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(861b791f9de857a6e7bc.woff2) format("woff2"),url(e757c42df6aaa3e11b62.woff) format("woff");unicode-range:u+0100-02af,u+0304,u+0308,u+0329,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(b009a76ad6afe4ebd301.woff2) format("woff2"),url(3f2b9a42f643e62a49b7.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(4777461b144e55145268.woff2) format("woff2"),url(3503ec5cc6330e21f695.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(1431d1cef06ad04f5458.woff2) format("woff2"),url(5b5f2f31962967dfc22c.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(35b9d6be04b95f0f0530.woff2) format("woff2"),url(392a45a84c081c4b412d.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(db2632771401f61463fe.woff2) format("woff2"),url(8ecd7085cfe9bc2c22ac.woff) format("woff");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(32fc45a3d1e8ea11fabc.woff2) format("woff2"),url(8472d69545c7409091b4.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(dc7dcec8e3f654e0ed63.woff2) format("woff2"),url(182712ab85f1472cdb2f.woff) format("woff");unicode-range:u+0100-02af,u+0304,u+0308,u+0329,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(c48fb6765a9fcb00b330.woff2) format("woff2"),url(0515ab82dae6923cab85.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(13c026e0294440303c69.woff2) format("woff2"),url(9a2551a4a9738eee8a2b.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(a0d40ee5847af8bed2df.woff2) format("woff2"),url(ed9ab99f30b1817e29dd.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(95e7a382e12921ef32ee.woff2) format("woff2"),url(53a8c06d66188773d92a.woff) format("woff");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(a9575edb558363648d81.woff2) format("woff2"),url(e1fae9411d94530c3582.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(22aea4e27b4b7405853a.woff2) format("woff2"),url(ecd99f6c56de9a3be407.woff) format("woff");unicode-range:u+0100-02af,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(d3026ee29728abffa752.woff2) format("woff2"),url(b889d0d8188d05910d31.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}:root{--primary:var(--theme_primary);--primary-rgb:var(--theme_primary_rgb);--accent:var(--theme_accent);--accent-rgb:var(--theme_accent_rgb);--contrast:var(--theme_contrast);--contrast-rgb:var(--theme_contrast_rgb);--contrast-accent:var(--theme_contrast);--module:4px;--edge-gap:calc(var(--module)*6);--theme-content-min-width:1200px;--tab-border-width:3px;--conversation-width:340px;--toolbar-height:64;--general-font-size:14px;--general-line-height:20px;--theme-font-family:Roboto,"Helvetica Neue",sans-serif;--monospace-font-family:"Roboto Mono",Courier,Consolas,"SF Mono",monospace;--theme-font-size:16;--theme-font-size-h1:24;--theme-line-height-h1:28;--theme-font-size-h2:20;--theme-line-height-h2:24;--theme-font-size-smaller:14;--theme-font-size-small:12;--theme-space-1:64;--theme-space-2:24;--theme-space-3:16;--theme-space-4:8;--base-text-color:#212121;--assistive-text-color:#707070;--theme-grey-1:#666;--theme-light-1:#e0e0e0;--theme-black:rgba(0,0,0,.97);--theme-black-2:rgba(0,0,0,.67);--theme-black-3:rgba(0,0,0,.57);--theme-black-4:rgba(0,0,0,.37);--theme-black-5:rgba(0,0,0,.5);--theme-hover-accent:rgba(0,0,0,.04);--theme-white:hsla(0,0%,100%,.97);--theme-white-2:hsla(0,0%,100%,.67);--theme-white-3:hsla(0,0%,100%,.57);--theme-white-4:hsla(0,0%,100%,.85);--theme-primary-color:#2196f3;--theme-icon-common-color:rgba(0,0,0,.87);--theme-border-color:rgba(0,0,0,.12);--theme-controls-background:rgba(0,0,0,.01);--theme-empty-state-text-color:rgba(0,0,0,.37);--white:#fff;--white-smoke:#f5f5f5;--layout-padding:16px;--layout-xs:600px;--layout-sm:960px;--layout-md:1280px;--layout-lg:1920px;--font-weight-light:300;--font-weight-normal:400;--font-weight-bold:500;--sidebar-width-small:232px;--sidebar-width-medium:320px;--red:#f44336;--pink:#d21a44;--nice-red:#ff6a6a;--green:#0bb071;--light-green:#00c853;--olive:#8bc34a;--dark-grey:#424242;--mid-grey:#bdbdbd;--light-grey:#e0e0e0;--orange:#f5871f;--orange-dimmed:#f2994a;--orange-tenn:#d65900;--success:var(--light-green);--failed:var(--pink);--warning:var(--red);--dark-blue:#1565c0;--light-blue:#2c98f0;--nice-yellow:#f2c94c}*{background-repeat:no-repeat;margin:0;padding:0}*,:after,:before{box-sizing:inherit}body{font-family:var(--theme-font-family,"Roboto")}.hidden{display:none!important}.loader{animation:rotation 1s linear infinite;border:5px solid;border-color:#fff #fff #1565c0;border-radius:50%;box-sizing:border-box;display:block;height:48px;margin:96px auto 0;width:48px}@keyframes rotation{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}h1{font-size:20px;font-weight:500}.group-set{display:flex;flex-flow:column nowrap;justify-content:flex-start}.group-set+.group-set{margin-top:24px}.monospace-text{font-family:var(--monospace-font-family,"Roboto Mono");font-size:13px;font-weight:400;line-height:20px;margin:0}.label-text,.monospace-text{color:var(--base-text-color,#212121);font-style:normal}.label-text{display:block;font-family:var(--theme-font-family,"Roboto");font-size:14px;font-weight:500;line-height:16px;margin:0 0 8px}.switch{color:rgba(var(--pure-material-onsurface-rgb,0,0,0),.87);display:inline-block;font-family:var(--pure-material-font,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);font-size:16px;line-height:1.5;position:relative;z-index:0}.switch>input{appearance:none;-moz-appearance:none;-webkit-appearance:none;background-color:rgba(var(--pure-material-onsurface-rgb,0,0,0),.38);border-radius:50%;display:block;height:40px;margin:0;opacity:0;outline:none;pointer-events:none;position:absolute;right:6px;top:-8px;transform:scale(1);transition:opacity .3s .1s,transform .2s .1s;width:40px;z-index:-1}.switch>span{cursor:pointer;display:inline-block;width:100%}.switch>span:before{background-color:rgba(var(--pure-material-onsurface-rgb,0,0,0),.38);border-radius:7px;content:"";display:inline-block;float:right;height:14px;margin:5px 0 5px 10px;transition:background-color .2s,opacity .2s;vertical-align:top;width:36px}.switch>span:after{background-color:rgb(var(--pure-material-onprimary-rgb,255,255,255));border-radius:50%;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);content:"";height:20px;position:absolute;right:16px;top:2px;transition:background-color .2s,transform .2s;width:20px}.switch>input:checked{background-color:rgb(var(--pure-material-primary-rgb,33,150,243));right:-10px}.switch>input:checked+span:before{background-color:rgba(var(--pure-material-primary-rgb,33,150,243),.6)}.switch>input:checked+span:after{background-color:rgb(var(--pure-material-primary-rgb,33,150,243));transform:translateX(16px)}.switch:hover>input{opacity:.04}.switch>input:focus{opacity:.12}.switch:hover>input:focus{opacity:.16}.switch>input:active{opacity:1;transform:scale(0);transition:transform 0s,opacity 0s}.switch>input:active+span:before{background-color:rgba(var(--pure-material-primary-rgb,33,150,243),.6)}.switch>input:checked:active+span:before{background-color:rgba(var(--pure-material-onsurface-rgb,0,0,0),.38)}.switch>input:disabled{opacity:0}.switch>input:disabled+span{color:rgb(var(--pure-material-onsurface-rgb,0,0,0));cursor:default;opacity:.38}.switch>input:disabled+span:before{background-color:rgba(var(--pure-material-onsurface-rgb,0,0,0),.38)}.switch>input:checked:disabled+span:before{background-color:rgba(var(--pure-material-primary-rgb,33,150,243),.6)}.button-container{align-items:flex-end;display:flex;flex-direction:row-reverse;margin-right:15px}.button{background-color:transparent;border:none;border-radius:4px;box-sizing:border-box;color:rgb(var(--pure-material-primary-rgb,33,150,243));cursor:pointer;display:inline-block;font-family:var(--pure-material-font,"Roboto","Segoe UI",BlinkMacSystemFont,system-ui,-apple-system);font-size:14px;font-weight:500;height:36px;line-height:36px;min-width:64px;outline:none;overflow:hidden;padding:0 8px;position:relative;text-align:center;text-overflow:ellipsis;text-transform:uppercase;vertical-align:middle}.button::-moz-focus-inner{border:none}.button:before{bottom:0;left:0;right:0;top:0;transition:opacity .2s}.button:after,.button:before{background-color:currentColor;content:"";opacity:0;position:absolute}.button:after{border-radius:50%;height:32px;left:50%;padding:50%;top:50%;transform:translate(-50%,-50%) scale(1);transition:opacity 1s,transform .5s;width:32px}.button:hover:before{opacity:.04}.button:focus:before{opacity:.12}.button:hover:focus:before{opacity:.16}.button:active:after{opacity:.16;transform:translate(-50%,-50%) scale(0);transition:transform 0s}.button:disabled{background-color:transparent;color:rgba(var(--pure-material-onsurface-rgb,0,0,0),.38);cursor:auto}.button:disabled:after,.button:disabled:before{opacity:0}.list-wrapper{margin:30px auto}.list{background-color:#fff;border-radius:2px;margin:0;padding:15px}.list .list-item{display:flex;padding:10px 5px}.list .list-item .switch{align-items:center;display:flex}.list .list-item:not(:last-child){border-bottom:1px solid #eee}.list .image{flex-shrink:0;height:80px}.list .list-item-image img{height:70px;width:70px}.list .list-item-content{padding:0 20px;width:90%}.list .list-item-content h4{font-size:18px;margin:15px 0 0}.list .list-item-content p{color:#aaa;margin-bottom:0;margin-top:5px}.main-container{align-items:center;display:flex;flex-direction:row;justify-content:space-evenly}.group{margin:45px 0;position:relative}input[type=email],input[type=number],input[type=password],input[type=tel],input[type=text]{background:none;border:none;border-bottom:1px solid #757575;border-radius:0;display:block;font-size:18px;padding:10px 10px 10px 5px;width:610px}input[type=email]:focus,input[type=number]:focus,input[type=password]:focus,input[type=tel]:focus,input[type=text]:focus{border-color:rgb(var(--pure-material-primary-rgb,33,150,243));outline:none}input[type=email]:focus~label,input[type=number]:focus~label,input[type=password]:focus~label,input[type=tel]:focus~label,input[type=text]:focus~label{color:rgb(var(--pure-material-primary-rgb,33,150,243));font-size:12px;top:-14px}input[type=password]{letter-spacing:.3em}.bar{display:block;position:relative}.ez-card{border:1px solid #e0e0e0;border-radius:8px;color:inherit;display:block;margin:0 auto;max-width:680px;overflow:hidden;padding:24px;text-decoration:inherit}.ez-card--error{color:var(--nice-red)}.ez-card+.ez-card{margin-top:24px}.ez-card__header{align-items:center;display:flex;flex-flow:row nowrap;justify-content:flex-start;margin-bottom:22px}.ez-card__header:last-child{margin-bottom:0}.ez-card__title{flex-grow:1;font-family:var(--theme-font-family,"Roboto");font-size:18px;font-style:normal;font-weight:500;line-height:24px;margin:0}.ez-card__controls{display:flex;flex-flow:row nowrap;gap:4px}.ez-card__subtitle{color:#707070;font-size:14px;line-height:20px;margin:0}.ez-card__alert{margin-bottom:24px}.btn{align-items:center;background-color:#fff;border:1px solid #fff;border-radius:2px;color:var(--base-text-color);cursor:pointer;display:flex;font-family:var(--theme-font-family,"Roboto");font-size:12px;font-style:normal;font-weight:500;gap:10px;height:28px;justify-content:center;letter-spacing:.48px;line-height:20px;padding:4px 10px;text-transform:uppercase}.btn_outlined{border:1px solid var(--light-grey,#e0e0e0)}.btn_accent{color:var(--accent,#2c98f0)}.btn_large{align-items:center;display:flex;gap:10px;height:36px;justify-content:center;padding:0 16px}.btn:disabled,.btn[disabled]{color:var(--mid-grey,#bdbdbd);cursor:default}.btn_default{align-items:center;background-color:var(--light-blue,#2c98f0);border-color:var(--light-blue,#2c98f0);border-radius:2px;color:#fff;display:flex;gap:4px;height:28px;justify-content:center;padding:0 10px 0 8px}.btn_default:disabled,.btn_default[disabled]{background-color:hsla(0,0%,74%,.2);border-color:hsla(0,0%,74%,.2);color:var(--mid-grey,#bdbdbd)}.ez-dialog{align-items:center;background-color:#fff;display:flex;height:100%;justify-content:center;left:0;opacity:0;pointer-events:none;position:absolute;top:0;transition:opacity .3s ease-in;width:100%;z-index:9999}.ez-dialog_open{opacity:1;pointer-events:auto}.ez-dialog__inner{background-color:#fff;border:1px solid var(--light-grey,#e0e0e0);border-radius:4px;box-shadow:0 4px 32px 0 rgba(0,0,0,.25);left:50%;max-height:654px;opacity:0;overflow-y:auto;padding:0;position:absolute;top:48px;transform:translateX(-50%);transition:opacity .3s ease-in;width:580px}.ez-dialog_open>.ez-dialog__inner{opacity:1}.ez-dialog__header{background-color:var(--white-smoke,#f5f5f5);color:var(--base-text-color,#212121);font-family:var(--theme-font-family);font-size:20px;font-style:normal;font-weight:500;line-height:24px;padding:24px 24px 20px;text-transform:capitalize}.ez-dialog__header:not(:last-child){border-bottom:1px solid var(--light-grey,#e0e0e0);padding-bottom:19px}.ez-dialog__content{max-height:540px;overflow:auto;padding:24px;position:relative}.ez-dialog__search{margin-bottom:12px}.ez-dialog__form{display:flex;flex-flow:column nowrap;margin:0;width:auto}.ez-dialog__footer{border-top:1px solid var(--light-grey,#e0e0e0);display:flex;flex-flow:row nowrap;gap:16px;justify-content:flex-end;padding:7px 16px 8px}.ez-dialog__controls{position:absolute;right:0;top:-6px}.ez-text-field{align-items:center;align-self:stretch;background:#fbfbfb;border:1px solid #d8d8d8;border-radius:2px;color:var(--assistive-text-color,#707070);display:flex;font-family:var(--theme-font-family);font-size:14px;font-style:normal;font-weight:400;height:44px;line-height:20px;outline:none;padding:4px 12px}.ez-text-field__icon{margin-right:12px}.ez-text-field__input{align-self:stretch;background:#fbfbfb;border-width:0;color:var(--assistive-text-color,#707070);font-family:var(--theme-font-family);font-size:14px;font-style:normal;font-weight:400;line-height:20px;outline:none;width:100%}.ez-text-field__input:active,.ez-text-field__input:focus,.ez-text-field__input:hover{outline:none}.c-icon{fill:currentColor;caret-color:currentColor;color:#757575;height:24px;vertical-align:text-bottom;width:24px}.c-icon_disabled{color:#c5c5c5!important;pointer-events:none}.c-icon_link{cursor:pointer;outline:none}button .c-icon{color:inherit}.c-alert{align-items:center;background-color:hsla(0,0%,74%,.15);border-radius:8px;box-sizing:border-box;color:#bdbdbd;display:inline-flex;max-width:600px;min-height:64px;min-width:240px;padding:16px}.c-alert_align-top{align-items:flex-start}.c-alert_dense{min-height:56px;padding-bottom:12px;padding-top:12px}.c-alert_fluid{display:flex;max-width:none}.c-alert_grid{display:grid;grid-template-areas:"icon text" "x actions";grid-template-columns:32px auto;grid-template-rows:auto}.c-alert_error{background-color:hsla(0,100%,71%,.2);color:#ff6a6a}.c-alert_info{background-color:rgba(var(--theme_accent_rgb),.15);color:var(--theme_accent)}.c-alert_success{background-color:rgba(11,176,113,.15);color:#0bb071}.c-alert_warning{background-color:rgba(242,201,76,.15);color:#f2c94c}.c-alert__icon{display:flex;flex:0 0 auto;margin-right:12px}.c-alert__icon>.c-icon,.c-alert__icon>.v-icon{color:currentColor}.c-alert_align-top .c-alert__icon{margin-top:-2px}.c-alert_grid .c-alert__icon{grid-area:icon}.c-alert__text{color:#212121;flex:1 1 auto;font-family:var(--theme-font-family);font-size:14px;letter-spacing:0;line-height:20px;text-align:left}.c-alert__text:first-letter{text-transform:uppercase}.c-alert_grid .c-alert__text{grid-area:text}.c-alert__actions{flex:0 0 auto;margin-left:24px;margin-right:-4px}.c-alert__actions button{margin:-2px 0}.c-alert__actions button+.c-alert__actions button{margin-left:16px}.c-alert_dense .c-alert__actions{margin-right:-8px}.c-alert_dense .c-alert__actions button{margin-bottom:-4px;margin-top:-4px}.c-alert_grid .c-alert__actions{grid-area:actions;margin-left:0}.c-button{--button-color:33,33,33;--button-computed-color:var(--button-custom-color,var(--button-color));--button-border-color:#e0e0e0;--button-padding:8px;--button-height:36px;--button-min-width:80px;--button-label-size:14px;--button-label-margin:8px;--button-label-letter-spacing:.6px;--button-icon-margin:4px;align-items:center;background-color:transparent;border:none;border-radius:2px;box-sizing:border-box;color:rgb(var(--button-computed-color));cursor:pointer;display:inline-flex;height:var(--button-height);justify-content:center;min-width:var(--button-min-width);overflow:hidden;padding-left:var(--button-padding);padding-right:var(--button-padding);position:relative;vertical-align:bottom}.c-button_fluid{width:100%}.c-button__link{bottom:0;cursor:pointer;left:0;position:absolute;right:0;top:0}.c-button:hover,.c-button_active{background-color:rgba(var(--button-computed-color),.1)}.c-button_solid{background-color:rgb(var(--button-computed-color));color:rgb(var(--solid-content-color))}.c-button_solid.c-button_active,.c-button_solid:hover{background-image:linear-gradient(hsla(0,0%,100%,.4),hsla(0,0%,100%,.4)),linear-gradient(rgb(var(--button-computed-color)),rgb(var(--button-computed-color)))}.c-button_outlined{--button-padding:7px;background-color:#fff;border:1px solid var(--button-border-color)}.c-button__label{flex-grow:0;flex-shrink:1;font-size:var(--button-label-size);line-height:20px;margin-left:var(--button-label-margin);margin-right:var(--button-label-margin);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-button__label_uppercase{letter-spacing:var(--button-label-letter-spacing);text-transform:uppercase}.c-button__icon-left,.c-button__icon-right{display:flex;flex:0 0 auto}.c-button__icon-left .c-icon,.c-button__icon-right .c-icon{color:inherit}.c-button__icon-left{margin-left:var(--button-icon-margin)}.c-button__icon-right{margin-right:var(--button-icon-margin)}.c-button_small{--button-height:28px;--button-min-width:64px;--button-padding:6px;--button-label-size:12px;--button-label-margin:4px;--button-label-letter-spacing:.5px;--button-icon-margin:2px}.c-button_icon-only{--button-padding:0;--button-icon-margin:0;--button-min-width:var(--button-height);width:var(--button-height)}.c-button_txt-only .c-icon{position:absolute}.c-button_rounded{border-radius:50%}.c-button_disabled{color:#bdbdbd;cursor:default;pointer-events:none}.c-button_disabled.c-button_solid{background:#f2f2f2}.c-button_fluid{display:flex}.c-button__label_loading{visibility:hidden}.c-button__label a{color:inherit;text-decoration:none}.c-menu{--c-menu-trigger-color:transparent;--c-menu-offsetX:-80px;--c-menu-offsetY:0;--c-menu-left:0;--c-menu-top:0;display:inline-block;position:static;vertical-align:middle}.c-menu__trigger{cursor:pointer;position:relative}.c-menu__container{background:#fff;border-radius:4px;box-shadow:0 4px 10px 0 rgba(0,0,0,.25);contain:content;display:inline-block;left:var(--c-menu-left);overflow-x:hidden;overflow-y:auto;position:absolute;top:var(--c-menu-top);transform-origin:left top;white-space:nowrap;will-change:transform}.v-dialog .c-menu__container{z-index:201!important}.c-menu_position-center .c-menu__container{left:revert;top:revert;transform:translateX(-50%) translateY(0)}.c-menu_position-left .c-menu__container{left:revert;top:revert}.c-menu_position-right .c-menu__container{left:revert;top:revert;transform:translateX(var(--c-menu-offsetX)) translateY(var(--c-menu-offsetY))}.c-menu_at-top .c-menu__container{bottom:100%;top:auto}.c-menu_active .c-menu__trigger .c-button{background:var(--c-menu-trigger-color)}.c-menu_disabled{cursor:default}.c-menu_full-width{width:100%}.c-menu_attached.c-menu_at-top{position:relative}.products-list[data-v-5c01c1f5]{list-style:none;margin:0;padding:0}.products-list__item_all[data-v-5c01c1f5]{align-items:center;flex-shrink:0;height:48px;padding:4px 0}.products-list__item_header[data-v-5c01c1f5]{background:var(--white-smoke,#f5f5f5);border-bottom:1px solid var(--assistive-text-color,#070707)}.products-item[data-v-5c01c1f5]{align-items:center;border-bottom:1px solid var(--light-grey,#e0e0e0);display:flex;flex-flow:row nowrap;justify-content:flex-start;padding:6px 8px}.products-item[data-v-5c01c1f5]:last-of-type{border-width:0}.products-item__part[data-v-5c01c1f5]{align-items:center;display:flex;flex-flow:row nowrap;justify-content:flex-start;width:calc(50% - 22px)}.products-item__part[data-v-5c01c1f5]:nth-last-of-type(2){flex-grow:1}.products-item__part[data-v-5c01c1f5]:last-child{padding:15px 11px 15px 15px;width:44px}.products-item__heading[data-v-5c01c1f5]{color:var(--assistive-text-color,#707070);font-size:12px;font-style:normal;font-weight:500;letter-spacing:.48px;line-height:20px;text-transform:uppercase;width:calc(50% - 22px)}.products-item__logo[data-v-5c01c1f5]{border-radius:2px;border-width:0;box-sizing:border-box;display:block;height:32px;margin-right:8px;overflow:hidden;width:32px}.products-item__title[data-v-5c01c1f5]{color:var(--content-body-text,#212121);display:flex;flex-flow:column nowrap;flex-grow:1;font-size:14px;font-style:normal;font-weight:400;line-height:20px;text-overflow:ellipsis}.products-item__assistive-text[data-v-5c01c1f5]{color:var(--light-grey,#e0e0e0);font-size:12px;font-style:normal;font-weight:400;line-height:16px}.products-item__checkbox[data-v-5c01c1f5]{height:18px;width:18px}.menu-items[data-v-5c01c1f5]{display:flex;flex-direction:column}table[data-v-5be50262]{border-collapse:collapse;border-spacing:0;max-width:100%;table-layout:fixed;width:100%}thead[data-v-5be50262]{background-color:#f5f5f5;border-top:1px solid #e0e0e0}thead[data-v-5be50262],tr[data-v-5be50262]{border-bottom:1px solid #e0e0e0}tr[data-v-5be50262]:last-child{border-bottom:none}th[data-v-5be50262]{box-sizing:content-box;color:#707070;font-size:12px;font-weight:700;height:32px;letter-spacing:.5px;line-height:20px;min-height:32px;overflow:hidden;padding-left:12px;padding-right:12px;text-align:left;text-transform:uppercase}th[data-v-5be50262]:first-child{border-left:none;padding-left:24px}th[data-v-5be50262]:last-child{border-right:none;padding-right:24px}td[data-v-5be50262]{box-sizing:content-box;font-size:14px;height:48px;padding-left:12px;padding-right:12px}td[data-v-5be50262]:first-child{padding-left:24px}td[data-v-5be50262]:last-child{padding-right:24px}textarea[materialize][data-v-3d5f2951]{appearance:none;-webkit-appearance:none;-moz-appearance:none;background:var(--theme-controls-background);border:1px solid var(--theme-border-color);border-radius:2px;box-sizing:border-box;color:var(--base-text-color);font-family:var(--theme-font-family);font-size:var(--theme-font-size-smaller);font-style:normal;font-weight:400;line-height:1.2em;padding:12px;width:100%}textarea[materialize][data-v-3d5f2951]:focus-visible{border-color:var(--dark-grey);outline-width:0}textarea[materialize][data-v-3d5f2951]:disabled{border-style:dashed}.code[data-v-3d5f2951],textarea[materialize].code[data-v-3d5f2951]{background:var(--controls-field-bg,#fbfbfb);border:1px solid var(--controls-field-outline,#d8d8d8);border-radius:2px;color:var(--base-text-color);font-family:var(--monospace-font-family);font-size:13px;font-style:normal;font-weight:400;line-height:20px}textarea[materialize].code[data-v-3d5f2951]:not(:last-child){margin-bottom:24px}.account-info-area[data-v-3d5f2951]{min-height:240px}.topic-area[data-v-3d5f2951]{min-height:84px}.custom-file-input[data-v-3d5f2951]{color:var(--base-text-color,#212121)}.custom-file-input__label[data-v-3d5f2951]{align-items:center;box-sizing:border-box;color:inherit;cursor:default;display:flex;font-size:12px;font-style:normal;font-weight:500;gap:4px;height:28px;justify-content:center;letter-spacing:.48px;line-height:20px;padding:4px 10px 4px 8px;text-transform:uppercase;transition:opacity .1s ease-in}.custom-file-input__label[data-v-3d5f2951]:focus,.custom-file-input__label[data-v-3d5f2951]:hover{cursor:pointer;opacity:.6}.custom-file-input__label[data-v-3d5f2951]:active{opacity:.8}.custom-file-input__label-icon[data-v-3d5f2951]{color:inherit}.custom-file-input__input[data-v-3d5f2951]{display:none}.table-icons[data-v-3d5f2951]{align-items:center;display:flex;flex-direction:row}.table-item[data-v-3d5f2951]{display:flex;flex-direction:column}.table-item__title[data-v-3d5f2951]{color:#212121;font-size:14px;font-weight:400;line-height:20px;text-align:left}.table-item__assistive[data-v-3d5f2951]{color:#707070;font-size:12px;font-weight:400;line-height:16px;text-align:left}.table-item_empty[data-v-3d5f2951]{color:#707070;font-size:14px;line-height:20px;text-align:left}.hub-info[data-v-3d5f2951]{margin-bottom:24px}.account-json-wrapper[data-v-3d5f2951]{margin-bottom:24px;position:relative}.menu-items[data-v-3d5f2951]{display:flex;flex-direction:column}.menu-item[data-v-3d5f2951]{border-bottom:1px solid #e0e0e0}.menu-item[data-v-3d5f2951]:hover{background:#f5f5f5;cursor:pointer}.menu-item_disabled[data-v-3d5f2951]{color:#bdbdbd}.menu-item_disabled[data-v-3d5f2951]:hover{background:transparent;cursor:default}.menu-item_red .menu-item__btn[data-v-3d5f2951]{color:#ff6a6a}.menu-item[data-v-3d5f2951]:last-child{border-bottom:none}.menu-item__btn[data-v-3d5f2951]{align-items:center;background:transparent;border:none;border-radius:2px;cursor:pointer;display:flex;flex-direction:row;font-size:14px;font-weight:400;height:48px;justify-content:flex-start;line-height:20px;margin:0;padding:6px 12px}.menu-item__btn[disabled][data-v-3d5f2951]{color:#bdbdbd;cursor:default}.error-icon[data-v-3d5f2951]{padding:5px;visibility:hidden}.error-icon_visible[data-v-3d5f2951]{visibility:visible}.delete-dialog-text[data-v-3d5f2951]{color:#212121;font-size:14px;line-height:20px}textarea[data-v-3d5f2951]{resize:vertical}.app[data-v-36357ed7]{box-sizing:border-box;min-height:740px;padding-top:24px}.loader[data-v-36357ed7]{animation:rotation-36357ed7 1s linear infinite;border:5px solid;border-color:#fff #fff #1565c0;border-radius:50%;box-sizing:border-box;display:block;height:48px;margin:96px auto 0;width:48px}@keyframes rotation-36357ed7{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}} \ No newline at end of file diff --git a/connect_ext_datalake/static/settings.html b/connect_ext_datalake/static/settings.html index aeae493..c480f05 100644 --- a/connect_ext_datalake/static/settings.html +++ b/connect_ext_datalake/static/settings.html @@ -1 +1 @@ -Settings
\ No newline at end of file +Settings
\ No newline at end of file diff --git a/poetry.lock b/poetry.lock index aa298a8..804d5b4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "anvil-uplink" @@ -307,13 +307,13 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "connect-eaas-core" -version = "28.14" +version = "30.3" description = "Connect Eaas Core" optional = false python-versions = ">=3.8,<4" files = [ - {file = "connect_eaas_core-28.14-py3-none-any.whl", hash = "sha256:70fbe68d3fe0f96d8ccb52d02b3c09dd6cc77039da5a0f5ba7acdf2c7e53535b"}, - {file = "connect_eaas_core-28.14.tar.gz", hash = "sha256:664a3ca516820565b4bad59131089b01eba27199baca3ad98a1914c46b34428b"}, + {file = "connect_eaas_core-30.3-py3-none-any.whl", hash = "sha256:30bfc8c845f083b0a58606f96c540ec54c34541878c4bd443ff5633d940b1251"}, + {file = "connect_eaas_core-30.3.tar.gz", hash = "sha256:4268b6de578ef29299077997902e52444f7de177899eaf3f55e85a8d13e6b397"}, ] [package.dependencies] @@ -1792,4 +1792,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = ">=3.8,<4" -content-hash = "3dfb11112254d382f127f4e70c61ff1552919f7eb98df923c709317333f226db" +content-hash = "7071314ded6fbec0c4e010c601655c1ad713c294d43feaa71da1f5182ae2ad22" diff --git a/pyproject.toml b/pyproject.toml index b5278f2..b58bedc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ readme = "./README.md" [tool.poetry.dependencies] python = ">=3.8,<4" -connect-eaas-core = ">=28,<29" +connect-eaas-core = ">=30,<31" google-cloud-pubsub = "2.17.1" [tool.poetry.dev-dependencies] diff --git a/tests/api/test_settings.py b/tests/api/test_settings.py index bbf1dee..7fa931a 100644 --- a/tests/api/test_settings.py +++ b/tests/api/test_settings.py @@ -59,6 +59,7 @@ def test_save_settings_validation_success( setting = SettingInput( account_info={'account_id': 'acc008787827'}, product_topic='projects/acc008787827/topics/connect-products-topic ', + hub_cd='SG', ) client_mocker = client_mocker_factory() @@ -99,6 +100,7 @@ def test_save_settings_validation_failed( setting = SettingInput( account_info={'account_id': 'acc008787827'}, product_topic='projects/acc008787827/topics/connect-products-topic ', + hub_cd='SG', ) client = test_client_factory(DatalakeExtensionWebApplication) @@ -115,6 +117,31 @@ def test_save_settings_validation_failed( assert data == {'error': 'PermissionDenied : 403 Account details not valid.'} +@patch.object(GooglePubsubClient, '__init__', return_value=None) +def test_save_settings_no_hub_cd( + mock_client_init, + test_client_factory, + installation, +): + setting = SettingInput( + account_info={'account_id': 'acc008787827'}, + product_topic='projects/acc008787827/topics/connect-products-topic ', + ) + + client = test_client_factory(DatalakeExtensionWebApplication) + + response = client.post( + '/api/settings/HB-0000-0000', + json=setting.dict(), + context={'installation_id': 'EIN-000'}, + installation=installation, + ) + assert response.status_code == 400 + + data = response.json() + assert data == {'error': 'Exception : Hub_cd is not set for HB-0000-0000'} + + @patch.object( GooglePubsubClient, 'validate', diff --git a/tests/conftest.py b/tests/conftest.py index 631705b..f68dd98 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -223,6 +223,7 @@ def hub(): return { 'id': 'HB-0000-0000', 'name': 'CB Stage', + 'hub_cd': 'NA', } @@ -294,6 +295,16 @@ def tcr_list(): return json.load(open('./tests/fixtures/tcr_list.json')) +@pytest.fixture +def tcr_request(): + return json.load(open('./tests/fixtures/tcr_request.json')) + + +@pytest.fixture +def ff_request(): + return json.load(open('./tests/fixtures/fulfillment_request.json')) + + @pytest.fixture def listing(): return json.load(open('./tests/fixtures/listing.json')) diff --git a/tests/fixtures/fulfillment_request.json b/tests/fixtures/fulfillment_request.json new file mode 100644 index 0000000..a6ed0a4 --- /dev/null +++ b/tests/fixtures/fulfillment_request.json @@ -0,0 +1,330 @@ +{ + "id": "PR-4275-8254-5743-001", + "type": "purchase", + "note": "", + "asset": { + "id": "AS-4275-8254-5743", + "status": "processing", + "external_id": "X694VGSVSF", + "external_uid": "7490efa2-5295-4313-b3d8-0bf382326c79", + "product": { + "id": "PRD-000-064-002", + "name": "Product P02 for akomissarov", + "status": "published" + }, + "connection": { + "id": "CT-2230-3535", + "type": "production", + "status": "approved", + "provider": { + "id": "PA-064-101", + "name": "Provider account 01 for akomissarov" + }, + "vendor": { + "id": "VA-064-000", + "name": "Vendor account 00 for akomissarov" + }, + "hub": { + "id": "HB-0000-0000", + "name": "None" + }, + "created_at": "2024-07-31T08:47:47+00:00", + "product_version_type": "public" + }, + "events": { + "created": { + "at": "2024-08-13T10:33:46+00:00" + }, + "updated": { + "at": "2024-08-13T10:33:46+00:00" + } + }, + "items": [ + { + "id": "PRD_000_064_002_00001", + "global_id": "PRD-000-064-002-00001", + "mpn": "MPN-A", + "old_quantity": "0", + "quantity": "34", + "type": "Gb", + "display_name": "Prd 000 064 002 00001", + "period": "Monthly", + "item_type": "Reservation" + } + ], + "params": [ + { + "id": "param_a", + "name": "param_a", + "type": "text", + "phase": "fulfillment", + "description": "Description of the Parameter A", + "value": "", + "value_error": "", + "title": "Title of the Parameter A", + "constraints": { + "meta": {}, + "required": true, + "reconciliation": false, + "hidden": false, + "readonly": false + } + }, + { + "id": "param_b", + "name": "param_b", + "type": "text", + "phase": "fulfillment", + "description": "Description of the Parameter B", + "value": "", + "value_error": "", + "title": "Title of the Parameter B", + "constraints": { + "meta": {}, + "required": true, + "reconciliation": false, + "hidden": false, + "readonly": false + } + }, + { + "id": "ordering1", + "name": "ordering1", + "type": "text", + "phase": "ordering", + "description": "ordering1", + "value": "", + "value_error": "", + "title": "ordering1", + "constraints": { + "placeholder": "I am the placeholder text", + "hint": "I am the hint text", + "meta": {}, + "required": true, + "hidden": false, + "readonly": false + } + } + ], + "tiers": { + "customer": { + "id": "TA-4421-5638-4502", + "version": 1, + "name": "t1-ff-param-test-customer", + "type": "customer", + "db": "US", + "external_id": "82313", + "external_uid": "227e1066-b75b-4986-992a-76434a72ae7f", + "parent": { + "id": "TA-1532-3470-1230", + "name": "t1-ff-param-test-reseller", + "external_id": "92338" + }, + "owner": { + "id": "PA-064-101", + "name": "Provider account 01 for akomissarov" + }, + "scopes": [], + "hub": { + "id": "HB-0000-0000", + "name": "None" + }, + "tax_id": "9428VIZGWW", + "events": { + "created": { + "at": "2024-08-13T04:51:03+00:00", + "by": { + "id": "UR-064-000-003", + "name": "Alex" + } + }, + "updated": { + "at": "2024-08-13T04:51:03+00:00" + } + }, + "environment": "production", + "contact_info": { + "address_line1": "Reinger Green", + "address_line2": "Rogahn Lakes", + "city": "Amapa", + "state": "Amapa", + "postal_code": "68950-000", + "country": "BR", + "contact": { + "first_name": "t1-ff-param-test-customer", + "last_name": "Johnson", + "email": "akomissarov+Naomi_Johnson@connect.cloudblue.com", + "phone_number": { + "country_code": "+55", + "area_code": "11", + "phone_number": "23456789", + "extension": "" + } + } + } + }, + "tier1": { + "id": "TA-1532-3470-1230", + "version": 1, + "name": "t1-ff-param-test-reseller", + "type": "reseller", + "db": "AU", + "external_id": "92338", + "external_uid": "e7a32b31-18ce-451a-b8bf-5b44dcc7df88", + "parent": { + "id": "TA-4847-4932-2871", + "name": "Provider account 01 for akomissarov", + "external_id": "PA-064-101" + }, + "owner": { + "id": "PA-064-101", + "name": "Provider account 01 for akomissarov" + }, + "scopes": [], + "hub": { + "id": "HB-0000-0000", + "name": "None" + }, + "tax_id": "B13M484TX9", + "events": { + "created": { + "at": "2024-08-13T04:50:27+00:00", + "by": { + "id": "UR-064-000-003", + "name": "Alex" + } + }, + "updated": { + "at": "2024-08-13T04:50:27+00:00" + } + }, + "environment": "production", + "contact_info": { + "address_line1": "Roselyn Shore", + "address_line2": "Fanny Trace", + "city": "Balgowlah", + "state": "Balgowlah", + "postal_code": "2093", + "country": "AU", + "contact": { + "first_name": "t1-ff-param-test-reseller", + "last_name": "Hirthe", + "email": "akomissarov+Freda_Hirthe@connect.cloudblue.com", + "phone_number": { + "country_code": "+61", + "area_code": "2", + "phone_number": "12345678", + "extension": "" + } + } + } + }, + "tier2": { + "id": "TA-4847-4932-2871", + "version": 1, + "name": "Provider account 01 for akomissarov", + "type": "reseller", + "db": "US", + "external_id": "PA-064-101", + "external_uid": "PA-064-101", + "owner": { + "id": "PA-064-101", + "name": "Provider account 01 for akomissarov" + }, + "scopes": [], + "hub": { + "id": "HB-0000-0000", + "name": "None" + }, + "events": { + "created": { + "at": "2024-07-23T11:34:12+00:00" + }, + "updated": { + "at": "2024-07-23T11:34:12+00:00" + } + }, + "environment": "production", + "contact_info": { + "address_line1": "-", + "address_line2": "-", + "city": "-", + "state": "-", + "postal_code": "-", + "country": "US", + "contact": { + "first_name": "-", + "last_name": "-", + "email": "unspecified@example.com", + "phone_number": { + "country_code": "+1", + "area_code": "951", + "phone_number": "2623062", + "extension": "" + } + } + } + } + }, + "template": { + "id": "TL-463-599-011", + "name": "Additional information is required to process your request" + }, + "pending_request": { + "id": "PR-4275-8254-5743-001", + "type": "purchase", + "status": "inquiring", + "template": { + "id": "TL-463-599-011", + "name": "Additional information is required to process your request" + } + }, + "marketplace": { + "id": "MP-06412", + "name": "Marketplace M12 for akomissarov", + "icon": "/media/PA-064-101/marketplaces/MP-06412/icon.png" + }, + "contract": { + "id": "CRD-064-001-002", + "type": "distribution", + "name": "Contract of Distribution Agreement for the Marketplace M12 (akomissarov)" + }, + "configuration": { + "params": [] + } + }, + "reason": "", + "status": "inquiring", + "created": "2024-08-13T10:33:46+00:00", + "updated": "2024-08-13T10:33:46+00:00", + "answered": true, + "assignee": "", + "activation_key": "Please complete our **[Activation Form](https://customer.cnct.info/?request_id=PR-4275-8254-5743-001&code=RVY3WDbOrxzcwjnvtuHfNnxumMXNopsZnZSm)** to resume processing of your request", + "template": { + "id": "TL-463-599-011", + "name": "Additional information is required to process your request", + "message": "Please complete our **[Activation Form](https://customer.cnct.info/?request_id=PR-4275-8254-5743-001&code=RVY3WDbOrxzcwjnvtuHfNnxumMXNopsZnZSm)** to resume processing of your request" + }, + "params_form_url": "https://customer.cnct.info/?request_id=PR-4275-8254-5743-001&code=RVY3WDbOrxzcwjnvtuHfNnxumMXNopsZnZSm", + "marketplace": { + "id": "MP-06412", + "name": "Marketplace M12 for akomissarov", + "icon": "/media/PA-064-101/marketplaces/MP-06412/icon.png" + }, + "contract": { + "id": "CRD-064-001-002", + "type": "distribution", + "name": "Contract of Distribution Agreement for the Marketplace M12 (akomissarov)" + }, + "previous_approved_request": null, + "effective_date": null, + "planned_date": null, + "events": { + "created": { + "at": "2024-08-13T10:33:46+00:00" + }, + "updated": { + "at": "2024-08-13T10:33:46+00:00" + } + } +} \ No newline at end of file diff --git a/tests/fixtures/tcr_request.json b/tests/fixtures/tcr_request.json new file mode 100644 index 0000000..3186790 --- /dev/null +++ b/tests/fixtures/tcr_request.json @@ -0,0 +1,259 @@ +{ + "id": "TCR-355-484-775-001", + "type": "setup", + "status": "inquiring", + "configuration": { + "id": "TC-355-484-775", + "name": "Configuration of TA-1532-3470-1230", + "account": { + "id": "TA-1532-3470-1230", + "name": "t1-ff-param-test-reseller", + "type": "reseller", + "external_id": "92338", + "external_uid": "e7a32b31-18ce-451a-b8bf-5b44dcc7df88", + "tax_id": "B13M484TX9", + "contact_info": { + "address_line1": "Roselyn Shore", + "address_line2": "Fanny Trace", + "city": "Balgowlah", + "state": "Balgowlah", + "postal_code": "2093", + "country": "AU", + "contact": { + "first_name": "t1-ff-param-test-reseller", + "last_name": "Hirthe", + "email": "akomissarov+Freda_Hirthe@connect.cloudblue.com", + "phone_number": { + "country_code": "+61", + "area_code": "2", + "phone_number": "12345678", + "extension": "" + } + } + } + }, + "product": { + "id": "PRD-000-064-001", + "name": "Product P01 for akomissarov", + "status": "published" + }, + "tier_level": 1, + "connection": { + "id": "CT-2567-8364", + "type": "production", + "status": "approved", + "provider": { + "id": "PA-064-101", + "name": "Provider account 01 for akomissarov" + }, + "vendor": { + "id": "VA-064-000", + "name": "Vendor account 00 for akomissarov" + }, + "hub": { + "id": "HB-0000-0000", + "name": "None" + }, + "created_at": "2024-07-24T08:46:26+00:00", + "product_version_type": "public" + }, + "events": { + "created": { + "at": "2024-08-13T04:52:00+00:00", + "by": { + "id": "UR-064-000-003", + "name": "Alex" + } + }, + "updated": { + "at": "2024-08-13T04:52:00+00:00", + "by": { + "id": "UR-064-000-003", + "name": "Alex" + } + } + }, + "params": [ + { + "id": "FF_PARAM", + "title": "FF_PARAM", + "description": "FF_PARAM", + "type": "text", + "scope": "tier1", + "phase": "fulfillment", + "hint": "I am the hint text", + "placeholder": "I am the placeholder text", + "constraints": { + "required": true, + "hidden": false, + "unique": false, + "readonly": false + } + }, + { + "id": "t1-ord", + "title": "t1-ord", + "description": "t1-ord", + "type": "text", + "scope": "tier1", + "phase": "ordering", + "hint": "I am the hint text", + "placeholder": "I am the placeholder text", + "constraints": { + "required": true, + "hidden": false, + "unique": false, + "readonly": false + } + } + ], + "template": { + "id": "TL-773-189-375", + "name": "Additional information is required to process your request", + "representation": "Please complete our **[Activation Form]({{ activation_form_url }})** to resume processing of your request" + }, + "open_request": { + "id": "TCR-355-484-775-001" + }, + "status": "processing", + "contract": { + "id": "CRD-064-001-001", + "name": "Contract of Distribution Agreement for the Marketplace M11 (akomissarov)", + "type": "distribution" + }, + "marketplace": { + "id": "MP-06411", + "name": "Marketplace M11 for akomissarov", + "icon": "/media/PA-064-101/marketplaces/MP-06411/icon.png" + } + }, + "params": [ + { + "value": "", + "value_error": "", + "title": "FF_PARAM", + "description": "FF_PARAM", + "type": "text", + "scope": "tier1", + "phase": "fulfillment", + "hint": "I am the hint text", + "placeholder": "I am the placeholder text", + "constraints": { + "required": true, + "hidden": false, + "unique": false, + "readonly": false + }, + "id": "FF_PARAM" + }, + { + "value": "", + "value_error": "", + "title": "t1-ord", + "description": "t1-ord", + "type": "text", + "scope": "tier1", + "phase": "ordering", + "hint": "I am the hint text", + "placeholder": "I am the placeholder text", + "constraints": { + "required": true, + "hidden": false, + "unique": false, + "readonly": false + }, + "id": "t1-ord" + } + ], + "assignee": { + "id": "UR-064-000-003", + "name": "Alex" + }, + "template": { + "id": "TL-773-189-375", + "name": "Additional information is required to process your request", + "representation": "Please complete our **[Activation Form]({{ activation_form_url }})** to resume processing of your request" + }, + "activation": { + "link": "https://customer.cnct.info/?request_id=TCR-355-484-775-001&code=bBOevsWbQQJiWXF2gzAVI4zmAiVMocw047DY" + }, + "environment": "production", + "tiers": { + "tier1": { + "id": "TA-1532-3470-1230", + "name": "t1-ff-param-test-reseller", + "type": "reseller", + "external_id": "92338", + "external_uid": "e7a32b31-18ce-451a-b8bf-5b44dcc7df88", + "tax_id": "B13M484TX9", + "contact_info": { + "address_line1": "Roselyn Shore", + "address_line2": "Fanny Trace", + "city": "Balgowlah", + "state": "Balgowlah", + "postal_code": "2093", + "country": "AU", + "contact": { + "first_name": "t1-ff-param-test-reseller", + "last_name": "Hirthe", + "email": "akomissarov+Freda_Hirthe@connect.cloudblue.com", + "phone_number": { + "country_code": "+61", + "area_code": "2", + "phone_number": "12345678", + "extension": "" + } + } + } + }, + "tier2": { + "id": "TA-4847-4932-2871", + "name": "Provider account 01 for akomissarov", + "type": "reseller", + "external_id": "PA-064-101", + "external_uid": "PA-064-101", + "contact_info": { + "address_line1": "-", + "address_line2": "-", + "city": "-", + "state": "-", + "postal_code": "-", + "country": "US", + "contact": { + "first_name": "-", + "last_name": "-", + "email": "unspecified@example.com", + "phone_number": { + "country_code": "+1", + "area_code": "951", + "phone_number": "2623062", + "extension": "" + } + } + } + } + }, + "events": { + "created": { + "at": "2024-08-13T04:52:00+00:00", + "by": { + "id": "UR-064-000-003", + "name": "Alex" + } + }, + "updated": { + "at": "2024-08-13T04:52:00+00:00", + "by": { + "id": "UR-064-000-003", + "name": "Alex" + } + }, + "inquired": { + "at": "2024-08-13T04:52:00+00:00", + "by": { + "id": "UR-064-000-003", + "name": "Alex" + } + } + } +} \ No newline at end of file diff --git a/tests/test_events.py b/tests/test_events.py index 62f67d9..c387576 100644 --- a/tests/test_events.py +++ b/tests/test_events.py @@ -399,7 +399,6 @@ def test_handle_tier_config_request( ).select('-tiers', '-configuration').order_by('-created').first().mock( return_value=tcr_list, ) - ext = DatalakeExtensionEventsApplication( connect_client, logger, diff --git a/tests/test_payloads.py b/tests/test_payloads.py new file mode 100644 index 0000000..df51f60 --- /dev/null +++ b/tests/test_payloads.py @@ -0,0 +1,77 @@ +from datetime import datetime + +import pytest + +from connect_ext_datalake.services.payloads import prepare_ff_request_data, prepare_tcr_data + + +expected_format = "%Y-%m-%dT%H:%M:%S%z" + + +def test_ff_request_mapping(ff_request): + ff_payload = prepare_ff_request_data(ff_request, 'TEST') + assert ff_payload['table_name'] == 'cmp_connect_fulfillmentrequest' + assert ff_payload['update_type'] == 'update' + + assert ff_payload['fulfillment_request']['id'] == ff_request['id'] + assert ( + ff_payload['fulfillment_request']['name'] + == f"Fulfillment request for asset {ff_request['asset']['id']}." + ) + assert ff_payload['fulfillment_request']['asset_id'] == ff_request['asset']['id'] + assert ff_payload['fulfillment_request']['product_id'] == ff_request['asset']['product']['id'] + assert ( + ff_payload['fulfillment_request']['asset_external_id'] == ff_request['asset']['external_id'] + ) + assert ( + ff_payload['fulfillment_request']['asset_external_uid'] + == ff_request['asset']['external_uid'] + ) + assert ff_payload['fulfillment_request']['activation_link'] == ff_request['params_form_url'] + assert ff_payload['fulfillment_request']['hub_cd'] == 'TEST' + try: + parsed_date = datetime.strptime( + ff_payload['fulfillment_request']['published_at'], expected_format + ) + assert parsed_date is not None + except ValueError: + pytest.fail( + f"Date string '{date_string}' does not match the expected format '{expected_format}'" + ) + + +def test_tcr_mapping(tcr_request): + tcr_payload = prepare_tcr_data(tcr_request, 'TEST') + assert tcr_payload['table_name'] == 'cmp_connect_tierconfigrequest' + assert tcr_payload['update_type'] == 'new' + + assert tcr_payload['tier_config_request']['id'] == tcr_request['id'] + assert ( + tcr_payload['tier_config_request']['name'] + == f"Tier Configuration Request for {tcr_request['configuration']['account']['id']}." + ) + assert ( + tcr_payload['tier_config_request']['tier_account_id'] + == tcr_request['configuration']['account']['id'] + ) + assert ( + tcr_payload['tier_config_request']['product_id'] + == tcr_request['configuration']['product']['id'] + ) + assert ( + tcr_payload['tier_config_request']['activation_link'] == tcr_request['activation']['link'] + ) + assert ( + tcr_payload['tier_config_request']['tier_level'] + == tcr_request['configuration']['tier_level'] + ) + assert tcr_payload['tier_config_request']['hub_cd'] == 'TEST' + try: + parsed_date = datetime.strptime( + tcr_payload['tier_config_request']['published_at'], expected_format + ) + assert parsed_date is not None + except ValueError: + pytest.fail( + f"Date string '{date_string}' does not match the expected format '{expected_format}'" + ) diff --git a/ui/src/components/PubCard.vue b/ui/src/components/PubCard.vue index 2e24783..87e8fa8 100644 --- a/ui/src/components/PubCard.vue +++ b/ui/src/components/PubCard.vue @@ -190,6 +190,16 @@ class="code topic-area" materialize /> + +