arelle-release 2.17.1__py3-none-any.whl → 2.37.71__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.
Files changed (893) hide show
  1. arelle/Aspect.py +6 -3
  2. arelle/BetaFeatures.py +3 -0
  3. arelle/Cntlr.py +117 -413
  4. arelle/CntlrCmdLine.py +364 -227
  5. arelle/CntlrQuickBooks.py +4 -2
  6. arelle/CntlrWebMain.py +179 -119
  7. arelle/CntlrWinMain.py +342 -124
  8. arelle/DialogAbout.py +1 -1
  9. arelle/DialogArcroleGroup.py +1 -1
  10. arelle/DialogFind.py +1 -1
  11. arelle/DialogFormulaParameters.py +2 -2
  12. arelle/DialogLanguage.py +45 -36
  13. arelle/DialogNewFactItem.py +1 -1
  14. arelle/DialogOpenArchive.py +30 -34
  15. arelle/DialogPackageManager.py +11 -8
  16. arelle/DialogPluginManager.py +43 -89
  17. arelle/DialogRssWatch.py +2 -2
  18. arelle/DialogURL.py +1 -1
  19. arelle/DialogUserPassword.py +1 -1
  20. arelle/DisclosureSystem.py +69 -1
  21. arelle/ErrorManager.py +321 -0
  22. arelle/FileSource.py +201 -99
  23. arelle/FunctionFn.py +44 -5
  24. arelle/FunctionIxt.py +16 -13
  25. arelle/FunctionUtil.py +1 -1
  26. arelle/FunctionXfi.py +68 -24
  27. arelle/FunctionXs.py +1 -1
  28. arelle/HtmlUtil.py +5 -4
  29. arelle/LeiUtil.py +63 -43
  30. arelle/LinkbaseType.py +94 -0
  31. arelle/LocalViewer.py +8 -2
  32. arelle/Locale.py +239 -79
  33. arelle/ModelDocument.py +180 -48
  34. arelle/ModelDtsObject.py +32 -27
  35. arelle/ModelFormulaObject.py +14 -6
  36. arelle/ModelInstanceObject.py +43 -14
  37. arelle/ModelManager.py +6 -1
  38. arelle/ModelObject.py +12 -8
  39. arelle/ModelObjectFactory.py +18 -2
  40. arelle/ModelRelationshipSet.py +46 -3
  41. arelle/ModelRenderingObject.py +899 -951
  42. arelle/ModelRssItem.py +2 -4
  43. arelle/ModelTestcaseObject.py +41 -4
  44. arelle/ModelValue.py +42 -14
  45. arelle/ModelVersReport.py +1 -1
  46. arelle/ModelXbrl.py +133 -273
  47. arelle/PackageManager.py +202 -176
  48. arelle/PluginManager.py +551 -239
  49. arelle/PluginUtils.py +54 -0
  50. arelle/PrototypeInstanceObject.py +53 -12
  51. arelle/PythonUtil.py +166 -25
  52. arelle/RuntimeOptions.py +32 -18
  53. arelle/SocketUtils.py +3 -0
  54. arelle/SystemInfo.py +1 -1
  55. arelle/TkTableWrapper.py +33 -5
  56. arelle/UITkTable.py +27 -21
  57. arelle/Updater.py +7 -3
  58. arelle/UrlUtil.py +6 -2
  59. arelle/Validate.py +596 -402
  60. arelle/ValidateDuplicateFacts.py +584 -0
  61. arelle/ValidateFileSource.py +38 -0
  62. arelle/ValidateFilingText.py +46 -29
  63. arelle/ValidateInfoset.py +104 -32
  64. arelle/ValidateUtr.py +31 -4
  65. arelle/ValidateXbrl.py +144 -120
  66. arelle/ValidateXbrlCalcs.py +51 -66
  67. arelle/ValidateXbrlDTS.py +98 -29
  68. arelle/Version.py +2 -7
  69. arelle/ViewFile.py +2 -0
  70. arelle/ViewFileDTS.py +7 -2
  71. arelle/ViewFileFactList.py +1 -1
  72. arelle/ViewFileFactTable.py +4 -4
  73. arelle/ViewFileRelationshipSet.py +36 -19
  74. arelle/ViewFileRenderedGrid.py +164 -753
  75. arelle/ViewFileRenderedLayout.py +174 -0
  76. arelle/ViewFileRenderedStructure.py +108 -0
  77. arelle/ViewWinDTS.py +4 -1
  78. arelle/ViewWinFactList.py +1 -1
  79. arelle/ViewWinFactTable.py +1 -1
  80. arelle/ViewWinRelationshipSet.py +14 -8
  81. arelle/ViewWinRenderedGrid.py +397 -287
  82. arelle/ViewWinRssFeed.py +4 -0
  83. arelle/ViewWinTree.py +15 -9
  84. arelle/ViewWinXml.py +1 -1
  85. arelle/WebCache.py +510 -272
  86. arelle/XbrlConst.py +202 -196
  87. arelle/XbrlUtil.py +2 -1
  88. arelle/XhtmlValidate.py +9 -23
  89. arelle/XmlUtil.py +24 -19
  90. arelle/XmlValidate.py +95 -67
  91. arelle/XmlValidateParticles.py +4 -4
  92. arelle/_version.py +33 -3
  93. arelle/api/Session.py +183 -0
  94. arelle/config/creationSoftwareNames.json +24 -10
  95. arelle/config/disclosuresystems.xml +1 -1
  96. arelle/config/disclosuresystems.xsd +3 -0
  97. arelle/config/sbr-text-formatting.xsd +737 -0
  98. arelle/conformance/CSVTestcaseLoader.py +102 -0
  99. arelle/formula/FactAspectsCache.py +10 -4
  100. arelle/formula/ValidateFormula.py +82 -194
  101. arelle/formula/XPathContext.py +42 -28
  102. arelle/formula/XPathParser.py +15 -9
  103. arelle/locale/ar_EG/LC_MESSAGES/ar_EG.po +3 -4
  104. arelle/locale/messages.pot +1 -2
  105. arelle/locale/ru/LC_MESSAGES/ru.po +2 -2
  106. arelle/logging/formatters/LogFormatter.py +47 -0
  107. arelle/logging/handlers/LogHandlerWithXml.py +94 -0
  108. arelle/logging/handlers/LogToBufferHandler.py +20 -0
  109. arelle/logging/handlers/LogToPrintHandler.py +41 -0
  110. arelle/logging/handlers/LogToXmlHandler.py +244 -0
  111. arelle/logging/handlers/StructuredMessageLogHandler.py +74 -0
  112. arelle/model/CommentBase.py +3 -0
  113. arelle/model/ElementBase.py +3 -0
  114. arelle/model/PIBase.py +3 -0
  115. arelle/model/__init__.py +3 -0
  116. arelle/oim/Load.py +2869 -0
  117. arelle/oim/Validate.py +155 -0
  118. arelle/oim/xml/Save.py +21 -0
  119. arelle/packages/PackageConst.py +7 -0
  120. arelle/packages/PackageType.py +13 -0
  121. arelle/packages/PackageUtils.py +22 -0
  122. arelle/packages/PackageValidation.py +200 -0
  123. arelle/packages/report/DetectReportPackage.py +13 -0
  124. arelle/packages/report/ReportPackage.py +265 -0
  125. arelle/packages/report/ReportPackageConst.py +79 -0
  126. arelle/packages/report/ReportPackageValidator.py +207 -0
  127. arelle/plugin/EdgarRendererAllReports.py +12 -12
  128. arelle/plugin/OimTaxonomy/ModelValueMore.py +15 -0
  129. arelle/plugin/OimTaxonomy/ValidateDTS.py +484 -0
  130. arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py +239 -0
  131. arelle/plugin/OimTaxonomy/XbrlAbstract.py +16 -0
  132. arelle/plugin/OimTaxonomy/XbrlConcept.py +68 -0
  133. arelle/plugin/OimTaxonomy/XbrlConst.py +261 -0
  134. arelle/plugin/OimTaxonomy/XbrlCube.py +91 -0
  135. arelle/plugin/OimTaxonomy/XbrlDimension.py +38 -0
  136. arelle/plugin/OimTaxonomy/XbrlDts.py +152 -0
  137. arelle/plugin/OimTaxonomy/XbrlEntity.py +16 -0
  138. arelle/plugin/OimTaxonomy/XbrlGroup.py +22 -0
  139. arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py +22 -0
  140. arelle/plugin/OimTaxonomy/XbrlLabel.py +31 -0
  141. arelle/plugin/OimTaxonomy/XbrlNetwork.py +100 -0
  142. arelle/plugin/OimTaxonomy/XbrlProperty.py +28 -0
  143. arelle/plugin/OimTaxonomy/XbrlReference.py +33 -0
  144. arelle/plugin/OimTaxonomy/XbrlReport.py +24 -0
  145. arelle/plugin/OimTaxonomy/XbrlTableTemplate.py +35 -0
  146. arelle/plugin/OimTaxonomy/XbrlTaxonomy.py +93 -0
  147. arelle/plugin/OimTaxonomy/XbrlTaxonomyObject.py +154 -0
  148. arelle/plugin/OimTaxonomy/XbrlTransform.py +17 -0
  149. arelle/plugin/OimTaxonomy/XbrlTypes.py +23 -0
  150. arelle/plugin/OimTaxonomy/XbrlUnit.py +17 -0
  151. arelle/plugin/OimTaxonomy/__init__.py +1037 -0
  152. arelle/plugin/OimTaxonomy/resources/iso4217.json +4479 -0
  153. arelle/plugin/OimTaxonomy/resources/oim-taxonomy-schema.json +935 -0
  154. arelle/plugin/OimTaxonomy/resources/ref.json +333 -0
  155. arelle/plugin/OimTaxonomy/resources/transform-types.json +2481 -0
  156. arelle/plugin/OimTaxonomy/resources/types.json +727 -0
  157. arelle/plugin/OimTaxonomy/resources/utr.json +3046 -0
  158. arelle/plugin/OimTaxonomy/resources/xbrlSpec.json +1082 -0
  159. arelle/plugin/formulaLoader.py +3 -3
  160. arelle/plugin/formulaSaver.py +4 -4
  161. arelle/plugin/inlineXbrlDocumentSet.py +331 -102
  162. arelle/plugin/internet/proxyNTLM/HTTPNtlmAuthHandler.py +1 -1
  163. arelle/plugin/loadFromExcel.py +13 -10
  164. arelle/plugin/loadFromOIM.py +16 -3096
  165. arelle/plugin/logging/saveMessages.py +1 -1
  166. arelle/plugin/saveHtmlEBAtables.py +293 -213
  167. arelle/plugin/saveLoadableOIM.py +652 -361
  168. arelle/plugin/saveOIMTaxonomy.py +311 -0
  169. arelle/plugin/streamingExtensions.py +1 -1
  170. arelle/plugin/systemInfo.py +46 -0
  171. arelle/plugin/transforms/tester.py +4 -4
  172. arelle/plugin/validate/CIPC/Const.py +18 -0
  173. arelle/plugin/validate/CIPC/__init__.py +34 -13
  174. arelle/plugin/validate/DBA/DisclosureSystems.py +12 -0
  175. arelle/plugin/validate/DBA/PluginValidationDataExtension.py +165 -0
  176. arelle/plugin/validate/DBA/ValidationPluginExtension.py +545 -0
  177. arelle/plugin/validate/DBA/__init__.py +49 -0
  178. arelle/plugin/validate/DBA/resources/config.xml +21 -0
  179. arelle/plugin/validate/DBA/rules/__init__.py +323 -0
  180. arelle/plugin/validate/DBA/rules/fr.py +1377 -0
  181. arelle/plugin/validate/DBA/rules/tc.py +45 -0
  182. arelle/plugin/validate/DBA/rules/th.py +172 -0
  183. arelle/plugin/validate/DBA/rules/tm.py +351 -0
  184. arelle/plugin/validate/DBA/rules/tr.py +373 -0
  185. arelle/plugin/validate/EBA/__init__.py +11 -12
  186. arelle/plugin/validate/EDINET/Constants.py +208 -0
  187. arelle/plugin/validate/EDINET/ContextRequirement.py +58 -0
  188. arelle/plugin/validate/EDINET/ControllerPluginData.py +298 -0
  189. arelle/plugin/validate/EDINET/CoverItemRequirements.py +42 -0
  190. arelle/plugin/validate/EDINET/DeiRequirements.py +118 -0
  191. arelle/plugin/validate/EDINET/DisclosureSystems.py +1 -0
  192. arelle/plugin/validate/EDINET/FilingFormat.py +275 -0
  193. arelle/plugin/validate/EDINET/FormType.py +134 -0
  194. arelle/plugin/validate/EDINET/ManifestInstance.py +236 -0
  195. arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +640 -0
  196. arelle/plugin/validate/EDINET/ReportFolderType.py +162 -0
  197. arelle/plugin/validate/EDINET/Statement.py +139 -0
  198. arelle/plugin/validate/EDINET/TableOfContentsBuilder.py +493 -0
  199. arelle/plugin/validate/EDINET/UploadContents.py +48 -0
  200. arelle/plugin/validate/EDINET/ValidationPluginExtension.py +64 -0
  201. arelle/plugin/validate/EDINET/__init__.py +109 -0
  202. arelle/plugin/validate/EDINET/resources/config.xml +22 -0
  203. arelle/plugin/validate/EDINET/resources/cover-item-requirements.json +793 -0
  204. arelle/plugin/validate/EDINET/resources/dei-requirements.csv +27 -0
  205. arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml +62 -0
  206. arelle/plugin/validate/EDINET/rules/contexts.py +547 -0
  207. arelle/plugin/validate/EDINET/rules/edinet.py +1991 -0
  208. arelle/plugin/validate/EDINET/rules/frta.py +301 -0
  209. arelle/plugin/validate/EDINET/rules/gfm.py +2394 -0
  210. arelle/plugin/validate/EDINET/rules/manifests.py +88 -0
  211. arelle/plugin/validate/EDINET/rules/upload.py +1370 -0
  212. arelle/plugin/validate/ESEF/Const.py +16 -75
  213. arelle/plugin/validate/ESEF/Dimensions.py +2 -2
  214. arelle/plugin/validate/ESEF/ESEF_2021/DTS.py +6 -1
  215. arelle/plugin/validate/ESEF/ESEF_2021/Image.py +7 -4
  216. arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +80 -57
  217. arelle/plugin/validate/ESEF/ESEF_Current/DTS.py +60 -22
  218. arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +272 -133
  219. arelle/plugin/validate/ESEF/Util.py +5 -19
  220. arelle/plugin/validate/ESEF/__init__.py +61 -46
  221. arelle/plugin/validate/ESEF/resources/authority-validations.json +120 -10
  222. arelle/plugin/validate/ESEF/resources/config.xml +44 -3
  223. arelle/plugin/validate/FERC/__init__.py +31 -18
  224. arelle/plugin/validate/FERC/config.xml +18 -18
  225. arelle/plugin/validate/NL/DisclosureSystems.py +19 -3
  226. arelle/plugin/validate/NL/PluginValidationDataExtension.py +710 -7
  227. arelle/plugin/validate/NL/ValidationPluginExtension.py +117 -12
  228. arelle/plugin/validate/NL/__init__.py +21 -10
  229. arelle/plugin/validate/NL/resources/config.xml +27 -6
  230. arelle/plugin/validate/NL/rules/br_kvk.py +81 -21
  231. arelle/plugin/validate/NL/rules/fg_nl.py +292 -0
  232. arelle/plugin/validate/NL/rules/fr_kvk.py +60 -7
  233. arelle/plugin/validate/NL/rules/fr_nl.py +705 -24
  234. arelle/plugin/validate/NL/rules/nl_kvk.py +2182 -0
  235. arelle/plugin/validate/ROS/DisclosureSystems.py +1 -0
  236. arelle/plugin/validate/ROS/PluginValidationDataExtension.py +109 -0
  237. arelle/plugin/validate/ROS/ValidationPluginExtension.py +27 -0
  238. arelle/plugin/validate/ROS/__init__.py +28 -341
  239. arelle/plugin/validate/ROS/resources/config.xml +20 -0
  240. arelle/plugin/validate/ROS/rules/__init__.py +56 -0
  241. arelle/plugin/validate/ROS/rules/ros.py +393 -0
  242. arelle/plugin/validate/UK/ValidateUK.py +1372 -0
  243. arelle/plugin/validate/{HMRC → UK}/__init__.py +195 -189
  244. arelle/plugin/validate/{HMRC → UK}/config.xml +1 -1
  245. arelle/plugin/xbrlDB/SqlDb.py +1 -1
  246. arelle/plugin/xbrlDB/XbrlOpenSqlDB.py +5 -5
  247. arelle/plugin/xbrlDB/XbrlPublicPostgresDB.py +1 -1
  248. arelle/plugin/xbrlDB/XbrlSemanticJsonDB.py +1 -1
  249. arelle/plugin/xbrlDB/XbrlSemanticRdfDB.py +1 -1
  250. arelle/plugin/xbrlDB/__init__.py +4 -1
  251. arelle/{RenderingEvaluator.py → rendering/RenderingEvaluator.py} +120 -99
  252. arelle/rendering/RenderingLayout.py +476 -0
  253. arelle/rendering/RenderingResolution.py +814 -0
  254. arelle/resources/cache/http/www.eurofiling.info/eu/fr/xbrl/ext/filing-indicators.xsd +20 -0
  255. arelle/resources/cache/http/www.w3.org/2001/03/xml.xsd +117 -0
  256. arelle/resources/cache/http/www.w3.org/2001/XMLSchema.xsd +2534 -0
  257. arelle/resources/cache/http/www.w3.org/2001/xml.xsd +287 -0
  258. arelle/resources/cache/http/www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd +779 -0
  259. arelle/resources/cache/http/www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd +486 -0
  260. arelle/resources/cache/http/www.xbrl.org/2003/xl-2003-12-31.xsd +251 -0
  261. arelle/resources/cache/http/www.xbrl.org/2003/xlink-2003-12-31.xsd +121 -0
  262. arelle/resources/cache/http/www.xbrl.org/2004/ref-2004-08-10.xsd +129 -0
  263. arelle/resources/cache/http/www.xbrl.org/2005/xbrldt-2005.xsd +53 -0
  264. arelle/resources/cache/http/www.xbrl.org/2006/ref-2006-02-27.xsd +120 -0
  265. arelle/resources/cache/http/www.xbrl.org/2006/xbrldi-2006.xsd +41 -0
  266. arelle/resources/cache/http/www.xbrl.org/2008/boolean-filter.xsd +51 -0
  267. arelle/resources/cache/http/www.xbrl.org/2008/concept-filter.xsd +127 -0
  268. arelle/resources/cache/http/www.xbrl.org/2008/conformance.xsd +116 -0
  269. arelle/resources/cache/http/www.xbrl.org/2008/conformanceFunction.xsd +51 -0
  270. arelle/resources/cache/http/www.xbrl.org/2008/consistency-assertion.xsd +66 -0
  271. arelle/resources/cache/http/www.xbrl.org/2008/dimension-filter.xsd +86 -0
  272. arelle/resources/cache/http/www.xbrl.org/2008/entity-filter.xsd +92 -0
  273. arelle/resources/cache/http/www.xbrl.org/2008/existence-assertion.xsd +44 -0
  274. arelle/resources/cache/http/www.xbrl.org/2008/formula.xsd +261 -0
  275. arelle/resources/cache/http/www.xbrl.org/2008/function.xsd +90 -0
  276. arelle/resources/cache/http/www.xbrl.org/2008/general-filter.xsd +38 -0
  277. arelle/resources/cache/http/www.xbrl.org/2008/generic-label.xsd +80 -0
  278. arelle/resources/cache/http/www.xbrl.org/2008/generic-link.xsd +81 -0
  279. arelle/resources/cache/http/www.xbrl.org/2008/generic-reference.xsd +63 -0
  280. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xbrl-instance-2003-12-31-ixmod.xsd +788 -0
  281. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xbrl-linkbase-2003-12-31-ixmod.xsd +488 -0
  282. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xl-2003-12-31.xsd +248 -0
  283. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xlink-2003-12-31.xsd +117 -0
  284. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xframes-1.xsd +166 -0
  285. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-applet-1.xsd +66 -0
  286. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-attribs-1.xsd +72 -0
  287. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-base-1.xsd +36 -0
  288. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic-form-1.xsd +195 -0
  289. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic-table-1.xsd +169 -0
  290. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-model-1.xsd +376 -0
  291. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-module-redefines-1.xsd +61 -0
  292. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-modules-1.xsd +259 -0
  293. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10.xsd +98 -0
  294. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-bdo-1.xsd +78 -0
  295. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkphras-1.xsd +161 -0
  296. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkpres-1.xsd +37 -0
  297. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkstruct-1.xsd +49 -0
  298. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-charent-1.xsd +38 -0
  299. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-copyright-1.xsd +29 -0
  300. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-csismap-1.xsd +96 -0
  301. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-datatypes-1.xsd +128 -0
  302. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-edit-1.xsd +39 -0
  303. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-events-1.xsd +130 -0
  304. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-form-1.xsd +326 -0
  305. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-frames-1.xsd +113 -0
  306. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-framework-1.xsd +66 -0
  307. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-hypertext-1.xsd +47 -0
  308. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-iframe-1.xsd +68 -0
  309. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-image-1.xsd +45 -0
  310. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlphras-1.xsd +163 -0
  311. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlpres-1.xsd +39 -0
  312. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlstruct-1.xsd +50 -0
  313. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlstyle-1.xsd +27 -0
  314. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-legacy-1.xsd +97 -0
  315. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-link-1.xsd +45 -0
  316. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-list-1.xsd +99 -0
  317. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-meta-1.xsd +42 -0
  318. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-misc-1.xsd +441 -0
  319. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-nameident-1.xsd +63 -0
  320. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-notations-1.xsd +69 -0
  321. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-object-1.xsd +76 -0
  322. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-param-1.xsd +51 -0
  323. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-pres-1.xsd +51 -0
  324. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ruby-1.xsd +171 -0
  325. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ruby-basic-1.xsd +89 -0
  326. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-script-1.xsd +70 -0
  327. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ssismap-1.xsd +43 -0
  328. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-struct-1.xsd +112 -0
  329. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-style-1.xsd +52 -0
  330. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-table-1.xsd +272 -0
  331. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-target-1.xsd +53 -0
  332. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-text-1.xsd +67 -0
  333. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-model-1.xsd +677 -0
  334. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-module-redefines-1.xsd +335 -0
  335. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-modules-1.xsd +528 -0
  336. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11.xsd +104 -0
  337. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml2.xsd +21 -0
  338. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-1.xsd +73 -0
  339. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-2.xsd +74 -0
  340. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-attribs-1.xsd +73 -0
  341. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-attribs-2.xsd +75 -0
  342. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-copyright-1.xsd +34 -0
  343. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-copyright-2.xsd +34 -0
  344. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-handlers-2.xsd +98 -0
  345. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-definitions.xsd +225 -0
  346. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-model.xsd +681 -0
  347. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-modules.xsd +535 -0
  348. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0.xsd +40 -0
  349. arelle/resources/cache/http/www.xbrl.org/2008/match-filter.xsd +94 -0
  350. arelle/resources/cache/http/www.xbrl.org/2008/period-filter.xsd +86 -0
  351. arelle/resources/cache/http/www.xbrl.org/2008/registry.xsd +145 -0
  352. arelle/resources/cache/http/www.xbrl.org/2008/relative-filter.xsd +38 -0
  353. arelle/resources/cache/http/www.xbrl.org/2008/segment-scenario-filter.xsd +41 -0
  354. arelle/resources/cache/http/www.xbrl.org/2008/tuple-filter.xsd +83 -0
  355. arelle/resources/cache/http/www.xbrl.org/2008/unit-filter.xsd +58 -0
  356. arelle/resources/cache/http/www.xbrl.org/2008/validation.xsd +78 -0
  357. arelle/resources/cache/http/www.xbrl.org/2008/value-assertion.xsd +43 -0
  358. arelle/resources/cache/http/www.xbrl.org/2008/value-filter.xsd +43 -0
  359. arelle/resources/cache/http/www.xbrl.org/2008/variable.xsd +240 -0
  360. arelle/resources/cache/http/www.xbrl.org/2010/aspect-cover-filter.xsd +67 -0
  361. arelle/resources/cache/http/www.xbrl.org/2010/concept-relation-filter.xsd +108 -0
  362. arelle/resources/cache/http/www.xbrl.org/2010/custom-function-implementation.xsd +71 -0
  363. arelle/resources/cache/http/www.xbrl.org/2010/generic-message.xsd +68 -0
  364. arelle/resources/cache/http/www.xbrl.org/2010/validation-message.xsd +50 -0
  365. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xbrl-instance-2003-12-31-ixmod.xsd +788 -0
  366. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xbrl-linkbase-2003-12-31-ixmod.xsd +488 -0
  367. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xl-2003-12-31.xsd +248 -0
  368. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xlink-2003-12-31.xsd +117 -0
  369. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xframes-1.xsd +166 -0
  370. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-applet-1.xsd +66 -0
  371. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-attribs-1.xsd +72 -0
  372. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-base-1.xsd +36 -0
  373. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic-form-1.xsd +195 -0
  374. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic-table-1.xsd +169 -0
  375. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-model-1.xsd +376 -0
  376. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-module-redefines-1.xsd +61 -0
  377. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-modules-1.xsd +259 -0
  378. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10.xsd +98 -0
  379. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-bdo-1.xsd +78 -0
  380. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkphras-1.xsd +161 -0
  381. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkpres-1.xsd +37 -0
  382. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkstruct-1.xsd +49 -0
  383. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-charent-1.xsd +38 -0
  384. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-copyright-1.xsd +29 -0
  385. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-csismap-1.xsd +96 -0
  386. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-datatypes-1.xsd +128 -0
  387. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-edit-1.xsd +39 -0
  388. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-events-1.xsd +130 -0
  389. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-form-1.xsd +326 -0
  390. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-frames-1.xsd +113 -0
  391. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-framework-1.xsd +66 -0
  392. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-hypertext-1.xsd +47 -0
  393. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-iframe-1.xsd +68 -0
  394. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-image-1.xsd +45 -0
  395. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlphras-1.xsd +163 -0
  396. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlpres-1.xsd +39 -0
  397. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlstruct-1.xsd +50 -0
  398. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlstyle-1.xsd +27 -0
  399. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-legacy-1.xsd +97 -0
  400. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-link-1.xsd +45 -0
  401. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-list-1.xsd +99 -0
  402. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-meta-1.xsd +42 -0
  403. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-misc-1.xsd +441 -0
  404. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-nameident-1.xsd +63 -0
  405. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-notations-1.xsd +69 -0
  406. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-object-1.xsd +76 -0
  407. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-param-1.xsd +51 -0
  408. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-pres-1.xsd +51 -0
  409. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ruby-1.xsd +171 -0
  410. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ruby-basic-1.xsd +89 -0
  411. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-script-1.xsd +70 -0
  412. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ssismap-1.xsd +43 -0
  413. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-struct-1.xsd +112 -0
  414. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-style-1.xsd +52 -0
  415. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-table-1.xsd +272 -0
  416. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-target-1.xsd +53 -0
  417. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-text-1.xsd +67 -0
  418. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-model-1.xsd +677 -0
  419. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-module-redefines-1.xsd +335 -0
  420. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-modules-1.xsd +528 -0
  421. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11.xsd +104 -0
  422. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml2.xsd +21 -0
  423. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-1.xsd +73 -0
  424. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-2.xsd +74 -0
  425. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-attribs-1.xsd +73 -0
  426. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-attribs-2.xsd +75 -0
  427. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-copyright-1.xsd +34 -0
  428. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-copyright-2.xsd +34 -0
  429. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-handlers-2.xsd +98 -0
  430. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-definitions.xsd +252 -0
  431. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-model.xsd +681 -0
  432. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-modules.xsd +535 -0
  433. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1.xsd +40 -0
  434. arelle/resources/cache/http/www.xbrl.org/2013/match-filter.xsd +94 -0
  435. arelle/resources/cache/http/www.xbrl.org/2013/preferred-label.xsd +12 -0
  436. arelle/resources/cache/http/www.xbrl.org/2013/versioning-base.xsd +142 -0
  437. arelle/resources/cache/http/www.xbrl.org/2013/versioning-concept-details.xsd +143 -0
  438. arelle/resources/cache/http/www.xbrl.org/2013/versioning-concept-use.xsd +64 -0
  439. arelle/resources/cache/http/www.xbrl.org/2013/versioning-dimensions.xsd +162 -0
  440. arelle/resources/cache/http/www.xbrl.org/2014/extensible-enumerations.xsd +27 -0
  441. arelle/resources/cache/http/www.xbrl.org/2014/table.xsd +356 -0
  442. arelle/resources/cache/http/www.xbrl.org/2014/tablemodel.xsd +156 -0
  443. arelle/resources/cache/http/www.xbrl.org/2016/assertion-severity.xsd +29 -0
  444. arelle/resources/cache/http/www.xbrl.org/2016/severities.xml +21 -0
  445. arelle/resources/cache/http/www.xbrl.org/2016/taxonomy-package-catalog.xsd +38 -0
  446. arelle/resources/cache/http/www.xbrl.org/2016/taxonomy-package.xsd +154 -0
  447. arelle/resources/cache/http/www.xbrl.org/2022/assertion-severity.xsd +43 -0
  448. arelle/resources/cache/http/www.xbrl.org/2022/severities.xml +21 -0
  449. arelle/resources/cache/http/www.xbrl.org/dtr/type/nonNumeric-2009-12-16.xsd +76 -0
  450. arelle/resources/cache/http/www.xbrl.org/dtr/type/numeric-2009-12-16.xsd +78 -0
  451. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/accounting-arcrole-2023-01-04.xsd +39 -0
  452. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/deprecated-2009-12-16.xsd +29 -0
  453. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/esma-arcrole-2018-11-21.xsd +14 -0
  454. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/factExplanatory-2009-12-16.xsd +13 -0
  455. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/jpfr-arcrole-2007-11-07.xsd +27 -0
  456. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/parent-child-2013-09-19.xsd +12 -0
  457. arelle/resources/cache/http/www.xbrl.org/lrr/role/deprecated-2009-12-16.xsd +17 -0
  458. arelle/resources/cache/http/www.xbrl.org/lrr/role/jpfr-role-2007-11-07.xsd +47 -0
  459. arelle/resources/cache/http/www.xbrl.org/lrr/role/negated-2008-03-31.xsd +30 -0
  460. arelle/resources/cache/http/www.xbrl.org/lrr/role/negated-2009-12-16.xsd +33 -0
  461. arelle/resources/cache/http/www.xbrl.org/lrr/role/negative-2009-12-16.xsd +25 -0
  462. arelle/resources/cache/http/www.xbrl.org/lrr/role/net-2009-12-16.xsd +13 -0
  463. arelle/resources/cache/http/www.xbrl.org/lrr/role/positive-2009-12-16.xsd +25 -0
  464. arelle/resources/cache/http/www.xbrl.org/lrr/role/property-2022-09-28.xsd +15 -0
  465. arelle/resources/cache/http/www.xbrl.org/lrr/role/reference-2009-12-16.xsd +21 -0
  466. arelle/resources/cache/http/www.xbrl.org/lrr/role/restated-2006-02-21.xsd +19 -0
  467. arelle/resources/cache/http/www.xbrl.org/utr/2012-01-30/utr.xml +4543 -0
  468. arelle/resources/cache/http/www.xbrl.org/utr/2012-10-31/utr.xml +4510 -0
  469. arelle/resources/cache/http/www.xbrl.org/utr/2012-11-30/utr.xml +4567 -0
  470. arelle/resources/cache/http/www.xbrl.org/utr/2013-02-28/utr.xml +5180 -0
  471. arelle/resources/cache/http/www.xbrl.org/utr/2013-05-17/utr.xml +5349 -0
  472. arelle/resources/cache/http/www.xbrl.org/utr/2016-08-10/utr.xml +5363 -0
  473. arelle/resources/cache/http/www.xbrl.org/utr/2017-07-12/utr.xml +6164 -0
  474. arelle/resources/cache/http/www.xbrl.org/utr/2021-02-16/utr.xml +6370 -0
  475. arelle/resources/cache/http/www.xbrl.org/utr/2021-12-08/utr.xml +6493 -0
  476. arelle/resources/cache/http/www.xbrl.org/utr/2022-02-16/utr.xml +6551 -0
  477. arelle/resources/cache/http/www.xbrl.org/utr/2022-07-20/utr.xml +6638 -0
  478. arelle/resources/cache/http/www.xbrl.org/utr/2023-12-20/utr.xml +6680 -0
  479. arelle/resources/cache/http/www.xbrl.org/utr/2024-01-31/utr.xml +6680 -0
  480. arelle/resources/cache/http/www.xbrl.org/utr/2024-10-22/utr.xml +6693 -0
  481. arelle/resources/cache/http/www.xbrl.org/utr/utr.xml +6693 -0
  482. arelle/resources/cache/https/www.xbrl.org/2005/conformance.xsd +87 -0
  483. arelle/resources/cache/https/www.xbrl.org/2020/extensible-enumerations-2.0.xsd +51 -0
  484. arelle/resources/cache/https/www.xbrl.org/2023/calculation-1.1.xsd +27 -0
  485. arelle/resources/cache/https/www.xbrl.org/dtr/type/2020-01-21/types.xsd +812 -0
  486. arelle/resources/cache/https/www.xbrl.org/dtr/type/2022-03-31/types.xsd +847 -0
  487. arelle/resources/cache/https/www.xbrl.org/dtr/type/2024-01-31/types.xsd +897 -0
  488. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators-def.xml +68 -0
  489. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators-label.xml +84 -0
  490. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators.xsd +67 -0
  491. arelle/resources/libs/Tktable2.11/linux-x86_64/README.txt +149 -0
  492. arelle/resources/libs/Tktable2.11/linux-x86_64/html/tkTable.html +2039 -0
  493. arelle/resources/libs/Tktable2.11/linux-x86_64/libTktable2.11.so +0 -0
  494. arelle/resources/libs/Tktable2.11/linux-x86_64/license.txt +51 -0
  495. arelle/resources/libs/Tktable2.11/linux-x86_64/pkgIndex.tcl +3 -0
  496. arelle/resources/libs/Tktable2.11/linux-x86_64/tkTable.tcl +825 -0
  497. arelle/resources/libs/Tktable2.11/linux-x86_64/tktable.py +674 -0
  498. arelle/resources/libs/Tktable2.11/macos-arm64/README.txt +149 -0
  499. arelle/resources/libs/Tktable2.11/macos-arm64/html/tkTable.html +2039 -0
  500. arelle/resources/libs/Tktable2.11/macos-arm64/libTktable2.11.dylib +0 -0
  501. arelle/resources/libs/Tktable2.11/macos-arm64/license.txt +51 -0
  502. arelle/resources/libs/Tktable2.11/macos-arm64/pkgIndex.tcl +2 -0
  503. arelle/resources/libs/Tktable2.11/macos-arm64/tkTable.tcl +825 -0
  504. arelle/resources/libs/Tktable2.11/macos-arm64/tktable.py +674 -0
  505. arelle/resources/libs/Tktable2.11/macos-x86_64/README.txt +149 -0
  506. arelle/resources/libs/Tktable2.11/macos-x86_64/html/tkTable.html +2039 -0
  507. arelle/resources/libs/Tktable2.11/macos-x86_64/libTktable2.11.dylib +0 -0
  508. arelle/resources/libs/Tktable2.11/macos-x86_64/license.txt +51 -0
  509. arelle/resources/libs/Tktable2.11/macos-x86_64/pkgIndex.tcl +2 -0
  510. arelle/resources/libs/Tktable2.11/macos-x86_64/tkTable.tcl +825 -0
  511. arelle/resources/libs/Tktable2.11/macos-x86_64/tktable.py +674 -0
  512. arelle/resources/libs/Tktable2.11/win-x86_64/Tktable.dll +0 -0
  513. arelle/resources/libs/Tktable2.11/win-x86_64/pkgIndex.tcl +2 -0
  514. arelle/resources/libs/Tktable2.11/win-x86_64/tkTable.tcl +825 -0
  515. arelle/typing.py +9 -4
  516. arelle/utils/Contexts.py +38 -0
  517. arelle/utils/EntryPointDetection.py +139 -0
  518. arelle/utils/Equivalence.py +22 -0
  519. arelle/utils/{validate/PluginValidationData.py → PluginData.py} +5 -2
  520. arelle/utils/PluginHooks.py +256 -5
  521. arelle/utils/Units.py +36 -0
  522. arelle/utils/validate/Decorator.py +5 -3
  523. arelle/utils/validate/DetectScriptsInXhtml.py +99 -0
  524. arelle/utils/validate/ESEFImage.py +283 -0
  525. arelle/utils/validate/Validation.py +9 -1
  526. arelle/utils/validate/ValidationPlugin.py +74 -11
  527. arelle/utils/validate/ValidationUtil.py +55 -0
  528. arelle/webserver/bottle.py +5 -4424
  529. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/METADATA +51 -42
  530. arelle_release-2.37.71.dist-info/RECORD +697 -0
  531. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/WHEEL +1 -1
  532. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info/licenses}/LICENSE.md +1 -4
  533. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/top_level.txt +0 -1
  534. arelle/DialogOpenTaxonomyPackage.py +0 -1
  535. arelle/RenderingResolver.py +0 -624
  536. arelle/examples/.pydevproject +0 -5
  537. arelle/examples/CustomLogger.py +0 -43
  538. arelle/examples/LoadEFMvalidate.py +0 -32
  539. arelle/examples/LoadSavePreLbCsv.py +0 -26
  540. arelle/examples/LoadValidate.cs +0 -31
  541. arelle/examples/LoadValidate.py +0 -36
  542. arelle/examples/LoadValidateCmdLine.java +0 -69
  543. arelle/examples/LoadValidatePostedZip.java +0 -57
  544. arelle/examples/LoadValidateWebService.java +0 -34
  545. arelle/examples/SaveTableToExelle.py +0 -140
  546. arelle/examples/TR3toTR4.py +0 -88
  547. arelle/examples/plugin/bigInstance.py +0 -394
  548. arelle/examples/plugin/cmdWebServerExtension.py +0 -42
  549. arelle/examples/plugin/crashTest.py +0 -38
  550. arelle/examples/plugin/formulaSuiteConverter.py +0 -212
  551. arelle/examples/plugin/functionsCustom.py +0 -59
  552. arelle/examples/plugin/hello_dolly.py +0 -64
  553. arelle/examples/plugin/hello_i18n.pot +0 -26
  554. arelle/examples/plugin/hello_i18n.py +0 -32
  555. arelle/examples/plugin/importTestChild1.py +0 -21
  556. arelle/examples/plugin/importTestChild2.py +0 -22
  557. arelle/examples/plugin/importTestGrandchild1.py +0 -21
  558. arelle/examples/plugin/importTestGrandchild2.py +0 -21
  559. arelle/examples/plugin/importTestImported1.py +0 -23
  560. arelle/examples/plugin/importTestImported11.py +0 -22
  561. arelle/examples/plugin/importTestParent.py +0 -48
  562. arelle/examples/plugin/locale/fr/LC_MESSAGES/hello_i18n.po +0 -25
  563. arelle/examples/plugin/packagedImportTest/__init__.py +0 -47
  564. arelle/examples/plugin/packagedImportTest/importTestChild1.py +0 -21
  565. arelle/examples/plugin/packagedImportTest/importTestChild2.py +0 -22
  566. arelle/examples/plugin/packagedImportTest/importTestGrandchild1.py +0 -21
  567. arelle/examples/plugin/packagedImportTest/importTestGrandchild2.py +0 -21
  568. arelle/examples/plugin/packagedImportTest/importTestImported1.py +0 -24
  569. arelle/examples/plugin/packagedImportTest/importTestImported11.py +0 -21
  570. arelle/examples/plugin/packagedImportTest/subdir/importTestImported111.py +0 -21
  571. arelle/examples/plugin/packagedImportTest/subdir/subsubdir/importTestImported1111.py +0 -21
  572. arelle/examples/plugin/sakaCalendar.py +0 -215
  573. arelle/examples/plugin/saveInstanceInfoset.py +0 -121
  574. arelle/examples/plugin/streamingExtensions.py +0 -335
  575. arelle/examples/plugin/testcaseCalc11ValidateSetup.py +0 -32
  576. arelle/examples/plugin/testcaseIxExpectedHtmlFixup.py +0 -45
  577. arelle/examples/plugin/updateTableLB.py +0 -242
  578. arelle/examples/plugin/validate/XYZ/DisclosureSystems.py +0 -2
  579. arelle/examples/plugin/validate/XYZ/PluginValidationDataExtension.py +0 -10
  580. arelle/examples/plugin/validate/XYZ/ValidationPluginExtension.py +0 -49
  581. arelle/examples/plugin/validate/XYZ/__init__.py +0 -75
  582. arelle/examples/plugin/validate/XYZ/resources/config.xml +0 -16
  583. arelle/examples/plugin/validate/XYZ/rules/rules01.py +0 -109
  584. arelle/examples/plugin/validate/XYZ/rules/rules02.py +0 -58
  585. arelle/examples/plugin/validateSchemaLxml.py +0 -156
  586. arelle/examples/plugin/validateTableInfoset.py +0 -52
  587. arelle/examples/us-gaap-dei-docType-extraction-frm.xml +0 -90
  588. arelle/examples/us-gaap-dei-ratio-cash-frm.xml +0 -150
  589. arelle/plugin/functionsXmlCreation.py +0 -106
  590. arelle/plugin/instanceInfo.py +0 -306
  591. arelle/plugin/loadFromOIM-2018.py +0 -1282
  592. arelle/plugin/objectmaker.py +0 -285
  593. arelle/plugin/sphinx/FormulaGenerator.py +0 -823
  594. arelle/plugin/sphinx/SphinxContext.py +0 -404
  595. arelle/plugin/sphinx/SphinxEvaluator.py +0 -783
  596. arelle/plugin/sphinx/SphinxMethods.py +0 -1287
  597. arelle/plugin/sphinx/SphinxParser.py +0 -1093
  598. arelle/plugin/sphinx/SphinxValidator.py +0 -163
  599. arelle/plugin/sphinx/US-GAAP Ratios Example.xsr +0 -52
  600. arelle/plugin/sphinx/__init__.py +0 -285
  601. arelle/plugin/transforms/SEC/__init__.py +0 -308
  602. arelle/plugin/transforms/SEC/conf/README.md +0 -39
  603. arelle/plugin/transforms/SEC/conf/extractTestcase.sh +0 -2
  604. arelle/plugin/transforms/SEC/conf/extractTestcase.xsl +0 -109
  605. arelle/plugin/transforms/SEC/conf/runIxtSecTests.sh +0 -16
  606. arelle/plugin/transforms/SEC/conf/saxon9.jar +0 -0
  607. arelle/plugin/transforms/SEC/conf/testcase.xml +0 -7117
  608. arelle/plugin/transforms/SEC/conf/tests.xml +0 -848
  609. arelle/plugin/transforms/SEC/text2num.py +0 -110
  610. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-boolballotbox.xml +0 -66
  611. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-countrynameen.xml +0 -65
  612. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-datequarterend.xml +0 -66
  613. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durday.xml +0 -61
  614. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durhour.xml +0 -69
  615. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durmonth.xml +0 -71
  616. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durweek.xml +0 -70
  617. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durwordsen.xml +0 -56
  618. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-duryear.xml +0 -64
  619. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-edgarprovcountryen.xml +0 -65
  620. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-entityfilercategoryen.xml +0 -63
  621. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-exchnameen.xml +0 -86
  622. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-numwordsen.xml +0 -55
  623. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-stateprovnameen.xml +0 -64
  624. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-yesnoballotbox.xml +0 -66
  625. arelle/plugin/transforms/SEC/transformationRegistry/registry/transform-registry.xml +0 -314
  626. arelle/plugin/transforms/SEC/transformationRegistry/schema/inlinexbrl-sec-transformation.xsd +0 -418
  627. arelle/plugin/validate/EFM/Consts.py +0 -362
  628. arelle/plugin/validate/EFM/DTS.py +0 -569
  629. arelle/plugin/validate/EFM/Dimensions.py +0 -264
  630. arelle/plugin/validate/EFM/Document.py +0 -206
  631. arelle/plugin/validate/EFM/Filing.py +0 -4383
  632. arelle/plugin/validate/EFM/IsolateSeparateIXDSes.py +0 -19
  633. arelle/plugin/validate/EFM/MessageNumericId.py +0 -142
  634. arelle/plugin/validate/EFM/PreCalAlignment.py +0 -324
  635. arelle/plugin/validate/EFM/Util.py +0 -688
  636. arelle/plugin/validate/EFM/__init__.py +0 -843
  637. arelle/plugin/validate/EFM/config.xml +0 -333
  638. arelle/plugin/validate/EFM/resources/README.md +0 -57
  639. arelle/plugin/validate/EFM/resources/axiswarnings.json +0 -27
  640. arelle/plugin/validate/EFM/resources/cef-deprecated-concepts.json +0 -8
  641. arelle/plugin/validate/EFM/resources/country-deprecated-concepts.json +0 -19
  642. arelle/plugin/validate/EFM/resources/currency-deprecated-concepts.json +0 -7
  643. arelle/plugin/validate/EFM/resources/dei-deprecated-concepts.json +0 -8
  644. arelle/plugin/validate/EFM/resources/dei-validations.json +0 -2884
  645. arelle/plugin/validate/EFM/resources/dqc-us-rules.json +0 -1389
  646. arelle/plugin/validate/EFM/resources/ecd-deprecated-concepts.json +0 -1
  647. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-16-4.xml +0 -115
  648. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-0-4.xml +0 -300
  649. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-1.xml +0 -304
  650. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-2.xml +0 -290
  651. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-3-1.xml +0 -294
  652. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.1.xml +0 -549
  653. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.2.xml +0 -506
  654. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.3.xml +0 -496
  655. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-1.xml +0 -662
  656. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-2.xml +0 -3761
  657. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-3.xml +0 -3577
  658. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-1.xml +0 -4020
  659. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-2.xml +0 -3320
  660. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-3.xml +0 -2998
  661. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2012.xml +0 -957
  662. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2013.xml +0 -982
  663. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2014.xml +0 -1001
  664. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2015.xml +0 -1076
  665. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2016.xml +0 -120
  666. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-1.xml +0 -3329
  667. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-2.xml +0 -1230
  668. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-3.xml +0 -1113
  669. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-4.xml +0 -1321
  670. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-1-preview.xml +0 -1721
  671. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-1.xml +0 -1841
  672. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-2-2.xml +0 -1450
  673. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-2.xml +0 -1429
  674. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-4.xml +0 -1527
  675. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-1-1.xml +0 -2049
  676. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-1.xml +0 -2065
  677. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-2.xml +0 -1674
  678. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-3.xml +0 -1715
  679. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-all-years.xml +0 -10671
  680. arelle/plugin/validate/EFM/resources/edgartaxonomies/erxl.xsd +0 -69
  681. arelle/plugin/validate/EFM/resources/edgartaxonomies/extendedtaxonomies-all-years.xml +0 -18
  682. arelle/plugin/validate/EFM/resources/edgartaxonomies/ifrs-taxonomies.xml +0 -3126
  683. arelle/plugin/validate/EFM/resources/edgartaxonomies/ifrstaxonomies-all-years.xml +0 -22
  684. arelle/plugin/validate/EFM/resources/ex26-validations.json +0 -255
  685. arelle/plugin/validate/EFM/resources/exch-deprecated-concepts.json +0 -163
  686. arelle/plugin/validate/EFM/resources/ifrs-full-deprecated-concepts.json +0 -204
  687. arelle/plugin/validate/EFM/resources/invest-deprecated-concepts.json +0 -99
  688. arelle/plugin/validate/EFM/resources/ixbrl-transform-registries.json +0 -16
  689. arelle/plugin/validate/EFM/resources/naics-deprecated-concepts.json +0 -295
  690. arelle/plugin/validate/EFM/resources/oef-deprecated-concepts.json +0 -59
  691. arelle/plugin/validate/EFM/resources/other-standard-taxonomies.json +0 -12
  692. arelle/plugin/validate/EFM/resources/rr-deprecated-concepts.json +0 -14
  693. arelle/plugin/validate/EFM/resources/rxp-deprecated-concepts.json +0 -1
  694. arelle/plugin/validate/EFM/resources/shr-deprecated-concepts.json +0 -1
  695. arelle/plugin/validate/EFM/resources/sic-deprecated-concepts.json +0 -1
  696. arelle/plugin/validate/EFM/resources/signwarnings.json +0 -112
  697. arelle/plugin/validate/EFM/resources/srt-deprecated-concepts.json +0 -1
  698. arelle/plugin/validate/EFM/resources/stpr-deprecated-concepts.json +0 -1
  699. arelle/plugin/validate/EFM/resources/taxonomy-compatibility.json +0 -79
  700. arelle/plugin/validate/EFM/resources/us-gaap-deprecated-concepts.json +0 -2886
  701. arelle/plugin/validate/EFM/resources/us-gaap-rels-2020.json +0 -29068
  702. arelle/plugin/validate/EFM/resources/us-gaap-rels-2021.json +0 -29598
  703. arelle/plugin/validate/EFM/resources/us-gaap-rels-2022.json +0 -29141
  704. arelle/plugin/validate/EFM/resources/us-gaap-rels-2023.json +0 -29400
  705. arelle/plugin/validate/EFM/resources/vip-deprecated-concepts.json +0 -1
  706. arelle/plugin/validate/EFM/tools/CheckTxmyRefs.py +0 -180
  707. arelle/plugin/validate/EFM-htm/Const.py +0 -205
  708. arelle/plugin/validate/EFM-htm/__init__.py +0 -217
  709. arelle/plugin/validate/EFM-htm/config.xml +0 -17
  710. arelle/plugin/validate/EFM-htm/resources/efm-htm.dtd +0 -664
  711. arelle/plugin/validate/ESEF/ESEF_Current/Image.py +0 -199
  712. arelle/plugin/validate/ESEF_2022/__init__.py +0 -47
  713. arelle/plugin/validate/GFM/__init__.py +0 -59
  714. arelle/plugin/validate/GFM/config.xml +0 -82
  715. arelle/plugin/validate/SBRnl/CustomLoader.py +0 -19
  716. arelle/plugin/validate/SBRnl/DTS.py +0 -305
  717. arelle/plugin/validate/SBRnl/Dimensions.py +0 -357
  718. arelle/plugin/validate/SBRnl/Document.py +0 -799
  719. arelle/plugin/validate/SBRnl/Filing.py +0 -467
  720. arelle/plugin/validate/SBRnl/__init__.py +0 -75
  721. arelle/plugin/validate/SBRnl/config.xml +0 -26
  722. arelle/plugin/validate/SBRnl/sbr-nl-taxonomies.xml +0 -754
  723. arelle/plugin/validate/USBestPractices.py +0 -570
  724. arelle/plugin/validate/USCorpAction.py +0 -557
  725. arelle/plugin/validate/USSecTagging.py +0 -337
  726. arelle/plugin/validate/XDC/__init__.py +0 -77
  727. arelle/plugin/validate/XDC/config.xml +0 -20
  728. arelle/plugin/validate/XFsyntax/__init__.py +0 -64
  729. arelle/plugin/validate/XFsyntax/xf.py +0 -2227
  730. arelle/plugin/validate/__init__.py +0 -20
  731. arelle/plugin/validate/calc2.py +0 -536
  732. arelle/plugin/validateSBRnl.py +0 -530
  733. arelle/scripts-macOS/startWebServer.command +0 -3
  734. arelle/scripts-unix/startWebServer.sh +0 -1
  735. arelle/scripts-windows/startWebServer.bat +0 -5
  736. arelle_release-2.17.1.dist-info/RECORD +0 -676
  737. tests/__init__.py +0 -0
  738. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/ArelleGUITest.csproj +0 -30
  739. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Tests.cs +0 -381
  740. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Usings.cs +0 -1
  741. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest.sln +0 -31
  742. tests/integration_tests/ui_tests/resources/workiva.zip +0 -0
  743. tests/integration_tests/validation/README.md +0 -50
  744. tests/integration_tests/validation/conformance_suite_config.py +0 -59
  745. tests/integration_tests/validation/conformance_suite_configs.py +0 -63
  746. tests/integration_tests/validation/conformance_suite_configurations/efm_current.py +0 -261
  747. tests/integration_tests/validation/conformance_suite_configurations/esef_ixbrl_2021.py +0 -85
  748. tests/integration_tests/validation/conformance_suite_configurations/esef_ixbrl_2022.py +0 -90
  749. tests/integration_tests/validation/conformance_suite_configurations/esef_xhtml_2021.py +0 -15
  750. tests/integration_tests/validation/conformance_suite_configurations/esef_xhtml_2022.py +0 -15
  751. tests/integration_tests/validation/conformance_suite_configurations/nl_nt16.py +0 -13
  752. tests/integration_tests/validation/conformance_suite_configurations/nl_nt17.py +0 -13
  753. tests/integration_tests/validation/conformance_suite_configurations/nl_nt18.py +0 -13
  754. tests/integration_tests/validation/conformance_suite_configurations/xbrl_2_1.py +0 -34
  755. tests/integration_tests/validation/conformance_suite_configurations/xbrl_calculations_1_1.py +0 -40
  756. tests/integration_tests/validation/conformance_suite_configurations/xbrl_dimensions_1_0.py +0 -28
  757. tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensible_enumerations_1_0.py +0 -10
  758. tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensible_enumerations_2_0.py +0 -10
  759. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0.py +0 -9
  760. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_assertion_severity_2_0.py +0 -9
  761. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_function_registry.py +0 -14
  762. tests/integration_tests/validation/conformance_suite_configurations/xbrl_ixbrl_1_1.py +0 -22
  763. tests/integration_tests/validation/conformance_suite_configurations/xbrl_link_role_registry_1_0.py +0 -11
  764. tests/integration_tests/validation/conformance_suite_configurations/xbrl_oim_1_0.py +0 -19
  765. tests/integration_tests/validation/conformance_suite_configurations/xbrl_table_linkbase_1_0.py +0 -296
  766. tests/integration_tests/validation/conformance_suite_configurations/xbrl_taxonomy_packages_1_0.py +0 -13
  767. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_3.py +0 -13
  768. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_4.py +0 -13
  769. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_5.py +0 -13
  770. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_malformed_1_0.py +0 -31
  771. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_registry_1_0.py +0 -22
  772. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_structure_1_0.py +0 -18
  773. tests/integration_tests/validation/conftest.py +0 -24
  774. tests/integration_tests/validation/discover_tests.py +0 -22
  775. tests/integration_tests/validation/download_conformance_suites.py +0 -47
  776. tests/integration_tests/validation/run_conformance_suites.py +0 -175
  777. tests/integration_tests/validation/test_conformance_suites.py +0 -14
  778. tests/integration_tests/validation/validation_util.py +0 -271
  779. tests/resources/conformance_suites/nl_nt16/br_kvk/2-04-invalid-period.xbrl +0 -63
  780. tests/resources/conformance_suites/nl_nt16/br_kvk/2-04-testcase.xml +0 -22
  781. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-missing.xbrl +0 -53
  782. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-multiple.xbrl +0 -60
  783. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-testcase.xml +0 -33
  784. tests/resources/conformance_suites/nl_nt16/br_kvk/4-07-invalid.xbrl +0 -57
  785. tests/resources/conformance_suites/nl_nt16/br_kvk/4-07-testcase.xml +0 -22
  786. tests/resources/conformance_suites/nl_nt16/br_kvk/4-10-invalid.xbrl +0 -58
  787. tests/resources/conformance_suites/nl_nt16/br_kvk/4-10-testcase.xml +0 -22
  788. tests/resources/conformance_suites/nl_nt16/br_kvk/4-12-invalid.xbrl +0 -63
  789. tests/resources/conformance_suites/nl_nt16/br_kvk/4-12-testcase.xml +0 -22
  790. tests/resources/conformance_suites/nl_nt16/br_kvk/4-16-missing.xbrl +0 -61
  791. tests/resources/conformance_suites/nl_nt16/br_kvk/4-16-testcase.xml +0 -22
  792. tests/resources/conformance_suites/nl_nt16/br_kvk/4-20-invalid-date.xbrl +0 -89
  793. tests/resources/conformance_suites/nl_nt16/br_kvk/4-20-testcase.xml +0 -22
  794. tests/resources/conformance_suites/nl_nt16/fr_kvk/1-01-invalid-file-extension.xml +0 -56
  795. tests/resources/conformance_suites/nl_nt16/fr_kvk/1-01-testcase.xml +0 -22
  796. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-invalid-lang.xbrl +0 -56
  797. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-missing-lang.xbrl +0 -55
  798. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-testcase.xml +0 -33
  799. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-entrypoint.xsd +0 -6
  800. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-invalid-entrypoint.xbrl +0 -63
  801. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-testcase.xml +0 -22
  802. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-01-invalid-decimals.xbrl +0 -49
  803. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-01-testcase.xml +0 -22
  804. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-02-invalid-decimals.xbrl +0 -49
  805. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-02-testcase.xml +0 -22
  806. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-invalid-file.xbrl +0 -2
  807. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-invalid-zip.zip +0 -0
  808. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-testcase.xml +0 -33
  809. tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  810. tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-testcase.xml +0 -22
  811. tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  812. tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-testcase.xml +0 -22
  813. tests/resources/conformance_suites/nl_nt16/fr_nl/1-06-testcase.xml +0 -22
  814. tests/resources/conformance_suites/nl_nt16/fr_nl/1-06.invalid.xbrl +0 -2
  815. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-invalid-file.xbrl +0 -8
  816. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-invalid-zip.zip +0 -0
  817. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-testcase.xml +0 -33
  818. tests/resources/conformance_suites/nl_nt16/index.xml +0 -20
  819. tests/resources/conformance_suites/nl_nt17/br_kvk/2-04-invalid-period.xbrl +0 -63
  820. tests/resources/conformance_suites/nl_nt17/br_kvk/2-04-testcase.xml +0 -22
  821. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-missing.xbrl +0 -53
  822. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-multiple.xbrl +0 -60
  823. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-testcase.xml +0 -33
  824. tests/resources/conformance_suites/nl_nt17/br_kvk/4-07-invalid.xbrl +0 -57
  825. tests/resources/conformance_suites/nl_nt17/br_kvk/4-07-testcase.xml +0 -22
  826. tests/resources/conformance_suites/nl_nt17/br_kvk/4-10-invalid.xbrl +0 -58
  827. tests/resources/conformance_suites/nl_nt17/br_kvk/4-10-testcase.xml +0 -22
  828. tests/resources/conformance_suites/nl_nt17/br_kvk/4-12-invalid.xbrl +0 -63
  829. tests/resources/conformance_suites/nl_nt17/br_kvk/4-12-testcase.xml +0 -22
  830. tests/resources/conformance_suites/nl_nt17/br_kvk/4-16-missing.xbrl +0 -61
  831. tests/resources/conformance_suites/nl_nt17/br_kvk/4-16-testcase.xml +0 -22
  832. tests/resources/conformance_suites/nl_nt17/br_kvk/4-20-invalid-date.xbrl +0 -89
  833. tests/resources/conformance_suites/nl_nt17/br_kvk/4-20-testcase.xml +0 -22
  834. tests/resources/conformance_suites/nl_nt17/fr_kvk/1-01-invalid-file-extension.xml +0 -56
  835. tests/resources/conformance_suites/nl_nt17/fr_kvk/1-01-testcase.xml +0 -22
  836. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-invalid-lang.xbrl +0 -56
  837. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-missing-lang.xbrl +0 -55
  838. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-testcase.xml +0 -33
  839. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-entrypoint.xsd +0 -6
  840. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-invalid-entrypoint.xbrl +0 -63
  841. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-testcase.xml +0 -22
  842. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-01-invalid-decimals.xbrl +0 -49
  843. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-01-testcase.xml +0 -22
  844. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-02-invalid-decimals.xbrl +0 -49
  845. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-02-testcase.xml +0 -22
  846. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-invalid-file.xbrl +0 -2
  847. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-invalid-zip.zip +0 -0
  848. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-testcase.xml +0 -33
  849. tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  850. tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-testcase.xml +0 -22
  851. tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  852. tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-testcases.xml +0 -22
  853. tests/resources/conformance_suites/nl_nt17/fr_nl/1-06-testcase.xml +0 -22
  854. tests/resources/conformance_suites/nl_nt17/fr_nl/1-06.invalid.xbrl +0 -2
  855. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-invalid-file.xbrl +0 -8
  856. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-invalid-zip.zip +0 -0
  857. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-testcase.xml +0 -33
  858. tests/resources/conformance_suites/nl_nt17/index.xml +0 -20
  859. tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  860. tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-testcase.xml +0 -22
  861. tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  862. tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-testcases.xml +0 -22
  863. tests/resources/conformance_suites/nl_nt18/fr_nl/1-06-testcase.xml +0 -22
  864. tests/resources/conformance_suites/nl_nt18/fr_nl/1-06.invalid.xbrl +0 -2
  865. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-invalid-file.xbrl +0 -2
  866. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-invalid-zip.zip +0 -0
  867. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-testcase.xml +0 -33
  868. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-invalid-file.xbrl +0 -8
  869. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-invalid-zip.zip +0 -0
  870. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-testcase.xml +0 -33
  871. tests/resources/conformance_suites/nl_nt18/index.xml +0 -8
  872. tests/unit_tests/arelle/conftest.py +0 -16
  873. tests/unit_tests/arelle/formula/test_fact_aspects_cache.py +0 -170
  874. tests/unit_tests/arelle/plugin/test_loadfromoim.py +0 -40
  875. tests/unit_tests/arelle/plugin/test_plugin_imports.py +0 -27
  876. tests/unit_tests/arelle/test_betafeatures.py +0 -81
  877. tests/unit_tests/arelle/test_cntlr.py +0 -28
  878. tests/unit_tests/arelle/test_import.py +0 -40
  879. tests/unit_tests/arelle/test_locale.py +0 -73
  880. tests/unit_tests/arelle/test_modelmanager.py +0 -15
  881. tests/unit_tests/arelle/test_packagemanager.py +0 -65
  882. tests/unit_tests/arelle/test_pluginmanager.py +0 -176
  883. tests/unit_tests/arelle/test_qname.py +0 -140
  884. tests/unit_tests/arelle/test_runtimeoptions.py +0 -56
  885. tests/unit_tests/arelle/test_system_info.py +0 -26
  886. tests/unit_tests/arelle/test_updater.py +0 -507
  887. tests/unit_tests/arelle/test_urlutil.py +0 -49
  888. tests/unit_tests/arelle/test_version.py +0 -46
  889. tests/unit_tests/arelle/utils/validate/test_decorator.py +0 -59
  890. /arelle/{examples/plugin/validate/XYZ → plugin/validate/EDINET}/rules/__init__.py +0 -0
  891. /arelle/plugin/validate/{HMRC → UK}/consistencyChecksByName.json +0 -0
  892. /arelle/plugin/validate/{HMRC → UK}/hmrc-taxonomies.xml +0 -0
  893. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,814 @@
1
+ '''
2
+ See COPYRIGHT.md for copyright information.
3
+ '''
4
+ import os, io, sys, json
5
+ from collections import defaultdict, OrderedDict
6
+ from arelle import XbrlConst
7
+ from arelle.ModelObject import ModelObject
8
+ from arelle.ModelDtsObject import ModelResource, ModelRelationship
9
+ from arelle.ModelValue import QName
10
+ from arelle.Aspect import Aspect, aspectStr, aspectModelAspect
11
+ from arelle.ModelRenderingObject import (ResolutionException, DefnMdlTable, DefnMdlBreakdown,
12
+ DefnMdlDefinitionNode, DefnMdlClosedDefinitionNode, DefnMdlRuleDefinitionNode,
13
+ DefnMdlRelationshipNode, DefnMdlAspectNode, DefnMdlOpenDefinitionNode,
14
+ DefnMdlConceptRelationshipNode, DefnMdlDimensionRelationshipNode,
15
+ StrctMdlNode, StrctMdlTableSet, StrctMdlTable, StrctMdlBreakdown, StrctMdlStructuralNode,
16
+ OPEN_ASPECT_ENTRY_SURROGATE, ROLLUP_SPECIFIES_MEMBER, ROLLUP_IMPLIES_DEFAULT_MEMBER,
17
+ ROLLUP_FOR_CONCEPT_RELATIONSHIP_NODE, ROLLUP_FOR_DIMENSION_RELATIONSHIP_NODE,
18
+ ROLLUP_FOR_CLOSED_DEFINITION_NODE, ROLLUP_FOR_OPEN_DEFINITION_NODE,
19
+ ROLLUP_FOR_DEFINITION_NODE,
20
+ UNREPORTED_ASPECT_SORT_VALUE,
21
+ aspectStrctNodes)
22
+ from arelle.PrototypeInstanceObject import FactPrototype
23
+ from arelle.PythonUtil import flattenSequence, flattenToSet
24
+ from arelle.formula.XPathContext import XPathException, FunctionArgType
25
+ from numbers import Number
26
+ NoneType = type(None)
27
+ EMPTY_LIST = []
28
+ EMPTY_DICT = {}
29
+
30
+ TRACE_RESOLUTION = False
31
+ TRACE_TABLE_STRUCTURE = True
32
+
33
+ RENDER_UNITS_PER_CHAR = 16 # nominal screen units per char for wrapLength computation and adjustment
34
+
35
+ def prod(seq):
36
+ p = 1
37
+ for n in seq:
38
+ p *= n
39
+ return p
40
+
41
+ def resolveTableStructure(view, viewTblELR):
42
+ if isinstance(viewTblELR, DefnMdlTable):
43
+ # called with a defnMdlTable instead of an ELR
44
+
45
+ # find an ELR for this table object
46
+ defnMdlTable = viewTblELR
47
+ strctMdlTableSet = StrctMdlTableSet(defnMdlTable)
48
+ for rel in view.modelXbrl.relationshipSet((XbrlConst.tableBreakdown, XbrlConst.tableBreakdownMMDD)).fromModelObject(defnMdlTable):
49
+ # find relationships in table's linkrole
50
+ view.defnSubtreeRelSet = view.modelXbrl.relationshipSet((XbrlConst.tableBreakdownTree, XbrlConst.tableBreakdownTreeMMDD), rel.linkrole)
51
+ return resolveTableAxesStructure(view, strctMdlTableSet,
52
+ view.modelXbrl.relationshipSet((XbrlConst.tableBreakdown, XbrlConst.tableBreakdownMMDD), rel.linkrole))
53
+ # no relationships from table found
54
+ return None
55
+
56
+ # called with an ELR or list of ELRs
57
+ tblBrkdnRelSet = view.modelXbrl.relationshipSet((XbrlConst.tableBreakdown, XbrlConst.tableBreakdownMMDD), viewTblELR)
58
+ view.defnSubtreeRelSet = view.modelXbrl.relationshipSet((XbrlConst.tableBreakdownTree, XbrlConst.tableBreakdownTreeMMDD, XbrlConst.tableDefinitionNodeSubtree, XbrlConst.tableDefinitionNodeSubtreeMMDD), viewTblELR)
59
+ if tblBrkdnRelSet is None or len(tblBrkdnRelSet.modelRelationships) == 0:
60
+ view.modelXbrl.modelManager.addToLog(_("no table relationships for {0}").format(viewTblELR))
61
+ return None
62
+
63
+ # table name
64
+ modelRoleTypes = view.modelXbrl.roleTypes.get(viewTblELR)
65
+ if modelRoleTypes is not None and len(modelRoleTypes) > 0:
66
+ view.roledefinition = modelRoleTypes[0].definition
67
+ if view.roledefinition is None or view.roledefinition == "":
68
+ view.roledefinition = os.path.basename(viewTblELR)
69
+ try:
70
+ for defnMdlTable in tblBrkdnRelSet.rootConcepts:
71
+ view.rendrCntx = defnMdlTable.renderingXPathContext
72
+ strctMdlTableSet = StrctMdlTableSet(defnMdlTable)
73
+ referencedVariables = defnMdlTable.variableRefs()
74
+ for tblParamRel in view.modelXbrl.relationshipSet((XbrlConst.tableParameter, XbrlConst.tableParameterMMDD)).fromModelObject(defnMdlTable):
75
+ referencedVariables.add(tblParamRel.variableQname) # https://gitlab.xbrl.org/rendering/table-linkbase/-/issues/32#note_20551
76
+ # determine number of tables based on cartesian product of multi-valued parameters
77
+ varSeqValues = OrderedDict(( # order tables by lexicographic key order
78
+ (name, flattenSequence(view.rendrCntx.inScopeVars.get(name,())))
79
+ for name in sorted(referencedVariables,reverse=True))) # want last variable to iterate first
80
+ varSeqIndx = dict((name,0) for name in varSeqValues)
81
+ for tblNum in range(prod((len(seqVal) or 1)
82
+ for name, seqVal in varSeqValues.items())):
83
+ strctMdlTable = StrctMdlTable(strctMdlTableSet, defnMdlTable)
84
+ for name, seqVal in varSeqValues.items():
85
+ if len(seqVal) > 0:
86
+ thisSeqVal = seqVal[varSeqIndx[name]]
87
+ view.rendrCntx.inScopeVars[name] = [thisSeqVal]
88
+ strctMdlTable.tblParamValues[name] = thisSeqVal
89
+ resolveTableAxesStructure(view, strctMdlTable, tblBrkdnRelSet)
90
+ # iterate paramSeqIndex
91
+ for name, seqVal in varSeqValues.items():
92
+ varSeqIndx[name] += 1
93
+ if varSeqIndx[name] < len(seqVal):
94
+ view.rendrCntx.inScopeVars[name] = seqVal[varSeqIndx[name]]
95
+ break
96
+ varSeqIndx[name] = 0 # reset this param and set next one
97
+ if len(seqVal) > 0:
98
+ view.rendrCntx.inScopeVars[name] = seqVal[varSeqIndx[name]]
99
+ return strctMdlTableSet
100
+ except ResolutionException as ex:
101
+ #traceback.print_exc()
102
+ view.modelXbrl.error(ex.code, ex.message, exc_info=True, **ex.kwargs);
103
+
104
+ return None
105
+
106
+ def resolveTableAxesStructure(view, strctMdlTable, tblBrkdnRelSet):
107
+ view.dataCols = 0
108
+ view.dataRows = 0
109
+ view.dataFirstCol = 0
110
+ view.dataFirstRow = 0
111
+ view.colHdrNonStdRoles = []
112
+ view.colHdrDocRow = False
113
+ view.colHdrCodeRow = False
114
+ view.colHdrRows = 0
115
+ view.rowHdrNonStdRoles = []
116
+ view.rowHdrCols = 0
117
+ view.rowHdrColWidth = [0,]
118
+ view.rowNonAbstractHdrSpanMin = [0,]
119
+ view.rowHdrDocCol = False
120
+ view.rowHdrCodeCol = False
121
+ view.zAxisBreakdowns = 0
122
+ view.zmostOrdCntx = None
123
+ view.defnMdlTable = defnMdlTable = strctMdlTable.defnMdlNode
124
+ view.aspectEntryObjectId = 0
125
+
126
+ # must be cartesian product of top level relationships
127
+ view.tblBrkdnRels = tblBrkdnRels = tblBrkdnRelSet.fromModelObject(defnMdlTable)
128
+
129
+ for tblBrkdnRel in tblBrkdnRels:
130
+ defnMdlBreakdown = tblBrkdnRel.toModelObject
131
+ strctMdlTable.defnMdlBreakdowns[tblBrkdnRel.axis].append(defnMdlBreakdown)
132
+
133
+ facts = view.modelXbrl.factsInInstance
134
+ if facts:
135
+ facts = defnMdlTable.filteredFacts(view.rendrCntx, view.modelXbrl.factsInInstance) # apply table filters
136
+ # do z's first to set variables needed by x and y axes expressions
137
+ for axis in ("z", "y", "x"):
138
+ axisBrkdnRels = [r for r in tblBrkdnRels if r.axis == axis]
139
+ for tblBrkdnRel in axisBrkdnRels:
140
+ defnMdlBreakdown = tblBrkdnRel.toModelObject
141
+ strctMdlBreakdown = resolveDefinition(view, strctMdlTable, defnMdlBreakdown, 0, facts, 0, axisBrkdnRels, axis=axis)
142
+ # perform any supplemental leveling of child str mdl nodes
143
+ descendantDepths = [getDepth(d) for d in strctMdlBreakdown.strctMdlChildNodes]
144
+ if min(descendantDepths) != max (descendantDepths):
145
+ addDescendantRollups(strctMdlBreakdown)
146
+ # add any defaulted dimensions needed on leaf nodes
147
+ addDefaultedDimensionsToLeafNodes(strctMdlBreakdown)
148
+ if axis == "x":
149
+ view.dataCols += strctMdlBreakdown.leafNodeCount
150
+ elif axis == "y":
151
+ view.dataRows += strctMdlBreakdown.leafNodeCount
152
+ elif axis == "z":
153
+ view.zAxisBreakdowns = len(axisBrkdnRels)
154
+ if not axisBrkdnRels: # no breakdown rels
155
+ strctMdlBreakdown = resolveDefinition(view, strctMdlTable, None, 1, facts, 0, axisBrkdnRels, axis=axis)
156
+ strctMdlBreakdown.setHasOpenNode()
157
+ if axis == "x":
158
+ view.dataCols += strctMdlBreakdown.leafNodeCount
159
+ strctMdlBreakdown.setHasOpenNode()
160
+ elif axis == "y":
161
+ view.dataRows += strctMdlBreakdown.leafNodeCount
162
+ strctMdlBreakdown.setHasOpenNode()
163
+ # check for clashing and unresolved tagSelectors
164
+ strctMdlAxisNodes = defaultdict(list)
165
+ def compileAlignedStrctNodes(strctNode):
166
+ childNodes = strctNode.strctMdlChildNodes
167
+ if not childNodes: # this is a leaf node
168
+ if not isinstance(strctNode, StrctMdlBreakdown) and not strctNode.defnMdlNode.isAbstract:
169
+ strctMdlAxisNodes[strctNode.axis].append(strctNode)
170
+ else:
171
+ for childStrctNode in childNodes:
172
+ compileAlignedStrctNodes(childStrctNode)
173
+ for axis in ("z", "y", "x"):
174
+ compileAlignedStrctNodes(strctMdlTable.strctMdlFirstAxisBreakdown(axis))
175
+ for zStrctMdlNode in strctMdlAxisNodes.get("z", [None]):
176
+ zAspectStrctNodes = aspectStrctNodes(zStrctMdlNode)
177
+ for yStrctMdlNode in strctMdlAxisNodes.get("y", [None]):
178
+ yAspectStrctNodes = aspectStrctNodes(yStrctMdlNode)
179
+ for xStrctMdlNode in strctMdlAxisNodes.get("x", [None]):
180
+ xAspectStrctNodes = aspectStrctNodes(xStrctMdlNode)
181
+ stNodes = (zStrctMdlNode, yStrctMdlNode, xStrctMdlNode)
182
+ cellTagSelectors = set(ts for sn in stNodes if sn for ts in sn.tagSelectors if ts)
183
+ if {"table.periodStart","table.periodEnd"} & cellTagSelectors:
184
+ cellTagSelectors &= {"table.periodStart","table.periodEnd"}
185
+ for _aspectStrctNodes in (zAspectStrctNodes.values(), yAspectStrctNodes.values(), xAspectStrctNodes.values()):
186
+ for aspectStrctNode in flattenToSet(_aspectStrctNodes):
187
+ strctNodeTags = aspectStrctNode.defnMdlNode.constraintSets.keys()
188
+ if len(cellTagSelectors & strctNodeTags) > 1:
189
+ view.modelXbrl.error("xbrlte:tagSelectorClash",
190
+ _("Cell has multiple tag selectors for same aspect node %(nodeId)s %(clashingSelectors)s"),
191
+ modelObject=stNodes, clashingSelectors=", ".join(cellTagSelectors & strctNodeTags), nodeId=aspectStrctNode.defnMdlNode.id)
192
+ for cellTagSelector in cellTagSelectors:
193
+ if cellTagSelector not in strctNodeTags and None not in strctNodeTags:
194
+ view.modelXbrl.error("xbrlte:noMatchingConstraintSet",
195
+ _("Cell has missing constraint set for tag selector %(cellTagSelector)s, node %(nodeId)s"),
196
+ modelObject=stNodes, cellTagSelector=cellTagSelector, nodeId=aspectStrctNode.defnMdlNode.id)
197
+
198
+ view.colHdrTopRow = view.zAxisBreakdowns # need rest if combobox used (2 if view.zAxisRows else 1)
199
+ for i in range(view.rowHdrCols):
200
+ if view.rowNonAbstractHdrSpanMin[i]:
201
+ lastRowMinWidth = view.rowNonAbstractHdrSpanMin[i] - sum(view.rowHdrColWidth[i] for j in range(i, view.rowHdrCols - 1))
202
+ if lastRowMinWidth > view.rowHdrColWidth[view.rowHdrCols - 1]:
203
+ view.rowHdrColWidth[view.rowHdrCols - 1] = lastRowMinWidth
204
+ #view.rowHdrColWidth = (60,60,60,60,60,60,60,60,60,60,60,60,60,60)
205
+ # use as wraplength for all row hdr name columns 200 + fixed indent and abstract mins (not incl last name col)
206
+ view.rowHdrWrapLength = 200 + sum(view.rowHdrColWidth[:view.rowHdrCols + 1])
207
+ if view.colHdrRows == 0:
208
+ view.colHdrRows = 1 # always reserve a col header row even if no labels for col headers
209
+ view.dataFirstRow = view.colHdrTopRow + view.colHdrRows + len(view.colHdrNonStdRoles)
210
+ view.dataFirstCol = view.rowHdrCols + len(view.rowHdrNonStdRoles)
211
+ #view.dataFirstRow = view.colHdrTopRow + view.colHdrRows + view.colHdrDocRow + view.colHdrCodeRow
212
+ #view.dataFirstCol = 1 + view.rowHdrCols + view.rowHdrDocCol + view.rowHdrCodeCol
213
+ #for i in range(view.dataFirstRow + view.dataRows):
214
+ # view.gridView.rowconfigure(i)
215
+ #for i in range(view.dataFirstCol + view.dataCols):
216
+ # view.gridView.columnconfigure(i)
217
+ # organize hdrNonStdRoles so code (if any) is after documentation (if any)
218
+ for hdrNonStdRoles in (view.colHdrNonStdRoles, view.rowHdrNonStdRoles):
219
+ iCodeRole = -1
220
+ for i, hdrNonStdRole in enumerate(hdrNonStdRoles):
221
+ if 'code' in os.path.basename(hdrNonStdRole).lower():
222
+ iCodeRole = i
223
+ break
224
+ if iCodeRole >= 0 and len(hdrNonStdRoles) > 1 and iCodeRole < len(hdrNonStdRoles) - 1:
225
+ del hdrNonStdRoles[iCodeRole]
226
+ hdrNonStdRoles.append(hdrNonStdRole)
227
+ if TRACE_RESOLUTION: print(
228
+ f"dataCols {view.dataCols} dataRows {view.dataRows} dataFirstCol {view.dataFirstCol} dataFirstRow {view.dataFirstRow} "
229
+ f"colHdrRows {view.colHdrRows} rowHdrCols {view.rowHdrCols} zAxisBreakdowns {view.zAxisBreakdowns} "
230
+ f"colHdrTopRow {view.colHdrTopRow} colHdrRows {view.colHdrRows} colHdrNonStdRoles {len(view.colHdrNonStdRoles)} "
231
+ f"rowHdrNonStdRoles {len(view.rowHdrNonStdRoles)}"
232
+ )
233
+
234
+ def sortkey(obj):
235
+ if isinstance(obj, ModelObject):
236
+ return obj.objectIndex
237
+ return obj
238
+
239
+ def childContainsOpenNodes(childStrctMdlNode):
240
+ if childStrctMdlNode is None:
241
+ return False
242
+ if isinstance(childStrctMdlNode.defnMdlNode, DefnMdlAspectNode) \
243
+ and (childStrctMdlNode.isLabeled \
244
+ or any([node.isEntryPrototype(default=False) for node in childStrctMdlNode.strctMdlChildNodes])):
245
+ # either the child structural node has a concrete header or it contains a structure
246
+ # that has not yet a concrete value
247
+ return True
248
+ else:
249
+ for node in childStrctMdlNode.strctMdlChildNodes:
250
+ if childContainsOpenNodes(node):
251
+ return True
252
+ return False
253
+
254
+ def checkLabelWidth(view, strctMdlNode, subtreeRels, checkBoundFact=False):
255
+ if strctMdlNode.axis == "y":
256
+ # messages can't be evaluated, just use the text portion of format string
257
+ label = strctMdlNode.header(lang=view.lang,
258
+ returnGenLabel=not checkBoundFact,
259
+ returnMsgFormatString=not checkBoundFact)
260
+ if label:
261
+ # need to et more exact word length in screen units
262
+ widestWordLen = max(len(w) * RENDER_UNITS_PER_CHAR for w in label.split())
263
+ # abstract only pertains to subtree of closed nodesbut not cartesian products or open nodes
264
+ while strctMdlNode.depth >= len(view.rowHdrColWidth):
265
+ view.rowHdrColWidth.append(RENDER_UNITS_PER_CHAR)
266
+ view.rowNonAbstractHdrSpanMin.append(0)
267
+ if strctMdlNode.defnMdlNode.isAbstract or not subtreeRels:
268
+ if widestWordLen > view.rowHdrColWidth[strctMdlNode.depth]:
269
+ view.rowHdrColWidth[strctMdlNode.depth] = widestWordLen
270
+ else:
271
+ if widestWordLen > view.rowNonAbstractHdrSpanMin[strctMdlNode.depth]:
272
+ view.rowNonAbstractHdrSpanMin[strctMdlNode.depth] = widestWordLen
273
+
274
+ #def resolveDefinition(view, strctMdlNode, depth, facts, i=None, tblAxisRels=None, processOpenDefinitionNode=True, rollUpNode=None):
275
+ def resolveDefinition(view, strctMdlParent, defnMdlNode, depth, facts, iBrkdn=None, axisBrkdnRels=None, rollUpNode=None, axis=None, mergeAspects=None):
276
+ if isinstance(defnMdlNode, (NoneType, DefnMdlBreakdown)):
277
+ strctMdlNode = StrctMdlBreakdown(strctMdlParent, defnMdlNode, axis)
278
+ else:
279
+ if isinstance(defnMdlNode, (DefnMdlRelationshipNode,DefnMdlAspectNode)) or mergeAspects or defnMdlNode.isMerged:
280
+ strctMdlNode = strctMdlParent # all children are added during relationship navigatio below
281
+ else:
282
+ strctMdlNode = StrctMdlStructuralNode(strctMdlParent, defnMdlNode)
283
+ if strctMdlParent.axis:
284
+ axis = strctMdlParent.axis
285
+
286
+ subtreeRels = view.defnSubtreeRelSet.fromModelObject(defnMdlNode)
287
+
288
+ if isinstance(defnMdlNode, (DefnMdlBreakdown, DefnMdlDefinitionNode)):
289
+ try:
290
+ try:
291
+ ordCardinality, ordDepth = defnMdlNode.cardinalityAndDepth(strctMdlNode, handleXPathException=False)
292
+ except (XPathException, FunctionArgType, ResolutionException) as ex:
293
+ if (isinstance(defnMdlNode, DefnMdlRelationshipNode) and
294
+ type(ex) == FunctionArgType and ex.argNum == 5 and isinstance(ex.value, int) and ex.value >= 0):
295
+ view.modelXbrl.error("xbrlte:relationshipNodeTooManyGenerations",
296
+ ex.expectedType,
297
+ modelObject=(view.defnMdlTable,defnMdlNode), xlinkLabel=defnMdlNode.xlinkLabel, axis=defnMdlNode.localName)
298
+ elif isinstance(defnMdlNode, DefnMdlRelationshipNode) and type(ex) == ResolutionException:
299
+ view.modelXbrl.error(ex.code,
300
+ _("Relationship node %(xlinkLabel)s expression not castable to required type (%(error)s)"),
301
+ modelObject=(view.defnMdlTable,defnMdlNode), xlinkLabel=defnMdlNode.xlinkLabel, axis=defnMdlNode.localName,
302
+ error=ex.message)
303
+ else:
304
+ view.modelXbrl.error("xbrlte:expressionNotCastableToRequiredType",
305
+ _("Relationship node %(xlinkLabel)s expression not castable to required type (%(xpathError)s)"),
306
+ modelObject=(view.defnMdlTable,defnMdlNode), xlinkLabel=defnMdlNode.xlinkLabel, axis=defnMdlNode.localName,
307
+ xpathError=str(ex))
308
+ return
309
+ if (not defnMdlNode.isAbstract and
310
+ isinstance(defnMdlNode, DefnMdlClosedDefinitionNode) and
311
+ ordCardinality == 0 and not defnMdlNode.childrenCoverSameAspects):
312
+ view.modelXbrl.error("xbrlte:closedDefinitionNodeZeroCardinality",
313
+ _("Closed definition node %(xlinkLabel)s does not contribute at least one structural node"),
314
+ modelObject=(view.defnMdlTable,defnMdlNode), xlinkLabel=defnMdlNode.xlinkLabel, axis=defnMdlNode.localName)
315
+ nestedDepth = depth + ordDepth
316
+ cartesianProductNestedArgs = [view, nestedDepth, axis, facts, axisBrkdnRels, iBrkdn]
317
+ if axis == "x":
318
+ if ordDepth:
319
+ if nestedDepth > view.colHdrRows:
320
+ view.colHdrRows = nestedDepth - 1
321
+ hdrNonStdRoles = view.colHdrNonStdRoles
322
+ elif axis == "y":
323
+ if ordDepth:
324
+ if nestedDepth > view.rowHdrCols:
325
+ view.rowHdrCols = nestedDepth
326
+ if not isinstance(defnMdlNode, DefnMdlRelationshipNode):
327
+ # not quite sure of this condition, but Solvency (rule node) need one less col than a relationship node (german taxonomy)
328
+ view.rowHdrCols -= 1
329
+ for j in range(1 + ordDepth):
330
+ view.rowHdrColWidth.append(RENDER_UNITS_PER_CHAR) # min width for 'tail' of nonAbstract coordinate
331
+ view.rowNonAbstractHdrSpanMin.append(0)
332
+ elif isinstance(strctMdlNode, StrctMdlBreakdown):
333
+ view.rowHdrCols = view.rowHdrCols + nestedDepth
334
+ for j in range(1 + ordDepth):
335
+ view.rowHdrColWidth.append(RENDER_UNITS_PER_CHAR) # min width for 'tail' of nonAbstract coordinate
336
+ view.rowNonAbstractHdrSpanMin.append(0)
337
+ checkLabelWidth(view, strctMdlNode, subtreeRels, checkBoundFact=False)
338
+ hdrNonStdRoles = view.rowHdrNonStdRoles
339
+ # print(f"id {defnMdlNode.id} depth {depth} y axis ordDepth {ordDepth} nestedDepth {nestedDepth} rowHdrCols {view.rowHdrCols}")
340
+ if axis in ("x", "y"):
341
+ hdrNonStdPosition = -1 # where a match last occured
342
+ for rel in view.modelXbrl.relationshipSet(XbrlConst.elementLabel).fromModelObject(defnMdlNode):
343
+ if isinstance(rel.toModelObject, ModelResource) and rel.toModelObject.role != XbrlConst.genStandardLabel:
344
+ labelLang = rel.toModelObject.xmlLang
345
+ labelRole = rel.toModelObject.role
346
+ if (labelLang == view.lang or labelLang.startswith(view.lang) or view.lang.startswith(labelLang)
347
+ or ("code" in labelRole)):
348
+ labelRole = rel.toModelObject.role
349
+ if labelRole in hdrNonStdRoles:
350
+ hdrNonStdPosition = hdrNonStdRoles.index(labelRole)
351
+ else:
352
+ hdrNonStdRoles.insert(hdrNonStdPosition + 1, labelRole)
353
+
354
+ isCartesianProductExpanded = False
355
+ if not isinstance(defnMdlNode, DefnMdlAspectNode):
356
+ isCartesianProductExpanded = True
357
+ # note: reduced set of facts should always be passed to subsequent open nodes
358
+ childStrctNode = None
359
+ hasUnreportedChildStrctNode = False
360
+ for subtreeRel in subtreeRels:
361
+ childDefnMdlNode = subtreeRel.toModelObject
362
+
363
+ if childDefnMdlNode.isMerged:
364
+ '''
365
+ childSubtreeRels = view.defnSubtreeRelSet.fromModelObject(childDefnMdlNode)
366
+ for childSubtreeRel in childSubtreeRels:
367
+ mergedChildDefnMdlNode = childSubtreeRel.toModelObject
368
+ childStrctNode = resolveDefinition(view, strctMdlNode, mergedChildDefnMdlNode, depth+ordDepth, facts, iBrkdn, axisBrkdnRels, parentMerges=True)
369
+ for gStrctNode in strctMdlNode.strctMdlChildNodes:
370
+ for mergedAspect in childDefnMdlNode.aspectsCovered():
371
+ aspect = childDefnMdlNode.aspectValue(view.rendrCntx, mergedAspect)
372
+ if mergedAspect not in gStrctNode.aspects:
373
+ if isinstance(aspect, list):
374
+ aspect = set(aspect)
375
+ gStrctNode.aspects[mergedAspect] = aspect
376
+ if childDefnMdlNode.tagSelector is not None and not gStrctNode.tagSelector:
377
+ gStrctNode.tagSelector = childDefnMdlNode.tagSelector
378
+ # print(childStrctNode.aspectsCovered())
379
+ '''
380
+ childMergeAspects = mergeAspects.copy() if mergeAspects else {}
381
+ for mergedAspect in childDefnMdlNode.aspectsCovered():
382
+ aspect = childDefnMdlNode.aspectValue(view.rendrCntx, mergedAspect)
383
+ if isinstance(aspect, list):
384
+ aspect = set(aspect)
385
+ childMergeAspects[mergedAspect] = aspect
386
+ if childDefnMdlNode.tagSelector is not None:
387
+ childMergeAspects.setdefault("tagSelectors",set()).add(childDefnMdlNode.tagSelector)
388
+ childStrctNode = resolveDefinition(view, strctMdlNode, childDefnMdlNode, depth, facts, iBrkdn, axisBrkdnRels, mergeAspects=childMergeAspects)
389
+ elif defnMdlNode.isMerged and isinstance(childDefnMdlNode, (DefnMdlAspectNode,DefnMdlRelationshipNode)):
390
+ # parent is a merged node and child is an aspect node
391
+ childStrctNode = resolveDefinition(view, strctMdlNode, childDefnMdlNode, depth, facts, iBrkdn, axisBrkdnRels, mergeAspects=mergeAspects)
392
+ elif not isinstance(childDefnMdlNode, DefnMdlTable):
393
+ childStrctNode = resolveDefinition(view, strctMdlNode, childDefnMdlNode, depth+ordDepth, facts, iBrkdn, axisBrkdnRels)
394
+ for aspect in (mergeAspects or ()):
395
+ if aspect == "tagSelectors":
396
+ childStrctNode.tagSelectors |= mergeAspects["tagSelectors"]
397
+ elif aspect not in childStrctNode.aspectsCovered(inherit=False):
398
+ childStrctNode.aspects[aspect] = mergeAspects[aspect]
399
+ descendantDefMdlNodes = view.defnSubtreeRelSet.fromModelObject(childDefnMdlNode)
400
+ if not isinstance(childDefnMdlNode, DefnMdlAspectNode) and not childDefnMdlNode.isAbstract and descendantDefMdlNodes:
401
+ # contributes at least one child node
402
+ rollupAspectDefinitionNode = childDefnMdlNode
403
+ _rollup = ROLLUP_IMPLIES_DEFAULT_MEMBER
404
+ # definition node is that of the other child elements, to contribute a defaulted dimension
405
+ if childStrctNode.strctMdlChildNodes:
406
+ childStrctNodeAspectsCovered = childStrctNode.aspectsCovered()
407
+ if childStrctNodeAspectsCovered & {Aspect.DIMENSIONS, Aspect.OMIT_DIMENSIONS}:
408
+ if childStrctNodeAspectsCovered == childStrctNode.strctMdlChildNodes[0].aspectsCovered():
409
+ _rollup = ROLLUP_SPECIFIES_MEMBER
410
+ else:
411
+ rollupAspectDefinitionNode = childStrctNode.strctMdlChildNodes[0].defnMdlNode
412
+ rollUpStrctNode = StrctMdlStructuralNode(childStrctNode, rollupAspectDefinitionNode)
413
+ rollUpStrctNode.rollup = _rollup
414
+ childStrctNode.hasChildRollup = True
415
+ childStrctNode.rollUpChildStrctMdlNode = rollUpStrctNode
416
+ if isinstance(childDefnMdlNode, DefnMdlClosedDefinitionNode) and childDefnMdlNode.parentChildOrder == "parent-first":
417
+ childStrctNode.strctMdlChildNodes = childStrctNode.strctMdlChildNodes[-1:] + childStrctNode.strctMdlChildNodes[0:-1]
418
+ cartesianProductExpander(rollUpStrctNode, *cartesianProductNestedArgs)
419
+ if not childContainsOpenNodes(childStrctNode) and not childDefnMdlNode.childrenCoverSameAspects:
420
+ # To be computed only if the structural node does not contain an open node
421
+ cartesianProductExpander(childStrctNode, *cartesianProductNestedArgs)
422
+ if childStrctNode is not None and childStrctNode.isUnreported and isinstance(childDefnMdlNode, DefnMdlOpenDefinitionNode):
423
+ hasUnreportedChildStrctNode = True
424
+ strctMdlNode.strctMdlChildNodes.remove(childStrctNode)
425
+ if hasUnreportedChildStrctNode and not strctMdlNode.strctMdlChildNodes and childStrctNode is not None:
426
+ # has all child nodes unreported, move group for header up to this level
427
+ strctMdlNode.strctMdlChildNodes.extend(childStrctNode.strctMdlChildNodes)
428
+ # check if a children specify explicit dimensions and one is missing default
429
+ descendantDefMdlNodes = view.defnSubtreeRelSet.fromModelObject(defnMdlNode)
430
+ defnMdlChildDefDimsCovered = set( # defaulted dims in children
431
+ aspect
432
+ for rel in descendantDefMdlNodes
433
+ if not isinstance(rel.toModelObject, (NoneType,DefnMdlTable))
434
+ for aspect in rel.toModelObject.aspectsCovered()
435
+ if isinstance(aspect, QName) and aspect in view.modelXbrl.qnameDimensionDefaults
436
+ )
437
+ # note child defnMdlNodes needing default dimension
438
+ for rel in descendantDefMdlNodes:
439
+ descDefnMdlNode = rel.toModelObject
440
+ if not isinstance(descDefnMdlNode, (NoneType,DefnMdlTable)):
441
+ defaultedDims = defnMdlChildDefDimsCovered - descDefnMdlNode.aspectsCovered() - defnMdlNode.aspectsCovered()
442
+ if defaultedDims:
443
+ descDefnMdlNode.deemedDefaultedDims = defaultedDims
444
+ # check if child strct nodes specify explicit dimensions and one is missing default
445
+ strctMdlChildDefDimsCovered = set( # defaulted dims in children
446
+ aspect
447
+ for gStrctNode in strctMdlParent.strctMdlChildNodes
448
+ for aspect in gStrctNode.aspectsCovered(inherit=True)
449
+ if isinstance(aspect, QName) and aspect in view.modelXbrl.qnameDimensionDefaults and gStrctNode.axis == axis
450
+ )
451
+ # note child defnMdlNodes needing default dimension
452
+ anyUncoveredChilds = (defnMdlChildDefDimsCovered and
453
+ any(defnMdlChildDefDimsCovered - gStrctNode.aspectsCovered(inherit=True)
454
+ for gStrctNode in strctMdlParent.strctMdlChildNodes))
455
+ for gStrctNode in strctMdlParent.strctMdlChildNodes:
456
+ if gStrctNode.axis == axis: # don't cross over breakdowns of other axis
457
+ defaultedDims = strctMdlChildDefDimsCovered - gStrctNode.aspectsCovered(inherit=True)
458
+ # remove any OMIT dimensions
459
+ if gStrctNode.hasAspect(Aspect.OMIT_DIMENSIONS):
460
+ defaultedDims |= set(gStrctNode.aspectValue(Aspect.OMIT_DIMENSIONS))
461
+ if defaultedDims:
462
+ gStrctNode.defnMdlNode.deemedDefaultedDims = defaultedDims
463
+ elif (anyUncoveredChilds and gStrctNode.defnMdlNode is not None
464
+ and (defnMdlChildDefDimsCovered - gStrctNode.aspectsCovered(inherit=True))):
465
+ gStrctNode.defnMdlNode.deemedDefaultedDims = defnMdlChildDefDimsCovered
466
+ if isinstance(defnMdlNode, DefnMdlRelationshipNode):
467
+ rels = defnMdlNode.relationships(strctMdlParent)
468
+ if defnMdlNode.isOrSelfAxis:
469
+ rootOrSelfStructuralNodes = {}
470
+ addRelationships(defnMdlNode, defnMdlNode._sourceQnames, strctMdlParent, rootOrSelfStructuralNodes)
471
+ else:
472
+ rootOrSelfStructuralNodes = None
473
+ addRelationships(defnMdlNode, rels, strctMdlParent, rootOrSelfStructuralNodes)
474
+ trimAbstractNodes(strctMdlParent)
475
+ addDescendantRollups(strctMdlParent)
476
+ # set up by defnMdlNode.relationships
477
+ if isinstance(defnMdlNode, DefnMdlConceptRelationshipNode):
478
+ if (defnMdlNode._sourceQnames != [XbrlConst.qnXfiRoot] and
479
+ any(c is None or c.isHypercubeItem or c.isDimensionItem
480
+ for qn in defnMdlNode._sourceQnames
481
+ for c in (view.modelXbrl.qnameConcepts.get(qn),))):
482
+ view.modelXbrl.error("xbrlte:invalidConceptRelationshipSource",
483
+ _("Concept relationship rule node %(xlinkLabel)s source %(source)s does not refer to an existing concept."),
484
+ modelObject=defnMdlNode, xlinkLabel=defnMdlNode.xlinkLabel, source=", ".join(str(q) for q in defnMdlNode._sourceQnames))
485
+ else:
486
+ # check if single network
487
+ networks = set() # entry is linkrole, arcrole, linkQName, arcQName
488
+ for rel in flattenSequence(defnMdlNode.relationships(strctMdlNode)):
489
+ if isinstance(rel, ModelRelationship):
490
+ networks.add((rel.arcrole, rel.linkrole, rel.qname, rel.arcElement.qname))
491
+ else:
492
+ networks.add(None) # root element
493
+ if len(networks) > 1:
494
+ view.modelXbrl.error("xbrlte:ambiguousConceptNetwork",
495
+ _("Concept relationship rule node %(xlinkLabel)s has %(count)s networks: %(networks)s"),
496
+ modelObject=defnMdlNode, xlinkLabel=defnMdlNode.xlinkLabel, count=len(networks), networks=str(networks))
497
+ elif isinstance(defnMdlNode, DefnMdlDimensionRelationshipNode):
498
+ dim = view.modelXbrl.qnameConcepts.get(defnMdlNode._dimensionQname)
499
+ if (dim is None or not dim.isExplicitDimension): # and len(view.modelXbrl.factsInInstance) > 0:
500
+ view.modelXbrl.error("xbrlte:invalidExplicitDimensionQName",
501
+ _("Dimension relationship rule node %(xlinkLabel)s dimension %(dimension)s does not refer to an existing explicit dimension."),
502
+ modelObject=defnMdlNode, xlinkLabel=defnMdlNode.xlinkLabel, dimension=defnMdlNode._dimensionQname)
503
+ for _sourceQname in defnMdlNode._sourceQnames:
504
+ domMbr = view.modelXbrl.qnameConcepts.get(_sourceQname)
505
+ if domMbr is None or not domMbr.isDomainMember:
506
+ view.modelXbrl.error("xbrlte:invalidDimensionRelationshipSource",
507
+ _("Dimension relationship rule node %(xlinkLabel)s source %(source)s does not refer to an existing domain member."),
508
+ modelObject=defnMdlNode, xlinkLabel=defnMdlNode.xlinkLabel, source=_sourceQname)
509
+ if (defnMdlNode._formulaAxis in ("child", "child-or-self", "parent", "parent-or-self", "sibling", "sibling-or-self") and
510
+ (not isinstance(defnMdlNode._generations, Number) or defnMdlNode._generations > 1)):
511
+ view.modelXbrl.error("xbrlte:relationshipNodeTooManyGenerations ",
512
+ _("Relationship rule node %(xlinkLabel)s formulaAxis %(axis)s implies a single generation tree walk but generations %(generations)s is greater than one."),
513
+ modelObject=defnMdlNode, xlinkLabel=defnMdlNode.xlinkLabel, axis=defnMdlNode._formulaAxis, generations=defnMdlNode._generations)
514
+ for childStrctNode in strctMdlParent.strctMdlChildNodes:
515
+ for aspect in (mergeAspects or ()):
516
+ if aspect == "tagSelectors":
517
+ childStrctNode.tagSelectors |= mergeAspects["tagSelectors"]
518
+ elif not defnMdlNode.hasAspect(childStrctNode, aspect):
519
+ childStrctNode.aspects[aspect] = mergeAspects[aspect]
520
+
521
+ elif isinstance(defnMdlNode, DefnMdlAspectNode):
522
+ strctMdlNode.setHasOpenNode()
523
+ strctMdlNode.isLabeled = False
524
+ isCartesianProductExpanded = True
525
+
526
+ # strctMdlNode.abstract = True # spanning ordinate acts as a subtitle
527
+ aspectFactsPartitions = strctMdlNode.evaluate(defnMdlNode,
528
+ defnMdlNode.filteredFactsPartitions,
529
+ evalArgs=(view.modelXbrl.factsInInstance,)) # for all reported facts ignoring parent def node filters
530
+ if depth < 2:
531
+ filteredFactsPartitions = aspectFactsPartitions
532
+ else:
533
+ filteredFactsPartitions = strctMdlNode.evaluate(defnMdlNode,
534
+ defnMdlNode.filteredFactsPartitions,
535
+ evalArgs=(facts,))
536
+
537
+ # apply mergedAspects
538
+
539
+ if strctMdlNode._rendrCntx.formulaOptions.traceVariableFilterWinnowing:
540
+ view.modelXbrl.info("table:trace",
541
+ _("Filter node %(xlinkLabel)s facts partitions: %(factsPartitions)s"),
542
+ modelObject=defnMdlNode, xlinkLabel=defnMdlNode.xlinkLabel,
543
+ factsPartitions=str(filteredFactsPartitions))
544
+ # only for fact entry (true if no parent open nodes or all are on entry prototype row)
545
+ childList = strctMdlNode.strctMdlChildNodes
546
+ if strctMdlNode.isEntryPrototype(default=True):
547
+ for i in range(getattr(view, "openBreakdownLines",
548
+ # for file output, 1 entry row if no facts
549
+ 0 if filteredFactsPartitions else 1)):
550
+ view.aspectEntryObjectId += 1
551
+ filteredFactsPartitions.append([FactPrototype(view, {"aspectEntryObjectId": OPEN_ASPECT_ENTRY_SURROGATE + str(view.aspectEntryObjectId)})])
552
+ if strctMdlNode.isEntryPrototype(default=False):
553
+ break # only one node per cartesian product under outermost nested open entry row
554
+ if depth >= 2:
555
+ for i in range(len(filteredFactsPartitions)):
556
+ filteredFactsPartitions[i] = set(filteredFactsPartitions[i])
557
+ for aspectPartition in aspectFactsPartitions:
558
+ childStrctMdlNode = StrctMdlStructuralNode(strctMdlNode, defnMdlNode, contextItemFact=aspectPartition[0])
559
+ aspectPartition = set(aspectPartition)
560
+
561
+ # find matching filterFactsPartition
562
+ if depth < 2:
563
+ factsPartition = aspectPartition
564
+ else:
565
+ factsPartition = set()
566
+ for fp in filteredFactsPartitions:
567
+ if fp <= aspectPartition:
568
+ factsPartition = fp
569
+ break
570
+
571
+ # store the partition for later reuse when spreading facts in body cells if no aspect filters involved
572
+ if not defnMdlNode.filterRelationships:
573
+ childStrctMdlNode.factsPartition = factsPartition
574
+
575
+ childStrctMdlNode.indent = 0
576
+ #TBD this is now computed, not an attribute
577
+ #childStrctMdlNode.depth -= 1 # for label width; parent is merged/invisible
578
+ checkLabelWidth(view, childStrctMdlNode, subtreeRels, checkBoundFact=True)
579
+ #resolveDefinition(view, childStrctMdlNode, breakdownNode, defnMdlNode, depth, axis, factsPartition, processOpenDefinitionNode=False) #recurse
580
+
581
+ for aspect in (mergeAspects or ()):
582
+ if aspect == "tagSelectors":
583
+ childStrctMdlNode.tagSelectors |= mergeAspects["tagSelectors"]
584
+ elif not defnMdlNode.hasAspect(childStrctMdlNode, aspect):
585
+ childStrctMdlNode.aspects[aspect] = mergeAspects[aspect]
586
+
587
+ if subtreeRels:
588
+ for subtreeRel in subtreeRels:
589
+ child2DefinitionNode = subtreeRel.toModelObject
590
+ #child2StructuralNode = StrctMdlStructuralNode(childStrctMdlNode, child2DefinitionNode) # others are nested structuralNode
591
+ #childStrctMdlNode.strctMdlChildNodes.append(child2StructuralNode)
592
+ #resolveDefinition(view, child2StructuralNode, child2DefinitionNode, depth+ordDepth, factsPartition, iBrkdn, axisBrkdnRels) #recurse
593
+ resolveDefinition(view, childStrctMdlNode, child2DefinitionNode, depth+ordDepth, factsPartition, iBrkdn, axisBrkdnRels) #recurse
594
+ # sort by header (which is likely to be typed dim value, for example)
595
+ childList.sort(key=lambda childStrctMdlNode:
596
+ childStrctMdlNode.header(lang=view.lang,
597
+ returnGenLabel=False,
598
+ returnMsgFormatString=False,
599
+ layoutMdlSortOrder=True)
600
+ or '') # exception on trying to sort if header returns None
601
+ #test case 1200 v10i may require fact in instance order
602
+ if defnMdlNode.aspectsCovered() == {Aspect.CONCEPT}:
603
+ childList.sort(key=lambda childStrctMdlNode:
604
+ min(f.objectIndex for f in childStrctMdlNode.factsPartition) if getattr(childStrctMdlNode,"factsPartition",None) else 999999999)
605
+ # TBD if there is no abstract 'sub header' for these subOrdCntxs, move them in place of parent structuralNode
606
+ elif isinstance(defnMdlNode, DefnMdlRuleDefinitionNode):
607
+ for constraintSet in defnMdlNode.constraintSets.values():
608
+ _aspectsCovered = constraintSet.aspectsCovered()
609
+ for aspect in _aspectsCovered:
610
+ if not constraintSet.aspectValueDependsOnVars(aspect):
611
+ if aspect == Aspect.CONCEPT:
612
+ conceptQname = constraintSet.aspectValue(view.rendrCntx, Aspect.CONCEPT)
613
+ concept = view.modelXbrl.qnameConcepts.get(conceptQname)
614
+ if concept is None or not concept.isItem or concept.isDimensionItem or concept.isHypercubeItem:
615
+ view.modelXbrl.error("xbrlte:invalidQNameAspectValue",
616
+ _("Rule node %(xlinkLabel)s specifies concept %(concept)s does not refer to an existing primary item concept."),
617
+ modelObject=constraintSet, xlinkLabel=defnMdlNode.xlinkLabel, concept=conceptQname)
618
+ elif isinstance(aspect, QName):
619
+ dimConcept = view.modelXbrl.qnameConcepts.get(aspect)
620
+ dimVal = defnMdlNode.aspectValue(view.rendrCntx, aspect)
621
+ if dimConcept is not None:
622
+ if dimConcept.isTypedDimension: # dimValue is the member node
623
+ if isinstance(dimVal, ModelObject) and not view.modelXbrl.factsByDimMemQname(aspect, dimVal.textValue):
624
+ strctMdlNode.isUnreported = True # typed Dim is unreported
625
+ else: # dimValue is a QName
626
+ mem = view.modelXbrl.qnameConcepts.get(dimVal)
627
+ if isinstance(dimVal, QName) and (mem is None or not mem.isDomainMember) and dimVal != XbrlConst.qnFormulaDimensionSAV: # SAV is absent dimension member, reported in validateFormula:
628
+ view.modelXbrl.error("xbrlte:invalidQNameAspectValue",
629
+ _("Rule node %(xlinkLabel)s specifies domain member %(concept)s does not refer to an existing domain member concept."),
630
+ modelObject=defnMdlNode, xlinkLabel=defnMdlNode.xlinkLabel, concept=dimVal)
631
+ #if not defnMdlNode.constraintSets:
632
+ # view.modelXbrl.error("xbrlte:incompleteAspectRule",
633
+ # _("Rule node %(xlinkLabel)s does not specify an aspect value."),
634
+ # modelObject=defnMdlNode, xlinkLabel=defnMdlNode.xlinkLabel)
635
+ if not isCartesianProductExpanded:
636
+ cartesianProductExpander(strctMdlNode, *cartesianProductNestedArgs)
637
+
638
+ if isinstance(defnMdlNode, (NoneType, DefnMdlBreakdown)) and not strctMdlNode.strctMdlChildNodes: # childless root ordinate, make a child to iterate in producing table
639
+ subOrdContext = StrctMdlBreakdown(strctMdlNode, defnMdlNode, axis)
640
+ except ResolutionException as ex:
641
+ if sys.version[0] >= '3':
642
+ #import traceback
643
+ #traceback.print_tb(ex.__traceback__)
644
+ raise ex.with_traceback(ex.__traceback__) # provide original traceback information
645
+ else:
646
+ raise ex
647
+ except Exception as ex:
648
+ e = ResolutionException("arelle:resolutionException",
649
+ _("Exception in resolution of definition node %(node)s: %(error)s"),
650
+ modelObject=defnMdlNode, node=defnMdlNode.qname, error=str(ex)
651
+ )
652
+ if sys.version[0] >= '3':
653
+ raise e.with_traceback(ex.__traceback__) # provide original traceback information
654
+ else:
655
+ raise e
656
+
657
+ elif strctMdlNode and defnMdlNode is None: # no breakdown nodes for axis
658
+ cartesianProductNestedArgs = [view, depth+1, axis, facts, (), iBrkdn]
659
+ cartesianProductExpander(strctMdlNode, *cartesianProductNestedArgs)
660
+
661
+ return strctMdlNode
662
+
663
+ def cartesianProductExpander(childStrctMdlNode, view, depth, axis, facts, axisBrkdnRels, iBrkdn):
664
+ if iBrkdn is not None: # recurse table relationships for cartesian product
665
+ for j, axisBrkdnRel in enumerate(axisBrkdnRels[iBrkdn+1:]):
666
+ brkdnDefnMdlNode = axisBrkdnRel.toModelObject
667
+ if isinstance(brkdnDefnMdlNode, DefnMdlBreakdown):
668
+ subOrdTblCntx = childStrctMdlNode
669
+ # predefined axes need facts sub-filtered
670
+ if isinstance(childStrctMdlNode.defnMdlNode, DefnMdlClosedDefinitionNode):
671
+ matchingFacts = childStrctMdlNode.evaluate(childStrctMdlNode.defnMdlNode,
672
+ childStrctMdlNode.defnMdlNode.filteredFacts,
673
+ evalArgs=(facts,))
674
+ else:
675
+ matchingFacts = facts
676
+ # returns whether there were no structural node results
677
+ subOrdTblCntx.abstract = True # can't be abstract across breakdown
678
+ resolveDefinition(view, subOrdTblCntx, brkdnDefnMdlNode,
679
+ depth, # depth + (0 if axis == 'z' else 1),
680
+ matchingFacts, j + iBrkdn + 1, axisBrkdnRels,
681
+ axis=subOrdTblCntx.axis) #cartesian product
682
+ break
683
+
684
+ def addRelationship(relDefinitionNode, rel, strctMdlNode, rootOrSelfStructuralNodes=None):
685
+ variableQname = relDefinitionNode.variableQname
686
+ conceptQname = relDefinitionNode.conceptQname
687
+ coveredAspect = relDefinitionNode.coveredAspect(strctMdlNode)
688
+ if not coveredAspect:
689
+ return None
690
+ if rootOrSelfStructuralNodes is not None:
691
+ if isinstance(rel, QName):
692
+ fromConceptQname = rel
693
+ if fromConceptQname == XbrlConst.qnXfiRoot:
694
+ return None
695
+ else:
696
+ fromConceptQname = rel.fromModelObject.qname
697
+ # is there an ordinate for this root object?
698
+ if fromConceptQname in rootOrSelfStructuralNodes:
699
+ childStrctMdlNode = rootOrSelfStructuralNodes[fromConceptQname]
700
+ else:
701
+ childStrctMdlNode = StrctMdlStructuralNode(strctMdlNode, relDefinitionNode)
702
+ rootOrSelfStructuralNodes[fromConceptQname] = childStrctMdlNode
703
+ if variableQname:
704
+ childStrctMdlNode.variables[variableQname] = []
705
+ if conceptQname:
706
+ childStrctMdlNode.variables[conceptQname] = fromConceptQname
707
+ childStrctMdlNode.aspects[coveredAspect] = fromConceptQname
708
+ concept = relDefinitionNode.modelXbrl.qnameConcepts.get(fromConceptQname)
709
+ if concept is not None and concept.isAbstract:
710
+ childStrctMdlNode.abstract = True
711
+ if isinstance(rel, QName):
712
+ return childStrctMdlNode
713
+ relChildStrctMdlNode = StrctMdlStructuralNode(childStrctMdlNode, relDefinitionNode)
714
+ else:
715
+ relChildStrctMdlNode = StrctMdlStructuralNode(strctMdlNode, relDefinitionNode)
716
+ if isinstance(rel, ModelRelationship):
717
+ if isinstance(relDefinitionNode, DefnMdlConceptRelationshipNode):
718
+ preferredLabel = rel.preferredLabel
719
+ genPreferredLabel = rel.get("{http://xbrl.org/2013/preferred-label}preferredLabel")
720
+ if preferredLabel is None:
721
+ if genPreferredLabel is not None:
722
+ preferredLabel = genPreferredLabel
723
+ elif genPreferredLabel is not None:
724
+ rel.modelXbrl.error("xbrlte:ambiguousPreferredLabel",
725
+ _("PresentationArc has both the preferredLabel (%(preferredLabel)s) and gpl:preferredLabel (%(genPreferredLabel)s) attributes"),
726
+ modelObject=rel, preferredLabel=preferredLabel, genPreferredLabel=genPreferredLabel)
727
+ if preferredLabel == XbrlConst.periodStartLabel:
728
+ relChildStrctMdlNode.tagSelector = "table.periodStart"
729
+ elif preferredLabel == XbrlConst.periodEndLabel:
730
+ relChildStrctMdlNode.tagSelector = "table.periodEnd"
731
+ elif isinstance(relDefinitionNode, DefnMdlDimensionRelationshipNode):
732
+ relChildStrctMdlNode.abstract = not rel.isUsable
733
+ toConceptQname = rel.toModelObject.qname
734
+ else:
735
+ toConceptQname = rel # QName
736
+ if variableQname:
737
+ relChildStrctMdlNode.variables[variableQname] = rel
738
+ if conceptQname:
739
+ relChildStrctMdlNode.variables[conceptQname] = toConceptQname
740
+ relChildStrctMdlNode.aspects[coveredAspect] = toConceptQname
741
+ concept = relDefinitionNode.modelXbrl.qnameConcepts.get(toConceptQname)
742
+ if isinstance(relDefinitionNode, DefnMdlConceptRelationshipNode) and concept is not None and concept.isAbstract:
743
+ relChildStrctMdlNode.abstract = True
744
+ return relChildStrctMdlNode
745
+
746
+ def addRelationships(relDefinitionNode, rels, strctMdlNode, rootOrSelfStructuralNodes=None):
747
+ childStrctMdlNode = None # holder for nested relationships
748
+ for rel in rels:
749
+ if not isinstance(rel, list):
750
+ # first entry can be parent of nested list relationships
751
+ childStrctMdlNode = addRelationship(relDefinitionNode, rel, strctMdlNode, rootOrSelfStructuralNodes)
752
+ elif childStrctMdlNode is None:
753
+ childStrctMdlNode = StrctMdlStructuralNode(strctMdlNode, relDefinitionNode)
754
+ addRelationships(relDefinitionNode, rel, childStrctMdlNode)
755
+ else:
756
+ addRelationships(relDefinitionNode, rel, childStrctMdlNode)
757
+
758
+ def trimAbstractNodes(strctMdlParent):
759
+ for childStrctMdlNode in strctMdlParent.strctMdlChildNodes:
760
+ trimAbstractNodes(childStrctMdlNode)
761
+ # remove childless abstract structural nodes by tail recursion
762
+ abstractChildlessNodes = []
763
+ for i, childStrctMdlNode in enumerate(strctMdlParent.strctMdlChildNodes):
764
+ if childStrctMdlNode.isAbstract and not childStrctMdlNode.strctMdlChildNodes:
765
+ abstractChildlessNodes.insert(0, i) # reversed list
766
+ for i in abstractChildlessNodes:
767
+ del strctMdlParent.strctMdlChildNodes[i]
768
+
769
+ def getDepth(strctMdlParent, depth=0):
770
+ maxDepth = depth
771
+ for childStrctMdlNode in strctMdlParent.strctMdlChildNodes:
772
+ d = getDepth(childStrctMdlNode, depth+1)
773
+ if d > maxDepth:
774
+ maxDepth = d
775
+ return maxDepth
776
+
777
+
778
+ def addDescendantRollups(strctMdlParent, maxDepth=None, depth=0):
779
+ if maxDepth is None:
780
+ maxDepth = getDepth(strctMdlParent)
781
+ # add roll-up nodes after the children were populated from top level
782
+ needsChildRollup = 0 < depth < maxDepth and (not strctMdlParent.isAbstract or strctMdlParent.rollup)
783
+ for childStrctMdlNode in strctMdlParent.strctMdlChildNodes:
784
+ addDescendantRollups(childStrctMdlNode, maxDepth, depth=depth+1)
785
+ if needsChildRollup:
786
+ rollUpStrctNode = StrctMdlStructuralNode(strctMdlParent, strctMdlParent.defnMdlNode)
787
+ rollUpStrctNode.rollup = strctMdlParent.defnMdlNode.strctMdlRollupType
788
+ strctMdlParent.hasChildRollup = True
789
+ strctMdlParent.rollUpChildStrctMdlNode = rollUpStrctNode
790
+ if len(strctMdlParent.strctMdlChildNodes) > 1 and strctMdlParent.parentChildOrder == "parent-first":
791
+ strctMdlParent.strctMdlChildNodes = strctMdlParent.strctMdlChildNodes[-1:] + strctMdlParent.strctMdlChildNodes[0:-1]
792
+ addDescendantRollups(rollUpStrctNode, maxDepth, depth=depth+1)
793
+
794
+ def addDefaultedDimensionsToLeafNodes(strctMdlNode, coveredDims=None, defaultedDims=None):
795
+ if coveredDims is None:
796
+ coveredDims = set()
797
+ defaultedDims = set()
798
+ coveredDims = coveredDims | strctMdlNode.aspectsCovered()
799
+ if strctMdlNode.hasAspect(Aspect.OMIT_DIMENSIONS):
800
+ coveredDims = coveredDims - set(strctMdlNode.aspectValue(Aspect.OMIT_DIMENSIONS))
801
+ if hasattr(strctMdlNode.defnMdlNode, "deemedDefaultedDims"):
802
+ defaultedDims = defaultedDims | getattr(strctMdlNode.defnMdlNode, "deemedDefaultedDims")
803
+ if strctMdlNode.rollup == ROLLUP_IMPLIES_DEFAULT_MEMBER:
804
+ deemedDefaultedDims = defaultedDims - coveredDims
805
+ if deemedDefaultedDims:
806
+ strctMdlNode.deemedDefaultedDims = deemedDefaultedDims
807
+ defaultedDims -= deemedDefaultedDims
808
+ if strctMdlNode.strctMdlChildNodes:
809
+ for childStrctMdlNode in strctMdlNode.strctMdlChildNodes:
810
+ addDefaultedDimensionsToLeafNodes(childStrctMdlNode, coveredDims, defaultedDims)
811
+ else: # leaf node
812
+ deemedDefaultedDims = defaultedDims - coveredDims
813
+ if deemedDefaultedDims:
814
+ strctMdlNode.deemedDefaultedDims = deemedDefaultedDims