Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
SDK
/
exoplayer
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
4446e263
authored
Nov 27, 2020
by
andrewlewis
Committed by
Ian Baker
Nov 30, 2020
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Fix unexpected multiline comments
#exofixit PiperOrigin-RevId: 344517105
parent
6d01d409
Show whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
31 additions
and
32 deletions
demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java
demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionDialog.java
extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java
extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastTimeline.java
library/common/src/main/java/com/google/android/exoplayer2/drm/DrmInitData.java
library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/ChapterTocFrame.java
library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/MlltFrame.java
library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java
library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java
library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java
library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java
library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java
library/core/src/test/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManagerTest.java
library/core/src/test/java/com/google/android/exoplayer2/source/ConcatenatingMediaSourceTest.java
library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java
library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriodTest.java
library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java
demos/main/src/main/java/com/google/android/exoplayer2/demo/DownloadTracker.java
View file @
4446e263
...
@@ -332,7 +332,7 @@ public class DownloadTracker {
...
@@ -332,7 +332,7 @@ public class DownloadTracker {
/* titleId= */
R
.
string
.
exo_download_description
,
/* titleId= */
R
.
string
.
exo_download_description
,
mappedTrackInfo
,
mappedTrackInfo
,
trackSelectorParameters
,
trackSelectorParameters
,
/* allowAdaptiveSelections
=
*/
false
,
/* allowAdaptiveSelections
=
*/
false
,
/* allowMultipleOverrides= */
true
,
/* allowMultipleOverrides= */
true
,
/* onClickListener= */
this
,
/* onClickListener= */
this
,
/* onDismissListener= */
this
);
/* onDismissListener= */
this
);
...
...
demos/main/src/main/java/com/google/android/exoplayer2/demo/TrackSelectionDialog.java
View file @
4446e263
...
@@ -94,7 +94,7 @@ public final class TrackSelectionDialog extends DialogFragment {
...
@@ -94,7 +94,7 @@ public final class TrackSelectionDialog extends DialogFragment {
/* titleId= */
R
.
string
.
track_selection_title
,
/* titleId= */
R
.
string
.
track_selection_title
,
mappedTrackInfo
,
mappedTrackInfo
,
/* initialParameters = */
parameters
,
/* initialParameters = */
parameters
,
/* allowAdaptiveSelections
=
*/
true
,
/* allowAdaptiveSelections
=
*/
true
,
/* allowMultipleOverrides= */
false
,
/* allowMultipleOverrides= */
false
,
/* onClickListener= */
(
dialog
,
which
)
->
{
/* onClickListener= */
(
dialog
,
which
)
->
{
DefaultTrackSelector
.
ParametersBuilder
builder
=
parameters
.
buildUpon
();
DefaultTrackSelector
.
ParametersBuilder
builder
=
parameters
.
buildUpon
();
...
...
extensions/av1/src/main/java/com/google/android/exoplayer2/ext/av1/Libgav1VideoRenderer.java
View file @
4446e263
...
@@ -45,7 +45,10 @@ public class Libgav1VideoRenderer extends DecoderVideoRenderer {
...
@@ -45,7 +45,10 @@ public class Libgav1VideoRenderer extends DecoderVideoRenderer {
private
static
final
String
TAG
=
"Libgav1VideoRenderer"
;
private
static
final
String
TAG
=
"Libgav1VideoRenderer"
;
private
static
final
int
DEFAULT_NUM_OF_INPUT_BUFFERS
=
4
;
private
static
final
int
DEFAULT_NUM_OF_INPUT_BUFFERS
=
4
;
private
static
final
int
DEFAULT_NUM_OF_OUTPUT_BUFFERS
=
4
;
private
static
final
int
DEFAULT_NUM_OF_OUTPUT_BUFFERS
=
4
;
/* Default size based on 720p resolution video compressed by a factor of two. */
/**
* Default input buffer size in bytes, based on 720p resolution video compressed by a factor of
* two.
*/
private
static
final
int
DEFAULT_INPUT_BUFFER_SIZE
=
private
static
final
int
DEFAULT_INPUT_BUFFER_SIZE
=
Util
.
ceilDivide
(
1280
,
64
)
*
Util
.
ceilDivide
(
720
,
64
)
*
(
64
*
64
*
3
/
2
)
/
2
;
Util
.
ceilDivide
(
1280
,
64
)
*
Util
.
ceilDivide
(
720
,
64
)
*
(
64
*
64
*
3
/
2
)
/
2
;
...
...
extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastTimeline.java
View file @
4446e263
...
@@ -46,8 +46,8 @@ import java.util.Arrays;
...
@@ -46,8 +46,8 @@ import java.util.Arrays;
private
ItemData
()
{
private
ItemData
()
{
this
(
this
(
/* durationUs= */
C
.
TIME_UNSET
,
/* defaultPositionUs */
/* durationUs= */
C
.
TIME_UNSET
,
C
.
TIME_UNSET
,
/* defaultPositionUs= */
C
.
TIME_UNSET
,
/* isLive= */
false
);
/* isLive= */
false
);
}
}
...
...
library/common/src/main/java/com/google/android/exoplayer2/drm/DrmInitData.java
View file @
4446e263
...
@@ -137,8 +137,7 @@ public final class DrmInitData implements Comparator<SchemeData>, Parcelable {
...
@@ -137,8 +137,7 @@ public final class DrmInitData implements Comparator<SchemeData>, Parcelable {
Arrays
.
sort
(
this
.
schemeDatas
,
this
);
Arrays
.
sort
(
this
.
schemeDatas
,
this
);
}
}
/* package */
/* package */
DrmInitData
(
Parcel
in
)
{
DrmInitData
(
Parcel
in
)
{
schemeType
=
in
.
readString
();
schemeType
=
in
.
readString
();
schemeDatas
=
Util
.
castNonNull
(
in
.
createTypedArray
(
SchemeData
.
CREATOR
));
schemeDatas
=
Util
.
castNonNull
(
in
.
createTypedArray
(
SchemeData
.
CREATOR
));
schemeDataCount
=
schemeDatas
.
length
;
schemeDataCount
=
schemeDatas
.
length
;
...
...
library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/ChapterTocFrame.java
View file @
4446e263
...
@@ -45,8 +45,7 @@ public final class ChapterTocFrame extends Id3Frame {
...
@@ -45,8 +45,7 @@ public final class ChapterTocFrame extends Id3Frame {
this
.
subFrames
=
subFrames
;
this
.
subFrames
=
subFrames
;
}
}
/* package */
/* package */
ChapterTocFrame
(
Parcel
in
)
{
ChapterTocFrame
(
Parcel
in
)
{
super
(
ID
);
super
(
ID
);
this
.
elementId
=
castNonNull
(
in
.
readString
());
this
.
elementId
=
castNonNull
(
in
.
readString
());
this
.
isRoot
=
in
.
readByte
()
!=
0
;
this
.
isRoot
=
in
.
readByte
()
!=
0
;
...
...
library/common/src/main/java/com/google/android/exoplayer2/metadata/id3/MlltFrame.java
View file @
4446e263
...
@@ -45,8 +45,7 @@ public final class MlltFrame extends Id3Frame {
...
@@ -45,8 +45,7 @@ public final class MlltFrame extends Id3Frame {
this
.
millisecondsDeviations
=
millisecondsDeviations
;
this
.
millisecondsDeviations
=
millisecondsDeviations
;
}
}
/* package */
/* package */
MlltFrame
(
Parcel
in
)
{
MlltFrame
(
Parcel
in
)
{
super
(
ID
);
super
(
ID
);
this
.
mpegFramesBetweenReference
=
in
.
readInt
();
this
.
mpegFramesBetweenReference
=
in
.
readInt
();
this
.
bytesBetweenReference
=
in
.
readInt
();
this
.
bytesBetweenReference
=
in
.
readInt
();
...
...
library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java
View file @
4446e263
...
@@ -1756,7 +1756,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
...
@@ -1756,7 +1756,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
processOutputMediaFormatChanged
();
processOutputMediaFormatChanged
();
return
true
;
return
true
;
}
}
/
* MediaCodec.INFO_TRY_AGAIN_LATER (-1) or unknown negative return value */
/
/ MediaCodec.INFO_TRY_AGAIN_LATER (-1) or unknown negative return value.
if
(
codecNeedsEosPropagation
if
(
codecNeedsEosPropagation
&&
(
inputStreamEnded
||
codecDrainState
==
DRAIN_STATE_WAIT_END_OF_STREAM
))
{
&&
(
inputStreamEnded
||
codecDrainState
==
DRAIN_STATE_WAIT_END_OF_STREAM
))
{
processEndOfStream
();
processEndOfStream
();
...
...
library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java
View file @
4446e263
...
@@ -397,7 +397,7 @@ public final class DefaultDownloadIndex implements WritableDownloadIndex {
...
@@ -397,7 +397,7 @@ public final class DefaultDownloadIndex implements WritableDownloadIndex {
}
}
@VisibleForTesting
@VisibleForTesting
/* package*/
static
String
encodeStreamKeys
(
List
<
StreamKey
>
streamKeys
)
{
/* package
*/
static
String
encodeStreamKeys
(
List
<
StreamKey
>
streamKeys
)
{
StringBuilder
stringBuilder
=
new
StringBuilder
();
StringBuilder
stringBuilder
=
new
StringBuilder
();
for
(
int
i
=
0
;
i
<
streamKeys
.
size
();
i
++)
{
for
(
int
i
=
0
;
i
<
streamKeys
.
size
();
i
++)
{
StreamKey
streamKey
=
streamKeys
.
get
(
i
);
StreamKey
streamKey
=
streamKeys
.
get
(
i
);
...
...
library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java
View file @
4446e263
...
@@ -1088,8 +1088,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
...
@@ -1088,8 +1088,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
this
.
rendererDisabledFlags
=
rendererDisabledFlags
;
this
.
rendererDisabledFlags
=
rendererDisabledFlags
;
}
}
/* package */
/* package */
Parameters
(
Parcel
in
)
{
Parameters
(
Parcel
in
)
{
super
(
in
);
super
(
in
);
// Video
// Video
this
.
maxVideoWidth
=
in
.
readInt
();
this
.
maxVideoWidth
=
in
.
readInt
();
...
...
library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java
View file @
4446e263
...
@@ -3138,7 +3138,7 @@ public final class ExoPlayerTest {
...
@@ -3138,7 +3138,7 @@ public final class ExoPlayerTest {
Timeline
timeline
=
Timeline
timeline
=
new
FakeTimeline
(
new
FakeTimeline
(
new
TimelineWindowDefinition
(
new
TimelineWindowDefinition
(
/* periodCount
=
*/
2
,
/* periodCount
=
*/
2
,
/* id= */
new
Object
(),
/* id= */
new
Object
(),
/* isSeekable= */
true
,
/* isSeekable= */
true
,
/* isDynamic= */
false
,
/* isDynamic= */
false
,
...
@@ -8760,7 +8760,7 @@ public final class ExoPlayerTest {
...
@@ -8760,7 +8760,7 @@ public final class ExoPlayerTest {
// Internal classes.
// Internal classes.
/* {@link FakeRenderer} that can sleep and be woken-up. */
/*
*
{@link FakeRenderer} that can sleep and be woken-up. */
private
static
class
FakeSleepRenderer
extends
FakeRenderer
{
private
static
class
FakeSleepRenderer
extends
FakeRenderer
{
private
static
final
long
WAKEUP_DEADLINE_MS
=
60
*
C
.
MICROS_PER_SECOND
;
private
static
final
long
WAKEUP_DEADLINE_MS
=
60
*
C
.
MICROS_PER_SECOND
;
private
final
AtomicBoolean
sleepOnNextRender
;
private
final
AtomicBoolean
sleepOnNextRender
;
...
...
library/core/src/test/java/com/google/android/exoplayer2/analytics/AnalyticsCollectorTest.java
View file @
4446e263
...
@@ -1002,8 +1002,8 @@ public final class AnalyticsCollectorTest {
...
@@ -1002,8 +1002,8 @@ public final class AnalyticsCollectorTest {
AtomicReference
<
AdPlaybackState
>
adPlaybackState
=
AtomicReference
<
AdPlaybackState
>
adPlaybackState
=
new
AtomicReference
<>(
new
AtomicReference
<>(
FakeTimeline
.
createAdPlaybackState
(
FakeTimeline
.
createAdPlaybackState
(
/* adsPerAdGroup= */
1
,
/* adGroupTimesUs...= */
/* adsPerAdGroup= */
1
,
windowOffsetInFirstPeriodUs
,
/* adGroupTimesUs...= */
windowOffsetInFirstPeriodUs
,
windowOffsetInFirstPeriodUs
+
5
*
C
.
MICROS_PER_SECOND
,
windowOffsetInFirstPeriodUs
+
5
*
C
.
MICROS_PER_SECOND
,
C
.
TIME_END_OF_SOURCE
));
C
.
TIME_END_OF_SOURCE
));
AtomicInteger
playedAdCount
=
new
AtomicInteger
(
0
);
AtomicInteger
playedAdCount
=
new
AtomicInteger
(
0
);
...
...
library/core/src/test/java/com/google/android/exoplayer2/analytics/DefaultPlaybackSessionManagerTest.java
View file @
4446e263
...
@@ -417,7 +417,7 @@ public final class DefaultPlaybackSessionManagerTest {
...
@@ -417,7 +417,7 @@ public final class DefaultPlaybackSessionManagerTest {
/* id= */
0
,
/* id= */
0
,
/* isSeekable= */
true
,
/* isSeekable= */
true
,
/* isDynamic= */
false
,
/* isDynamic= */
false
,
/* durationUs
=
*/
10
*
C
.
MICROS_PER_SECOND
,
/* durationUs
=
*/
10
*
C
.
MICROS_PER_SECOND
,
new
AdPlaybackState
(
new
AdPlaybackState
(
/* adsId= */
new
Object
(),
/* adsId= */
new
Object
(),
/* adGroupTimesUs=... */
2
*
C
.
MICROS_PER_SECOND
,
/* adGroupTimesUs=... */
2
*
C
.
MICROS_PER_SECOND
,
...
@@ -702,7 +702,7 @@ public final class DefaultPlaybackSessionManagerTest {
...
@@ -702,7 +702,7 @@ public final class DefaultPlaybackSessionManagerTest {
/* id= */
0
,
/* id= */
0
,
/* isSeekable= */
true
,
/* isSeekable= */
true
,
/* isDynamic= */
false
,
/* isDynamic= */
false
,
/* durationUs
=
*/
10
*
C
.
MICROS_PER_SECOND
,
/* durationUs
=
*/
10
*
C
.
MICROS_PER_SECOND
,
new
AdPlaybackState
(
new
AdPlaybackState
(
/* adsId= */
new
Object
(),
/* adGroupTimesUs=... */
C
.
TIME_END_OF_SOURCE
)
/* adsId= */
new
Object
(),
/* adGroupTimesUs=... */
C
.
TIME_END_OF_SOURCE
)
.
withAdCount
(
/* adGroupIndex= */
0
,
/* adCount= */
1
)));
.
withAdCount
(
/* adGroupIndex= */
0
,
/* adCount= */
1
)));
...
@@ -905,7 +905,7 @@ public final class DefaultPlaybackSessionManagerTest {
...
@@ -905,7 +905,7 @@ public final class DefaultPlaybackSessionManagerTest {
/* id= */
0
,
/* id= */
0
,
/* isSeekable= */
true
,
/* isSeekable= */
true
,
/* isDynamic= */
false
,
/* isDynamic= */
false
,
/* durationUs
=
*/
10
*
C
.
MICROS_PER_SECOND
,
/* durationUs
=
*/
10
*
C
.
MICROS_PER_SECOND
,
new
AdPlaybackState
(
new
AdPlaybackState
(
/* adsId= */
new
Object
(),
/* adGroupTimesUs=... */
/* adsId= */
new
Object
(),
/* adGroupTimesUs=... */
0
,
0
,
...
@@ -987,7 +987,7 @@ public final class DefaultPlaybackSessionManagerTest {
...
@@ -987,7 +987,7 @@ public final class DefaultPlaybackSessionManagerTest {
/* id= */
0
,
/* id= */
0
,
/* isSeekable= */
true
,
/* isSeekable= */
true
,
/* isDynamic= */
false
,
/* isDynamic= */
false
,
/* durationUs
=
*/
10
*
C
.
MICROS_PER_SECOND
,
/* durationUs
=
*/
10
*
C
.
MICROS_PER_SECOND
,
new
AdPlaybackState
(
new
AdPlaybackState
(
/* adsId= */
new
Object
(),
/* adGroupTimesUs=... */
/* adsId= */
new
Object
(),
/* adGroupTimesUs=... */
2
*
C
.
MICROS_PER_SECOND
,
2
*
C
.
MICROS_PER_SECOND
,
...
@@ -1039,7 +1039,7 @@ public final class DefaultPlaybackSessionManagerTest {
...
@@ -1039,7 +1039,7 @@ public final class DefaultPlaybackSessionManagerTest {
/* id= */
0
,
/* id= */
0
,
/* isSeekable= */
true
,
/* isSeekable= */
true
,
/* isDynamic= */
false
,
/* isDynamic= */
false
,
/* durationUs
=
*/
10
*
C
.
MICROS_PER_SECOND
,
/* durationUs
=
*/
10
*
C
.
MICROS_PER_SECOND
,
new
AdPlaybackState
(
new
AdPlaybackState
(
/* adsId= */
new
Object
(),
/* adGroupTimesUs=... */
/* adsId= */
new
Object
(),
/* adGroupTimesUs=... */
0
,
0
,
...
...
library/core/src/test/java/com/google/android/exoplayer2/source/ConcatenatingMediaSourceTest.java
View file @
4446e263
...
@@ -499,8 +499,8 @@ public final class ConcatenatingMediaSourceTest {
...
@@ -499,8 +499,8 @@ public final class ConcatenatingMediaSourceTest {
mediaSource
.
addMediaSources
(
mediaSource
.
addMediaSources
(
Arrays
.
asList
(
new
MediaSource
[]
{
createFakeMediaSource
(),
createFakeMediaSource
()}));
Arrays
.
asList
(
new
MediaSource
[]
{
createFakeMediaSource
(),
createFakeMediaSource
()}));
mediaSource
.
moveMediaSource
(
mediaSource
.
moveMediaSource
(
/*
fromIndex */
1
,
/* toIndex */
/*
currentIndex= */
1
,
0
,
/* newIndex= */
0
,
Util
.
createHandlerForCurrentLooper
(),
Util
.
createHandlerForCurrentLooper
(),
runnableInvoked:
:
countDown
);
runnableInvoked:
:
countDown
);
});
});
...
@@ -624,8 +624,8 @@ public final class ConcatenatingMediaSourceTest {
...
@@ -624,8 +624,8 @@ public final class ConcatenatingMediaSourceTest {
testThread
.
runOnMainThread
(
testThread
.
runOnMainThread
(
()
->
()
->
mediaSource
.
moveMediaSource
(
mediaSource
.
moveMediaSource
(
/*
fromIndex */
1
,
/* toIndex */
/*
currentIndex= */
1
,
0
,
/* newIndex= */
0
,
Util
.
createHandlerForCurrentLooper
(),
Util
.
createHandlerForCurrentLooper
(),
timelineGrabber
));
timelineGrabber
));
Timeline
timeline
=
timelineGrabber
.
assertTimelineChangeBlocking
();
Timeline
timeline
=
timelineGrabber
.
assertTimelineChangeBlocking
();
...
...
library/core/src/test/java/com/google/android/exoplayer2/upstream/cache/SimpleCacheTest.java
View file @
4446e263
...
@@ -643,7 +643,7 @@ public class SimpleCacheTest {
...
@@ -643,7 +643,7 @@ public class SimpleCacheTest {
.
isEqualTo
(
10
);
.
isEqualTo
(
10
);
}
}
/
* Tests https://github.com/google/ExoPlayer/issues/3260 case. */
/
/ Regression test for https://github.com/google/ExoPlayer/issues/3260.
@Test
@Test
public
void
exceptionDuringIndexStore_doesNotPreventEviction
()
throws
Exception
{
public
void
exceptionDuringIndexStore_doesNotPreventEviction
()
throws
Exception
{
CachedContentIndex
contentIndex
=
CachedContentIndex
contentIndex
=
...
...
library/hls/src/test/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriodTest.java
View file @
4446e263
...
@@ -90,7 +90,7 @@ public final class HlsMediaPeriodTest {
...
@@ -90,7 +90,7 @@ public final class HlsMediaPeriodTest {
.
withParameters
(
/* windowIndex= */
0
,
mediaPeriodId
,
/* mediaTimeOffsetMs= */
0
),
.
withParameters
(
/* windowIndex= */
0
,
mediaPeriodId
,
/* mediaTimeOffsetMs= */
0
),
mock
(
Allocator
.
class
),
mock
(
Allocator
.
class
),
mock
(
CompositeSequenceableLoaderFactory
.
class
),
mock
(
CompositeSequenceableLoaderFactory
.
class
),
/* allowChunklessPreparation
=
*/
true
,
/* allowChunklessPreparation
=
*/
true
,
HlsMediaSource
.
METADATA_TYPE_ID3
,
HlsMediaSource
.
METADATA_TYPE_ID3
,
/* useSessionKeys= */
false
);
/* useSessionKeys= */
false
);
};
};
...
...
library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java
View file @
4446e263
...
@@ -571,7 +571,7 @@ public class PlayerNotificationManager {
...
@@ -571,7 +571,7 @@ public class PlayerNotificationManager {
notificationId
,
notificationId
,
mediaDescriptionAdapter
,
mediaDescriptionAdapter
,
notificationListener
,
notificationListener
,
/* customActionReceiver*/
null
);
/* customActionReceiver
=
*/
null
);
}
}
/**
/**
...
@@ -599,7 +599,7 @@ public class PlayerNotificationManager {
...
@@ -599,7 +599,7 @@ public class PlayerNotificationManager {
channelId
,
channelId
,
notificationId
,
notificationId
,
mediaDescriptionAdapter
,
mediaDescriptionAdapter
,
/* notificationListener */
null
,
/* notificationListener
=
*/
null
,
customActionReceiver
);
customActionReceiver
);
}
}
...
...
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