arelle-release 2.37.35__py3-none-any.whl → 2.37.37__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of arelle-release might be problematic. Click here for more details.
- arelle/FileSource.py +4 -2
- arelle/Validate.py +1 -1
- arelle/XbrlConst.py +3 -0
- arelle/_version.py +2 -2
- arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +26 -0
- arelle/plugin/validate/EDINET/rules/frta.py +78 -3
- arelle/plugin/validate/EDINET/rules/gfm.py +220 -3
- arelle/plugin/validate/ESEF/resources/authority-validations.json +10 -1
- arelle/plugin/validate/ROS/rules/ros.py +4 -50
- {arelle_release-2.37.35.dist-info → arelle_release-2.37.37.dist-info}/METADATA +1 -1
- {arelle_release-2.37.35.dist-info → arelle_release-2.37.37.dist-info}/RECORD +15 -15
- {arelle_release-2.37.35.dist-info → arelle_release-2.37.37.dist-info}/WHEEL +0 -0
- {arelle_release-2.37.35.dist-info → arelle_release-2.37.37.dist-info}/entry_points.txt +0 -0
- {arelle_release-2.37.35.dist-info → arelle_release-2.37.37.dist-info}/licenses/LICENSE.md +0 -0
- {arelle_release-2.37.35.dist-info → arelle_release-2.37.37.dist-info}/top_level.txt +0 -0
arelle/FileSource.py
CHANGED
|
@@ -119,7 +119,8 @@ class FileNamedStringIO(io.StringIO): # provide string IO in memory but behave
|
|
|
119
119
|
self.fileName = fileName
|
|
120
120
|
|
|
121
121
|
def close(self) -> None:
|
|
122
|
-
|
|
122
|
+
if hasattr(self, 'fileName'):
|
|
123
|
+
del self.fileName
|
|
123
124
|
super().close()
|
|
124
125
|
|
|
125
126
|
def __str__(self) -> str:
|
|
@@ -139,7 +140,8 @@ class FileNamedBytesIO(io.BytesIO): # provide Bytes IO in memory but behave as
|
|
|
139
140
|
self.fileName = fileName
|
|
140
141
|
|
|
141
142
|
def close(self) -> None:
|
|
142
|
-
|
|
143
|
+
if hasattr(self, 'fileName'):
|
|
144
|
+
del self.fileName
|
|
143
145
|
super().close()
|
|
144
146
|
|
|
145
147
|
def __str__(self) -> str:
|
arelle/Validate.py
CHANGED
|
@@ -764,7 +764,7 @@ class Validate:
|
|
|
764
764
|
status = "pass" if numErrors == 0 else "fail"
|
|
765
765
|
elif expected == "invalid":
|
|
766
766
|
status = "fail" if numErrors == 0 else "pass"
|
|
767
|
-
elif expected in (None, []) and numErrors == 0:
|
|
767
|
+
elif expected in (None, []) and numErrors == 0 and not expectedWarnings:
|
|
768
768
|
status = "pass"
|
|
769
769
|
elif isinstance(expected, (QName, str, dict, list)) or expectedWarnings:
|
|
770
770
|
status = "fail"
|
arelle/XbrlConst.py
CHANGED
|
@@ -55,6 +55,9 @@ qnXbrliDenominator = qname("{http://www.xbrl.org/2003/instance}xbrli:denominator
|
|
|
55
55
|
qnXbrliTuple = qname("{http://www.xbrl.org/2003/instance}xbrli:tuple")
|
|
56
56
|
qnXbrliContext = qname("{http://www.xbrl.org/2003/instance}xbrli:context")
|
|
57
57
|
qnXbrliPeriod = qname("{http://www.xbrl.org/2003/instance}xbrli:period")
|
|
58
|
+
qnXbrliStartDate = qname("{http://www.xbrl.org/2003/instance}xbrli:startDate")
|
|
59
|
+
qnXbrliEndDate = qname("{http://www.xbrl.org/2003/instance}xbrli:endDate")
|
|
60
|
+
qnXbrliInstant = qname("{http://www.xbrl.org/2003/instance}xbrli:instant")
|
|
58
61
|
qnXbrliIdentifier = qname("{http://www.xbrl.org/2003/instance}xbrli:identifier")
|
|
59
62
|
qnXbrliUnit = qname("{http://www.xbrl.org/2003/instance}xbrli:unit")
|
|
60
63
|
qnXbrliStringItemType = qname("{http://www.xbrl.org/2003/instance}xbrli:stringItemType")
|
arelle/_version.py
CHANGED
|
@@ -9,7 +9,10 @@ from dataclasses import dataclass
|
|
|
9
9
|
from functools import lru_cache
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
|
+
from arelle.ModelDocument import Type as ModelDocumentType
|
|
13
|
+
from arelle.ModelObject import ModelObject
|
|
12
14
|
from arelle.ModelXbrl import ModelXbrl
|
|
15
|
+
from arelle.PrototypeDtsObject import LinkPrototype
|
|
13
16
|
from arelle.ValidateXbrl import ValidateXbrl
|
|
14
17
|
from arelle.typing import TypeGetText
|
|
15
18
|
from arelle.utils.PluginData import PluginData
|
|
@@ -60,6 +63,29 @@ class PluginValidationDataExtension(PluginData):
|
|
|
60
63
|
return False # Not a zipfile
|
|
61
64
|
return True
|
|
62
65
|
|
|
66
|
+
@lru_cache(1)
|
|
67
|
+
def getFootnoteLinkElements(self, modelXbrl: ModelXbrl) -> list[ModelObject | LinkPrototype]:
|
|
68
|
+
# TODO: Consolidate with similar implementations in EDGAR and FERC
|
|
69
|
+
doc = modelXbrl.modelDocument
|
|
70
|
+
if doc is None:
|
|
71
|
+
return []
|
|
72
|
+
if doc.type in (ModelDocumentType.INLINEXBRL, ModelDocumentType.INLINEXBRLDOCUMENTSET):
|
|
73
|
+
elts = (linkPrototype
|
|
74
|
+
for linkKey, links in modelXbrl.baseSets.items()
|
|
75
|
+
for linkPrototype in links
|
|
76
|
+
if linkPrototype.modelDocument.type in (ModelDocumentType.INLINEXBRL, ModelDocumentType.INLINEXBRLDOCUMENTSET)
|
|
77
|
+
and linkKey[1] and linkKey[2] and linkKey[3] # fully specified roles
|
|
78
|
+
and linkKey[0] != "XBRL-footnotes")
|
|
79
|
+
else:
|
|
80
|
+
rootElt = doc.xmlDocument.getroot()
|
|
81
|
+
elts = rootElt.iterdescendants(tag="{http://www.xbrl.org/2003/linkbase}footnoteLink")
|
|
82
|
+
return [
|
|
83
|
+
elt
|
|
84
|
+
for elt in elts
|
|
85
|
+
if isinstance(elt, (ModelObject, LinkPrototype))
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
|
|
63
89
|
def getUploadFileSizes(self, modelXbrl: ModelXbrl) -> dict[Path, int]:
|
|
64
90
|
"""
|
|
65
91
|
Get the sizes of files in the upload directory.
|
|
@@ -3,10 +3,11 @@ See COPYRIGHT.md for copyright information.
|
|
|
3
3
|
"""
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
-
from collections
|
|
7
|
-
from typing import Any
|
|
6
|
+
from collections import defaultdict
|
|
7
|
+
from typing import Any, Iterable
|
|
8
8
|
|
|
9
9
|
from arelle import XbrlConst
|
|
10
|
+
from arelle.ModelDtsObject import ModelResource, ModelConcept
|
|
10
11
|
from arelle.ValidateXbrl import ValidateXbrl
|
|
11
12
|
from arelle.typing import TypeGetText
|
|
12
13
|
from arelle.utils.PluginHooks import ValidationHook
|
|
@@ -40,9 +41,83 @@ def rule_frta_2_1_9(
|
|
|
40
41
|
for elt in rootElt.iterdescendants(XbrlConst.qnXsdDocumentation.clarkNotation):
|
|
41
42
|
errors.append(elt)
|
|
42
43
|
if len(errors) > 0:
|
|
43
|
-
yield Validation.
|
|
44
|
+
yield Validation.warning(
|
|
44
45
|
codes='EDINET.EC5710W.FRTA.2.1.9',
|
|
45
46
|
msg=_("All documentation of a concept must be contained in XBRL linkbases. "
|
|
46
47
|
"Taxonomy element declarations should not use the XML Schema documentation element."),
|
|
47
48
|
modelObject=errors,
|
|
48
49
|
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@validation(
|
|
53
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
54
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
55
|
+
)
|
|
56
|
+
def rule_frta_2_1_11(
|
|
57
|
+
pluginData: PluginValidationDataExtension,
|
|
58
|
+
val: ValidateXbrl,
|
|
59
|
+
*args: Any,
|
|
60
|
+
**kwargs: Any,
|
|
61
|
+
) -> Iterable[Validation]:
|
|
62
|
+
"""
|
|
63
|
+
EDINET.EC5710W: [FRTA.2.1.11] All concepts within a taxonomy schema should have a
|
|
64
|
+
unique label for the standard or verbose role in each language used.
|
|
65
|
+
"""
|
|
66
|
+
labelsRelationshipSet = val.modelXbrl.relationshipSet(XbrlConst.conceptLabel)
|
|
67
|
+
labelGroupsByLang: dict[str, dict[str, dict[str, set[ModelConcept]]]] = (
|
|
68
|
+
defaultdict(lambda: defaultdict(lambda: defaultdict(set)))
|
|
69
|
+
)
|
|
70
|
+
relevantRoles = frozenset({
|
|
71
|
+
XbrlConst.standardLabel,
|
|
72
|
+
XbrlConst.verboseLabel
|
|
73
|
+
})
|
|
74
|
+
for concept, modelLabelRels in labelsRelationshipSet.fromModelObjects().items():
|
|
75
|
+
if pluginData.isStandardTaxonomyUrl(concept.modelDocument.uri, val.modelXbrl):
|
|
76
|
+
continue
|
|
77
|
+
for modelLabelRel in modelLabelRels:
|
|
78
|
+
modelLabel = modelLabelRel.toModelObject
|
|
79
|
+
if not isinstance(modelLabel, ModelResource):
|
|
80
|
+
continue
|
|
81
|
+
if modelLabel.role not in relevantRoles:
|
|
82
|
+
continue
|
|
83
|
+
if not modelLabel.modelDocument.inDTS:
|
|
84
|
+
continue
|
|
85
|
+
if not modelLabel.xmlLang:
|
|
86
|
+
continue
|
|
87
|
+
labelGroupsByLang[modelLabel.xmlLang][modelLabel.role][modelLabel.textValue].add(concept)
|
|
88
|
+
for lang, labelGroupsByRole in labelGroupsByLang.items():
|
|
89
|
+
duplicateLabelsByRole = defaultdict(list)
|
|
90
|
+
conceptsWithVerboseLabel = {
|
|
91
|
+
concept: False
|
|
92
|
+
for concept in val.modelXbrl.qnameConcepts.values()
|
|
93
|
+
if not pluginData.isStandardTaxonomyUrl(concept.modelDocument.uri, val.modelXbrl)
|
|
94
|
+
}
|
|
95
|
+
for role, labelGroupsByValue in labelGroupsByRole.items():
|
|
96
|
+
for value, concepts in labelGroupsByValue.items():
|
|
97
|
+
if role == XbrlConst.verboseLabel:
|
|
98
|
+
for concept in concepts:
|
|
99
|
+
conceptsWithVerboseLabel[concept] = True
|
|
100
|
+
if len(concepts) < 2:
|
|
101
|
+
continue
|
|
102
|
+
duplicateLabelsByRole[role].append((value, concepts))
|
|
103
|
+
if len(duplicateLabelsByRole[XbrlConst.standardLabel]) == 0:
|
|
104
|
+
# There are no duplicate standard labels, so we don't need to check verbose labels
|
|
105
|
+
continue
|
|
106
|
+
conceptsWithoutVerboseLabel = {concept for concept, value in conceptsWithVerboseLabel.items() if not value}
|
|
107
|
+
if len(duplicateLabelsByRole[XbrlConst.verboseLabel]) == 0 and len(conceptsWithoutVerboseLabel) == 0:
|
|
108
|
+
# All concepts have a verbose label, and there are no duplicate verbose labels,
|
|
109
|
+
return
|
|
110
|
+
for role, duplicateLabels in duplicateLabelsByRole.items():
|
|
111
|
+
for value, concepts in duplicateLabels:
|
|
112
|
+
yield Validation.warning(
|
|
113
|
+
codes='EDINET.EC5710W.FRTA.2.1.11',
|
|
114
|
+
msg=_("All concepts within a taxonomy schema should have a unique label for the "
|
|
115
|
+
"standard or verbose role in each language used. "
|
|
116
|
+
"The %(role)s label contains a duplicate label ('%(value)s') in the same "
|
|
117
|
+
"language ('%(lang)s'). Define either the standard label or the verbose label "
|
|
118
|
+
"so that they are unique in the same language."),
|
|
119
|
+
role='standard' if role == XbrlConst.standardLabel else 'verbose',
|
|
120
|
+
value=value,
|
|
121
|
+
lang=lang,
|
|
122
|
+
modelObject=concepts,
|
|
123
|
+
)
|
|
@@ -3,21 +3,30 @@ See COPYRIGHT.md for copyright information.
|
|
|
3
3
|
"""
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
-
from
|
|
7
|
-
|
|
6
|
+
from typing import Any, cast, Iterable
|
|
7
|
+
|
|
8
|
+
import regex
|
|
8
9
|
|
|
9
10
|
from arelle import XbrlConst, XmlUtil
|
|
11
|
+
from arelle.ModelObject import ModelObject
|
|
12
|
+
from arelle.PrototypeDtsObject import LocPrototype, ArcPrototype
|
|
10
13
|
from arelle.UrlUtil import isHttpUrl, splitDecodeFragment
|
|
11
14
|
from arelle.ValidateXbrl import ValidateXbrl
|
|
15
|
+
from arelle.ValidateXbrlCalcs import insignificantDigits
|
|
16
|
+
from arelle.XbrlConst import xhtmlBaseIdentifier, xmlBaseIdentifier
|
|
17
|
+
from arelle.XmlValidate import VALID
|
|
12
18
|
from arelle.typing import TypeGetText
|
|
13
19
|
from arelle.utils.PluginHooks import ValidationHook
|
|
14
20
|
from arelle.utils.validate.Decorator import validation
|
|
15
21
|
from arelle.utils.validate.Validation import Validation
|
|
22
|
+
from arelle.utils.validate.ValidationUtil import etreeIterWithDepth
|
|
16
23
|
from ..DisclosureSystems import (DISCLOSURE_SYSTEM_EDINET)
|
|
17
24
|
from ..PluginValidationDataExtension import PluginValidationDataExtension
|
|
18
25
|
|
|
19
26
|
_: TypeGetText
|
|
20
27
|
|
|
28
|
+
GFM_CONTEXT_DATE_PATTERN = regex.compile(r"^[12][0-9]{3}-[01][0-9]-[0-3][0-9]$")
|
|
29
|
+
|
|
21
30
|
|
|
22
31
|
@validation(
|
|
23
32
|
hook=ValidationHook.XBRL_FINALLY,
|
|
@@ -64,7 +73,7 @@ def rule_gfm_1_1_3(
|
|
|
64
73
|
continue # Valid external URL
|
|
65
74
|
if not any(scheme == "element" for scheme, __ in XmlUtil.xpointerSchemes(hrefId)):
|
|
66
75
|
continue # Valid shorthand xpointer
|
|
67
|
-
yield Validation.
|
|
76
|
+
yield Validation.warning(
|
|
68
77
|
codes='EDINET.EC5700W.GFM.1.1.3',
|
|
69
78
|
msg=_("The URI content of the xlink:href attribute, the xsi:schemaLocation "
|
|
70
79
|
"attribute and the schemaLocation attribute must be relative and "
|
|
@@ -74,3 +83,211 @@ def rule_gfm_1_1_3(
|
|
|
74
83
|
uri=uri,
|
|
75
84
|
modelObject=elt,
|
|
76
85
|
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@validation(
|
|
89
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
90
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
91
|
+
)
|
|
92
|
+
def rule_gfm_1_1_7(
|
|
93
|
+
pluginData: PluginValidationDataExtension,
|
|
94
|
+
val: ValidateXbrl,
|
|
95
|
+
*args: Any,
|
|
96
|
+
**kwargs: Any,
|
|
97
|
+
) -> Iterable[Validation]:
|
|
98
|
+
"""
|
|
99
|
+
EDINET.EC5700W: [GFM 1.1.7] Attribute xml:base must not appear in any filing document.
|
|
100
|
+
This check has been updated to check for the xhtml:base attribute in order to account for iXBRL filings.
|
|
101
|
+
|
|
102
|
+
Original GFM text: Attribute xml:base must not appear in any filing document.
|
|
103
|
+
"""
|
|
104
|
+
baseElements = []
|
|
105
|
+
for rootElt in val.modelXbrl.ixdsHtmlElements:
|
|
106
|
+
for uncast_elt, depth in etreeIterWithDepth(rootElt):
|
|
107
|
+
elt = cast(Any, uncast_elt)
|
|
108
|
+
if elt.get(xmlBaseIdentifier) is not None:
|
|
109
|
+
baseElements.append(elt)
|
|
110
|
+
if elt.tag == xhtmlBaseIdentifier:
|
|
111
|
+
baseElements.append(elt)
|
|
112
|
+
if len(baseElements) > 0:
|
|
113
|
+
yield Validation.warning(
|
|
114
|
+
codes='EDINET.EC5700W.GFM.1.1.7',
|
|
115
|
+
msg=_("Attribute xml:base must not appear in any filing document."),
|
|
116
|
+
modelObject=baseElements,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@validation(
|
|
121
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
122
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
123
|
+
)
|
|
124
|
+
def rule_gfm_1_2_16(
|
|
125
|
+
pluginData: PluginValidationDataExtension,
|
|
126
|
+
val: ValidateXbrl,
|
|
127
|
+
*args: Any,
|
|
128
|
+
**kwargs: Any,
|
|
129
|
+
) -> Iterable[Validation]:
|
|
130
|
+
"""
|
|
131
|
+
EDINET.EC5700W: [GFM 1.2.16] Use the decimals attribute instead of the precision attribute.
|
|
132
|
+
|
|
133
|
+
Original GFM text: The xbrli:xbrl element must not have any facts with the precision attribute.
|
|
134
|
+
"""
|
|
135
|
+
errors = []
|
|
136
|
+
for fact in val.modelXbrl.facts:
|
|
137
|
+
concept = fact.concept
|
|
138
|
+
if concept is None:
|
|
139
|
+
continue
|
|
140
|
+
if not concept.isNumeric:
|
|
141
|
+
continue
|
|
142
|
+
if fact.precision is not None:
|
|
143
|
+
errors.append(fact)
|
|
144
|
+
if len(errors) > 0:
|
|
145
|
+
yield Validation.warning(
|
|
146
|
+
codes='EDINET.EC5700W.GFM.1.2.16',
|
|
147
|
+
msg=_("Use the decimals attribute instead of the precision attribute."),
|
|
148
|
+
modelObject=errors,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
@validation(
|
|
153
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
154
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
155
|
+
)
|
|
156
|
+
def rule_gfm_1_2_22(
|
|
157
|
+
pluginData: PluginValidationDataExtension,
|
|
158
|
+
val: ValidateXbrl,
|
|
159
|
+
*args: Any,
|
|
160
|
+
**kwargs: Any,
|
|
161
|
+
) -> Iterable[Validation]:
|
|
162
|
+
"""
|
|
163
|
+
EDINET.EC5700W: [GFM 1.2.22] In your taxonomy, do not expand the
|
|
164
|
+
xlink:arcrole attribute of the link:footnoteArc element. Modify the value
|
|
165
|
+
of the xlink:arcrole attribute to "http://www.xbrl.org/2003/arcrole/fact-footnote".
|
|
166
|
+
|
|
167
|
+
Original GFM text: The xlink:arcrole attribute of a link:footnoteArc element must
|
|
168
|
+
be defined in the XBRL Specification 2.1 or declared in a standard taxonomy schema.
|
|
169
|
+
"""
|
|
170
|
+
errors = []
|
|
171
|
+
for elt in pluginData.getFootnoteLinkElements(val.modelXbrl):
|
|
172
|
+
for child in elt:
|
|
173
|
+
if not isinstance(child, (ModelObject, LocPrototype, ArcPrototype)):
|
|
174
|
+
continue
|
|
175
|
+
xlinkType = child.get(XbrlConst.qnXlinkType.clarkNotation)
|
|
176
|
+
if xlinkType == "arc":
|
|
177
|
+
arcrole = child.get(XbrlConst.qnXlinkArcRole.clarkNotation)
|
|
178
|
+
if arcrole != XbrlConst.factFootnote:
|
|
179
|
+
errors.append(child)
|
|
180
|
+
if len(errors) > 0:
|
|
181
|
+
yield Validation.warning(
|
|
182
|
+
codes='EDINET.EC5700W.GFM.1.2.22',
|
|
183
|
+
msg=_("Do not use extension arcroles for the link:footnoteArc element. "
|
|
184
|
+
"Use the standard 'http://www.xbrl.org/2003/arcrole/fact-footnote' arcrole instead."),
|
|
185
|
+
modelObject=errors,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
@validation(
|
|
190
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
191
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
192
|
+
)
|
|
193
|
+
def rule_gfm_1_2_25(
|
|
194
|
+
pluginData: PluginValidationDataExtension,
|
|
195
|
+
val: ValidateXbrl,
|
|
196
|
+
*args: Any,
|
|
197
|
+
**kwargs: Any,
|
|
198
|
+
) -> Iterable[Validation]:
|
|
199
|
+
"""
|
|
200
|
+
EDINET.EC5700W: [GFM 1.2.25] Set the date in the period element in the
|
|
201
|
+
following format: YYYY-MM-DD.
|
|
202
|
+
|
|
203
|
+
Original GFM text: Dates in period element of the context must comply with
|
|
204
|
+
yyyy-mm-dd format. No time is allowed in the value for dates.
|
|
205
|
+
"""
|
|
206
|
+
errors = []
|
|
207
|
+
for context in val.modelXbrl.contexts.values():
|
|
208
|
+
for elt in context.iterdescendants(
|
|
209
|
+
XbrlConst.qnXbrliStartDate.clarkNotation,
|
|
210
|
+
XbrlConst.qnXbrliEndDate.clarkNotation,
|
|
211
|
+
XbrlConst.qnXbrliInstant.clarkNotation
|
|
212
|
+
):
|
|
213
|
+
dateText = XmlUtil.text(elt)
|
|
214
|
+
if not GFM_CONTEXT_DATE_PATTERN.match(dateText):
|
|
215
|
+
errors.append(elt)
|
|
216
|
+
if len(errors) > 0:
|
|
217
|
+
yield Validation.warning(
|
|
218
|
+
codes='EDINET.EC5700W.GFM.1.2.25',
|
|
219
|
+
msg=_("Set the date in the period element in the following "
|
|
220
|
+
"format: YYYY-MM-DD."),
|
|
221
|
+
modelObject=errors,
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
@validation(
|
|
226
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
227
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
228
|
+
)
|
|
229
|
+
def rule_gfm_1_2_26(
|
|
230
|
+
pluginData: PluginValidationDataExtension,
|
|
231
|
+
val: ValidateXbrl,
|
|
232
|
+
*args: Any,
|
|
233
|
+
**kwargs: Any,
|
|
234
|
+
) -> Iterable[Validation]:
|
|
235
|
+
"""
|
|
236
|
+
EDINET.EC5700W: [GFM 1.2.26] The decimals attribute value must not cause truncation of
|
|
237
|
+
non-zero digits in the fact value. Update the fact value to match the precision of
|
|
238
|
+
the decimals attribute, or update the decimals attribute.
|
|
239
|
+
|
|
240
|
+
Original GFM text: The decimals attribute value must not cause non-zero digits in
|
|
241
|
+
the fact value to be changed to zero.
|
|
242
|
+
"""
|
|
243
|
+
errors = []
|
|
244
|
+
for fact in val.modelXbrl.facts:
|
|
245
|
+
if (
|
|
246
|
+
fact.context is None or
|
|
247
|
+
fact.concept is None or
|
|
248
|
+
fact.concept.type is None or
|
|
249
|
+
getattr(fact,"xValid", 0) < VALID or
|
|
250
|
+
fact.isNil or
|
|
251
|
+
not fact.isNumeric or
|
|
252
|
+
not fact.decimals or
|
|
253
|
+
fact.decimals == "INF"
|
|
254
|
+
):
|
|
255
|
+
continue
|
|
256
|
+
try:
|
|
257
|
+
insignificance = insignificantDigits(fact.xValue, decimals=fact.decimals)
|
|
258
|
+
if insignificance is not None:
|
|
259
|
+
errors.append(fact)
|
|
260
|
+
except (ValueError,TypeError):
|
|
261
|
+
errors.append(fact)
|
|
262
|
+
if len(errors) > 0:
|
|
263
|
+
yield Validation.warning(
|
|
264
|
+
codes='EDINET.EC5700W.GFM.1.2.26',
|
|
265
|
+
msg=_("The decimals attribute value must not cause truncation of "
|
|
266
|
+
"non-zero digits in the fact value. Update the fact value to "
|
|
267
|
+
"match the precision of the decimals attribute, or update the"
|
|
268
|
+
"decimals attribute."),
|
|
269
|
+
modelObject=errors,
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
@validation(
|
|
274
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
275
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
276
|
+
)
|
|
277
|
+
def rule_gfm_1_2_27(
|
|
278
|
+
pluginData: PluginValidationDataExtension,
|
|
279
|
+
val: ValidateXbrl,
|
|
280
|
+
*args: Any,
|
|
281
|
+
**kwargs: Any,
|
|
282
|
+
) -> Iterable[Validation]:
|
|
283
|
+
"""
|
|
284
|
+
EDINET.EC5700W: [GFM 1.2.27] An instance must not contain unused units.
|
|
285
|
+
"""
|
|
286
|
+
# TODO: Consolidate validations involving unused units
|
|
287
|
+
unusedUnits = set(val.modelXbrl.units.values()) - {fact.unit for fact in val.modelXbrl.facts if fact.unit is not None}
|
|
288
|
+
if len(unusedUnits) > 0:
|
|
289
|
+
yield Validation.warning(
|
|
290
|
+
codes='EDINET.EC5700W.GFM.1.2.27',
|
|
291
|
+
msg=_("Delete unused units from the instance."),
|
|
292
|
+
modelObject=list(unusedUnits)
|
|
293
|
+
)
|
|
@@ -344,10 +344,19 @@
|
|
|
344
344
|
"formulaRunIDs": "(?!con_IdentifierSchemeMustBeLEI|lei-identifier-scheme)"
|
|
345
345
|
},
|
|
346
346
|
"UKFRC-2023": {
|
|
347
|
+
"name": "United Kingdom Multiple Targets",
|
|
348
|
+
"authorityName": "FRC",
|
|
349
|
+
"comment": "This is a deprecated authority that will be removed. Use UKFRC instead.",
|
|
350
|
+
"reference": "https://media.frc.org.uk/documents/XBRL_Tagging_Guide_-_FRC_Taxonomies_2024_On9jOuS.pdf",
|
|
351
|
+
"reportPackageMaxMB": "150",
|
|
352
|
+
"reportPackageMeasurement": "zipped",
|
|
353
|
+
"ixTargetUsage": "allowed"
|
|
354
|
+
},
|
|
355
|
+
"UKFRC": {
|
|
347
356
|
"name": "United Kingdom Multiple Targets",
|
|
348
357
|
"authorityName": "FRC",
|
|
349
358
|
"comment": "Pertains to multi target UKSEF Guidance",
|
|
350
|
-
"comment2": "See UKFRC for reports prior to 2023 which did not use separate targets for FRC and ESEF",
|
|
359
|
+
"comment2": "See UKFRC-2022 for reports prior to 2023 which did not use separate targets for FRC and ESEF",
|
|
351
360
|
"reference": "https://media.frc.org.uk/documents/XBRL_Tagging_Guide_-_FRC_Taxonomies_2024_On9jOuS.pdf",
|
|
352
361
|
"reportPackageMaxMB": "150",
|
|
353
362
|
"reportPackageMeasurement": "zipped",
|
|
@@ -296,67 +296,21 @@ def rule_main(
|
|
|
296
296
|
@validation(
|
|
297
297
|
hook=ValidationHook.XBRL_FINALLY,
|
|
298
298
|
)
|
|
299
|
-
def
|
|
299
|
+
def rule_ros20(
|
|
300
300
|
pluginData: PluginValidationDataExtension,
|
|
301
301
|
val: ValidateXbrl,
|
|
302
302
|
*args: Any,
|
|
303
303
|
**kwargs: Any,
|
|
304
304
|
) -> Iterable[Validation]:
|
|
305
305
|
"""
|
|
306
|
-
ROS: Rule
|
|
307
|
-
"""
|
|
308
|
-
non_nil_profit_loss_fact_exists = any(
|
|
309
|
-
not fact.isNil for fact in val.modelXbrl.factsByLocalName.get(IE_PROFIT_LOSS, set())
|
|
310
|
-
)
|
|
311
|
-
non_nil_profit_loss_ordinary_fact_exists = any(
|
|
312
|
-
not fact.isNil for fact in val.modelXbrl.factsByLocalName.get(IE_PROFIT_LOSS_ORDINARY, set())
|
|
313
|
-
)
|
|
314
|
-
if not non_nil_profit_loss_fact_exists and not non_nil_profit_loss_ordinary_fact_exists:
|
|
315
|
-
yield Validation.error(
|
|
316
|
-
codes='ROS.6',
|
|
317
|
-
msg=_("Profit or Loss Before Tax (uk gaap:ProfitLossOnOrdinaryActivitiesBeforeTax) is missing."),
|
|
318
|
-
modelObject=val.modelXbrl
|
|
319
|
-
)
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
@validation(
|
|
323
|
-
hook=ValidationHook.XBRL_FINALLY,
|
|
324
|
-
)
|
|
325
|
-
def rule_ros18(
|
|
326
|
-
pluginData: PluginValidationDataExtension,
|
|
327
|
-
val: ValidateXbrl,
|
|
328
|
-
*args: Any,
|
|
329
|
-
**kwargs: Any,
|
|
330
|
-
) -> Iterable[Validation]:
|
|
331
|
-
"""
|
|
332
|
-
ROS: Rule 18: DPLTurnoverRevenue cannot be a negative value.
|
|
333
|
-
"""
|
|
334
|
-
return errorOnNegativeFact(
|
|
335
|
-
val.modelXbrl,
|
|
336
|
-
conceptLn=TURNOVER_REVENUE,
|
|
337
|
-
code='ROS.18',
|
|
338
|
-
message=_("Turnover / Revenue cannot be a negative value.")
|
|
339
|
-
)
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
@validation(
|
|
343
|
-
hook=ValidationHook.XBRL_FINALLY,
|
|
344
|
-
)
|
|
345
|
-
def rule_ros19(
|
|
346
|
-
pluginData: PluginValidationDataExtension,
|
|
347
|
-
val: ValidateXbrl,
|
|
348
|
-
*args: Any,
|
|
349
|
-
**kwargs: Any,
|
|
350
|
-
) -> Iterable[Validation]:
|
|
351
|
-
"""
|
|
352
|
-
ROS: Rule 19:PrincipalCurrencyUsedInBusinessReport must exist and its value must match the unit
|
|
306
|
+
ROS: Rule 20:PrincipalCurrencyUsedInBusinessReport must exist and its value must match the unit
|
|
353
307
|
used for the majority of monetary facts.
|
|
354
308
|
"""
|
|
355
309
|
principal_currency_facts = val.modelXbrl.factsByLocalName.get(PRINCIPAL_CURRENCY, set())
|
|
356
310
|
principal_currency_values = set(fact.text for fact in principal_currency_facts)
|
|
357
311
|
if len(principal_currency_values) != 1:
|
|
358
312
|
yield Validation.error(
|
|
359
|
-
"ROS.
|
|
313
|
+
"ROS.20",
|
|
360
314
|
_("'PrincipalCurrencyUsedInBusinessReport' must exist and have a single value. Values found: %(principal_currency_values)s."),
|
|
361
315
|
modelObject=principal_currency_facts,
|
|
362
316
|
principal_currency_values=principal_currency_values,
|
|
@@ -370,7 +324,7 @@ def rule_ros19(
|
|
|
370
324
|
for unit, count in unit_counts.items():
|
|
371
325
|
if count > principal_currency_value_count:
|
|
372
326
|
yield Validation.warning(
|
|
373
|
-
"ROS.
|
|
327
|
+
"ROS.20",
|
|
374
328
|
_("'PrincipalCurrencyUsedInBusinessReport' has a value of %(principal_currency_value)s, "
|
|
375
329
|
"which must match the functional(majority) unit of the financial statement."),
|
|
376
330
|
modelObject=principal_currency_facts,
|
|
@@ -21,7 +21,7 @@ arelle/DialogRssWatch.py,sha256=mjc4pqyFDISY4tQtME0uSRQ3NlcWnNsOsMu9Zj8tTd0,1378
|
|
|
21
21
|
arelle/DialogURL.py,sha256=JH88OPFf588E8RW90uMaieok7A_4kOAURQ8kHWVhnao,4354
|
|
22
22
|
arelle/DialogUserPassword.py,sha256=kWPlCCihhwvsykDjanME9qBDtv6cxZlsrJyoMqiRep4,13769
|
|
23
23
|
arelle/DisclosureSystem.py,sha256=mQlz8eezPpJuG6gHBV-x4-5Hne3LVh8TQf-Qm9jiFxI,24757
|
|
24
|
-
arelle/FileSource.py,sha256=
|
|
24
|
+
arelle/FileSource.py,sha256=asaX2wM47T7S6kELwmXm-YjGIoV6poWz_YdYThY0lpk,47983
|
|
25
25
|
arelle/FunctionCustom.py,sha256=d1FsBG14eykvpLpgaXpN8IdxnlG54dfGcsXPYfdpA9Q,5880
|
|
26
26
|
arelle/FunctionFn.py,sha256=BcZKah1rpfquSVPwjvknM1pgFXOnK4Hr1e_ArG_mcJY,38058
|
|
27
27
|
arelle/FunctionIxt.py,sha256=8JELGh1l4o8Ul4_G7JgwX8Ebch9it2DblI6OkfL33Cw,80082
|
|
@@ -65,7 +65,7 @@ arelle/UITkTable.py,sha256=N83cXi5c0lLZLsDbwSKcPrlYoUoGsNavGN5YRx6d9XY,39810
|
|
|
65
65
|
arelle/UiUtil.py,sha256=3G0xPclZI8xW_XQDbiFrmylB7Nd5muqi5n2x2oMkMZU,34218
|
|
66
66
|
arelle/Updater.py,sha256=IZ8cq44Rq88WbQcB1VOpMA6bxdfZxfYQ8rgu9Ehpbes,7448
|
|
67
67
|
arelle/UrlUtil.py,sha256=HrxZSG59EUMGMMGmWPuZkPi5-0BGqY3jAMkp7V4IdZo,32400
|
|
68
|
-
arelle/Validate.py,sha256=
|
|
68
|
+
arelle/Validate.py,sha256=YQUr2t2lyuQJD4ygfKgbj7grON-Od5pYfkjFVS5XuDM,58049
|
|
69
69
|
arelle/ValidateDuplicateFacts.py,sha256=L556J1Dhz4ZmsMlRNoDCMpFgDQYiryd9vuBYDvE0Aq8,21769
|
|
70
70
|
arelle/ValidateFilingText.py,sha256=xnXc0xgdNiHQk0eyP7VSSpvw7qr-pRFRwqqoUb569is,54051
|
|
71
71
|
arelle/ValidateInfoset.py,sha256=Rz_XBi5Ha43KpxXYhjLolURcWVx5qmqyjLxw48Yt9Dg,20396
|
|
@@ -114,7 +114,7 @@ arelle/ViewWinVersReport.py,sha256=aYfsOgynVZpMzl6f2EzQCBLzdihYGycwb5SiTghkgMQ,9
|
|
|
114
114
|
arelle/ViewWinXml.py,sha256=4ZGKtjaoCwU9etKYm9ZAS7jSmUxba1rqNEdv0OIyjTY,1250
|
|
115
115
|
arelle/WatchRss.py,sha256=5Ih4igH2MM4hpOuAXy9eO0QAyZ7jZR3S5bPzo2sdFpw,14097
|
|
116
116
|
arelle/WebCache.py,sha256=HlF4vfjxO0bSFHqMPfjnmkrzc7RK9XT714a7g3XFTDY,45192
|
|
117
|
-
arelle/XbrlConst.py,sha256=
|
|
117
|
+
arelle/XbrlConst.py,sha256=T8Cvogf1j2I5aws7ZDwLmCj6zcYwxUZIk9ZXDYwHfxU,58164
|
|
118
118
|
arelle/XbrlUtil.py,sha256=s2Vmrh-sZI5TeuqsziKignOc3ao-uUgnCNoelP4dDj0,9212
|
|
119
119
|
arelle/XhtmlValidate.py,sha256=0gtm7N-kXK0RB5o3c1AQXjfFuRp1w2fKZZAeyruNANw,5727
|
|
120
120
|
arelle/XmlUtil.py,sha256=1VToOOylF8kbEorEdZLThmq35j9bmuF_DS2q9NthnHU,58774
|
|
@@ -123,7 +123,7 @@ arelle/XmlValidateConst.py,sha256=U_wN0Q-nWKwf6dKJtcu_83FXPn9c6P8JjzGA5b0w7P0,33
|
|
|
123
123
|
arelle/XmlValidateParticles.py,sha256=Mn6vhFl0ZKC_vag1mBwn1rH_x2jmlusJYqOOuxFPO2k,9231
|
|
124
124
|
arelle/XmlValidateSchema.py,sha256=6frtZOc1Yrx_5yYF6V6oHbScnglWrVbWr6xW4EHtLQI,7428
|
|
125
125
|
arelle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
126
|
-
arelle/_version.py,sha256=
|
|
126
|
+
arelle/_version.py,sha256=owS1yq-lkTe-QrsEkuxkAmeRUUwHNnbfjvFTG_oL6T8,515
|
|
127
127
|
arelle/typing.py,sha256=PRe-Fxwr2SBqYYUVPCJ3E7ddDX0_oOISNdT5Q97EbRM,1246
|
|
128
128
|
arelle/api/Session.py,sha256=27HVuK3Bz1_21l4_RLn1IQg6v0MNsUEYrHajymyWwxI,7429
|
|
129
129
|
arelle/archive/CustomLogger.py,sha256=v_JXOCQLDZcfaFWzxC9FRcEf9tQi4rCI4Sx7jCuAVQI,1231
|
|
@@ -396,15 +396,15 @@ arelle/plugin/validate/EDINET/Constants.py,sha256=QG69rWdpIrpQzZQkRcDWk2i3rlBVoh
|
|
|
396
396
|
arelle/plugin/validate/EDINET/DisclosureSystems.py,sha256=3rKG42Eg-17Xx_KXU_V5yHW6I3LTwQunvf4a44C9k_4,36
|
|
397
397
|
arelle/plugin/validate/EDINET/FormType.py,sha256=pJfKjdjqFcRLFgH6xbEixvpwatZBBHI8uI3xjjhaPI0,3175
|
|
398
398
|
arelle/plugin/validate/EDINET/Manifest.py,sha256=VWenzA1ndOp802zpTELSLREbCrzrA-nM1UCRpRf1Q3M,4849
|
|
399
|
-
arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=
|
|
399
|
+
arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=vJPs5GgNJbRUBTKP0ULMb4UqvDoGATPC9dTFsKG4HyI,6347
|
|
400
400
|
arelle/plugin/validate/EDINET/ValidationPluginExtension.py,sha256=HIGOpBOyuVs5SEh573M3IzdouRdEuNIBkdumieZi8r0,959
|
|
401
401
|
arelle/plugin/validate/EDINET/__init__.py,sha256=ew9Rc2qJe5d3XvOOFzhX6MfzxNUtxIYfxRGX-wkfR1c,3555
|
|
402
402
|
arelle/plugin/validate/EDINET/resources/config.xml,sha256=GmLcW7UIj5koXJkN19P6Nq5EZJcs6gKQLQ5f2V6u78w,614
|
|
403
403
|
arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml,sha256=997I3RGTLg5OY3vn5hQxVFAAxOmDSOYpuyQe6VnWSY0,16285
|
|
404
404
|
arelle/plugin/validate/EDINET/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
405
405
|
arelle/plugin/validate/EDINET/rules/edinet.py,sha256=hm5T8PiQbOKP58BiSV9UFvKQX10uNBpxUZ06ORSU1cE,2117
|
|
406
|
-
arelle/plugin/validate/EDINET/rules/frta.py,sha256=
|
|
407
|
-
arelle/plugin/validate/EDINET/rules/gfm.py,sha256=
|
|
406
|
+
arelle/plugin/validate/EDINET/rules/frta.py,sha256=jX6R1DMaz8U_xPKwV9aJUGcqPgOX_RbYfWkWN-q5oW4,5451
|
|
407
|
+
arelle/plugin/validate/EDINET/rules/gfm.py,sha256=NIKOGfQdiC4R2BRzX32CQoyqzpO3jr8zn8i9911iBKw,11163
|
|
408
408
|
arelle/plugin/validate/EDINET/rules/upload.py,sha256=HZ-9Gk6WtIichTGcSsSGIrMXNgsgJYQYwfUKeLs1XWU,20369
|
|
409
409
|
arelle/plugin/validate/ESEF/Const.py,sha256=JujF_XV-_TNsxjGbF-8SQS4OOZIcJ8zhCMnr-C1O5Ho,22660
|
|
410
410
|
arelle/plugin/validate/ESEF/Dimensions.py,sha256=MOJM7vwNPEmV5cu-ZzPrhx3347ZvxgD6643OB2HRnIk,10597
|
|
@@ -417,7 +417,7 @@ arelle/plugin/validate/ESEF/ESEF_2021/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
|
|
|
417
417
|
arelle/plugin/validate/ESEF/ESEF_Current/DTS.py,sha256=epp-PBh1NJzQqgxUE6C468HmoDc2w3j54rMwfiOAry4,29334
|
|
418
418
|
arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py,sha256=XMFlRc9X-dwMkyaEMWxmNWnTRBlFjzpA8JsyMWknzvs,75251
|
|
419
419
|
arelle/plugin/validate/ESEF/ESEF_Current/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
420
|
-
arelle/plugin/validate/ESEF/resources/authority-validations.json,sha256=
|
|
420
|
+
arelle/plugin/validate/ESEF/resources/authority-validations.json,sha256=bR0ZMpiQL9LqiyzrjhAGMDLEHBHimsDuDu9SQY5xofA,15503
|
|
421
421
|
arelle/plugin/validate/ESEF/resources/config.xml,sha256=t3STU_-QYM7Ay8YwZRPapnohiWVWhjfr4L2Rjx9xN9U,3902
|
|
422
422
|
arelle/plugin/validate/FERC/__init__.py,sha256=V4fXcFKBsjFFPs9_1NhvDjWpEQCoQM0tRQMS0I1Ua7U,11462
|
|
423
423
|
arelle/plugin/validate/FERC/config.xml,sha256=bn9b8eCqJA1J62rYq1Nz85wJrMGAahVmmnIUQZyerjo,1919
|
|
@@ -441,7 +441,7 @@ arelle/plugin/validate/ROS/__init__.py,sha256=KuWg1MHVzA2S6eaHFptvP3Vu_5gQWf3OUY
|
|
|
441
441
|
arelle/plugin/validate/ROS/config.xml,sha256=ZCpCFgr1ZAjoUuhb1eRpDnmKrae-sXA9yl6SOWnrfm8,654
|
|
442
442
|
arelle/plugin/validate/ROS/resources/config.xml,sha256=HXWume5HlrAqOx5AtiWWqgADbRatA8YSfm_JvZGwdgQ,657
|
|
443
443
|
arelle/plugin/validate/ROS/rules/__init__.py,sha256=wW7BUAIb7sRkOxC1Amc_ZKrz03FM-Qh1TyZe6wxYaAU,1567
|
|
444
|
-
arelle/plugin/validate/ROS/rules/ros.py,sha256=
|
|
444
|
+
arelle/plugin/validate/ROS/rules/ros.py,sha256=Vv7qKMmhBEuPu7y_g0sjiDLnm5VXXz6EVdzonJbCUtg,18436
|
|
445
445
|
arelle/plugin/validate/UK/ValidateUK.py,sha256=0UhSwsY1lrY-EAEBJJR9QY38YXGBZ6PEgmuC5gQfBlI,57813
|
|
446
446
|
arelle/plugin/validate/UK/__init__.py,sha256=KE6s_B-EvrHDCtWQz2N_wQwyx_ZbWhYNV2GfQnluxMw,30655
|
|
447
447
|
arelle/plugin/validate/UK/config.xml,sha256=mUFhWDfBzGTn7v0ZSmf4HaweQTMJh_4ZcJmD9mzCHrA,1547
|
|
@@ -756,9 +756,9 @@ arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txr
|
|
|
756
756
|
arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
757
757
|
arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
758
758
|
arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
|
|
759
|
-
arelle_release-2.37.
|
|
760
|
-
arelle_release-2.37.
|
|
761
|
-
arelle_release-2.37.
|
|
762
|
-
arelle_release-2.37.
|
|
763
|
-
arelle_release-2.37.
|
|
764
|
-
arelle_release-2.37.
|
|
759
|
+
arelle_release-2.37.37.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
|
|
760
|
+
arelle_release-2.37.37.dist-info/METADATA,sha256=9rW8eSgXTQvBbLhpbyqEgJXlfKpxor8MA1pAmZhSDuE,9137
|
|
761
|
+
arelle_release-2.37.37.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
762
|
+
arelle_release-2.37.37.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
|
|
763
|
+
arelle_release-2.37.37.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
|
|
764
|
+
arelle_release-2.37.37.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|