diff options
author | tye1 <tye1@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-08-17 02:38:08 +0000 |
---|---|---|
committer | tye1 <tye1@6f19259b-4bc3-4df7-8a09-765794883524> | 2011-08-17 02:38:08 +0000 |
commit | 4c5a5e0cfecf23526493bf9a05c0530805bf10ec (patch) | |
tree | 832ac48ee2b892817a1414fca804954ae6502e1a /NetworkPkg/IScsiDxe/IScsiConfigVfr.vfr | |
parent | ab0eecec6e1233b7ca179d8a8f2b2e44e9546b7f (diff) | |
download | edk2-platforms-4c5a5e0cfecf23526493bf9a05c0530805bf10ec.tar.xz |
Add IScsiDxe driver to NetworkPkg in order to support iSCSI over IPv6 stack and iSCSI MPIO.
Signed-off-by: tye1
Reviewed-by: hhuan13
Reviewed-by: eric_tian
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12149 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'NetworkPkg/IScsiDxe/IScsiConfigVfr.vfr')
-rw-r--r-- | NetworkPkg/IScsiDxe/IScsiConfigVfr.vfr | 429 |
1 files changed, 429 insertions, 0 deletions
diff --git a/NetworkPkg/IScsiDxe/IScsiConfigVfr.vfr b/NetworkPkg/IScsiDxe/IScsiConfigVfr.vfr new file mode 100644 index 0000000000..94b00ee60d --- /dev/null +++ b/NetworkPkg/IScsiDxe/IScsiConfigVfr.vfr @@ -0,0 +1,429 @@ +/** @file
+ VFR file used by the iSCSI configuration component.
+
+Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "IScsiConfigNVDataStruc.h"
+
+#define EFI_NETWORK_DEVICE_CLASS 0x04
+
+formset
+ guid = ISCSI_CONFIG_GUID,
+ title = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_TITLE),
+ help = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_HELP),
+ class = EFI_NETWORK_DEVICE_CLASS,
+ subclass = 0x03,
+
+ varstore ISCSI_CONFIG_IFR_NVDATA,
+ varid = CONFIGURATION_VARSTORE_ID,
+ name = ISCSI_CONFIG_IFR_NVDATA,
+ guid = ISCSI_CONFIG_GUID;
+
+ form formid = FORMID_MAIN_FORM,
+ title = STRING_TOKEN(STR_ISCSI_MAIN_FORM_TITLE);
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorName,
+ prompt = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME),
+ help = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME_HELP),
+ flags = INTERACTIVE,
+ key = KEY_INITIATOR_NAME,
+ minsize = ISCSI_NAME_IFR_MIN_SIZE,
+ maxsize = ISCSI_NAME_IFR_MAX_SIZE,
+ endstring;
+
+ subtitle text = STRING_TOKEN(STR_NULL);
+
+ goto FORMID_MAC_FORM,
+ prompt = STRING_TOKEN(STR_ADD_ATTEMPT_ENTRY),
+ help = STRING_TOKEN(STR_ADD_ATTEMPT_ENTRY),
+ flags = INTERACTIVE,
+ key = KEY_ADD_ATTEMPT;
+
+ label ATTEMPT_ENTRY_LABEL;
+ label LABEL_END;
+
+ subtitle text = STRING_TOKEN(STR_NULL);
+
+ goto FORMID_DELETE_FORM,
+ prompt = STRING_TOKEN (STR_DEL_ATTEMPT_ENTRY),
+ help = STRING_TOKEN (STR_DEL_ATTEMPT_ENTRY_HELP),
+ flags = INTERACTIVE,
+ key = KEY_DELETE_ATTEMPT;
+
+ subtitle text = STRING_TOKEN(STR_NULL);
+
+ goto FORMID_ORDER_FORM,
+ prompt = STRING_TOKEN (STR_ORDER_ATTEMPT_ENTRY),
+ help = STRING_TOKEN (STR_ORDER_ATTEMPT_ENTRY),
+ flags = INTERACTIVE,
+ key = KEY_ORDER_ATTEMPT_CONFIG;
+
+ subtitle text = STRING_TOKEN(STR_NULL);
+
+ endform;
+
+ form formid = FORMID_MAC_FORM,
+ title = STRING_TOKEN(STR_ISCSI_MAC_FORM_TITLE);
+
+ label MAC_ENTRY_LABEL;
+ label LABEL_END;
+
+ endform;
+
+ form formid = FORMID_ORDER_FORM,
+ title = STRING_TOKEN(STR_ORDER_ATTEMPT_ENTRY);
+
+ label ORDER_ENTRY_LABEL;
+ label LABEL_END;
+
+ goto FORMID_MAIN_FORM,
+ prompt = STRING_TOKEN (STR_SAVE_AND_EXIT),
+ help = STRING_TOKEN (STR_SAVE_AND_EXIT),
+ flags = INTERACTIVE,
+ key = KEY_SAVE_ORDER_CHANGES;
+
+ goto FORMID_MAIN_FORM,
+ prompt = STRING_TOKEN (STR_NO_SAVE_AND_EXIT),
+ help = STRING_TOKEN (STR_NO_SAVE_AND_EXIT),
+ flags = INTERACTIVE,
+ key = KEY_IGNORE_ORDER_CHANGES;
+
+ endform;
+
+ form formid = FORMID_DELETE_FORM,
+ title = STRING_TOKEN(STR_DEL_ATTEMPT_ENTRY);
+
+ label DELETE_ENTRY_LABEL;
+ label LABEL_END;
+
+ goto FORMID_MAIN_FORM,
+ prompt = STRING_TOKEN (STR_SAVE_AND_EXIT),
+ help = STRING_TOKEN (STR_SAVE_AND_EXIT),
+ flags = INTERACTIVE,
+ key = KEY_SAVE_DELETE_ATTEMPT;
+
+ goto FORMID_MAIN_FORM,
+ prompt = STRING_TOKEN (STR_NO_SAVE_AND_EXIT),
+ help = STRING_TOKEN (STR_NO_SAVE_AND_EXIT),
+ flags = INTERACTIVE,
+ key = KEY_IGNORE_DELETE_ATTEMPT;
+
+ endform;
+
+ form formid = FORMID_ATTEMPT_FORM,
+ title = STRING_TOKEN(STR_ISCSI_ATTEMPT_FORM_TITLE);
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.AttemptName,
+ prompt = STRING_TOKEN(STR_ISCSI_ATTEMPT_NAME),
+ help = STRING_TOKEN(STR_ISCSI_ATTEMPT_NAME_HELP),
+ flags = INTERACTIVE,
+ key = KEY_ATTEMPT_NAME,
+ minsize = 0,
+ maxsize = ATTEMPT_NAME_MAX_SIZE,
+ endstring;
+
+ subtitle text = STRING_TOKEN(STR_NULL);
+
+ oneof varid = ISCSI_CONFIG_IFR_NVDATA.Enabled,
+ prompt = STRING_TOKEN(STR_ISCSI_MODE_PROMPT),
+ help = STRING_TOKEN(STR_ISCSI_MODE_HELP),
+ option text = STRING_TOKEN(STR_ISCSI_MODE_DISABLED), value = ISCSI_DISABLED, flags = DEFAULT;
+ option text = STRING_TOKEN(STR_ISCSI_MODE_ENABLED), value = ISCSI_ENABLED, flags = 0;
+ option text = STRING_TOKEN(STR_ISCSI_MODE_ENABLED_FOR_MPIO), value = ISCSI_ENABLED_FOR_MPIO, flags = 0;
+ endoneof;
+
+ subtitle text = STRING_TOKEN(STR_NULL);
+
+ oneof varid = ISCSI_CONFIG_IFR_NVDATA.IpMode,
+ questionid = KEY_IP_MODE,
+ prompt = STRING_TOKEN(STR_IP_MODE_PROMPT),
+ help = STRING_TOKEN(STR_IP_MODE_HELP),
+ option text = STRING_TOKEN(STR_IP_MODE_IP4), value = IP_MODE_IP4, flags = INTERACTIVE;
+ option text = STRING_TOKEN(STR_IP_MODE_IP6), value = IP_MODE_IP6, flags = INTERACTIVE;
+ option text = STRING_TOKEN(STR_IP_MODE_AUTOCONFIG), value = IP_MODE_AUTOCONFIG, flags = INTERACTIVE;
+ endoneof;
+
+ subtitle text = STRING_TOKEN(STR_NULL);
+
+ numeric varid = ISCSI_CONFIG_IFR_NVDATA.ConnectRetryCount,
+ prompt = STRING_TOKEN(STR_ISCSI_CONFIG_RETRY),
+ help = STRING_TOKEN(STR_ISCSI_CONFIG_RETRY_HELP),
+ flags = 0,
+ minimum = CONNECT_MIN_RETRY,
+ maximum = CONNECT_MAX_RETRY,
+ step = 0,
+ endnumeric;
+
+ numeric varid = ISCSI_CONFIG_IFR_NVDATA.ConnectTimeout,
+ prompt = STRING_TOKEN(STR_ISCSI_CONFIG_TIMEOUT),
+ help = STRING_TOKEN(STR_ISCSI_CONFIG_TIMEOUT_HELP),
+ flags = 0,
+ minimum = CONNECT_MIN_TIMEOUT,
+ maximum = CONNECT_MAX_TIMEOUT,
+ step = 0,
+ default = CONNECT_DEFAULT_TIMEOUT,
+ endnumeric;
+
+ subtitle text = STRING_TOKEN(STR_NULL);
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.IsId,
+ prompt = STRING_TOKEN(STR_ISCSI_CONFIG_ISID),
+ help = STRING_TOKEN(STR_ISCSI_CONFIG_ISID_HELP),
+ flags = INTERACTIVE,
+ key = KEY_CONFIG_ISID,
+ minsize = ISID_CONFIGURABLE_MIN_LEN,
+ maxsize = ISID_CONFIGURABLE_MAX_LEN,
+ endstring;
+
+ subtitle text = STRING_TOKEN(STR_NULL);
+
+ suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.IpMode == IP_MODE_AUTOCONFIG;
+ checkbox varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp,
+ prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
+ help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
+ flags = INTERACTIVE,
+ key = KEY_DHCP_ENABLE,
+ endcheckbox;
+ endif;
+
+ suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x01 OR
+ ideqval ISCSI_CONFIG_IFR_NVDATA.IpMode == IP_MODE_IP6 OR
+ ideqval ISCSI_CONFIG_IFR_NVDATA.IpMode == IP_MODE_AUTOCONFIG;
+ string varid = ISCSI_CONFIG_IFR_NVDATA.LocalIp,
+ prompt = STRING_TOKEN(STR_ISCSI_LOCAL_IP_ADDRESS),
+ help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
+ flags = INTERACTIVE,
+ key = KEY_LOCAL_IP,
+ minsize = IP4_MIN_SIZE,
+ maxsize = IP4_MAX_SIZE,
+ endstring;
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.SubnetMask,
+ prompt = STRING_TOKEN(STR_ISCSI_LOCAL_MASK),
+ help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
+ flags = INTERACTIVE,
+ key = KEY_SUBNET_MASK,
+ minsize = IP4_MIN_SIZE,
+ maxsize = IP4_MAX_SIZE,
+ endstring;
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.Gateway,
+ prompt = STRING_TOKEN(STR_ISCSI_LOCAL_GATEWAY),
+ help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
+ flags = INTERACTIVE,
+ key = KEY_GATE_WAY,
+ minsize = IP4_MIN_SIZE,
+ maxsize = IP4_MAX_SIZE,
+ endstring;
+
+ endif;
+
+ suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.IpMode == IP_MODE_AUTOCONFIG;
+ subtitle text = STRING_TOKEN(STR_NULL);
+ endif;
+
+ suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.IpMode == IP_MODE_AUTOCONFIG OR
+ ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x00;
+ checkbox varid = ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp,
+ prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
+ help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
+ flags = 0,
+ endcheckbox;
+ endif;
+
+ suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.IpMode == IP_MODE_AUTOCONFIG OR
+ ideqval ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp == 0x01;
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.TargetName,
+ prompt = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
+ help = STRING_TOKEN(STR_ISCSI_TARGET_NAME_HELP),
+ flags = INTERACTIVE,
+ key = KEY_TARGET_NAME,
+ minsize = ISCSI_NAME_IFR_MIN_SIZE,
+ maxsize = ISCSI_NAME_IFR_MAX_SIZE,
+ endstring;
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.TargetIp,
+ prompt = STRING_TOKEN(STR_ISCSI_TARGET_IP_ADDRESS),
+ help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
+ flags = INTERACTIVE,
+ key = KEY_TARGET_IP,
+ minsize = IP_MIN_SIZE,
+ maxsize = IP_MAX_SIZE,
+ endstring;
+
+ numeric varid = ISCSI_CONFIG_IFR_NVDATA.TargetPort,
+ prompt = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
+ help = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
+ flags = 0,
+ minimum = TARGET_PORT_MIN_NUM,
+ maximum = TARGET_PORT_MAX_NUM,
+ step = 0,
+ endnumeric;
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.BootLun,
+ prompt = STRING_TOKEN(STR_ISCSI_BOOT_LUN),
+ help = STRING_TOKEN(STR_ISCSI_BOOT_LUN_HELP),
+ flags = INTERACTIVE,
+ key = KEY_BOOT_LUN,
+ minsize = LUN_MIN_SIZE,
+ maxsize = LUN_MAX_SIZE,
+ endstring;
+
+ endif;
+
+ suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.IpMode == IP_MODE_AUTOCONFIG;
+ subtitle text = STRING_TOKEN(STR_NULL);
+ endif;
+
+ oneof varid = ISCSI_CONFIG_IFR_NVDATA.AuthenticationType,
+ questionid = KEY_AUTH_TYPE,
+ prompt = STRING_TOKEN(STR_AUTHEN_TYPE_PROMPT),
+ help = STRING_TOKEN(STR_AUTHEN_TYPE_HELP),
+ option text = STRING_TOKEN(STR_AUTHEN_TYPE_CHAP), value = ISCSI_AUTH_TYPE_CHAP, flags = 0;
+ option text = STRING_TOKEN(STR_AUTHEN_TYPE_NONE), value = ISCSI_AUTH_TYPE_NONE, flags = DEFAULT;
+ endoneof;
+
+ suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.AuthenticationType == ISCSI_AUTH_TYPE_CHAP;
+ oneof varid = ISCSI_CONFIG_IFR_NVDATA.CHAPType,
+ prompt = STRING_TOKEN(STR_CHAP_TYPE_PROMPT),
+ help = STRING_TOKEN(STR_CHAP_TYPE_HELP),
+ option text = STRING_TOKEN(STR_CHAP_TYPE_UNI), value = ISCSI_CHAP_UNI, flags = 0;
+ option text = STRING_TOKEN(STR_CHAP_TYPE_MUTUAL), value = ISCSI_CHAP_MUTUAL, flags = DEFAULT;
+ endoneof;
+ endif;
+
+ suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.AuthenticationType == ISCSI_AUTH_TYPE_CHAP;
+ string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPName,
+ prompt = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
+ help = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
+ flags = INTERACTIVE,
+ key = KEY_CHAP_NAME,
+ minsize = 0,
+ maxsize = ISCSI_CHAP_NAME_MAX_LEN,
+ endstring;
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPSecret,
+ prompt = STRING_TOKEN(STR_ISCSI_CHAP_SECRET),
+ help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
+ flags = INTERACTIVE,
+ key = KEY_CHAP_SECRET,
+ minsize = ISCSI_CHAP_SECRET_MIN_LEN,
+ maxsize = ISCSI_CHAP_SECRET_MAX_LEN,
+ endstring;
+
+ endif;
+
+ suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.AuthenticationType == ISCSI_AUTH_TYPE_CHAP OR
+ NOT ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == ISCSI_CHAP_MUTUAL;
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPName,
+ prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
+ help = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
+ flags = INTERACTIVE,
+ key = KEY_REVERSE_CHAP_NAME,
+ minsize = 0,
+ maxsize = ISCSI_CHAP_NAME_MAX_LEN,
+ endstring;
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPSecret,
+ prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_SECRET),
+ help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
+ flags = INTERACTIVE,
+ key = KEY_REVERSE_CHAP_SECRET,
+ minsize = ISCSI_CHAP_SECRET_MIN_LEN,
+ maxsize = ISCSI_CHAP_SECRET_MAX_LEN,
+ endstring;
+
+ endif;
+
+ suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.AuthenticationType == ISCSI_AUTH_TYPE_KRB;
+
+ checkbox varid = ISCSI_CONFIG_IFR_NVDATA.MutualRequired,
+ prompt = STRING_TOKEN(STR_ISCSI_MUTUAL_REQUIRED),
+ help = STRING_TOKEN(STR_ISCSI_MUTUAL_REQUIRED_HELP),
+ flags = 0,
+ endcheckbox;
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.KerberosUserName,
+ prompt = STRING_TOKEN(STR_ISCSI_KERBEROS_USER_NAME),
+ help = STRING_TOKEN(STR_ISCSI_KERBEROS_USER_NAME),
+ flags = INTERACTIVE,
+ key = KEY_KERBEROS_USER_NAME,
+ minsize = 0,
+ maxsize = KERBEROS_NAME_MAX_LEN,
+ endstring;
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.KerberosUserSecret,
+ prompt = STRING_TOKEN(STR_ISCSI_KERBEROS_USER_SECRET),
+ help = STRING_TOKEN(STR_ISCSI_KERBEROS_USER_SECRET),
+ flags = INTERACTIVE,
+ key = KEY_KERBEROS_USER_SECRET,
+ minsize = KERBEROS_SECRET_MIN_LEN,
+ maxsize = KERBEROS_SECRET_MAX_LEN,
+ endstring;
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.KerberosKDCName,
+ prompt = STRING_TOKEN(STR_ISCSI_KERBEROS_KDC_NAME),
+ help = STRING_TOKEN(STR_ISCSI_KERBEROS_KDC_NAME),
+ flags = INTERACTIVE,
+ key = KEY_KERBEROS_KDC_NAME,
+ minsize = 0,
+ maxsize = KERBEROS_NAME_MAX_LEN,
+ endstring;
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.KerberosKDCRealm,
+ prompt = STRING_TOKEN(STR_ISCSI_KERBEROS_KDC_REALM),
+ help = STRING_TOKEN(STR_ISCSI_KERBEROS_KDC_REALM),
+ flags = INTERACTIVE,
+ key = KEY_KERBEROS_KDC_REALM,
+ minsize = 0,
+ maxsize = KERBEROS_NAME_MAX_LEN,
+ endstring;
+
+ string varid = ISCSI_CONFIG_IFR_NVDATA.KerberosKDCIp,
+ prompt = STRING_TOKEN(STR_ISCSI_KERBEROS_KDC_IP),
+ help = STRING_TOKEN(STR_ISCSI_KERBEROS_KDC_IP),
+ flags = INTERACTIVE,
+ key = KEY_KERBEROS_KDC_IP_ADDR,
+ minsize = IP_MIN_SIZE,
+ maxsize = IP_MAX_SIZE,
+ endstring;
+
+ numeric varid = ISCSI_CONFIG_IFR_NVDATA.KerberosKDCPort,
+ prompt = STRING_TOKEN(STR_ISCSI_KERBEROS_KDC_PORT),
+ help = STRING_TOKEN(STR_ISCSI_KERBEROS_KDC_PORT),
+ flags = 0,
+ minimum = KERBEROS_KDC_PORT_MIN_NUM,
+ maximum = KERBEROS_KDC_PORT_MAX_NUM,
+ step = 0,
+ endnumeric;
+
+ endif;
+
+ subtitle text = STRING_TOKEN(STR_NULL);
+
+ goto FORMID_ATTEMPT_FORM,
+ prompt = STRING_TOKEN (STR_SAVE_CHANGES),
+ help = STRING_TOKEN (STR_SAVE_CHANGES),
+ flags = INTERACTIVE,
+ key = KEY_SAVE_ATTEMPT_CONFIG;
+
+ goto FORMID_MAIN_FORM,
+ prompt = STRING_TOKEN (STR_RETURN_MAIN_FORM),
+ help = STRING_TOKEN (STR_RETURN_MAIN_FORM),
+ flags = 0;
+
+ endform;
+
+endformset;
+
|