patreon-dl 1.0.0

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 (223) hide show
  1. package/README.md +422 -0
  2. package/bin/patreon-dl.js +5 -0
  3. package/dist/cli/CLIOptionValidator.d.ts +9 -0
  4. package/dist/cli/CLIOptionValidator.d.ts.map +1 -0
  5. package/dist/cli/CLIOptionValidator.js +85 -0
  6. package/dist/cli/CLIOptionValidator.js.map +1 -0
  7. package/dist/cli/CLIOptions.d.ts +20 -0
  8. package/dist/cli/CLIOptions.d.ts.map +1 -0
  9. package/dist/cli/CLIOptions.js +75 -0
  10. package/dist/cli/CLIOptions.js.map +1 -0
  11. package/dist/cli/CommandLineParser.d.ts +11 -0
  12. package/dist/cli/CommandLineParser.d.ts.map +1 -0
  13. package/dist/cli/CommandLineParser.js +212 -0
  14. package/dist/cli/CommandLineParser.js.map +1 -0
  15. package/dist/cli/ConfigFileParser.d.ts +9 -0
  16. package/dist/cli/ConfigFileParser.d.ts.map +1 -0
  17. package/dist/cli/ConfigFileParser.js +163 -0
  18. package/dist/cli/ConfigFileParser.js.map +1 -0
  19. package/dist/cli/index.d.ts +7 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +162 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/downloaders/Bootstrap.d.ts +29 -0
  24. package/dist/downloaders/Bootstrap.d.ts.map +1 -0
  25. package/dist/downloaders/Bootstrap.js +51 -0
  26. package/dist/downloaders/Bootstrap.js.map +1 -0
  27. package/dist/downloaders/Downloader.d.ts +59 -0
  28. package/dist/downloaders/Downloader.d.ts.map +1 -0
  29. package/dist/downloaders/Downloader.js +357 -0
  30. package/dist/downloaders/Downloader.js.map +1 -0
  31. package/dist/downloaders/DownloaderEvent.d.ts +47 -0
  32. package/dist/downloaders/DownloaderEvent.d.ts.map +1 -0
  33. package/dist/downloaders/DownloaderEvent.js +6 -0
  34. package/dist/downloaders/DownloaderEvent.js.map +1 -0
  35. package/dist/downloaders/DownloaderOptions.d.ts +39 -0
  36. package/dist/downloaders/DownloaderOptions.d.ts.map +1 -0
  37. package/dist/downloaders/DownloaderOptions.js +69 -0
  38. package/dist/downloaders/DownloaderOptions.js.map +1 -0
  39. package/dist/downloaders/PostDownloader.d.ts +8 -0
  40. package/dist/downloaders/PostDownloader.d.ts.map +1 -0
  41. package/dist/downloaders/PostDownloader.js +428 -0
  42. package/dist/downloaders/PostDownloader.js.map +1 -0
  43. package/dist/downloaders/ProductDownloader.d.ts +8 -0
  44. package/dist/downloaders/ProductDownloader.d.ts.map +1 -0
  45. package/dist/downloaders/ProductDownloader.js +171 -0
  46. package/dist/downloaders/ProductDownloader.js.map +1 -0
  47. package/dist/downloaders/cache/StatusCache.d.ts +43 -0
  48. package/dist/downloaders/cache/StatusCache.d.ts.map +1 -0
  49. package/dist/downloaders/cache/StatusCache.js +206 -0
  50. package/dist/downloaders/cache/StatusCache.js.map +1 -0
  51. package/dist/downloaders/index.d.ts +7 -0
  52. package/dist/downloaders/index.d.ts.map +1 -0
  53. package/dist/downloaders/index.js +6 -0
  54. package/dist/downloaders/index.js.map +1 -0
  55. package/dist/downloaders/task/DownloadTask.d.ts +89 -0
  56. package/dist/downloaders/task/DownloadTask.d.ts.map +1 -0
  57. package/dist/downloaders/task/DownloadTask.js +240 -0
  58. package/dist/downloaders/task/DownloadTask.js.map +1 -0
  59. package/dist/downloaders/task/DownloadTaskBatch.d.ts +45 -0
  60. package/dist/downloaders/task/DownloadTaskBatch.d.ts.map +1 -0
  61. package/dist/downloaders/task/DownloadTaskBatch.js +195 -0
  62. package/dist/downloaders/task/DownloadTaskBatch.js.map +1 -0
  63. package/dist/downloaders/task/DownloadTaskBatchEvent.d.ts +32 -0
  64. package/dist/downloaders/task/DownloadTaskBatchEvent.d.ts.map +1 -0
  65. package/dist/downloaders/task/DownloadTaskBatchEvent.js +2 -0
  66. package/dist/downloaders/task/DownloadTaskBatchEvent.js.map +1 -0
  67. package/dist/downloaders/task/DownloadTaskFactory.d.ts +20 -0
  68. package/dist/downloaders/task/DownloadTaskFactory.d.ts.map +1 -0
  69. package/dist/downloaders/task/DownloadTaskFactory.js +177 -0
  70. package/dist/downloaders/task/DownloadTaskFactory.js.map +1 -0
  71. package/dist/downloaders/task/FFmpegDownloadTask.d.ts +27 -0
  72. package/dist/downloaders/task/FFmpegDownloadTask.d.ts.map +1 -0
  73. package/dist/downloaders/task/FFmpegDownloadTask.js +206 -0
  74. package/dist/downloaders/task/FFmpegDownloadTask.js.map +1 -0
  75. package/dist/downloaders/task/FetcherDownloadTask.d.ts +21 -0
  76. package/dist/downloaders/task/FetcherDownloadTask.d.ts.map +1 -0
  77. package/dist/downloaders/task/FetcherDownloadTask.js +213 -0
  78. package/dist/downloaders/task/FetcherDownloadTask.js.map +1 -0
  79. package/dist/downloaders/task/index.d.ts +4 -0
  80. package/dist/downloaders/task/index.d.ts.map +1 -0
  81. package/dist/downloaders/task/index.js +3 -0
  82. package/dist/downloaders/task/index.js.map +1 -0
  83. package/dist/downloaders/templates/CampaignInfo.d.ts +3 -0
  84. package/dist/downloaders/templates/CampaignInfo.d.ts.map +1 -0
  85. package/dist/downloaders/templates/CampaignInfo.js +58 -0
  86. package/dist/downloaders/templates/CampaignInfo.js.map +1 -0
  87. package/dist/downloaders/templates/PostInfo.d.ts +4 -0
  88. package/dist/downloaders/templates/PostInfo.d.ts.map +1 -0
  89. package/dist/downloaders/templates/PostInfo.js +45 -0
  90. package/dist/downloaders/templates/PostInfo.js.map +1 -0
  91. package/dist/downloaders/templates/ProductInfo.d.ts +3 -0
  92. package/dist/downloaders/templates/ProductInfo.d.ts.map +1 -0
  93. package/dist/downloaders/templates/ProductInfo.js +20 -0
  94. package/dist/downloaders/templates/ProductInfo.js.map +1 -0
  95. package/dist/entities/Attachment.d.ts +7 -0
  96. package/dist/entities/Attachment.d.ts.map +1 -0
  97. package/dist/entities/Attachment.js +2 -0
  98. package/dist/entities/Attachment.js.map +1 -0
  99. package/dist/entities/Campaign.d.ts +19 -0
  100. package/dist/entities/Campaign.d.ts.map +1 -0
  101. package/dist/entities/Campaign.js +2 -0
  102. package/dist/entities/Campaign.js.map +1 -0
  103. package/dist/entities/Downloadable.d.ts +6 -0
  104. package/dist/entities/Downloadable.d.ts.map +1 -0
  105. package/dist/entities/Downloadable.js +5 -0
  106. package/dist/entities/Downloadable.js.map +1 -0
  107. package/dist/entities/MediaItem.d.ts +95 -0
  108. package/dist/entities/MediaItem.d.ts.map +1 -0
  109. package/dist/entities/MediaItem.js +2 -0
  110. package/dist/entities/MediaItem.js.map +1 -0
  111. package/dist/entities/Post.d.ts +87 -0
  112. package/dist/entities/Post.d.ts.map +1 -0
  113. package/dist/entities/Post.js +2 -0
  114. package/dist/entities/Post.js.map +1 -0
  115. package/dist/entities/Product.d.ts +17 -0
  116. package/dist/entities/Product.d.ts.map +1 -0
  117. package/dist/entities/Product.js +2 -0
  118. package/dist/entities/Product.js.map +1 -0
  119. package/dist/entities/Reward.d.ts +14 -0
  120. package/dist/entities/Reward.d.ts.map +1 -0
  121. package/dist/entities/Reward.js +2 -0
  122. package/dist/entities/Reward.js.map +1 -0
  123. package/dist/entities/User.d.ts +15 -0
  124. package/dist/entities/User.d.ts.map +1 -0
  125. package/dist/entities/User.js +2 -0
  126. package/dist/entities/User.js.map +1 -0
  127. package/dist/entities/index.d.ts +9 -0
  128. package/dist/entities/index.d.ts.map +1 -0
  129. package/dist/entities/index.js +6 -0
  130. package/dist/entities/index.js.map +1 -0
  131. package/dist/index.d.ts +8 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +8 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/parsers/PageParser.d.ts +6 -0
  136. package/dist/parsers/PageParser.d.ts.map +1 -0
  137. package/dist/parsers/PageParser.js +23 -0
  138. package/dist/parsers/PageParser.js.map +1 -0
  139. package/dist/parsers/Parser.d.ts +43 -0
  140. package/dist/parsers/Parser.d.ts.map +1 -0
  141. package/dist/parsers/Parser.js +439 -0
  142. package/dist/parsers/Parser.js.map +1 -0
  143. package/dist/parsers/PostParser.d.ts +7 -0
  144. package/dist/parsers/PostParser.d.ts.map +1 -0
  145. package/dist/parsers/PostParser.js +259 -0
  146. package/dist/parsers/PostParser.js.map +1 -0
  147. package/dist/parsers/ProductParser.d.ts +7 -0
  148. package/dist/parsers/ProductParser.d.ts.map +1 -0
  149. package/dist/parsers/ProductParser.js +70 -0
  150. package/dist/parsers/ProductParser.js.map +1 -0
  151. package/dist/utils/AttachmentFilenameResolver.d.ts +9 -0
  152. package/dist/utils/AttachmentFilenameResolver.d.ts.map +1 -0
  153. package/dist/utils/AttachmentFilenameResolver.js +73 -0
  154. package/dist/utils/AttachmentFilenameResolver.js.map +1 -0
  155. package/dist/utils/FSHelper.d.ts +57 -0
  156. package/dist/utils/FSHelper.d.ts.map +1 -0
  157. package/dist/utils/FSHelper.js +214 -0
  158. package/dist/utils/FSHelper.js.map +1 -0
  159. package/dist/utils/Fetcher.d.ts +45 -0
  160. package/dist/utils/Fetcher.d.ts.map +1 -0
  161. package/dist/utils/Fetcher.js +192 -0
  162. package/dist/utils/Fetcher.js.map +1 -0
  163. package/dist/utils/FetcherProgressMonitor.d.ts +18 -0
  164. package/dist/utils/FetcherProgressMonitor.d.ts.map +1 -0
  165. package/dist/utils/FetcherProgressMonitor.js +56 -0
  166. package/dist/utils/FetcherProgressMonitor.js.map +1 -0
  167. package/dist/utils/FilenameFormatHelper.d.ts +44 -0
  168. package/dist/utils/FilenameFormatHelper.d.ts.map +1 -0
  169. package/dist/utils/FilenameFormatHelper.js +98 -0
  170. package/dist/utils/FilenameFormatHelper.js.map +1 -0
  171. package/dist/utils/FllenameResolver.d.ts +20 -0
  172. package/dist/utils/FllenameResolver.d.ts.map +1 -0
  173. package/dist/utils/FllenameResolver.js +55 -0
  174. package/dist/utils/FllenameResolver.js.map +1 -0
  175. package/dist/utils/Formatter.d.ts +21 -0
  176. package/dist/utils/Formatter.d.ts.map +1 -0
  177. package/dist/utils/Formatter.js +112 -0
  178. package/dist/utils/Formatter.js.map +1 -0
  179. package/dist/utils/MediaFilenameResolver.d.ts +9 -0
  180. package/dist/utils/MediaFilenameResolver.d.ts.map +1 -0
  181. package/dist/utils/MediaFilenameResolver.js +90 -0
  182. package/dist/utils/MediaFilenameResolver.js.map +1 -0
  183. package/dist/utils/Misc.d.ts +14 -0
  184. package/dist/utils/Misc.d.ts.map +1 -0
  185. package/dist/utils/Misc.js +4 -0
  186. package/dist/utils/Misc.js.map +1 -0
  187. package/dist/utils/ObjectHelper.d.ts +4 -0
  188. package/dist/utils/ObjectHelper.d.ts.map +1 -0
  189. package/dist/utils/ObjectHelper.js +30 -0
  190. package/dist/utils/ObjectHelper.js.map +1 -0
  191. package/dist/utils/PackageInfo.d.ts +10 -0
  192. package/dist/utils/PackageInfo.d.ts.map +1 -0
  193. package/dist/utils/PackageInfo.js +33 -0
  194. package/dist/utils/PackageInfo.js.map +1 -0
  195. package/dist/utils/URLHelper.d.ts +40 -0
  196. package/dist/utils/URLHelper.d.ts.map +1 -0
  197. package/dist/utils/URLHelper.js +192 -0
  198. package/dist/utils/URLHelper.js.map +1 -0
  199. package/dist/utils/index.d.ts +2 -0
  200. package/dist/utils/index.d.ts.map +1 -0
  201. package/dist/utils/index.js +2 -0
  202. package/dist/utils/index.js.map +1 -0
  203. package/dist/utils/logging/ChainLogger.d.ts +11 -0
  204. package/dist/utils/logging/ChainLogger.d.ts.map +1 -0
  205. package/dist/utils/logging/ChainLogger.js +50 -0
  206. package/dist/utils/logging/ChainLogger.js.map +1 -0
  207. package/dist/utils/logging/ConsoleLogger.d.ts +31 -0
  208. package/dist/utils/logging/ConsoleLogger.d.ts.map +1 -0
  209. package/dist/utils/logging/ConsoleLogger.js +126 -0
  210. package/dist/utils/logging/ConsoleLogger.js.map +1 -0
  211. package/dist/utils/logging/FileLogger.d.ts +26 -0
  212. package/dist/utils/logging/FileLogger.d.ts.map +1 -0
  213. package/dist/utils/logging/FileLogger.js +147 -0
  214. package/dist/utils/logging/FileLogger.js.map +1 -0
  215. package/dist/utils/logging/Logger.d.ts +12 -0
  216. package/dist/utils/logging/Logger.d.ts.map +1 -0
  217. package/dist/utils/logging/Logger.js +15 -0
  218. package/dist/utils/logging/Logger.js.map +1 -0
  219. package/dist/utils/logging/index.d.ts +7 -0
  220. package/dist/utils/logging/index.d.ts.map +1 -0
  221. package/dist/utils/logging/index.js +7 -0
  222. package/dist/utils/logging/index.js.map +1 -0
  223. package/package.json +78 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=MediaItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaItem.js","sourceRoot":"","sources":["../../src/entities/MediaItem.ts"],"names":[],"mappings":"","sourcesContent":["export interface MediaLike {\n type: string;\n id: string;\n filename: string | null;\n mimeType: string | null;\n}\n\nexport type ImageType =\n 'single' |\n 'default' |\n 'campaignCoverPhoto' |\n 'postCoverImage' |\n 'postThumbnail';\n\nexport interface SingleImageMediaItem extends MediaLike {\n type: 'image';\n imageType: 'single';\n imageURL: string | null;\n}\n\nexport interface DefaultImageMediaItem extends MediaLike {\n type: 'image';\n imageType: 'default';\n createdAt: string | null;\n downloadURL: string | null;\n imageURLs: {\n default: string | null;\n defaultSmall: string | null;\n original: string | null; // This is not the same as downloadURL (which has smaller filesize)\n thumbnail: string | null;\n thumbnailLarge: string | null;\n thumbnailSmall: string | null;\n }\n}\n\nexport interface CampaignCoverPhotoMediaItem extends MediaLike {\n type: 'image';\n imageType: 'campaignCoverPhoto';\n imageURLs: {\n large: string | null;\n medium: string | null;\n small: string | null;\n xlarge: string | null;\n xsmall: string | null;\n }\n}\n\nexport interface PostCoverImageMediaItem extends MediaLike {\n type: 'image';\n imageType: 'postCoverImage';\n imageURLs: {\n large: string | null;\n thumbSquareLarge: string | null;\n thumbSquare: string | null;\n thumb: string | null;\n default: string | null;\n }\n}\n\nexport interface PostThumbnailMediaItem extends MediaLike {\n type: 'image';\n imageType: 'postThumbnail';\n imageURLs: {\n large: string | null;\n large2: string | null;\n square: string | null;\n default: string | null;\n }\n}\n\nexport type ImageMediaItem<T extends ImageType> =\n T extends 'single' ? SingleImageMediaItem :\n T extends 'default' ? DefaultImageMediaItem :\n T extends 'campaignCoverPhoto' ? CampaignCoverPhotoMediaItem :\n T extends 'postCoverImage' ? PostCoverImageMediaItem :\n T extends 'postThumbnail' ? PostThumbnailMediaItem :\n never;\n\nexport interface VideoMediaItem extends MediaLike {\n type: 'video';\n createdAt: string | null;\n size: {\n width: number | null;\n height: number | null;\n },\n duration: number | null; // Seconds\n downloadURL: string | null;\n displayURLs: {\n thumbnail: string | null;\n video: string | null; // URL of video displayed on-screen\n }\n}\n\nexport interface AudioMediaItem extends MediaLike {\n type: 'audio';\n createdAt: string | null;\n url: string | null;\n}\n\nexport interface FileMediaItem extends MediaLike {\n type: 'file';\n createdAt: string | null;\n downloadURL: string | null;\n}\n\n/**\n * Minimal `MediaItem` typically used to represent media-type properties of elements, such\n * as video thumbnails and campaign avatar / cover photos.\n * As a `MediaItem` type, and hence also a `Downloadable` type, it can be used to create\n * `MediaFilenameResolver` and `DownloadTask` instances.\n */\nexport interface DummyMediaItem extends MediaLike {\n type: 'dummy';\n // { variant: url }\n srcURLs: Record<string, string | null>;\n}\n\nexport type MediaItem =\n ImageMediaItem<any> |\n VideoMediaItem |\n AudioMediaItem |\n FileMediaItem |\n DummyMediaItem;\n"]}
@@ -0,0 +1,87 @@
1
+ import { Campaign } from './Campaign.js';
2
+ import { Downloadable } from './Downloadable.js';
3
+ import { PostCoverImageMediaItem, PostThumbnailMediaItem } from './MediaItem.js';
4
+ export interface PostCollection {
5
+ url: string;
6
+ posts: Post[];
7
+ total: number | null;
8
+ nextURL: string | null;
9
+ }
10
+ export interface Post {
11
+ type: 'post';
12
+ id: string;
13
+ /**
14
+ * @privateRemarks
15
+ *
16
+ * `data.attibutes.post_type`
17
+ *
18
+ * Known types:
19
+ * - image_file
20
+ * - video_external_file
21
+ * - audio_file
22
+ * - text_only
23
+ * - poll
24
+ * - link: only embedded link info is saved. Link is not followed / downloaded.
25
+ * - video_embed - only embedded video info is saved. Video itself is not downloaded.
26
+ */
27
+ postType: string;
28
+ isViewable: boolean;
29
+ url: string | null;
30
+ title: string | null;
31
+ content: string | null;
32
+ teaserText: string | null;
33
+ publishedAt: string | null;
34
+ editedAt: string | null;
35
+ coverImage: PostCoverImageMediaItem | null;
36
+ thumbnail: PostThumbnailMediaItem | null;
37
+ /**
38
+ * @privateRemarks
39
+ * `data.attibutes.embed`
40
+ */
41
+ embed: PostEmbed | null;
42
+ /**
43
+ * @privateRemarks
44
+ * `data.relationships.attachments`
45
+ */
46
+ attachments: Downloadable[];
47
+ /**
48
+ * @privateRemarks
49
+ * `data.relationships.audio`
50
+ */
51
+ audio: Downloadable | null;
52
+ /**
53
+ * @privateRemarks
54
+ * `data.relationships.audio_prevew`
55
+ */
56
+ audioPreview: Downloadable | null;
57
+ /**
58
+ * @privateRemarks
59
+ * `data.relationships.images`
60
+ */
61
+ images: Downloadable[];
62
+ /**
63
+ * @privateRemarks
64
+ * Not included in `data.relationships`
65
+ * Converted from `data.attributes.video_preview`
66
+ */
67
+ videoPreview: Downloadable | null;
68
+ /**
69
+ * @privateRemarks
70
+ * Not included in `data.relationships`
71
+ * Converted from `data.attributes.post_file` with
72
+ * `data.attributes.post_type` matching 'video_external_file'
73
+ */
74
+ video: Downloadable | null;
75
+ campaign: Campaign | null;
76
+ raw: object;
77
+ }
78
+ export interface PostEmbed {
79
+ type: 'video' | 'link' | 'unknown';
80
+ description: string | null;
81
+ html: string | null;
82
+ provider: string | null;
83
+ providerURL: string | null;
84
+ subject: string | null;
85
+ url: string | null;
86
+ }
87
+ //# sourceMappingURL=Post.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Post.d.ts","sourceRoot":"","sources":["../../src/entities/Post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEjF,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX;;;;;;;;;;;;;OAaG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC3C,SAAS,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAEzC;;;OAGG;IACH,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAExB;;;OAGG;IACH,WAAW,EAAE,YAAY,EAAE,CAAC;IAE5B;;;OAGG;IACH,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAE3B;;;OAGG;IACH,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAElC;;;OAGG;IACH,MAAM,EAAE,YAAY,EAAE,CAAC;IAEvB;;;;OAIG;IACH,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAElC;;;;;OAKG;IACH,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAE3B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAE1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACnC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Post.js","sourceRoot":"","sources":["../../src/entities/Post.ts"],"names":[],"mappings":"","sourcesContent":["import { Campaign } from './Campaign.js';\nimport { Downloadable } from './Downloadable.js';\nimport { PostCoverImageMediaItem, PostThumbnailMediaItem } from './MediaItem.js';\n\nexport interface PostCollection {\n url: string;\n posts: Post[];\n total: number | null;\n nextURL: string | null;\n}\n\nexport interface Post {\n type: 'post';\n id: string;\n /**\n * @privateRemarks\n *\n * `data.attibutes.post_type`\n *\n * Known types:\n * - image_file\n * - video_external_file\n * - audio_file\n * - text_only\n * - poll\n * - link: only embedded link info is saved. Link is not followed / downloaded.\n * - video_embed - only embedded video info is saved. Video itself is not downloaded.\n */\n postType: string;\n isViewable: boolean;\n url: string | null;\n title: string | null;\n content: string | null;\n teaserText: string | null;\n publishedAt: string | null;\n editedAt: string | null;\n coverImage: PostCoverImageMediaItem | null;\n thumbnail: PostThumbnailMediaItem | null;\n\n /**\n * @privateRemarks\n * `data.attibutes.embed`\n */\n embed: PostEmbed | null;\n\n /**\n * @privateRemarks\n * `data.relationships.attachments`\n */\n attachments: Downloadable[];\n\n /**\n * @privateRemarks\n * `data.relationships.audio`\n */\n audio: Downloadable | null;\n\n /**\n * @privateRemarks\n * `data.relationships.audio_prevew`\n */\n audioPreview: Downloadable | null;\n\n /**\n * @privateRemarks\n * `data.relationships.images`\n */\n images: Downloadable[];\n\n /**\n * @privateRemarks\n * Not included in `data.relationships`\n * Converted from `data.attributes.video_preview`\n */\n videoPreview: Downloadable | null;\n\n /**\n * @privateRemarks\n * Not included in `data.relationships`\n * Converted from `data.attributes.post_file` with\n * `data.attributes.post_type` matching 'video_external_file'\n */\n video: Downloadable | null;\n\n campaign: Campaign | null;\n\n raw: object;\n}\n\nexport interface PostEmbed {\n type: 'video' | 'link' | 'unknown';\n description: string | null;\n html: string | null;\n provider: string | null;\n providerURL: string | null;\n subject: string | null;\n url: string | null;\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import { Campaign } from './Campaign.js';
2
+ import { Downloadable } from './Downloadable.js';
3
+ export interface Product {
4
+ type: 'product';
5
+ id: string;
6
+ isAccessible: boolean;
7
+ name: string | null;
8
+ description: string | null;
9
+ price: string | null;
10
+ publishedAt: string | null;
11
+ url: string;
12
+ previewMedia: Downloadable[];
13
+ contentMedia: Downloadable[];
14
+ campaign: Campaign | null;
15
+ raw: object;
16
+ }
17
+ //# sourceMappingURL=Product.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Product.d.ts","sourceRoot":"","sources":["../../src/entities/Product.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,OAAO,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Product.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Product.js","sourceRoot":"","sources":["../../src/entities/Product.ts"],"names":[],"mappings":"","sourcesContent":["import { Campaign } from './Campaign.js';\nimport { Downloadable } from './Downloadable.js';\n\nexport interface Product {\n type: 'product';\n id: string;\n isAccessible: boolean;\n name: string | null;\n description: string | null;\n price: string | null;\n publishedAt: string | null;\n url: string;\n previewMedia: Downloadable[];\n contentMedia: Downloadable[];\n campaign: Campaign | null;\n raw: object;\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import { Downloadable } from './Downloadable.js';
2
+ export interface Reward {
3
+ type: 'reward';
4
+ id: string;
5
+ title: string | null;
6
+ description: string | null;
7
+ amount: string | null;
8
+ createdAt: string | null;
9
+ publishedAt: string | null;
10
+ editedAt: string | null;
11
+ image: Downloadable | null;
12
+ url: string | null;
13
+ }
14
+ //# sourceMappingURL=Reward.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Reward.d.ts","sourceRoot":"","sources":["../../src/entities/Reward.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Reward.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Reward.js","sourceRoot":"","sources":["../../src/entities/Reward.ts"],"names":[],"mappings":"","sourcesContent":["import { Downloadable } from './Downloadable.js';\n\nexport interface Reward {\n type: 'reward';\n id: string;\n title: string | null;\n description: string | null;\n amount: string | null;\n createdAt: string | null;\n publishedAt: string | null;\n editedAt: string | null;\n image: Downloadable | null;\n url: string | null;\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { SingleImageMediaItem } from './MediaItem.js';
2
+ export interface User {
3
+ type: 'user';
4
+ id: string;
5
+ firstName: string;
6
+ lastName: string;
7
+ fullName: string;
8
+ createdAt: string | null;
9
+ image: SingleImageMediaItem;
10
+ thumbnail: SingleImageMediaItem;
11
+ url: string;
12
+ vanity: string;
13
+ raw: object;
14
+ }
15
+ //# sourceMappingURL=User.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"User.d.ts","sourceRoot":"","sources":["../../src/entities/User.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,oBAAoB,CAAC;IAC5B,SAAS,EAAE,oBAAoB,CAAC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=User.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"User.js","sourceRoot":"","sources":["../../src/entities/User.ts"],"names":[],"mappings":"","sourcesContent":["import { SingleImageMediaItem } from './MediaItem.js';\n\nexport interface User {\n type: 'user';\n id: string;\n firstName: string;\n lastName: string;\n fullName: string;\n createdAt: string | null;\n image: SingleImageMediaItem;\n thumbnail: SingleImageMediaItem;\n url: string;\n vanity: string;\n raw: object;\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export * from './Attachment.js';
2
+ export * from './Campaign.js';
3
+ export { Downloadable } from './Downloadable.js';
4
+ export * from './MediaItem.js';
5
+ export { Post, PostEmbed } from './Post.js';
6
+ export { Product } from './Product.js';
7
+ export * from './Reward.js';
8
+ export * from './User.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entities/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './Attachment.js';
2
+ export * from './Campaign.js';
3
+ export * from './MediaItem.js';
4
+ export * from './Reward.js';
5
+ export * from './User.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/entities/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAE9B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC","sourcesContent":["export * from './Attachment.js';\nexport * from './Campaign.js';\nexport { Downloadable } from './Downloadable.js';\nexport * from './MediaItem.js';\nexport { Post, PostEmbed } from './Post.js';\nexport { Product } from './Product.js';\nexport * from './Reward.js';\nexport * from './User.js';"]}
@@ -0,0 +1,8 @@
1
+ export * from './downloaders/index.js';
2
+ export * from './downloaders/task/index.js';
3
+ export * from './entities/index.js';
4
+ export * from './utils/index.js';
5
+ export * from './utils/logging/index.js';
6
+ import { default as PatreonDownloader } from './downloaders/Downloader.js';
7
+ export default PatreonDownloader;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AAEzC,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,eAAe,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export * from './downloaders/index.js';
2
+ export * from './downloaders/task/index.js';
3
+ export * from './entities/index.js';
4
+ export * from './utils/index.js';
5
+ export * from './utils/logging/index.js';
6
+ import { default as PatreonDownloader } from './downloaders/Downloader.js';
7
+ export default PatreonDownloader;
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AAEzC,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,eAAe,iBAAiB,CAAC","sourcesContent":["export * from './downloaders/index.js';\nexport * from './downloaders/task/index.js';\nexport * from './entities/index.js';\nexport * from './utils/index.js';\nexport * from './utils/logging/index.js';\n\nimport { default as PatreonDownloader } from './downloaders/Downloader.js';\nexport default PatreonDownloader;\n"]}
@@ -0,0 +1,6 @@
1
+ import Parser from './Parser.js';
2
+ export default class PageParser extends Parser {
3
+ protected name: string;
4
+ parseInitialData(html: string, _url: string): any;
5
+ }
6
+ //# sourceMappingURL=PageParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageParser.d.ts","sourceRoot":"","sources":["../../src/parsers/PageParser.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAIjC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,MAAM;IAE5C,SAAS,CAAC,IAAI,SAAgB;IAE9B,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAc5C"}
@@ -0,0 +1,23 @@
1
+ import Parser from './Parser.js';
2
+ const INITIAL_DATA_REGEX = /window\.patreon.*?=.*?({.+?});/gm;
3
+ export default class PageParser extends Parser {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.name = 'PageParser';
7
+ }
8
+ parseInitialData(html, _url) {
9
+ this.log('debug', `Parse initial data from ${_url}`);
10
+ this.log('debug', `Match pattern: ${INITIAL_DATA_REGEX}`);
11
+ const match = INITIAL_DATA_REGEX.exec(html);
12
+ if (match && match[1]) {
13
+ try {
14
+ return JSON.parse(match[1]);
15
+ }
16
+ catch (error) {
17
+ throw Error(`Parse error: ${error instanceof Error ? error.message : error}`);
18
+ }
19
+ }
20
+ throw Error(`No matches found for pattern: ${INITIAL_DATA_REGEX}`);
21
+ }
22
+ }
23
+ //# sourceMappingURL=PageParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageParser.js","sourceRoot":"","sources":["../../src/parsers/PageParser.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,kBAAkB,GAAG,kCAAkC,CAAC;AAE9D,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,MAAM;IAA9C;;QAEY,SAAI,GAAG,YAAY,CAAC;IAgBhC,CAAC;IAdC,gBAAgB,CAAC,IAAY,EAAE,IAAY;QACzC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,2BAA2B,IAAI,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,kBAAkB,kBAAkB,EAAE,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;YACrB,IAAI;gBACF,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;aAC7B;YACD,OAAO,KAAK,EAAE;gBACZ,MAAM,KAAK,CAAC,gBAAgB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;aAC/E;SACF;QACD,MAAM,KAAK,CAAC,iCAAiC,kBAAkB,EAAE,CAAC,CAAC;IACrE,CAAC;CACF","sourcesContent":["import Parser from './Parser.js';\n\nconst INITIAL_DATA_REGEX = /window\\.patreon.*?=.*?({.+?});/gm;\n\nexport default class PageParser extends Parser {\n\n protected name = 'PageParser';\n\n parseInitialData(html: string, _url: string) {\n this.log('debug', `Parse initial data from ${_url}`);\n this.log('debug', `Match pattern: ${INITIAL_DATA_REGEX}`);\n const match = INITIAL_DATA_REGEX.exec(html);\n if (match && match[1]) {\n try {\n return JSON.parse(match[1]);\n }\n catch (error) {\n throw Error(`Parse error: ${error instanceof Error ? error.message : error}`);\n }\n }\n throw Error(`No matches found for pattern: ${INITIAL_DATA_REGEX}`);\n }\n}\n"]}
@@ -0,0 +1,43 @@
1
+ import { Campaign } from '../entities/Campaign.js';
2
+ import { DOWNLOADABLE_TYPES, Downloadable } from '../entities/Downloadable.js';
3
+ import { DefaultImageMediaItem, MediaItem } from '../entities/MediaItem.js';
4
+ import { User } from '../entities/User.js';
5
+ import Logger, { LogLevel } from '../utils/logging/Logger.js';
6
+ import { Attachment } from '../entities/Attachment.js';
7
+ import { Reward } from '../entities/Reward.js';
8
+ export default abstract class Parser {
9
+ #private;
10
+ protected abstract name: string;
11
+ constructor(logger?: Logger | null);
12
+ /**
13
+ *
14
+ * @param relationships `data[index].relationships`, where `data[index]` corresponds
15
+ * to a product or post returned in an API response.
16
+ * @param targets Fields in `relationships` to process, e.g. `audio`, `images`
17
+ * @param included The `included` array of API response
18
+ * @param parentName The name of the parent item containing `relationships`; for logging purpose.
19
+ * @returns
20
+ */
21
+ protected fetchDownloadablesFromRelationships<T extends Record<string, string>>(relationships: any, targets: T, included: any, parentName: string, warnOnTargetNotFound?: boolean): Partial<Record<keyof T, Downloadable[]>>;
22
+ /**
23
+ * A JSON API response typically contain an `included` field, which is an array
24
+ * of items (media, campaign, reward, etc.) that are referenced through its `id`
25
+ * by items contained in the `data` field of the same response.
26
+ *
27
+ * Items in the `included` field contain extra info, such as media URLs,
28
+ * not provided in the `data` items referencing it.
29
+ */
30
+ protected findInAPIResponseIncludedArray(included: Array<any>, id: string, matchType: typeof DOWNLOADABLE_TYPES[number]): Downloadable | null;
31
+ protected findInAPIResponseIncludedArray(included: Array<any>, id: string, matchType: 'media', unknownMediaTypeAs?: 'image' | 'video' | 'audio' | 'file'): MediaItem | null;
32
+ protected findInAPIResponseIncludedArray(included: Array<any>, id: string, matchType: 'reward'): Reward | null;
33
+ protected findInAPIResponseIncludedArray(included: Array<any>, id: string, matchType: 'user', asCreator?: boolean): User | null;
34
+ protected findInAPIResponseIncludedArray(included: Array<any>, id: string, matchType: 'campaign'): Campaign | null;
35
+ protected findInAPIResponseIncludedArray(included: Array<any>, id: string, matchType: 'attachment'): Attachment | null;
36
+ protected parseMediaItemAPIDataInIncludedArray(data: any, unknownMediaTypeAs?: 'image' | 'video' | 'audio' | 'file'): DefaultImageMediaItem | import("../entities/MediaItem.js").VideoMediaItem | import("../entities/MediaItem.js").AudioMediaItem | import("../entities/MediaItem.js").FileMediaItem | null;
37
+ protected parseCampaignAPIDataInIncludedArray(data: any, included: Array<any>): Campaign | null;
38
+ protected parseUserAPIDataInIncludedArray(data: any, asCreator?: boolean): User | null;
39
+ protected parseRewardAPIDataInIncludedArray(data: any): Reward | null;
40
+ protected parseAttachmentAPIDataInIncludedArray(data: any): Attachment | null;
41
+ protected log(level: LogLevel, ...msg: Array<any>): void;
42
+ }
43
+ //# sourceMappingURL=Parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../src/parsers/Parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAsB,MAAM,6BAA6B,CAAC;AACnG,OAAO,EAA+B,qBAAqB,EAAE,SAAS,EAAwB,MAAM,0BAA0B,CAAC;AAC/H,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,MAAM,EAAE,EAAE,QAAQ,EAAa,MAAM,4BAA4B,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,MAAM;;IAElC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAIpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAIlC;;;;;;;;OAQG;IACH,SAAS,CAAC,mCAAmC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5E,aAAa,EAAE,GAAG,EAClB,OAAO,EAAE,CAAC,EACV,QAAQ,EAAE,GAAG,EACb,UAAU,EAAE,MAAM,EAClB,oBAAoB,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;IAkFxE;;;;;;;OAOG;IACH,SAAS,CAAC,8BAA8B,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,kBAAkB,CAAC,MAAM,CAAC,GAAG,YAAY,GAAG,IAAI;IAC7I,SAAS,CAAC,8BAA8B,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI;IAC3K,SAAS,CAAC,8BAA8B,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI;IAC9G,SAAS,CAAC,8BAA8B,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI;IAC/H,SAAS,CAAC,8BAA8B,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI;IAClH,SAAS,CAAC,8BAA8B,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,UAAU,GAAG,IAAI;IA6BtH,SAAS,CAAC,oCAAoC,CAAC,IAAI,EAAE,GAAG,EAAE,kBAAkB,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM;IA0GnH,SAAS,CAAC,mCAAmC,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC;IA6G7E,SAAS,CAAC,+BAA+B,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,UAAQ;IA2CtE,SAAS,CAAC,iCAAiC,CAAC,IAAI,EAAE,GAAG;IA0CrD,SAAS,CAAC,qCAAqC,CAAC,IAAI,EAAE,GAAG;IAoBzD,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;CAGlD"}