foreman_leapp 0.0.6 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -20
- data/app/controllers/api/v2/concerns/api_authorizer.rb +27 -0
- data/app/controllers/api/v2/preupgrade_reports_controller.rb +21 -2
- data/app/controllers/preupgrade_reports_controller.rb +11 -1
- data/app/lib/actions/preupgrade_job.rb +2 -1
- data/app/lib/helpers/job_helper.rb +3 -4
- data/app/models/preupgrade_report.rb +1 -0
- data/app/models/preupgrade_report_entry.rb +1 -0
- data/app/views/api/v2/preupgrade_report_entries/base.json.rabl +1 -1
- data/app/views/api/v2/preupgrade_reports/job_invocation.json.rabl +3 -0
- data/app/views/foreman_leapp/job_templates/leapp_check.erb +15 -0
- data/app/views/foreman_leapp/job_templates/{preupgrade.erb → leapp_preupgrade.erb} +5 -2
- data/app/views/foreman_leapp/job_templates/leapp_remediation.erb +29 -0
- data/app/views/foreman_leapp/job_templates/{upgrade.erb → leapp_upgrade.erb} +9 -7
- data/config/routes.rb +2 -1
- data/db/migrate/20200429080939_report_entries_flags.rb +5 -0
- data/db/seeds.d/10_leapp_preupgrade.rb +1 -1
- data/lib/foreman_leapp/engine.rb +7 -6
- data/lib/foreman_leapp/version.rb +1 -1
- data/locale/action_names.rb +6 -0
- data/locale/en/foreman_leapp.po +104 -2
- data/locale/foreman_leapp.pot +164 -8
- data/package.json +3 -2
- data/test/functional/api/v2/preupgrade_reports_controller_test.rb +89 -6
- data/test/functional/preupgrade_reports_controller_test.rb +27 -4
- data/test/unit/actions/preupgrade_job_test.rb +1 -1
- data/test/unit/helpers/job_helper_test.rb +3 -10
- data/webpack/__mocks__/foremanReact/common/I18n.js +1 -1
- data/webpack/__mocks__/foremanReact/components/common/EmptyState.js +1 -0
- data/webpack/components/PreupgradeReports/PreupgradeReports.js +104 -21
- data/webpack/components/PreupgradeReports/PreupgradeReportsActions.js +1 -1
- data/webpack/components/PreupgradeReports/PreupgradeReportsHelpers.js +132 -15
- data/webpack/components/PreupgradeReports/PreupgradeReportsReducer.js +2 -0
- data/webpack/components/PreupgradeReports/PreupgradeReportsSelectors.js +10 -0
- data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.fixtures.js +45 -7
- data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.test.js +17 -1
- data/webpack/components/PreupgradeReports/__tests__/PreupgradeReportsHelpers.test.js +43 -3
- data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReports.test.js.snap +82 -134
- data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsHelpers.test.js.snap +409 -2
- data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsReducer.test.js.snap +21 -1
- data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsSelectors.test.js.snap +17 -1
- data/webpack/components/PreupgradeReports/components/EntriesFilter.js +121 -0
- data/webpack/components/PreupgradeReports/components/EntriesFilter.scss +3 -0
- data/webpack/components/PreupgradeReports/components/EntriesFilter.test.js +30 -0
- data/webpack/components/PreupgradeReports/components/{FixAllButton.js → FixSelectedButton.js} +6 -8
- data/webpack/components/PreupgradeReports/components/FixSelectedButton.test.js +15 -0
- data/webpack/components/PreupgradeReports/components/NoReports.js +35 -0
- data/webpack/components/PreupgradeReports/components/NoReports.test.js +15 -0
- data/webpack/components/PreupgradeReports/components/UpgradeAllButton.js +29 -0
- data/webpack/components/PreupgradeReports/components/{FixAllButton.test.js → UpgradeAllButton.test.js} +3 -4
- data/webpack/components/PreupgradeReports/components/__snapshots__/EntriesFilter.test.js.snap +330 -0
- data/webpack/components/PreupgradeReports/components/__snapshots__/{FixAllButton.test.js.snap → FixSelectedButton.test.js.snap} +9 -3
- data/webpack/components/PreupgradeReports/components/__snapshots__/NoReports.test.js.snap +19 -0
- data/webpack/components/PreupgradeReports/components/__snapshots__/UpgradeAllButton.test.js.snap +29 -0
- data/webpack/components/PreupgradeReports/index.js +22 -4
- data/webpack/components/PreupgradeReportsList/PreupgradeReportList.scss +37 -0
- data/webpack/components/PreupgradeReportsList/__tests__/PreupgradeReportsList.test.js +16 -0
- data/webpack/components/PreupgradeReportsList/__tests__/__snapshots__/PreupgradeReportsList.test.js.snap +38 -0
- data/webpack/components/PreupgradeReportsList/components/InfoItem.js +1 -1
- data/webpack/components/PreupgradeReportsList/components/InhibitorInfoItem.js +33 -0
- data/webpack/components/PreupgradeReportsList/components/PreupgradeReportEntry.js +19 -9
- data/webpack/components/PreupgradeReportsList/components/PreupgradeReportsListHeader.js +56 -0
- data/webpack/components/PreupgradeReportsList/components/SortableHeaderItem.js +50 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/InhibitorInfoItem.test.js +27 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.test.js +2 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportsListHeader.test.js +14 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/SortableHeaderItem.test.js +29 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/InhibitorInfoItem.test.js.snap +32 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportEntry.test.js.snap +23 -17
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportsListHeader.test.js.snap +113 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/SortableHeaderItem.test.js.snap +36 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/helpers.test.js.snap +4 -10
- data/webpack/components/PreupgradeReportsList/components/__tests__/helpers.test.js +0 -2
- data/webpack/components/PreupgradeReportsList/components/foreman_leapp.scss +7 -1
- data/webpack/components/PreupgradeReportsList/components/helpers.js +47 -19
- data/webpack/components/PreupgradeReportsList/components/images/i_severity-critical.svg +61 -0
- data/webpack/components/PreupgradeReportsList/components/images/i_severity-high.svg +61 -0
- data/webpack/components/PreupgradeReportsList/components/images/i_severity-low.svg +62 -0
- data/webpack/components/PreupgradeReportsList/components/images/i_severity-med.svg +62 -0
- data/webpack/components/PreupgradeReportsList/index.js +28 -3
- metadata +54 -18
- data/app/views/foreman_leapp/job_templates/remediation.erb +0 -17
@@ -0,0 +1,29 @@
|
|
1
|
+
import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
|
2
|
+
|
3
|
+
import SortableHeaderItem from '../SortableHeaderItem';
|
4
|
+
|
5
|
+
const changeSort = () => {};
|
6
|
+
|
7
|
+
const fixtures = {
|
8
|
+
'should render when not selected': {
|
9
|
+
changeSort,
|
10
|
+
sort: { attribute: '', order: 'asc' },
|
11
|
+
value: 'severity',
|
12
|
+
title: 'severity',
|
13
|
+
},
|
14
|
+
'should render when selected and sorting asc': {
|
15
|
+
changeSort,
|
16
|
+
sort: { attribute: 'severity', order: 'asc' },
|
17
|
+
value: 'severity',
|
18
|
+
title: 'Severity',
|
19
|
+
},
|
20
|
+
'should render when selected and sorting desc': {
|
21
|
+
changeSort,
|
22
|
+
sort: { attribute: 'severity', order: 'desc' },
|
23
|
+
value: 'severity',
|
24
|
+
title: 'Severity',
|
25
|
+
},
|
26
|
+
};
|
27
|
+
|
28
|
+
describe('SortableHeaderItem', () =>
|
29
|
+
testComponentSnapshotsWithFixtures(SortableHeaderItem, fixtures));
|
@@ -0,0 +1,32 @@
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
+
|
3
|
+
exports[`InhibitorInfoItem should render when inhibitor 1`] = `
|
4
|
+
<InfoItem
|
5
|
+
itemId="inhibitor-5"
|
6
|
+
tooltipText="This issue inhibits the upgrade."
|
7
|
+
>
|
8
|
+
<span>
|
9
|
+
<Icon
|
10
|
+
className="severity-high"
|
11
|
+
name="security"
|
12
|
+
type="pf"
|
13
|
+
/>
|
14
|
+
Inhibitor
|
15
|
+
</span>
|
16
|
+
</InfoItem>
|
17
|
+
`;
|
18
|
+
|
19
|
+
exports[`InhibitorInfoItem should render when not inhibitor 1`] = `
|
20
|
+
<EmptyInfoItem
|
21
|
+
attr="inhibitor"
|
22
|
+
entry={
|
23
|
+
Object {
|
24
|
+
"flags": Array [],
|
25
|
+
"id": 5,
|
26
|
+
"preupgradeReportId": 7,
|
27
|
+
"severity": "low",
|
28
|
+
"title": "no title",
|
29
|
+
}
|
30
|
+
}
|
31
|
+
/>
|
32
|
+
`;
|
@@ -19,16 +19,11 @@ exports[`PreupgradeReportEntry should render 1`] = `
|
|
19
19
|
className=""
|
20
20
|
stacked={false}
|
21
21
|
>
|
22
|
-
<
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
"color": "#39a5dc",
|
27
|
-
}
|
28
|
-
}
|
29
|
-
type="pf"
|
22
|
+
<img
|
23
|
+
alt="Low Risk Factor"
|
24
|
+
className="severity-img"
|
25
|
+
src={[Function]}
|
30
26
|
/>
|
31
|
-
low
|
32
27
|
</ListViewInfoItem>,
|
33
28
|
<EmptyInfoItem
|
34
29
|
attr="remediation"
|
@@ -41,11 +36,25 @@ exports[`PreupgradeReportEntry should render 1`] = `
|
|
41
36
|
}
|
42
37
|
}
|
43
38
|
/>,
|
39
|
+
<InhibitorInfoItem
|
40
|
+
entry={
|
41
|
+
Object {
|
42
|
+
"id": 5,
|
43
|
+
"preupgradeReportId": 7,
|
44
|
+
"severity": "low",
|
45
|
+
"title": "no title",
|
46
|
+
}
|
47
|
+
}
|
48
|
+
/>,
|
44
49
|
]
|
45
50
|
}
|
46
51
|
checkboxInput={
|
47
52
|
<input
|
53
|
+
checked={false}
|
54
|
+
disabled={true}
|
55
|
+
onChange={[Function]}
|
48
56
|
type="checkbox"
|
57
|
+
value={false}
|
49
58
|
/>
|
50
59
|
}
|
51
60
|
compoundExpand={false}
|
@@ -106,14 +115,11 @@ exports[`PreupgradeReportEntry should render 1`] = `
|
|
106
115
|
componentClass="div"
|
107
116
|
md={8}
|
108
117
|
>
|
109
|
-
<
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
}
|
115
|
-
}
|
116
|
-
type="pf"
|
118
|
+
<img
|
119
|
+
alt="Low Risk Factor"
|
120
|
+
className="severity-img"
|
121
|
+
key="5-7-sv5"
|
122
|
+
src={[Function]}
|
117
123
|
/>
|
118
124
|
|
119
125
|
low
|
@@ -0,0 +1,113 @@
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
+
|
3
|
+
exports[`PreupgradeReportsListHeader should render 1`] = `
|
4
|
+
<ListViewItem
|
5
|
+
actions={null}
|
6
|
+
additionalInfo={
|
7
|
+
Array [
|
8
|
+
<InfoItem
|
9
|
+
itemId="0"
|
10
|
+
tooltipText=""
|
11
|
+
>
|
12
|
+
<strong>
|
13
|
+
<SortableHeaderItem
|
14
|
+
changeSort={[Function]}
|
15
|
+
sort={
|
16
|
+
Object {
|
17
|
+
"attribute": "",
|
18
|
+
"order": "asc",
|
19
|
+
}
|
20
|
+
}
|
21
|
+
title="Host"
|
22
|
+
value="hostname"
|
23
|
+
/>
|
24
|
+
</strong>
|
25
|
+
</InfoItem>,
|
26
|
+
<InfoItem
|
27
|
+
itemId="1"
|
28
|
+
tooltipText=""
|
29
|
+
>
|
30
|
+
<strong>
|
31
|
+
<SortableHeaderItem
|
32
|
+
changeSort={[Function]}
|
33
|
+
sort={
|
34
|
+
Object {
|
35
|
+
"attribute": "",
|
36
|
+
"order": "asc",
|
37
|
+
}
|
38
|
+
}
|
39
|
+
title="Risk Factor"
|
40
|
+
value="severity"
|
41
|
+
/>
|
42
|
+
</strong>
|
43
|
+
</InfoItem>,
|
44
|
+
<InfoItem
|
45
|
+
itemId="2"
|
46
|
+
tooltipText=""
|
47
|
+
>
|
48
|
+
<strong>
|
49
|
+
<SortableHeaderItem
|
50
|
+
changeSort={[Function]}
|
51
|
+
sort={
|
52
|
+
Object {
|
53
|
+
"attribute": "",
|
54
|
+
"order": "asc",
|
55
|
+
}
|
56
|
+
}
|
57
|
+
title="Has Remediation?"
|
58
|
+
value="fix"
|
59
|
+
/>
|
60
|
+
</strong>
|
61
|
+
</InfoItem>,
|
62
|
+
<InfoItem
|
63
|
+
itemId="3"
|
64
|
+
tooltipText=""
|
65
|
+
>
|
66
|
+
<strong>
|
67
|
+
<SortableHeaderItem
|
68
|
+
changeSort={[Function]}
|
69
|
+
sort={
|
70
|
+
Object {
|
71
|
+
"attribute": "",
|
72
|
+
"order": "asc",
|
73
|
+
}
|
74
|
+
}
|
75
|
+
title="Inhibitor?"
|
76
|
+
value="inhibitor"
|
77
|
+
/>
|
78
|
+
</strong>
|
79
|
+
</InfoItem>,
|
80
|
+
]
|
81
|
+
}
|
82
|
+
checkboxInput={
|
83
|
+
<input
|
84
|
+
onClick={[Function]}
|
85
|
+
type="checkbox"
|
86
|
+
/>
|
87
|
+
}
|
88
|
+
className="list-view-header"
|
89
|
+
compoundExpand={false}
|
90
|
+
compoundExpanded={false}
|
91
|
+
description={
|
92
|
+
<SortableHeaderItem
|
93
|
+
changeSort={[Function]}
|
94
|
+
sort={
|
95
|
+
Object {
|
96
|
+
"attribute": "",
|
97
|
+
"order": "asc",
|
98
|
+
}
|
99
|
+
}
|
100
|
+
title="Title"
|
101
|
+
value="title"
|
102
|
+
/>
|
103
|
+
}
|
104
|
+
heading={null}
|
105
|
+
hideCloseIcon={true}
|
106
|
+
initExpanded={false}
|
107
|
+
leftContent={null}
|
108
|
+
onCloseCompoundExpand={[Function]}
|
109
|
+
onExpand={[Function]}
|
110
|
+
onExpandClose={[Function]}
|
111
|
+
stacked={true}
|
112
|
+
/>
|
113
|
+
`;
|
@@ -0,0 +1,36 @@
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
+
|
3
|
+
exports[`SortableHeaderItem should render when not selected 1`] = `
|
4
|
+
<span
|
5
|
+
className="sortable-header "
|
6
|
+
onClick={[Function]}
|
7
|
+
>
|
8
|
+
severity
|
9
|
+
</span>
|
10
|
+
`;
|
11
|
+
|
12
|
+
exports[`SortableHeaderItem should render when selected and sorting asc 1`] = `
|
13
|
+
<span
|
14
|
+
className="sortable-header active"
|
15
|
+
onClick={[Function]}
|
16
|
+
>
|
17
|
+
<Icon
|
18
|
+
name="angle-up"
|
19
|
+
type="fa"
|
20
|
+
/>
|
21
|
+
Severity
|
22
|
+
</span>
|
23
|
+
`;
|
24
|
+
|
25
|
+
exports[`SortableHeaderItem should render when selected and sorting desc 1`] = `
|
26
|
+
<span
|
27
|
+
className="sortable-header active"
|
28
|
+
onClick={[Function]}
|
29
|
+
>
|
30
|
+
<Icon
|
31
|
+
name="angle-down"
|
32
|
+
type="fa"
|
33
|
+
/>
|
34
|
+
Severity
|
35
|
+
</span>
|
36
|
+
`;
|
@@ -44,8 +44,6 @@ Array [
|
|
44
44
|
]
|
45
45
|
`;
|
46
46
|
|
47
|
-
exports[`PreupgradeReportList/helpers should return hex for severity 1`] = `"#39a5dc"`;
|
48
|
-
|
49
47
|
exports[`PreupgradeReportList/helpers should return remediations 1`] = `
|
50
48
|
Array [
|
51
49
|
<Row
|
@@ -93,14 +91,10 @@ exports[`PreupgradeReportList/helpers should return severity 1`] = `
|
|
93
91
|
componentClass="div"
|
94
92
|
md={8}
|
95
93
|
>
|
96
|
-
<
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
"color": "#cc0000",
|
101
|
-
}
|
102
|
-
}
|
103
|
-
type="pf"
|
94
|
+
<img
|
95
|
+
alt="High Risk Factor"
|
96
|
+
className="severity-img"
|
97
|
+
src={[Function]}
|
104
98
|
/>
|
105
99
|
|
106
100
|
high
|
@@ -1,7 +1,6 @@
|
|
1
1
|
import { testSelectorsSnapshotWithFixtures } from '@theforeman/test';
|
2
2
|
|
3
3
|
import {
|
4
|
-
presentSeverity,
|
5
4
|
tagInfo,
|
6
5
|
hasRemediations,
|
7
6
|
getTitle,
|
@@ -15,7 +14,6 @@ import {
|
|
15
14
|
import { reportEntry } from './PreupgradeReportEntry.fixtures';
|
16
15
|
|
17
16
|
const fixtures = {
|
18
|
-
'should return hex for severity': () => presentSeverity('low'),
|
19
17
|
'should return tag info': () => tagInfo(reportEntry.tags),
|
20
18
|
'should detect if has remediations': () => hasRemediations(reportEntry),
|
21
19
|
'should return title': () => getTitle(reportEntry),
|
@@ -1,23 +1,13 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { Grid, ListView, Badge, Icon } from 'patternfly-react';
|
3
3
|
import EmptyInfoItem from './EmptyInfoItem';
|
4
|
+
import SeverityHigh from './images/i_severity-high.svg';
|
5
|
+
import SeverityMedium from './images/i_severity-med.svg';
|
6
|
+
import SeverityLow from './images/i_severity-low.svg';
|
4
7
|
|
5
8
|
export const itemIteratorId = (entry, ...rest) =>
|
6
9
|
`${entry.id}-${entry.preupgradeReportId}-${rest.join('-')}`;
|
7
10
|
|
8
|
-
export const presentSeverity = severity => {
|
9
|
-
switch (severity) {
|
10
|
-
case 'low':
|
11
|
-
return '#39a5dc';
|
12
|
-
case 'medium':
|
13
|
-
return '#f0ab00';
|
14
|
-
case 'high':
|
15
|
-
return '#cc0000';
|
16
|
-
default:
|
17
|
-
return '#39a5dc';
|
18
|
-
}
|
19
|
-
};
|
20
|
-
|
21
11
|
export const tagInfo = tags =>
|
22
12
|
tags.map(attr => (
|
23
13
|
<Badge key={attr} variant="pill primary">
|
@@ -25,6 +15,49 @@ export const tagInfo = tags =>
|
|
25
15
|
</Badge>
|
26
16
|
));
|
27
17
|
|
18
|
+
export const getSeverityImg = entry => {
|
19
|
+
const key = itemIteratorId(entry, `sv${entry.id}`);
|
20
|
+
|
21
|
+
switch (entry.severity) {
|
22
|
+
case 'low':
|
23
|
+
return (
|
24
|
+
<img
|
25
|
+
key={key}
|
26
|
+
src={SeverityLow}
|
27
|
+
alt="Low Risk Factor"
|
28
|
+
className="severity-img"
|
29
|
+
/>
|
30
|
+
);
|
31
|
+
case 'medium':
|
32
|
+
return (
|
33
|
+
<img
|
34
|
+
key={key}
|
35
|
+
src={SeverityMedium}
|
36
|
+
alt="Medium Risk Factor"
|
37
|
+
className="severity-img"
|
38
|
+
/>
|
39
|
+
);
|
40
|
+
case 'high':
|
41
|
+
return (
|
42
|
+
<img
|
43
|
+
key={key}
|
44
|
+
src={SeverityHigh}
|
45
|
+
alt="High Risk Factor"
|
46
|
+
className="severity-img"
|
47
|
+
/>
|
48
|
+
);
|
49
|
+
default:
|
50
|
+
return (
|
51
|
+
<img
|
52
|
+
key={key}
|
53
|
+
src={SeverityLow}
|
54
|
+
alt="Low Risk Factor"
|
55
|
+
className="severity-img"
|
56
|
+
/>
|
57
|
+
);
|
58
|
+
}
|
59
|
+
};
|
60
|
+
|
28
61
|
export const hasRemediations = entry => {
|
29
62
|
const key = itemIteratorId(entry, `rm${entry.id}`);
|
30
63
|
if (entry.detail && entry.detail.remediations) {
|
@@ -60,12 +93,7 @@ export const getSeverity = entry => {
|
|
60
93
|
<strong>Risk Factor</strong>
|
61
94
|
</Grid.Col>
|
62
95
|
<Grid.Col md={8}>
|
63
|
-
|
64
|
-
type="pf"
|
65
|
-
name="resources-full"
|
66
|
-
style={{ color: presentSeverity(entry.severity) }}
|
67
|
-
/>{' '}
|
68
|
-
{entry.severity}
|
96
|
+
{getSeverityImg(entry)} {entry.severity}
|
69
97
|
</Grid.Col>
|
70
98
|
</Grid.Row>
|
71
99
|
);
|
@@ -0,0 +1,61 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
|
4
|
+
<svg
|
5
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
6
|
+
xmlns:cc="http://creativecommons.org/ns#"
|
7
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
8
|
+
xmlns:svg="http://www.w3.org/2000/svg"
|
9
|
+
xmlns="http://www.w3.org/2000/svg"
|
10
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
11
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
12
|
+
version="1.1"
|
13
|
+
id="Layer_1"
|
14
|
+
x="0px"
|
15
|
+
y="0px"
|
16
|
+
viewBox="0 0 146 166"
|
17
|
+
style="enable-background:new 0 0 146 166;"
|
18
|
+
xml:space="preserve"
|
19
|
+
sodipodi:docname="i_critical.svg"
|
20
|
+
inkscape:version="0.92.1 r"><metadata
|
21
|
+
id="metadata4612"><rdf:RDF><cc:Work
|
22
|
+
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
23
|
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
24
|
+
id="defs4610" /><sodipodi:namedview
|
25
|
+
pagecolor="#ffffff"
|
26
|
+
bordercolor="#666666"
|
27
|
+
borderopacity="1"
|
28
|
+
objecttolerance="10"
|
29
|
+
gridtolerance="10"
|
30
|
+
guidetolerance="10"
|
31
|
+
inkscape:pageopacity="0"
|
32
|
+
inkscape:pageshadow="2"
|
33
|
+
inkscape:window-width="1920"
|
34
|
+
inkscape:window-height="1055"
|
35
|
+
id="namedview4608"
|
36
|
+
showgrid="false"
|
37
|
+
inkscape:zoom="1.4216867"
|
38
|
+
inkscape:cx="73"
|
39
|
+
inkscape:cy="83"
|
40
|
+
inkscape:window-x="0"
|
41
|
+
inkscape:window-y="1050"
|
42
|
+
inkscape:window-maximized="1"
|
43
|
+
inkscape:current-layer="Layer_1" /><style
|
44
|
+
type="text/css"
|
45
|
+
id="style4593">
|
46
|
+
.st0{fill:#808080;}
|
47
|
+
.st1{fill:#CC0000;}
|
48
|
+
</style><g
|
49
|
+
id="g4605"><path
|
50
|
+
class="st1"
|
51
|
+
d="M114.6,143.3H31c-7.2,0-13-4.8-13-10.6l0,0c0-5.9,5.9-10.6,13-10.6h83.6c7.2,0,13,4.8,13,10.6l0,0 C127.7,138.5,121.8,143.3,114.6,143.3z"
|
52
|
+
id="path4597" /><path
|
53
|
+
class="st1"
|
54
|
+
d="M114.6,110.2H31c-7.2,0-13-4.8-13-10.6l0,0C18,93.7,23.9,89,31,89h83.6c7.2,0,13,4.8,13,10.6l0,0 C127.7,105.4,121.8,110.2,114.6,110.2z"
|
55
|
+
id="path4599" /><path
|
56
|
+
class="st1"
|
57
|
+
d="M115,77.1H31.4c-7.2,0-13-4.8-13-10.6l0,0c0-5.9,5.9-10.6,13-10.6H115c7.2,0,13,4.8,13,10.6l0,0 C128,72.3,122.1,77.1,115,77.1z"
|
58
|
+
id="path4601" /><path
|
59
|
+
class="st1"
|
60
|
+
d="M114.6,44H31c-7.2,0-13-4.8-13-10.6l0,0c0-5.9,5.9-10.7,13-10.7h83.6c7.2,0,13,4.8,13,10.6l0,0 C127.7,39.2,121.8,44,114.6,44z"
|
61
|
+
id="path4603" /></g></svg>
|