kie-ruby 0.1.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 (51) hide show
  1. checksums.yaml +7 -0
  2. data/.claude/agents/project-environment-setup.md +149 -0
  3. data/.claude/commands/soba/implement.md +93 -0
  4. data/.claude/commands/soba/plan.md +98 -0
  5. data/.claude/commands/soba/review.md +91 -0
  6. data/.claude/commands/soba/revise.md +79 -0
  7. data/.devcontainer/LICENSE +21 -0
  8. data/.devcontainer/README.md +85 -0
  9. data/.devcontainer/bin/devcontainer-common.sh +36 -0
  10. data/.devcontainer/bin/down +55 -0
  11. data/.devcontainer/bin/init +159 -0
  12. data/.devcontainer/bin/rebuild +10 -0
  13. data/.devcontainer/bin/up +11 -0
  14. data/.devcontainer/compose.yaml +12 -0
  15. data/.devcontainer/compose.yaml.template +8 -0
  16. data/.devcontainer/devcontainer.json +30 -0
  17. data/.devcontainer/devcontainer.local.json +3 -0
  18. data/.devcontainer/scripts/setup.sh +12 -0
  19. data/.lefthook/rubocop-autofix.sh +51 -0
  20. data/.soba/config.yml +78 -0
  21. data/CHANGELOG.md +23 -0
  22. data/CLAUDE.md +20 -0
  23. data/LICENSE +21 -0
  24. data/README.md +310 -0
  25. data/Rakefile +12 -0
  26. data/docs/business/INDEX.md +3 -0
  27. data/docs/business/overview.md +35 -0
  28. data/docs/development/INDEX.md +3 -0
  29. data/docs/development/technical-design.md +77 -0
  30. data/docs/document_system.md +58 -0
  31. data/lefthook.yml +8 -0
  32. data/lib/kie/client.rb +36 -0
  33. data/lib/kie/errors.rb +43 -0
  34. data/lib/kie/general_engine.rb +56 -0
  35. data/lib/kie/general_task.rb +106 -0
  36. data/lib/kie/middleware/raise_error.rb +46 -0
  37. data/lib/kie/model_definition.rb +10 -0
  38. data/lib/kie/model_registry.rb +36 -0
  39. data/lib/kie/models/nano_banana_pro.rb +17 -0
  40. data/lib/kie/models/suno_v4.rb +14 -0
  41. data/lib/kie/models/suno_v4_5.rb +14 -0
  42. data/lib/kie/models/suno_v4_5_all.rb +14 -0
  43. data/lib/kie/models/suno_v4_5_plus.rb +14 -0
  44. data/lib/kie/models/suno_v5.rb +14 -0
  45. data/lib/kie/suno_engine.rb +129 -0
  46. data/lib/kie/suno_task.rb +99 -0
  47. data/lib/kie/task.rb +69 -0
  48. data/lib/kie/version.rb +5 -0
  49. data/lib/kie.rb +26 -0
  50. data/sig/kie.rbs +6 -0
  51. metadata +110 -0
@@ -0,0 +1,55 @@
1
+ #!/bin/bash
2
+
3
+ echo "Stopping devcontainer..."
4
+
5
+ # Get the directory where this script is located
6
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
+ ENV_FILE="$SCRIPT_DIR/../.env"
8
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
9
+ PROJECT_NAME="$(basename "$PROJECT_ROOT")"
10
+
11
+ # Load COMPOSE_PROJECT_NAME from .env file
12
+ if [ -f "$ENV_FILE" ]; then
13
+ # Source the .env file to get COMPOSE_PROJECT_NAME
14
+ export $(grep -E '^COMPOSE_PROJECT_NAME=' "$ENV_FILE" | xargs)
15
+ fi
16
+
17
+ # Use COMPOSE_PROJECT_NAME from .env or fallback to directory name with _devcontainer suffix
18
+ if [ -z "$COMPOSE_PROJECT_NAME" ]; then
19
+ COMPOSE_PROJECT_NAME="${PROJECT_NAME}_devcontainer"
20
+ echo "Warning: COMPOSE_PROJECT_NAME not found in .env, using default: $COMPOSE_PROJECT_NAME"
21
+ fi
22
+
23
+ echo "Compose project name: $COMPOSE_PROJECT_NAME"
24
+
25
+ # Stop containers managed by docker compose if compose files exist
26
+ cd .devcontainer 2>/dev/null || true
27
+ if [ -f "compose.yaml" ] || [ -f "compose.yml" ]; then
28
+ if [ -f "compose.yaml" ]; then
29
+ echo "Running docker compose down..."
30
+ docker compose --env-file .env -f compose.yaml down
31
+ elif [ -f "compose.yml" ]; then
32
+ echo "Running docker compose down..."
33
+ docker compose --env-file .env -f compose.yml down
34
+ fi
35
+ else
36
+ echo "No compose file found, skipping docker compose down"
37
+ fi
38
+ cd - >/dev/null 2>&1 || true
39
+
40
+ # Stop containers by project name (regardless of compose file existence)
41
+ echo "Searching for containers with project name: $PROJECT_NAME"
42
+ CONTAINER_IDS=$(docker ps -q --filter "name=${PROJECT_NAME}")
43
+
44
+ if [ -n "$CONTAINER_IDS" ]; then
45
+ echo "Found containers to stop:"
46
+ docker ps --filter "name=${PROJECT_NAME}" --format "table {{.Names}}\t{{.Status}}"
47
+ echo ""
48
+ echo "Stopping containers..."
49
+ docker stop $CONTAINER_IDS
50
+ echo "Containers stopped."
51
+ else
52
+ echo "No running containers found with project name: $PROJECT_NAME"
53
+ fi
54
+
55
+ echo "Devcontainer cleanup completed."
@@ -0,0 +1,159 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ DEVCONTAINER_DIR="$(dirname "$SCRIPT_DIR")"
7
+ PROJECT_ROOT="$(dirname "$DEVCONTAINER_DIR")"
8
+
9
+ # Colors for output
10
+ RED='\033[0;31m'
11
+ GREEN='\033[0;32m'
12
+ YELLOW='\033[1;33m'
13
+ NC='\033[0m' # No Color
14
+
15
+ # Check if already initialized
16
+ if [ -f "$DEVCONTAINER_DIR/compose.yaml" ]; then
17
+ echo -e "${YELLOW}This project has already been initialized.${NC}"
18
+ echo ""
19
+ # Try to extract configuration from compose.yaml
20
+ if grep -q "ports:" "$DEVCONTAINER_DIR/compose.yaml" 2>/dev/null; then
21
+ echo "Current configuration: Web application with ports"
22
+ grep -A10 "ports:" "$DEVCONTAINER_DIR/compose.yaml" | grep -E "^[ ]*-" | sed 's/.*"\([0-9]*\):.*/ - Port \1/'
23
+ else
24
+ echo "Current configuration: No ports configured"
25
+ fi
26
+ echo ""
27
+ read -p "Do you want to reinitialize? (y/N): " reinit
28
+ if [[ ! "$reinit" =~ ^[Yy]$ ]]; then
29
+ echo "Initialization cancelled."
30
+ exit 0
31
+ fi
32
+ fi
33
+
34
+ echo -e "${GREEN}=== DevContainer Project Initialization ===${NC}"
35
+ echo ""
36
+
37
+ # Project type selection
38
+ echo "Select your project type:"
39
+ echo " 1) Web Application (with ports)"
40
+ echo " 2) CLI Tool (no ports)"
41
+ echo " 3) Library/Package (no ports)"
42
+ echo " 4) Custom (configure manually)"
43
+ echo ""
44
+ read -p "Enter your choice (1-4): " project_type
45
+
46
+ case $project_type in
47
+ 1)
48
+ PROJECT_TYPE="web"
49
+ echo ""
50
+ echo "Enter the ports your application needs (space-separated)."
51
+ echo "Examples:"
52
+ echo " - Next.js/React: 3000"
53
+ echo " - API + Frontend: 3000 8080"
54
+ echo " - Full stack with DB: 3000 8080 5432"
55
+ echo ""
56
+ read -p "Ports: " -a PORTS
57
+
58
+ if [ ${#PORTS[@]} -eq 0 ]; then
59
+ echo -e "${RED}Error: Web applications require at least one port.${NC}"
60
+ exit 1
61
+ fi
62
+ ;;
63
+ 2)
64
+ PROJECT_TYPE="cli"
65
+ PORTS=()
66
+ echo -e "${GREEN}CLI tool configuration selected (no ports).${NC}"
67
+ ;;
68
+ 3)
69
+ PROJECT_TYPE="library"
70
+ PORTS=()
71
+ echo -e "${GREEN}Library/Package configuration selected (no ports).${NC}"
72
+ ;;
73
+ 4)
74
+ PROJECT_TYPE="custom"
75
+ read -p "Do you need port forwarding? (y/N): " need_ports
76
+ if [[ "$need_ports" =~ ^[Yy]$ ]]; then
77
+ echo ""
78
+ read -p "Enter ports (space-separated): " -a PORTS
79
+ else
80
+ PORTS=()
81
+ fi
82
+ ;;
83
+ *)
84
+ echo -e "${RED}Invalid choice. Exiting.${NC}"
85
+ exit 1
86
+ ;;
87
+ esac
88
+
89
+ # Generate compose.yaml from template
90
+ echo ""
91
+ echo -e "${GREEN}Generating Docker Compose configuration...${NC}"
92
+
93
+ # Build ports section
94
+ if [ ${#PORTS[@]} -gt 0 ]; then
95
+ PORTS_SECTION="ports:"
96
+ for port in "${PORTS[@]}"; do
97
+ PORTS_SECTION="$PORTS_SECTION\n - \"${port}:${port}\""
98
+ done
99
+ # Replace placeholder with ports section
100
+ sed "s| {{PORTS_SECTION}}| ${PORTS_SECTION}|" "$DEVCONTAINER_DIR/compose.yaml.template" | sed 's/\\n/\n/g' > "$DEVCONTAINER_DIR/compose.yaml"
101
+
102
+ # Generate devcontainer.local.json
103
+ PORTS_JSON=$(printf '%s,' "${PORTS[@]}" | sed 's/,$//')
104
+ cat > "$DEVCONTAINER_DIR/devcontainer.local.json" <<EOF
105
+ {
106
+ "forwardPorts": [${PORTS_JSON}]
107
+ }
108
+ EOF
109
+
110
+ echo "✓ Port forwarding configured: ${PORTS[*]}"
111
+ else
112
+ # No ports needed - remove the placeholder line entirely
113
+ sed '/{{PORTS_SECTION}}/d' "$DEVCONTAINER_DIR/compose.yaml.template" > "$DEVCONTAINER_DIR/compose.yaml"
114
+
115
+ # Create empty port forwarding config
116
+ cat > "$DEVCONTAINER_DIR/devcontainer.local.json" <<EOF
117
+ {
118
+ "forwardPorts": []
119
+ }
120
+ EOF
121
+
122
+ echo -e "${GREEN}✓ No port forwarding configured${NC}"
123
+ fi
124
+
125
+ # Add comment to compose.yaml about configuration
126
+ if [ -f "$DEVCONTAINER_DIR/compose.yaml" ]; then
127
+ # Prepend configuration info as comment
128
+ {
129
+ echo "# DevContainer configuration"
130
+ echo "# Generated: $(date -u +"%Y-%m-%d %H:%M:%S UTC")"
131
+ echo "# Project type: ${PROJECT_TYPE}"
132
+ if [ ${#PORTS[@]} -gt 0 ]; then
133
+ echo "# Ports: ${PORTS[*]}"
134
+ else
135
+ echo "# Ports: none"
136
+ fi
137
+ echo ""
138
+ cat "$DEVCONTAINER_DIR/compose.yaml"
139
+ } > "$DEVCONTAINER_DIR/compose.yaml.tmp"
140
+ mv "$DEVCONTAINER_DIR/compose.yaml.tmp" "$DEVCONTAINER_DIR/compose.yaml"
141
+ fi
142
+
143
+ echo ""
144
+ echo -e "${GREEN}=== Initialization Complete ===${NC}"
145
+ echo ""
146
+ echo "Configuration summary:"
147
+ echo " Project Type: ${PROJECT_TYPE}"
148
+ if [ ${#PORTS[@]} -gt 0 ]; then
149
+ echo " Forwarded Ports: ${PORTS[*]}"
150
+ else
151
+ echo " Forwarded Ports: none"
152
+ fi
153
+ echo ""
154
+ echo -e "${GREEN}You can now open this project in VS Code with DevContainers.${NC}"
155
+ echo ""
156
+ echo "Next steps:"
157
+ echo " 1. The compose.yaml file has been generated (gitignored)"
158
+ echo " 2. Open in VS Code: code . (then Reopen in Container)"
159
+ echo " 3. Or use DevContainer CLI: devcontainer up --workspace-folder ."
@@ -0,0 +1,10 @@
1
+ #!/bin/bash
2
+
3
+ # Get the directory where this script is located
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+
6
+ # Source the common functions
7
+ source "$SCRIPT_DIR/devcontainer-common.sh"
8
+
9
+ # Rebuild and start devcontainer
10
+ up_devcontainer "--remove-existing-container"
@@ -0,0 +1,11 @@
1
+ #!/bin/bash
2
+
3
+ # Get the directory where this script is located
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+
6
+ # Source the common functions
7
+ source "$SCRIPT_DIR/devcontainer-common.sh"
8
+
9
+ # Start devcontainer and connect to it
10
+ up_devcontainer ""
11
+ exec_devcontainer
@@ -0,0 +1,12 @@
1
+ # DevContainer configuration
2
+ # Generated: 2026-01-10 04:57:22 UTC
3
+ # Project type: library
4
+ # Ports: none
5
+
6
+ services:
7
+ app:
8
+ image: mcr.microsoft.com/vscode/devcontainers/base:ubuntu-24.04
9
+ volumes:
10
+ - ../..:/workspaces
11
+ command: sleep infinity
12
+ network_mode: bridge
@@ -0,0 +1,8 @@
1
+ services:
2
+ app:
3
+ image: mcr.microsoft.com/vscode/devcontainers/base:ubuntu-24.04
4
+ volumes:
5
+ - ../..:/workspaces
6
+ {{PORTS_SECTION}}
7
+ command: sleep infinity
8
+ network_mode: bridge
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "Claude Code",
3
+ "dockerComposeFile": "compose.yaml",
4
+ "service": "app",
5
+ "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
6
+ "features": {
7
+ "ghcr.io/anthropics/devcontainer-features/claude-code:latest": {},
8
+ "ghcr.io/roul/devcontainer-features/mise-python:1": {},
9
+ "ghcr.io/roul/devcontainer-features/mise-node:1": {},
10
+ "ghcr.io/roul/devcontainer-features/mise-ruby:1": {},
11
+ "ghcr.io/devcontainers/features/github-cli:1": {},
12
+ "ghcr.io/devcontainers-extra/features/tmux-apt-get:1": {},
13
+ "ghcr.io/devcontainers/features/docker-in-docker:2": {
14
+ "version": "latest",
15
+ "moby": true,
16
+ "dockerDashComposeVersion": "v2",
17
+ "installDockerBuildx": true
18
+ }
19
+ },
20
+ "mounts": [
21
+ "type=bind,consistency=cached,source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig,readonly",
22
+ "type=bind,consistency=cached,source=${localEnv:HOME}/.config/gh,target=/home/vscode/.config/gh",
23
+ "type=bind,consistency=cached,source=${localEnv:HOME}/.claude,target=/home/vscode/.claude",
24
+ "type=bind,consistency=cached,source=${localEnv:HOME}/.ssh,target=/home/vscode/.ssh"
25
+ ],
26
+ "forwardPorts": [],
27
+ // Ports are configured via devcontainer.local.json after running init script
28
+ "postCreateCommand": "/bin/bash .devcontainer/scripts/setup.sh",
29
+ "initializeCommand": "/bin/bash -c 'if [ ! -f .devcontainer/compose.yaml ]; then echo \"ERROR: Project not initialized. Run: .devcontainer/bin/init\"; exit 1; fi'"
30
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "forwardPorts": []
3
+ }
@@ -0,0 +1,12 @@
1
+ curl -L https://github.com/douhashi/soba/releases/latest/download/soba_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/x86_64/; s/aarch64/arm64/').tar.gz | tar xz -C /tmp && mkdir -p ~/.local/bin &&mv /tmp/soba ~/.local/bin/
2
+
3
+ # Setup bash environment
4
+ cat >> ~/.bashrc << 'EOF'
5
+
6
+ # Custom settings for devcontainer
7
+ export LANG=en_US.UTF-8
8
+ export TERM=xterm-256color
9
+ alias vim='nvim'
10
+ alias claude='claude --dangerously-skip-permissions'
11
+ EOF
12
+
@@ -0,0 +1,51 @@
1
+ #!/bin/bash
2
+
3
+ # Exit if no files provided
4
+ if [ $# -eq 0 ]; then
5
+ exit 0
6
+ fi
7
+
8
+ # Filter only Ruby files
9
+ ruby_files=()
10
+ for file in "$@"; do
11
+ if [[ "$file" == *.rb ]]; then
12
+ ruby_files+=("$file")
13
+ fi
14
+ done
15
+
16
+ # Exit if no Ruby files
17
+ if [ ${#ruby_files[@]} -eq 0 ]; then
18
+ exit 0
19
+ fi
20
+
21
+ # Run RuboCop with auto-fix
22
+ bundle exec rubocop -a "${ruby_files[@]}"
23
+ rubocop_exit_code=$?
24
+
25
+ # Check if any staged files were modified by auto-fix
26
+ modified_files=()
27
+ for file in "${ruby_files[@]}"; do
28
+ if [ -f "$file" ] && ! git diff --quiet "$file" 2>/dev/null; then
29
+ modified_files+=("$file")
30
+ fi
31
+ done
32
+
33
+ # If files were modified by auto-fix, show message and fail
34
+ if [ ${#modified_files[@]} -gt 0 ]; then
35
+ echo ""
36
+ echo "=============================================="
37
+ echo " RuboCop has auto-fixed the following files:"
38
+ echo "=============================================="
39
+ for file in "${modified_files[@]}"; do
40
+ echo " - $file"
41
+ done
42
+ echo ""
43
+ echo "Please review the changes, then re-stage and commit:"
44
+ echo " git add ${modified_files[*]}"
45
+ echo " git commit"
46
+ echo "=============================================="
47
+ exit 1
48
+ fi
49
+
50
+ # Return RuboCop's exit code
51
+ exit $rubocop_exit_code
data/.soba/config.yml ADDED
@@ -0,0 +1,78 @@
1
+ # GitHub settings
2
+ github:
3
+ # Authentication method: 'gh', 'env', or omit for auto-detect
4
+ # Use 'gh' to use GitHub CLI authentication (gh auth token)
5
+ # Use 'env' to use environment variable
6
+ auth_method: gh # or 'env', or omit for auto-detect
7
+
8
+ # Personal Access Token (required when auth_method is 'env' or omitted)
9
+ # Can use environment variable
10
+ # token: ${GITHUB_TOKEN}
11
+
12
+ # Target repository (format: owner/repo)
13
+ repository: douhashi/kie-ruby
14
+
15
+ # Workflow settings
16
+ workflow:
17
+ # Issue polling interval in seconds (default: 20)
18
+ interval: 20
19
+ # Use tmux for Claude execution (default: true)
20
+ use_tmux: true
21
+ # Enable automatic PR merging (default: true)
22
+ auto_merge_enabled: true
23
+ # Clean up tmux windows for closed issues (default: true)
24
+ closed_issue_cleanup_enabled: true
25
+ # Cleanup interval in seconds (default: 300)
26
+ closed_issue_cleanup_interval: 300
27
+ # Command delay for tmux panes in seconds (default: 3)
28
+ tmux_command_delay: 3
29
+
30
+ # Slack notifications
31
+ slack:
32
+ # Webhook URL for Slack notifications
33
+ # Get your webhook URL from: https://api.slack.com/messaging/webhooks
34
+ webhook_url: ${SLACK_WEBHOOK_URL}
35
+ # Enable notifications for phase starts (default: false)
36
+ notifications_enabled: false
37
+
38
+ # Git settings
39
+ git:
40
+ # Base path for git worktrees (default: /tmp/soba/worktrees)
41
+ worktree_base_path: /tmp/soba/worktrees
42
+ # Base branch for rebase operations and worktree creation (default: main)
43
+ base_branch: main
44
+
45
+ # Logging settings
46
+ log:
47
+ # Log file output path (default: .soba/logs/soba-{pid}.log)
48
+ # ${PID} will be replaced with actual process ID at runtime
49
+ output_path: .soba/logs/soba-${PID}.log
50
+ # Number of log files to retain (default: 10)
51
+ retention_count: 10
52
+ # Log level: debug, info, warn, error (default: info)
53
+ level: info
54
+ # Log format: "text" or "json" (default: text)
55
+ format: text
56
+
57
+ # Phase commands (optional - for custom Claude commands)
58
+ phase:
59
+ plan:
60
+ command: claude
61
+ options:
62
+ - --dangerously-skip-permissions
63
+ parameter: '/soba:plan {{issue-number}}'
64
+ implement:
65
+ command: claude
66
+ options:
67
+ - --dangerously-skip-permissions
68
+ parameter: '/soba:implement {{issue-number}}'
69
+ review:
70
+ command: claude
71
+ options:
72
+ - --dangerously-skip-permissions
73
+ parameter: '/soba:review {{issue-number}}'
74
+ revise:
75
+ command: claude
76
+ options:
77
+ - --dangerously-skip-permissions
78
+ parameter: '/soba:revise {{issue-number}}'
data/CHANGELOG.md ADDED
@@ -0,0 +1,23 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.1.0] - 2025-01-10
9
+
10
+ ### Added
11
+
12
+ - Initial release of kie-ruby client library
13
+ - Support for General API models
14
+ - `nano-banana-pro` for image generation
15
+ - Support for Suno API models
16
+ - `V4`, `V4_5`, `V4_5PLUS`, `V4_5ALL`, `V5` for music generation
17
+ - Unified `Kie::Client` interface for all models
18
+ - Automatic polling with `task.wait(timeout:, interval:)`
19
+ - Structured exception classes for error handling
20
+ - `AuthenticationError`, `InsufficientCreditsError`, `RateLimitError`
21
+ - `ContentPolicyError`, `TaskFailedError`, `TimeoutError`
22
+ - Model registry for extensible model definitions
23
+ - Input validation for Suno models (prompt, style, title length)
data/CLAUDE.md ADDED
@@ -0,0 +1,20 @@
1
+ # Guideline
2
+
3
+ ## Top-Level Rules
4
+
5
+ - Run independent processes concurrently, not sequentially.
6
+ - Think only in English; respond only in Japanese.
7
+ - Use **Contex7 MCP** to check library usage.
8
+ - Save temp design notes as `./.tmp/` in Markdown.
9
+ - After **Write/Edit**, always verify with **Read**, even if system says "(no content)".
10
+ - Be critical, not obedient—but stay respectful.
11
+
12
+ ## Context
13
+
14
+ - Document System: @docs/document_system.md
15
+
16
+ ## Documents
17
+
18
+ - Business: @docs/business/INDEX.md
19
+ - Development: @docs/development/INDEX.md
20
+
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Sho DOUHASHI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.