tdrpa.tdworker 1.2.13.2__py312-none-win_amd64.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 (101) hide show
  1. tdrpa/_tdxlwings/__init__.py +193 -0
  2. tdrpa/_tdxlwings/__pycache__/__init__.cpython-311.pyc +0 -0
  3. tdrpa/_tdxlwings/__pycache__/__init__.cpython-38.pyc +0 -0
  4. tdrpa/_tdxlwings/__pycache__/_win32patch.cpython-311.pyc +0 -0
  5. tdrpa/_tdxlwings/__pycache__/_win32patch.cpython-38.pyc +0 -0
  6. tdrpa/_tdxlwings/__pycache__/_xlwindows.cpython-311.pyc +0 -0
  7. tdrpa/_tdxlwings/__pycache__/_xlwindows.cpython-38.pyc +0 -0
  8. tdrpa/_tdxlwings/__pycache__/apps.cpython-311.pyc +0 -0
  9. tdrpa/_tdxlwings/__pycache__/apps.cpython-38.pyc +0 -0
  10. tdrpa/_tdxlwings/__pycache__/base_classes.cpython-311.pyc +0 -0
  11. tdrpa/_tdxlwings/__pycache__/base_classes.cpython-38.pyc +0 -0
  12. tdrpa/_tdxlwings/__pycache__/com_server.cpython-311.pyc +0 -0
  13. tdrpa/_tdxlwings/__pycache__/com_server.cpython-38.pyc +0 -0
  14. tdrpa/_tdxlwings/__pycache__/constants.cpython-311.pyc +0 -0
  15. tdrpa/_tdxlwings/__pycache__/constants.cpython-38.pyc +0 -0
  16. tdrpa/_tdxlwings/__pycache__/expansion.cpython-311.pyc +0 -0
  17. tdrpa/_tdxlwings/__pycache__/expansion.cpython-38.pyc +0 -0
  18. tdrpa/_tdxlwings/__pycache__/main.cpython-311.pyc +0 -0
  19. tdrpa/_tdxlwings/__pycache__/main.cpython-38.pyc +0 -0
  20. tdrpa/_tdxlwings/__pycache__/udfs.cpython-311.pyc +0 -0
  21. tdrpa/_tdxlwings/__pycache__/udfs.cpython-38.pyc +0 -0
  22. tdrpa/_tdxlwings/__pycache__/utils.cpython-311.pyc +0 -0
  23. tdrpa/_tdxlwings/__pycache__/utils.cpython-38.pyc +0 -0
  24. tdrpa/_tdxlwings/_win32patch.py +90 -0
  25. tdrpa/_tdxlwings/_xlmac.py +2240 -0
  26. tdrpa/_tdxlwings/_xlwindows.py +2518 -0
  27. tdrpa/_tdxlwings/addin/Dictionary.cls +474 -0
  28. tdrpa/_tdxlwings/addin/IWebAuthenticator.cls +71 -0
  29. tdrpa/_tdxlwings/addin/WebClient.cls +772 -0
  30. tdrpa/_tdxlwings/addin/WebHelpers.bas +3203 -0
  31. tdrpa/_tdxlwings/addin/WebRequest.cls +875 -0
  32. tdrpa/_tdxlwings/addin/WebResponse.cls +453 -0
  33. tdrpa/_tdxlwings/addin/xlwings.xlam +0 -0
  34. tdrpa/_tdxlwings/apps.py +35 -0
  35. tdrpa/_tdxlwings/base_classes.py +1092 -0
  36. tdrpa/_tdxlwings/cli.py +1306 -0
  37. tdrpa/_tdxlwings/com_server.py +385 -0
  38. tdrpa/_tdxlwings/constants.py +3080 -0
  39. tdrpa/_tdxlwings/conversion/__init__.py +103 -0
  40. tdrpa/_tdxlwings/conversion/framework.py +147 -0
  41. tdrpa/_tdxlwings/conversion/numpy_conv.py +34 -0
  42. tdrpa/_tdxlwings/conversion/pandas_conv.py +184 -0
  43. tdrpa/_tdxlwings/conversion/standard.py +321 -0
  44. tdrpa/_tdxlwings/expansion.py +83 -0
  45. tdrpa/_tdxlwings/ext/__init__.py +3 -0
  46. tdrpa/_tdxlwings/ext/sql.py +73 -0
  47. tdrpa/_tdxlwings/html/xlwings-alert.html +71 -0
  48. tdrpa/_tdxlwings/js/xlwings.js +577 -0
  49. tdrpa/_tdxlwings/js/xlwings.ts +729 -0
  50. tdrpa/_tdxlwings/mac_dict.py +6399 -0
  51. tdrpa/_tdxlwings/main.py +5205 -0
  52. tdrpa/_tdxlwings/mistune/__init__.py +63 -0
  53. tdrpa/_tdxlwings/mistune/block_parser.py +366 -0
  54. tdrpa/_tdxlwings/mistune/inline_parser.py +216 -0
  55. tdrpa/_tdxlwings/mistune/markdown.py +84 -0
  56. tdrpa/_tdxlwings/mistune/renderers.py +220 -0
  57. tdrpa/_tdxlwings/mistune/scanner.py +121 -0
  58. tdrpa/_tdxlwings/mistune/util.py +41 -0
  59. tdrpa/_tdxlwings/pro/__init__.py +40 -0
  60. tdrpa/_tdxlwings/pro/_xlcalamine.py +536 -0
  61. tdrpa/_tdxlwings/pro/_xlofficejs.py +146 -0
  62. tdrpa/_tdxlwings/pro/_xlremote.py +1293 -0
  63. tdrpa/_tdxlwings/pro/custom_functions_code.js +150 -0
  64. tdrpa/_tdxlwings/pro/embedded_code.py +60 -0
  65. tdrpa/_tdxlwings/pro/udfs_officejs.py +549 -0
  66. tdrpa/_tdxlwings/pro/utils.py +199 -0
  67. tdrpa/_tdxlwings/quickstart.xlsm +0 -0
  68. tdrpa/_tdxlwings/quickstart_addin.xlam +0 -0
  69. tdrpa/_tdxlwings/quickstart_addin_ribbon.xlam +0 -0
  70. tdrpa/_tdxlwings/quickstart_fastapi/main.py +47 -0
  71. tdrpa/_tdxlwings/quickstart_fastapi/requirements.txt +3 -0
  72. tdrpa/_tdxlwings/quickstart_standalone.xlsm +0 -0
  73. tdrpa/_tdxlwings/reports.py +12 -0
  74. tdrpa/_tdxlwings/rest/__init__.py +1 -0
  75. tdrpa/_tdxlwings/rest/api.py +368 -0
  76. tdrpa/_tdxlwings/rest/serializers.py +103 -0
  77. tdrpa/_tdxlwings/server.py +14 -0
  78. tdrpa/_tdxlwings/udfs.py +775 -0
  79. tdrpa/_tdxlwings/utils.py +777 -0
  80. tdrpa/_tdxlwings/xlwings-0.31.6.applescript +30 -0
  81. tdrpa/_tdxlwings/xlwings.bas +2061 -0
  82. tdrpa/_tdxlwings/xlwings_custom_addin.bas +2042 -0
  83. tdrpa/_tdxlwings/xlwingslib.cp38-win_amd64.pyd +0 -0
  84. tdrpa/tdworker/__init__.pyi +12 -0
  85. tdrpa/tdworker/_clip.pyi +50 -0
  86. tdrpa/tdworker/_excel.pyi +743 -0
  87. tdrpa/tdworker/_file.pyi +77 -0
  88. tdrpa/tdworker/_img.pyi +226 -0
  89. tdrpa/tdworker/_network.pyi +94 -0
  90. tdrpa/tdworker/_os.pyi +47 -0
  91. tdrpa/tdworker/_sp.pyi +21 -0
  92. tdrpa/tdworker/_w.pyi +129 -0
  93. tdrpa/tdworker/_web.pyi +995 -0
  94. tdrpa/tdworker/_winE.pyi +228 -0
  95. tdrpa/tdworker/_winK.pyi +74 -0
  96. tdrpa/tdworker/_winM.pyi +117 -0
  97. tdrpa/tdworker.cp312-win_amd64.pyd +0 -0
  98. tdrpa_tdworker-1.2.13.2.dist-info/METADATA +38 -0
  99. tdrpa_tdworker-1.2.13.2.dist-info/RECORD +101 -0
  100. tdrpa_tdworker-1.2.13.2.dist-info/WHEEL +5 -0
  101. tdrpa_tdworker-1.2.13.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,84 @@
1
+ from .block_parser import BlockParser, expand_leading_tab, cleanup_lines
2
+ from .inline_parser import InlineParser
3
+
4
+
5
+ class Markdown(object):
6
+ def __init__(self, renderer, block=None, inline=None, plugins=None):
7
+ if block is None:
8
+ block = BlockParser()
9
+
10
+ if inline is None:
11
+ inline = InlineParser(renderer)
12
+
13
+ self.block = block
14
+ self.inline = inline
15
+ self.renderer = inline.renderer
16
+ self.before_parse_hooks = []
17
+ self.before_render_hooks = []
18
+ self.after_render_hooks = []
19
+
20
+ if plugins:
21
+ for plugin in plugins:
22
+ plugin(self)
23
+
24
+ def use(self, plugin):
25
+ plugin(self)
26
+
27
+ def before_parse(self, s, state):
28
+ s, state = preprocess(s, state)
29
+ for hook in self.before_parse_hooks:
30
+ s, state = hook(self, s, state)
31
+ return s, state
32
+
33
+ def before_render(self, tokens, state):
34
+ for hook in self.before_render_hooks:
35
+ tokens = hook(self, tokens, state)
36
+ return tokens
37
+
38
+ def after_render(self, result, state):
39
+ for hook in self.after_render_hooks:
40
+ result = hook(self, result, state)
41
+ return result
42
+
43
+ def parse(self, s, state=None):
44
+ if state is None:
45
+ state = {}
46
+
47
+ s, state = self.before_parse(s, state)
48
+ tokens = self.block.parse(s, state)
49
+ tokens = self.before_render(tokens, state)
50
+ result = self.block.render(tokens, self.inline, state)
51
+ result = self.after_render(result, state)
52
+ return result
53
+
54
+ def read(self, filepath, state=None):
55
+ if state is None:
56
+ state = {}
57
+
58
+ state['__file__'] = filepath
59
+ with open(filepath, 'rb') as f:
60
+ s = f.read()
61
+
62
+ return self.parse(s.decode('utf-8'), state)
63
+
64
+ def __call__(self, s):
65
+ return self.parse(s)
66
+
67
+
68
+ def preprocess(s, state):
69
+ state.update({
70
+ 'def_links': {},
71
+ 'def_footnotes': {},
72
+ 'footnotes': [],
73
+ })
74
+
75
+ if s is None:
76
+ s = '\n'
77
+ else:
78
+ s = s.replace('\u2424', '\n')
79
+ s = cleanup_lines(s)
80
+ s = expand_leading_tab(s)
81
+ if not s.endswith('\n'):
82
+ s += '\n'
83
+
84
+ return s, state
@@ -0,0 +1,220 @@
1
+ from .util import escape, escape_html
2
+
3
+
4
+ class BaseRenderer(object):
5
+ NAME = 'base'
6
+
7
+ def __init__(self):
8
+ self._methods = {}
9
+
10
+ def register(self, name, method):
11
+ self._methods[name] = method
12
+
13
+ def _get_method(self, name):
14
+ try:
15
+ return object.__getattribute__(self, name)
16
+ except AttributeError:
17
+ method = self._methods.get(name)
18
+ if not method:
19
+ raise AttributeError('No renderer "{!r}"'.format(name))
20
+ return method
21
+
22
+ def finalize(self, data):
23
+ raise NotImplementedError(
24
+ 'The renderer needs to implement the finalize method.')
25
+
26
+
27
+ class AstRenderer(BaseRenderer):
28
+ NAME = 'ast'
29
+
30
+ def text(self, text):
31
+ return {'type': 'text', 'text': text}
32
+
33
+ def link(self, link, children=None, title=None):
34
+ if isinstance(children, str):
35
+ children = [{'type': 'text', 'text': children}]
36
+ return {
37
+ 'type': 'link',
38
+ 'link': link,
39
+ 'children': children,
40
+ 'title': title,
41
+ }
42
+
43
+ def image(self, src, alt="", title=None):
44
+ return {'type': 'image', 'src': src, 'alt': alt, 'title': title}
45
+
46
+ def codespan(self, text):
47
+ return {'type': 'codespan', 'text': text}
48
+
49
+ def linebreak(self):
50
+ return {'type': 'linebreak'}
51
+
52
+ def inline_html(self, html):
53
+ return {'type': 'inline_html', 'text': html}
54
+
55
+ def heading(self, children, level):
56
+ return {'type': 'heading', 'children': children, 'level': level}
57
+
58
+ def newline(self):
59
+ return {'type': 'newline'}
60
+
61
+ def thematic_break(self):
62
+ return {'type': 'thematic_break'}
63
+
64
+ def block_code(self, children, info=None):
65
+ return {
66
+ 'type': 'block_code',
67
+ 'text': children,
68
+ 'info': info
69
+ }
70
+
71
+ def block_html(self, children):
72
+ return {'type': 'block_html', 'text': children}
73
+
74
+ def list(self, children, ordered, level, start=None):
75
+ token = {
76
+ 'type': 'list',
77
+ 'children': children,
78
+ 'ordered': ordered,
79
+ 'level': level,
80
+ }
81
+ if start is not None:
82
+ token['start'] = start
83
+ return token
84
+
85
+ def list_item(self, children, level):
86
+ return {'type': 'list_item', 'children': children, 'level': level}
87
+
88
+ def _create_default_method(self, name):
89
+ def __ast(children):
90
+ return {'type': name, 'children': children}
91
+ return __ast
92
+
93
+ def _get_method(self, name):
94
+ try:
95
+ return super(AstRenderer, self)._get_method(name)
96
+ except AttributeError:
97
+ return self._create_default_method(name)
98
+
99
+ def finalize(self, data):
100
+ return list(data)
101
+
102
+
103
+ class HTMLRenderer(BaseRenderer):
104
+ NAME = 'html'
105
+ HARMFUL_PROTOCOLS = {
106
+ 'javascript:',
107
+ 'vbscript:',
108
+ 'data:',
109
+ }
110
+
111
+ def __init__(self, escape=True, allow_harmful_protocols=None):
112
+ super(HTMLRenderer, self).__init__()
113
+ self._escape = escape
114
+ self._allow_harmful_protocols = allow_harmful_protocols
115
+
116
+ def _safe_url(self, url):
117
+ if self._allow_harmful_protocols is None:
118
+ schemes = self.HARMFUL_PROTOCOLS
119
+ elif self._allow_harmful_protocols is True:
120
+ schemes = None
121
+ else:
122
+ allowed = set(self._allow_harmful_protocols)
123
+ schemes = self.HARMFUL_PROTOCOLS - allowed
124
+
125
+ if schemes:
126
+ for s in schemes:
127
+ if url.lower().startswith(s):
128
+ url = '#harmful-link'
129
+ break
130
+ return url
131
+
132
+ def text(self, text):
133
+ if self._escape:
134
+ return escape(text)
135
+ return escape_html(text)
136
+
137
+ def link(self, link, text=None, title=None):
138
+ if text is None:
139
+ text = link
140
+
141
+ s = '<a href="' + self._safe_url(link) + '"'
142
+ if title:
143
+ s += ' title="' + escape_html(title) + '"'
144
+ return s + '>' + (text or link) + '</a>'
145
+
146
+ def image(self, src, alt="", title=None):
147
+ src = self._safe_url(src)
148
+ alt = escape_html(alt)
149
+ s = '<img src="' + src + '" alt="' + alt + '"'
150
+ if title:
151
+ s += ' title="' + escape_html(title) + '"'
152
+ return s + ' />'
153
+
154
+ def emphasis(self, text):
155
+ return '<em>' + text + '</em>'
156
+
157
+ def strong(self, text):
158
+ return '<strong>' + text + '</strong>'
159
+
160
+ def codespan(self, text):
161
+ return '<code>' + escape(text) + '</code>'
162
+
163
+ def linebreak(self):
164
+ return '<br />\n'
165
+
166
+ def inline_html(self, html):
167
+ if self._escape:
168
+ return escape(html)
169
+ return html
170
+
171
+ def paragraph(self, text):
172
+ return '<p>' + text + '</p>\n'
173
+
174
+ def heading(self, text, level):
175
+ tag = 'h' + str(level)
176
+ return '<' + tag + '>' + text + '</' + tag + '>\n'
177
+
178
+ def newline(self):
179
+ return ''
180
+
181
+ def thematic_break(self):
182
+ return '<hr />\n'
183
+
184
+ def block_text(self, text):
185
+ return text
186
+
187
+ def block_code(self, code, info=None):
188
+ html = '<pre><code'
189
+ if info is not None:
190
+ info = info.strip()
191
+ if info:
192
+ lang = info.split(None, 1)[0]
193
+ lang = escape_html(lang)
194
+ html += ' class="language-' + lang + '"'
195
+ return html + '>' + escape(code) + '</code></pre>\n'
196
+
197
+ def block_quote(self, text):
198
+ return '<blockquote>\n' + text + '</blockquote>\n'
199
+
200
+ def block_html(self, html):
201
+ if not self._escape:
202
+ return html + '\n'
203
+ return '<p>' + escape(html) + '</p>\n'
204
+
205
+ def block_error(self, html):
206
+ return '<div class="error">' + html + '</div>\n'
207
+
208
+ def list(self, text, ordered, level, start=None):
209
+ if ordered:
210
+ html = '<ol'
211
+ if start is not None:
212
+ html += ' start="' + str(start) + '"'
213
+ return html + '>\n' + text + '</ol>\n'
214
+ return '<ul>\n' + text + '</ul>\n'
215
+
216
+ def list_item(self, text, level):
217
+ return '<li>' + text + '</li>\n'
218
+
219
+ def finalize(self, data):
220
+ return ''.join(data)
@@ -0,0 +1,121 @@
1
+ import re
2
+
3
+ class Scanner(re.Scanner):
4
+ def iter(self, string, state, parse_text):
5
+ sc = self.scanner.scanner(string)
6
+
7
+ pos = 0
8
+ for match in iter(sc.search, None):
9
+ name, method = self.lexicon[match.lastindex - 1][1]
10
+ hole = string[pos:match.start()]
11
+ if hole:
12
+ yield parse_text(hole, state)
13
+
14
+ yield method(match, state)
15
+ pos = match.end()
16
+
17
+ hole = string[pos:]
18
+ if hole:
19
+ yield parse_text(hole, state)
20
+
21
+
22
+ class ScannerParser(object):
23
+ scanner_cls = Scanner
24
+ RULE_NAMES = tuple()
25
+
26
+ def __init__(self):
27
+ self.rules = list(self.RULE_NAMES)
28
+ self.rule_methods = {}
29
+ self._cached_sc = {}
30
+
31
+ def register_rule(self, name, pattern, method):
32
+ self.rule_methods[name] = (pattern, lambda m, state: method(self, m, state))
33
+
34
+ def get_rule_pattern(self, name):
35
+ if name not in self.RULE_NAMES:
36
+ return self.rule_methods[name][0]
37
+ return getattr(self, name.upper())
38
+
39
+ def get_rule_method(self, name):
40
+ if name not in self.RULE_NAMES:
41
+ return self.rule_methods[name][1]
42
+ return getattr(self, 'parse_' + name)
43
+
44
+ def parse_text(self, text, state):
45
+ raise NotImplementedError
46
+
47
+ def _scan(self, s, state, rules):
48
+ sc = self._create_scanner(rules)
49
+ for tok in sc.iter(s, state, self.parse_text):
50
+ if isinstance(tok, list):
51
+ for t in tok:
52
+ yield t
53
+ elif tok:
54
+ yield tok
55
+
56
+ def _create_scanner(self, rules):
57
+ sc_key = '|'.join(rules)
58
+ sc = self._cached_sc.get(sc_key)
59
+ if sc:
60
+ return sc
61
+
62
+ lexicon = [
63
+ (self.get_rule_pattern(n), (n, self.get_rule_method(n)))
64
+ for n in rules
65
+ ]
66
+ sc = self.scanner_cls(lexicon)
67
+ self._cached_sc[sc_key] = sc
68
+ return sc
69
+
70
+
71
+ class Matcher(object):
72
+ PARAGRAPH_END = re.compile(
73
+ r'(?:\n{2,})|'
74
+ r'(?:\n {0,3}#{1,6})|' # axt heading
75
+ r'(?:\n {0,3}(?:`{3,}|~{3,}))|' # fenced code
76
+ r'(?:\n {0,3}>)|' # blockquote
77
+ r'(?:\n {0,3}(?:[\*\+-]|1[.)]))|' # list
78
+ r'(?:\n {0,3}<)' # block html
79
+ )
80
+
81
+ def __init__(self, lexicon):
82
+ self.lexicon = lexicon
83
+
84
+ def search_pos(self, string, pos):
85
+ m = self.PARAGRAPH_END.search(string, pos)
86
+ if not m:
87
+ return None
88
+ if set(m.group(0)) == {'\n'}:
89
+ return m.end()
90
+ return m.start() + 1
91
+
92
+ def iter(self, string, state, parse_text):
93
+ pos = 0
94
+ endpos = len(string)
95
+ last_end = 0
96
+ while 1:
97
+ if pos >= endpos:
98
+ break
99
+ for rule, (name, method) in self.lexicon:
100
+ match = rule.match(string, pos)
101
+ if match is not None:
102
+ start, end = match.span()
103
+ if start > last_end:
104
+ yield parse_text(string[last_end:start], state)
105
+
106
+ if name.endswith('_start'):
107
+ token = method(match, state, string)
108
+ yield token[0]
109
+ end = token[1]
110
+ else:
111
+ yield method(match, state)
112
+ last_end = pos = end
113
+ break
114
+ else:
115
+ found = self.search_pos(string, pos)
116
+ if found is None:
117
+ break
118
+ pos = found
119
+
120
+ if last_end < endpos:
121
+ yield parse_text(string[last_end:], state)
@@ -0,0 +1,41 @@
1
+ try:
2
+ from urllib.parse import quote
3
+ import html
4
+ except ImportError:
5
+ from urllib import quote
6
+ html = None
7
+
8
+
9
+ PUNCTUATION = r'''\\!"#$%&'()*+,./:;<=>?@\[\]^`{}|_~-'''
10
+ ESCAPE_TEXT = r'\\[' + PUNCTUATION + ']'
11
+
12
+
13
+ def escape(s, quote=True):
14
+ s = s.replace("&", "&amp;")
15
+ s = s.replace("<", "&lt;")
16
+ s = s.replace(">", "&gt;")
17
+ if quote:
18
+ s = s.replace('"', "&quot;")
19
+ return s
20
+
21
+
22
+ def escape_url(link):
23
+ safe = (
24
+ ':/?#@' # gen-delims - '[]' (rfc3986)
25
+ '!$&()*+,;=' # sub-delims - "'" (rfc3986)
26
+ '%' # leave already-encoded octets alone
27
+ )
28
+
29
+ if html is None:
30
+ return quote(link.encode('utf-8'), safe=safe)
31
+ return html.escape(quote(html.unescape(link), safe=safe))
32
+
33
+
34
+ def escape_html(s):
35
+ if html is not None:
36
+ return html.escape(html.unescape(s)).replace('&#x27;', "'")
37
+ return escape(s)
38
+
39
+
40
+ def unikey(s):
41
+ return ' '.join(s.split()).lower()
@@ -0,0 +1,40 @@
1
+ """
2
+ Required Notice: Copyright (C) Zoomer Analytics GmbH.
3
+
4
+ xlwings PRO is dual-licensed under one of the following licenses:
5
+
6
+ * PolyForm Noncommercial License 1.0.0 (for noncommercial use):
7
+ https://polyformproject.org/licenses/noncommercial/1.0.0
8
+ * xlwings PRO License (for commercial use):
9
+ https://github.com/xlwings/xlwings/blob/main/LICENSE_PRO.txt
10
+
11
+ Commercial licenses can be purchased at https://www.xlwings.org
12
+ """
13
+
14
+ from .embedded_code import dump_embedded_code, runpython_embedded_code
15
+ from .reports import Markdown, MarkdownStyle
16
+ from .udfs_officejs import (
17
+ custom_functions_call,
18
+ custom_functions_code,
19
+ custom_functions_meta,
20
+ xlarg as arg,
21
+ xlfunc as func,
22
+ xlret as ret,
23
+ )
24
+ from .utils import LicenseHandler
25
+
26
+ __all__ = (
27
+ "dump_embedded_code",
28
+ "runpython_embedded_code",
29
+ "verify_execute_permission",
30
+ "Markdown",
31
+ "MarkdownStyle",
32
+ "arg",
33
+ "func",
34
+ "ret",
35
+ "custom_functions_code",
36
+ "custom_functions_meta",
37
+ "custom_functions_call",
38
+ )
39
+
40
+ LicenseHandler.validate_license("pro")