daytona-sdk 0.125.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1df91d67de434ccc629af27cb22be9c6625f8fdfbd9031877dd56a0582911b88
4
+ data.tar.gz: 034ef4ab1210b4aa60edfbaf489cb685c868935d561591b8f84b6bc4b983dd14
5
+ SHA512:
6
+ metadata.gz: 8ae72cc56362a54b7836de43ebb746c27d8ef2a49a65dc373a91779ee777a578e440a9493c555f0484dd2f0cfab361c5e1c75fb71c9df8fc07a9e38f19b6f049
7
+ data.tar.gz: ebf6383fed890d22940c286aa266530b477fd1507106ab4c3d7ce07bbd31e5cd50a5d3e29342cf844d2237e786720f6ac2c6f13c146aaacd4d907734c5121144
data/.rubocop.yml ADDED
@@ -0,0 +1,16 @@
1
+ plugins:
2
+ - rubocop-rake
3
+
4
+ AllCops:
5
+ NewCops: enable
6
+ TargetRubyVersion: 3.2
7
+
8
+ Layout/LineLength:
9
+ AllowedPatterns: ['\A\s*#']
10
+ IgnoreCopDirectives: true
11
+
12
+ Style/Documentation:
13
+ Enabled: false
14
+
15
+ Style/AccessorGrouping:
16
+ EnforcedStyle: separated
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.4.5
@@ -0,0 +1,132 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our
6
+ community a harassment-free experience for everyone, regardless of age, body
7
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+ identity and expression, level of experience, education, socio-economic status,
9
+ nationality, personal appearance, race, caste, color, religion, or sexual
10
+ identity and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment for our
18
+ community include:
19
+
20
+ * Demonstrating empathy and kindness toward other people
21
+ * Being respectful of differing opinions, viewpoints, and experiences
22
+ * Giving and gracefully accepting constructive feedback
23
+ * Accepting responsibility and apologizing to those affected by our mistakes,
24
+ and learning from the experience
25
+ * Focusing on what is best not just for us as individuals, but for the overall
26
+ community
27
+
28
+ Examples of unacceptable behavior include:
29
+
30
+ * The use of sexualized language or imagery, and sexual attention or advances of
31
+ any kind
32
+ * Trolling, insulting or derogatory comments, and personal or political attacks
33
+ * Public or private harassment
34
+ * Publishing others' private information, such as a physical or email address,
35
+ without their explicit permission
36
+ * Other conduct which could reasonably be considered inappropriate in a
37
+ professional setting
38
+
39
+ ## Enforcement Responsibilities
40
+
41
+ Community leaders are responsible for clarifying and enforcing our standards of
42
+ acceptable behavior and will take appropriate and fair corrective action in
43
+ response to any behavior that they deem inappropriate, threatening, offensive,
44
+ or harmful.
45
+
46
+ Community leaders have the right and responsibility to remove, edit, or reject
47
+ comments, commits, code, wiki edits, issues, and other contributions that are
48
+ not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+ decisions when appropriate.
50
+
51
+ ## Scope
52
+
53
+ This Code of Conduct applies within all community spaces, and also applies when
54
+ an individual is officially representing the community in public spaces.
55
+ Examples of representing our community include using an official email address,
56
+ posting via an official social media account, or acting as an appointed
57
+ representative at an online or offline event.
58
+
59
+ ## Enforcement
60
+
61
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+ reported to the community leaders responsible for enforcement at
63
+ [INSERT CONTACT METHOD].
64
+ All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+ All community leaders are obligated to respect the privacy and security of the
67
+ reporter of any incident.
68
+
69
+ ## Enforcement Guidelines
70
+
71
+ Community leaders will follow these Community Impact Guidelines in determining
72
+ the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+ ### 1. Correction
75
+
76
+ **Community Impact**: Use of inappropriate language or other behavior deemed
77
+ unprofessional or unwelcome in the community.
78
+
79
+ **Consequence**: A private, written warning from community leaders, providing
80
+ clarity around the nature of the violation and an explanation of why the
81
+ behavior was inappropriate. A public apology may be requested.
82
+
83
+ ### 2. Warning
84
+
85
+ **Community Impact**: A violation through a single incident or series of
86
+ actions.
87
+
88
+ **Consequence**: A warning with consequences for continued behavior. No
89
+ interaction with the people involved, including unsolicited interaction with
90
+ those enforcing the Code of Conduct, for a specified period of time. This
91
+ includes avoiding interactions in community spaces as well as external channels
92
+ like social media. Violating these terms may lead to a temporary or permanent
93
+ ban.
94
+
95
+ ### 3. Temporary Ban
96
+
97
+ **Community Impact**: A serious violation of community standards, including
98
+ sustained inappropriate behavior.
99
+
100
+ **Consequence**: A temporary ban from any sort of interaction or public
101
+ communication with the community for a specified period of time. No public or
102
+ private interaction with the people involved, including unsolicited interaction
103
+ with those enforcing the Code of Conduct, is allowed during this period.
104
+ Violating these terms may lead to a permanent ban.
105
+
106
+ ### 4. Permanent Ban
107
+
108
+ **Community Impact**: Demonstrating a pattern of violation of community
109
+ standards, including sustained inappropriate behavior, harassment of an
110
+ individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+ **Consequence**: A permanent ban from any sort of public interaction within the
113
+ community.
114
+
115
+ ## Attribution
116
+
117
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+ version 2.1, available at
119
+ [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
+
121
+ Community Impact Guidelines were inspired by
122
+ [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
+
124
+ For answers to common questions about this code of conduct, see the FAQ at
125
+ [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
+ [https://www.contributor-covenant.org/translations][translations].
127
+
128
+ [homepage]: https://www.contributor-covenant.org
129
+ [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
+ [Mozilla CoC]: https://github.com/mozilla/diversity
131
+ [FAQ]: https://www.contributor-covenant.org/faq
132
+ [translations]: https://www.contributor-covenant.org/translations
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # Daytona::Sdk
2
+
3
+ TODO: Delete this and the text below, and describe your gem
4
+
5
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/daytona/sdk`. To experiment with that code, run `bin/console` for an interactive prompt.
6
+
7
+ ## Installation
8
+
9
+ TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
10
+
11
+ Install the gem and add to the application's Gemfile by executing:
12
+
13
+ ```bash
14
+ bundle add UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
15
+ ```
16
+
17
+ If bundler is not being used to manage dependencies, install the gem by executing:
18
+
19
+ ```bash
20
+ gem install UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/daytona-sdk. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/daytona-sdk/blob/main/CODE_OF_CONDUCT.md).
36
+
37
+ ## Code of Conduct
38
+
39
+ Everyone interacting in the Daytona::Sdk project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/daytona-sdk/blob/main/CODE_OF_CONDUCT.md).
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require 'rubocop/rake_task'
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
@@ -0,0 +1,439 @@
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.encode64(code)
14
+
15
+ # Override plt.show() method if matplotlib is imported
16
+ if matplotlib_imported?(code)
17
+ encoded_code = Base64.encode64(
18
+ Base64.decode64(PYTHON_CODE_WRAPPER).gsub('{encoded_code}', encoded_code)
19
+ )
20
+ end
21
+
22
+ argv = params&.argv&.join(' ') || ''
23
+
24
+ # Execute the bootstrapper code directly
25
+ # Use -u flag to ensure unbuffered output for real-time error reporting
26
+
27
+ " sh -c 'python3 -u -c \"exec(__import__(\\\"base64\\\").b64decode(\\\"\\\"\\\"#{encoded_code}\\\"\\\"\\\")" \
28
+ ".decode())\" #{argv}' "
29
+ end
30
+
31
+ private
32
+
33
+ # Check if matplotlib is imported in the code
34
+ #
35
+ # @param code [String] The Python code to check
36
+ # @return [Boolean] True if matplotlib is imported, false otherwise
37
+ def matplotlib_imported?(code) = PATTERNS.any? { |pattern| code.match?(pattern) }
38
+
39
+ PATTERNS = [
40
+ # Standard imports
41
+ /^[^#]*import\s+matplotlib/m,
42
+ /^[^#]*from\s+matplotlib/m,
43
+ # Dynamic imports
44
+ /^[^#]*__import__\s*\(\s*['"]matplotlib['"]/m,
45
+ /^[^#]*importlib\.import_module\s*\(\s*['"]matplotlib['"]/m,
46
+ # Other dynamic loading patterns
47
+ /^[^#]*loader\.load_module\s*\(\s*['"]matplotlib['"]/m,
48
+ /^[^#]*sys\.modules\[['"]matplotlib['"]\]/m
49
+ ].freeze
50
+ private_constant :PATTERNS
51
+
52
+ PYTHON_CODE_WRAPPER = <<~BASE64.strip
53
+ aW1wb3J0IGJhc2U2NAppbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IGhhc2hsaWIK
54
+ aW1wb3J0IGlvCmltcG9ydCBqc29uCmltcG9ydCBsaW5lY2FjaGUKaW1wb3J0
55
+ IHN5cwppbXBvcnQgdHJhY2ViYWNrCmltcG9ydCB0eXBlcwpmcm9tIGltcG9y
56
+ dGxpYi5hYmMgaW1wb3J0IExvYWRlciwgTWV0YVBhdGhGaW5kZXIKZnJvbSBp
57
+ bXBvcnRsaWIudXRpbCBpbXBvcnQgZmluZF9zcGVjLCBzcGVjX2Zyb21fbG9h
58
+ ZGVyCgojIEdsb2JhbCB2YXJpYWJsZXMgdG8gaG9sZCBpbXBvcnRlZCBsaWJy
59
+ YXJpZXMgaWYgbmVlZGVkCm5wID0gTm9uZQptcGwgPSBOb25lCnBpbF9pbWcg
60
+ PSBOb25lCgoKcGx0X3BhdGNoZWQgPSBGYWxzZQpwcm9jZXNzZWRfZmlndXJl
61
+ cyA9IHNldCgpCgoKZGVmIF9wYXJzZV9wb2ludChwb2ludCk6CiAgICBpZiBp
62
+ c2luc3RhbmNlKHBvaW50LCBkYXRldGltZS5kYXRlKToKICAgICAgICByZXR1
63
+ cm4gcG9pbnQuaXNvZm9ybWF0KCkKICAgIGlmIGlzaW5zdGFuY2UocG9pbnQs
64
+ IG5wLmRhdGV0aW1lNjQpOgogICAgICAgIHJldHVybiBwb2ludC5hc3R5cGUo
65
+ ImRhdGV0aW1lNjRbc10iKS5hc3R5cGUoc3RyKQogICAgcmV0dXJuIHBvaW50
66
+ CgoKZGVmIF9pc19ncmlkX2xpbmUobGluZTogYW55KSAtPiBib29sOgogICAg
67
+ eF9kYXRhID0gbGluZS5nZXRfeGRhdGEoKQogICAgaWYgbGVuKHhfZGF0YSkg
68
+ IT0gMjoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICB5X2RhdGEgPSBsaW5l
69
+ LmdldF95ZGF0YSgpCiAgICBpZiBsZW4oeV9kYXRhKSAhPSAyOgogICAgICAg
70
+ IHJldHVybiBGYWxzZQoKICAgIGlmIHhfZGF0YVswXSA9PSB4X2RhdGFbMV0g
71
+ b3IgeV9kYXRhWzBdID09IHlfZGF0YVsxXToKICAgICAgICByZXR1cm4gVHJ1
72
+ ZQoKICAgIHJldHVybiBGYWxzZQoKCmRlZiBfZXh0cmFjdF9saW5lX2NoYXJ0
73
+ X2VsZW1lbnRzKGF4KToKICAgIGVsZW1lbnRzID0gW10KCiAgICBmb3IgbGlu
74
+ ZSBpbiBheC5nZXRfbGluZXMoKToKICAgICAgICBpZiBfaXNfZ3JpZF9saW5l
75
+ KGxpbmUpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGxhYmVsID0g
76
+ bGluZS5nZXRfbGFiZWwoKQogICAgICAgIHBvaW50cyA9IFtfcGFyc2VfcG9p
77
+ bnQoKHgsIHkpKSBmb3IgeCwgeSBpbiB6aXAobGluZS5nZXRfeGRhdGEoKSwg
78
+ bGluZS5nZXRfeWRhdGEoKSldCgogICAgICAgIGVsZW1lbnQgPSB7ImxhYmVs
79
+ IjogbGFiZWwsICJwb2ludHMiOiBwb2ludHN9CiAgICAgICAgZWxlbWVudHMu
80
+ YXBwZW5kKGVsZW1lbnQpCgogICAgcmV0dXJuIGVsZW1lbnRzCgoKZGVmIF9l
81
+ eHRyYWN0X3NjYXR0ZXJfY2hhcnRfZWxlbWVudHMoYXgpOgogICAgZWxlbWVu
82
+ dHMgPSBbXQoKICAgIGZvciBjb2xsZWN0aW9uIGluIGF4LmNvbGxlY3Rpb25z
83
+ OgogICAgICAgIHBvaW50cyA9IFtfcGFyc2VfcG9pbnQoKHgsIHkpKSBmb3Ig
84
+ eCwgeSBpbiBjb2xsZWN0aW9uLmdldF9vZmZzZXRzKCldCiAgICAgICAgZWxl
85
+ bWVudCA9IHsibGFiZWwiOiBjb2xsZWN0aW9uLmdldF9sYWJlbCgpLCAicG9p
86
+ bnRzIjogcG9pbnRzfQogICAgICAgIGVsZW1lbnRzLmFwcGVuZChlbGVtZW50
87
+ KQoKICAgIHJldHVybiBlbGVtZW50cwoKCmRlZiBfZXh0cmFjdF9iYXJfY2hh
88
+ cnRfZWxlbWVudHMoYXgpOgogICAgZWxlbWVudHMgPSBbXQogICAgY2hhbmdl
89
+ X29yaWVudGF0aW9uID0gRmFsc2UKCiAgICBmb3IgY29udGFpbmVyIGluIGF4
90
+ LmNvbnRhaW5lcnM6CiAgICAgICAgaGVpZ2h0cyA9IFtyZWN0LmdldF9oZWln
91
+ aHQoKSBmb3IgcmVjdCBpbiBjb250YWluZXJdCiAgICAgICAgaWYgYWxsKGhl
92
+ aWdodCA9PSBoZWlnaHRzWzBdIGZvciBoZWlnaHQgaW4gaGVpZ2h0cyk6CiAg
93
+ ICAgICAgICAgICMgdmVydGljYWwgYmFycwogICAgICAgICAgICBjaGFuZ2Vf
94
+ b3JpZW50YXRpb24gPSBUcnVlCiAgICAgICAgICAgIGxhYmVscyA9IFtsYWJl
95
+ bC5nZXRfdGV4dCgpIGZvciBsYWJlbCBpbiBheC5nZXRfeXRpY2tsYWJlbHMo
96
+ KV0KICAgICAgICAgICAgdmFsdWVzID0gW3JlY3QuZ2V0X3dpZHRoKCkgZm9y
97
+ IHJlY3QgaW4gY29udGFpbmVyXQogICAgICAgIGVsc2U6CiAgICAgICAgICAg
98
+ ICMgaG9yaXpvbnRhbCBiYXJzCiAgICAgICAgICAgIGxhYmVscyA9IFtsYWJl
99
+ bC5nZXRfdGV4dCgpIGZvciBsYWJlbCBpbiBheC5nZXRfeHRpY2tsYWJlbHMo
100
+ KV0KICAgICAgICAgICAgdmFsdWVzID0gaGVpZ2h0cwogICAgICAgIGZvciBs
101
+ YWJlbCwgdmFsdWUgaW4gemlwKGxhYmVscywgdmFsdWVzKToKICAgICAgICAg
102
+ ICAgZWxlbWVudCA9IHsibGFiZWwiOiBsYWJlbCwgImdyb3VwIjogY29udGFp
103
+ bmVyLmdldF9sYWJlbCgpLCAidmFsdWUiOiB2YWx1ZX0KICAgICAgICAgICAg
104
+ ZWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCgogICAgcmV0dXJuIGVsZW1lbnRz
105
+ LCBjaGFuZ2Vfb3JpZW50YXRpb24KCgpkZWYgX2V4dHJhY3RfcGllX2NoYXJ0
106
+ X2VsZW1lbnRzKGF4KToKICAgIGVsZW1lbnRzID0gW10KCiAgICB3ZWRnZXMg
107
+ PSBbcGF0Y2ggZm9yIHBhdGNoIGluIGF4LnBhdGNoZXMgaWYgaXNpbnN0YW5j
108
+ ZShwYXRjaCwgbXBsLnBhdGNoZXMuV2VkZ2UpXQogICAgaWYgbGVuKHdlZGdl
109
+ cykgPT0gMDoKICAgICAgICByZXR1cm4gZWxlbWVudHMKCiAgICB0ZXh0cyA9
110
+ IFt0ZXh0X29iai5nZXRfdGV4dCgpIGZvciB0ZXh0X29iaiBpbiBheC50ZXh0
111
+ c10KCiAgICBsYWJlbHMgPSBbXQogICAgYXV0b3BjdHMgPSBbXQoKICAgIGlm
112
+ IGxlbih0ZXh0cykgPT0gMiAqIGxlbih3ZWRnZXMpOgogICAgICAgIGxhYmVs
113
+ cyA9IFt0ZXh0c1tpXSBmb3IgaSBpbiByYW5nZSgwLCAyICogbGVuKHdlZGdl
114
+ cyksIDIpXQogICAgICAgIGF1dG9wY3RzID0gW3RleHRzW2ldIGZvciBpIGlu
115
+ IHJhbmdlKDEsIDIgKiBsZW4od2VkZ2VzKSwgMildCiAgICBlbHNlOgogICAg
116
+ ICAgIGxhYmVscyA9IHRleHRzWzogbGVuKHdlZGdlcyldCgogICAgZm9yIGlk
117
+ eCwgd2VkZ2UgaW4gZW51bWVyYXRlKHdlZGdlcyk6CiAgICAgICAgZWxlbWVu
118
+ dCA9IHsKICAgICAgICAgICAgImxhYmVsIjogbGFiZWxzW2lkeF0sCiAgICAg
119
+ ICAgICAgICJhbmdsZSI6IGFicyh3ZWRnZS50aGV0YTIgLSB3ZWRnZS50aGV0
120
+ YTEpLAogICAgICAgICAgICAicmFkaXVzIjogd2VkZ2UuciwKICAgICAgICAg
121
+ ICAgImF1dG9wY3QiOiBhdXRvcGN0c1tpZHhdIGlmIGF1dG9wY3RzIGFuZCBs
122
+ ZW4oYXV0b3BjdHMpID4gaWR4IGVsc2UgTm9uZSwKICAgICAgICB9CiAgICAg
123
+ ICAgZWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCgogICAgcmV0dXJuIGVsZW1l
124
+ bnRzCgoKIyBweWxpbnQ6IGRpc2FibGU9dG9vLW1hbnktYnJhbmNoZXMKZGVm
125
+ IF9leHRyYWN0X2JveF9jaGFydF9lbGVtZW50cyhheCk6CiAgICBjaGFuZ2Vf
126
+ b3JpZW50YXRpb24gPSBGYWxzZQoKICAgIHh0aWNrbGFiZWxzID0gW2xhYmVs
127
+ LmdldF90ZXh0KCkgZm9yIGxhYmVsIGluIGF4LmdldF94dGlja2xhYmVscygp
128
+ XQogICAgYm94ZXMgPSBbXQogICAgZm9yIGxhYmVsLCBib3ggaW4gemlwKHh0
129
+ aWNrbGFiZWxzLCBheC5wYXRjaGVzKToKICAgICAgICB2ZXJ0aWNlcyA9IGJv
130
+ eC5nZXRfcGF0aCgpLnZlcnRpY2VzCiAgICAgICAgeF92ZXJ0aWNlcyA9IGxp
131
+ c3QodmVydGljZXNbOiwgMF0pCiAgICAgICAgeV92ZXJ0aWNlcyA9IGxpc3Qo
132
+ dmVydGljZXNbOiwgMV0pCiAgICAgICAgeCA9IG1pbih4X3ZlcnRpY2VzKQog
133
+ ICAgICAgIHkgPSBtaW4oeV92ZXJ0aWNlcykKCiAgICAgICAgYm94ZXMuYXBw
134
+ ZW5kKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAieCI6IHgsCiAg
135
+ ICAgICAgICAgICAgICAieSI6IHksCiAgICAgICAgICAgICAgICAibGFiZWwi
136
+ OiBsYWJlbCwKICAgICAgICAgICAgICAgICJ3aWR0aCI6IG1heCh4X3ZlcnRp
137
+ Y2VzKSAtIHgsCiAgICAgICAgICAgICAgICAiaGVpZ2h0IjogbWF4KHlfdmVy
138
+ dGljZXMpIC0geSwKICAgICAgICAgICAgICAgICJvdXRsaWVycyI6IFtdLAog
139
+ ICAgICAgICAgICB9CiAgICAgICAgKQoKICAgIG9yaWVudGF0aW9uID0gImhv
140
+ cml6b250YWwiCiAgICBpZiBhbGwoYm94WyJoZWlnaHQiXSA9PSBib3hlc1sw
141
+ XVsiaGVpZ2h0Il0gZm9yIGJveCBpbiBib3hlcyk6CiAgICAgICAgb3JpZW50
142
+ YXRpb24gPSAidmVydGljYWwiCgogICAgaWYgb3JpZW50YXRpb24gPT0gInZl
143
+ cnRpY2FsIjoKICAgICAgICBjaGFuZ2Vfb3JpZW50YXRpb24gPSBUcnVlCiAg
144
+ ICAgICAgZm9yIGJveCBpbiBib3hlczoKICAgICAgICAgICAgYm94WyJ4Il0s
145
+ IGJveFsieSJdID0gYm94WyJ5Il0sIGJveFsieCJdCiAgICAgICAgICAgIGJv
146
+ eFsid2lkdGgiXSwgYm94WyJoZWlnaHQiXSA9IGJveFsiaGVpZ2h0Il0sIGJv
147
+ eFsid2lkdGgiXQoKICAgIGZvciBsaW5lIGluIGF4LmxpbmVzOgogICAgICAg
148
+ IHhkYXRhID0gbGluZS5nZXRfeGRhdGEoKQogICAgICAgIHlkYXRhID0gbGlu
149
+ ZS5nZXRfeWRhdGEoKQoKICAgICAgICBpZiBvcmllbnRhdGlvbiA9PSAidmVy
150
+ dGljYWwiOgogICAgICAgICAgICB4ZGF0YSwgeWRhdGEgPSB5ZGF0YSwgeGRh
151
+ dGEKCiAgICAgICAgaWYgbGVuKHhkYXRhKSA8PSAxIG9yIGxlbih5ZGF0YSkg
152
+ IT0gMjoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgZm9yIGJveCBp
153
+ biBib3hlczoKICAgICAgICAgICAgaWYgYm94WyJ4Il0gPD0geGRhdGFbMF0g
154
+ PD0geGRhdGFbMV0gPD0gYm94WyJ4Il0gKyBib3hbIndpZHRoIl06CiAgICAg
155
+ ICAgICAgICAgICAjIEhvcml6b250YWwgbGluZSAobWVkaWFuIG9yIGNhcCkK
156
+ ICAgICAgICAgICAgICAgIGlmIGFicyh5ZGF0YVswXSAtIHlkYXRhWzFdKSA8
157
+ IDAuMDAxIGFuZCBib3hbInkiXSA8PSB5ZGF0YVswXSA8PSBib3hbInkiXSAr
158
+ IGJveFsiaGVpZ2h0Il06CiAgICAgICAgICAgICAgICAgICAgYm94WyJtZWRp
159
+ YW4iXSA9IHlkYXRhWzBdCiAgICAgICAgICAgICAgICAjIFZlcnRpY2FsIGxp
160
+ bmUgKHdoaXNrZXJzKQogICAgICAgICAgICAgICAgZWxpZiBhYnMoeGRhdGFb
161
+ MF0gLSB4ZGF0YVsxXSkgPCAwLjAwMToKICAgICAgICAgICAgICAgICAgICB5
162
+ X21pbiA9IG1pbih5ZGF0YSkKICAgICAgICAgICAgICAgICAgICB5X21heCA9
163
+ IG1heCh5ZGF0YSkKCiAgICAgICAgICAgICAgICAgICAgIyBJZiBhdHRhY2hl
164
+ ZCB0byBib3R0b20gb2YgYm94CiAgICAgICAgICAgICAgICAgICAgaWYgYWJz
165
+ KHlfbWF4IC0gYm94WyJ5Il0pIDwgMC4wMDE6CiAgICAgICAgICAgICAgICAg
166
+ ICAgICAgIGJveFsid2hpc2tlcl9sb3dlciJdID0geV9taW4KCiAgICAgICAg
167
+ ICAgICAgICAgICAgIyBJZiBhdHRhY2hlZCB0byB0b3Agb2YgYm94CiAgICAg
168
+ ICAgICAgICAgICAgICAgZWxpZiBhYnMoeV9taW4gLSAoYm94WyJ5Il0gKyBi
169
+ b3hbImhlaWdodCJdKSkgPCAwLjAwMToKICAgICAgICAgICAgICAgICAgICAg
170
+ ICAgYm94WyJ3aGlza2VyX3VwcGVyIl0gPSB5X21heAogICAgICAgICAgICAg
171
+ ICAgYnJlYWsKCiAgICBvdXRsaWVyX2NhbmRpZGF0ZXMgPSBbXQoKICAgICMg
172
+ Q2hlY2sgZm9yIGFueSBtYXJrZXJzIGluIGFsbCBhcnRpc3RzCiAgICBmb3Ig
173
+ YXJ0aXN0IGluIGF4LmdldF9jaGlsZHJlbigpOgogICAgICAgIGlmIGhhc2F0
174
+ dHIoYXJ0aXN0LCAiZ2V0X3hkYXRhIikgYW5kIGhhc2F0dHIoYXJ0aXN0LCAi
175
+ Z2V0X3lkYXRhIik6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAg
176
+ IHhkYXRhID0gYXJ0aXN0LmdldF94ZGF0YSgpCiAgICAgICAgICAgICAgICB5
177
+ ZGF0YSA9IGFydGlzdC5nZXRfeWRhdGEoKQoKICAgICAgICAgICAgICAgIGlm
178
+ IG9yaWVudGF0aW9uID09ICJ2ZXJ0aWNhbCI6CiAgICAgICAgICAgICAgICAg
179
+ ICAgeGRhdGEsIHlkYXRhID0geWRhdGEsIHhkYXRhCgogICAgICAgICAgICAg
180
+ ICAgaWYgaXNpbnN0YW5jZSh4ZGF0YSwgKGxpc3QsIG5wLm5kYXJyYXkpKSBh
181
+ bmQgaXNpbnN0YW5jZSh5ZGF0YSwgKGxpc3QsIG5wLm5kYXJyYXkpKToKICAg
182
+ ICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShtaW4obGVuKHhkYXRh
183
+ KSwgbGVuKHlkYXRhKSkpOgogICAgICAgICAgICAgICAgICAgICAgICBvdXRs
184
+ aWVyX2NhbmRpZGF0ZXMuYXBwZW5kKChmbG9hdCh4ZGF0YVtpXSksIGZsb2F0
185
+ KHlkYXRhW2ldKSkpCiAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAg
186
+ ICAgIHBhc3MKCiAgICAjIEFzc2lnbiBwb2ludHMgdG8gYm94ZXMgYW5kIGRl
187
+ dGVybWluZSBpZiB0aGV5J3JlIG91dGxpZXJzCiAgICBmb3IgeCwgeSBpbiBv
188
+ dXRsaWVyX2NhbmRpZGF0ZXM6CiAgICAgICAgZm9yIGJveCBpbiBib3hlczoK
189
+ ICAgICAgICAgICAgaWYgYm94WyJ4Il0gPD0geCA8PSBib3hbIngiXSArIGJv
190
+ eFsid2lkdGgiXToKICAgICAgICAgICAgICAgIGJveF9jZW50ZXIgPSBib3hb
191
+ IngiXSArIGJveFsid2lkdGgiXSAvIDIKICAgICAgICAgICAgICAgIGlmIGFi
192
+ cyh4IC0gYm94X2NlbnRlcikgPCAwLjAwMToKICAgICAgICAgICAgICAgICAg
193
+ ICB5X21pbiA9IGJveFsieSJdCiAgICAgICAgICAgICAgICAgICAgeV9tYXgg
194
+ PSBib3hbInkiXSArIGJveFsiaGVpZ2h0Il0KICAgICAgICAgICAgICAgICAg
195
+ ICBpZiBib3guZ2V0KCJ3aGlza2VyX2xvd2VyIiwgTm9uZSk6CiAgICAgICAg
196
+ ICAgICAgICAgICAgICAgIHlfbWluID0gYm94WyJ3aGlza2VyX2xvd2VyIl0K
197
+ ICAgICAgICAgICAgICAgICAgICBpZiBib3guZ2V0KCJ3aGlza2VyX3VwcGVy
198
+ IiwgTm9uZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHlfbWF4ID0gYm94
199
+ WyJ3aGlza2VyX3VwcGVyIl0KICAgICAgICAgICAgICAgICAgICBpZiB5IDwg
200
+ eV9taW4gb3IgeSA+IHlfbWF4OgogICAgICAgICAgICAgICAgICAgICAgICBi
201
+ b3hbIm91dGxpZXJzIl0uYXBwZW5kKHkpCiAgICAgICAgICAgICAgICBicmVh
202
+ awoKICAgIHJldHVybiBbCiAgICAgICAgewogICAgICAgICAgICAibGFiZWwi
203
+ OiBib3hbImxhYmVsIl0sCiAgICAgICAgICAgICJtaW4iOiBib3guZ2V0KCJ3
204
+ aGlza2VyX2xvd2VyIiwgTm9uZSksCiAgICAgICAgICAgICJmaXJzdF9xdWFy
205
+ dGlsZSI6IGJveFsieSJdLAogICAgICAgICAgICAibWVkaWFuIjogYm94Lmdl
206
+ dCgibWVkaWFuIiwgTm9uZSksCiAgICAgICAgICAgICJ0aGlyZF9xdWFydGls
207
+ ZSI6IGJveFsieSJdICsgYm94WyJoZWlnaHQiXSwKICAgICAgICAgICAgIm1h
208
+ eCI6IGJveC5nZXQoIndoaXNrZXJfdXBwZXIiLCBOb25lKSwKICAgICAgICAg
209
+ ICAgIm91dGxpZXJzIjogYm94WyJvdXRsaWVycyJdLAogICAgICAgIH0KICAg
210
+ ICAgICBmb3IgYm94IGluIGJveGVzCiAgICBdLCBjaGFuZ2Vfb3JpZW50YXRp
211
+ b24KCgpkZWYgX3NhdmVfZmlndXJlX2FzX2Jhc2U2NChmaWcsIGJib3hfaW5j
212
+ aGVzPSJ0aWdodCIsIGRwaT0xMDApOgogICAgIyBGaXJzdCBzYXZlIHdpdGgg
213
+ bWF0cGxvdGxpYgogICAgcG5nX2J1ZmZlciA9IGlvLkJ5dGVzSU8oKQogICAg
214
+ ZmlnLnNhdmVmaWcocG5nX2J1ZmZlciwgZm9ybWF0PSJwbmciLCBiYm94X2lu
215
+ Y2hlcz1iYm94X2luY2hlcywgZHBpPWRwaSkKICAgIHBuZ19idWZmZXIuc2Vl
216
+ aygwKQoKICAgICMgT3BlbiB3aXRoIFBJTCBhbmQgYXBwbHkgbWF4aW11bSBj
217
+ b21wcmVzc2lvbgogICAgd2l0aCBwaWxfaW1nLm9wZW4ocG5nX2J1ZmZlcikg
218
+ YXMgaW1nOgogICAgICAgIG9wdGltaXplZF9idWZmZXIgPSBpby5CeXRlc0lP
219
+ KCkKICAgICAgICBpbWcuc2F2ZShvcHRpbWl6ZWRfYnVmZmVyLCBmb3JtYXQ9
220
+ InBuZyIsIG9wdGltaXplPVRydWUsIHF1YWxpdHk9MTAwLCBjb21wcmVzc19s
221
+ ZXZlbD05KQogICAgICAgIG9wdGltaXplZF9idWZmZXIuc2VlaygwKQogICAg
222
+ ICAgIHJldHVybiBiYXNlNjQuYjY0ZW5jb2RlKG9wdGltaXplZF9idWZmZXIu
223
+ Z2V0dmFsdWUoKSkuZGVjb2RlKCJ1dGYtOCIpCgoKZGVmIF9nZXRfZmlndXJl
224
+ X2hhc2goZmlnKToKICAgIHBuZ19idWZmZXIgPSBpby5CeXRlc0lPKCkKICAg
225
+ IGZpZy5zYXZlZmlnKHBuZ19idWZmZXIsIGZvcm1hdD0icG5nIiwgZHBpPTUw
226
+ KQogICAgcmV0dXJuIGhhc2hsaWIubWQ1KHBuZ19idWZmZXIuZ2V0dmFsdWUo
227
+ KSkuaGV4ZGlnZXN0KCkKCgpkZWYgX2dldF9jaGFydF90eXBlKGF4KToKICAg
228
+ IG9iamVjdHMgPSBsaXN0KAogICAgICAgIGZpbHRlcigKICAgICAgICAgICAg
229
+ bGFtYmRhIG9iajogbm90IGlzaW5zdGFuY2Uob2JqLCBtcGwudGV4dC5UZXh0
230
+ KSBhbmQgbm90IGlzaW5zdGFuY2Uob2JqLCBtcGwucGF0Y2hlcy5TaGFkb3cp
231
+ LAogICAgICAgICAgICBheC5fY2hpbGRyZW4sICAjIHB5bGludDogZGlzYWJs
232
+ ZT1wcm90ZWN0ZWQtYWNjZXNzCiAgICAgICAgKQogICAgKQoKICAgICMgQ2hl
233
+ Y2sgZm9yIExpbmUgcGxvdHMKICAgIGlmIGFsbChpc2luc3RhbmNlKGxpbmUs
234
+ IG1wbC5saW5lcy5MaW5lMkQpIGZvciBsaW5lIGluIG9iamVjdHMpOgogICAg
235
+ ICAgIHJldHVybiAibGluZSIKCiAgICBpZiBhbGwoaXNpbnN0YW5jZShib3hf
236
+ b3JfcGF0aCwgKG1wbC5wYXRjaGVzLlBhdGhQYXRjaCwgbXBsLmxpbmVzLkxp
237
+ bmUyRCkpIGZvciBib3hfb3JfcGF0aCBpbiBvYmplY3RzKToKICAgICAgICBy
238
+ ZXR1cm4gImJveF9hbmRfd2hpc2tlciIKCiAgICBmaWx0ZXJlZCA9IFtdCiAg
239
+ ICBmb3Igb2JqIGluIG9iamVjdHM6CiAgICAgICAgaWYgaXNpbnN0YW5jZShv
240
+ YmosIG1wbC5saW5lcy5MaW5lMkQpIGFuZCBfaXNfZ3JpZF9saW5lKG9iaik6
241
+ CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZmlsdGVyZWQuYXBwZW5k
242
+ KG9iaikKCiAgICBvYmplY3RzID0gZmlsdGVyZWQKCiAgICAjIENoZWNrIGZv
243
+ ciBTY2F0dGVyIHBsb3RzCiAgICBpZiBhbGwoaXNpbnN0YW5jZShwYXRoLCBt
244
+ cGwuY29sbGVjdGlvbnMuUGF0aENvbGxlY3Rpb24pIGZvciBwYXRoIGluIG9i
245
+ amVjdHMpOgogICAgICAgIHJldHVybiAic2NhdHRlciIKCiAgICAjIENoZWNr
246
+ IGZvciBCYXIgcGxvdHMKICAgIGlmIGFsbChpc2luc3RhbmNlKHJlY3QsIG1w
247
+ bC5wYXRjaGVzLlJlY3RhbmdsZSkgZm9yIHJlY3QgaW4gb2JqZWN0cyk6CiAg
248
+ ICAgICAgcmV0dXJuICJiYXIiCgogICAgIyBDaGVjayBmb3IgUGllIHBsb3Rz
249
+ CiAgICBpZiBhbGwoaXNpbnN0YW5jZShhcnRpc3QsIG1wbC5wYXRjaGVzLldl
250
+ ZGdlKSBmb3IgYXJ0aXN0IGluIG9iamVjdHMpOgogICAgICAgIHJldHVybiAi
251
+ cGllIgoKICAgIHJldHVybiAidW5rbm93biIKCgpkZWYgX2lzX2F1dG9fZW1w
252
+ dHlfYXhpcyhheCk6CiAgICByZXR1cm4gYXguZ2V0X3N1YnBsb3RzcGVjKCkg
253
+ aXMgbm90IE5vbmUgYW5kIG5vdCBheC5oYXNfZGF0YSgpCgoKZGVmIF9pc19j
254
+ b2xvcmJhcl9heGlzKGF4KToKICAgIHJldHVybiBhbnkoCiAgICAgICAgIyBw
255
+ eWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwogICAgICAgIGlzaW5z
256
+ dGFuY2UoY2hpbGQsIG1wbC5jb2xvcmJhci5fQ29sb3JiYXJTcGluZSkKICAg
257
+ ICAgICBmb3IgY2hpbGQgaW4gYXguZ2V0X2NoaWxkcmVuKCkKICAgICkKCgpk
258
+ ZWYgX2ZpbHRlcl9vdXRfdW53YW50ZWRfYXhlcyhheGVzKToKICAgIHJldHVy
259
+ biBbYXggZm9yIGF4IGluIGF4ZXMgaWYgbm90IF9pc19hdXRvX2VtcHR5X2F4
260
+ aXMoYXgpIGFuZCBub3QgX2lzX2NvbG9yYmFyX2F4aXMoYXgpXQoKCmRlZiBf
261
+ ZXh0cmFjdF90aWNrc19kYXRhKGNvbnZlcnRlcjogYW55LCB0aWNrczogYW55
262
+ KSAtPiBsaXN0OgogICAgaWYgaXNpbnN0YW5jZShjb252ZXJ0ZXIsIG1wbC5k
263
+ YXRlcy5fU3dpdGNoYWJsZURhdGVDb252ZXJ0ZXIpOiAgIyBweWxpbnQ6IGRp
264
+ c2FibGU9cHJvdGVjdGVkLWFjY2VzcwogICAgICAgIHJldHVybiBbbXBsLmRh
265
+ dGVzLm51bTJkYXRlKHRpY2spLmlzb2Zvcm1hdCgpIGZvciB0aWNrIGluIHRp
266
+ Y2tzXQogICAgdHJ5OgogICAgICAgIHJldHVybiBbZmxvYXQodGljaykgZm9y
267
+ IHRpY2sgaW4gdGlja3NdCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAg
268
+ IHJldHVybiBsaXN0KHRpY2tzKQoKCmRlZiBfZXh0cmFjdF9zY2FsZShjb252
269
+ ZXJ0ZXIsIHNjYWxlOiBzdHIsIHRpY2tzLCBsYWJlbHMpIC0+IHN0cjoKICAg
270
+ IGlmIGlzaW5zdGFuY2UoY29udmVydGVyLCBtcGwuZGF0ZXMuX1N3aXRjaGFi
271
+ bGVEYXRlQ29udmVydGVyKTogICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3Rl
272
+ ZC1hY2Nlc3MKICAgICAgICByZXR1cm4gImRhdGV0aW1lIgoKICAgICMgSWYg
273
+ dGhlIHNjYWxlIGlzIG5vdCBsaW5lYXIsIGl0IGNhbid0IGJlIGNhdGVnb3Jp
274
+ Y2FsCiAgICBpZiBzY2FsZSAhPSAibGluZWFyIjoKICAgICAgICByZXR1cm4g
275
+ c2NhbGUKCiAgICAjIElmIGFsbCB0aGUgdGlja3MgYXJlIGludGVnZXJzIGFu
276
+ ZCBhcmUgaW4gb3JkZXIgZnJvbSAwIHRvIG4tMQogICAgIyBhbmQgdGhlIGxh
277
+ YmVscyBhcmVuJ3QgY29ycmVzcG9uZGluZyB0byB0aGUgdGlja3MsIGl0J3Mg
278
+ Y2F0ZWdvcmljYWwKICAgIGZvciBpLCB0aWNrX2FuZF9sYWJlbCBpbiBlbnVt
279
+ ZXJhdGUoemlwKHRpY2tzLCBsYWJlbHMpKToKICAgICAgICB0aWNrLCBsYWJl
280
+ bCA9IHRpY2tfYW5kX2xhYmVsCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0aWNr
281
+ LCAoaW50LCBmbG9hdCkpIGFuZCB0aWNrID09IGkgYW5kIHN0cihpKSAhPSBs
282
+ YWJlbDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICAjIEZvdW5kIGEg
283
+ dGljaywgd2hpY2ggd291bGRuJ3QgYmUgaW4gYSBjYXRlZ29yaWNhbCBzY2Fs
284
+ ZQogICAgICAgIHJldHVybiAibGluZWFyIgoKICAgIHJldHVybiAiY2F0ZWdv
285
+ cmljYWwiCgoKZGVmIF9leHRyYWN0X2NoYXJ0X2RhdGEoYXgpOgogICAgZGF0
286
+ YSA9IHt9CgogICAgZGF0YVsidGl0bGUiXSA9IGF4LmdldF90aXRsZSgpCgog
287
+ ICAgZGF0YVsieF9sYWJlbCJdID0gYXguZ2V0X3hsYWJlbCgpCiAgICBkYXRh
288
+ WyJ5X2xhYmVsIl0gPSBheC5nZXRfeWxhYmVsKCkKCiAgICB4X3RpY2tfbGFi
289
+ ZWxzID0gW2xhYmVsLmdldF90ZXh0KCkgZm9yIGxhYmVsIGluIGF4LmdldF94
290
+ dGlja2xhYmVscygpXQogICAgZGF0YVsieF90aWNrcyJdID0gX2V4dHJhY3Rf
291
+ dGlja3NfZGF0YShheC54YXhpcy5nZXRfY29udmVydGVyKCksIGF4LmdldF94
292
+ dGlja3MoKSkKICAgIGRhdGFbInhfdGlja19sYWJlbHMiXSA9IHhfdGlja19s
293
+ YWJlbHMKICAgIGRhdGFbInhfc2NhbGUiXSA9IF9leHRyYWN0X3NjYWxlKGF4
294
+ LnhheGlzLmdldF9jb252ZXJ0ZXIoKSwgYXguZ2V0X3hzY2FsZSgpLCBheC5n
295
+ ZXRfeHRpY2tzKCksIHhfdGlja19sYWJlbHMpCgogICAgeV90aWNrX2xhYmVs
296
+ cyA9IFtsYWJlbC5nZXRfdGV4dCgpIGZvciBsYWJlbCBpbiBheC5nZXRfeXRp
297
+ Y2tsYWJlbHMoKV0KICAgIGRhdGFbInlfdGlja3MiXSA9IF9leHRyYWN0X3Rp
298
+ Y2tzX2RhdGEoYXgueWF4aXMuZ2V0X2NvbnZlcnRlcigpLCBheC5nZXRfeXRp
299
+ Y2tzKCkpCiAgICBkYXRhWyJ5X3RpY2tfbGFiZWxzIl0gPSB5X3RpY2tfbGFi
300
+ ZWxzCiAgICBkYXRhWyJ5X3NjYWxlIl0gPSBfZXh0cmFjdF9zY2FsZShheC55
301
+ YXhpcy5nZXRfY29udmVydGVyKCksIGF4LmdldF95c2NhbGUoKSwgYXguZ2V0
302
+ X3l0aWNrcygpLCB5X3RpY2tfbGFiZWxzKQoKICAgIGNoYXJ0X3R5cGUgPSBf
303
+ Z2V0X2NoYXJ0X3R5cGUoYXgpCiAgICBlbGVtZW50cyA9IFtdCiAgICBjaGFu
304
+ Z2Vfb3JpZW50YXRpb24gPSBGYWxzZQoKICAgIGlmIGNoYXJ0X3R5cGUgPT0g
305
+ ImxpbmUiOgogICAgICAgIGVsZW1lbnRzID0gX2V4dHJhY3RfbGluZV9jaGFy
306
+ dF9lbGVtZW50cyhheCkKICAgIGVsaWYgY2hhcnRfdHlwZSA9PSAic2NhdHRl
307
+ ciI6CiAgICAgICAgZWxlbWVudHMgPSBfZXh0cmFjdF9zY2F0dGVyX2NoYXJ0
308
+ X2VsZW1lbnRzKGF4KQogICAgZWxpZiBjaGFydF90eXBlID09ICJiYXIiOgog
309
+ ICAgICAgIGVsZW1lbnRzLCBjaGFuZ2Vfb3JpZW50YXRpb24gPSBfZXh0cmFj
310
+ dF9iYXJfY2hhcnRfZWxlbWVudHMoYXgpCiAgICBlbGlmIGNoYXJ0X3R5cGUg
311
+ PT0gImJveF9hbmRfd2hpc2tlciI6CiAgICAgICAgZWxlbWVudHMsIGNoYW5n
312
+ ZV9vcmllbnRhdGlvbiA9IF9leHRyYWN0X2JveF9jaGFydF9lbGVtZW50cyhh
313
+ eCkKICAgIGVsaWYgY2hhcnRfdHlwZSA9PSAicGllIjoKICAgICAgICBlbGVt
314
+ ZW50cyA9IF9leHRyYWN0X3BpZV9jaGFydF9lbGVtZW50cyhheCkKCiAgICBp
315
+ ZiBjaGFuZ2Vfb3JpZW50YXRpb246CiAgICAgICAgZGF0YVsieF9sYWJlbCJd
316
+ LCBkYXRhWyJ5X2xhYmVsIl0gPSBkYXRhWyJ5X2xhYmVsIl0sIGRhdGFbInhf
317
+ bGFiZWwiXQoKICAgIGRhdGFbInR5cGUiXSA9IGNoYXJ0X3R5cGUKICAgIGRh
318
+ dGFbImVsZW1lbnRzIl0gPSBlbGVtZW50cwoKICAgIHJldHVybiBkYXRhCgoK
319
+ ZGVmIF9jdXN0b21fanNvbl9zZXJpYWxpemVyKG9iaik6CiAgICBpZiBpc2lu
320
+ c3RhbmNlKG9iaiwgbnAuaW50ZWdlcik6CiAgICAgICAgcmV0dXJuIGludChv
321
+ YmopCiAgICBpZiBpc2luc3RhbmNlKG9iaiwgbnAuZmxvYXRpbmcpOgogICAg
322
+ ICAgIHJldHVybiBmbG9hdChvYmopCiAgICBpZiBpc2luc3RhbmNlKG9iaiwg
323
+ bnAubmRhcnJheSk6CiAgICAgICAgcmV0dXJuIG9iai50b2xpc3QoKQogICAg
324
+ aWYgaXNpbnN0YW5jZShvYmosIHNldCk6CiAgICAgICAgcmV0dXJuIGxpc3Qo
325
+ b2JqKQogICAgcmFpc2UgVHlwZUVycm9yKGYiVHlwZSB7dHlwZShvYmopfSBu
326
+ b3Qgc2VyaWFsaXphYmxlIikKCgpkZWYgZXh0cmFjdF9hbmRfcHJpbnRfZmln
327
+ dXJlX21ldGFkYXRhKGZpZyk6CiAgICAiIiJFeHRyYWN0IG1ldGFkYXRhIGZy
328
+ b20gYSBtYXRwbG90bGliIGZpZ3VyZSBhbmQgcHJpbnQgYXMgSlNPTiIiIgog
329
+ ICAgbWV0YWRhdGEgPSB7fQogICAgc3VicGxvdHMgPSBbXQoKICAgIGF4ZXMg
330
+ PSBfZmlsdGVyX291dF91bndhbnRlZF9heGVzKGZpZy5heGVzKQoKICAgIGZv
331
+ ciBheCBpbiBheGVzOgogICAgICAgIGRhdGEgPSBfZXh0cmFjdF9jaGFydF9k
332
+ YXRhKGF4KQogICAgICAgIHN1YnBsb3RzLmFwcGVuZChkYXRhKQoKICAgIGlm
333
+ IGxlbihzdWJwbG90cykgPiAxOgogICAgICAgIG1ldGFkYXRhID0gewogICAg
334
+ ICAgICAgICAidGl0bGUiOiBmaWcudGV4dHNbMF0uZ2V0X3RleHQoKSBpZiBm
335
+ aWcudGV4dHMgYW5kIGxlbihmaWcudGV4dHMpID4gMCBlbHNlIE5vbmUsCiAg
336
+ ICAgICAgICAgICJ0eXBlIjogImNvbXBvc2l0ZV9jaGFydCIsCiAgICAgICAg
337
+ ICAgICJlbGVtZW50cyI6IHN1YnBsb3RzLAogICAgICAgIH0KICAgIGVsc2U6
338
+ CiAgICAgICAgbWV0YWRhdGEgPSBzdWJwbG90c1swXSBpZiBzdWJwbG90cyBh
339
+ bmQgbGVuKHN1YnBsb3RzKSA+IDAgZWxzZSB7InR5cGUiOiAidW5rbm93biJ9
340
+ CgogICAgbWV0YWRhdGFbInBuZyJdID0gX3NhdmVfZmlndXJlX2FzX2Jhc2U2
341
+ NChmaWcpCiAgICBqc29uX291dHB1dCA9IHsidHlwZSI6ICJjaGFydCIsICJ2
342
+ YWx1ZSI6IG1ldGFkYXRhfQoKICAgIHByaW50KGYiZHRuX2FydGlmYWN0X2sz
343
+ OWZkMjp7anNvbi5kdW1wcyhqc29uX291dHB1dCwgZGVmYXVsdD1fY3VzdG9t
344
+ X2pzb25fc2VyaWFsaXplcil9IikKCgpjbGFzcyBNYXRwbG90bGliRmluZGVy
345
+ KE1ldGFQYXRoRmluZGVyKToKICAgICIiIkN1c3RvbSBmaW5kZXIgdG8gaW50
346
+ ZXJjZXB0IG1hdHBsb3RsaWIucHlwbG90IGltcG9ydHMiIiIKCiAgICBkZWYg
347
+ ZmluZF9zcGVjKHNlbGYsIGZ1bGxuYW1lLCBwYXRoLCB0YXJnZXQ9Tm9uZSk6
348
+ ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKICAgICAgICBn
349
+ bG9iYWwgcGx0X3BhdGNoZWQsIG5wLCBtcGwsIHBpbF9pbWcgICMgcHlsaW50
350
+ OiBkaXNhYmxlPWdsb2JhbC1zdGF0ZW1lbnQKICAgICAgICBpZiBmdWxsbmFt
351
+ ZSA9PSAibWF0cGxvdGxpYi5weXBsb3QiIGFuZCBub3QgcGx0X3BhdGNoZWQ6
352
+ CiAgICAgICAgICAgIHBsdF9wYXRjaGVkID0gVHJ1ZQoKICAgICAgICAgICAg
353
+ IyBJbXBvcnQgbnVtcHkgYW5kIG1hdHBsb3RsaWIgb25jZSB3ZSBhcmUgc3Vy
354
+ ZSB3ZSBuZWVkIHRoZW0KICAgICAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9
355
+ aW1wb3J0LW91dHNpZGUtdG9wbGV2ZWwKICAgICAgICAgICAgaW1wb3J0IG1h
356
+ dHBsb3RsaWIKICAgICAgICAgICAgaW1wb3J0IG51bXB5CiAgICAgICAgICAg
357
+ IGZyb20gUElMIGltcG9ydCBJbWFnZQoKICAgICAgICAgICAgIyBTdG9yZSB0
358
+ aGVtIGluIGdsb2JhbCB2YXJpYWJsZXMgZm9yIHVzZSB0aHJvdWdob3V0IHRo
359
+ ZSBtb2R1bGUKICAgICAgICAgICAgbnAgPSBudW1weQogICAgICAgICAgICBt
360
+ cGwgPSBtYXRwbG90bGliCiAgICAgICAgICAgIHBpbF9pbWcgPSBJbWFnZQoK
361
+ ICAgICAgICAgICAgb3JpZ2luYWxfc3BlYyA9IGZpbmRfc3BlYyhmdWxsbmFt
362
+ ZSkKICAgICAgICAgICAgaWYgb3JpZ2luYWxfc3BlYyBpcyBOb25lOgogICAg
363
+ ICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgcmV0dXJuIHNw
364
+ ZWNfZnJvbV9sb2FkZXIoCiAgICAgICAgICAgICAgICBmdWxsbmFtZSwKICAg
365
+ ICAgICAgICAgICAgIE1hdHBsb3RsaWJMb2FkZXIob3JpZ2luYWxfc3BlYy5s
366
+ b2FkZXIpLAogICAgICAgICAgICAgICAgb3JpZ2luPW9yaWdpbmFsX3NwZWMu
367
+ b3JpZ2luLAogICAgICAgICAgICAgICAgaXNfcGFja2FnZT1vcmlnaW5hbF9z
368
+ cGVjLnN1Ym1vZHVsZV9zZWFyY2hfbG9jYXRpb25zIGlzIG5vdCBOb25lLAog
369
+ ICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIE5vbmUKCgpjbGFzcyBNYXRw
370
+ bG90bGliTG9hZGVyKExvYWRlcik6CiAgICAiIiJDdXN0b20gbG9hZGVyIHRv
371
+ IHBhdGNoIHRoZSBtYXRwbG90bGliLnB5cGxvdCBtb2R1bGUiIiIKCiAgICBk
372
+ ZWYgX19pbml0X18oc2VsZiwgb3JpZ2luYWxfbG9hZGVyKToKICAgICAgICBz
373
+ ZWxmLm9yaWdpbmFsX2xvYWRlciA9IG9yaWdpbmFsX2xvYWRlcgoKICAgIGRl
374
+ ZiBjcmVhdGVfbW9kdWxlKHNlbGYsIHNwZWMpOgogICAgICAgIHJldHVybiBz
375
+ ZWxmLm9yaWdpbmFsX2xvYWRlci5jcmVhdGVfbW9kdWxlKHNwZWMpCgogICAg
376
+ ZGVmIGV4ZWNfbW9kdWxlKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgc2VsZi5v
377
+ cmlnaW5hbF9sb2FkZXIuZXhlY19tb2R1bGUobW9kdWxlKQogICAgICAgIGlm
378
+ IGhhc2F0dHIobW9kdWxlLCAic2hvdyIpOgogICAgICAgICAgICBvcmlnaW5h
379
+ bF9zaG93ID0gbW9kdWxlLnNob3cKCiAgICAgICAgICAgIGRlZiBjdXN0b21f
380
+ c2hvdygqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICAgICAgZ2xvYmFs
381
+ IHByb2Nlc3NlZF9maWd1cmVzICAjIHB5bGludDogZGlzYWJsZT1nbG9iYWwt
382
+ dmFyaWFibGUtbm90LWFzc2lnbmVkCiAgICAgICAgICAgICAgICBmaWdfbnVt
383
+ cyA9IG1vZHVsZS5nZXRfZmlnbnVtcygpCiAgICAgICAgICAgICAgICBmb3Ig
384
+ ZmlnX251bSBpbiBmaWdfbnVtczoKICAgICAgICAgICAgICAgICAgICBmaWcg
385
+ PSBtb2R1bGUuZmlndXJlKGZpZ19udW0pCiAgICAgICAgICAgICAgICAgICAg
386
+ ZmlnX2hhc2ggPSBfZ2V0X2ZpZ3VyZV9oYXNoKGZpZykKICAgICAgICAgICAg
387
+ ICAgICAgICBpZiBmaWdfaGFzaCBub3QgaW4gcHJvY2Vzc2VkX2ZpZ3VyZXM6
388
+ CiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RfYW5kX3ByaW50X2Zp
389
+ Z3VyZV9tZXRhZGF0YShmaWcpCiAgICAgICAgICAgICAgICAgICAgICAgIHBy
390
+ b2Nlc3NlZF9maWd1cmVzLmFkZChmaWdfaGFzaCkKICAgICAgICAgICAgICAg
391
+ IHJlc3VsdCA9IG9yaWdpbmFsX3Nob3coKmFyZ3MsICoqa3dhcmdzKQogICAg
392
+ ICAgICAgICAgICAgbW9kdWxlLmNsb3NlKCJhbGwiKQogICAgICAgICAgICAg
393
+ ICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICAgICAgbW9kdWxlLnNob3cgPSBj
394
+ dXN0b21fc2hvdwoKCmRlZiBzZXR1cF91c2VyX2NvZGVfZW52aXJvbm1lbnQo
395
+ Y29kZSk6CiAgICAiIiJTZXQgdXAgdGhlIG1vZHVsZSB0byBydW4gdXNlciBj
396
+ b2RlIGluIiIiCiAgICBtb2R1bGUgPSB0eXBlcy5Nb2R1bGVUeXBlKCJfX21h
397
+ aW5fXyIpCiAgICBtb2R1bGUuX19maWxlX18gPSAiPHRhcmdldF9jb2RlPiIK
398
+ ICAgIHN5cy5tb2R1bGVzWyJfX21haW5fXyJdID0gbW9kdWxlCiAgICBjb2Rl
399
+ X2xpbmVzID0gY29kZS5zcGxpdGxpbmVzKCkKICAgIGxpbmVjYWNoZS5jYWNo
400
+ ZVsiPHRhcmdldF9jb2RlPiJdID0gKGxlbihjb2RlKSwgTm9uZSwgY29kZV9s
401
+ aW5lcywgIjx0YXJnZXRfY29kZT4iKQogICAgcmV0dXJuIG1vZHVsZQoKCmRl
402
+ ZiBydW5fdXNlcl9jb2RlKGNvZGUpOgogICAgIiIiUnVuIHRoZSB1c2VyIGNv
403
+ ZGUgd2l0aCB0aGUgbWF0cGxvdGxpYiBpbnRlcmNlcHRvciBpbnN0YWxsZWQi
404
+ IiIKICAgICMgSW5zdGFsbCBtYXRwbG90bGliIGludGVyY2VwdG9yCiAgICBz
405
+ eXMubWV0YV9wYXRoLmluc2VydCgwLCBNYXRwbG90bGliRmluZGVyKCkpCgog
406
+ ICAgIyBTZXQgdXAgY2xlYW4gZW52aXJvbm1lbnQgZm9yIHVzZXIgY29kZQog
407
+ ICAgbW9kdWxlID0gc2V0dXBfdXNlcl9jb2RlX2Vudmlyb25tZW50KGNvZGUp
408
+ CgogICAgIyBDb21waWxlIGFuZCBydW4gdGhlIGNvZGUKICAgIGNvbXBpbGVk
409
+ ID0gY29tcGlsZShjb2RlLCAiPHRhcmdldF9jb2RlPiIsICJleGVjIikKCiAg
410
+ ICAjIEV4ZWN1dGUgaW4gdGhlIG1vZHVsZSdzIG5hbWVzcGFjZQogICAgZXhl
411
+ Yyhjb21waWxlZCwgbW9kdWxlLl9fZGljdF9fKSAgIyBweWxpbnQ6IGRpc2Fi
412
+ bGU9ZXhlYy11c2VkCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAg
413
+ IHRyeToKICAgICAgICAjIEdldCB0aGUgZW5jb2RlZCB1c2VyIGNvZGUKICAg
414
+ ICAgICB1c2VyX2NvZGUgPSBiYXNlNjQuYjY0ZGVjb2RlKCIiIntlbmNvZGVk
415
+ X2NvZGV9IiIiKS5kZWNvZGUoKQoKICAgICAgICAjIFJ1biB0aGUgY29kZQog
416
+ ICAgICAgIHJ1bl91c2VyX2NvZGUodXNlcl9jb2RlKQogICAgZXhjZXB0IEV4
417
+ Y2VwdGlvbjoKICAgICAgICAjIFByaW50IG9ubHkgdGhlIHJlbGV2YW50IHBh
418
+ cnRzIG9mIHRoZSB0cmFjZWJhY2sKICAgICAgICBleGNfdHlwZSwgZXhjX3Zh
419
+ bHVlLCBleGNfdGIgPSBzeXMuZXhjX2luZm8oKQoKICAgICAgICAjIEZpbHRl
420
+ ciB0cmFjZWJhY2sgdG8gb25seSBzaG93IHVzZXIgY29kZSBmcmFtZXMKICAg
421
+ ICAgICBmaWx0ZXJlZF90YiA9IFtdCiAgICAgICAgdGIgPSBleGNfdGIKICAg
422
+ ICAgICB3aGlsZSB0YiBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgdGIu
423
+ dGJfZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lID09ICI8dGFyZ2V0X2NvZGU+
424
+ IjoKICAgICAgICAgICAgICAgIGZpbHRlcmVkX3RiLmFwcGVuZCh0YikKICAg
425
+ ICAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CgogICAgICAgIGlmIGZpbHRlcmVk
426
+ X3RiOgogICAgICAgICAgICAjIENyZWF0ZSBhIG5ldyB0cmFjZWJhY2sgZnJv
427
+ bSB0aGUgZmlsdGVyZWQgZnJhbWVzCiAgICAgICAgICAgIGV4Y192YWx1ZS5f
428
+ X3RyYWNlYmFja19fID0gZmlsdGVyZWRfdGJbLTFdCiAgICAgICAgICAgIHRy
429
+ YWNlYmFjay5wcmludF9leGNlcHRpb24oZXhjX3R5cGUsIGV4Y192YWx1ZSwg
430
+ ZXhjX3ZhbHVlLl9fdHJhY2ViYWNrX18pCiAgICAgICAgZWxzZToKICAgICAg
431
+ ICAgICAgIyBGYWxsYmFjayBpZiBubyB1c2VyIGNvZGUgZnJhbWVzIGZvdW5k
432
+ IC0gcmFpc2UgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiB0eXBlCiAgICAgICAg
433
+ ICAgICMgd2l0aCB0aGUgb3JpZ2luYWwgbWVzc2FnZSBidXQgY3JlYXRlIGEg
434
+ ZnJlc2ggdHJhY2ViYWNrCiAgICAgICAgICAgIHJhaXNlIGV4Y190eXBlKHN0
435
+ cihleGNfdmFsdWUpKSBmcm9tIE5vbmUKCiAgICAgICAgc3lzLmV4aXQoMSkK
436
+ BASE64
437
+ private_constant :PYTHON_CODE_WRAPPER
438
+ end
439
+ end