Skip to content

Commit a7ccbde

Browse files
committed
descriptor bytes and fully qualified name helpers
- add the descriptor proto bytes for each generated proto file - add a helper for the fully qualified name of each proto.
1 parent a2e0cbb commit a7ccbde

18 files changed

+4494
-16
lines changed

lib/protobuf/code_generator.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,18 @@ def self.warn(message)
2828
def initialize(request_bytes)
2929
@request_bytes = request_bytes
3030
self.request = ::Google::Protobuf::Compiler::CodeGeneratorRequest.decode(request_bytes)
31+
@proto_file_to_descriptor = request.proto_file.map { |file_descriptor| [file_descriptor.name, file_descriptor] }.to_h.freeze
3132
end
3233

3334
def eval_unknown_extensions!
3435
request.proto_file.each do |file_descriptor|
35-
::Protobuf::Generators::FileGenerator.new(file_descriptor).eval_unknown_extensions!
36+
::Protobuf::Generators::FileGenerator.new(file_descriptor, @proto_file_to_descriptor).eval_unknown_extensions!
3637
end
3738
self.request = ::Google::Protobuf::Compiler::CodeGeneratorRequest.decode(@request_bytes)
3839
end
3940

4041
def generate_file(file_descriptor)
41-
::Protobuf::Generators::FileGenerator.new(file_descriptor).generate_output_file
42+
::Protobuf::Generators::FileGenerator.new(file_descriptor, @proto_file_to_descriptor).generate_output_file
4243
end
4344

4445
def response_bytes

lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
# encoding: utf-8
2+
# frozen_string_literal: true
23

34
##
45
# This file is auto-generated. DO NOT EDIT!
56
#
7+
require 'base64'
8+
require 'set'
69
require 'protobuf'
710

811

@@ -14,6 +17,28 @@
1417
module Google
1518
module Protobuf
1619
module Compiler
20+
FULLY_QUALIFIED_NAME = 'google.protobuf.compiler' unless defined?(self::FULLY_QUALIFIED_NAME)
21+
22+
@descriptors = [] unless instance_variable_defined?(:@descriptors)
23+
@descriptors << lambda do
24+
bytes = File.read(__FILE__, mode: 'rb').split(/^__END__$/, 2).last[1..-1]
25+
::Google::Protobuf::FileDescriptorProto.decode(Base64.decode64(bytes))
26+
end
27+
28+
@descriptor_dependencies = Set.new unless instance_variable_defined?(:@descriptor_dependencies)
29+
@descriptor_dependencies |= [Google::Protobuf]
30+
31+
unless respond_to?(:descriptor_set)
32+
def self.descriptor_set
33+
::Google::Protobuf::FileDescriptorSet.new(:file => @descriptors.map(&:call))
34+
end
35+
end
36+
37+
unless respond_to?(:descriptor_dependencies)
38+
def self.descriptor_dependencies
39+
@descriptor_dependencies
40+
end
41+
end
1742
::Protobuf::Optionable.inject(self) { ::Google::Protobuf::FileOptions }
1843

1944
##
@@ -38,13 +63,16 @@ class File < ::Protobuf::Message; end
3863
# Message Fields
3964
#
4065
class CodeGeneratorRequest
66+
FULLY_QUALIFIED_NAME = FULLY_QUALIFIED_NAME + '.CodeGeneratorRequest'
4167
repeated :string, :file_to_generate, 1
4268
optional :string, :parameter, 2
4369
repeated ::Google::Protobuf::FileDescriptorProto, :proto_file, 15
4470
end
4571

4672
class CodeGeneratorResponse
73+
FULLY_QUALIFIED_NAME = FULLY_QUALIFIED_NAME + '.CodeGeneratorResponse'
4774
class File
75+
FULLY_QUALIFIED_NAME = FULLY_QUALIFIED_NAME + '.File'
4876
optional :string, :name, 1
4977
optional :string, :insertion_point, 2
5078
optional :string, :content, 15
@@ -60,3 +88,181 @@ class File
6088

6189
end
6290

91+
92+
# Raw descriptor bytes below
93+
__END__
94+
CiVnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvEhhnb29n
95+
bGUucHJvdG9idWYuY29tcGlsZXIaIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlw
96+
dG9yLnByb3RvIqMBChRDb2RlR2VuZXJhdG9yUmVxdWVzdBIoChBmaWxlX3Rv
97+
X2dlbmVyYXRlGAEgAygJUg5maWxlVG9HZW5lcmF0ZRIcCglwYXJhbWV0ZXIY
98+
AiABKAlSCXBhcmFtZXRlchJDCgpwcm90b19maWxlGA8gAygLMiQuZ29vZ2xl
99+
LnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9SCXByb3RvRmlsZSLWAQoV
100+
Q29kZUdlbmVyYXRvclJlc3BvbnNlEhQKBWVycm9yGAEgASgJUgVlcnJvchJI
101+
CgRmaWxlGA8gAygLMjQuZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVH
102+
ZW5lcmF0b3JSZXNwb25zZS5GaWxlUgRmaWxlGl0KBEZpbGUSEgoEbmFtZRgB
103+
IAEoCVIEbmFtZRInCg9pbnNlcnRpb25fcG9pbnQYAiABKAlSDmluc2VydGlv
104+
blBvaW50EhgKB2NvbnRlbnQYDyABKAlSB2NvbnRlbnRCLAocY29tLmdvb2ds
105+
ZS5wcm90b2J1Zi5jb21waWxlckIMUGx1Z2luUHJvdG9zSqY5CgcSBS4AkgEB
106+
Cr0RCgECEgMuACEytAwgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRh
107+
dGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiBDb3B5cmlnaHQgMjAwOCBHb29nbGUg
108+
SW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIGh0dHA6Ly9jb2RlLmdvb2ds
109+
ZS5jb20vcC9wcm90b2J1Zi8KCiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
110+
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIG1v
111+
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
112+
b2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKIG1ldDoKCiAgICAgKiBSZWRpc3Ry
113+
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
114+
IGNvcHlyaWdodAogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
115+
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogICAgICogUmVkaXN0cmli
116+
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
117+
ZQogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
118+
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgogaW4gdGhlIGRvY3VtZW50
119+
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
120+
ZQogZGlzdHJpYnV0aW9uLgogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
121+
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogY29udHJpYnV0b3Jz
122+
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
123+
ZXJpdmVkIGZyb20KIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
124+
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgogVEhJUyBTT0ZUV0FSRSBJUyBQ
125+
Uk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
126+
VE9SUwogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
127+
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKIExJTUlURUQgVE8sIFRIRSBJ
128+
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
129+
RVNTIEZPUgogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
130+
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKIE9XTkVSIE9SIENP
131+
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
132+
LCBJTkNJREVOVEFMLAogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
133+
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBU
134+
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
135+
UzsgTE9TUyBPRiBVU0UsCiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
136+
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKIFRI
137+
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
138+
VCBMSUFCSUxJVFksIE9SIFRPUlQKIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
139+
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
140+
RQogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
141+
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KMvsEIEF1dGhvcjoga2VudG9u
142+
QGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKCiBXQVJOSU5HOiAgVGhlIHBs
143+
dWdpbiBpbnRlcmZhY2UgaXMgY3VycmVudGx5IEVYUEVSSU1FTlRBTCBhbmQg
144+
aXMgc3ViamVjdCB0bwogICBjaGFuZ2UuCgogcHJvdG9jIChha2EgdGhlIFBy
145+
b3RvY29sIENvbXBpbGVyKSBjYW4gYmUgZXh0ZW5kZWQgdmlhIHBsdWdpbnMu
146+
ICBBIHBsdWdpbiBpcwoganVzdCBhIHByb2dyYW0gdGhhdCByZWFkcyBhIENv
147+
ZGVHZW5lcmF0b3JSZXF1ZXN0IGZyb20gc3RkaW4gYW5kIHdyaXRlcyBhCiBD
148+
b2RlR2VuZXJhdG9yUmVzcG9uc2UgdG8gc3Rkb3V0LgoKIFBsdWdpbnMgd3Jp
149+
dHRlbiB1c2luZyBDKysgY2FuIHVzZSBnb29nbGUvcHJvdG9idWYvY29tcGls
150+
ZXIvcGx1Z2luLmggaW5zdGVhZAogb2YgZGVhbGluZyB3aXRoIHRoZSByYXcg
151+
cHJvdG9jb2wgZGVmaW5lZCBoZXJlLgoKIEEgcGx1Z2luIGV4ZWN1dGFibGUg
152+
bmVlZHMgb25seSB0byBiZSBwbGFjZWQgc29tZXdoZXJlIGluIHRoZSBwYXRo
153+
LiAgVGhlCiBwbHVnaW4gc2hvdWxkIGJlIG5hbWVkICJwcm90b2MtZ2VuLSRO
154+
QU1FIiwgYW5kIHdpbGwgdGhlbiBiZSB1c2VkIHdoZW4gdGhlCiBmbGFnICIt
155+
LSR7TkFNRX1fb3V0IiBpcyBwYXNzZWQgdG8gcHJvdG9jLgoKCAoBCBIDLwA1
156+
CgkKAggBEgMvADUKCAoBCBIDMAAtCgkKAggIEgMwAC0KCQoCAwASAzIAKgpP
157+
CgIEABIENQBKARpDIEFuIGVuY29kZWQgQ29kZUdlbmVyYXRvclJlcXVlc3Qg
158+
aXMgd3JpdHRlbiB0byB0aGUgcGx1Z2luJ3Mgc3RkaW4uCgoKCgMEAAESAzUI
159+
HArRAQoEBAACABIDOQInGsMBIFRoZSAucHJvdG8gZmlsZXMgdGhhdCB3ZXJl
160+
IGV4cGxpY2l0bHkgbGlzdGVkIG9uIHRoZSBjb21tYW5kLWxpbmUuICBUaGUK
161+
IGNvZGUgZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSBjb2RlIG9ubHkgZm9y
162+
IHRoZXNlIGZpbGVzLiAgRWFjaCBmaWxlJ3MKIGRlc2NyaXB0b3Igd2lsbCBi
163+
ZSBpbmNsdWRlZCBpbiBwcm90b19maWxlLCBiZWxvdy4KCgwKBQQAAgAEEgM5
164+
AgoKDAoFBAACAAUSAzkLEQoMCgUEAAIAARIDORIiCgwKBQQAAgADEgM5JSYK
165+
QgoEBAACARIDPAIgGjUgVGhlIGdlbmVyYXRvciBwYXJhbWV0ZXIgcGFzc2Vk
166+
IG9uIHRoZSBjb21tYW5kLWxpbmUuCgoMCgUEAAIBBBIDPAIKCgwKBQQAAgEF
167+
EgM8CxEKDAoFBAACAQESAzwSGwoMCgUEAAIBAxIDPB4fCqkFCgQEAAICEgNJ
168+
Ai8amwUgRmlsZURlc2NyaXB0b3JQcm90b3MgZm9yIGFsbCBmaWxlcyBpbiBm
169+
aWxlc190b19nZW5lcmF0ZSBhbmQgZXZlcnl0aGluZwogdGhleSBpbXBvcnQu
170+
ICBUaGUgZmlsZXMgd2lsbCBhcHBlYXIgaW4gdG9wb2xvZ2ljYWwgb3JkZXIs
171+
IHNvIGVhY2ggZmlsZQogYXBwZWFycyBiZWZvcmUgYW55IGZpbGUgdGhhdCBp
172+
bXBvcnRzIGl0LgoKIHByb3RvYyBndWFyYW50ZWVzIHRoYXQgYWxsIHByb3Rv
173+
X2ZpbGVzIHdpbGwgYmUgd3JpdHRlbiBhZnRlcgogdGhlIGZpZWxkcyBhYm92
174+
ZSwgZXZlbiB0aG91Z2ggdGhpcyBpcyBub3QgdGVjaG5pY2FsbHkgZ3VhcmFu
175+
dGVlZCBieSB0aGUKIHByb3RvYnVmIHdpcmUgZm9ybWF0LiAgVGhpcyB0aGVv
176+
cmV0aWNhbGx5IGNvdWxkIGFsbG93IGEgcGx1Z2luIHRvIHN0cmVhbQogaW4g
177+
dGhlIEZpbGVEZXNjcmlwdG9yUHJvdG9zIGFuZCBoYW5kbGUgdGhlbSBvbmUg
178+
Ynkgb25lIHJhdGhlciB0aGFuIHJlYWQKIHRoZSBlbnRpcmUgc2V0IGludG8g
179+
bWVtb3J5IGF0IG9uY2UuICBIb3dldmVyLCBhcyBvZiB0aGlzIHdyaXRpbmcs
180+
IHRoaXMKIGlzIG5vdCBzaW1pbGFybHkgb3B0aW1pemVkIG9uIHByb3RvYydz
181+
IGVuZCAtLSBpdCB3aWxsIHN0b3JlIGFsbCBmaWVsZHMgaW4KIG1lbW9yeSBh
182+
dCBvbmNlIGJlZm9yZSBzZW5kaW5nIHRoZW0gdG8gdGhlIHBsdWdpbi4KCgwK
183+
BQQAAgIEEgNJAgoKDAoFBAACAgYSA0kLHgoMCgUEAAICARIDSR8pCgwKBQQA
184+
AgIDEgNJLC4KTAoCBAESBU0AkgEBGj8gVGhlIHBsdWdpbiB3cml0ZXMgYW4g
185+
ZW5jb2RlZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgdG8gc3Rkb3V0LgoKCgoD
186+
BAEBEgNNCB0K7QMKBAQBAgASA1YCHBrfAyBFcnJvciBtZXNzYWdlLiAgSWYg
187+
bm9uLWVtcHR5LCBjb2RlIGdlbmVyYXRpb24gZmFpbGVkLiAgVGhlIHBsdWdp
188+
biBwcm9jZXNzCiBzaG91bGQgZXhpdCB3aXRoIHN0YXR1cyBjb2RlIHplcm8g
189+
ZXZlbiBpZiBpdCByZXBvcnRzIGFuIGVycm9yIGluIHRoaXMgd2F5LgoKIFRo
190+
aXMgc2hvdWxkIGJlIHVzZWQgdG8gaW5kaWNhdGUgZXJyb3JzIGluIC5wcm90
191+
byBmaWxlcyB3aGljaCBwcmV2ZW50IHRoZQogY29kZSBnZW5lcmF0b3IgZnJv
192+
bSBnZW5lcmF0aW5nIGNvcnJlY3QgY29kZS4gIEVycm9ycyB3aGljaCBpbmRp
193+
Y2F0ZSBhCiBwcm9ibGVtIGluIHByb3RvYyBpdHNlbGYgLS0gc3VjaCBhcyB0
194+
aGUgaW5wdXQgQ29kZUdlbmVyYXRvclJlcXVlc3QgYmVpbmcKIHVucGFyc2Vh
195+
YmxlIC0tIHNob3VsZCBiZSByZXBvcnRlZCBieSB3cml0aW5nIGEgbWVzc2Fn
196+
ZSB0byBzdGRlcnIgYW5kCiBleGl0aW5nIHdpdGggYSBub24temVybyBzdGF0
197+
dXMgY29kZS4KCgwKBQQBAgAEEgNWAgoKDAoFBAECAAUSA1YLEQoMCgUEAQIA
198+
ARIDVhIXCgwKBQQBAgADEgNWGhsKNAoEBAEDABIFWQKQAQMaJSBSZXByZXNl
199+
bnRzIGEgc2luZ2xlIGdlbmVyYXRlZCBmaWxlLgoKDAoFBAEDAAESA1kKDgqt
200+
BQoGBAEDAAIAEgNlBB0anQUgVGhlIGZpbGUgbmFtZSwgcmVsYXRpdmUgdG8g
201+
dGhlIG91dHB1dCBkaXJlY3RvcnkuICBUaGUgbmFtZSBtdXN0IG5vdAogY29u
202+
dGFpbiAiLiIgb3IgIi4uIiBjb21wb25lbnRzIGFuZCBtdXN0IGJlIHJlbGF0
203+
aXZlLCBub3QgYmUgYWJzb2x1dGUgKHNvLAogdGhlIGZpbGUgY2Fubm90IGxp
204+
ZSBvdXRzaWRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5KS4gICIvIiBtdXN0IGJl
205+
IHVzZWQgYXMKIHRoZSBwYXRoIHNlcGFyYXRvciwgbm90ICJcIi4KCiBJZiB0
206+
aGUgbmFtZSBpcyBvbWl0dGVkLCB0aGUgY29udGVudCB3aWxsIGJlIGFwcGVu
207+
ZGVkIHRvIHRoZSBwcmV2aW91cwogZmlsZS4gIFRoaXMgYWxsb3dzIHRoZSBn
208+
ZW5lcmF0b3IgdG8gYnJlYWsgbGFyZ2UgZmlsZXMgaW50byBzbWFsbCBjaHVu
209+
a3MsCiBhbmQgYWxsb3dzIHRoZSBnZW5lcmF0ZWQgdGV4dCB0byBiZSBzdHJl
210+
YW1lZCBiYWNrIHRvIHByb3RvYyBzbyB0aGF0IGxhcmdlCiBmaWxlcyBuZWVk
211+
IG5vdCByZXNpZGUgY29tcGxldGVseSBpbiBtZW1vcnkgYXQgb25lIHRpbWUu
212+
ICBOb3RlIHRoYXQgYXMgb2YKIHRoaXMgd3JpdGluZyBwcm90b2MgZG9lcyBu
213+
b3Qgb3B0aW1pemUgZm9yIHRoaXMgLS0gaXQgd2lsbCByZWFkIHRoZSBlbnRp
214+
cmUKIENvZGVHZW5lcmF0b3JSZXNwb25zZSBiZWZvcmUgd3JpdGluZyBmaWxl
215+
cyB0byBkaXNrLgoKDgoHBAEDAAIABBIDZQQMCg4KBwQBAwACAAUSA2UNEwoO
216+
CgcEAQMAAgABEgNlFBgKDgoHBAEDAAIAAxIDZRscCq4QCgYEAQMAAgESBIwB
217+
BCganRAgSWYgbm9uLWVtcHR5LCBpbmRpY2F0ZXMgdGhhdCB0aGUgbmFtZWQg
218+
ZmlsZSBzaG91bGQgYWxyZWFkeSBleGlzdCwgYW5kIHRoZQogY29udGVudCBo
219+
ZXJlIGlzIHRvIGJlIGluc2VydGVkIGludG8gdGhhdCBmaWxlIGF0IGEgZGVm
220+
aW5lZCBpbnNlcnRpb24KIHBvaW50LiAgVGhpcyBmZWF0dXJlIGFsbG93cyBh
221+
IGNvZGUgZ2VuZXJhdG9yIHRvIGV4dGVuZCB0aGUgb3V0cHV0CiBwcm9kdWNl
222+
ZCBieSBhbm90aGVyIGNvZGUgZ2VuZXJhdG9yLiAgVGhlIG9yaWdpbmFsIGdl
223+
bmVyYXRvciBtYXkgcHJvdmlkZQogaW5zZXJ0aW9uIHBvaW50cyBieSBwbGFj
224+
aW5nIHNwZWNpYWwgYW5ub3RhdGlvbnMgaW4gdGhlIGZpbGUgdGhhdCBsb29r
225+
CiBsaWtlOgogICBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoTkFNRSkKIFRo
226+
ZSBhbm5vdGF0aW9uIGNhbiBoYXZlIGFyYml0cmFyeSB0ZXh0IGJlZm9yZSBh
227+
bmQgYWZ0ZXIgaXQgb24gdGhlIGxpbmUsCiB3aGljaCBhbGxvd3MgaXQgdG8g
228+
YmUgcGxhY2VkIGluIGEgY29tbWVudC4gIE5BTUUgc2hvdWxkIGJlIHJlcGxh
229+
Y2VkIHdpdGgKIGFuIGlkZW50aWZpZXIgbmFtaW5nIHRoZSBwb2ludCAtLSB0
230+
aGlzIGlzIHdoYXQgb3RoZXIgZ2VuZXJhdG9ycyB3aWxsIHVzZQogYXMgdGhl
231+
IGluc2VydGlvbl9wb2ludC4gIENvZGUgaW5zZXJ0ZWQgYXQgdGhpcyBwb2lu
232+
dCB3aWxsIGJlIHBsYWNlZAogaW1tZWRpYXRlbHkgYWJvdmUgdGhlIGxpbmUg
233+
Y29udGFpbmluZyB0aGUgaW5zZXJ0aW9uIHBvaW50ICh0aHVzIG11bHRpcGxl
234+
CiBpbnNlcnRpb25zIHRvIHRoZSBzYW1lIHBvaW50IHdpbGwgY29tZSBvdXQg
235+
aW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZCkuCiBUaGUgZG91YmxlLUAg
236+
aXMgaW50ZW5kZWQgdG8gbWFrZSBpdCB1bmxpa2VseSB0aGF0IHRoZSBnZW5l
237+
cmF0ZWQgY29kZQogY291bGQgY29udGFpbiB0aGluZ3MgdGhhdCBsb29rIGxp
238+
a2UgaW5zZXJ0aW9uIHBvaW50cyBieSBhY2NpZGVudC4KCiBGb3IgZXhhbXBs
239+
ZSwgdGhlIEMrKyBjb2RlIGdlbmVyYXRvciBwbGFjZXMgdGhlIGZvbGxvd2lu
240+
ZyBsaW5lIGluIHRoZQogLnBiLmggZmlsZXMgdGhhdCBpdCBnZW5lcmF0ZXM6
241+
CiAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2Nv
242+
cGUpCiBUaGlzIGxpbmUgYXBwZWFycyB3aXRoaW4gdGhlIHNjb3BlIG9mIHRo
243+
ZSBmaWxlJ3MgcGFja2FnZSBuYW1lc3BhY2UsIGJ1dAogb3V0c2lkZSBvZiBh
244+
bnkgcGFydGljdWxhciBjbGFzcy4gIEFub3RoZXIgcGx1Z2luIGNhbiB0aGVu
245+
IHNwZWNpZnkgdGhlCiBpbnNlcnRpb25fcG9pbnQgIm5hbWVzcGFjZV9zY29w
246+
ZSIgdG8gZ2VuZXJhdGUgYWRkaXRpb25hbCBjbGFzc2VzIG9yCiBvdGhlciBk
247+
ZWNsYXJhdGlvbnMgdGhhdCBzaG91bGQgYmUgcGxhY2VkIGluIHRoaXMgc2Nv
248+
cGUuCgogTm90ZSB0aGF0IGlmIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGlu
249+
c2VydGlvbiBwb2ludCBiZWdpbnMgd2l0aAogd2hpdGVzcGFjZSwgdGhlIHNh
250+
bWUgd2hpdGVzcGFjZSB3aWxsIGJlIGFkZGVkIHRvIGV2ZXJ5IGxpbmUgb2Yg
251+
dGhlCiBpbnNlcnRlZCB0ZXh0LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGxhbmd1
252+
YWdlcyBsaWtlIFB5dGhvbiwgd2hlcmUKIGluZGVudGF0aW9uIG1hdHRlcnMu
253+
ICBJbiB0aGVzZSBsYW5ndWFnZXMsIHRoZSBpbnNlcnRpb24gcG9pbnQgY29t
254+
bWVudAogc2hvdWxkIGJlIGluZGVudGVkIHRoZSBzYW1lIGFtb3VudCBhcyBh
255+
bnkgaW5zZXJ0ZWQgY29kZSB3aWxsIG5lZWQgdG8gYmUKIGluIG9yZGVyIHRv
256+
IHdvcmsgY29ycmVjdGx5IGluIHRoYXQgY29udGV4dC4KCiBUaGUgY29kZSBn
257+
ZW5lcmF0b3IgdGhhdCBnZW5lcmF0ZXMgdGhlIGluaXRpYWwgZmlsZSBhbmQg
258+
dGhlIG9uZSB3aGljaAogaW5zZXJ0cyBpbnRvIGl0IG11c3QgYm90aCBydW4g
259+
YXMgcGFydCBvZiBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mIHByb3RvYy4KIENv
260+
ZGUgZ2VuZXJhdG9ycyBhcmUgZXhlY3V0ZWQgaW4gdGhlIG9yZGVyIGluIHdo
261+
aWNoIHRoZXkgYXBwZWFyIG9uIHRoZQogY29tbWFuZCBsaW5lLgoKIElmIHxp
262+
bnNlcnRpb25fcG9pbnR8IGlzIHByZXNlbnQsIHxuYW1lfCBtdXN0IGFsc28g
263+
YmUgcHJlc2VudC4KCg8KBwQBAwACAQQSBIwBBAwKDwoHBAEDAAIBBRIEjAEN
264+
EwoPCgcEAQMAAgEBEgSMARQjCg8KBwQBAwACAQMSBIwBJicKJAoGBAEDAAIC
265+
EgSPAQQhGhQgVGhlIGZpbGUgY29udGVudHMuCgoPCgcEAQMAAgIEEgSPAQQM
266+
Cg8KBwQBAwACAgUSBI8BDRMKDwoHBAEDAAICARIEjwEUGwoPCgcEAQMAAgID
267+
EgSPAR4gCgwKBAQBAgESBJEBAhoKDQoFBAECAQQSBJEBAgoKDQoFBAECAQYS
268+
BJEBCw8KDQoFBAECAQESBJEBEBQKDQoFBAECAQMSBJEBFxk=

0 commit comments

Comments
 (0)