eddy 0.8.4 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -4
- data/CHANGELOG.md +18 -0
- data/Gemfile.lock +8 -8
- data/README.md +1 -1
- data/data/code-lists/333.tsv +8 -0
- data/data/segments/amt.segment.yml +7 -0
- data/data/segments/bia.segment.yml +10 -0
- data/data/segments/cur.segment.yml +8 -0
- data/data/segments/dtm.segment.yml +1 -0
- data/data/segments/fob.segment.yml +8 -0
- data/data/segments/itd.segment.yml +13 -0
- data/data/segments/mtx.segment.yml +7 -0
- data/data/segments/n9.segment.yml +7 -0
- data/data/segments/per.segment.yml +13 -0
- data/data/segments/po1.segment.yml +6 -0
- data/data/segments/po3.segment.yml +13 -0
- data/data/segments/qty.segment.yml +10 -0
- data/data/segments/ref.segment.yml +1 -0
- data/data/segments/sac.segment.yml +4 -0
- data/data/segments/sch.segment.yml +7 -0
- data/data/segments/sdq.segment.yml +8 -0
- data/data/segments/txi.segment.yml +9 -0
- data/data/transaction_sets/810.edi.yml +93 -0
- data/data/transaction_sets/846.edi.yml +57 -0
- data/data/transaction_sets/850.edi.yml +73 -0
- data/data/transaction_sets/855.edi.yml +74 -0
- data/data/transaction_sets/856.edi.yml +54 -0
- data/eddy.gemspec +1 -1
- data/exe/eddy +1 -0
- data/lib/definitions/elements/generated/100.currency_code.rb +200 -0
- data/lib/definitions/elements/generated/146.shipment_method_of_payment.rb +65 -0
- data/lib/definitions/elements/generated/1551.message_text.rb +29 -0
- data/lib/definitions/elements/generated/280.exchange_rate.rb +29 -0
- data/lib/definitions/elements/generated/309.location_qualifier.rb +209 -0
- data/lib/definitions/elements/generated/310.location_identifier.rb +29 -0
- data/lib/definitions/elements/generated/311.shipment_type_code.rb +42 -0
- data/lib/definitions/elements/generated/322.load_empty_status_code.rb +40 -0
- data/lib/definitions/elements/generated/325.tax_identification_number.rb +29 -0
- data/lib/definitions/elements/generated/333.terms_basis_date_code.rb +44 -0
- data/lib/definitions/elements/generated/336.terms_type_code.rb +102 -0
- data/lib/definitions/elements/generated/338.terms_discount_percent.rb +29 -0
- data/lib/definitions/elements/generated/351.terms_discount_days_due.rb +30 -0
- data/lib/definitions/elements/generated/363.note_reference_code.rb +278 -0
- data/lib/definitions/elements/generated/364.communication_number.rb +29 -0
- data/lib/definitions/elements/generated/365.communication_number_qualifier.rb +77 -0
- data/lib/definitions/elements/generated/366.contact_function_code.rb +267 -0
- data/lib/definitions/elements/generated/369.free_form_description.rb +29 -0
- data/lib/definitions/elements/generated/370.terms_discount_due_date.rb +29 -0
- data/lib/definitions/elements/generated/371.change_reason_code.rb +67 -0
- data/lib/definitions/elements/generated/378.allowance_charge_percent_qualifier.rb +48 -0
- data/lib/definitions/elements/generated/386.terms_net_days.rb +30 -0
- data/lib/definitions/elements/generated/446.terms_net_due_date.rb +29 -0
- data/lib/definitions/elements/generated/522.amount_qualifier_code.rb +1510 -0
- data/lib/definitions/elements/generated/673.quantity_qualifier.rb +869 -0
- data/lib/definitions/elements/generated/755.report_type_code.rb +559 -0
- data/lib/definitions/elements/generated/954.percent.rb +29 -0
- data/lib/definitions/elements/generated/963.tax_type_code.rb +111 -0
- data/lib/definitions/segments/generated/amt.rb +56 -0
- data/lib/definitions/segments/generated/bia.rb +107 -0
- data/lib/definitions/segments/generated/cur.rb +73 -0
- data/lib/definitions/segments/generated/dtm.rb +17 -0
- data/lib/definitions/segments/generated/fob.rb +73 -0
- data/lib/definitions/segments/generated/hl.rb +90 -0
- data/lib/definitions/segments/generated/itd.rb +158 -0
- data/lib/definitions/segments/generated/mtx.rb +56 -0
- data/lib/definitions/segments/generated/n2.rb +56 -0
- data/lib/definitions/segments/generated/n9.rb +56 -0
- data/lib/definitions/segments/generated/per.rb +158 -0
- data/lib/definitions/segments/generated/po1.rb +102 -0
- data/lib/definitions/segments/generated/po3.rb +158 -0
- data/lib/definitions/segments/generated/qty.rb +73 -0
- data/lib/definitions/segments/generated/ref.rb +17 -0
- data/lib/definitions/segments/generated/sac.rb +68 -0
- data/lib/definitions/segments/generated/sch.rb +56 -0
- data/lib/definitions/segments/generated/sdq.rb +73 -0
- data/lib/definitions/segments/generated/txi.rb +90 -0
- data/lib/definitions/transaction_sets/manual/846/846.rb +122 -0
- data/lib/definitions/transaction_sets/manual/846/loops/lin.rb +155 -0
- data/lib/definitions/transaction_sets/manual/846/loops/n1.rb +107 -0
- data/lib/definitions/transaction_sets/manual/846/loops/qty.rb +75 -0
- data/lib/definitions/transaction_sets/manual/846/loops/sch.rb +59 -0
- data/lib/definitions/transaction_sets/manual/846/loops/sln.rb +59 -0
- data/lib/definitions/transaction_sets/manual/850/850.rb +108 -1
- data/lib/definitions/transaction_sets/manual/850/loops/ctp.rb +47 -0
- data/lib/definitions/transaction_sets/manual/850/loops/n1.rb +31 -10
- data/lib/definitions/transaction_sets/manual/850/loops/n9.rb +59 -0
- data/lib/definitions/transaction_sets/manual/850/loops/pid.rb +47 -0
- data/lib/definitions/transaction_sets/manual/850/loops/po1.rb +78 -10
- data/lib/definitions/transaction_sets/manual/850/loops/sac.rb +47 -0
- data/lib/eddy.rb +49 -3
- data/lib/eddy/build/transaction_set_builder.rb +1 -1
- data/lib/eddy/config.rb +0 -21
- data/lib/eddy/data.rb +0 -29
- data/lib/eddy/data/persistence/base.rb +7 -0
- data/lib/eddy/data/persistence/memory.rb +14 -4
- data/lib/eddy/errors.rb +13 -9
- data/lib/eddy/models/element/composite.rb +2 -0
- data/lib/eddy/models/element/id.rb +1 -1
- data/lib/eddy/models/element/r.rb +1 -0
- data/lib/eddy/parse.rb +4 -56
- data/lib/eddy/parse/interchange.rb +58 -0
- data/lib/eddy/summary/loop.rb +1 -1
- data/lib/eddy/summary/segment.rb +2 -1
- data/lib/eddy/version.rb +1 -1
- metadata +78 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8bc43221c915e9c746ad1adef91ee612a9a86e37529622960274bc052333fad1
|
4
|
+
data.tar.gz: 7520602c3ef65f24b40a3fd7ea007f41c568cb07a304e038bab4f9617cc7bc41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38311350797183f796764ee49f24c75212c45a88711833b445e110c40eb1206c46ffcd5594acd60051166930bab08eba726ed95ba7cfc9f9a68d9c7ea254e34a
|
7
|
+
data.tar.gz: 0d7d474a09a527c424e4db1fe3809593413648c869b9d1328cfe5d10f018b92bfdb49a839d5a446fb41fa6d4c2e753fe4ee3455db4f6d31eca191bb16ee21925
|
data/.rubocop.yml
CHANGED
@@ -83,6 +83,10 @@ Naming/HeredocDelimiterNaming:
|
|
83
83
|
Style/FormatString:
|
84
84
|
EnforcedStyle: sprintf
|
85
85
|
|
86
|
+
Style/FormatStringToken:
|
87
|
+
# EnforcedStyle: template
|
88
|
+
Enabled: false
|
89
|
+
|
86
90
|
# ==============================================================================
|
87
91
|
# Numbers
|
88
92
|
# ==============================================================================
|
@@ -107,10 +111,6 @@ Style/DefWithParentheses:
|
|
107
111
|
Style/MethodCallWithoutArgsParentheses:
|
108
112
|
Enabled: false
|
109
113
|
|
110
|
-
# Only use braces if the function expects a hash argument. [different in Ruby 2.7+](https://blog.saeloun.com/2019/10/07/ruby-2-7-keyword-arguments-redesign.html)
|
111
|
-
Style/BracesAroundHashParameters:
|
112
|
-
Enabled: false
|
113
|
-
|
114
114
|
Style/WordArray:
|
115
115
|
EnforcedStyle: brackets
|
116
116
|
|
data/CHANGELOG.md
CHANGED
@@ -13,6 +13,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
13
13
|
|
14
14
|
## master (unreleased)
|
15
15
|
|
16
|
+
## 0.9.0 (2020-07-03)
|
17
|
+
|
18
|
+
### Added
|
19
|
+
|
20
|
+
- New Transaction Set definition:
|
21
|
+
- 846
|
22
|
+
- New Segment definitions:
|
23
|
+
- BIA
|
24
|
+
- CUR
|
25
|
+
- PER
|
26
|
+
- QTY
|
27
|
+
- SCH
|
28
|
+
- SDQ
|
29
|
+
|
30
|
+
### Fixed
|
31
|
+
|
32
|
+
- Updated method call in `Eddy::Build::TransactionSetBuilder#build_loops`.
|
33
|
+
|
16
34
|
## 0.8.4 (2020-01-15)
|
17
35
|
|
18
36
|
### Changed
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
eddy (0.
|
4
|
+
eddy (0.9.0)
|
5
5
|
ginny (~> 0.6.3)
|
6
6
|
json_schemer (~> 0.2.8)
|
7
7
|
thor (~> 1.0.1)
|
@@ -21,14 +21,14 @@ GEM
|
|
21
21
|
tins (~> 1.6)
|
22
22
|
docile (1.3.2)
|
23
23
|
dry-inflector (0.2.0)
|
24
|
-
ecma-re-validator (0.2.
|
24
|
+
ecma-re-validator (0.2.1)
|
25
25
|
regexp_parser (~> 1.2)
|
26
26
|
ginny (0.6.3)
|
27
27
|
coolkit (~> 0.2.2)
|
28
28
|
dry-inflector (~> 0.2.0)
|
29
|
-
hana (1.3.
|
29
|
+
hana (1.3.6)
|
30
30
|
json (2.3.0)
|
31
|
-
json_schemer (0.2.
|
31
|
+
json_schemer (0.2.11)
|
32
32
|
ecma-re-validator (~> 0.2)
|
33
33
|
hana (~> 1.3)
|
34
34
|
regexp_parser (~> 1.5)
|
@@ -45,8 +45,8 @@ GEM
|
|
45
45
|
pry (0.12.2)
|
46
46
|
coderay (~> 1.1.0)
|
47
47
|
method_source (~> 0.9.0)
|
48
|
-
rake (
|
49
|
-
regexp_parser (1.
|
48
|
+
rake (13.0.1)
|
49
|
+
regexp_parser (1.7.1)
|
50
50
|
ruby-progressbar (1.10.1)
|
51
51
|
simplecov (0.16.1)
|
52
52
|
docile (~> 1.1)
|
@@ -70,8 +70,8 @@ DEPENDENCIES
|
|
70
70
|
minitest-focus (~> 1.1)
|
71
71
|
minitest-reporters (~> 1.4)
|
72
72
|
pry (~> 0.12.2)
|
73
|
-
rake (~>
|
73
|
+
rake (~> 13.0)
|
74
74
|
simplecov (~> 0.16)
|
75
75
|
|
76
76
|
BUNDLED WITH
|
77
|
-
2.
|
77
|
+
2.1.4
|
data/README.md
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
[travis-ci]: https://travis-ci.org/tcd/eddy
|
11
11
|
[coveralls]: https://coveralls.io/github/tcd/eddy?branch=master
|
12
12
|
[license]: https://github.com/tcd/eddy/blob/master/LICENSE.txt
|
13
|
-
[docs]: https://www.rubydoc.info/gems/eddy/0.
|
13
|
+
[docs]: https://www.rubydoc.info/gems/eddy/0.9.0
|
14
14
|
|
15
15
|
## Installation
|
16
16
|
|
@@ -0,0 +1,10 @@
|
|
1
|
+
---
|
2
|
+
id: BIA
|
3
|
+
name: Beginning Segment for Inventory Inquiry/Advice
|
4
|
+
purpose: To indicate the beginning of an Inventory Inquiry/Advice Transaction Set
|
5
|
+
elements:
|
6
|
+
- { ref: BIA01, id: '353', req: M }
|
7
|
+
- { ref: BIA02, id: '755', req: M }
|
8
|
+
- { ref: BIA03, id: '127', req: M }
|
9
|
+
- { ref: BIA04, id: '373', req: M }
|
10
|
+
- { ref: BIA05, id: '337', req: O }
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
id: ITD
|
3
|
+
name: Terms of Sale/Deferred Terms of Sale
|
4
|
+
purpose: To specify terms of sale.
|
5
|
+
elements:
|
6
|
+
- { ref: ITD01, id: '336', req: O }
|
7
|
+
- { ref: ITD02, id: '333', req: O }
|
8
|
+
- { ref: ITD03, id: '338', req: O }
|
9
|
+
- { ref: ITD04, id: '370', req: X }
|
10
|
+
- { ref: ITD05, id: '351', req: X }
|
11
|
+
- { ref: ITD06, id: '446', req: O }
|
12
|
+
- { ref: ITD07, id: '386', req: O }
|
13
|
+
- { ref: ITD12, id: '352', req: O }
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
id: PER
|
3
|
+
name: Administrative Communications Contact
|
4
|
+
purpose: To identify a person or office to whom administrative communications should be directed
|
5
|
+
elements:
|
6
|
+
- { ref: PER01, id: '366', req: M }
|
7
|
+
- { ref: PER02, id: '93', req: O }
|
8
|
+
- { ref: PER03, id: '365', req: X }
|
9
|
+
- { ref: PER04, id: '364', req: X }
|
10
|
+
- { ref: PER05, id: '365', req: X }
|
11
|
+
- { ref: PER06, id: '364', req: X }
|
12
|
+
- { ref: PER07, id: '365', req: X }
|
13
|
+
- { ref: PER08, id: '364', req: X }
|
@@ -12,3 +12,9 @@ elements:
|
|
12
12
|
- { ref: PO107, id: '234', req: X }
|
13
13
|
- { ref: PO108, id: '235', req: X }
|
14
14
|
- { ref: PO109, id: '234', req: X }
|
15
|
+
- { ref: PO110, id: '235', req: X }
|
16
|
+
- { ref: PO111, id: '234', req: X }
|
17
|
+
- { ref: PO112, id: '235', req: X }
|
18
|
+
- { ref: PO113, id: '234', req: X }
|
19
|
+
- { ref: PO114, id: '235', req: X }
|
20
|
+
- { ref: PO115, id: '234', req: X }
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
id: PO3
|
3
|
+
name: Additional Item Detail
|
4
|
+
purpose: To specify additional item-related data involving variations in normal price/quantity structure.
|
5
|
+
elements:
|
6
|
+
- { ref: PO301, id: '371', req: M }
|
7
|
+
- { ref: PO302, id: '373', req: O }
|
8
|
+
- { ref: PO303, id: '236', req: X }
|
9
|
+
- { ref: PO304, id: '212', req: O }
|
10
|
+
- { ref: PO305, id: '639', req: X }
|
11
|
+
- { ref: PO306, id: '380', req: M }
|
12
|
+
- { ref: PO307, id: '355', req: M }
|
13
|
+
- { ref: PO308, id: '352', req: O }
|
@@ -0,0 +1,10 @@
|
|
1
|
+
---
|
2
|
+
id: QTY
|
3
|
+
name: Quantity Information
|
4
|
+
purpose: To specify quantity information
|
5
|
+
elements:
|
6
|
+
- { ref: QTY01, id: '673', req: M }
|
7
|
+
- { ref: QTY02, id: '380', req: X }
|
8
|
+
- { ref: QTY03, id: '355', req: M }
|
9
|
+
# - { ref: QTY03, id: 'C001', req: O }
|
10
|
+
# - { ref: QTY03-01, id: '355', req: M }
|
@@ -8,6 +8,10 @@ elements:
|
|
8
8
|
- { ref: SAC03, id: '559', req: X }
|
9
9
|
- { ref: SAC04, id: '1301', req: X }
|
10
10
|
- { ref: SAC05, id: '610', req: O }
|
11
|
+
- { ref: SAC06, id: '378', req: X }
|
12
|
+
- { ref: SAC07, id: '322', req: X }
|
13
|
+
- { ref: SAC12, id: '311', req: O }
|
14
|
+
- { ref: SAC15, id: '352', req: X }
|
11
15
|
notes: |
|
12
16
|
1.R0203 - At least one of SAC02 or SAC03 is required.
|
13
17
|
2.P0304 - If either SAC03 or SAC04 is present, then the other is required.
|
@@ -0,0 +1,93 @@
|
|
1
|
+
---
|
2
|
+
id: 810
|
3
|
+
functional_group: IN
|
4
|
+
name: Invoice
|
5
|
+
components:
|
6
|
+
|
7
|
+
- id: BIG
|
8
|
+
req: M
|
9
|
+
element_count: 5
|
10
|
+
|
11
|
+
- id: REF
|
12
|
+
req: O
|
13
|
+
element_count: 2
|
14
|
+
|
15
|
+
- loop_id: N1
|
16
|
+
repeat: 200
|
17
|
+
components:
|
18
|
+
- id: N1
|
19
|
+
req: O
|
20
|
+
max_use: 1
|
21
|
+
element_count: 3
|
22
|
+
elements:
|
23
|
+
- { ref: N101, id: '98', req: M }
|
24
|
+
- { ref: N103, id: '66', req: X }
|
25
|
+
- { ref: N104, id: '67', req: X }
|
26
|
+
- id: N3
|
27
|
+
req: O
|
28
|
+
max_use: 2
|
29
|
+
element_count: 2
|
30
|
+
elements:
|
31
|
+
- { ref: N301, id: '166', req: M }
|
32
|
+
- { ref: N302, id: '166', req: O }
|
33
|
+
- id: N4
|
34
|
+
req: O
|
35
|
+
max_use: 2
|
36
|
+
element_count: 3
|
37
|
+
elements:
|
38
|
+
- { ref: N401, id: '19', req: O }
|
39
|
+
- { ref: N402, id: '156', req: O }
|
40
|
+
- { ref: N403, id: '116', req: O }
|
41
|
+
|
42
|
+
- id: DTM
|
43
|
+
req: O
|
44
|
+
element_count: 2
|
45
|
+
elements:
|
46
|
+
- { ref: DTM01, id: '374', req: M }
|
47
|
+
- { ref: DTM02, id: '373', req: X }
|
48
|
+
|
49
|
+
- loop_id: IT1
|
50
|
+
repeat: 200000
|
51
|
+
components:
|
52
|
+
- id: IT1
|
53
|
+
req: O
|
54
|
+
element_count: 14
|
55
|
+
- id: CTP
|
56
|
+
req: O
|
57
|
+
element_count: 6
|
58
|
+
- loop_id: PID
|
59
|
+
repeat: 1000
|
60
|
+
req: M
|
61
|
+
components:
|
62
|
+
- id: PID
|
63
|
+
req: O
|
64
|
+
element_count: 2
|
65
|
+
- loop_id: SAC
|
66
|
+
repeat: 25
|
67
|
+
req: O
|
68
|
+
components:
|
69
|
+
- id: SAC
|
70
|
+
req: O
|
71
|
+
element_count: 3
|
72
|
+
|
73
|
+
- id: TDS
|
74
|
+
req: M
|
75
|
+
element_count: 1
|
76
|
+
|
77
|
+
- id: CAD
|
78
|
+
req: O
|
79
|
+
element_count: 1
|
80
|
+
|
81
|
+
- loop_id: SAC
|
82
|
+
repeat: 25
|
83
|
+
req: O
|
84
|
+
components:
|
85
|
+
- id: SAC
|
86
|
+
req: O
|
87
|
+
element_count: 3
|
88
|
+
|
89
|
+
- id: CTT
|
90
|
+
req: O
|
91
|
+
element_count: 1
|
92
|
+
elements:
|
93
|
+
- { ref: CTT01, id: '354', req: M }
|
@@ -0,0 +1,57 @@
|
|
1
|
+
---
|
2
|
+
id: 846
|
3
|
+
functional_group: IB
|
4
|
+
name: Inventory Inquiry/Advice
|
5
|
+
components:
|
6
|
+
- { id: BIA, req: M, max_use: 1 }
|
7
|
+
- { id: CUR, req: O, max_use: 1 }
|
8
|
+
- { id: DTM, req: O, max_use: 10 }
|
9
|
+
- { id: REF, req: O, max_use: 12 }
|
10
|
+
- { id: PER, req: O, max_use: 3 }
|
11
|
+
- loop_id: N1
|
12
|
+
repeat: 5
|
13
|
+
components:
|
14
|
+
- { id: N1, req: O, max_use: 1 }
|
15
|
+
- { id: N2, req: O, max_use: 2 }
|
16
|
+
- { id: N3, req: O, max_use: 2 }
|
17
|
+
- { id: N4, req: O, max_use: 1 }
|
18
|
+
- { id: REF, req: O, max_use: 12 }
|
19
|
+
- { id: PER, req: O, max_use: 3 }
|
20
|
+
- loop_id: LIN
|
21
|
+
repeat: 10000
|
22
|
+
components:
|
23
|
+
- { id: LIN, req: M, max_use: 1 }
|
24
|
+
- { id: PID, req: O, max_use: 200 }
|
25
|
+
- { id: DTM, req: O, max_use: 10 }
|
26
|
+
- { id: CTP, req: O, max_use: 25 }
|
27
|
+
- { id: REF, req: O, usage: must_use }
|
28
|
+
- { id: SDQ, req: O, max_use: 500 }
|
29
|
+
- loop_id: SLN
|
30
|
+
repeat: 1000
|
31
|
+
components:
|
32
|
+
- { id: SLN, req: O, max_use: 1 }
|
33
|
+
- { id: PID, req: O, max_use: 200 }
|
34
|
+
- loop_id: QTY
|
35
|
+
repeat: 99
|
36
|
+
components:
|
37
|
+
- { id: QTY, req: O, max_use: 1 }
|
38
|
+
- { id: DTM, req: O, max_use: 10 }
|
39
|
+
- loop_id: SCH
|
40
|
+
repeat: 25
|
41
|
+
components:
|
42
|
+
- { id: QTY, req: O, max_use: 1 }
|
43
|
+
- { id: DTM, req: O, max_use: 10 }
|
44
|
+
- loop_id: N1
|
45
|
+
repeat: 200
|
46
|
+
components:
|
47
|
+
- { id: N1, req: O, max_use: 1 }
|
48
|
+
- { id: N2, req: O, max_use: 2 }
|
49
|
+
- { id: N3, req: O, max_use: 2 }
|
50
|
+
- { id: N4, req: O, max_use: 1 }
|
51
|
+
- { id: REF, req: O, max_use: 12 }
|
52
|
+
- { id: PER, req: O, max_use: 3 }
|
53
|
+
- id: CTT
|
54
|
+
req: O
|
55
|
+
elements:
|
56
|
+
- { ref: CTT01, id: '354', req: M }
|
57
|
+
- { ref: CTT02, id: '347', req: O }
|