ruby-kafka-temp-fork 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +393 -0
  3. data/.github/workflows/stale.yml +19 -0
  4. data/.gitignore +13 -0
  5. data/.readygo +1 -0
  6. data/.rspec +3 -0
  7. data/.rubocop.yml +44 -0
  8. data/.ruby-version +1 -0
  9. data/.yardopts +3 -0
  10. data/CHANGELOG.md +310 -0
  11. data/Gemfile +5 -0
  12. data/ISSUE_TEMPLATE.md +23 -0
  13. data/LICENSE.txt +176 -0
  14. data/Procfile +2 -0
  15. data/README.md +1342 -0
  16. data/Rakefile +8 -0
  17. data/benchmarks/message_encoding.rb +23 -0
  18. data/bin/console +8 -0
  19. data/bin/setup +5 -0
  20. data/docker-compose.yml +39 -0
  21. data/examples/consumer-group.rb +35 -0
  22. data/examples/firehose-consumer.rb +64 -0
  23. data/examples/firehose-producer.rb +54 -0
  24. data/examples/simple-consumer.rb +34 -0
  25. data/examples/simple-producer.rb +42 -0
  26. data/examples/ssl-producer.rb +44 -0
  27. data/lib/kafka.rb +373 -0
  28. data/lib/kafka/async_producer.rb +291 -0
  29. data/lib/kafka/broker.rb +217 -0
  30. data/lib/kafka/broker_info.rb +16 -0
  31. data/lib/kafka/broker_pool.rb +41 -0
  32. data/lib/kafka/broker_uri.rb +43 -0
  33. data/lib/kafka/client.rb +833 -0
  34. data/lib/kafka/cluster.rb +513 -0
  35. data/lib/kafka/compression.rb +45 -0
  36. data/lib/kafka/compressor.rb +86 -0
  37. data/lib/kafka/connection.rb +223 -0
  38. data/lib/kafka/connection_builder.rb +33 -0
  39. data/lib/kafka/consumer.rb +642 -0
  40. data/lib/kafka/consumer_group.rb +231 -0
  41. data/lib/kafka/consumer_group/assignor.rb +63 -0
  42. data/lib/kafka/crc32_hash.rb +15 -0
  43. data/lib/kafka/datadog.rb +420 -0
  44. data/lib/kafka/digest.rb +22 -0
  45. data/lib/kafka/fetch_operation.rb +115 -0
  46. data/lib/kafka/fetched_batch.rb +58 -0
  47. data/lib/kafka/fetched_batch_generator.rb +120 -0
  48. data/lib/kafka/fetched_message.rb +48 -0
  49. data/lib/kafka/fetched_offset_resolver.rb +48 -0
  50. data/lib/kafka/fetcher.rb +224 -0
  51. data/lib/kafka/gzip_codec.rb +34 -0
  52. data/lib/kafka/heartbeat.rb +25 -0
  53. data/lib/kafka/instrumenter.rb +38 -0
  54. data/lib/kafka/interceptors.rb +33 -0
  55. data/lib/kafka/lz4_codec.rb +27 -0
  56. data/lib/kafka/message_buffer.rb +87 -0
  57. data/lib/kafka/murmur2_hash.rb +17 -0
  58. data/lib/kafka/offset_manager.rb +259 -0
  59. data/lib/kafka/partitioner.rb +40 -0
  60. data/lib/kafka/pause.rb +92 -0
  61. data/lib/kafka/pending_message.rb +29 -0
  62. data/lib/kafka/pending_message_queue.rb +41 -0
  63. data/lib/kafka/produce_operation.rb +205 -0
  64. data/lib/kafka/producer.rb +528 -0
  65. data/lib/kafka/prometheus.rb +316 -0
  66. data/lib/kafka/protocol.rb +225 -0
  67. data/lib/kafka/protocol/add_offsets_to_txn_request.rb +29 -0
  68. data/lib/kafka/protocol/add_offsets_to_txn_response.rb +21 -0
  69. data/lib/kafka/protocol/add_partitions_to_txn_request.rb +34 -0
  70. data/lib/kafka/protocol/add_partitions_to_txn_response.rb +47 -0
  71. data/lib/kafka/protocol/alter_configs_request.rb +44 -0
  72. data/lib/kafka/protocol/alter_configs_response.rb +49 -0
  73. data/lib/kafka/protocol/api_versions_request.rb +21 -0
  74. data/lib/kafka/protocol/api_versions_response.rb +53 -0
  75. data/lib/kafka/protocol/consumer_group_protocol.rb +19 -0
  76. data/lib/kafka/protocol/create_partitions_request.rb +42 -0
  77. data/lib/kafka/protocol/create_partitions_response.rb +28 -0
  78. data/lib/kafka/protocol/create_topics_request.rb +45 -0
  79. data/lib/kafka/protocol/create_topics_response.rb +26 -0
  80. data/lib/kafka/protocol/decoder.rb +175 -0
  81. data/lib/kafka/protocol/delete_topics_request.rb +33 -0
  82. data/lib/kafka/protocol/delete_topics_response.rb +26 -0
  83. data/lib/kafka/protocol/describe_configs_request.rb +35 -0
  84. data/lib/kafka/protocol/describe_configs_response.rb +73 -0
  85. data/lib/kafka/protocol/describe_groups_request.rb +27 -0
  86. data/lib/kafka/protocol/describe_groups_response.rb +73 -0
  87. data/lib/kafka/protocol/encoder.rb +184 -0
  88. data/lib/kafka/protocol/end_txn_request.rb +29 -0
  89. data/lib/kafka/protocol/end_txn_response.rb +19 -0
  90. data/lib/kafka/protocol/fetch_request.rb +70 -0
  91. data/lib/kafka/protocol/fetch_response.rb +136 -0
  92. data/lib/kafka/protocol/find_coordinator_request.rb +29 -0
  93. data/lib/kafka/protocol/find_coordinator_response.rb +29 -0
  94. data/lib/kafka/protocol/heartbeat_request.rb +27 -0
  95. data/lib/kafka/protocol/heartbeat_response.rb +17 -0
  96. data/lib/kafka/protocol/init_producer_id_request.rb +26 -0
  97. data/lib/kafka/protocol/init_producer_id_response.rb +27 -0
  98. data/lib/kafka/protocol/join_group_request.rb +47 -0
  99. data/lib/kafka/protocol/join_group_response.rb +41 -0
  100. data/lib/kafka/protocol/leave_group_request.rb +25 -0
  101. data/lib/kafka/protocol/leave_group_response.rb +17 -0
  102. data/lib/kafka/protocol/list_groups_request.rb +23 -0
  103. data/lib/kafka/protocol/list_groups_response.rb +35 -0
  104. data/lib/kafka/protocol/list_offset_request.rb +53 -0
  105. data/lib/kafka/protocol/list_offset_response.rb +89 -0
  106. data/lib/kafka/protocol/member_assignment.rb +42 -0
  107. data/lib/kafka/protocol/message.rb +172 -0
  108. data/lib/kafka/protocol/message_set.rb +55 -0
  109. data/lib/kafka/protocol/metadata_request.rb +31 -0
  110. data/lib/kafka/protocol/metadata_response.rb +185 -0
  111. data/lib/kafka/protocol/offset_commit_request.rb +47 -0
  112. data/lib/kafka/protocol/offset_commit_response.rb +29 -0
  113. data/lib/kafka/protocol/offset_fetch_request.rb +38 -0
  114. data/lib/kafka/protocol/offset_fetch_response.rb +56 -0
  115. data/lib/kafka/protocol/produce_request.rb +94 -0
  116. data/lib/kafka/protocol/produce_response.rb +63 -0
  117. data/lib/kafka/protocol/record.rb +88 -0
  118. data/lib/kafka/protocol/record_batch.rb +223 -0
  119. data/lib/kafka/protocol/request_message.rb +26 -0
  120. data/lib/kafka/protocol/sasl_handshake_request.rb +33 -0
  121. data/lib/kafka/protocol/sasl_handshake_response.rb +28 -0
  122. data/lib/kafka/protocol/sync_group_request.rb +33 -0
  123. data/lib/kafka/protocol/sync_group_response.rb +26 -0
  124. data/lib/kafka/protocol/txn_offset_commit_request.rb +46 -0
  125. data/lib/kafka/protocol/txn_offset_commit_response.rb +47 -0
  126. data/lib/kafka/round_robin_assignment_strategy.rb +52 -0
  127. data/lib/kafka/sasl/gssapi.rb +76 -0
  128. data/lib/kafka/sasl/oauth.rb +64 -0
  129. data/lib/kafka/sasl/plain.rb +39 -0
  130. data/lib/kafka/sasl/scram.rb +180 -0
  131. data/lib/kafka/sasl_authenticator.rb +61 -0
  132. data/lib/kafka/snappy_codec.rb +29 -0
  133. data/lib/kafka/socket_with_timeout.rb +96 -0
  134. data/lib/kafka/ssl_context.rb +66 -0
  135. data/lib/kafka/ssl_socket_with_timeout.rb +188 -0
  136. data/lib/kafka/statsd.rb +296 -0
  137. data/lib/kafka/tagged_logger.rb +77 -0
  138. data/lib/kafka/transaction_manager.rb +306 -0
  139. data/lib/kafka/transaction_state_machine.rb +72 -0
  140. data/lib/kafka/version.rb +5 -0
  141. data/lib/kafka/zstd_codec.rb +27 -0
  142. data/lib/ruby-kafka-temp-fork.rb +5 -0
  143. data/ruby-kafka-temp-fork.gemspec +54 -0
  144. metadata +520 -0
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.7.1
data/.yardopts ADDED
@@ -0,0 +1,3 @@
1
+ --markup-provider=redcarpet
2
+ --markup=markdown
3
+ --title 'Kafka'
data/CHANGELOG.md ADDED
@@ -0,0 +1,310 @@
1
+ # Changelog
2
+
3
+ Changes and additions to the library will be listed here.
4
+
5
+ ## Unreleased
6
+
7
+ - Refresh a stale cluster's metadata if necessary on `Kafka::Client#deliver_message` (#901).
8
+ - Fix `Kafka::TransactionManager#send_offsets_to_txn` (#866).
9
+ - Add support for `murmur2` based partitioning.
10
+ - Add `resolve_seed_brokers` option to support seed brokers' hostname with multiple addresses (#877).
11
+ - Handle SyncGroup responses with a non-zero error and no assignments (#896).
12
+ - Add support for non-identical topic subscriptions within the same consumer group (#525 / #764).
13
+
14
+ ## 1.3.0
15
+
16
+ - Support custom assignment strategy (#846).
17
+ - Improved Exceptions in TransactionManager (#862).
18
+
19
+ ## 1.2.0
20
+
21
+ - Add producer consumer interceptors (#837).
22
+ - Add support for configuring the client partitioner (#848).
23
+
24
+ ## 1.1.0
25
+
26
+ - Extra sanity checking when marking offsets as processed (#824).
27
+ - Make `verify_hostname` settable for SSL contexts (#828).
28
+ - Instrument `create_time` from last message in batch (#811).
29
+ - Add client function for fetching topic replica count (#822).
30
+ - Allow consumers to refresh the topic lists (#818).
31
+ - Disconnect after leaving a group (#817).
32
+ - Use `max_wait_time` as the sleep instead of hardcoded 2 seconds (#825).
33
+
34
+ ## 1.0.0
35
+
36
+ - Add client methods to manage configs (#759)
37
+ - Support Kafka 2.3 and 2.4.
38
+
39
+ ## 0.7.10
40
+
41
+ - Fix logger again (#762)
42
+
43
+ ## 0.7.9
44
+
45
+ - Fix SSL authentication for ruby < 2.4.0 (#742)
46
+ - Add metrics for prometheus/client (#739)
47
+ - Do not add nil message entries when ignoring old messages (#746)
48
+ - Scram authentication thread save (#743)
49
+
50
+ ## 0.7.8
51
+ - Optionally verify hostname on SSL certs (#733)
52
+
53
+ ## 0.7.7
54
+ - Producer send offsets in transaction (#723)
55
+ - Support zstd compression (#724)
56
+ - Verify SSL Certificates (#730)
57
+
58
+ ## 0.7.6
59
+ - Introduce regex matching in `Consumer#subscribe` (#700)
60
+ - Only rejoin group on error if we're not in shutdown mode (#711)
61
+ - Use `maxTimestamp` for `logAppendTime` timestamps (#706)
62
+ - Async producer limit number of retries (#708)
63
+ - Support SASL OAuthBearer Authentication (#710)
64
+
65
+ ## 0.7.5
66
+ - Distribute partitions across consumer groups when there are few partitions per topic (#681)
67
+ - Fix an issue where a consumer would fail to fetch any messages (#689)
68
+ - Instrumentation for heartbeat event
69
+ - Synchronously stop the fetcher to prevent race condition when processing commands
70
+ - Instrument batch fetching (#694)
71
+
72
+ ## 0.7.4
73
+ - Fix wrong encoding calculation that leads to message corruption (#682, #680).
74
+ - Change the log level of the 'Committing offsets' message to debug (#640).
75
+ - Avoid Ruby warnings about unused vars (#679).
76
+ - Synchronously commit offsets after HeartbeatError (#676).
77
+ - Discard messages that were fetched under a previous consumer group generation (#665).
78
+ - Support specifying an ssl client certificates key passphrase (#667).
79
+
80
+ ## 0.7.3
81
+
82
+ - Synchronize access to @worker_thread and @timer_thread in AsyncProducer to prevent creating multiple threads (#661).
83
+
84
+ ## 0.7.2
85
+
86
+ - Handle case when paused partition does not belong to group on resume (#656).
87
+ - Fix compatibility version in documentation (#651).
88
+ - Fix message set backward compatible (#648).
89
+ - Refresh metadata on connection error when listing topics (#644).
90
+
91
+ ## 0.7.1
92
+
93
+ - Compatibility with dogstatsd-ruby v4.0.0.
94
+ - Fix consuming duplication due to redundant messages returned from Kafka (#636).
95
+ - Fresh cluster info on fetch error (#641).
96
+ - Exactly Once Delivery and Transactional Messaging Support (#608).
97
+ - Support extra client certificates in the SSL Context when authenticating with Kafka (#633).
98
+
99
+ ## 0.7.0
100
+
101
+ - Drop support for Kafka 0.10 in favor of native support for Kafka 0.11.
102
+ - Support record headers (#604).
103
+ - Add instrumenter and logger when async message delivery fails (#603).
104
+ - Upgrade and rename GroupCoordinator API to FindCoordinator API (#606).
105
+ - Refresh cluster metadata after topic re-assignment (#609).
106
+ - Disable SASL over SSL with a new config (#613).
107
+ - Allow listing brokers in a cluster (#626).
108
+ - Fix Fetcher's message skipping (#625).
109
+
110
+ ## 0.6.7
111
+
112
+ - Handle case where consumer doesn't know about the topic (#597 + 0e302cbd0f31315bf81c1d1645520413ad6b58f0)
113
+
114
+ ## v0.6.5
115
+
116
+ - Fix bug related to partition assignment.
117
+
118
+ ## v0.6.4
119
+
120
+ - Fix bug that caused consumers to jump back and reprocess messages (#595).
121
+
122
+ ## v0.6.3
123
+
124
+ - Allow configuring the max size of the queue connecting the fetcher thread with the consumer.
125
+ - Add support for the Describe Groups API (#583).
126
+
127
+ ## v0.6.2
128
+
129
+ - Add list groups API (#582).
130
+ - Use mutable String constructor (#584).
131
+
132
+ ## v0.6.1
133
+
134
+ - Fix bug with exponential pausing causing pauses never to stop.
135
+
136
+ ## v0.6.0
137
+
138
+ - Fetch messages asynchronously (#526).
139
+ - Add support for exponential backoff in pauses (#566).
140
+ - Instrument pause durations (#574).
141
+
142
+ ## v0.5.5
143
+
144
+ - Support PLAINTEXT and SSL URI schemes (#550).
145
+
146
+ ## v0.5.4
147
+
148
+ - Add support for config entries in the topic creation API (#540).
149
+ - Don't fail on retry when the cluster is secured (#545).
150
+
151
+ ## v0.5.3
152
+
153
+ - Add support for the topic deletion API (#528).
154
+ - Add support for the partition creation API (#533).
155
+ - Allow passing in the seed brokers in a positional argument (#538).
156
+
157
+ ## v0.5.2
158
+
159
+ - Instrument the start of message/batch processing (#496).
160
+ - Mark `Client#fetch_messages` as stable.
161
+ - Fix the list topics API (#508).
162
+ - Add support for LZ4 compression (#499).
163
+ - Refactor compression codec lookup (#509).
164
+ - Fix compressed message set offset bug (#506).
165
+ - Test against multiple versions of Kafka.
166
+ - Fix double-processing of messages after a consumer exception (#518).
167
+ - Track consumer offsets in Datadog.
168
+
169
+ ## v0.5.1
170
+
171
+ Requires Kafka 0.10.1+ due to usage of a few new APIs.
172
+
173
+ - Fix bug when using compression (#458).
174
+ - Update the v3 of the Fetch API, allowing a per-request `max_bytes` setting (#468).
175
+ - Make `#deliver_message` more resilient using retries and backoff.
176
+ - Add support for SASL SCRAM authentication (#465).
177
+ - Refactor and simplify SASL code.
178
+ - Fix issue when a consumer resets a partition to its default offset.
179
+ - Allow specifying a create time for messages (#481).
180
+
181
+ ## v0.5.0
182
+
183
+ - Drops support for Kafka 0.9 in favor of Kafka 0.10 (#381)!
184
+ - Handle cases where there are no partitions to fetch from by sleeping a bit (#439).
185
+ - Handle problems with the broker cache (#440).
186
+ - Shut down more quickly (#438).
187
+
188
+ ## v0.4.3
189
+
190
+ - Restart the async producer thread automatically after errors.
191
+ - Include the offset lag in batch consumer metrics (Statsd).
192
+ - Make the default `max_wait_time` more sane.
193
+ - Fix issue with cached default offset lookups (#431).
194
+ - Upgrade to Datadog client version 3.
195
+
196
+ ## v0.4.2
197
+
198
+ - Fix connection issue on SASL connections (#401).
199
+ - Add more instrumentation of consumer groups (#407).
200
+ - Improve error logging (#385)
201
+
202
+ ## v0.4.1
203
+
204
+ - Allow seeking the consumer position (#386).
205
+ - Reopen idle connections after 5 minutes (#399).
206
+
207
+ ## v0.4.0
208
+
209
+ - Support SASL authentication (#334 and #370)
210
+ - Allow loading SSL certificates from files (#371)
211
+ - Add Statsd metric reporting (#373)
212
+
213
+ ## v0.3.17
214
+
215
+ - Re-commit previously committed offsets periodically with an interval of half
216
+ the offset retention time, starting with the first commit (#318).
217
+ - Expose offset retention time in the Consumer API (#316).
218
+ - Don't get blocked when there's temporarily no leader for a topic (#336).
219
+
220
+ ## v0.3.16
221
+
222
+ - Fix SSL socket timeout (#283).
223
+ - Update to the latest Datadog gem (#296).
224
+ - Automatically detect private key type (#297).
225
+ - Only fetch messages for subscribed topics (#309).
226
+
227
+ ## v0.3.15
228
+
229
+ - Allow setting a timeout on a partition pause (#272).
230
+ - Allow pausing consumption of a partition (#268).
231
+
232
+ ## v0.3.14
233
+
234
+ - Automatically recover from invalid consumer checkpoints.
235
+ - Minimize the number of times messages are reprocessed after a consumer group resync.
236
+ - Improve instrumentation of the async producer.
237
+
238
+ ## v0.3.12
239
+
240
+ - Fix a bug in the consumer.
241
+
242
+ ## v0.3.11
243
+
244
+ - Fix bug in the simple consumer loop.
245
+
246
+ ## v0.3.10
247
+
248
+ - Handle brokers becoming unavailable while in a consumer loop (#228).
249
+ - Handle edge case when consuming from the end of a topic (#230).
250
+ - Ensure the library can be loaded without Bundler (#224).
251
+ - Add an API for fetching the last offset in a partition (#232).
252
+
253
+ ## v0.3.9
254
+
255
+ - Improve the default durability setting. The producer setting `required_acks` now defaults to `:all` (#210).
256
+ - Handle rebalances in the producer (#196). *Mpampis Kostas*
257
+ - Add simplified producer and consumer APIs for simple use cases.
258
+ - Add out-of-the-box Datadog reporting.
259
+ - Improve producer performance.
260
+
261
+ ## v0.3.8
262
+
263
+ - Keep separate connection pools for consumers and producers initialized from
264
+ the same client.
265
+ - Handle connection errors automatically in the async producer.
266
+
267
+ ## v0.3.7
268
+
269
+ - Default to port 9092 if no port is provided for a seed broker.
270
+
271
+ ## v0.3.6
272
+
273
+ - Fix bug that caused partition information to not be reliably updated.
274
+
275
+ ## v0.3.5
276
+
277
+ - Fix bug that caused the async producer to not work with Unicorn (#166).
278
+ - Fix bug that caused committed consumer offsets to be lost (#167).
279
+ - Instrument buffer overflows in the producer.
280
+
281
+ ## v0.3.4
282
+
283
+ - Make the producer buffer more resilient in the face of isolated topic errors.
284
+
285
+ ## v0.3.3
286
+
287
+ - Allow clearing a producer's buffer (Martin Nowak).
288
+ - Improved Consumer API.
289
+ - Instrument producer errors.
290
+
291
+ ## v0.3.2
292
+
293
+ - Experimental batch consumer API.
294
+
295
+ ## v0.3.1
296
+
297
+ - Simplify the heartbeat algorithm.
298
+ - Handle partial messages at the end of message sets received from the brokers.
299
+
300
+ ## v0.3.0
301
+
302
+ - Add support for encryption and authentication with SSL (Tom Crayford).
303
+ - Allow configuring consumer offset commit policies.
304
+ - Instrument consumer message processing.
305
+ - Fixed an issue causing exceptions when no logger was specified.
306
+
307
+ ## v0.2.0
308
+
309
+ - Add instrumentation of message compression.
310
+ - **New!** Consumer API – still alpha level. Expect many changes.
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gemspec
data/ISSUE_TEMPLATE.md ADDED
@@ -0,0 +1,23 @@
1
+ If this is a bug report, please fill out the following:
2
+
3
+ * Version of Ruby:
4
+ * Version of Kafka:
5
+ * Version of ruby-kafka:
6
+
7
+ Please verify that the problem you're seeing hasn't been fixed by the current `master` of ruby-kafka.
8
+
9
+ ###### Steps to reproduce
10
+
11
+ ```ruby
12
+ kafka = Kafka.new(...)
13
+
14
+ # Please write an example that reproduces the problem you're describing.
15
+ ```
16
+
17
+ ###### Expected outcome
18
+
19
+ What you thought would happen when running the example.
20
+
21
+ ###### Actual outcome
22
+
23
+ What actually happened.
data/LICENSE.txt ADDED
@@ -0,0 +1,176 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS