Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
P
protobuf
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
protobuf
Commits
ce6bec74
Commit
ce6bec74
authored
May 06, 2016
by
Jisi Liu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove accidentally restored deleted files.
parent
f8a5c5f7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
0 additions
and
553 deletions
+0
-553
AbstractMessage.java
java/src/main/java/com/google/protobuf/AbstractMessage.java
+0
-0
AbstractMessageLite.java
...rc/main/java/com/google/protobuf/AbstractMessageLite.java
+0
-0
AbstractParser.java
java/src/main/java/com/google/protobuf/AbstractParser.java
+0
-258
AbstractProtobufList.java
...c/main/java/com/google/protobuf/AbstractProtobufList.java
+0
-180
BlockingRpcChannel.java
...src/main/java/com/google/protobuf/BlockingRpcChannel.java
+0
-51
BlockingService.java
java/src/main/java/com/google/protobuf/BlockingService.java
+0
-64
No files found.
java/src/main/java/com/google/protobuf/AbstractMessage.java
deleted
100644 → 0
View file @
f8a5c5f7
This diff is collapsed.
Click to expand it.
java/src/main/java/com/google/protobuf/AbstractMessageLite.java
deleted
100644 → 0
View file @
f8a5c5f7
This diff is collapsed.
Click to expand it.
java/src/main/java/com/google/protobuf/AbstractParser.java
deleted
100644 → 0
View file @
f8a5c5f7
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package
com
.
google
.
protobuf
;
import
com.google.protobuf.AbstractMessageLite.Builder.LimitedInputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
/**
* A partial implementation of the {@link Parser} interface which implements
* as many methods of that interface as possible in terms of other methods.
*
* Note: This class implements all the convenience methods in the
* {@link Parser} interface. See {@link Parser} for related javadocs.
* Subclasses need to implement
* {@link Parser#parsePartialFrom(CodedInputStream, ExtensionRegistryLite)}
*
* @author liujisi@google.com (Pherl Liu)
*/
public
abstract
class
AbstractParser
<
MessageType
extends
MessageLite
>
implements
Parser
<
MessageType
>
{
/**
* Creates an UninitializedMessageException for MessageType.
*/
private
UninitializedMessageException
newUninitializedMessageException
(
MessageType
message
)
{
if
(
message
instanceof
AbstractMessageLite
)
{
return
((
AbstractMessageLite
)
message
).
newUninitializedMessageException
();
}
return
new
UninitializedMessageException
(
message
);
}
/**
* Helper method to check if message is initialized.
*
* @throws InvalidProtocolBufferException if it is not initialized.
* @return The message to check.
*/
private
MessageType
checkMessageInitialized
(
MessageType
message
)
throws
InvalidProtocolBufferException
{
if
(
message
!=
null
&&
!
message
.
isInitialized
())
{
throw
newUninitializedMessageException
(
message
)
.
asInvalidProtocolBufferException
()
.
setUnfinishedMessage
(
message
);
}
return
message
;
}
private
static
final
ExtensionRegistryLite
EMPTY_REGISTRY
=
ExtensionRegistryLite
.
getEmptyRegistry
();
@Override
public
MessageType
parsePartialFrom
(
CodedInputStream
input
)
throws
InvalidProtocolBufferException
{
return
parsePartialFrom
(
input
,
EMPTY_REGISTRY
);
}
@Override
public
MessageType
parseFrom
(
CodedInputStream
input
,
ExtensionRegistryLite
extensionRegistry
)
throws
InvalidProtocolBufferException
{
return
checkMessageInitialized
(
parsePartialFrom
(
input
,
extensionRegistry
));
}
@Override
public
MessageType
parseFrom
(
CodedInputStream
input
)
throws
InvalidProtocolBufferException
{
return
parseFrom
(
input
,
EMPTY_REGISTRY
);
}
@Override
public
MessageType
parsePartialFrom
(
ByteString
data
,
ExtensionRegistryLite
extensionRegistry
)
throws
InvalidProtocolBufferException
{
MessageType
message
;
try
{
CodedInputStream
input
=
data
.
newCodedInput
();
message
=
parsePartialFrom
(
input
,
extensionRegistry
);
try
{
input
.
checkLastTagWas
(
0
);
}
catch
(
InvalidProtocolBufferException
e
)
{
throw
e
.
setUnfinishedMessage
(
message
);
}
return
message
;
}
catch
(
InvalidProtocolBufferException
e
)
{
throw
e
;
}
}
@Override
public
MessageType
parsePartialFrom
(
ByteString
data
)
throws
InvalidProtocolBufferException
{
return
parsePartialFrom
(
data
,
EMPTY_REGISTRY
);
}
@Override
public
MessageType
parseFrom
(
ByteString
data
,
ExtensionRegistryLite
extensionRegistry
)
throws
InvalidProtocolBufferException
{
return
checkMessageInitialized
(
parsePartialFrom
(
data
,
extensionRegistry
));
}
@Override
public
MessageType
parseFrom
(
ByteString
data
)
throws
InvalidProtocolBufferException
{
return
parseFrom
(
data
,
EMPTY_REGISTRY
);
}
@Override
public
MessageType
parsePartialFrom
(
byte
[]
data
,
int
off
,
int
len
,
ExtensionRegistryLite
extensionRegistry
)
throws
InvalidProtocolBufferException
{
try
{
CodedInputStream
input
=
CodedInputStream
.
newInstance
(
data
,
off
,
len
);
MessageType
message
=
parsePartialFrom
(
input
,
extensionRegistry
);
try
{
input
.
checkLastTagWas
(
0
);
}
catch
(
InvalidProtocolBufferException
e
)
{
throw
e
.
setUnfinishedMessage
(
message
);
}
return
message
;
}
catch
(
InvalidProtocolBufferException
e
)
{
throw
e
;
}
}
@Override
public
MessageType
parsePartialFrom
(
byte
[]
data
,
int
off
,
int
len
)
throws
InvalidProtocolBufferException
{
return
parsePartialFrom
(
data
,
off
,
len
,
EMPTY_REGISTRY
);
}
@Override
public
MessageType
parsePartialFrom
(
byte
[]
data
,
ExtensionRegistryLite
extensionRegistry
)
throws
InvalidProtocolBufferException
{
return
parsePartialFrom
(
data
,
0
,
data
.
length
,
extensionRegistry
);
}
@Override
public
MessageType
parsePartialFrom
(
byte
[]
data
)
throws
InvalidProtocolBufferException
{
return
parsePartialFrom
(
data
,
0
,
data
.
length
,
EMPTY_REGISTRY
);
}
@Override
public
MessageType
parseFrom
(
byte
[]
data
,
int
off
,
int
len
,
ExtensionRegistryLite
extensionRegistry
)
throws
InvalidProtocolBufferException
{
return
checkMessageInitialized
(
parsePartialFrom
(
data
,
off
,
len
,
extensionRegistry
));
}
@Override
public
MessageType
parseFrom
(
byte
[]
data
,
int
off
,
int
len
)
throws
InvalidProtocolBufferException
{
return
parseFrom
(
data
,
off
,
len
,
EMPTY_REGISTRY
);
}
@Override
public
MessageType
parseFrom
(
byte
[]
data
,
ExtensionRegistryLite
extensionRegistry
)
throws
InvalidProtocolBufferException
{
return
parseFrom
(
data
,
0
,
data
.
length
,
extensionRegistry
);
}
@Override
public
MessageType
parseFrom
(
byte
[]
data
)
throws
InvalidProtocolBufferException
{
return
parseFrom
(
data
,
EMPTY_REGISTRY
);
}
@Override
public
MessageType
parsePartialFrom
(
InputStream
input
,
ExtensionRegistryLite
extensionRegistry
)
throws
InvalidProtocolBufferException
{
CodedInputStream
codedInput
=
CodedInputStream
.
newInstance
(
input
);
MessageType
message
=
parsePartialFrom
(
codedInput
,
extensionRegistry
);
try
{
codedInput
.
checkLastTagWas
(
0
);
}
catch
(
InvalidProtocolBufferException
e
)
{
throw
e
.
setUnfinishedMessage
(
message
);
}
return
message
;
}
@Override
public
MessageType
parsePartialFrom
(
InputStream
input
)
throws
InvalidProtocolBufferException
{
return
parsePartialFrom
(
input
,
EMPTY_REGISTRY
);
}
@Override
public
MessageType
parseFrom
(
InputStream
input
,
ExtensionRegistryLite
extensionRegistry
)
throws
InvalidProtocolBufferException
{
return
checkMessageInitialized
(
parsePartialFrom
(
input
,
extensionRegistry
));
}
@Override
public
MessageType
parseFrom
(
InputStream
input
)
throws
InvalidProtocolBufferException
{
return
parseFrom
(
input
,
EMPTY_REGISTRY
);
}
@Override
public
MessageType
parsePartialDelimitedFrom
(
InputStream
input
,
ExtensionRegistryLite
extensionRegistry
)
throws
InvalidProtocolBufferException
{
int
size
;
try
{
int
firstByte
=
input
.
read
();
if
(
firstByte
==
-
1
)
{
return
null
;
}
size
=
CodedInputStream
.
readRawVarint32
(
firstByte
,
input
);
}
catch
(
IOException
e
)
{
throw
new
InvalidProtocolBufferException
(
e
.
getMessage
());
}
InputStream
limitedInput
=
new
LimitedInputStream
(
input
,
size
);
return
parsePartialFrom
(
limitedInput
,
extensionRegistry
);
}
@Override
public
MessageType
parsePartialDelimitedFrom
(
InputStream
input
)
throws
InvalidProtocolBufferException
{
return
parsePartialDelimitedFrom
(
input
,
EMPTY_REGISTRY
);
}
@Override
public
MessageType
parseDelimitedFrom
(
InputStream
input
,
ExtensionRegistryLite
extensionRegistry
)
throws
InvalidProtocolBufferException
{
return
checkMessageInitialized
(
parsePartialDelimitedFrom
(
input
,
extensionRegistry
));
}
@Override
public
MessageType
parseDelimitedFrom
(
InputStream
input
)
throws
InvalidProtocolBufferException
{
return
parseDelimitedFrom
(
input
,
EMPTY_REGISTRY
);
}
}
java/src/main/java/com/google/protobuf/AbstractProtobufList.java
deleted
100644 → 0
View file @
f8a5c5f7
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package
com
.
google
.
protobuf
;
import
com.google.protobuf.Internal.ProtobufList
;
import
java.util.AbstractList
;
import
java.util.Collection
;
import
java.util.List
;
import
java.util.RandomAccess
;
/**
* An abstract implementation of {@link ProtobufList} which manages mutability semantics. All mutate
* methods must check if the list is mutable before proceeding. Subclasses must invoke
* {@link #ensureIsMutable()} manually when overriding those methods.
* <p>
* This implementation assumes all subclasses are array based, supporting random access.
*/
abstract
class
AbstractProtobufList
<
E
>
extends
AbstractList
<
E
>
implements
ProtobufList
<
E
>
{
protected
static
final
int
DEFAULT_CAPACITY
=
10
;
/**
* Whether or not this list is modifiable.
*/
private
boolean
isMutable
;
/**
* Constructs a mutable list by default.
*/
AbstractProtobufList
()
{
isMutable
=
true
;
}
@Override
public
boolean
equals
(
Object
o
)
{
if
(
o
==
this
)
{
return
true
;
}
if
(!(
o
instanceof
List
))
{
return
false
;
}
// Handle lists that do not support RandomAccess as efficiently as possible by using an iterator
// based approach in our super class. Otherwise our index based approach will avoid those
// allocations.
if
(!(
o
instanceof
RandomAccess
))
{
return
super
.
equals
(
o
);
}
List
<?>
other
=
(
List
<?>)
o
;
final
int
size
=
size
();
if
(
size
!=
other
.
size
())
{
return
false
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
if
(!
get
(
i
).
equals
(
other
.
get
(
i
)))
{
return
false
;
}
}
return
true
;
}
@Override
public
int
hashCode
()
{
final
int
size
=
size
();
int
hashCode
=
1
;
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
hashCode
=
(
31
*
hashCode
)
+
get
(
i
).
hashCode
();
}
return
hashCode
;
}
@Override
public
boolean
add
(
E
e
)
{
ensureIsMutable
();
return
super
.
add
(
e
);
}
@Override
public
void
add
(
int
index
,
E
element
)
{
ensureIsMutable
();
super
.
add
(
index
,
element
);
}
@Override
public
boolean
addAll
(
Collection
<?
extends
E
>
c
)
{
ensureIsMutable
();
return
super
.
addAll
(
c
);
}
@Override
public
boolean
addAll
(
int
index
,
Collection
<?
extends
E
>
c
)
{
ensureIsMutable
();
return
super
.
addAll
(
index
,
c
);
}
@Override
public
void
clear
()
{
ensureIsMutable
();
super
.
clear
();
}
@Override
public
boolean
isModifiable
()
{
return
isMutable
;
}
@Override
public
final
void
makeImmutable
()
{
isMutable
=
false
;
}
@Override
public
E
remove
(
int
index
)
{
ensureIsMutable
();
return
super
.
remove
(
index
);
}
@Override
public
boolean
remove
(
Object
o
)
{
ensureIsMutable
();
return
super
.
remove
(
o
);
}
@Override
public
boolean
removeAll
(
Collection
<?>
c
)
{
ensureIsMutable
();
return
super
.
removeAll
(
c
);
}
@Override
public
boolean
retainAll
(
Collection
<?>
c
)
{
ensureIsMutable
();
return
super
.
retainAll
(
c
);
}
@Override
public
E
set
(
int
index
,
E
element
)
{
ensureIsMutable
();
return
super
.
set
(
index
,
element
);
}
/**
* Throws an {@link UnsupportedOperationException} if the list is immutable. Subclasses are
* responsible for invoking this method on mutate operations.
*/
protected
void
ensureIsMutable
()
{
if
(!
isMutable
)
{
throw
new
UnsupportedOperationException
();
}
}
}
java/src/main/java/com/google/protobuf/BlockingRpcChannel.java
deleted
100644 → 0
View file @
f8a5c5f7
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package
com
.
google
.
protobuf
;
/**
* <p>Abstract interface for a blocking RPC channel. {@code BlockingRpcChannel}
* is the blocking equivalent to {@link RpcChannel}.
*
* @author kenton@google.com Kenton Varda
* @author cpovirk@google.com Chris Povirk
*/
public
interface
BlockingRpcChannel
{
/**
* Call the given method of the remote service and blocks until it returns.
* {@code callBlockingMethod()} is the blocking equivalent to
* {@link RpcChannel#callMethod}.
*/
Message
callBlockingMethod
(
Descriptors
.
MethodDescriptor
method
,
RpcController
controller
,
Message
request
,
Message
responsePrototype
)
throws
ServiceException
;
}
java/src/main/java/com/google/protobuf/BlockingService.java
deleted
100644 → 0
View file @
f8a5c5f7
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package
com
.
google
.
protobuf
;
/**
* Blocking equivalent to {@link Service}.
*
* @author kenton@google.com Kenton Varda
* @author cpovirk@google.com Chris Povirk
*/
public
interface
BlockingService
{
/**
* Equivalent to {@link Service#getDescriptorForType}.
*/
Descriptors
.
ServiceDescriptor
getDescriptorForType
();
/**
* Equivalent to {@link Service#callMethod}, except that
* {@code callBlockingMethod()} returns the result of the RPC or throws a
* {@link ServiceException} if there is a failure, rather than passing the
* information to a callback.
*/
Message
callBlockingMethod
(
Descriptors
.
MethodDescriptor
method
,
RpcController
controller
,
Message
request
)
throws
ServiceException
;
/**
* Equivalent to {@link Service#getRequestPrototype}.
*/
Message
getRequestPrototype
(
Descriptors
.
MethodDescriptor
method
);
/**
* Equivalent to {@link Service#getResponsePrototype}.
*/
Message
getResponsePrototype
(
Descriptors
.
MethodDescriptor
method
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment