daytona 0.164.0.alpha.1 → 0.164.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 064c93ac0f9ef2c0bebd53497d5f86584f8a75b684cad9029575d1a7efa37f48
4
- data.tar.gz: c61d029c96aca2d15f62d3dec3de189d3741902bc5f818d1e07aa535f591bbe6
3
+ metadata.gz: ce668bd56c2b7767f624eb0bbb347ed6144cc40782d8d27a857783a82448ae60
4
+ data.tar.gz: 6587e4186ff8ee24dbf55acb5be580d71c507b8bb1d76acf9badc891778e8630
5
5
  SHA512:
6
- metadata.gz: e26f87d3f2a68b701a07ea391adcf0c3a3316f0ac19d06ee8d4381629f223b640410950b5a8454592cf2a2634b3204bdcb5b39852414fab46ef5e0a0701bdf1b
7
- data.tar.gz: dbb7d8482d32949673de9fb43a68544d0219c46de4905a21f187e37eb482a5dc44312cec6ccc94f6075e28ed946ed947d608a7774029a3ed41fb715a48b63e4d
6
+ metadata.gz: 8f561638b39e7cf53f5d3488ba592a3ccbd93a395ba85e5622ee7c9b7ba909dd34235ccad5947ed5565d2c116c0c7d8fe78e51f7547936839705a2b9824a2474
7
+ data.tar.gz: dbf8ffab3facea88678ad36b8a8af77d8bd73087ed3c1fcf8cbe5aef11a3bd85924467227f7b0c58b90ac3540da82086dbb0cb3345be55b7677797b939cf2f85
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'base64'
4
+
5
+ module Daytona
6
+ class SandboxJsCodeToolbox
7
+ def get_run_command(code, params = nil)
8
+ # Prepend argv fix: node - places '-' at argv[1]; splice it out to match legacy node -e behaviour
9
+ # Encode the provided code in base64
10
+ base64_code = Base64.strict_encode64("process.argv.splice(1, 1);\n" + code)
11
+
12
+ # Build command-line arguments string
13
+ argv = ''
14
+ argv = params.argv.join(' ') if params&.argv && !params.argv.empty?
15
+
16
+ # Pipe the base64-encoded code via stdin to avoid OS ARG_MAX limits on large payloads
17
+ # Use node - to read from stdin (node /dev/stdin does not work when stdin is a pipe)
18
+ "printf '%s' '#{base64_code}' | base64 -d | node - #{argv}"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,438 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'base64'
4
+
5
+ module Daytona
6
+ class SandboxPythonCodeToolbox # rubocop:disable Metrics/ClassLength
7
+ # Get the run command for executing Python code
8
+ #
9
+ # @param code [String] The Python code to execute
10
+ # @param params [Daytona::CodeRunParams, nil] Optional parameters for code execution
11
+ # @return [String] The command to run the Python code
12
+ def get_run_command(code, params = nil)
13
+ encoded_code = Base64.strict_encode64(code)
14
+
15
+ # Override plt.show() method if matplotlib is imported
16
+ if matplotlib_imported?(code)
17
+ encoded_code = Base64.strict_encode64(
18
+ Base64.decode64(PYTHON_CODE_WRAPPER).gsub('{encoded_code}', encoded_code)
19
+ )
20
+ end
21
+
22
+ argv = params&.argv&.join(' ') || ''
23
+
24
+ # Pipe the base64-encoded code via stdin to avoid OS ARG_MAX limits on large payloads
25
+ # printf is a shell builtin that does not invoke execve(), so the base64 string bypasses the kernel ARG_MAX limit
26
+ # Use -u flag to ensure unbuffered output for real-time error reporting
27
+ "printf '%s' '#{encoded_code}' | base64 -d | python3 -u - #{argv}"
28
+ end
29
+
30
+ private
31
+
32
+ # Check if matplotlib is imported in the code
33
+ #
34
+ # @param code [String] The Python code to check
35
+ # @return [Boolean] True if matplotlib is imported, false otherwise
36
+ def matplotlib_imported?(code) = PATTERNS.any? { |pattern| code.match?(pattern) }
37
+
38
+ PATTERNS = [
39
+ # Standard imports
40
+ /^[^#]*import\s+matplotlib/m,
41
+ /^[^#]*from\s+matplotlib/m,
42
+ # Dynamic imports
43
+ /^[^#]*__import__\s*\(\s*['"]matplotlib['"]/m,
44
+ /^[^#]*importlib\.import_module\s*\(\s*['"]matplotlib['"]/m,
45
+ # Other dynamic loading patterns
46
+ /^[^#]*loader\.load_module\s*\(\s*['"]matplotlib['"]/m,
47
+ /^[^#]*sys\.modules\[['"]matplotlib['"]\]/m
48
+ ].freeze
49
+ private_constant :PATTERNS
50
+
51
+ PYTHON_CODE_WRAPPER = <<~BASE64.strip
52
+ aW1wb3J0IGJhc2U2NAppbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IGhhc2hsaWIK
53
+ aW1wb3J0IGlvCmltcG9ydCBqc29uCmltcG9ydCBsaW5lY2FjaGUKaW1wb3J0
54
+ IHN5cwppbXBvcnQgdHJhY2ViYWNrCmltcG9ydCB0eXBlcwpmcm9tIGltcG9y
55
+ dGxpYi5hYmMgaW1wb3J0IExvYWRlciwgTWV0YVBhdGhGaW5kZXIKZnJvbSBp
56
+ bXBvcnRsaWIudXRpbCBpbXBvcnQgZmluZF9zcGVjLCBzcGVjX2Zyb21fbG9h
57
+ ZGVyCgojIEdsb2JhbCB2YXJpYWJsZXMgdG8gaG9sZCBpbXBvcnRlZCBsaWJy
58
+ YXJpZXMgaWYgbmVlZGVkCm5wID0gTm9uZQptcGwgPSBOb25lCnBpbF9pbWcg
59
+ PSBOb25lCgoKcGx0X3BhdGNoZWQgPSBGYWxzZQpwcm9jZXNzZWRfZmlndXJl
60
+ cyA9IHNldCgpCgoKZGVmIF9wYXJzZV9wb2ludChwb2ludCk6CiAgICBpZiBp
61
+ c2luc3RhbmNlKHBvaW50LCBkYXRldGltZS5kYXRlKToKICAgICAgICByZXR1
62
+ cm4gcG9pbnQuaXNvZm9ybWF0KCkKICAgIGlmIGlzaW5zdGFuY2UocG9pbnQs
63
+ IG5wLmRhdGV0aW1lNjQpOgogICAgICAgIHJldHVybiBwb2ludC5hc3R5cGUo
64
+ ImRhdGV0aW1lNjRbc10iKS5hc3R5cGUoc3RyKQogICAgcmV0dXJuIHBvaW50
65
+ CgoKZGVmIF9pc19ncmlkX2xpbmUobGluZTogYW55KSAtPiBib29sOgogICAg
66
+ eF9kYXRhID0gbGluZS5nZXRfeGRhdGEoKQogICAgaWYgbGVuKHhfZGF0YSkg
67
+ IT0gMjoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICB5X2RhdGEgPSBsaW5l
68
+ LmdldF95ZGF0YSgpCiAgICBpZiBsZW4oeV9kYXRhKSAhPSAyOgogICAgICAg
69
+ IHJldHVybiBGYWxzZQoKICAgIGlmIHhfZGF0YVswXSA9PSB4X2RhdGFbMV0g
70
+ b3IgeV9kYXRhWzBdID09IHlfZGF0YVsxXToKICAgICAgICByZXR1cm4gVHJ1
71
+ ZQoKICAgIHJldHVybiBGYWxzZQoKCmRlZiBfZXh0cmFjdF9saW5lX2NoYXJ0
72
+ X2VsZW1lbnRzKGF4KToKICAgIGVsZW1lbnRzID0gW10KCiAgICBmb3IgbGlu
73
+ ZSBpbiBheC5nZXRfbGluZXMoKToKICAgICAgICBpZiBfaXNfZ3JpZF9saW5l
74
+ KGxpbmUpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGxhYmVsID0g
75
+ bGluZS5nZXRfbGFiZWwoKQogICAgICAgIHBvaW50cyA9IFtfcGFyc2VfcG9p
76
+ bnQoKHgsIHkpKSBmb3IgeCwgeSBpbiB6aXAobGluZS5nZXRfeGRhdGEoKSwg
77
+ bGluZS5nZXRfeWRhdGEoKSldCgogICAgICAgIGVsZW1lbnQgPSB7ImxhYmVs
78
+ IjogbGFiZWwsICJwb2ludHMiOiBwb2ludHN9CiAgICAgICAgZWxlbWVudHMu
79
+ YXBwZW5kKGVsZW1lbnQpCgogICAgcmV0dXJuIGVsZW1lbnRzCgoKZGVmIF9l
80
+ eHRyYWN0X3NjYXR0ZXJfY2hhcnRfZWxlbWVudHMoYXgpOgogICAgZWxlbWVu
81
+ dHMgPSBbXQoKICAgIGZvciBjb2xsZWN0aW9uIGluIGF4LmNvbGxlY3Rpb25z
82
+ OgogICAgICAgIHBvaW50cyA9IFtfcGFyc2VfcG9pbnQoKHgsIHkpKSBmb3Ig
83
+ eCwgeSBpbiBjb2xsZWN0aW9uLmdldF9vZmZzZXRzKCldCiAgICAgICAgZWxl
84
+ bWVudCA9IHsibGFiZWwiOiBjb2xsZWN0aW9uLmdldF9sYWJlbCgpLCAicG9p
85
+ bnRzIjogcG9pbnRzfQogICAgICAgIGVsZW1lbnRzLmFwcGVuZChlbGVtZW50
86
+ KQoKICAgIHJldHVybiBlbGVtZW50cwoKCmRlZiBfZXh0cmFjdF9iYXJfY2hh
87
+ cnRfZWxlbWVudHMoYXgpOgogICAgZWxlbWVudHMgPSBbXQogICAgY2hhbmdl
88
+ X29yaWVudGF0aW9uID0gRmFsc2UKCiAgICBmb3IgY29udGFpbmVyIGluIGF4
89
+ LmNvbnRhaW5lcnM6CiAgICAgICAgaGVpZ2h0cyA9IFtyZWN0LmdldF9oZWln
90
+ aHQoKSBmb3IgcmVjdCBpbiBjb250YWluZXJdCiAgICAgICAgaWYgYWxsKGhl
91
+ aWdodCA9PSBoZWlnaHRzWzBdIGZvciBoZWlnaHQgaW4gaGVpZ2h0cyk6CiAg
92
+ ICAgICAgICAgICMgdmVydGljYWwgYmFycwogICAgICAgICAgICBjaGFuZ2Vf
93
+ b3JpZW50YXRpb24gPSBUcnVlCiAgICAgICAgICAgIGxhYmVscyA9IFtsYWJl
94
+ bC5nZXRfdGV4dCgpIGZvciBsYWJlbCBpbiBheC5nZXRfeXRpY2tsYWJlbHMo
95
+ KV0KICAgICAgICAgICAgdmFsdWVzID0gW3JlY3QuZ2V0X3dpZHRoKCkgZm9y
96
+ IHJlY3QgaW4gY29udGFpbmVyXQogICAgICAgIGVsc2U6CiAgICAgICAgICAg
97
+ ICMgaG9yaXpvbnRhbCBiYXJzCiAgICAgICAgICAgIGxhYmVscyA9IFtsYWJl
98
+ bC5nZXRfdGV4dCgpIGZvciBsYWJlbCBpbiBheC5nZXRfeHRpY2tsYWJlbHMo
99
+ KV0KICAgICAgICAgICAgdmFsdWVzID0gaGVpZ2h0cwogICAgICAgIGZvciBs
100
+ YWJlbCwgdmFsdWUgaW4gemlwKGxhYmVscywgdmFsdWVzKToKICAgICAgICAg
101
+ ICAgZWxlbWVudCA9IHsibGFiZWwiOiBsYWJlbCwgImdyb3VwIjogY29udGFp
102
+ bmVyLmdldF9sYWJlbCgpLCAidmFsdWUiOiB2YWx1ZX0KICAgICAgICAgICAg
103
+ ZWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCgogICAgcmV0dXJuIGVsZW1lbnRz
104
+ LCBjaGFuZ2Vfb3JpZW50YXRpb24KCgpkZWYgX2V4dHJhY3RfcGllX2NoYXJ0
105
+ X2VsZW1lbnRzKGF4KToKICAgIGVsZW1lbnRzID0gW10KCiAgICB3ZWRnZXMg
106
+ PSBbcGF0Y2ggZm9yIHBhdGNoIGluIGF4LnBhdGNoZXMgaWYgaXNpbnN0YW5j
107
+ ZShwYXRjaCwgbXBsLnBhdGNoZXMuV2VkZ2UpXQogICAgaWYgbGVuKHdlZGdl
108
+ cykgPT0gMDoKICAgICAgICByZXR1cm4gZWxlbWVudHMKCiAgICB0ZXh0cyA9
109
+ IFt0ZXh0X29iai5nZXRfdGV4dCgpIGZvciB0ZXh0X29iaiBpbiBheC50ZXh0
110
+ c10KCiAgICBsYWJlbHMgPSBbXQogICAgYXV0b3BjdHMgPSBbXQoKICAgIGlm
111
+ IGxlbih0ZXh0cykgPT0gMiAqIGxlbih3ZWRnZXMpOgogICAgICAgIGxhYmVs
112
+ cyA9IFt0ZXh0c1tpXSBmb3IgaSBpbiByYW5nZSgwLCAyICogbGVuKHdlZGdl
113
+ cyksIDIpXQogICAgICAgIGF1dG9wY3RzID0gW3RleHRzW2ldIGZvciBpIGlu
114
+ IHJhbmdlKDEsIDIgKiBsZW4od2VkZ2VzKSwgMildCiAgICBlbHNlOgogICAg
115
+ ICAgIGxhYmVscyA9IHRleHRzWzogbGVuKHdlZGdlcyldCgogICAgZm9yIGlk
116
+ eCwgd2VkZ2UgaW4gZW51bWVyYXRlKHdlZGdlcyk6CiAgICAgICAgZWxlbWVu
117
+ dCA9IHsKICAgICAgICAgICAgImxhYmVsIjogbGFiZWxzW2lkeF0sCiAgICAg
118
+ ICAgICAgICJhbmdsZSI6IGFicyh3ZWRnZS50aGV0YTIgLSB3ZWRnZS50aGV0
119
+ YTEpLAogICAgICAgICAgICAicmFkaXVzIjogd2VkZ2UuciwKICAgICAgICAg
120
+ ICAgImF1dG9wY3QiOiBhdXRvcGN0c1tpZHhdIGlmIGF1dG9wY3RzIGFuZCBs
121
+ ZW4oYXV0b3BjdHMpID4gaWR4IGVsc2UgTm9uZSwKICAgICAgICB9CiAgICAg
122
+ ICAgZWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCgogICAgcmV0dXJuIGVsZW1l
123
+ bnRzCgoKIyBweWxpbnQ6IGRpc2FibGU9dG9vLW1hbnktYnJhbmNoZXMKZGVm
124
+ IF9leHRyYWN0X2JveF9jaGFydF9lbGVtZW50cyhheCk6CiAgICBjaGFuZ2Vf
125
+ b3JpZW50YXRpb24gPSBGYWxzZQoKICAgIHh0aWNrbGFiZWxzID0gW2xhYmVs
126
+ LmdldF90ZXh0KCkgZm9yIGxhYmVsIGluIGF4LmdldF94dGlja2xhYmVscygp
127
+ XQogICAgYm94ZXMgPSBbXQogICAgZm9yIGxhYmVsLCBib3ggaW4gemlwKHh0
128
+ aWNrbGFiZWxzLCBheC5wYXRjaGVzKToKICAgICAgICB2ZXJ0aWNlcyA9IGJv
129
+ eC5nZXRfcGF0aCgpLnZlcnRpY2VzCiAgICAgICAgeF92ZXJ0aWNlcyA9IGxp
130
+ c3QodmVydGljZXNbOiwgMF0pCiAgICAgICAgeV92ZXJ0aWNlcyA9IGxpc3Qo
131
+ dmVydGljZXNbOiwgMV0pCiAgICAgICAgeCA9IG1pbih4X3ZlcnRpY2VzKQog
132
+ ICAgICAgIHkgPSBtaW4oeV92ZXJ0aWNlcykKCiAgICAgICAgYm94ZXMuYXBw
133
+ ZW5kKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAieCI6IHgsCiAg
134
+ ICAgICAgICAgICAgICAieSI6IHksCiAgICAgICAgICAgICAgICAibGFiZWwi
135
+ OiBsYWJlbCwKICAgICAgICAgICAgICAgICJ3aWR0aCI6IG1heCh4X3ZlcnRp
136
+ Y2VzKSAtIHgsCiAgICAgICAgICAgICAgICAiaGVpZ2h0IjogbWF4KHlfdmVy
137
+ dGljZXMpIC0geSwKICAgICAgICAgICAgICAgICJvdXRsaWVycyI6IFtdLAog
138
+ ICAgICAgICAgICB9CiAgICAgICAgKQoKICAgIG9yaWVudGF0aW9uID0gImhv
139
+ cml6b250YWwiCiAgICBpZiBhbGwoYm94WyJoZWlnaHQiXSA9PSBib3hlc1sw
140
+ XVsiaGVpZ2h0Il0gZm9yIGJveCBpbiBib3hlcyk6CiAgICAgICAgb3JpZW50
141
+ YXRpb24gPSAidmVydGljYWwiCgogICAgaWYgb3JpZW50YXRpb24gPT0gInZl
142
+ cnRpY2FsIjoKICAgICAgICBjaGFuZ2Vfb3JpZW50YXRpb24gPSBUcnVlCiAg
143
+ ICAgICAgZm9yIGJveCBpbiBib3hlczoKICAgICAgICAgICAgYm94WyJ4Il0s
144
+ IGJveFsieSJdID0gYm94WyJ5Il0sIGJveFsieCJdCiAgICAgICAgICAgIGJv
145
+ eFsid2lkdGgiXSwgYm94WyJoZWlnaHQiXSA9IGJveFsiaGVpZ2h0Il0sIGJv
146
+ eFsid2lkdGgiXQoKICAgIGZvciBsaW5lIGluIGF4LmxpbmVzOgogICAgICAg
147
+ IHhkYXRhID0gbGluZS5nZXRfeGRhdGEoKQogICAgICAgIHlkYXRhID0gbGlu
148
+ ZS5nZXRfeWRhdGEoKQoKICAgICAgICBpZiBvcmllbnRhdGlvbiA9PSAidmVy
149
+ dGljYWwiOgogICAgICAgICAgICB4ZGF0YSwgeWRhdGEgPSB5ZGF0YSwgeGRh
150
+ dGEKCiAgICAgICAgaWYgbGVuKHhkYXRhKSA8PSAxIG9yIGxlbih5ZGF0YSkg
151
+ IT0gMjoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgZm9yIGJveCBp
152
+ biBib3hlczoKICAgICAgICAgICAgaWYgYm94WyJ4Il0gPD0geGRhdGFbMF0g
153
+ PD0geGRhdGFbMV0gPD0gYm94WyJ4Il0gKyBib3hbIndpZHRoIl06CiAgICAg
154
+ ICAgICAgICAgICAjIEhvcml6b250YWwgbGluZSAobWVkaWFuIG9yIGNhcCkK
155
+ ICAgICAgICAgICAgICAgIGlmIGFicyh5ZGF0YVswXSAtIHlkYXRhWzFdKSA8
156
+ IDAuMDAxIGFuZCBib3hbInkiXSA8PSB5ZGF0YVswXSA8PSBib3hbInkiXSAr
157
+ IGJveFsiaGVpZ2h0Il06CiAgICAgICAgICAgICAgICAgICAgYm94WyJtZWRp
158
+ YW4iXSA9IHlkYXRhWzBdCiAgICAgICAgICAgICAgICAjIFZlcnRpY2FsIGxp
159
+ bmUgKHdoaXNrZXJzKQogICAgICAgICAgICAgICAgZWxpZiBhYnMoeGRhdGFb
160
+ MF0gLSB4ZGF0YVsxXSkgPCAwLjAwMToKICAgICAgICAgICAgICAgICAgICB5
161
+ X21pbiA9IG1pbih5ZGF0YSkKICAgICAgICAgICAgICAgICAgICB5X21heCA9
162
+ IG1heCh5ZGF0YSkKCiAgICAgICAgICAgICAgICAgICAgIyBJZiBhdHRhY2hl
163
+ ZCB0byBib3R0b20gb2YgYm94CiAgICAgICAgICAgICAgICAgICAgaWYgYWJz
164
+ KHlfbWF4IC0gYm94WyJ5Il0pIDwgMC4wMDE6CiAgICAgICAgICAgICAgICAg
165
+ ICAgICAgIGJveFsid2hpc2tlcl9sb3dlciJdID0geV9taW4KCiAgICAgICAg
166
+ ICAgICAgICAgICAgIyBJZiBhdHRhY2hlZCB0byB0b3Agb2YgYm94CiAgICAg
167
+ ICAgICAgICAgICAgICAgZWxpZiBhYnMoeV9taW4gLSAoYm94WyJ5Il0gKyBi
168
+ b3hbImhlaWdodCJdKSkgPCAwLjAwMToKICAgICAgICAgICAgICAgICAgICAg
169
+ ICAgYm94WyJ3aGlza2VyX3VwcGVyIl0gPSB5X21heAogICAgICAgICAgICAg
170
+ ICAgYnJlYWsKCiAgICBvdXRsaWVyX2NhbmRpZGF0ZXMgPSBbXQoKICAgICMg
171
+ Q2hlY2sgZm9yIGFueSBtYXJrZXJzIGluIGFsbCBhcnRpc3RzCiAgICBmb3Ig
172
+ YXJ0aXN0IGluIGF4LmdldF9jaGlsZHJlbigpOgogICAgICAgIGlmIGhhc2F0
173
+ dHIoYXJ0aXN0LCAiZ2V0X3hkYXRhIikgYW5kIGhhc2F0dHIoYXJ0aXN0LCAi
174
+ Z2V0X3lkYXRhIik6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAg
175
+ IHhkYXRhID0gYXJ0aXN0LmdldF94ZGF0YSgpCiAgICAgICAgICAgICAgICB5
176
+ ZGF0YSA9IGFydGlzdC5nZXRfeWRhdGEoKQoKICAgICAgICAgICAgICAgIGlm
177
+ IG9yaWVudGF0aW9uID09ICJ2ZXJ0aWNhbCI6CiAgICAgICAgICAgICAgICAg
178
+ ICAgeGRhdGEsIHlkYXRhID0geWRhdGEsIHhkYXRhCgogICAgICAgICAgICAg
179
+ ICAgaWYgaXNpbnN0YW5jZSh4ZGF0YSwgKGxpc3QsIG5wLm5kYXJyYXkpKSBh
180
+ bmQgaXNpbnN0YW5jZSh5ZGF0YSwgKGxpc3QsIG5wLm5kYXJyYXkpKToKICAg
181
+ ICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShtaW4obGVuKHhkYXRh
182
+ KSwgbGVuKHlkYXRhKSkpOgogICAgICAgICAgICAgICAgICAgICAgICBvdXRs
183
+ aWVyX2NhbmRpZGF0ZXMuYXBwZW5kKChmbG9hdCh4ZGF0YVtpXSksIGZsb2F0
184
+ KHlkYXRhW2ldKSkpCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAg
185
+ ICAgIHBhc3MKCiAgICAjIEFzc2lnbiBwb2ludHMgdG8gYm94ZXMgYW5kIGRl
186
+ dGVybWluZSBpZiB0aGV5J3JlIG91dGxpZXJzCiAgICBmb3IgeCwgeSBpbiBv
187
+ dXRsaWVyX2NhbmRpZGF0ZXM6CiAgICAgICAgZm9yIGJveCBpbiBib3hlczoK
188
+ ICAgICAgICAgICAgaWYgYm94WyJ4Il0gPD0geCA8PSBib3hbIngiXSArIGJv
189
+ eFsid2lkdGgiXToKICAgICAgICAgICAgICAgIGJveF9jZW50ZXIgPSBib3hb
190
+ IngiXSArIGJveFsid2lkdGgiXSAvIDIKICAgICAgICAgICAgICAgIGlmIGFi
191
+ cyh4IC0gYm94X2NlbnRlcikgPCAwLjAwMToKICAgICAgICAgICAgICAgICAg
192
+ ICB5X21pbiA9IGJveFsieSJdCiAgICAgICAgICAgICAgICAgICAgeV9tYXgg
193
+ PSBib3hbInkiXSArIGJveFsiaGVpZ2h0Il0KICAgICAgICAgICAgICAgICAg
194
+ ICBpZiBib3guZ2V0KCJ3aGlza2VyX2xvd2VyIiwgTm9uZSk6CiAgICAgICAg
195
+ ICAgICAgICAgICAgICAgIHlfbWluID0gYm94WyJ3aGlza2VyX2xvd2VyIl0K
196
+ ICAgICAgICAgICAgICAgICAgICBpZiBib3guZ2V0KCJ3aGlza2VyX3VwcGVy
197
+ IiwgTm9uZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHlfbWF4ID0gYm94
198
+ WyJ3aGlza2VyX3VwcGVyIl0KICAgICAgICAgICAgICAgICAgICBpZiB5IDwg
199
+ eV9taW4gb3IgeSA+IHlfbWF4OgogICAgICAgICAgICAgICAgICAgICAgICBi
200
+ b3hbIm91dGxpZXJzIl0uYXBwZW5kKHkpCiAgICAgICAgICAgICAgICBicmVh
201
+ awoKICAgIHJldHVybiBbCiAgICAgICAgewogICAgICAgICAgICAibGFiZWwi
202
+ OiBib3hbImxhYmVsIl0sCiAgICAgICAgICAgICJtaW4iOiBib3guZ2V0KCJ3
203
+ aGlza2VyX2xvd2VyIiwgTm9uZSksCiAgICAgICAgICAgICJmaXJzdF9xdWFy
204
+ dGlsZSI6IGJveFsieSJdLAogICAgICAgICAgICAibWVkaWFuIjogYm94Lmdl
205
+ dCgibWVkaWFuIiwgTm9uZSksCiAgICAgICAgICAgICJ0aGlyZF9xdWFydGls
206
+ ZSI6IGJveFsieSJdICsgYm94WyJoZWlnaHQiXSwKICAgICAgICAgICAgIm1h
207
+ eCI6IGJveC5nZXQoIndoaXNrZXJfdXBwZXIiLCBOb25lKSwKICAgICAgICAg
208
+ ICAgIm91dGxpZXJzIjogYm94WyJvdXRsaWVycyJdLAogICAgICAgIH0KICAg
209
+ ICAgICBmb3IgYm94IGluIGJveGVzCiAgICBdLCBjaGFuZ2Vfb3JpZW50YXRp
210
+ b24KCgpkZWYgX3NhdmVfZmlndXJlX2FzX2Jhc2U2NChmaWcsIGJib3hfaW5j
211
+ aGVzPSJ0aWdodCIsIGRwaT0xMDApOgogICAgIyBGaXJzdCBzYXZlIHdpdGgg
212
+ bWF0cGxvdGxpYgogICAgcG5nX2J1ZmZlciA9IGlvLkJ5dGVzSU8oKQogICAg
213
+ ZmlnLnNhdmVmaWcocG5nX2J1ZmZlciwgZm9ybWF0PSJwbmciLCBiYm94X2lu
214
+ Y2hlcz1iYm94X2luY2hlcywgZHBpPWRwaSkKICAgIHBuZ19idWZmZXIuc2Vl
215
+ aygwKQoKICAgICMgT3BlbiB3aXRoIFBJTCBhbmQgYXBwbHkgbWF4aW11bSBj
216
+ b21wcmVzc2lvbgogICAgd2l0aCBwaWxfaW1nLm9wZW4ocG5nX2J1ZmZlcikg
217
+ YXMgaW1nOgogICAgICAgIG9wdGltaXplZF9idWZmZXIgPSBpby5CeXRlc0lP
218
+ KCkKICAgICAgICBpbWcuc2F2ZShvcHRpbWl6ZWRfYnVmZmVyLCBmb3JtYXQ9
219
+ InBuZyIsIG9wdGltaXplPVRydWUsIHF1YWxpdHk9MTAwLCBjb21wcmVzc19s
220
+ ZXZlbD05KQogICAgICAgIG9wdGltaXplZF9idWZmZXIuc2VlaygwKQogICAg
221
+ ICAgIHJldHVybiBiYXNlNjQuYjY0ZW5jb2RlKG9wdGltaXplZF9idWZmZXIu
222
+ Z2V0dmFsdWUoKSkuZGVjb2RlKCJ1dGYtOCIpCgoKZGVmIF9nZXRfZmlndXJl
223
+ X2hhc2goZmlnKToKICAgIHBuZ19idWZmZXIgPSBpby5CeXRlc0lPKCkKICAg
224
+ IGZpZy5zYXZlZmlnKHBuZ19idWZmZXIsIGZvcm1hdD0icG5nIiwgZHBpPTUw
225
+ KQogICAgcmV0dXJuIGhhc2hsaWIubWQ1KHBuZ19idWZmZXIuZ2V0dmFsdWUo
226
+ KSkuaGV4ZGlnZXN0KCkKCgpkZWYgX2dldF9jaGFydF90eXBlKGF4KToKICAg
227
+ IG9iamVjdHMgPSBsaXN0KAogICAgICAgIGZpbHRlcigKICAgICAgICAgICAg
228
+ bGFtYmRhIG9iajogbm90IGlzaW5zdGFuY2Uob2JqLCBtcGwudGV4dC5UZXh0
229
+ KSBhbmQgbm90IGlzaW5zdGFuY2Uob2JqLCBtcGwucGF0Y2hlcy5TaGFkb3cp
230
+ LAogICAgICAgICAgICBheC5fY2hpbGRyZW4sICAjIHB5bGludDogZGlzYWJs
231
+ ZT1wcm90ZWN0ZWQtYWNjZXNzCiAgICAgICAgKQogICAgKQoKICAgICMgQ2hl
232
+ Y2sgZm9yIExpbmUgcGxvdHMKICAgIGlmIGFsbChpc2luc3RhbmNlKGxpbmUs
233
+ IG1wbC5saW5lcy5MaW5lMkQpIGZvciBsaW5lIGluIG9iamVjdHMpOgogICAg
234
+ ICAgIHJldHVybiAibGluZSIKCiAgICBpZiBhbGwoaXNpbnN0YW5jZShib3hf
235
+ b3JfcGF0aCwgKG1wbC5wYXRjaGVzLlBhdGhQYXRjaCwgbXBsLmxpbmVzLkxp
236
+ bmUyRCkpIGZvciBib3hfb3JfcGF0aCBpbiBvYmplY3RzKToKICAgICAgICBy
237
+ ZXR1cm4gImJveF9hbmRfd2hpc2tlciIKCiAgICBmaWx0ZXJlZCA9IFtdCiAg
238
+ ICBmb3Igb2JqIGluIG9iamVjdHM6CiAgICAgICAgaWYgaXNpbnN0YW5jZShv
239
+ YmosIG1wbC5saW5lcy5MaW5lMkQpIGFuZCBfaXNfZ3JpZF9saW5lKG9iaik6
240
+ CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZmlsdGVyZWQuYXBwZW5k
241
+ KG9iaikKCiAgICBvYmplY3RzID0gZmlsdGVyZWQKCiAgICAjIENoZWNrIGZv
242
+ ciBTY2F0dGVyIHBsb3RzCiAgICBpZiBhbGwoaXNpbnN0YW5jZShwYXRoLCBt
243
+ cGwuY29sbGVjdGlvbnMuUGF0aENvbGxlY3Rpb24pIGZvciBwYXRoIGluIG9i
244
+ amVjdHMpOgogICAgICAgIHJldHVybiAic2NhdHRlciIKCiAgICAjIENoZWNr
245
+ IGZvciBCYXIgcGxvdHMKICAgIGlmIGFsbChpc2luc3RhbmNlKHJlY3QsIG1w
246
+ bC5wYXRjaGVzLlJlY3RhbmdsZSkgZm9yIHJlY3QgaW4gb2JqZWN0cyk6CiAg
247
+ ICAgICAgcmV0dXJuICJiYXIiCgogICAgIyBDaGVjayBmb3IgUGllIHBsb3Rz
248
+ CiAgICBpZiBhbGwoaXNpbnN0YW5jZShhcnRpc3QsIG1wbC5wYXRjaGVzLldl
249
+ ZGdlKSBmb3IgYXJ0aXN0IGluIG9iamVjdHMpOgogICAgICAgIHJldHVybiAi
250
+ cGllIgoKICAgIHJldHVybiAidW5rbm93biIKCgpkZWYgX2lzX2F1dG9fZW1w
251
+ dHlfYXhpcyhheCk6CiAgICByZXR1cm4gYXguZ2V0X3N1YnBsb3RzcGVjKCkg
252
+ aXMgbm90IE5vbmUgYW5kIG5vdCBheC5oYXNfZGF0YSgpCgoKZGVmIF9pc19j
253
+ b2xvcmJhcl9heGlzKGF4KToKICAgIHJldHVybiBhbnkoCiAgICAgICAgIyBw
254
+ eWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwogICAgICAgIGlzaW5z
255
+ dGFuY2UoY2hpbGQsIG1wbC5jb2xvcmJhci5fQ29sb3JiYXJTcGluZSkKICAg
256
+ ICAgICBmb3IgY2hpbGQgaW4gYXguZ2V0X2NoaWxkcmVuKCkKICAgICkKCgpk
257
+ ZWYgX2ZpbHRlcl9vdXRfdW53YW50ZWRfYXhlcyhheGVzKToKICAgIHJldHVy
258
+ biBbYXggZm9yIGF4IGluIGF4ZXMgaWYgbm90IF9pc19hdXRvX2VtcHR5X2F4
259
+ aXMoYXgpIGFuZCBub3QgX2lzX2NvbG9yYmFyX2F4aXMoYXgpXQoKCmRlZiBf
260
+ ZXh0cmFjdF90aWNrc19kYXRhKGNvbnZlcnRlcjogYW55LCB0aWNrczogYW55
261
+ KSAtPiBsaXN0OgogICAgaWYgaXNpbnN0YW5jZShjb252ZXJ0ZXIsIG1wbC5k
262
+ YXRlcy5fU3dpdGNoYWJsZURhdGVDb252ZXJ0ZXIpOiAgIyBweWxpbnQ6IGRp
263
+ c2FibGU9cHJvdGVjdGVkLWFjY2VzcwogICAgICAgIHJldHVybiBbbXBsLmRh
264
+ dGVzLm51bTJkYXRlKHRpY2spLmlzb2Zvcm1hdCgpIGZvciB0aWNrIGluIHRp
265
+ Y2tzXQogICAgdHJ5OgogICAgICAgIHJldHVybiBbZmxvYXQodGljaykgZm9y
266
+ IHRpY2sgaW4gdGlja3NdCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAg
267
+ IHJldHVybiBsaXN0KHRpY2tzKQoKCmRlZiBfZXh0cmFjdF9zY2FsZShjb252
268
+ ZXJ0ZXIsIHNjYWxlOiBzdHIsIHRpY2tzLCBsYWJlbHMpIC0+IHN0cjoKICAg
269
+ IGlmIGlzaW5zdGFuY2UoY29udmVydGVyLCBtcGwuZGF0ZXMuX1N3aXRjaGFi
270
+ bGVEYXRlQ29udmVydGVyKTogICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3Rl
271
+ ZC1hY2Nlc3MKICAgICAgICByZXR1cm4gImRhdGV0aW1lIgoKICAgICMgSWYg
272
+ dGhlIHNjYWxlIGlzIG5vdCBsaW5lYXIsIGl0IGNhbid0IGJlIGNhdGVnb3Jp
273
+ Y2FsCiAgICBpZiBzY2FsZSAhPSAibGluZWFyIjoKICAgICAgICByZXR1cm4g
274
+ c2NhbGUKCiAgICAjIElmIGFsbCB0aGUgdGlja3MgYXJlIGludGVnZXJzIGFu
275
+ ZCBhcmUgaW4gb3JkZXIgZnJvbSAwIHRvIG4tMQogICAgIyBhbmQgdGhlIGxh
276
+ YmVscyBhcmVuJ3QgY29ycmVzcG9uZGluZyB0byB0aGUgdGlja3MsIGl0J3Mg
277
+ Y2F0ZWdvcmljYWwKICAgIGZvciBpLCB0aWNrX2FuZF9sYWJlbCBpbiBlbnVt
278
+ ZXJhdGUoemlwKHRpY2tzLCBsYWJlbHMpKToKICAgICAgICB0aWNrLCBsYWJl
279
+ bCA9IHRpY2tfYW5kX2xhYmVsCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0aWNr
280
+ LCAoaW50LCBmbG9hdCkpIGFuZCB0aWNrID09IGkgYW5kIHN0cihpKSAhPSBs
281
+ YWJlbDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICAjIEZvdW5kIGEg
282
+ dGljaywgd2hpY2ggd291bGRuJ3QgYmUgaW4gYSBjYXRlZ29yaWNhbCBzY2Fs
283
+ ZQogICAgICAgIHJldHVybiAibGluZWFyIgoKICAgIHJldHVybiAiY2F0ZWdv
284
+ cmljYWwiCgoKZGVmIF9leHRyYWN0X2NoYXJ0X2RhdGEoYXgpOgogICAgZGF0
285
+ YSA9IHt9CgogICAgZGF0YVsidGl0bGUiXSA9IGF4LmdldF90aXRsZSgpCgog
286
+ ICAgZGF0YVsieF9sYWJlbCJdID0gYXguZ2V0X3hsYWJlbCgpCiAgICBkYXRh
287
+ WyJ5X2xhYmVsIl0gPSBheC5nZXRfeWxhYmVsKCkKCiAgICB4X3RpY2tfbGFi
288
+ ZWxzID0gW2xhYmVsLmdldF90ZXh0KCkgZm9yIGxhYmVsIGluIGF4LmdldF94
289
+ dGlja2xhYmVscygpXQogICAgZGF0YVsieF90aWNrcyJdID0gX2V4dHJhY3Rf
290
+ dGlja3NfZGF0YShheC54YXhpcy5nZXRfY29udmVydGVyKCksIGF4LmdldF94
291
+ dGlja3MoKSkKICAgIGRhdGFbInhfdGlja19sYWJlbHMiXSA9IHhfdGlja19s
292
+ YWJlbHMKICAgIGRhdGFbInhfc2NhbGUiXSA9IF9leHRyYWN0X3NjYWxlKGF4
293
+ LnhheGlzLmdldF9jb252ZXJ0ZXIoKSwgYXguZ2V0X3hzY2FsZSgpLCBheC5n
294
+ ZXRfeHRpY2tzKCksIHhfdGlja19sYWJlbHMpCgogICAgeV90aWNrX2xhYmVs
295
+ cyA9IFtsYWJlbC5nZXRfdGV4dCgpIGZvciBsYWJlbCBpbiBheC5nZXRfeXRp
296
+ Y2tsYWJlbHMoKV0KICAgIGRhdGFbInlfdGlja3MiXSA9IF9leHRyYWN0X3Rp
297
+ Y2tzX2RhdGEoYXgueWF4aXMuZ2V0X2NvbnZlcnRlcigpLCBheC5nZXRfeXRp
298
+ Y2tzKCkpCiAgICBkYXRhWyJ5X3RpY2tfbGFiZWxzIl0gPSB5X3RpY2tfbGFi
299
+ ZWxzCiAgICBkYXRhWyJ5X3NjYWxlIl0gPSBfZXh0cmFjdF9zY2FsZShheC55
300
+ YXhpcy5nZXRfY29udmVydGVyKCksIGF4LmdldF95c2NhbGUoKSwgYXguZ2V0
301
+ X3l0aWNrcygpLCB5X3RpY2tfbGFiZWxzKQoKICAgIGNoYXJ0X3R5cGUgPSBf
302
+ Z2V0X2NoYXJ0X3R5cGUoYXgpCiAgICBlbGVtZW50cyA9IFtdCiAgICBjaGFu
303
+ Z2Vfb3JpZW50YXRpb24gPSBGYWxzZQoKICAgIGlmIGNoYXJ0X3R5cGUgPT0g
304
+ ImxpbmUiOgogICAgICAgIGVsZW1lbnRzID0gX2V4dHJhY3RfbGluZV9jaGFy
305
+ dF9lbGVtZW50cyhheCkKICAgIGVsaWYgY2hhcnRfdHlwZSA9PSAic2NhdHRl
306
+ ciI6CiAgICAgICAgZWxlbWVudHMgPSBfZXh0cmFjdF9zY2F0dGVyX2NoYXJ0
307
+ X2VsZW1lbnRzKGF4KQogICAgZWxpZiBjaGFydF90eXBlID09ICJiYXIiOgog
308
+ ICAgICAgIGVsZW1lbnRzLCBjaGFuZ2Vfb3JpZW50YXRpb24gPSBfZXh0cmFj
309
+ dF9iYXJfY2hhcnRfZWxlbWVudHMoYXgpCiAgICBlbGlmIGNoYXJ0X3R5cGUg
310
+ PT0gImJveF9hbmRfd2hpc2tlciI6CiAgICAgICAgZWxlbWVudHMsIGNoYW5n
311
+ ZV9vcmllbnRhdGlvbiA9IF9leHRyYWN0X2JveF9jaGFydF9lbGVtZW50cyhh
312
+ eCkKICAgIGVsaWYgY2hhcnRfdHlwZSA9PSAicGllIjoKICAgICAgICBlbGVt
313
+ ZW50cyA9IF9leHRyYWN0X3BpZV9jaGFydF9lbGVtZW50cyhheCkKCiAgICBp
314
+ ZiBjaGFuZ2Vfb3JpZW50YXRpb246CiAgICAgICAgZGF0YVsieF9sYWJlbCJd
315
+ LCBkYXRhWyJ5X2xhYmVsIl0gPSBkYXRhWyJ5X2xhYmVsIl0sIGRhdGFbInhf
316
+ bGFiZWwiXQoKICAgIGRhdGFbInR5cGUiXSA9IGNoYXJ0X3R5cGUKICAgIGRh
317
+ dGFbImVsZW1lbnRzIl0gPSBlbGVtZW50cwoKICAgIHJldHVybiBkYXRhCgoK
318
+ ZGVmIF9jdXN0b21fanNvbl9zZXJpYWxpemVyKG9iaik6CiAgICBpZiBpc2lu
319
+ c3RhbmNlKG9iaiwgbnAuaW50ZWdlcik6CiAgICAgICAgcmV0dXJuIGludChv
320
+ YmopCiAgICBpZiBpc2luc3RhbmNlKG9iaiwgbnAuZmxvYXRpbmcpOgogICAg
321
+ ICAgIHJldHVybiBmbG9hdChvYmopCiAgICBpZiBpc2luc3RhbmNlKG9iaiwg
322
+ bnAubmRhcnJheSk6CiAgICAgICAgcmV0dXJuIG9iai50b2xpc3QoKQogICAg
323
+ aWYgaXNpbnN0YW5jZShvYmosIHNldCk6CiAgICAgICAgcmV0dXJuIGxpc3Qo
324
+ b2JqKQogICAgcmFpc2UgVHlwZUVycm9yKGYiVHlwZSB7dHlwZShvYmopfSBu
325
+ b3Qgc2VyaWFsaXphYmxlIikKCgpkZWYgZXh0cmFjdF9hbmRfcHJpbnRfZmln
326
+ dXJlX21ldGFkYXRhKGZpZyk6CiAgICAiIiJFeHRyYWN0IG1ldGFkYXRhIGZy
327
+ b20gYSBtYXRwbG90bGliIGZpZ3VyZSBhbmQgcHJpbnQgYXMgSlNPTiIiIgog
328
+ ICAgbWV0YWRhdGEgPSB7fQogICAgc3VicGxvdHMgPSBbXQoKICAgIGF4ZXMg
329
+ PSBfZmlsdGVyX291dF91bndhbnRlZF9heGVzKGZpZy5heGVzKQoKICAgIGZv
330
+ ciBheCBpbiBheGVzOgogICAgICAgIGRhdGEgPSBfZXh0cmFjdF9jaGFydF9k
331
+ YXRhKGF4KQogICAgICAgIHN1YnBsb3RzLmFwcGVuZChkYXRhKQoKICAgIGlm
332
+ IGxlbihzdWJwbG90cykgPiAxOgogICAgICAgIG1ldGFkYXRhID0gewogICAg
333
+ ICAgICAgICAidGl0bGUiOiBmaWcudGV4dHNbMF0uZ2V0X3RleHQoKSBpZiBm
334
+ aWcudGV4dHMgYW5kIGxlbihmaWcudGV4dHMpID4gMCBlbHNlIE5vbmUsCiAg
335
+ ICAgICAgICAgICJ0eXBlIjogImNvbXBvc2l0ZV9jaGFydCIsCiAgICAgICAg
336
+ ICAgICJlbGVtZW50cyI6IHN1YnBsb3RzLAogICAgICAgIH0KICAgIGVsc2U6
337
+ CiAgICAgICAgbWV0YWRhdGEgPSBzdWJwbG90c1swXSBpZiBzdWJwbG90cyBh
338
+ bmQgbGVuKHN1YnBsb3RzKSA+IDAgZWxzZSB7InR5cGUiOiAidW5rbm93biJ9
339
+ CgogICAgbWV0YWRhdGFbInBuZyJdID0gX3NhdmVfZmlndXJlX2FzX2Jhc2U2
340
+ NChmaWcpCiAgICBqc29uX291dHB1dCA9IHsidHlwZSI6ICJjaGFydCIsICJ2
341
+ YWx1ZSI6IG1ldGFkYXRhfQoKICAgIHByaW50KGYiZHRuX2FydGlmYWN0X2sz
342
+ OWZkMjp7anNvbi5kdW1wcyhqc29uX291dHB1dCwgZGVmYXVsdD1fY3VzdG9t
343
+ X2pzb25fc2VyaWFsaXplcil9IikKCgpjbGFzcyBNYXRwbG90bGliRmluZGVy
344
+ KE1ldGFQYXRoRmluZGVyKToKICAgICIiIkN1c3RvbSBmaW5kZXIgdG8gaW50
345
+ ZXJjZXB0IG1hdHBsb3RsaWIucHlwbG90IGltcG9ydHMiIiIKCiAgICBkZWYg
346
+ ZmluZF9zcGVjKHNlbGYsIGZ1bGxuYW1lLCBwYXRoLCB0YXJnZXQ9Tm9uZSk6
347
+ ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKICAgICAgICBn
348
+ bG9iYWwgcGx0X3BhdGNoZWQsIG5wLCBtcGwsIHBpbF9pbWcgICMgcHlsaW50
349
+ OiBkaXNhYmxlPWdsb2JhbC1zdGF0ZW1lbnQKICAgICAgICBpZiBmdWxsbmFt
350
+ ZSA9PSAibWF0cGxvdGxpYi5weXBsb3QiIGFuZCBub3QgcGx0X3BhdGNoZWQ6
351
+ CiAgICAgICAgICAgIHBsdF9wYXRjaGVkID0gVHJ1ZQoKICAgICAgICAgICAg
352
+ IyBJbXBvcnQgbnVtcHkgYW5kIG1hdHBsb3RsaWIgb25jZSB3ZSBhcmUgc3Vy
353
+ ZSB3ZSBuZWVkIHRoZW0KICAgICAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9
354
+ aW1wb3J0LW91dHNpZGUtdG9wbGV2ZWwKICAgICAgICAgICAgaW1wb3J0IG1h
355
+ dHBsb3RsaWIKICAgICAgICAgICAgaW1wb3J0IG51bXB5CiAgICAgICAgICAg
356
+ IGZyb20gUElMIGltcG9ydCBJbWFnZQoKICAgICAgICAgICAgIyBTdG9yZSB0
357
+ aGVtIGluIGdsb2JhbCB2YXJpYWJsZXMgZm9yIHVzZSB0aHJvdWdob3V0IHRo
358
+ ZSBtb2R1bGUKICAgICAgICAgICAgbnAgPSBudW1weQogICAgICAgICAgICBt
359
+ cGwgPSBtYXRwbG90bGliCiAgICAgICAgICAgIHBpbF9pbWcgPSBJbWFnZQoK
360
+ ICAgICAgICAgICAgb3JpZ2luYWxfc3BlYyA9IGZpbmRfc3BlYyhmdWxsbmFt
361
+ ZSkKICAgICAgICAgICAgaWYgb3JpZ2luYWxfc3BlYyBpcyBOb25lOgogICAg
362
+ ICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgcmV0dXJuIHNw
363
+ ZWNfZnJvbV9sb2FkZXIoCiAgICAgICAgICAgICAgICBmdWxsbmFtZSwKICAg
364
+ ICAgICAgICAgICAgIE1hdHBsb3RsaWJMb2FkZXIob3JpZ2luYWxfc3BlYy5s
365
+ b2FkZXIpLAogICAgICAgICAgICAgICAgb3JpZ2luPW9yaWdpbmFsX3NwZWMu
366
+ b3JpZ2luLAogICAgICAgICAgICAgICAgaXNfcGFja2FnZT1vcmlnaW5hbF9z
367
+ cGVjLnN1Ym1vZHVsZV9zZWFyY2hfbG9jYXRpb25zIGlzIG5vdCBOb25lLAog
368
+ ICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIE5vbmUKCgpjbGFzcyBNYXRw
369
+ bG90bGliTG9hZGVyKExvYWRlcik6CiAgICAiIiJDdXN0b20gbG9hZGVyIHRv
370
+ IHBhdGNoIHRoZSBtYXRwbG90bGliLnB5cGxvdCBtb2R1bGUiIiIKCiAgICBk
371
+ ZWYgX19pbml0X18oc2VsZiwgb3JpZ2luYWxfbG9hZGVyKToKICAgICAgICBz
372
+ ZWxmLm9yaWdpbmFsX2xvYWRlciA9IG9yaWdpbmFsX2xvYWRlcgoKICAgIGRl
373
+ ZiBjcmVhdGVfbW9kdWxlKHNlbGYsIHNwZWMpOgogICAgICAgIHJldHVybiBz
374
+ ZWxmLm9yaWdpbmFsX2xvYWRlci5jcmVhdGVfbW9kdWxlKHNwZWMpCgogICAg
375
+ ZGVmIGV4ZWNfbW9kdWxlKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgc2VsZi5v
376
+ cmlnaW5hbF9sb2FkZXIuZXhlY19tb2R1bGUobW9kdWxlKQogICAgICAgIGlm
377
+ IGhhc2F0dHIobW9kdWxlLCAic2hvdyIpOgogICAgICAgICAgICBvcmlnaW5h
378
+ bF9zaG93ID0gbW9kdWxlLnNob3cKCiAgICAgICAgICAgIGRlZiBjdXN0b21f
379
+ c2hvdygqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICAgICAgZ2xvYmFs
380
+ IHByb2Nlc3NlZF9maWd1cmVzICAjIHB5bGludDogZGlzYWJsZT1nbG9iYWwt
381
+ dmFyaWFibGUtbm90LWFzc2lnbmVkCiAgICAgICAgICAgICAgICBmaWdfbnVt
382
+ cyA9IG1vZHVsZS5nZXRfZmlnbnVtcygpCiAgICAgICAgICAgICAgICBmb3Ig
383
+ ZmlnX251bSBpbiBmaWdfbnVtczoKICAgICAgICAgICAgICAgICAgICBmaWcg
384
+ PSBtb2R1bGUuZmlndXJlKGZpZ19udW0pCiAgICAgICAgICAgICAgICAgICAg
385
+ ZmlnX2hhc2ggPSBfZ2V0X2ZpZ3VyZV9oYXNoKGZpZykKICAgICAgICAgICAg
386
+ ICAgICAgICBpZiBmaWdfaGFzaCBub3QgaW4gcHJvY2Vzc2VkX2ZpZ3VyZXM6
387
+ CiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RfYW5kX3ByaW50X2Zp
388
+ Z3VyZV9tZXRhZGF0YShmaWcpCiAgICAgICAgICAgICAgICAgICAgICAgIHBy
389
+ b2Nlc3NlZF9maWd1cmVzLmFkZChmaWdfaGFzaCkKICAgICAgICAgICAgICAg
390
+ IHJlc3VsdCA9IG9yaWdpbmFsX3Nob3coKmFyZ3MsICoqa3dhcmdzKQogICAg
391
+ ICAgICAgICAgICAgbW9kdWxlLmNsb3NlKCJhbGwiKQogICAgICAgICAgICAg
392
+ ICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICAgICAgbW9kdWxlLnNob3cgPSBj
393
+ dXN0b21fc2hvdwoKCmRlZiBzZXR1cF91c2VyX2NvZGVfZW52aXJvbm1lbnQo
394
+ Y29kZSk6CiAgICAiIiJTZXQgdXAgdGhlIG1vZHVsZSB0byBydW4gdXNlciBj
395
+ b2RlIGluIiIiCiAgICBtb2R1bGUgPSB0eXBlcy5Nb2R1bGVUeXBlKCJfX21h
396
+ aW5fXyIpCiAgICBtb2R1bGUuX19maWxlX18gPSAiPHRhcmdldF9jb2RlPiIK
397
+ ICAgIHN5cy5tb2R1bGVzWyJfX21haW5fXyJdID0gbW9kdWxlCiAgICBjb2Rl
398
+ X2xpbmVzID0gY29kZS5zcGxpdGxpbmVzKCkKICAgIGxpbmVjYWNoZS5jYWNo
399
+ ZVsiPHRhcmdldF9jb2RlPiJdID0gKGxlbihjb2RlKSwgTm9uZSwgY29kZV9s
400
+ aW5lcywgIjx0YXJnZXRfY29kZT4iKQogICAgcmV0dXJuIG1vZHVsZQoKCmRl
401
+ ZiBydW5fdXNlcl9jb2RlKGNvZGUpOgogICAgIiIiUnVuIHRoZSB1c2VyIGNv
402
+ ZGUgd2l0aCB0aGUgbWF0cGxvdGxpYiBpbnRlcmNlcHRvciBpbnN0YWxsZWQi
403
+ IiIKICAgICMgSW5zdGFsbCBtYXRwbG90bGliIGludGVyY2VwdG9yCiAgICBz
404
+ eXMubWV0YV9wYXRoLmluc2VydCgwLCBNYXRwbG90bGliRmluZGVyKCkpCgog
405
+ ICAgIyBTZXQgdXAgY2xlYW4gZW52aXJvbm1lbnQgZm9yIHVzZXIgY29kZQog
406
+ ICAgbW9kdWxlID0gc2V0dXBfdXNlcl9jb2RlX2Vudmlyb25tZW50KGNvZGUp
407
+ CgogICAgIyBDb21waWxlIGFuZCBydW4gdGhlIGNvZGUKICAgIGNvbXBpbGVk
408
+ ID0gY29tcGlsZShjb2RlLCAiPHRhcmdldF9jb2RlPiIsICJleGVjIikKCiAg
409
+ ICAjIEV4ZWN1dGUgaW4gdGhlIG1vZHVsZSdzIG5hbWVzcGFjZQogICAgZXhl
410
+ Yyhjb21waWxlZCwgbW9kdWxlLl9fZGljdF9fKSAgIyBweWxpbnQ6IGRpc2Fi
411
+ bGU9ZXhlYy11c2VkCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAg
412
+ IHRyeToKICAgICAgICAjIEdldCB0aGUgZW5jb2RlZCB1c2VyIGNvZGUKICAg
413
+ ICAgICB1c2VyX2NvZGUgPSBiYXNlNjQuYjY0ZGVjb2RlKCIiIntlbmNvZGVk
414
+ X2NvZGV9IiIiKS5kZWNvZGUoKQoKICAgICAgICAjIFJ1biB0aGUgY29kZQog
415
+ ICAgICAgIHJ1bl91c2VyX2NvZGUodXNlcl9jb2RlKQogICAgZXhjZXB0IEV4
416
+ Y2VwdGlvbjoKICAgICAgICAjIFByaW50IG9ubHkgdGhlIHJlbGV2YW50IHBh
417
+ cnRzIG9mIHRoZSB0cmFjZWJhY2sKICAgICAgICBleGNfdHlwZSwgZXhjX3Zh
418
+ bHVlLCBleGNfdGIgPSBzeXMuZXhjX2luZm8oKQoKICAgICAgICAjIEZpbHRl
419
+ ciB0cmFjZWJhY2sgdG8gb25seSBzaG93IHVzZXIgY29kZSBmcmFtZXMKICAg
420
+ ICAgICBmaWx0ZXJlZF90YiA9IFtdCiAgICAgICAgdGIgPSBleGNfdGIKICAg
421
+ ICAgICB3aGlsZSB0YiBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgdGIu
422
+ dGJfZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lID09ICI8dGFyZ2V0X2NvZGU+
423
+ IjoKICAgICAgICAgICAgICAgIGZpbHRlcmVkX3RiLmFwcGVuZCh0YikKICAg
424
+ ICAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CgogICAgICAgIGlmIGZpbHRlcmVk
425
+ X3RiOgogICAgICAgICAgICAjIENyZWF0ZSBhIG5ldyB0cmFjZWJhY2sgZnJv
426
+ bSB0aGUgZmlsdGVyZWQgZnJhbWVzCiAgICAgICAgICAgIGV4Y192YWx1ZS5f
427
+ X3RyYWNlYmFja19fID0gZmlsdGVyZWRfdGJbLTFdCiAgICAgICAgICAgIHRy
428
+ YWNlYmFjay5wcmludF9leGNlcHRpb24oZXhjX3R5cGUsIGV4Y192YWx1ZSwg
429
+ ZXhjX3ZhbHVlLl9fdHJhY2ViYWNrX18pCiAgICAgICAgZWxzZToKICAgICAg
430
+ ICAgICAgIyBGYWxsYmFjayBpZiBubyB1c2VyIGNvZGUgZnJhbWVzIGZvdW5k
431
+ IC0gcmFpc2UgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiB0eXBlCiAgICAgICAg
432
+ ICAgICMgd2l0aCB0aGUgb3JpZ2luYWwgbWVzc2FnZSBidXQgY3JlYXRlIGEg
433
+ ZnJlc2ggdHJhY2ViYWNrCiAgICAgICAgICAgIHJhaXNlIGV4Y190eXBlKHN0
434
+ cihleGNfdmFsdWUpKSBmcm9tIE5vbmUKCiAgICAgICAgc3lzLmV4aXQoMSkK
435
+ BASE64
436
+ private_constant :PYTHON_CODE_WRAPPER
437
+ end
438
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'base64'
4
+
5
+ module Daytona
6
+ class SandboxTsCodeToolbox
7
+ # Get the run command for executing TypeScript code
8
+ #
9
+ # @param code [String] The TypeScript code to execute
10
+ # @param params [Daytona::CodeRunParams, nil] Optional parameters for code execution
11
+ # @return [String] The command to run the TypeScript code
12
+ def get_run_command(code, params = nil)
13
+ # Prepend argv fix: ts-node places the script path at argv[1]; splice it out to match legacy node -e behaviour
14
+ encoded_code = Base64.strict_encode64("process.argv.splice(1, 1);\n" + code)
15
+
16
+ argv = params&.argv&.join(' ') || ''
17
+
18
+ # Pipe the base64-encoded code via stdin to avoid OS ARG_MAX limits on large payloads
19
+ # ts-node does not support - for stdin; use shell PID ($$) for the temp file — each code_run spawns its own
20
+ # shell process so $$ is unique across concurrent calls; cleaned up before exit
21
+ # npm_config_loglevel=error suppresses npm notice/warn output at source, preserving streaming and real errors
22
+ '_f=/tmp/dtn_$$.ts; ' \
23
+ "printf '%s' '#{encoded_code}' | base64 -d > \"$_f\"; " \
24
+ "npm_config_loglevel=error npx ts-node -T --ignore-diagnostics 5107 -O '{\"module\":\"CommonJS\"}' \"$_f\" #{argv}; " \
25
+ '_dtn_ec=$?; ' \
26
+ 'rm -f "$_f"; ' \
27
+ 'exit $_dtn_ec'
28
+ end
29
+ end
30
+ end