Skip to content

Commit 235af7f

Browse files
committed
Merge branch 'develop' into DDW-1014-ui-fix-search-field-paddings
2 parents 4a84903 + 32102a0 commit 235af7f

File tree

15 files changed

+309
-273
lines changed

15 files changed

+309
-273
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44

55
### Features
66

7+
- Improved UI regarding the Hardware Wallet public key export error ([PR 2922](https://github.com/input-output-hk/daedalus/pull/2922))
78
- Added ASCII name to token header when metadata name is missing ([PR 2904](https://github.com/input-output-hk/daedalus/pull/2904))
89
- Improved IPC by reducing the amount of messages from periodic events ([PR 2892](https://github.com/input-output-hk/daedalus/pull/2892))
910
- Improved RTS flags splash screen message ([PR 2901](https://github.com/input-output-hk/daedalus/pull/2901))
1011
- Implemented error message when trying to leave wallet without enough ada to support tokens ([PR 2783](https://github.com/input-output-hk/daedalus/pull/2783))
1112

1213
### Fixes
1314

15+
- Fixed position of popup on syncing screen ([PR 2921](https://github.com/input-output-hk/daedalus/pull/2921))
1416
- Fixed issue with missing character when copying address from PDF ([PR 2925](https://github.com/input-output-hk/daedalus/pull/2925))
1517
- Fixed stake pool list view overlapping news feed ([PR 2917](https://github.com/input-output-hk/daedalus/pull/2917))
1618
- Restored opacity for search icon when focused ([PR 2909](https://github.com/input-output-hk/daedalus/pull/2909))

README.md

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88

99
Daedalus - Cryptocurrency Wallet
1010

11-
## Installation
11+
## Setup development environment
1212

13-
### Yarn
13+
### Linux/macOS
14+
15+
#### Yarn
1416

1517
[Yarn](https://yarnpkg.com/lang/en/docs/install) is required to install `npm` dependencies to build Daedalus.
1618

17-
### Nix
19+
#### Nix
1820

1921
[Nix](https://nixos.org/nix/) is needed to run Daedalus in `nix-shell`.
2022

@@ -57,22 +59,19 @@ If you get SSL error when running `nix-shell` (SSL peer certificate or SSH remot
5759
```
5860
2. Download certificate from https://docs.certifytheweb.com/docs/kb/kb-202109-letsencrypt/ and import to your keychain.
5961

60-
## Development
61-
62-
### Running Daedalus with Cardano Node
62+
#### Running Daedalus with Cardano Node
6363

64-
#### Selfnode
64+
##### Selfnode
6565

6666
1. Run `yarn nix:selfnode` from `daedalus`.
6767
2. Run `yarn dev` from the subsequent `nix-shell` (use `KEEP_LOCAL_CLUSTER_RUNNING` environment variable to keep the local cluster running after Daedalus exits: `KEEP_LOCAL_CLUSTER_RUNNING=true yarn dev`)
68-
1. Alternatively: run `yarn nix:selfnode yarn dev` to achieve the same thing in a single command. Note: after `yarn dev` exits, you will still remain in the `nix-shell`.
6968
3. Once Daedalus has started and has gotten past the loading screen run the following commands from a new terminal window if you wish to import funded wallets:
70-
- Byron wallets: `yarn byron:wallet:importer`
71-
- Shelley wallets: `yarn shelley:wallet:importer`
72-
- Mary wallets: `yarn mary:wallet:importer` (all of which contain native tokens which are visible once selfnode enters Mary era)
73-
- Yoroi Byron wallets: `yarn yoroi:wallet:importer`
74-
- _ITN Byron wallets:_ `yarn itn:byron:wallet:importer` **[Deprecated]**
75-
- _ITN Shelley wallets:_ `yarn itn:shelley:wallet:importer` **[Deprecated]**
69+
- Byron wallets: `yarn byron:wallet:importer`
70+
- Shelley wallets: `yarn shelley:wallet:importer`
71+
- Mary wallets: `yarn mary:wallet:importer` (all of which contain native tokens which are visible once selfnode enters Mary era)
72+
- Yoroi Byron wallets: `yarn yoroi:wallet:importer`
73+
- _ITN Byron wallets:_ `yarn itn:byron:wallet:importer` **[Deprecated]**
74+
- _ITN Shelley wallets:_ `yarn itn:shelley:wallet:importer` **[Deprecated]**
7675

7776
These scripts import 3 wallets by default. You can import up to 10 wallets by supplying `WALLET_COUNT` environment variable (e.g. `WALLET_COUNT=10 yarn mary:wallet:importer`).
7877

@@ -91,43 +90,37 @@ If you get SSL error when running `nix-shell` (SSL peer certificate or SSH remot
9190
| desiredPoolNumber | 3
9291
| minimumUtxoValue | 1 ADA
9392

94-
#### Mainnet
93+
##### Mainnet
9594

9695
1. Run `yarn nix:mainnet` from `daedalus`.
9796
2. Run `yarn dev` from the subsequent `nix-shell`
98-
3. Or in one command: `yarn nix:mainnet yarn dev`
9997

100-
#### Flight
98+
##### Flight
10199

102100
1. Run `yarn nix:flight` from `daedalus`.
103101
2. Run `yarn dev` from the subsequent `nix-shell`
104-
3. Or in one command: `yarn nix:flight yarn dev`
105102

106-
#### Testnet
103+
##### Testnet
107104

108105
1. Run `yarn nix:testnet` from `daedalus`.
109106
2. Run `yarn dev` from the subsequent `nix-shell`
110-
3. Or in one command: `yarn nix:testnet yarn dev`
111107

112-
#### Staging
108+
##### Staging
113109

114110
1. Run `yarn nix:staging` from `daedalus`.
115111
2. Run `yarn dev` from the subsequent `nix-shell`
116-
3. Or in one command: `yarn nix:staging yarn dev`
117112

118-
#### Shelley QA
113+
##### Shelley QA
119114

120115
1. Run `yarn nix:shelley_qa` from `daedalus`.
121116
2. Run `yarn dev` from the subsequent `nix-shell`
122-
3. Or in one command: `yarn nix:shelley_qa yarn dev`
123117

124-
#### Alonzo Purple
118+
##### Alonzo Purple
125119

126120
1. Run `yarn nix:alonzo_purple` from `daedalus`.
127121
2. Run `yarn dev` from the subsequent `nix-shell`
128-
3. Or in one command: `yarn nix:alonzo_purple yarn dev`
129122

130-
#### Native token metadata server
123+
##### Native token metadata server
131124

132125
Daedalus, by default, uses the following metadata server for all networks except for the mainnet: `https://metadata.cardano-testnet.iohkdev.io/`.
133126

@@ -158,7 +151,28 @@ http://localhost:65432/metadata/query
158151
```
159152
... and expect a "200 OK" response.
160153

161-
### Updating upstream dependencies (cardano-wallet, cardano-node, and iohk-nix)
154+
### Windows
155+
156+
This option is only for troubleshooting windows specific issues with hardware wallets. It is not recommended to use Windows as a developer environment.
157+
Most of the commands need `nix` and will run only on Linux or macOS.
158+
159+
#### Requisites
160+
- Windows 10/11
161+
- Daedalus testnet installation (similar version used in branch) in `C:\Program Files\Daedalus Testnet`
162+
- NodeJS 16
163+
- Python2 *
164+
- `yarn global add windows-build-tools` * (if this does not work extract daedalus\nix\windows-usb-libs.zip under daedalus\build folder)
165+
- Microsoft Build Tools 2015 *
166+
- Microsoft Visual Studio 2017 (Include Desktop development with C++) *
167+
- `yarn config set msvsversion 2015 --global`
168+
169+
*needed for compiling [email protected] on Windows
170+
171+
#### Steps
172+
- `yarn install`
173+
- `yarn dev:windows`
174+
175+
#### Updating upstream dependencies (cardano-wallet, cardano-node, and iohk-nix)
162176

163177
`Niv` is used to manage the version of upstream dependencies. The versions of these dependencies can be seen in `nix/sources.json`.
164178

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"start": "gulp start",
1212
"start:dev": "NODE_ENV=development gulp start",
1313
"dev": "IS_WATCH_MODE=true gulp dev",
14+
"dev:windows": "cross-env DAEDALUS_INSTALL_DIRECTORY=\"C:\\Program Files\\Daedalus Testnet\" LAUNCHER_CONFIG=\"C:\\Program Files\\Daedalus Testnet\\launcher-config.yaml\" gulp dev",
1415
"test": "NODE_ENV=test yarn build && yarn test:unit && yarn test:e2e:fail-fast",
1516
"test:jest": "NODE_OPTIONS=--experimental-vm-modules jest",
1617
"test:generate:report": "ts-node tests/reporter.ts",

source/renderer/app/components/hardware-wallet/HardwareWalletStatus.scss

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
font-size: 16px;
2424
}
2525
}
26-
.passphraseLabel {
26+
.secondaryMessage {
2727
color: var(--theme-hardware-wallet-status-passphrase-label-color);
2828
line-height: 1.38;
2929
}
@@ -75,11 +75,3 @@
7575
}
7676
}
7777
}
78-
79-
.errorText {
80-
color: var(--rp-theme-color-error);
81-
font-family: var(--font-regular);
82-
font-size: 16px;
83-
margin-top: 20px;
84-
text-align: center;
85-
}

source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx

Lines changed: 68 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,53 @@ const messages = defineMessages({
160160
description: '"Address verified" device state',
161161
},
162162
});
163+
164+
const hwDeviceLoadingStatuses = [
165+
HwDeviceStatuses.CONNECTING,
166+
HwDeviceStatuses.LAUNCHING_CARDANO_APP,
167+
HwDeviceStatuses.EXPORTING_PUBLIC_KEY,
168+
HwDeviceStatuses.VERIFYING_TRANSACTION,
169+
HwDeviceStatuses.VERIFYING_ADDRESS,
170+
HwDeviceStatuses.VERIFYING_ADDRESS_CONFIRMATION,
171+
];
172+
173+
const hwDeviceReadyStatuses = [
174+
HwDeviceStatuses.READY,
175+
HwDeviceStatuses.VERIFYING_TRANSACTION_SUCCEEDED,
176+
HwDeviceStatuses.VERIFYING_ADDRESS_SUCCEEDED,
177+
];
178+
179+
const hwDeviceErrorStatuses = [
180+
HwDeviceStatuses.EXPORTING_PUBLIC_KEY_FAILED,
181+
HwDeviceStatuses.CONNECTING_FAILED,
182+
HwDeviceStatuses.TREZOR_BRIDGE_FAILURE,
183+
HwDeviceStatuses.WRONG_FIRMWARE,
184+
HwDeviceStatuses.WRONG_CARDANO_APP_VERSION,
185+
HwDeviceStatuses.UNSUPPORTED_DEVICE,
186+
HwDeviceStatuses.VERIFYING_TRANSACTION_FAILED,
187+
HwDeviceStatuses.VERIFYING_ADDRESS_FAILED,
188+
HwDeviceStatuses.VERIFYING_ADDRESS_ABORTED,
189+
];
190+
191+
const hwDevicePassphraseRelatedStatuses = [
192+
HwDeviceStatuses.EXPORTING_PUBLIC_KEY,
193+
HwDeviceStatuses.VERIFYING_TRANSACTION,
194+
HwDeviceStatuses.VERIFYING_ADDRESS,
195+
];
196+
197+
const hwDeviceInstructionsLinkRelatedStatuses = [
198+
HwDeviceStatuses.TREZOR_BRIDGE_FAILURE,
199+
HwDeviceStatuses.WRONG_CARDANO_APP_VERSION,
200+
HwDeviceStatuses.WRONG_FIRMWARE,
201+
];
202+
163203
type Props = {
164204
hwDeviceStatus: HwDeviceStatus;
165205
onExternalLinkClick?: (...args: Array<any>) => any;
166206
walletName?: string;
167207
isTrezor: boolean;
168208
};
209+
169210
type State = {
170211
hwDeviceStatus: HwDeviceStatus;
171212
};
@@ -207,40 +248,29 @@ class HardwareWalletStatus extends Component<Props, State> {
207248
const { intl } = this.context;
208249
const { onExternalLinkClick, walletName, isTrezor } = this.props;
209250
const { hwDeviceStatus } = this.state;
210-
const isLoading =
211-
hwDeviceStatus === HwDeviceStatuses.CONNECTING ||
212-
hwDeviceStatus === HwDeviceStatuses.LAUNCHING_CARDANO_APP ||
213-
hwDeviceStatus === HwDeviceStatuses.EXPORTING_PUBLIC_KEY ||
214-
hwDeviceStatus === HwDeviceStatuses.VERIFYING_TRANSACTION ||
215-
hwDeviceStatus === HwDeviceStatuses.VERIFYING_ADDRESS ||
216-
hwDeviceStatus === HwDeviceStatuses.VERIFYING_ADDRESS_CONFIRMATION;
217-
const isReady =
218-
hwDeviceStatus === HwDeviceStatuses.READY ||
219-
hwDeviceStatus === HwDeviceStatuses.VERIFYING_TRANSACTION_SUCCEEDED ||
220-
hwDeviceStatus === HwDeviceStatuses.VERIFYING_ADDRESS_SUCCEEDED;
221-
const hasErrored =
222-
hwDeviceStatus === HwDeviceStatuses.EXPORTING_PUBLIC_KEY_FAILED ||
223-
hwDeviceStatus === HwDeviceStatuses.CONNECTING_FAILED ||
224-
hwDeviceStatus === HwDeviceStatuses.TREZOR_BRIDGE_FAILURE ||
225-
hwDeviceStatus === HwDeviceStatuses.WRONG_FIRMWARE ||
226-
hwDeviceStatus === HwDeviceStatuses.WRONG_CARDANO_APP_VERSION ||
227-
hwDeviceStatus === HwDeviceStatuses.UNSUPPORTED_DEVICE ||
228-
hwDeviceStatus === HwDeviceStatuses.VERIFYING_TRANSACTION_FAILED ||
229-
hwDeviceStatus === HwDeviceStatuses.VERIFYING_ADDRESS_FAILED ||
230-
hwDeviceStatus === HwDeviceStatuses.VERIFYING_ADDRESS_ABORTED;
231-
const hasPassphraseLabel =
232-
hwDeviceStatus === HwDeviceStatuses.EXPORTING_PUBLIC_KEY ||
233-
hwDeviceStatus === HwDeviceStatuses.VERIFYING_TRANSACTION ||
234-
hwDeviceStatus === HwDeviceStatuses.VERIFYING_ADDRESS;
235-
const componentClasses = classnames([
236-
styles.component,
237-
isReady ? styles.isReady : null,
238-
hasErrored ? styles.isError : null,
239-
]);
240-
const hasInstructionsLink =
241-
hwDeviceStatus === HwDeviceStatuses.TREZOR_BRIDGE_FAILURE ||
242-
hwDeviceStatus === HwDeviceStatuses.WRONG_CARDANO_APP_VERSION ||
243-
hwDeviceStatus === HwDeviceStatuses.WRONG_FIRMWARE;
251+
const isLoading = hwDeviceLoadingStatuses.includes(hwDeviceStatus);
252+
const isReady = hwDeviceReadyStatuses.includes(hwDeviceStatus);
253+
const isError = hwDeviceErrorStatuses.includes(hwDeviceStatus);
254+
const hasInstructionsLink = hwDeviceInstructionsLinkRelatedStatuses.includes(
255+
hwDeviceStatus
256+
);
257+
258+
const passphraseLabelVisible =
259+
isTrezor && hwDevicePassphraseRelatedStatuses.includes(hwDeviceStatus);
260+
let secondaryMessage = null;
261+
if (passphraseLabelVisible) {
262+
secondaryMessage = messages.enterPassphrase;
263+
} else if (
264+
hwDeviceStatus === HwDeviceStatuses.EXPORTING_PUBLIC_KEY_FAILED
265+
) {
266+
secondaryMessage = messages.exportingPublicKeyError;
267+
}
268+
269+
const componentClasses = classnames(styles.component, {
270+
[styles.isReady]: isReady,
271+
[styles.isError]: isError,
272+
});
273+
244274
let instructionsLink;
245275
let label;
246276

@@ -298,9 +328,9 @@ class HardwareWalletStatus extends Component<Props, State> {
298328
label
299329
)}
300330
</div>
301-
{hasPassphraseLabel && isTrezor && (
302-
<div className={styles.passphraseLabel}>
303-
{intl.formatMessage(messages.enterPassphrase)}
331+
{secondaryMessage && (
332+
<div className={styles.secondaryMessage}>
333+
{intl.formatMessage(secondaryMessage)}
304334
</div>
305335
)}
306336
</div>
@@ -310,15 +340,10 @@ class HardwareWalletStatus extends Component<Props, State> {
310340
{isReady && (
311341
<SVGInline svg={checkIcon} className={styles.checkIcon} />
312342
)}
313-
{hasErrored && (
343+
{isError && (
314344
<SVGInline svg={clearIcon} className={styles.clearIcon} />
315345
)}
316346
</div>
317-
{hwDeviceStatus === HwDeviceStatuses.EXPORTING_PUBLIC_KEY_FAILED && (
318-
<div className={styles.errorText}>
319-
{intl.formatMessage(messages.exportingPublicKeyError)}
320-
</div>
321-
)}
322347
</>
323348
);
324349
}

source/renderer/app/components/loading/syncing-connecting/SyncingProgress/SyncingProgress.tsx

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,18 @@ const SyncingProgress: FC<Props> = (props, { intl }: Context) => (
5858
<span className={makeMainMessageStyles(props[type] === 100)}>
5959
{intl.formatMessage(getProgressNameByBlockSyncType(type))}
6060
</span>
61-
<PopOver
62-
content={intl.formatMessage(
63-
getProgressDescriptionByBlockSyncType(type)
64-
)}
65-
>
66-
<SVGInline
67-
svg={questionMarkIcon}
68-
className={questionMarkIconStyles}
69-
/>
70-
</PopOver>
61+
<span>
62+
<PopOver
63+
content={intl.formatMessage(
64+
getProgressDescriptionByBlockSyncType(type)
65+
)}
66+
>
67+
<SVGInline
68+
svg={questionMarkIcon}
69+
className={questionMarkIconStyles}
70+
/>
71+
</PopOver>
72+
</span>
7173
</div>
7274
))}
7375
</div>

source/renderer/app/i18n/locales/ja-JP.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1187,7 +1187,7 @@
11871187
"wallet.summary.transactionsList.syncingTransactionsMessage": "ウォレットのトランザクション履歴は現在ブロックチェーンと同期中です。",
11881188
"wallet.summary.transactionsList.todayLabel": "今日",
11891189
"wallet.summary.transactionsList.yesterdayLabel": "昨日",
1190-
"wallet.token.picker.addButtonLabel": "キャンセル",
1190+
"wallet.token.picker.addButtonLabel": "追加する",
11911191
"wallet.token.picker.allTokensLabel": "すべてのトークン",
11921192
"wallet.token.picker.cancelButtonLabel": "キャンセル",
11931193
"wallet.token.picker.checkAllLabel": "すべてを選択",

tls/client/ca.crt

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
-----BEGIN CERTIFICATE-----
22
MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQsFADA6MREwDwYDVQQKDAhEYWVk
33
YWx1czElMCMGA1UEAwwcRGFlZGFsdXMgU2VsZi1TaWduZWQgUm9vdCBDQTAeFw0y
4-
MTAzMzAxNzIwMTBaFw0zMTAzMjgxNzIxMTBaMDoxETAPBgNVBAoMCERhZWRhbHVz
4+
MjAzMzAyMDEzNDhaFw0zMjAzMjcyMDE0NDhaMDoxETAPBgNVBAoMCERhZWRhbHVz
55
MSUwIwYDVQQDDBxEYWVkYWx1cyBTZWxmLVNpZ25lZCBSb290IENBMIIBIjANBgkq
6-
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuIGJJKwYvhby2ib829IE8UU8irHEZ082
7-
J8XLgADEiG6UCs+aqn9w++27nlzMRMofF49rjfSjDjhzpML8e5Vug9djEz9s2B0u
8-
uPtAzBBJyrA56IIDUO1r/X7AcQ+h86WXWzkmGjvRQLzN0L0rPU26S7RbasXc3FP0
9-
wCer3Uaw/3npkfZopNXzq16/9CuZB95gka4g/LJVSqvrrZFx4dcQ8mpHK9S/Uq2n
10-
j1tRW8xzgFUg5NWdqhyRxvX4jtPUWMXJfn5ltOSk29Xj0Cra25ZVORtaCsqTargn
11-
pinWLzlejHeGZR4NVPY+213ucyt6EWMf3HnlPxqES83m9rf/oPYHbwIDAQABo0cw
6+
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtnH93sgS9S02Wbf9n1bMMPuf7bsu95wh
7+
vQdNRi6lmadjMcqY4KIAwebGO0bEH5fLEuPmvD2PPfjaju7/FKv8QG0aPx0ElrBo
8+
cYbiuYPaFmJWvhThxKSyYEEILxzx9oKxwJk+lbIaSR5p+mQLLR+UYET4fzZ3E9fL
9+
mgMODQNc1JKgM4GBdH13Y+0CxYsj9vQAbXTsIUvGh6+1zh0whdV1/3szSfztftnT
10+
OGT8xdsYZ2kTGeBjp2hQzSagWc50eT9G/d32fAhCKD6uvEsAT6xS2S6/RpGVlA8H
11+
+ZbdHiCVGHVAuCo8DL63fPCXHjCrmOjZnV2hajK95jug2b1XbhMbowIDAQABo0cw
1212
RTAPBgNVHQ8BAf8EBQMDBwYAMBIGA1UdEwEB/wQIMAYBAf8CAQAwDQYDVR0OBAYE
13-
BHBw0/IwDwYDVR0jBAgwBoAEcHDT8jANBgkqhkiG9w0BAQsFAAOCAQEAUlYcsa/F
14-
xak3RO4YH4mdJOPDt7I16SoqH9EP8BTlOTgFU8Ql5MpG7VE+XWVc1D3NSp0y9iQk
15-
bJH9MGaPLFbkJfwGq+pfpaS/0xI+KwRkG5rQVbpP+jOqGaADOVjuC2J3dNFg71ww
16-
eozmKRjKU16DsFnQJ+N68kWoJ3t776/NzS7p7Oa7k4oijPhGtEAkrKOBzHXLILkZ
17-
kUXYszN4pQGPPuWG2EZpTyAnvrDOwST1VrpGDFMdUy9ML891sMtuf5YM8dSF/WOS
18-
pTmpP4xcb5HciFa+5Hv7242ATVrAirUB6pGA0A9ruxRQPWXwISBRtOIiqqOq2xIi
19-
FX/3TGmzZn7kqw==
13+
BHBw0/IwDwYDVR0jBAgwBoAEcHDT8jANBgkqhkiG9w0BAQsFAAOCAQEAUOIAbhAt
14+
9AniOsPJeHL/K9bnls8zcLark229FIYrglInd53ILSKyC2+g/sOVSue2w3WebLD8
15+
6UkyHxYUsjz1ONla8/HMvYkbWSqCkWczlFzW5WjsTbXhtUIPtfQObnrYg3jtm/Q7
16+
malzKPGseR1F6cHKOzjJ2jo2FHkLrrQIgnKRAMcW0zso2sAzrx1aJnzhEhsZhKXP
17+
kSUGLQoDStRRJHfE5FYMEstTXa2odkCpR19Eha6BhZBxwmfzXjktjIqeHngUy4U3
18+
8815LuzFag+wp3nUQlkSLuwfOiBtpcWB2uzKsY6/1jrf9jcZOd8kyzOphYNngN7u
19+
r0BWefYXe1rFEA==
2020
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)