Skip to content

Commit

Permalink
Cache getSRSbySRID
Browse files Browse the repository at this point in the history
  • Loading branch information
Algunenano committed May 1, 2020
1 parent 3ced96f commit b38079d
Show file tree
Hide file tree
Showing 9 changed files with 194 additions and 154 deletions.
4 changes: 2 additions & 2 deletions liblwgeom/liblwgeom.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -1699,8 +1699,8 @@ extern lwvarlena_t* lwgeom_extent_to_gml2(const LWGEOM *geom, const char *srs, i
extern lwvarlena_t* lwgeom_extent_to_gml3(const LWGEOM *geom, const char *srs, int precision, int opts, const char *prefix);
extern lwvarlena_t* lwgeom_to_gml3(const LWGEOM *geom, const char *srs, int precision, int opts, const char *prefix, const char *id);
extern lwvarlena_t* lwgeom_to_kml2(const LWGEOM *geom, int precision, const char *prefix);
extern lwvarlena_t* lwgeom_to_geojson(const LWGEOM *geo, char *srs, int precision, int has_bbox);
extern lwvarlena_t* lwgeom_to_x3d3(const LWGEOM *geom, char *srs, int precision, int opts, const char *defid);
extern lwvarlena_t* lwgeom_to_geojson(const LWGEOM *geo, const char *srs, int precision, int has_bbox);
extern lwvarlena_t* lwgeom_to_x3d3(const LWGEOM *geom, const char *srs, int precision, int opts, const char *defid);
extern lwvarlena_t* lwgeom_to_svg(const LWGEOM *geom, int precision, int relative);
extern lwvarlena_t* lwgeom_to_encoded_polyline(const LWGEOM *geom, int precision);

Expand Down
70 changes: 35 additions & 35 deletions liblwgeom/lwout_geojson.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,14 @@
#include <string.h> /* strlen */
#include <assert.h>

static lwvarlena_t *asgeojson_point(const LWPOINT *point, char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_line(const LWLINE *line, char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_triangle(const LWTRIANGLE *tri, char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_poly(const LWPOLY *poly, char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_multipoint(const LWMPOINT *mpoint, char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_multiline(const LWMLINE *mline, char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_multipolygon(const LWMPOLY *mpoly, char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_collection(const LWCOLLECTION *col, char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_point(const LWPOINT *point, const char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_line(const LWLINE *line, const char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_triangle(const LWTRIANGLE *tri, const char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_poly(const LWPOLY *poly, const char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_multipoint(const LWMPOINT *mpoint, const char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_multiline(const LWMLINE *mline, const char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_multipolygon(const LWMPOLY *mpoly, const char *srs, GBOX *bbox, int precision);
static lwvarlena_t *asgeojson_collection(const LWCOLLECTION *col, const char *srs, GBOX *bbox, int precision);
static size_t asgeojson_geom_size(const LWGEOM *geom, GBOX *bbox, int precision);
static size_t asgeojson_geom_buf(const LWGEOM *geom, char *output, GBOX *bbox, int precision);

Expand All @@ -46,7 +46,7 @@ static size_t pointArray_geojson_size(POINTARRAY *pa, int precision);
* Takes a GEOMETRY and returns a GeoJson representation
*/
lwvarlena_t *
lwgeom_to_geojson(const LWGEOM *geom, char *srs, int precision, int has_bbox)
lwgeom_to_geojson(const LWGEOM *geom, const char *srs, int precision, int has_bbox)
{
int type = geom->type;
GBOX *bbox = NULL;
Expand Down Expand Up @@ -96,7 +96,7 @@ lwgeom_to_geojson(const LWGEOM *geom, char *srs, int precision, int has_bbox)
* Handle SRS
*/
static size_t
asgeojson_srs_size(char *srs)
asgeojson_srs_size(const char *srs)
{
int size;

Expand All @@ -108,7 +108,7 @@ asgeojson_srs_size(char *srs)
}

static size_t
asgeojson_srs_buf(char *output, char *srs)
asgeojson_srs_buf(char *output, const char *srs)
{
char *ptr = output;

Expand Down Expand Up @@ -166,7 +166,7 @@ asgeojson_bbox_buf(char *output, GBOX *bbox, int hasz, int precision)
*/

static size_t
asgeojson_point_size(const LWPOINT *point, char *srs, GBOX *bbox, int precision)
asgeojson_point_size(const LWPOINT *point, const char *srs, GBOX *bbox, int precision)
{
int size;

Expand All @@ -184,7 +184,7 @@ asgeojson_point_size(const LWPOINT *point, char *srs, GBOX *bbox, int precision)
}

static size_t
asgeojson_point_buf(const LWPOINT *point, char *srs, char *output, GBOX *bbox, int precision)
asgeojson_point_buf(const LWPOINT *point, const char *srs, char *output, GBOX *bbox, int precision)
{
char *ptr = output;

Expand All @@ -202,7 +202,7 @@ asgeojson_point_buf(const LWPOINT *point, char *srs, char *output, GBOX *bbox, i
}

static lwvarlena_t *
asgeojson_point(const LWPOINT *point, char *srs, GBOX *bbox, int precision)
asgeojson_point(const LWPOINT *point, const char *srs, GBOX *bbox, int precision)
{
uint32_t size = asgeojson_point_size(point, srs, bbox, precision);
lwvarlena_t *output = (lwvarlena_t *)lwalloc(size + LWVARHDRSZ);
Expand All @@ -216,7 +216,7 @@ asgeojson_point(const LWPOINT *point, char *srs, GBOX *bbox, int precision)
*/

static size_t
asgeojson_triangle_size(const LWTRIANGLE *tri, char *srs, GBOX *bbox, int precision)
asgeojson_triangle_size(const LWTRIANGLE *tri, const char *srs, GBOX *bbox, int precision)
{
int size;

Expand All @@ -232,7 +232,7 @@ asgeojson_triangle_size(const LWTRIANGLE *tri, char *srs, GBOX *bbox, int precis
}

static size_t
asgeojson_triangle_buf(const LWTRIANGLE *tri, char *srs, char *output, GBOX *bbox, int precision)
asgeojson_triangle_buf(const LWTRIANGLE *tri, const char *srs, char *output, GBOX *bbox, int precision)
{
char *ptr = output;

Expand All @@ -249,7 +249,7 @@ asgeojson_triangle_buf(const LWTRIANGLE *tri, char *srs, char *output, GBOX *bbo
}

static lwvarlena_t *
asgeojson_triangle(const LWTRIANGLE *tri, char *srs, GBOX *bbox, int precision)
asgeojson_triangle(const LWTRIANGLE *tri, const char *srs, GBOX *bbox, int precision)
{
uint32_t size = asgeojson_triangle_size(tri, srs, bbox, precision);
lwvarlena_t *output = (lwvarlena_t *)lwalloc(size + LWVARHDRSZ);
Expand All @@ -263,7 +263,7 @@ asgeojson_triangle(const LWTRIANGLE *tri, char *srs, GBOX *bbox, int precision)
*/

static size_t
asgeojson_line_size(const LWLINE *line, char *srs, GBOX *bbox, int precision)
asgeojson_line_size(const LWLINE *line, const char *srs, GBOX *bbox, int precision)
{
int size;

Expand All @@ -277,7 +277,7 @@ asgeojson_line_size(const LWLINE *line, char *srs, GBOX *bbox, int precision)
}

static size_t
asgeojson_line_buf(const LWLINE *line, char *srs, char *output, GBOX *bbox, int precision)
asgeojson_line_buf(const LWLINE *line, const char *srs, char *output, GBOX *bbox, int precision)
{
char *ptr=output;

Expand All @@ -292,7 +292,7 @@ asgeojson_line_buf(const LWLINE *line, char *srs, char *output, GBOX *bbox, int
}

static lwvarlena_t *
asgeojson_line(const LWLINE *line, char *srs, GBOX *bbox, int precision)
asgeojson_line(const LWLINE *line, const char *srs, GBOX *bbox, int precision)
{
uint32_t size = asgeojson_line_size(line, srs, bbox, precision);
lwvarlena_t *output = (lwvarlena_t *)lwalloc(size + LWVARHDRSZ);
Expand All @@ -308,7 +308,7 @@ asgeojson_line(const LWLINE *line, char *srs, GBOX *bbox, int precision)
*/

static size_t
asgeojson_poly_size(const LWPOLY *poly, char *srs, GBOX *bbox, int precision)
asgeojson_poly_size(const LWPOLY *poly, const char *srs, GBOX *bbox, int precision)
{
size_t size;
uint32_t i;
Expand All @@ -329,7 +329,7 @@ asgeojson_poly_size(const LWPOLY *poly, char *srs, GBOX *bbox, int precision)
}

static size_t
asgeojson_poly_buf(const LWPOLY *poly, char *srs, char *output, GBOX *bbox, int precision)
asgeojson_poly_buf(const LWPOLY *poly, const char *srs, char *output, GBOX *bbox, int precision)
{
uint32_t i;

Expand All @@ -352,7 +352,7 @@ asgeojson_poly_buf(const LWPOLY *poly, char *srs, char *output, GBOX *bbox, int
}

static lwvarlena_t *
asgeojson_poly(const LWPOLY *poly, char *srs, GBOX *bbox, int precision)
asgeojson_poly(const LWPOLY *poly, const char *srs, GBOX *bbox, int precision)
{
uint32_t size = asgeojson_poly_size(poly, srs, bbox, precision);
lwvarlena_t *output = (lwvarlena_t *)lwalloc(size + LWVARHDRSZ);
Expand All @@ -368,7 +368,7 @@ asgeojson_poly(const LWPOLY *poly, char *srs, GBOX *bbox, int precision)
*/

static size_t
asgeojson_multipoint_size(const LWMPOINT *mpoint, char *srs, GBOX *bbox, int precision)
asgeojson_multipoint_size(const LWMPOINT *mpoint, const char *srs, GBOX *bbox, int precision)
{
LWPOINT * point;
int size;
Expand All @@ -390,7 +390,7 @@ asgeojson_multipoint_size(const LWMPOINT *mpoint, char *srs, GBOX *bbox, int pre
}

static size_t
asgeojson_multipoint_buf(const LWMPOINT *mpoint, char *srs, char *output, GBOX *bbox, int precision)
asgeojson_multipoint_buf(const LWMPOINT *mpoint, const char *srs, char *output, GBOX *bbox, int precision)
{
LWPOINT *point;
uint32_t i;
Expand All @@ -413,7 +413,7 @@ asgeojson_multipoint_buf(const LWMPOINT *mpoint, char *srs, char *output, GBOX *
}

static lwvarlena_t *
asgeojson_multipoint(const LWMPOINT *mpoint, char *srs, GBOX *bbox, int precision)
asgeojson_multipoint(const LWMPOINT *mpoint, const char *srs, GBOX *bbox, int precision)
{
uint32_t size = asgeojson_multipoint_size(mpoint, srs, bbox, precision);
lwvarlena_t *output = (lwvarlena_t *)lwalloc(size + LWVARHDRSZ);
Expand All @@ -429,7 +429,7 @@ asgeojson_multipoint(const LWMPOINT *mpoint, char *srs, GBOX *bbox, int precisio
*/

static size_t
asgeojson_multiline_size(const LWMLINE *mline, char *srs, GBOX *bbox, int precision)
asgeojson_multiline_size(const LWMLINE *mline, const char *srs, GBOX *bbox, int precision)
{
LWLINE * line;
int size;
Expand All @@ -452,7 +452,7 @@ asgeojson_multiline_size(const LWMLINE *mline, char *srs, GBOX *bbox, int precis
}

static size_t
asgeojson_multiline_buf(const LWMLINE *mline, char *srs, char *output, GBOX *bbox, int precision)
asgeojson_multiline_buf(const LWMLINE *mline, const char *srs, char *output, GBOX *bbox, int precision)
{
LWLINE *line;
uint32_t i;
Expand All @@ -478,7 +478,7 @@ asgeojson_multiline_buf(const LWMLINE *mline, char *srs, char *output, GBOX *bbo
}

static lwvarlena_t *
asgeojson_multiline(const LWMLINE *mline, char *srs, GBOX *bbox, int precision)
asgeojson_multiline(const LWMLINE *mline, const char *srs, GBOX *bbox, int precision)
{
uint32_t size = asgeojson_multiline_size(mline, srs, bbox, precision);
lwvarlena_t *output = (lwvarlena_t *)lwalloc(size + LWVARHDRSZ);
Expand All @@ -494,7 +494,7 @@ asgeojson_multiline(const LWMLINE *mline, char *srs, GBOX *bbox, int precision)
*/

static size_t
asgeojson_multipolygon_size(const LWMPOLY *mpoly, char *srs, GBOX *bbox, int precision)
asgeojson_multipolygon_size(const LWMPOLY *mpoly, const char *srs, GBOX *bbox, int precision)
{
LWPOLY *poly;
int size;
Expand Down Expand Up @@ -522,7 +522,7 @@ asgeojson_multipolygon_size(const LWMPOLY *mpoly, char *srs, GBOX *bbox, int pre
}

static size_t
asgeojson_multipolygon_buf(const LWMPOLY *mpoly, char *srs, char *output, GBOX *bbox, int precision)
asgeojson_multipolygon_buf(const LWMPOLY *mpoly, const char *srs, char *output, GBOX *bbox, int precision)
{
LWPOLY *poly;
uint32_t i, j;
Expand Down Expand Up @@ -552,7 +552,7 @@ asgeojson_multipolygon_buf(const LWMPOLY *mpoly, char *srs, char *output, GBOX *
}

static lwvarlena_t *
asgeojson_multipolygon(const LWMPOLY *mpoly, char *srs, GBOX *bbox, int precision)
asgeojson_multipolygon(const LWMPOLY *mpoly, const char *srs, GBOX *bbox, int precision)
{
uint32_t size = asgeojson_multipolygon_size(mpoly, srs, bbox, precision);
lwvarlena_t *output = (lwvarlena_t *)lwalloc(size + LWVARHDRSZ);
Expand All @@ -568,7 +568,7 @@ asgeojson_multipolygon(const LWMPOLY *mpoly, char *srs, GBOX *bbox, int precisio
*/

static size_t
asgeojson_collection_size(const LWCOLLECTION *col, char *srs, GBOX *bbox, int precision)
asgeojson_collection_size(const LWCOLLECTION *col, const char *srs, GBOX *bbox, int precision)
{
uint32_t i;
size_t size;
Expand All @@ -591,7 +591,7 @@ asgeojson_collection_size(const LWCOLLECTION *col, char *srs, GBOX *bbox, int pr
}

static size_t
asgeojson_collection_buf(const LWCOLLECTION *col, char *srs, char *output, GBOX *bbox, int precision)
asgeojson_collection_buf(const LWCOLLECTION *col, const char *srs, char *output, GBOX *bbox, int precision)
{
uint32_t i;
char *ptr=output;
Expand All @@ -615,7 +615,7 @@ asgeojson_collection_buf(const LWCOLLECTION *col, char *srs, char *output, GBOX
}

static lwvarlena_t *
asgeojson_collection(const LWCOLLECTION *col, char *srs, GBOX *bbox, int precision)
asgeojson_collection(const LWCOLLECTION *col, const char *srs, GBOX *bbox, int precision)
{
uint32_t size = asgeojson_collection_size(col, srs, bbox, precision);
lwvarlena_t *output = (lwvarlena_t *)lwalloc(size + LWVARHDRSZ);
Expand Down
20 changes: 10 additions & 10 deletions liblwgeom/lwout_x3d.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
*/
/* takes a GEOMETRY and returns a X3D representation */
lwvarlena_t *
lwgeom_to_x3d3(const LWGEOM *geom, char *srs, int precision, int opts, const char *defid)
lwgeom_to_x3d3(const LWGEOM *geom, const char *srs, int precision, int opts, const char *defid)
{
stringbuffer_t *sb;
int rv;
Expand Down Expand Up @@ -63,7 +63,7 @@ lwgeom_to_x3d3(const LWGEOM *geom, char *srs, int precision, int opts, const cha
}
/* takes a GEOMETRY and appends to string buffer the x3d output */
static int
lwgeom_to_x3d3_sb(const LWGEOM *geom, char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb)
lwgeom_to_x3d3_sb(const LWGEOM *geom, const char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb)
{
int type = geom->type;

Expand Down Expand Up @@ -110,7 +110,7 @@ lwgeom_to_x3d3_sb(const LWGEOM *geom, char *srs, int precision, int opts, const
}

static int
asx3d3_point_sb(const LWPOINT *point, __attribute__((__unused__)) char *srs, int precision,
asx3d3_point_sb(const LWPOINT *point, __attribute__((__unused__)) const char *srs, int precision,
int opts, __attribute__((__unused__)) const char *defid, stringbuffer_t *sb)
{
/** for point we just output the coordinates **/
Expand Down Expand Up @@ -215,7 +215,7 @@ asx3d3_mpoly_coordindex_sb(const LWMPOLY *psur, stringbuffer_t *sb)

/** Return the linestring as an X3D LineSet */
static int
asx3d3_line_sb(const LWLINE *line, __attribute__((__unused__)) char *srs, int precision,
asx3d3_line_sb(const LWLINE *line, __attribute__((__unused__)) const char *srs, int precision,
int opts, __attribute__((__unused__)) const char *defid, stringbuffer_t *sb)
{

Expand All @@ -242,7 +242,7 @@ asx3d3_line_sb(const LWLINE *line, __attribute__((__unused__)) char *srs, int pr

/** Compute the X3D coordinates of the polygon and add to string buffer **/
static int
asx3d3_poly_sb(const LWPOLY *poly, __attribute__((__unused__)) char *srs, int precision,
asx3d3_poly_sb(const LWPOLY *poly, __attribute__((__unused__)) const char *srs, int precision,
int opts, __attribute__((__unused__)) int is_patch, __attribute__((__unused__)) const char *defid, stringbuffer_t *sb)
{
uint32_t i;
Expand All @@ -255,7 +255,7 @@ asx3d3_poly_sb(const LWPOLY *poly, __attribute__((__unused__)) char *srs, int p
}

static int
asx3d3_triangle_sb(const LWTRIANGLE *triangle, __attribute__((__unused__)) char *srs, int precision,
asx3d3_triangle_sb(const LWTRIANGLE *triangle, __attribute__((__unused__)) const char *srs, int precision,
int opts, __attribute__((__unused__)) const char *defid, stringbuffer_t *sb)
{
return ptarray_to_x3d3_sb(triangle->points, precision, opts, 1, sb);
Expand All @@ -266,7 +266,7 @@ asx3d3_triangle_sb(const LWTRIANGLE *triangle, __attribute__((__unused__)) char
* Don't call this with single-geoms inspected!
*/
static int
asx3d3_multi_sb(const LWCOLLECTION *col, __attribute__((__unused__)) char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb)
asx3d3_multi_sb(const LWCOLLECTION *col, __attribute__((__unused__)) const char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb)
{
char *x3dtype;
uint32_t i;
Expand Down Expand Up @@ -345,7 +345,7 @@ asx3d3_multi_sb(const LWCOLLECTION *col, __attribute__((__unused__)) char *srs,
* Don't call this with single-geoms inspected!
*/
static int
asx3d3_psurface_sb(const LWPSURFACE *psur, char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb)
asx3d3_psurface_sb(const LWPSURFACE *psur, const char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb)
{
uint32_t i;
uint32_t j;
Expand Down Expand Up @@ -398,7 +398,7 @@ asx3d3_psurface_sb(const LWPSURFACE *psur, char *srs, int precision, int opts, c
* Computes X3D representation of TIN (as IndexedTriangleSet and adds to string buffer)
*/
static int
asx3d3_tin_sb(const LWTIN *tin, __attribute__((__unused__)) char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb)
asx3d3_tin_sb(const LWTIN *tin, __attribute__((__unused__)) const char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb)
{
uint32_t i;
uint32_t k;
Expand Down Expand Up @@ -436,7 +436,7 @@ asx3d3_tin_sb(const LWTIN *tin, __attribute__((__unused__)) char *srs, int prec
}

static int
asx3d3_collection_sb(const LWCOLLECTION *col, char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb)
asx3d3_collection_sb(const LWCOLLECTION *col, const char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb)
{
uint32_t i;
LWGEOM *subgeom;
Expand Down
16 changes: 8 additions & 8 deletions liblwgeom/lwout_x3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,16 @@
#include "stringbuffer.h"

/** defid is the id of the coordinate can be used to hold other elements DEF='abc' transform='' etc. **/
static int lwgeom_to_x3d3_sb(const LWGEOM *geom, char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);
static int lwgeom_to_x3d3_sb(const LWGEOM *geom, const char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);

static int asx3d3_point_sb(const LWPOINT *point, char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);
static int asx3d3_line_sb(const LWLINE *line, char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);
static int asx3d3_point_sb(const LWPOINT *point, const char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);
static int asx3d3_line_sb(const LWLINE *line, const char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);

static int asx3d3_triangle_sb(const LWTRIANGLE *triangle, char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);
static int asx3d3_triangle_sb(const LWTRIANGLE *triangle, const char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);

static int asx3d3_multi_sb(const LWCOLLECTION *col, char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);
static int asx3d3_psurface_sb(const LWPSURFACE *psur, char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);
static int asx3d3_tin_sb(const LWTIN *tin, char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);
static int asx3d3_multi_sb(const LWCOLLECTION *col, const char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);
static int asx3d3_psurface_sb(const LWPSURFACE *psur, const char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);
static int asx3d3_tin_sb(const LWTIN *tin, const char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);

static int asx3d3_collection_sb(const LWCOLLECTION *col, char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);
static int asx3d3_collection_sb(const LWCOLLECTION *col, const char *srs, int precision, int opts, const char *defid, stringbuffer_t *sb);
static int ptarray_to_x3d3_sb(POINTARRAY *pa, int precision, int opts, int is_closed, stringbuffer_t *sb );
Loading

0 comments on commit b38079d

Please sign in to comment.